blob: dcc43c17b7e9384efa369f09de6a32fce5b14056 [file] [log] [blame]
/*
* Copyright 2000-2012 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 org.jetbrains.idea.devkit.util;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleType;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.ui.MultiLineLabelUI;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.xml.XmlFile;
import com.intellij.ui.ColoredListCellRenderer;
import com.intellij.ui.ScrollPaneFactory;
import com.intellij.ui.SimpleTextAttributes;
import com.intellij.ui.TableUtil;
import com.intellij.ui.components.JBList;
import com.intellij.ui.table.JBTable;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.idea.devkit.DevKitBundle;
import org.jetbrains.idea.devkit.module.PluginModuleType;
import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellRenderer;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
/**
* @author swr
*/
public class ChooseModulesDialog extends DialogWrapper {
private final Icon myIcon;
private final String myMessage;
private final JTable myView;
private final List<Module> myCandidateModules;
private final boolean[] myStates;
public ChooseModulesDialog(final Project project, List<Module> candidateModules, @NonNls String title) {
this ( project, candidateModules, title, DevKitBundle.message("select.plugin.modules.to.patch"));
}
public ChooseModulesDialog(final Project project, List<Module> candidateModules, @NonNls String title, final String message) {
super(project, false);
setTitle(title);
myCandidateModules = candidateModules;
myIcon = Messages.getQuestionIcon();
myMessage = message;
myView = new JBTable(new AbstractTableModel() {
public int getRowCount() {
return myCandidateModules.size();
}
public int getColumnCount() {
return 2;
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return columnIndex == 0;
}
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
myStates[rowIndex] = (Boolean)aValue;
fireTableCellUpdated(rowIndex, columnIndex);
}
public Class<?> getColumnClass(int columnIndex) {
return columnIndex == 0 ? Boolean.class : Module.class;
}
public Object getValueAt(int rowIndex, int columnIndex) {
return columnIndex == 0 ? myStates[rowIndex] : myCandidateModules.get(rowIndex);
}
});
myView.setShowGrid(false);
myView.setTableHeader(null);
myView.setIntercellSpacing(new Dimension(0, 0));
TableUtil.setupCheckboxColumn(myView, 0);
myView.getModel().addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
getOKAction().setEnabled(getSelectedModules().size() > 0);
}
});
myView.addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ENTER
|| e.getKeyChar() == '\n') {
doOKAction();
}
}
});
myView.setDefaultRenderer(Module.class, new MyTableCellRenderer(project));
myStates = new boolean[candidateModules.size()];
Arrays.fill(myStates, true);
init();
}
protected JComponent createNorthPanel() {
JPanel panel = new JPanel(new BorderLayout(15, 10));
if (myIcon != null) {
JLabel iconLabel = new JLabel(myIcon);
Container container = new Container();
container.setLayout(new BorderLayout());
container.add(iconLabel, BorderLayout.NORTH);
panel.add(container, BorderLayout.WEST);
}
JPanel messagePanel = new JPanel(new BorderLayout());
if (myMessage != null) {
JLabel textLabel = new JLabel(myMessage);
textLabel.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 0));
textLabel.setUI(new MultiLineLabelUI());
messagePanel.add(textLabel, BorderLayout.NORTH);
}
panel.add(messagePanel, BorderLayout.CENTER);
final JScrollPane jScrollPane = ScrollPaneFactory.createScrollPane();
jScrollPane.setViewportView(myView);
jScrollPane.setPreferredSize(new Dimension(300, 80));
panel.add(jScrollPane, BorderLayout.SOUTH);
return panel;
}
public JComponent getPreferredFocusedComponent() {
return myView;
}
protected JComponent createCenterPanel() {
return null;
}
public List<Module> getSelectedModules() {
final ArrayList<Module> list = new ArrayList<Module>(myCandidateModules);
final Iterator<Module> modules = list.iterator();
for (boolean b : myStates) {
modules.next();
if (!b) {
modules.remove();
}
}
return list;
}
private static class MyTableCellRenderer implements TableCellRenderer {
private final JList myList;
private final Project myProject;
private final ColoredListCellRenderer myCellRenderer;
public MyTableCellRenderer(Project project) {
myProject = project;
myList = new JBList();
myCellRenderer = new ColoredListCellRenderer() {
protected void customizeCellRenderer(JList list, Object value, int index, boolean selected, boolean hasFocus) {
final Module module = ((Module)value);
setIcon(ModuleType.get(module).getIcon());
append(module.getName(), SimpleTextAttributes.REGULAR_ATTRIBUTES);
final XmlFile pluginXml = PluginModuleType.getPluginXml(module);
assert pluginXml != null;
final VirtualFile virtualFile = pluginXml.getVirtualFile();
assert virtualFile != null;
final VirtualFile projectPath = myProject.getBaseDir();
assert projectPath != null;
if (VfsUtilCore.isAncestor(projectPath, virtualFile, false)) {
append(" (" + VfsUtilCore.getRelativePath(virtualFile, projectPath, File.separatorChar) + ")", SimpleTextAttributes.GRAYED_ATTRIBUTES);
} else {
append(" (" + virtualFile.getPresentableUrl() + ")", SimpleTextAttributes.GRAYED_ATTRIBUTES);
}
}
};
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
return myCellRenderer.getListCellRendererComponent(myList, value, row, isSelected, hasFocus);
}
}
}