[168283] gmf_R1_maintenance aboyko 070109 Issues with Sort and Filter Dialog (Issue 1 only)
diff --git a/org.eclipse.gmf.runtime.diagram.ui/src/org/eclipse/gmf/runtime/diagram/ui/dialogs/sortfilter/SortFilterPage.java b/org.eclipse.gmf.runtime.diagram.ui/src/org/eclipse/gmf/runtime/diagram/ui/dialogs/sortfilter/SortFilterPage.java
index cd223f8..65a39ef 100644
--- a/org.eclipse.gmf.runtime.diagram.ui/src/org/eclipse/gmf/runtime/diagram/ui/dialogs/sortfilter/SortFilterPage.java
+++ b/org.eclipse.gmf.runtime.diagram.ui/src/org/eclipse/gmf/runtime/diagram/ui/dialogs/sortfilter/SortFilterPage.java
@@ -20,8 +20,8 @@
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.commands.Command;
-import org.eclipse.gmf.runtime.diagram.ui.commands.CommandProxy;
-import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
+import org.eclipse.gef.commands.CompoundCommand;
+import org.eclipse.gef.commands.UnexecutableCommand;
import org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.editparts.ListCompartmentEditPart;
import org.eclipse.gmf.runtime.diagram.ui.internal.dialogs.sortfilter.SortFilterContentProvider;
@@ -30,7 +30,6 @@
import org.eclipse.gmf.runtime.diagram.ui.internal.l10n.DiagramUIPluginImages;
import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramUIMessages;
import org.eclipse.gmf.runtime.diagram.ui.requests.ChangeSortFilterRequest;
-import org.eclipse.gmf.runtime.emf.commands.core.command.CompositeTransactionalCommand;
import org.eclipse.gmf.runtime.notation.Filtering;
import org.eclipse.gmf.runtime.notation.FilteringStyle;
import org.eclipse.gmf.runtime.notation.NotationPackage;
@@ -942,73 +941,20 @@
}
/**
- * Applies changes to all pages in the dialog
- */
- public boolean performOk() {
- if (sortChanged || filterChanged)
- performApply();
- return true;
- }
-
- /**
* Writes the sorting/filtering specified by the dialog
*/
protected void performApply() {
- if (pageType == CHILD_PAGE) {
- Command filteringCommand = getApplyCommand();
- if (filteringCommand != null && filteringCommand.canExecute()) {
- editPart
- .getRoot()
- .getViewer()
- .getEditDomain()
- .getCommandStack()
- .execute(
- filteringCommand);
- }
- } else if (pageType == ROOT_PAGE) {
-
- PreferenceManager preferenceManager =
- ((SortFilterDialog) getContainer()).getPreferenceManager();
- Iterator nodes =
- preferenceManager
- .getElements(PreferenceManager.PRE_ORDER)
- .iterator();
- SortFilterRootPreferenceNode rootNode = null;
- CompositeTransactionalCommand cc = new CompositeTransactionalCommand(
- editPart.getEditingDomain(),
- DiagramUIMessages.Command_SortFilterCommand);
- while (nodes.hasNext()) {
- PreferenceNode node = (PreferenceNode) nodes.next();
- SortFilterPage page = (SortFilterPage) node.getPage();
- if (page == this) {
- rootNode = (SortFilterRootPreferenceNode) node;
- continue;
- }
-
- // We must build the page if it is already not done because each
- // page
- // in the dialog knows how to filter itself.
- ((SortFilterDialog) rootNode.getPreferenceDialog()).showPage(
- node);
-
- // We set the child's filter criteria to the root's
- // criteria if the child is using the same filtering criteria.
- if (compareFilters(page.getFilterList())) {
- page.setFilterCriteria(filters.getItems());
- page.setCriteria(filterList.getItems());
- page.filterItemsFromList();
- }
-
-
- //page.performApply();
-
- cc.compose(new CommandProxy(page.getApplyCommand()));
- }
-
- editPart.getRoot().getViewer().getEditDomain().getCommandStack()
- .execute(new ICommandProxy(cc));
- }
+ Command filteringCommand = getApplyCommand();
+ if (filteringCommand != null && filteringCommand.canExecute()) {
+ editPart
+ .getRoot()
+ .getViewer()
+ .getEditDomain()
+ .getCommandStack()
+ .execute(
+ filteringCommand);
+ }
}
/**
@@ -1017,47 +963,84 @@
* @return the command
*/
public Command getApplyCommand() {
- List newSortedObjects = Collections.EMPTY_LIST;
- if (_sorting.equals(Sorting.MANUAL_LITERAL)) {
- newSortedObjects = new ArrayList();
- List model = (ArrayList) tableViewer.getInput();
- for (int j = 0; j < model.size(); j++) {
- SortFilterElement element = (SortFilterElement) model.get(j);
- newSortedObjects.add(element.getData());
- }
- }
-
- List newFilteredObjects = Collections.EMPTY_LIST;
- if (_filtering.equals(Filtering.MANUAL_LITERAL)) {
- newFilteredObjects = new ArrayList();
- List model = (ArrayList) tableViewer.getInput();
- for (int i = 0; i < model.size(); i++) {
- SortFilterElement element = (SortFilterElement) model.get(i);
- if (!element.isVisible()) {
- newFilteredObjects.add(element.getData());
- }
+ if (pageType == CHILD_PAGE) {
+ List newSortedObjects = Collections.EMPTY_LIST;
+ if (_sorting.equals(Sorting.MANUAL_LITERAL)) {
+ newSortedObjects = new ArrayList();
+ List model = (ArrayList) tableViewer.getInput();
+ for (int j = 0; j < model.size(); j++) {
+ SortFilterElement element = (SortFilterElement) model.get(j);
+ newSortedObjects.add(element.getData());
+ }
}
- if (_filtering.equals(Filtering.MANUAL_LITERAL) && newFilteredObjects.size() == 0) {
- _filtering = Filtering.NONE_LITERAL;
+
+ List newFilteredObjects = Collections.EMPTY_LIST;
+ if (_filtering.equals(Filtering.MANUAL_LITERAL)) {
+ newFilteredObjects = new ArrayList();
+ List model = (ArrayList) tableViewer.getInput();
+ for (int i = 0; i < model.size(); i++) {
+ SortFilterElement element = (SortFilterElement) model.get(i);
+ if (!element.isVisible()) {
+ newFilteredObjects.add(element.getData());
+ }
+ }
+ if (_filtering.equals(Filtering.MANUAL_LITERAL) && newFilteredObjects.size() == 0) {
+ _filtering = Filtering.NONE_LITERAL;
+ }
+ }
+
+ // Add the objects filtered otherwise.
+ if (!_shownAsAlternateViewItems.isEmpty()
+ && Collections.EMPTY_LIST.equals(newFilteredObjects)) {
+ newFilteredObjects = new ArrayList();
}
- }
-
- // Add the objects filtered otherwise.
- if (!_shownAsAlternateViewItems.isEmpty()
- && Collections.EMPTY_LIST.equals(newFilteredObjects)) {
- newFilteredObjects = new ArrayList();
+ newFilteredObjects.addAll(_shownAsAlternateViewItems);
+
+ ChangeSortFilterRequest request = new ChangeSortFilterRequest(
+ _filtering, newFilteredObjects, _filteringKeys, _sorting,
+ newSortedObjects, _sortingKeys);
+
+ sortChanged = false;
+ filterChanged = false;
+ getApplyButton().setEnabled(sortChanged || filterChanged);
+
+ return editPart.getCommand(request);
+ } else if (pageType == ROOT_PAGE) {
+ PreferenceManager preferenceManager =
+ ((SortFilterDialog) getContainer()).getPreferenceManager();
+ Iterator nodes =
+ preferenceManager
+ .getElements(PreferenceManager.PRE_ORDER)
+ .iterator();
+ SortFilterRootPreferenceNode rootNode = null;
+ CompoundCommand cc = new CompoundCommand(
+ DiagramUIMessages.Command_SortFilterCommand);
+ while (nodes.hasNext()) {
+ PreferenceNode node = (PreferenceNode) nodes.next();
+ SortFilterPage page = (SortFilterPage) node.getPage();
+ if (page == this) {
+ rootNode = (SortFilterRootPreferenceNode) node;
+ continue;
+ }
+
+ // We must build the page if it is already not done because each
+ // page
+ // in the dialog knows how to filter itself.
+ ((SortFilterDialog) rootNode.getPreferenceDialog()).showPage(
+ node);
+
+ // We set the child's filter criteria to the root's
+ // criteria if the child is using the same filtering criteria.
+ if (compareFilters(page.getFilterList())) {
+ page.setFilterCriteria(filters.getItems());
+ page.setCriteria(filterList.getItems());
+ page.filterItemsFromList();
+ }
+ cc.add(page.getApplyCommand());
+ }
+ return cc;
}
- newFilteredObjects.addAll(_shownAsAlternateViewItems);
-
- ChangeSortFilterRequest request = new ChangeSortFilterRequest(
- _filtering, newFilteredObjects, _filteringKeys, _sorting,
- newSortedObjects, _sortingKeys);
-
- sortChanged = false;
- filterChanged = false;
- getApplyButton().setEnabled(sortChanged || filterChanged);
-
- return editPart.getCommand(request);
+ return UnexecutableCommand.INSTANCE;
}
/**
@@ -1407,4 +1390,16 @@
return true;
}
+ /**
+ * Creates the command that needs to be executed for this page when "Ok" is
+ * pressed. It's different from {@link #getApplyCommand()}, because it checks
+ * whether the page is dirty or not.
+ * @return <code>Command</code> to be executed per this page
+ */
+ public Command getCommand() {
+ if (filterChanged || sortChanged)
+ return getApplyCommand();
+ return null;
+ }
+
}
diff --git a/org.eclipse.gmf.runtime.diagram.ui/src/org/eclipse/gmf/runtime/diagram/ui/internal/dialogs/sortfilter/SortFilterDialog.java b/org.eclipse.gmf.runtime.diagram.ui/src/org/eclipse/gmf/runtime/diagram/ui/internal/dialogs/sortfilter/SortFilterDialog.java
index bf7cb85..4e92418 100644
--- a/org.eclipse.gmf.runtime.diagram.ui/src/org/eclipse/gmf/runtime/diagram/ui/internal/dialogs/sortfilter/SortFilterDialog.java
+++ b/org.eclipse.gmf.runtime.diagram.ui/src/org/eclipse/gmf/runtime/diagram/ui/internal/dialogs/sortfilter/SortFilterDialog.java
@@ -11,9 +11,24 @@
package org.eclipse.gmf.runtime.diagram.ui.internal.dialogs.sortfilter;
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.commands.CommandStack;
+import org.eclipse.gef.commands.CompoundCommand;
+import org.eclipse.gmf.runtime.diagram.ui.dialogs.sortfilter.SortFilterPage;
import org.eclipse.gmf.runtime.diagram.ui.l10n.DiagramUIMessages;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceNode;
+import org.eclipse.jface.preference.IPreferencePage;
import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.jface.preference.PreferenceManager;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.util.Policy;
+import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
@@ -29,13 +44,15 @@
/** dialog title prefix */
private final String title = DiagramUIMessages.SortFilterDialog_title;
+ private CommandStack commandStack = null;
/**
* CollectionEditorDialog constructor
* @param parentShell the parent shell
*/
- public SortFilterDialog(Shell parentShell) {
+ public SortFilterDialog(Shell parentShell, CommandStack commandStack) {
super(parentShell, new SortFilterPageManager());
+ this.commandStack = commandStack;
}
/**
@@ -66,5 +83,82 @@
return null;
}
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.PreferenceDialog#okPressed()
+ */
+ protected void okPressed() {
+ SafeRunnable.run(new SafeRunnable() {
+ private boolean errorOccurred;
+
+
+ /* (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.ISafeRunnable#run()
+ */
+
+ public void run() {
+ getButton(IDialogConstants.OK_ID).setEnabled(false);
+ errorOccurred = false;
+ boolean hasFailedOK = false;
+ try {
+ // Notify all the pages and give them a chance to abort
+ Iterator nodes = getPreferenceManager().getElements(PreferenceManager.PRE_ORDER)
+ .iterator();
+ CompoundCommand cc = new CompoundCommand();
+ while (nodes.hasNext()) {
+ IPreferenceNode node = (IPreferenceNode) nodes.next();
+ IPreferencePage page = node.getPage();
+ if (page != null) {
+ if (page instanceof SortFilterPage) {
+ Command cmd = ((SortFilterPage)page).getCommand();
+ if (cmd != null && cmd.canExecute())
+ cc.add(cmd);
+ }
+ else if (!page.performOk()){
+ hasFailedOK = true;
+ return;
+ }
+ }
+ }
+ if (cc.canExecute())
+ commandStack.execute(cc);
+ } catch (Exception e) {
+ handleException(e);
+ } finally {
+ //Don't bother closing if the OK failed
+ if(hasFailedOK){
+ setReturnCode(FAILED);
+ getButton(IDialogConstants.OK_ID).setEnabled(true);
+ return;
+ }
+
+ if (!errorOccurred) {
+ //Give subclasses the choice to save the state of the
+ //preference pages.
+ handleSave();
+ }
+ setReturnCode(OK);
+ close();
+ }
+ }
+
+
+ /* (non-Javadoc)
+ *
+ * @see org.eclipse.core.runtime.ISafeRunnable#handleException(java.lang.Throwable)
+ */
+
+ public void handleException(Throwable e) {
+ errorOccurred = true;
+
+ Policy.getLog().log(new Status(IStatus.ERROR, Policy.JFACE, 0, e.toString(), e));
+
+ setSelectedNodePreference(null);
+ String message = JFaceResources.getString("SafeRunnable.errorMessage"); //$NON-NLS-1$
+ MessageDialog.openError(getShell(), JFaceResources.getString("Error"), message); //$NON-NLS-1$
+
+ }
+ });
+ }
}
diff --git a/org.eclipse.gmf.runtime.diagram.ui/src/org/eclipse/gmf/runtime/diagram/ui/internal/dialogs/sortfilter/SortFilterDialogUtil.java b/org.eclipse.gmf.runtime.diagram.ui/src/org/eclipse/gmf/runtime/diagram/ui/internal/dialogs/sortfilter/SortFilterDialogUtil.java
index 223062b..c262b94 100644
--- a/org.eclipse.gmf.runtime.diagram.ui/src/org/eclipse/gmf/runtime/diagram/ui/internal/dialogs/sortfilter/SortFilterDialogUtil.java
+++ b/org.eclipse.gmf.runtime.diagram.ui/src/org/eclipse/gmf/runtime/diagram/ui/internal/dialogs/sortfilter/SortFilterDialogUtil.java
@@ -52,7 +52,7 @@
SortFilterDialog sortFilterDialog =
new SortFilterDialog(
- Display.getCurrent().getActiveShell());
+ Display.getCurrent().getActiveShell(), editPart.getViewer().getEditDomain().getCommandStack());
rootPage.setTitle(ROOT_NAME);