207822 ItemFilterDialog patch
diff --git a/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIResources.java b/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIResources.java
index d1d95d0..bc27915 100644
--- a/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIResources.java
+++ b/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/AuthoringUIResources.java
@@ -51,6 +51,8 @@
 
 	public static String guidancePage_title;
 
+	public static String ItemsFilterDialog_UpdateTreeJob_name;
+
 	public static String NewDiagramFile_title;
 
 	public static String previewPage_title;
diff --git a/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/Resources.properties b/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/Resources.properties
index 6ab7029..f192d02 100644
--- a/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/Resources.properties
+++ b/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/Resources.properties
@@ -920,7 +920,7 @@
 #Activity Diagram
 ActivityDiagramEditor_createStartNode_text=Create a Start Node
 ConfigurationPage_ConfigContentDescription=Select the method plug-ins, content packages and processes that will be included in this configuration.
-ContentElementsOrderDialog_description_text=Custom Category's content elements order dialog
+ContentElementsOrderDialog_description_text=Order dialog
 AuthoringUIPlugin_AbstractNewLibraryPage_DirectoryLabel=Directory:
 RootPrefPage_enableprocesscontribution_text=Enable Process Contribution
 ConfigurationDescriptionDescription_text=Provide general information about this method configuration.
@@ -1239,3 +1239,4 @@
 defaultLinkTypePrefLabel=Choose the default element link type when dragging from the Library view.
 promptCreateNewDiagramFile_msg=No diagram file exists for this process. Do you want to create a new one?
 NewDiagramFile_title=New Diagram File
+ItemsFilterDialog_UpdateTreeJob_name=Update filter tree
diff --git a/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ItemsFilterDialog.java b/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ItemsFilterDialog.java
index 2223e6f..481565e 100644
--- a/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ItemsFilterDialog.java
+++ b/org.eclipse.epf.authoring.ui/src/org/eclipse/epf/authoring/ui/dialogs/ItemsFilterDialog.java
@@ -14,6 +14,10 @@
 import java.util.List;
 import java.util.regex.Pattern;
 
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.emf.common.notify.AdapterFactory;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
@@ -78,6 +82,7 @@
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.PlatformUI;
 
 /**
  * Filter Dialog - allow the user to filter the content element, content
@@ -274,11 +279,22 @@
 	 * Notifies that the cancel button of this dialog has been pressed.
 	 */
 	protected void cancelPressed() {
+	    if (treeJob != null) {
+	    	treeJob.cancel();
+	    }
 		super.cancelPressed();
 		if(composedAdapterFactory != null){
 			composedAdapterFactory.dispose();
 		}
 	}
+	
+	@Override
+	protected void okPressed() {
+	    if (treeJob != null) {
+	    	treeJob.cancel();
+	    }
+		super.okPressed();
+	}
 
 	/**
 	 * Set title for dialog box eg: Select Dialog For Role, dialogTitle needs to
@@ -809,43 +825,72 @@
 		}
 	}
 
-	public long timer = 3;
-	public long lasttimer = System.currentTimeMillis();
+	public long delay = 800;
+	
+	private class UpdateTreeJob extends Job {
+
+		public UpdateTreeJob(String name) {
+			super(name);
+		}
+
+		@Override
+		protected IStatus run(IProgressMonitor monitor) {
+
+			// need to run this in UI thread
+			PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
+
+				public void run() {
+					if (treeViewer == null || 
+							treeViewer.getControl() == null ||
+							treeViewer.getControl().isDisposed()) {
+						return;
+					}
+					treeViewer.getTree().clearAll(true);
+					if (ctrl_pattern.getText() != null
+							&& ctrl_pattern.getText().trim().length() > 0) {
+						pattern = ctrl_pattern.getText().trim();
+						// if(pattern.indexOf(FilterConstants.ANY_STRING)> -1
+						// || pattern.indexOf(FilterConstants.ANY_CHARACTER) >
+						// -1){
+						//              
+						// }else{
+						// pattern = pattern+FilterConstants.ANY_STRING;
+						// }
+					} else {
+						pattern = FilterConstants.ANY_STRING;
+						// return;
+					}
+					regexPattern = getRegEx(pattern);
+					if (helper != null) {
+						helper.setPattern(pattern);
+						helper.setRegexPattern(regexPattern);
+						helper.setFilterTypeStr(filterTypeStr);
+						helper.setTabStr(filterTypeStr);
+					}
+					refreshTreeViewer();
+				}
+
+			});
+			return Status.OK_STATUS;
+		}
+
+	}
+	
+	private UpdateTreeJob treeJob = new UpdateTreeJob(AuthoringUIResources.ItemsFilterDialog_UpdateTreeJob_name);
 	
 	public void addListener() {
 		ctrl_pattern.addModifyListener(new ModifyListener() {
 			public void modifyText(ModifyEvent e) {
 				
-				// Set timer
-				long currenttimer = System.currentTimeMillis();
-				if(lasttimer+timer > currenttimer){
-					return;
-				}else{
-					lasttimer  = currenttimer;
-				}
-				
-				treeViewer.getTree().clearAll(true);
-				if (ctrl_pattern.getText() != null
-						&& ctrl_pattern.getText().trim().length() > 0) {
-					pattern = ctrl_pattern.getText().trim();
-//					if(pattern.indexOf(FilterConstants.ANY_STRING)> -1 
-//							|| pattern.indexOf(FilterConstants.ANY_CHARACTER) > -1){
-//						
-//					}else{
-//						pattern = pattern+FilterConstants.ANY_STRING;
-//					}
-				} else {
-					pattern = FilterConstants.ANY_STRING;
-					//return;
-				}
-				regexPattern = getRegEx(pattern);
-				if (helper != null) {
-					helper.setPattern(pattern);
-					helper.setRegexPattern(regexPattern);
-					helper.setFilterTypeStr(filterTypeStr);
-					helper.setTabStr(filterTypeStr);
-				}
-				refreshTreeViewer();
+			  if (treeJob.getState() == Job.NONE) {
+			    // We should schedule the job to run
+			    treeJob.schedule(delay);
+			  } else if (treeJob.getState() == Job.WAITING ||
+					  treeJob.getState() == Job.SLEEPING){
+			    // Cancel the previous job, and reschedule
+			    treeJob.cancel();
+			    treeJob.schedule(delay);
+			  }
 			}
 		});
 
@@ -1007,15 +1052,19 @@
 	 * 
 	 */
 	public void refreshTreeViewer(){
-		// To improve performance of filter, filter first and reset visible to
-		// true.This will avoid the flickering in UI at time of filtering
-		// elements in the tree structure
-		
-		treeViewer.getTree().clearAll(true);
-		treeViewer.getTree().setVisible(false);
-		treeViewer.refresh();
-		treeViewer.expandAll();
-		treeViewer.getTree().setVisible(true);
+		try {
+			// To improve performance of filter, filter first and reset visible to
+			// true.This will avoid the flickering in UI at time of filtering
+			// elements in the tree structure
+			
+			treeViewer.getTree().clearAll(true);
+			treeViewer.getTree().setVisible(false);
+			treeViewer.refresh();
+			treeViewer.expandAll();
+			treeViewer.getTree().setVisible(true);
+		} catch (Exception e) {
+			AuthoringUIPlugin.getDefault().getLogger().logError(e);
+		}
 	}
 	/*
 	 *