[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);