blob: 82b633d70ed763fcb226912814437b4b3d734533 [file] [log] [blame]
/*
* Copyright 2000-2011 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.lang.ant.config.impl.configuration;
import com.intellij.icons.AllIcons;
import com.intellij.ide.macro.MacrosDialog;
import com.intellij.lang.ant.AntBundle;
import com.intellij.lang.ant.config.impl.AntClasspathEntry;
import com.intellij.lang.ant.config.impl.AntInstallation;
import com.intellij.lang.ant.config.impl.AntReference;
import com.intellij.lang.ant.config.impl.GlobalAntConfiguration;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.ui.OrderEntryAppearanceService;
import com.intellij.openapi.ui.FixedSizeButton;
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.ui.ColoredListCellRenderer;
import com.intellij.ui.SimpleColoredComponent;
import com.intellij.ui.SimpleTextAttributes;
import com.intellij.util.IconUtil;
import com.intellij.util.PlatformIcons;
import com.intellij.util.config.AbstractProperty;
import com.intellij.util.ui.AbstractTableCellEditor;
import com.intellij.util.ui.CellEditorComponentWithBrowseButton;
import icons.AntIcons;
import javax.swing.*;
import javax.swing.text.BadLocationException;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class AntUIUtil {
private static final Logger LOG = Logger.getInstance("#com.intellij.ant.impl.configuration.AntUIUtil");
private AntUIUtil() {
}
public interface PropertiesEditor<T> {
AbstractProperty.AbstractPropertyContainer getProperties(T object);
}
public static class AntInstallationRenderer extends ColoredListCellRenderer {
private final PropertiesEditor<AntInstallation> myEditor;
public AntInstallationRenderer(PropertiesEditor<AntInstallation> editor) {
myEditor = editor != null ? editor : new PropertiesEditor<AntInstallation>(){
public AbstractProperty.AbstractPropertyContainer getProperties(AntInstallation antInstallation) {
return antInstallation.getProperties();
}
};
}
protected void customizeCellRenderer(JList list, Object value, int index, boolean selected, boolean hasFocus) {
AntInstallation ant = (AntInstallation)value;
if (ant == null) return;
AbstractProperty.AbstractPropertyContainer container = myEditor.getProperties(ant);
customizeAnt(container, this);
}
}
public static class AntReferenceRenderer extends ColoredListCellRenderer {
private final GlobalAntConfiguration myConfiguration;
public AntReferenceRenderer(GlobalAntConfiguration configuration) {
myConfiguration = configuration;
}
protected void customizeCellRenderer(JList list, Object value, int index, boolean selected, boolean hasFocus) {
if (value == null) return;
customizeReference((AntReference)value, this, myConfiguration);
}
}
public static void customizeReference(AntReference antReference, SimpleColoredComponent component, GlobalAntConfiguration configuration) {
AntInstallation antInstallation = antReference.find(configuration);
if (antInstallation != null) customizeAnt(antInstallation.getProperties(), component);
else {
component.setIcon(PlatformIcons.INVALID_ENTRY_ICON);
component.append(antReference.getName(), SimpleTextAttributes.ERROR_ATTRIBUTES);
}
}
public static void customizeAnt(AbstractProperty.AbstractPropertyContainer antProperties, SimpleColoredComponent component) {
component.setIcon(AntIcons.AntInstallation);
String name = AntInstallation.NAME.get(antProperties);
component.append(name, SimpleTextAttributes.REGULAR_ATTRIBUTES);
String versionString = AntInstallation.VERSION.get(antProperties);
if (name.indexOf(versionString) == -1)
component.append(" (" + versionString + ")", SimpleTextAttributes.SYNTHETIC_ATTRIBUTES);
}
public static class ClasspathRenderer extends ColoredListCellRenderer {
protected void customizeCellRenderer(JList list, Object value, int index, boolean selected, boolean hasFocus) {
AntClasspathEntry entry = (AntClasspathEntry)value;
entry.getAppearance().customize(this);
}
}
public static class PropertyValueCellEditor extends AbstractTableCellEditor {
private final CellEditorComponentWithBrowseButton<JTextField> myComponent;
public PropertyValueCellEditor() {
myComponent = new CellEditorComponentWithBrowseButton<JTextField>(new TextFieldWithBrowseButton(), this);
getChildComponent().setBorder(BorderFactory.createLineBorder(Color.black));
FixedSizeButton button = myComponent.getComponentWithButton().getButton();
button.setIcon(IconUtil.getAddIcon());
button.setToolTipText(AntBundle.message("ant.property.value.editor.insert.macro.tooltip.text"));
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
MacrosDialog dialog = new MacrosDialog(getChildComponent());
dialog.show();
if (dialog.isOK() && dialog.getSelectedMacro() != null) {
JTextField textField = getChildComponent();
String macro = dialog.getSelectedMacro().getName();
int position = textField.getCaretPosition();
try {
textField.getDocument().insertString(position, "$" + macro + "$", null);
textField.setCaretPosition(position + macro.length() + 2);
}
catch (BadLocationException ex) {
LOG.error(ex);
}
textField.requestFocus();
}
}
});
}
public Object getCellEditorValue() {
return getChildComponent().getText();
}
protected void initializeEditor(Object value) {
getChildComponent().setText((String)value);
}
private JTextField getChildComponent() {
return myComponent.getChildComponent();
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
getChildComponent().setText((String)value);
return myComponent;
}
}
public static class ProjectJdkRenderer extends ColoredListCellRenderer {
private final boolean myInComboBox;
private final String myProjectJdkName;
public ProjectJdkRenderer(boolean inComboBox, String projectJdkName) {
myInComboBox = inComboBox;
myProjectJdkName = projectJdkName != null ? projectJdkName : "";
}
protected void customizeCellRenderer(JList list, Object value, int index, boolean selected, boolean hasFocus) {
String jdkName = (String)value;
if (jdkName == null || jdkName.length() == 0) jdkName = "";
Sdk jdk = GlobalAntConfiguration.findJdk(jdkName);
if (jdk == null) {
if (myProjectJdkName.length() > 0) {
setIcon(AllIcons.General.Jdk);
append(AntBundle.message("project.jdk.project.jdk.name.list.column.value", myProjectJdkName),
selected && !(SystemInfo.isWinVistaOrNewer && UIManager.getLookAndFeel().getName().contains("Windows"))
? SimpleTextAttributes.SELECTED_SIMPLE_CELL_ATTRIBUTES
: SimpleTextAttributes.SIMPLE_CELL_ATTRIBUTES);
}
else {
setIcon(PlatformIcons.INVALID_ENTRY_ICON);
append(AntBundle.message("project.jdk.not.specified.list.column.value"), SimpleTextAttributes.ERROR_ATTRIBUTES);
}
}
else {
OrderEntryAppearanceService.getInstance().forJdk(jdk, myInComboBox, selected, true).customize(this);
}
}
}
}