blob: 60309cee6bfea9e19904d7cb01195a1070503cfa [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.ui;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CustomShortcutSet;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.FixedSizeButton;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.util.PlatformIcons;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
/**
* @author Alexey Kudravtsev
*/
public abstract class AbstractFieldPanel extends JPanel {
private static final Logger LOG = Logger.getInstance("#com.intellij.ui.AbstractFieldPanel");
private final JComponent myComponent;
private Runnable myChangeListener;
protected ArrayList<JButton> myButtons = new ArrayList<JButton>(1);
protected JLabel myLabel;
private ActionListener myBrowseButtonActionListener;
private String myViewerDialogTitle;
private String myLabelText;
private TextFieldWithBrowseButton.MyDoClickAction myDoClickAction;
public AbstractFieldPanel(JComponent component) {
this(component, null, null, null, null);
}
public AbstractFieldPanel(JComponent component,
String labelText,
final String viewerDialogTitle,
ActionListener browseButtonActionListener,
Runnable changeListener) {
myComponent = component;
setChangeListener(changeListener);
setLabelText(labelText);
setBrowseButtonActionListener(browseButtonActionListener);
myViewerDialogTitle = viewerDialogTitle;
}
public abstract String getText();
public abstract void setText(String text);
public void setEnabled(boolean enabled) {
getComponent().setEnabled(enabled);
if (myLabel != null) {
myLabel.setEnabled(enabled);
}
for (JButton button: myButtons) {
button.setEnabled(enabled);
}
}
public boolean isEnabled() {
return myComponent != null && myComponent.isEnabled();
}
protected TextFieldWithBrowseButton.MyDoClickAction getDoClickAction() { return myDoClickAction; }
public final JComponent getComponent() {
return myComponent;
}
public final JLabel getFieldLabel() {
if (myLabel == null){
myLabel = new JLabel(myLabelText);
add(myLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 5, 0), 0, 0));
myLabel.setLabelFor(getComponent());
}
return myLabel;
}
public final Runnable getChangeListener() {
return myChangeListener;
}
public final void setChangeListener(Runnable runnable) {
myChangeListener = runnable;
}
public void createComponent() {
removeAll();
setLayout(new GridBagLayout());
if (myLabelText != null) {
myLabel = new JLabel(myLabelText);
this.add(myLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 5, 0), 0, 0));
myLabel.setLabelFor(myComponent);
}
this.add(myComponent, new GridBagConstraints(0, 1, 1, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
if (myBrowseButtonActionListener != null) {
FixedSizeButton browseButton = new FixedSizeButton(getComponent());
myDoClickAction = new TextFieldWithBrowseButton.MyDoClickAction(browseButton);
browseButton.setFocusable(false);
browseButton.addActionListener(myBrowseButtonActionListener);
myButtons.add(browseButton);
this.add(browseButton, new GridBagConstraints(GridBagConstraints.RELATIVE, 1, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 2, 0, 0), 0, 0));
}
if (myViewerDialogTitle != null) {
final FixedSizeButton showViewerButton = new FixedSizeButton(getComponent());
if (myBrowseButtonActionListener == null) {
LOG.assertTrue(myDoClickAction == null);
myDoClickAction = new TextFieldWithBrowseButton.MyDoClickAction(showViewerButton);
}
showViewerButton.setFocusable(false);
showViewerButton.setIcon(PlatformIcons.OPEN_EDIT_DIALOG_ICON);
showViewerButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Viewer viewer = new Viewer();
viewer.setTitle(myViewerDialogTitle);
viewer.show();
}
});
myButtons.add(showViewerButton);
this.add(showViewerButton, new GridBagConstraints(GridBagConstraints.RELATIVE, 1, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
}
}
public void setBrowseButtonActionListener(ActionListener browseButtonActionListener) {
myBrowseButtonActionListener = browseButtonActionListener;
}
public void setViewerDialogTitle(String viewerDialogTitle) {
myViewerDialogTitle = viewerDialogTitle;
}
public void setLabelText(String labelText) {
myLabelText = labelText;
}
public void setDisplayedMnemonic(char c) {
getFieldLabel().setDisplayedMnemonic(c);
}
public void setDisplayedMnemonicIndex(int i) {
getFieldLabel().setDisplayedMnemonicIndex(i);
}
protected class Viewer extends DialogWrapper {
protected JTextArea myTextArea;
public Viewer() {
super(getComponent(), true);
init();
}
@NotNull
protected Action[] createActions() {
return new Action[]{getOKAction(), getCancelAction()};
}
public JComponent getPreferredFocusedComponent() {
return myTextArea;
}
protected void doOKAction() {
setText(myTextArea.getText());
super.doOKAction();
}
protected JComponent createCenterPanel() {
myTextArea = new JTextArea(10, 50);
myTextArea.setText(getText());
myTextArea.setWrapStyleWord(true);
myTextArea.setLineWrap(true);
myTextArea.getDocument().addDocumentListener(new DocumentAdapter() {
public void textChanged(DocumentEvent event) {
if (myChangeListener != null) {
myChangeListener.run();
}
}
});
new AnAction() {
public void actionPerformed(AnActionEvent e) {
doOKAction();
}
}.registerCustomShortcutSet(new CustomShortcutSet(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0)), myTextArea);
return ScrollPaneFactory.createScrollPane(myTextArea);
}
}
}