update copyright
[fedora-idea.git] / plugins / cvs / cvs-plugin / src / com / intellij / cvsSupport2 / cvsoperations / cvsAdd / ui / AddMultiplyFilesOptionsDialog.java
blobe1368251aa6180ddb9d3dde26abe59acb26a3afc
1 /*
2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package com.intellij.cvsSupport2.cvsoperations.cvsAdd.ui;
18 import com.intellij.CvsBundle;
19 import com.intellij.cvsSupport2.CvsActionPlaces;
20 import com.intellij.cvsSupport2.cvsoperations.cvsAdd.AddedFileInfo;
21 import com.intellij.cvsSupport2.keywordSubstitution.KeywordSubstitutionWrapper;
22 import com.intellij.cvsSupport2.ui.Options;
23 import com.intellij.openapi.actionSystem.ActionManager;
24 import com.intellij.openapi.actionSystem.AnAction;
25 import com.intellij.openapi.actionSystem.AnActionEvent;
26 import com.intellij.openapi.actionSystem.DefaultActionGroup;
27 import com.intellij.openapi.project.Project;
28 import com.intellij.openapi.util.IconLoader;
29 import com.intellij.ui.ScrollPaneFactory;
30 import com.intellij.ui.TreeUIHelper;
31 import com.intellij.ui.dualView.TreeTableView;
32 import com.intellij.util.ui.ColumnInfo;
33 import com.intellij.util.ui.ComboBoxTableCellEditor;
34 import com.intellij.util.ui.ComboBoxTableCellRenderer;
35 import com.intellij.util.ui.tree.TreeUtil;
36 import com.intellij.ui.treeStructure.treetable.ListTreeTableModelOnColumns;
37 import com.intellij.ui.treeStructure.treetable.TreeTable;
38 import com.intellij.ui.treeStructure.treetable.TreeTableModel;
40 import javax.swing.*;
41 import javax.swing.table.TableCellEditor;
42 import javax.swing.table.TableCellRenderer;
43 import javax.swing.tree.DefaultMutableTreeNode;
44 import javax.swing.tree.MutableTreeNode;
45 import java.awt.*;
46 import java.util.*;
48 /**
49 * author: lesya
53 public class AddMultiplyFilesOptionsDialog extends AbstractAddOptionsDialog {
54 private final Collection<AddedFileInfo> myRoots;
55 private final static JCheckBox CHECKBOX = new JCheckBox();
57 private final ColumnInfo INCLUDED = new ColumnInfo("") {
59 public Object valueOf(Object object) {
60 return Boolean.valueOf(((AddedFileInfo)object).included());
63 public Class getColumnClass() {
64 return Boolean.class;
67 public boolean isCellEditable(Object o) {
68 return true;
71 public void setValue(Object o, Object aValue) {
72 ((AddedFileInfo)o).setIncluded(((Boolean)aValue).booleanValue());
73 myTreeTable.repaint();
76 public int getWidth(JTable table) {
77 return CHECKBOX.getPreferredSize().width + 4;
82 private static final ColumnInfo FILE = new ColumnInfo(CvsBundle.message("add.multiple.files.file.column.name")) {
83 public Object valueOf(Object object) {
84 return ((AddedFileInfo)object).getPresentableText();
87 public Class getColumnClass() {
88 return TreeTableModel.class;
91 public boolean isCellEditable(Object o) {
92 return true;
96 private static final ColumnInfo KEYWORD_SUBSTITUTION = new ColumnInfo(
97 CvsBundle.message("add.multiple.files.keyword.substitution.column.name")) {
98 public Object valueOf(Object object) {
99 return ((AddedFileInfo)object).getKeywordSubstitutionsWithSelection();
102 public boolean isCellEditable(Object o) {
103 AddedFileInfo addedFileInfo = (AddedFileInfo)o;
104 if (addedFileInfo.getFile().isDirectory()) return false;
105 return addedFileInfo.included();
108 public void setValue(Object o, Object aValue) {
109 ((AddedFileInfo)o).setKeywordSubstitution(((KeywordSubstitutionWrapper)aValue).getSubstitution());
112 public TableCellRenderer getRenderer(Object o) {
113 AddedFileInfo addedFileInfo = (AddedFileInfo)o;
114 if (addedFileInfo.getFile().isDirectory()) return TABLE_CELL_RENDERER;
115 return ComboBoxTableCellRenderer.INSTANCE;
118 public TableCellEditor getEditor(Object item) {
119 return ComboBoxTableCellEditor.INSTANCE;
122 public int getWidth(JTable table) {
123 return table.getFontMetrics(table.getFont()).stringWidth(getName()) + 10;
127 private final ColumnInfo[] COLUMNS = new ColumnInfo[]{INCLUDED, FILE, KEYWORD_SUBSTITUTION};
129 private TreeTable myTreeTable;
130 private ListTreeTableModelOnColumns myModel;
131 private static final JPanel J_PANEL = new JPanel();
132 private static final TableCellRenderer TABLE_CELL_RENDERER = new TableCellRenderer() {
133 public Component getTableCellRendererComponent(JTable table,
134 Object value,
135 boolean isSelected,
136 boolean hasFocus,
137 int row,
138 int column) {
139 J_PANEL.setBackground(isSelected ? table.getSelectionBackground() : table.getBackground());
140 return J_PANEL;
143 private final Observer myObserver;
146 public AddMultiplyFilesOptionsDialog(Project project,
147 Collection<AddedFileInfo> roots,
148 Options options) {
149 super(project, options);
151 myRoots = roots;
152 myObserver = new Observer() {
153 public void update(Observable o, Object arg) {
154 setOKButtonEnabling();
158 for (Iterator each = myRoots.iterator(); each.hasNext();) {
159 ((AddedFileInfo)each.next()).addIncludedObserver(myObserver);
162 setTitle(com.intellij.CvsBundle.message("dialog.title.add.files.to.cvs"));
164 createTree();
166 expandAll();
168 init();
170 setOKButtonEnabling();
173 private void setOKButtonEnabling() {
174 setOKActionEnabled(hasIncludedNodes());
177 private boolean hasIncludedNodes() {
178 for (Iterator iterator = myRoots.iterator(); iterator.hasNext();) {
179 AddedFileInfo addedFileInfo = (AddedFileInfo)iterator.next();
180 if (addedFileInfo.hasIncludedNodes()) return true;
182 return false;
185 public void dispose() {
186 super.dispose();
187 for (Iterator each = myRoots.iterator(); each.hasNext();) {
188 ((AddedFileInfo)each.next()).removeIncludedObserver(myObserver);
193 private void expandAll() {
194 int row = 0;
195 JTree tree = myTreeTable.getTree();
196 while (row < tree.getRowCount()) {
197 tree.expandRow(row);
198 row++;
202 private void createTree() {
203 DefaultMutableTreeNode root = new DefaultMutableTreeNode();
205 for (Iterator each = myRoots.iterator(); each.hasNext();) {
206 root.add((MutableTreeNode)each.next());
209 myModel = new ListTreeTableModelOnColumns(root, COLUMNS);
211 myTreeTable = new TreeTableView(myModel);
213 int comboHeight = new JComboBox().getPreferredSize().height;
214 int checkBoxHeight = new JCheckBox().getPreferredSize().height;
215 myTreeTable.setMinRowHeight(Math.max(comboHeight, checkBoxHeight) + 2);
217 myTreeTable.setRootVisible(false);
219 myTreeTable.getTree().setCellRenderer(new AddedFileCellRenderer());
220 TreeUIHelper.getInstance().installToolTipHandler(myTreeTable);
221 TreeUtil.installActions(myTreeTable.getTree());
224 protected JComponent createCenterPanel() {
225 JPanel result = new JPanel(new BorderLayout());
226 JComponent toolbal = createToolbal();
227 result.add(toolbal, BorderLayout.NORTH);
228 result.add(ScrollPaneFactory.createScrollPane(myTreeTable), BorderLayout.CENTER);
229 return result;
232 private JComponent createToolbal() {
233 ActionManager actionManager = ActionManager.getInstance();
234 DefaultActionGroup group = new DefaultActionGroup();
235 group.add(new SelectAllAction());
236 group.add(new UnselectAllAction());
237 return actionManager.createActionToolbar(CvsActionPlaces.ADD_FILES_TOOLBAR, group, true).getComponent();
240 private abstract class SelectUnselectAllAction extends AnAction {
241 protected SelectUnselectAllAction(String text, Icon icon) {
242 super(text, null, icon);
245 public void actionPerformed(AnActionEvent e) {
246 for (Iterator iterator = getAllFileInfos().iterator(); iterator.hasNext();) {
247 ((AddedFileInfo)iterator.next()).setIncluded(includedValue());
250 AddMultiplyFilesOptionsDialog.this.myTreeTable.repaint();
253 private Collection getAllFileInfos() {
254 ArrayList result = new ArrayList();
255 for (Iterator iterator = myRoots.iterator(); iterator.hasNext();) {
256 addChildrenTo(result, (AddedFileInfo)iterator.next());
258 return result;
261 private void addChildrenTo(ArrayList result, AddedFileInfo addedFileInfo) {
262 result.add(addedFileInfo);
263 for (int i = 0; i < addedFileInfo.getChildCount(); i++) {
264 addChildrenTo(result, (AddedFileInfo)addedFileInfo.getChildAt(i));
268 protected abstract boolean includedValue();
271 private class SelectAllAction extends SelectUnselectAllAction {
273 public SelectAllAction() {
274 super(com.intellij.CvsBundle.message("action.name.select.all"), IconLoader.getIcon("/actions/selectall.png"));
277 protected boolean includedValue() {
278 return true;
282 private class UnselectAllAction extends SelectUnselectAllAction {
283 public UnselectAllAction() {
284 super(com.intellij.CvsBundle.message("action.name.unselect.all"), IconLoader.getIcon("/actions/unselectall.png"));
287 protected boolean includedValue() {
288 return false;