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.
17 package com
.intellij
.refactoring
.rename
;
19 import com
.intellij
.navigation
.ItemPresentation
;
20 import com
.intellij
.navigation
.NavigationItem
;
21 import com
.intellij
.openapi
.application
.ApplicationManager
;
22 import com
.intellij
.openapi
.diagnostic
.Logger
;
23 import com
.intellij
.openapi
.project
.Project
;
24 import com
.intellij
.openapi
.ui
.DialogWrapper
;
25 import com
.intellij
.openapi
.util
.Comparing
;
26 import com
.intellij
.openapi
.util
.Disposer
;
27 import com
.intellij
.psi
.PsiNamedElement
;
28 import com
.intellij
.refactoring
.RefactoringBundle
;
29 import com
.intellij
.refactoring
.rename
.naming
.AutomaticRenamer
;
30 import com
.intellij
.refactoring
.ui
.EnableDisableAction
;
31 import com
.intellij
.refactoring
.ui
.StringTableCellEditor
;
32 import com
.intellij
.ui
.BooleanTableCellRenderer
;
33 import com
.intellij
.ui
.GuiUtils
;
34 import com
.intellij
.ui
.TableUtil
;
35 import com
.intellij
.usageView
.UsageInfo
;
36 import com
.intellij
.usages
.impl
.UsagePreviewPanel
;
37 import com
.intellij
.util
.ui
.Table
;
40 import javax
.swing
.event
.ListSelectionEvent
;
41 import javax
.swing
.event
.ListSelectionListener
;
42 import javax
.swing
.event
.TableModelEvent
;
43 import javax
.swing
.event
.TableModelListener
;
44 import javax
.swing
.table
.AbstractTableModel
;
45 import javax
.swing
.table
.TableColumnModel
;
47 import java
.awt
.event
.ActionEvent
;
48 import java
.awt
.event
.ActionListener
;
50 import java
.util
.List
;
55 public class AutomaticRenamingDialog
extends DialogWrapper
{
56 private static final Logger LOG
= Logger
.getInstance("#com.intellij.refactoring.rename.AutomaticRenamingDialog");
57 private static final int CHECK_COLUMN
= 0;
58 private static final int OLD_NAME_COLUMN
= 1;
59 private static final int NEW_NAME_COLUMN
= 2;
60 private final AutomaticRenamer myRenamer
;
61 private boolean[] myShouldRename
;
62 private String
[] myNewNames
;
63 private PsiNamedElement
[] myRenames
;
64 private MyTableModel myTableModel
;
65 private Table myTable
;
66 private JPanel myPanelForPreview
;
67 private JButton mySelectAllButton
;
68 private JButton myUnselectAllButton
;
69 private JPanel myPanel
;
70 private JSplitPane mySplitPane
;
71 private final Project myProject
;
72 private final UsagePreviewPanel myUsagePreviewPanel
;
73 private ListSelectionListener myListSelectionListener
;
75 public AutomaticRenamingDialog(Project project
, AutomaticRenamer renamer
) {
79 myUsagePreviewPanel
= new UsagePreviewPanel(myProject
);
81 setTitle(myRenamer
.getDialogTitle());
85 private void populateData() {
86 final Map
<PsiNamedElement
, String
> renames
= myRenamer
.getRenames();
88 List
<PsiNamedElement
> temp
= new ArrayList
<PsiNamedElement
>();
89 for (final PsiNamedElement namedElement
: renames
.keySet()) {
90 final String newName
= renames
.get(namedElement
);
91 if (newName
!= null) temp
.add(namedElement
);
94 myRenames
= temp
.toArray(new PsiNamedElement
[temp
.size()]);
95 Arrays
.sort(myRenames
, new Comparator
<PsiNamedElement
>() {
96 public int compare(final PsiNamedElement e1
, final PsiNamedElement e2
) {
97 return Comparing
.compare(e1
.getName(), e2
.getName());
101 myNewNames
= new String
[myRenames
.length
];
102 for (int i
= 0; i
< myNewNames
.length
; i
++) {
103 myNewNames
[i
] = renames
.get(myRenames
[i
]);
106 myShouldRename
= new boolean[myRenames
.length
];
107 if (myRenamer
.isSelectedByDefault()) {
108 for(int i
=0; i
<myShouldRename
.length
; i
++) {
109 myShouldRename
[i
] = true;
115 protected String
getDimensionServiceKey() {
116 return "#com.intellij.refactoring.rename.AutomaticRenamingDialog";
119 protected JComponent
createNorthPanel() {
120 final Box box
= Box
.createHorizontalBox();
121 box
.add(new JLabel(myRenamer
.getDialogDescription()));
122 box
.add(Box
.createHorizontalGlue());
127 if (ApplicationManager
.getApplication().isUnitTestMode()) return;
131 protected void handleChanges() {
134 protected JComponent
createCenterPanel() {
135 myTableModel
= new MyTableModel();
136 myTable
.setModel(myTableModel
);
137 myTableModel
.getSpaceAction().register();
138 myTableModel
.addTableModelListener(new TableModelListener() {
139 public void tableChanged(TableModelEvent e
) {
144 final TableColumnModel columnModel
= myTable
.getColumnModel();
145 columnModel
.getColumn(CHECK_COLUMN
).setCellRenderer(new BooleanTableCellRenderer());
146 final int checkBoxWidth
= new JCheckBox().getPreferredSize().width
;
147 columnModel
.getColumn(CHECK_COLUMN
).setMaxWidth(checkBoxWidth
);
148 columnModel
.getColumn(CHECK_COLUMN
).setMinWidth(checkBoxWidth
);
150 columnModel
.getColumn(NEW_NAME_COLUMN
).setCellEditor(new StringTableCellEditor(myProject
));
151 mySelectAllButton
.addActionListener(new ActionListener() {
152 public void actionPerformed(ActionEvent e
) {
153 for (int i
= 0; i
< myShouldRename
.length
; i
++) {
154 myShouldRename
[i
] = true;
160 myUnselectAllButton
.addActionListener(new ActionListener() {
161 public void actionPerformed(ActionEvent e
) {
162 for (int i
= 0; i
< myShouldRename
.length
; i
++) {
163 myShouldRename
[i
] = false;
168 myListSelectionListener
= new ListSelectionListener() {
169 public void valueChanged(final ListSelectionEvent e
) {
170 int index
= myTable
.getSelectionModel().getLeadSelectionIndex();
172 PsiNamedElement element
= myRenames
[index
];
173 UsageInfo usageInfo
= new UsageInfo(element
);
174 myUsagePreviewPanel
.updateLayout(Collections
.singletonList(usageInfo
));
177 myUsagePreviewPanel
.updateLayout(null);
181 myTable
.getSelectionModel().addListSelectionListener(myListSelectionListener
);
183 myPanelForPreview
.add(myUsagePreviewPanel
, BorderLayout
.CENTER
);
184 myUsagePreviewPanel
.updateLayout(null);
185 mySplitPane
.setDividerLocation(0.5);
187 GuiUtils
.replaceJSplitPaneWithIDEASplitter(myPanel
);
189 if (myTableModel
.getRowCount() != 0) {
190 myTable
.getSelectionModel().addSelectionInterval(0,0);
195 private void fireDataChanged() {
196 int[] selectedRows
= myTable
.getSelectedRows();
197 myTable
.getSelectionModel().removeListSelectionListener(myListSelectionListener
);
199 myTableModel
.fireTableDataChanged();
200 for (int selectedRow
: selectedRows
) {
201 myTable
.addRowSelectionInterval(selectedRow
, selectedRow
);
203 myTable
.getSelectionModel().addListSelectionListener(myListSelectionListener
);
206 public JComponent
getPreferredFocusedComponent() {
210 protected void doOKAction() {
211 TableUtil
.stopEditing(myTable
);
216 protected void dispose() {
217 Disposer
.dispose(myUsagePreviewPanel
);
221 private void updateRenamer() {
222 for (int i
= 0; i
< myRenames
.length
; i
++) {
223 PsiNamedElement element
= myRenames
[i
];
224 if (myShouldRename
[i
]) {
225 myRenamer
.setRename(element
, myNewNames
[i
]);
228 myRenamer
.doNotRename(element
);
233 private class MyTableModel
extends AbstractTableModel
{
234 public int getColumnCount() {
238 public int getRowCount() {
239 return myShouldRename
.length
;
242 public Object
getValueAt(int rowIndex
, int columnIndex
) {
243 switch(columnIndex
) {
245 return Boolean
.valueOf(myShouldRename
[rowIndex
]);
246 case OLD_NAME_COLUMN
:
247 final PsiNamedElement namedElement
= myRenames
[rowIndex
];
248 String location
= null;
249 if (namedElement
instanceof NavigationItem
) {
250 final ItemPresentation presentation
= ((NavigationItem
)namedElement
).getPresentation();
251 if (presentation
!= null) {
252 location
= presentation
.getLocationString();
255 return namedElement
.getName() + (location
!= null ?
" " + location
: "");
256 case NEW_NAME_COLUMN
:
257 return myNewNames
[rowIndex
];
259 LOG
.assertTrue(false);
264 public void setValueAt(Object aValue
, int rowIndex
, int columnIndex
) {
265 switch(columnIndex
) {
267 myShouldRename
[rowIndex
] = ((Boolean
)aValue
).booleanValue();
269 case NEW_NAME_COLUMN
:
270 myNewNames
[rowIndex
] = (String
) aValue
;
273 LOG
.assertTrue(false);
278 public boolean isCellEditable(int rowIndex
, int columnIndex
) {
279 return columnIndex
!= OLD_NAME_COLUMN
;
282 public Class
getColumnClass(int columnIndex
) {
283 switch(columnIndex
) {
284 case CHECK_COLUMN
: return Boolean
.class;
285 case OLD_NAME_COLUMN
: return String
.class;
286 case NEW_NAME_COLUMN
: return String
.class;
287 default: return null;
291 public String
getColumnName(int column
) {
293 case OLD_NAME_COLUMN
:
294 return RefactoringBundle
.message("automatic.renamer.enity.name.column", myRenamer
.entityName());
295 case NEW_NAME_COLUMN
:
296 return RefactoringBundle
.message("automatic.renamer.rename.to.column");
302 private MyEnableDisable
getSpaceAction() {
303 return this.new MyEnableDisable();
306 private class MyEnableDisable
extends EnableDisableAction
{
307 protected JTable
getTable() {
311 protected boolean isRowChecked(int row
) {
312 return myShouldRename
[row
];
315 protected void applyValue(int[] rows
, boolean valueToBeSet
) {
316 for (final int row
: rows
) {
317 myShouldRename
[row
] = valueToBeSet
;