continue WEB-11775 'Do Not Step Into' groupings

This commit is contained in:
Vladimir Krivosheev
2014-05-13 13:14:46 +02:00
parent ec7167116d
commit b63b70364f
2 changed files with 98 additions and 50 deletions
@@ -20,6 +20,7 @@ import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.JDOMUtil;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.ui.*;
import com.intellij.ui.table.TableView;
import com.intellij.util.Function;
@@ -43,6 +44,7 @@ import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TableModelEditor<T> implements ElementProducer<T> {
@@ -53,6 +55,10 @@ public class TableModelEditor<T> implements ElementProducer<T> {
private final MyListTableModel<T> model;
public TableModelEditor(@NotNull ColumnInfo[] columns, @NotNull ItemEditor<T> itemEditor, @NotNull String emptyText) {
this(Collections.<T>emptyList(), columns, itemEditor, emptyText);
}
/**
* source will be copied, passed list will not be used directly
*
@@ -70,43 +76,85 @@ public class TableModelEditor<T> implements ElementProducer<T> {
TableUtil.setupCheckboxColumn(table.getColumnModel().getColumn(0));
}
boolean needTableHeader = false;
for (ColumnInfo column : columns) {
if (!StringUtil.isEmpty(column.getName())) {
needTableHeader = true;
break;
}
}
if (!needTableHeader) {
table.setTableHeader(null);
}
table.getEmptyText().setText(emptyText);
MyRemoveAction removeAction = new MyRemoveAction();
toolbarDecorator = ToolbarDecorator.createDecorator(table, this).setRemoveAction(removeAction).setRemoveActionUpdater(removeAction);
if (itemEditor instanceof DialogItemEditor) {
toolbarDecorator.setEditAction(new AnActionButtonRunnable() {
addDialogActions();
}
}
private void addDialogActions() {
toolbarDecorator.setEditAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
T item = table.getSelectedObject();
if (item != null) {
Function<T, T> mutator;
if (model.isMutable(item)) {
mutator = FunctionUtil.id();
}
else {
final int selectedRow = table.getSelectedRow();
mutator = new Function<T, T>() {
@Override
public T fun(T item) {
return model.getMutable(selectedRow, item);
}
};
}
((DialogItemEditor<T>)itemEditor).edit(item, mutator, false);
table.requestFocus();
}
}
}).setEditActionUpdater(new AnActionButtonUpdater() {
@Override
public boolean isEnabled(AnActionEvent e) {
T item = table.getSelectedObject();
return item != null && ((DialogItemEditor<T>)itemEditor).isEditable(item);
}
});
if (((DialogItemEditor)itemEditor).isUseDialogToAdd()) {
toolbarDecorator.setAddAction(new AnActionButtonRunnable() {
@Override
public void run(AnActionButton button) {
T item = table.getSelectedObject();
if (item != null) {
Function<T, T> mutator;
if (model.isMutable(item)) {
mutator = FunctionUtil.id();
T item = createElement();
((DialogItemEditor<T>)itemEditor).edit(item, new Function<T, T>() {
@Override
public T fun(T item) {
model.addRow(item);
return item;
}
else {
final int selectedRow = table.getSelectedRow();
mutator = new Function<T, T>() {
@Override
public T fun(T item) {
return model.getMutable(selectedRow, item);
}
};
}
((DialogItemEditor<T>)TableModelEditor.this.itemEditor).edit(item, mutator);
table.requestFocus();
}
}
}).setEditActionUpdater(new AnActionButtonUpdater() {
@Override
public boolean isEnabled(AnActionEvent e) {
T item = table.getSelectedObject();
return item != null && ((DialogItemEditor<T>)TableModelEditor.this.itemEditor).isEditable(item);
}, true);
}
});
}
}
public TableModelEditor<T> disableUpDownActions() {
toolbarDecorator.disableUpDownActions();
return this;
}
public TableModelEditor<T> enabled(boolean value) {
table.setEnabled(value);
return this;
}
public static abstract class DataChangedListener<T> implements TableModelListener {
public abstract void dataChanged(@NotNull ColumnInfo<T, ?> columnInfo, int rowIndex);
@@ -146,13 +194,17 @@ public class TableModelEditor<T> implements ElementProducer<T> {
}
public static abstract class DialogItemEditor<T> extends ItemEditor<T> {
public abstract void edit(@NotNull T item, @NotNull Function<T, T> mutator);
public abstract void edit(@NotNull T item, @NotNull Function<T, T> mutator, boolean isAdd);
public abstract void applyEdited(@NotNull T oldItem, @NotNull T newItem);
public boolean isEditable(@NotNull T item) {
return true;
}
public boolean isUseDialogToAdd() {
return false;
}
}
@NotNull
@@ -322,7 +374,7 @@ public class TableModelEditor<T> implements ElementProducer<T> {
try {
constructor.setAccessible(true);
}
catch (SecurityException e) {
catch (SecurityException ignored) {
return itemEditor.getItemClass().newInstance();
}
return constructor.newInstance();
@@ -46,7 +46,6 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.Collections;
import java.util.UUID;
import static com.intellij.ide.browsers.WebBrowserManager.DefaultBrowser;
@@ -139,16 +138,14 @@ final class BrowserSettingsPanel {
@SuppressWarnings("UnusedDeclaration")
private JComponent browsersTable;
private ComboBox defaultBrowserComboBox;
private ComboBox defaultBrowserComboBox;
private TableModelEditor<ConfigurableWebBrowser> browsersEditor;
private String customPathValue;
public BrowserSettingsPanel() {
alternativeBrowserPathField.addBrowseFolderListener(IdeBundle.message("title.select.path.to.browser"), null, null,
APP_FILE_CHOOSER_DESCRIPTOR);
alternativeBrowserPathField.addBrowseFolderListener(IdeBundle.message("title.select.path.to.browser"), null, null, APP_FILE_CHOOSER_DESCRIPTOR);
defaultBrowserPanel.setBorder(TitledSeparator.EMPTY_BORDER);
//noinspection unchecked
@@ -236,7 +233,7 @@ final class BrowserSettingsPanel {
}
@Override
public void edit(@NotNull ConfigurableWebBrowser browser, @NotNull Function<ConfigurableWebBrowser, ConfigurableWebBrowser> mutator) {
public void edit(@NotNull ConfigurableWebBrowser browser, @NotNull Function<ConfigurableWebBrowser, ConfigurableWebBrowser> mutator, boolean isAdd) {
BrowserSpecificSettings settings = cloneSettings(browser);
if (settings != null && ShowSettingsUtil.getInstance().editConfigurable(browsersTable, settings.createConfigurable())) {
mutator.fun(browser).setSpecificSettings(settings);
@@ -271,27 +268,26 @@ final class BrowserSettingsPanel {
return !WebBrowserManager.getInstance().isPredefinedBrowser(item);
}
};
browsersEditor = new TableModelEditor<ConfigurableWebBrowser>(Collections.<ConfigurableWebBrowser>emptyList(), COLUMNS,
itemEditor, "No web browsers configured"
).modelListener(new TableModelEditor.DataChangedListener<ConfigurableWebBrowser>() {
@Override
public void tableChanged(TableModelEvent event) {
update(event.getFirstRow());
}
@Override
public void dataChanged(@NotNull ColumnInfo<ConfigurableWebBrowser, ?> columnInfo, int rowIndex) {
if (columnInfo == PATH_COLUMN_INFO) {
update(rowIndex);
browsersEditor = new TableModelEditor<ConfigurableWebBrowser>(COLUMNS, itemEditor, "No web browsers configured")
.modelListener(new TableModelEditor.DataChangedListener<ConfigurableWebBrowser>() {
@Override
public void tableChanged(TableModelEvent event) {
update(event.getFirstRow());
}
}
private void update(int rowIndex) {
if (rowIndex == 0 && getDefaultBrowser() == DefaultBrowser.FIRST) {
setCustomPathToFirstListed();
@Override
public void dataChanged(@NotNull ColumnInfo<ConfigurableWebBrowser, ?> columnInfo, int rowIndex) {
if (columnInfo == PATH_COLUMN_INFO) {
update(rowIndex);
}
}
}
});
private void update(int rowIndex) {
if (rowIndex == 0 && getDefaultBrowser() == DefaultBrowser.FIRST) {
setCustomPathToFirstListed();
}
}
});
browsersTable = browsersEditor.createComponent();
}