| /* |
| * Copyright 2000-2014 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.refactoring.safeDelete; |
| |
| import com.intellij.openapi.Disposable; |
| import com.intellij.openapi.help.HelpManager; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.openapi.ui.DialogWrapper; |
| import com.intellij.openapi.ui.Splitter; |
| import com.intellij.openapi.util.Disposer; |
| import com.intellij.psi.PsiSubstitutor; |
| import com.intellij.psi.util.PsiFormatUtil; |
| import com.intellij.psi.util.PsiFormatUtilBase; |
| import com.intellij.refactoring.HelpID; |
| import com.intellij.refactoring.RefactoringBundle; |
| import com.intellij.refactoring.safeDelete.usageInfo.SafeDeleteOverridingMethodUsageInfo; |
| import com.intellij.ui.BooleanTableCellRenderer; |
| import com.intellij.ui.ScrollPaneFactory; |
| import com.intellij.ui.TableUtil; |
| import com.intellij.usageView.UsageInfo; |
| import com.intellij.usages.UsageViewPresentation; |
| import com.intellij.usages.impl.UsagePreviewPanel; |
| import com.intellij.util.ui.Table; |
| import org.jetbrains.annotations.NonNls; |
| import org.jetbrains.annotations.NotNull; |
| |
| import javax.swing.*; |
| import javax.swing.event.ListSelectionEvent; |
| import javax.swing.event.ListSelectionListener; |
| import javax.swing.table.AbstractTableModel; |
| import javax.swing.table.TableColumn; |
| import javax.swing.table.TableColumnModel; |
| import java.awt.*; |
| import java.awt.event.ActionEvent; |
| import java.awt.event.KeyEvent; |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.List; |
| |
| /** |
| * @author dsl |
| */ |
| class OverridingMethodsDialog extends DialogWrapper { |
| private final List<UsageInfo> myOverridingMethods; |
| private final String[] myMethodText; |
| private final boolean[] myChecked; |
| |
| private static final int CHECK_COLUMN = 0; |
| private Table myTable; |
| private final UsagePreviewPanel myUsagePreviewPanel; |
| |
| public OverridingMethodsDialog(Project project, List<UsageInfo> overridingMethods) { |
| super(project, true); |
| myOverridingMethods = overridingMethods; |
| myChecked = new boolean[myOverridingMethods.size()]; |
| for (int i = 0; i < myChecked.length; i++) { |
| myChecked[i] = true; |
| } |
| |
| myMethodText = new String[myOverridingMethods.size()]; |
| for (int i = 0; i < myMethodText.length; i++) { |
| myMethodText[i] = PsiFormatUtil.formatMethod( |
| ((SafeDeleteOverridingMethodUsageInfo) myOverridingMethods.get(i)).getOverridingMethod(), |
| PsiSubstitutor.EMPTY, PsiFormatUtilBase.SHOW_CONTAINING_CLASS |
| | PsiFormatUtilBase.SHOW_NAME | PsiFormatUtilBase.SHOW_PARAMETERS | PsiFormatUtilBase.SHOW_TYPE, |
| PsiFormatUtilBase.SHOW_TYPE |
| ); |
| } |
| myUsagePreviewPanel = new UsagePreviewPanel(project, new UsageViewPresentation()); |
| setTitle(RefactoringBundle.message("unused.overriding.methods.title")); |
| init(); |
| } |
| |
| protected String getDimensionServiceKey() { |
| return "#com.intellij.refactoring.safeDelete.OverridingMethodsDialog"; |
| } |
| |
| public ArrayList<UsageInfo> getSelected() { |
| ArrayList<UsageInfo> result = new ArrayList<UsageInfo>(); |
| for (int i = 0; i < myChecked.length; i++) { |
| if(myChecked[i]) { |
| result.add(myOverridingMethods.get(i)); |
| } |
| } |
| return result; |
| } |
| |
| @NotNull |
| protected Action[] createActions() { |
| return new Action[]{getOKAction(), getCancelAction()/*, getHelpAction()*/}; |
| } |
| |
| protected void doHelpAction() { |
| HelpManager.getInstance().invokeHelp(HelpID.SAFE_DELETE_OVERRIDING); |
| } |
| |
| protected JComponent createNorthPanel() { |
| JPanel panel = new JPanel(); |
| panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); |
| panel.add(new JLabel(RefactoringBundle.message("there.are.unused.methods.that.override.methods.you.delete"))); |
| panel.add(new JLabel(RefactoringBundle.message("choose.the.ones.you.want.to.be.deleted"))); |
| return panel; |
| } |
| |
| public JComponent getPreferredFocusedComponent() { |
| return myTable; |
| } |
| |
| @Override |
| protected void dispose() { |
| Disposer.dispose(myUsagePreviewPanel); |
| super.dispose(); |
| } |
| |
| protected JComponent createCenterPanel() { |
| JPanel panel = new JPanel(new BorderLayout()); |
| panel.setBorder(BorderFactory.createEmptyBorder(8, 0, 4, 0)); |
| final MyTableModel tableModel = new MyTableModel(); |
| myTable = new Table(tableModel); |
| myTable.setShowGrid(false); |
| |
| TableColumnModel columnModel = myTable.getColumnModel(); |
| // columnModel.getColumn(DISPLAY_NAME_COLUMN).setCellRenderer(new MemberSelectionTable.MyTableRenderer()); |
| TableColumn checkboxColumn = columnModel.getColumn(CHECK_COLUMN); |
| TableUtil.setupCheckboxColumn(checkboxColumn); |
| checkboxColumn.setCellRenderer(new BooleanTableCellRenderer()); |
| |
| // make SPACE check/uncheck selected rows |
| @NonNls InputMap inputMap = myTable.getInputMap(); |
| inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "enable_disable"); |
| @NonNls final ActionMap actionMap = myTable.getActionMap(); |
| actionMap.put("enable_disable", new AbstractAction() { |
| public void actionPerformed(ActionEvent e) { |
| if (myTable.isEditing()) return; |
| int[] rows = myTable.getSelectedRows(); |
| if (rows.length > 0) { |
| boolean valueToBeSet = false; |
| for (int row : rows) { |
| if (!myChecked[row]) { |
| valueToBeSet = true; |
| break; |
| } |
| } |
| for (int row : rows) { |
| myChecked[row] = valueToBeSet; |
| } |
| |
| tableModel.updateData(); |
| } |
| } |
| }); |
| |
| |
| |
| /*Border titledBorder = IdeBorderFactory.createBoldTitledBorder("Select methods"); |
| Border emptyBorder = BorderFactory.createEmptyBorder(0, 5, 5, 5); |
| Border border = BorderFactory.createCompoundBorder(titledBorder, emptyBorder); |
| panel.setBorder(border);*/ |
| panel.setLayout(new BorderLayout()); |
| |
| JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(myTable); |
| |
| panel.add(scrollPane, BorderLayout.CENTER); |
| ListSelectionListener selectionListener = new ListSelectionListener() { |
| public void valueChanged(final ListSelectionEvent e) { |
| int index = myTable.getSelectionModel().getLeadSelectionIndex(); |
| if (index != -1) { |
| UsageInfo usageInfo = myOverridingMethods.get(index); |
| myUsagePreviewPanel.updateLayout(Collections.singletonList(usageInfo)); |
| } |
| else { |
| myUsagePreviewPanel.updateLayout(null); |
| } |
| } |
| }; |
| myTable.getSelectionModel().addListSelectionListener(selectionListener); |
| |
| final Splitter splitter = new Splitter(true, 0.3f); |
| splitter.setFirstComponent(panel); |
| splitter.setSecondComponent(myUsagePreviewPanel); |
| myUsagePreviewPanel.updateLayout(null); |
| |
| Disposer.register(myDisposable, new Disposable(){ |
| public void dispose() { |
| splitter.dispose(); |
| } |
| }); |
| |
| if (tableModel.getRowCount() != 0) { |
| myTable.getSelectionModel().addSelectionInterval(0,0); |
| } |
| return splitter; |
| } |
| |
| class MyTableModel extends AbstractTableModel { |
| public int getRowCount() { |
| return myChecked.length; |
| } |
| |
| public String getColumnName(int column) { |
| switch(column) { |
| case CHECK_COLUMN: |
| return " "; |
| default: |
| return RefactoringBundle.message("method.column"); |
| } |
| } |
| |
| public Class getColumnClass(int columnIndex) { |
| switch(columnIndex) { |
| case CHECK_COLUMN: |
| return Boolean.class; |
| default: |
| return String.class; |
| } |
| } |
| |
| |
| public int getColumnCount() { |
| return 2; |
| } |
| |
| public Object getValueAt(int rowIndex, int columnIndex) { |
| if(columnIndex == CHECK_COLUMN) { |
| return Boolean.valueOf(myChecked[rowIndex]); |
| } |
| else { |
| return myMethodText[rowIndex]; |
| } |
| } |
| |
| public void setValueAt(Object aValue, int rowIndex, int columnIndex) { |
| if(columnIndex == CHECK_COLUMN) { |
| myChecked[rowIndex] = ((Boolean) aValue).booleanValue(); |
| } |
| } |
| |
| public boolean isCellEditable(int rowIndex, int columnIndex) { |
| return columnIndex == CHECK_COLUMN; |
| } |
| |
| void updateData() { |
| fireTableDataChanged(); |
| } |
| } |
| } |