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
;
41 import javax
.swing
.table
.TableCellEditor
;
42 import javax
.swing
.table
.TableCellRenderer
;
43 import javax
.swing
.tree
.DefaultMutableTreeNode
;
44 import javax
.swing
.tree
.MutableTreeNode
;
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() {
67 public boolean isCellEditable(Object o
) {
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
) {
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
,
139 J_PANEL
.setBackground(isSelected ? table
.getSelectionBackground() : table
.getBackground());
143 private final Observer myObserver
;
146 public AddMultiplyFilesOptionsDialog(Project project
,
147 Collection
<AddedFileInfo
> roots
,
149 super(project
, options
);
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"));
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;
185 public void dispose() {
187 for (Iterator each
= myRoots
.iterator(); each
.hasNext();) {
188 ((AddedFileInfo
)each
.next()).removeIncludedObserver(myObserver
);
193 private void expandAll() {
195 JTree tree
= myTreeTable
.getTree();
196 while (row
< tree
.getRowCount()) {
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
);
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());
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() {
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() {