From 7007d82a522efaafffabc7d6378d43024ad3aa21 Mon Sep 17 00:00:00 2001 From: "Kirill.Safonov" Date: Tue, 17 Aug 2010 16:05:10 +0400 Subject: [PATCH] TFS: cosmetics/usability fixes for edit workspace dialog --- .../util/ui/ChangesTrackingTableView.java | 103 +++++++++++++----- .../util/ui/ValidatingTableEditor.java | 49 +++++---- 2 files changed, 108 insertions(+), 44 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/util/ui/ChangesTrackingTableView.java b/platform/platform-impl/src/com/intellij/util/ui/ChangesTrackingTableView.java index 9e2e05d0af93..e69774c3ee91 100644 --- a/platform/platform-impl/src/com/intellij/util/ui/ChangesTrackingTableView.java +++ b/platform/platform-impl/src/com/intellij/util/ui/ChangesTrackingTableView.java @@ -15,19 +15,27 @@ */ package com.intellij.util.ui; +import com.intellij.openapi.Disposable; +import com.intellij.openapi.util.Disposer; import com.intellij.ui.DocumentAdapter; import com.intellij.ui.table.TableView; import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.table.TableCellEditor; +import javax.swing.text.Document; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.util.EventObject; public abstract class ChangesTrackingTableView extends TableView { - private DocumentAdapter myMessageUpdater; + private Disposable myEditorListenerDisposable; - protected abstract void onTextChanged(int row, int column, String value); + protected abstract void onCellValueChanged(int row, int column, Object value); protected abstract void onEditingStopped(); @@ -43,21 +51,18 @@ public abstract class ChangesTrackingTableView extends TableView { @Override public boolean editCellAt(final int row, final int column, EventObject e) { if (super.editCellAt(row, column, e)) { - assert myMessageUpdater == null; - final JTextField textField; - if (getEditorComponent() instanceof CellEditorComponentWithBrowseButton) { - textField = (JTextField)((CellEditorComponentWithBrowseButton)editorComp).getChildComponent(); - } - else { - textField = (JTextField)getEditorComponent(); - } - myMessageUpdater = new DocumentAdapter() { + assert myEditorListenerDisposable == null; + myEditorListenerDisposable = new Disposable() { @Override - protected void textChanged(DocumentEvent e) { - onTextChanged(row, column, textField.getText()); + public void dispose() { } }; - textField.getDocument().addDocumentListener(myMessageUpdater); + addChangeListener(getEditorComponent(), new ChangeListener() { + @Override + public void stateChanged(ChangeEvent e) { + onCellValueChanged(row, column, getValue(getEditorComponent())); + } + }, myEditorListenerDisposable); return true; } return false; @@ -65,19 +70,67 @@ public abstract class ChangesTrackingTableView extends TableView { @Override public void removeEditor() { - if (myMessageUpdater != null) { - final JTextField textField; - if (getEditorComponent() instanceof CellEditorComponentWithBrowseButton) { - textField = (JTextField)((CellEditorComponentWithBrowseButton)editorComp).getChildComponent(); - } - else { - textField = (JTextField)getEditorComponent(); - } - textField.getDocument().removeDocumentListener(myMessageUpdater); - myMessageUpdater = null; + if (myEditorListenerDisposable != null) { + Disposer.dispose(myEditorListenerDisposable); + myEditorListenerDisposable = null; } onEditingStopped(); super.removeEditor(); } -} + + public static Object getValue(Component component) { + if (component instanceof CellEditorComponentWithBrowseButton) { + final JTextField textField = (JTextField)((CellEditorComponentWithBrowseButton)component).getChildComponent(); + return textField.getText(); + } + else if (component instanceof JTextField) { + return ((JTextField)component).getText(); + } + else if (component instanceof JComboBox) { + return ((JComboBox)component).getSelectedItem(); + } + throw new UnsupportedOperationException("editor control of type " + component.getClass().getName() + " is not supported"); + } + + private static void addChangeListener(final Component component, final ChangeListener listener, Disposable parentDisposable) { + if (component instanceof CellEditorComponentWithBrowseButton) { + addChangeListener(((CellEditorComponentWithBrowseButton)component).getChildComponent(), listener, parentDisposable); + } + else if (component instanceof JTextField) { + final DocumentAdapter documentListener = new DocumentAdapter() { + @Override + protected void textChanged(DocumentEvent e) { + listener.stateChanged(new ChangeEvent(component)); + } + }; + final Document document = ((JTextField)component).getDocument(); + document.addDocumentListener(documentListener); + Disposer.register(parentDisposable, new Disposable() { + @Override + public void dispose() { + document.removeDocumentListener(documentListener); + } + }); + } + else if (component instanceof JComboBox) { + final ActionListener comboListener = new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + listener.stateChanged(new ChangeEvent(component)); + } + }; + ((JComboBox)component).addActionListener(comboListener); + Disposer.register(parentDisposable, new Disposable() { + @Override + public void dispose() { + ((JComboBox)component).removeActionListener(comboListener); + } + }); + } + else { + throw new UnsupportedOperationException("editor control of type " + component.getClass().getName() + " is not supported"); + } + } + +} \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/util/ui/ValidatingTableEditor.java b/platform/platform-impl/src/com/intellij/util/ui/ValidatingTableEditor.java index 5f8e3b7f475b..ea810e7d12f7 100644 --- a/platform/platform-impl/src/com/intellij/util/ui/ValidatingTableEditor.java +++ b/platform/platform-impl/src/com/intellij/util/ui/ValidatingTableEditor.java @@ -53,16 +53,16 @@ public abstract class ValidatingTableEditor { String getTitle(); } - private class ColumnInfoWrapper extends ColumnInfo { - private final ColumnInfo myDelegate; + private class ColumnInfoWrapper extends ColumnInfo { + private final ColumnInfo myDelegate; - public ColumnInfoWrapper(ColumnInfo delegate) { + public ColumnInfoWrapper(ColumnInfo delegate) { super(delegate.getName()); myDelegate = delegate; } @Override - public String valueOf(Item item) { + public Object valueOf(Item item) { return myDelegate.valueOf(item); } @@ -72,7 +72,7 @@ public abstract class ValidatingTableEditor { } @Override - public void setValue(Item item, String value) { + public void setValue(Item item, Object value) { myDelegate.setValue(item, value); updateMessage(-1, null); } @@ -81,6 +81,11 @@ public abstract class ValidatingTableEditor { public TableCellEditor getEditor(Item item) { return myDelegate.getEditor(item); } + + @Override + public int getWidth(JTable table) { + return myDelegate.getWidth(table); + } } private JPanel myContentPane; @@ -146,10 +151,10 @@ public abstract class ValidatingTableEditor { private void createUIComponents() { myTable = new ChangesTrackingTableView() { - protected void onTextChanged(int row, int column, String value) { + protected void onCellValueChanged(int row, int column, Object value) { final Item original = getItems().get(row); Item override = cloneOf(original); - final ColumnInfo columnInfo = getTableModel().getColumnInfos()[column]; + final ColumnInfo columnInfo = getTableModel().getColumnInfos()[column]; columnInfo.setValue(override, value); updateMessage(row, override); } @@ -235,7 +240,7 @@ public abstract class ValidatingTableEditor { return (ListTableModel)myTable.getModel(); } - public void setModel(ColumnInfo[] valueColumns, List items) { + public void setModel(ColumnInfo[] valueColumns, List items) { ColumnInfo[] columns = new ColumnInfo[valueColumns.length + 1]; IconColumn iconColumn = new IconColumn(); int maxHeight = iconColumn.getRowHeight(); @@ -265,15 +270,7 @@ public abstract class ValidatingTableEditor { private List doGetItems() { List items = new ArrayList(getTableModel().getItems()); if (myTable.isEditing()) { - Component c = myTable.getEditorComponent(); - final JTextField textField; - if (c instanceof CellEditorComponentWithBrowseButton) { - textField = (JTextField)((CellEditorComponentWithBrowseButton)c).getChildComponent(); - } - else { - textField = (JTextField)c; - } - String value = textField.getText(); + Object value = ChangesTrackingTableView.getValue(myTable.getEditorComponent()); ColumnInfo column = ((ListTableModel)myTable.getModel()).getColumnInfos()[myTable.getEditingColumn()]; ((ColumnInfoWrapper)column).myDelegate.setValue(items.get(myTable.getEditingRow()), value); } @@ -308,7 +305,11 @@ public abstract class ValidatingTableEditor { current.set(index, override); } - Pair messageAndFix = validate(current, myWarnings); + displayMessageAndFix(validate(current, myWarnings)); + myTable.repaint(); + } + + protected void displayMessageAndFix(@Nullable Pair messageAndFix) { if (messageAndFix != null) { myMessageLabel.setText(messageAndFix.first); myMessageLabel.setIcon(WARNING_ICON); @@ -323,7 +324,11 @@ public abstract class ValidatingTableEditor { myFixLink.setVisible(false); myFixRunnable = null; } - myTable.repaint(); + } + + public void hideMessageLabel() { + myMessageLabel.setVisible(false); + myFixLink.setVisible(false); } public JComponent getPreferredFocusedComponent() { @@ -354,5 +359,11 @@ public abstract class ValidatingTableEditor { return myContentPane; } + public void setColumnReorderingAllowed(boolean value) { + JTableHeader header = myTable.getTableHeader(); + if (header != null) { + header.setReorderingAllowed(value); + } + } }