blob: a2c12fe82998d63fbfef8c381098f73ce97540c0 [file] [log] [blame]
/*
* Copyright 2000-2009 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.migration;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.refactoring.RefactoringBundle;
import com.intellij.ui.*;
import com.intellij.ui.table.JBTable;
import com.intellij.util.ui.FormBuilder;
import com.intellij.util.ui.UIUtil;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
import java.awt.*;
public class EditMigrationDialog extends DialogWrapper{
private JBTable myTable;
private JTextField myNameField;
private JTextArea myDescriptionTextArea;
private final Project myProject;
private final MigrationMap myMigrationMap;
public EditMigrationDialog(Project project, MigrationMap migrationMap) {
super(project, true);
myProject = project;
myMigrationMap = migrationMap;
setHorizontalStretch(1.2f);
setTitle(RefactoringBundle.message("edit.migration.map.title"));
init();
validateOKButton();
}
public JComponent getPreferredFocusedComponent() {
return myNameField;
}
private void validateOKButton() {
boolean isEnabled = true;
if (myNameField.getText().trim().length() == 0) {
isEnabled = false;
} else if (myMigrationMap.getEntryCount() == 0) {
isEnabled = false;
}
setOKActionEnabled(isEnabled);
}
public String getName() {
return myNameField.getText();
}
public String getDescription() {
return myDescriptionTextArea.getText();
}
protected JComponent createNorthPanel() {
myNameField = new JTextField(myMigrationMap.getName());
myNameField.getDocument().addDocumentListener(new DocumentAdapter() {
protected void textChanged(DocumentEvent e) {
validateOKButton();
}
});
myDescriptionTextArea = new JTextArea(myMigrationMap.getDescription(), 3, 40) {
@Override
public Dimension getMinimumSize() {
return super.getPreferredSize();
}
};
myDescriptionTextArea.setLineWrap(true);
myDescriptionTextArea.setWrapStyleWord(true);
myDescriptionTextArea.setFont(myNameField.getFont());
myDescriptionTextArea.setBackground(myNameField.getBackground());
JScrollPane scrollPane = ScrollPaneFactory.createScrollPane(myDescriptionTextArea);
scrollPane.setBorder(myNameField.getBorder());
return FormBuilder.createFormBuilder()
.addLabeledComponent(new JLabel(RefactoringBundle.message("migration.map.name.prompt")), myNameField)
.addLabeledComponent(new JLabel(RefactoringBundle.message("migration.map.description.label")), scrollPane)
.addVerticalGap(UIUtil.LARGE_VGAP).getPanel();
}
protected JComponent createCenterPanel() {
return ToolbarDecorator.createDecorator(createTable())
.setAddAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
addRow();
validateOKButton();
}
}).setRemoveAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
removeRow();
validateOKButton();
}
}).setEditAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
edit();
}
}).setMoveUpAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
moveUp();
}
}).setMoveDownAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
moveDown();
}
}).createPanel();
}
private void edit() {
EditMigrationEntryDialog dialog = new EditMigrationEntryDialog(myProject);
int selected = myTable.getSelectedRow();
if (selected < 0)
return;
MigrationMapEntry entry = myMigrationMap.getEntryAt(selected);
dialog.setEntry(entry);
dialog.show();
if (!dialog.isOK()){
return;
}
dialog.updateEntry(entry);
AbstractTableModel model = (AbstractTableModel)myTable.getModel();
model.fireTableRowsUpdated(selected, selected);
}
private void addRow() {
EditMigrationEntryDialog dialog = new EditMigrationEntryDialog(myProject);
MigrationMapEntry entry = new MigrationMapEntry();
dialog.setEntry(entry);
dialog.show();
if (!dialog.isOK()){
return;
}
dialog.updateEntry(entry);
myMigrationMap.addEntry(entry);
AbstractTableModel model = (AbstractTableModel)myTable.getModel();
model.fireTableRowsInserted(myMigrationMap.getEntryCount() - 1, myMigrationMap.getEntryCount() - 1);
myTable.setRowSelectionInterval(myMigrationMap.getEntryCount() - 1, myMigrationMap.getEntryCount() - 1);
}
private void removeRow() {
int selected = myTable.getSelectedRow();
if (selected < 0)
return;
myMigrationMap.removeEntryAt(selected);
AbstractTableModel model = (AbstractTableModel)myTable.getModel();
model.fireTableRowsDeleted(selected, selected);
if (selected >= myMigrationMap.getEntryCount()){
selected--;
}
if (selected >= 0){
myTable.setRowSelectionInterval(selected, selected);
}
}
private void moveUp() {
int selected = myTable.getSelectedRow();
if (selected < 1)
return;
MigrationMapEntry entry = myMigrationMap.getEntryAt(selected);
MigrationMapEntry previousEntry = myMigrationMap.getEntryAt(selected - 1);
myMigrationMap.setEntryAt(previousEntry, selected);
myMigrationMap.setEntryAt(entry, selected - 1);
AbstractTableModel model = (AbstractTableModel)myTable.getModel();
model.fireTableRowsUpdated(selected - 1, selected);
myTable.setRowSelectionInterval(selected - 1, selected - 1);
}
private void moveDown() {
int selected = myTable.getSelectedRow();
if (selected >= myMigrationMap.getEntryCount() - 1)
return;
MigrationMapEntry entry = myMigrationMap.getEntryAt(selected);
MigrationMapEntry nextEntry = myMigrationMap.getEntryAt(selected + 1);
myMigrationMap.setEntryAt(nextEntry, selected);
myMigrationMap.setEntryAt(entry, selected + 1);
AbstractTableModel model = (AbstractTableModel)myTable.getModel();
model.fireTableRowsUpdated(selected, selected + 1);
myTable.setRowSelectionInterval(selected + 1, selected + 1);
}
private JBTable createTable() {
final String[] names = {
RefactoringBundle.message("migration.type.column.header"),
RefactoringBundle.message("migration.old.name.column.header"),
RefactoringBundle.message("migration.new.name.column.header")};
// Create a model of the data.
TableModel dataModel = new AbstractTableModel() {
public int getColumnCount() {
return 3;
}
public int getRowCount() {
return myMigrationMap.getEntryCount();
}
public Object getValueAt(int row, int col) {
MigrationMapEntry entry = myMigrationMap.getEntryAt(row);
if (col == 0){
if (entry.getType() == MigrationMapEntry.PACKAGE && entry.isRecursive()){
return RefactoringBundle.message("migration.package.with.subpackages");
}
else if (entry.getType() == MigrationMapEntry.PACKAGE && !entry.isRecursive()){
return RefactoringBundle.message("migration.package");
}
else{
return RefactoringBundle.message("migration.class");
}
}
String suffix = (entry.getType() == MigrationMapEntry.PACKAGE ? ".*" : "");
if (col == 1){
return entry.getOldName() + suffix;
}
else{
return entry.getNewName() + suffix;
}
}
public String getColumnName(int column) {
return names[column];
}
public Class getColumnClass(int c) {
return String.class;
}
public boolean isCellEditable(int row, int col) {
return false;
}
public void setValueAt(Object aValue, int row, int column) {
}
};
// Create the table
myTable = new JBTable(dataModel);
myTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
myTable.setPreferredScrollableViewportSize(new Dimension(300, myTable.getRowHeight() * 10));
return myTable;
}
}