### Eclipse Workspace Patch 1.0 #P org.eclipse.gmf.runtime.common.ui.services Index: src/org/eclipse/gmf/runtime/common/ui/services/elementselection/ElementSelectionComposite.java =================================================================== RCS file: /cvsroot/technology/org.eclipse.gmf/plugins/org.eclipse.gmf.runtime.common.ui.services/src/org/eclipse/gmf/runtime/common/ui/services/elementselection/ElementSelectionComposite.java,v retrieving revision 1.6.2.6 diff -u -r1.6.2.6 ElementSelectionComposite.java --- src/org/eclipse/gmf/runtime/common/ui/services/elementselection/ElementSelectionComposite.java 29 Aug 2006 14:21:26 -0000 1.6.2.6 +++ src/org/eclipse/gmf/runtime/common/ui/services/elementselection/ElementSelectionComposite.java 22 Sep 2006 18:59:48 -0000 @@ -17,7 +17,6 @@ import java.util.regex.Pattern; import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.jobs.Job; import org.eclipse.gmf.runtime.common.core.util.StringStatics; import org.eclipse.gmf.runtime.common.ui.services.internal.l10n.CommonUIServicesMessages; import org.eclipse.jface.dialogs.Dialog; @@ -92,7 +91,7 @@ /** * The job running the element selection service. */ - private Job job; + private ElementSelectionServiceJob job; /** * The element selection service to use to search for elements. @@ -289,45 +288,41 @@ if (filterText.getText().equals(StringStatics.BLANK)) { /* no filter, no results */ cancel(); - tableViewer.getTable().removeAll(); matchingObjects.clear(); + tableViewer.getTable().removeAll(); firstCharacter = Character.MIN_VALUE; return; } - if (this.input.getScope().intValue() != this.lastScopeSearchedFor) { - //scope changes, start from scratch... - - tableViewer.getTable().removeAll(); - matchingObjects.clear(); - } - - /* - * clear the existing matches in the table and refilter results we have - * received - */ String filter = validatePattern(filterText.getText()); pattern = Pattern.compile(filter); - tableViewer.getTable().removeAll(); - for (Iterator i = matchingObjects.iterator(); i.hasNext();) { - IMatchingObject matchingObject = (IMatchingObject) i.next(); - Matcher matcher = pattern.matcher(matchingObject.getName() - .toLowerCase()); - if (matcher.matches()) { - tableViewer.add(matchingObject); - setSelection(); - } - } - - if ((firstCharacter == Character.MIN_VALUE) || - (firstCharacter != filterText.getText().charAt(0)) || - (filterText.getText().indexOf(lastSearchedFor) == -1) || - this.input.getScope().intValue() != this.lastScopeSearchedFor) { + if (firstCharacter != filterText.getText().charAt(0) || + this.input.getScope().intValue() != this.lastScopeSearchedFor || + !filterText.getText().startsWith(lastSearchedFor)) { + //scope changes, start from scratch... + cancel(); + matchingObjects.clear(); + tableViewer.getTable().removeAll(); firstCharacter = filterText.getText().charAt(0); this.lastScopeSearchedFor = this.input.getScope().intValue(); startElementSelectionService(); + } else { + /* + * clear the existing matches in the table and refilter results we have + * received + */ + tableViewer.getTable().removeAll(); + for (Iterator i = matchingObjects.iterator(); i.hasNext();) { + IMatchingObject matchingObject = (IMatchingObject) i.next(); + Matcher matcher = pattern.matcher(matchingObject.getName() + .toLowerCase()); + if (matcher.matches()) { + tableViewer.add(matchingObject); + setSelection(); + } + } } } @@ -414,10 +409,10 @@ .getMatchingObject(); progressBar.worked(1); progressBar.subTask(matchingObject.getName()); + matchingObjects.add(matchingObject); Matcher matcher = pattern.matcher(matchingObject.getName() .toLowerCase()); if (matcher.matches()) { - matchingObjects.add(matchingObject); tableViewer.add(matchingObject); setSelection(); } @@ -430,8 +425,10 @@ */ public void cancel() { if (job != null) { - job.cancel(); + elementSelectionService.cancelJob(job); job = null; + progressBar.done(); + progressBar.setVisible(false); } } @@ -477,4 +474,12 @@ handleSelectionChange(); } } + + + /** + * @return the job + */ + public ElementSelectionServiceJob getSelectionServiceJob() { + return job; + } } Index: src/org/eclipse/gmf/runtime/common/ui/services/elementselection/ElementSelectionService.java =================================================================== RCS file: /cvsroot/technology/org.eclipse.gmf/plugins/org.eclipse.gmf.runtime.common.ui.services/src/org/eclipse/gmf/runtime/common/ui/services/elementselection/ElementSelectionService.java,v retrieving revision 1.4.2.1 diff -u -r1.4.2.1 ElementSelectionService.java --- src/org/eclipse/gmf/runtime/common/ui/services/elementselection/ElementSelectionService.java 12 Jul 2006 19:35:16 -0000 1.4.2.1 +++ src/org/eclipse/gmf/runtime/common/ui/services/elementselection/ElementSelectionService.java 22 Sep 2006 18:59:49 -0000 @@ -18,10 +18,13 @@ import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.Platform; +import org.eclipse.core.runtime.jobs.IJobManager; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.gmf.runtime.common.core.service.ExecutionStrategy; import org.eclipse.gmf.runtime.common.core.service.IOperation; import org.eclipse.gmf.runtime.common.core.service.Service; +import org.eclipse.gmf.runtime.common.core.util.StringStatics; import org.eclipse.gmf.runtime.common.ui.services.internal.CommonUIServicesPlugin; import org.eclipse.gmf.runtime.common.ui.services.internal.elementselection.ElementSelectionList; import org.eclipse.gmf.runtime.common.ui.services.internal.elementselection.MatchingObjectsOperation; @@ -59,11 +62,31 @@ } } - private IElementSelectionInput elementSelectionInput; + protected class JobData { + public IElementSelectionInput elementSelectionInput; - private IElementSelectionListener elementSelectionListener; + public IElementSelectionListener elementSelectionListener; - private HashMap jobs = new HashMap(); + public HashMap jobs = new HashMap(); + } + + private Map jobs2Data = new HashMap(); + + public JobData getJobData() { + Job currentJob = jobManager.currentJob(); + assert currentJob != null; + + if(currentJob == null) { + return null; + } + + JobData data = null; + synchronized(jobs2Data) { + data = (JobData)jobs2Data.get(currentJob); + } + + return data; + } /** * The singleton instance of the type selection service. @@ -107,13 +130,23 @@ */ public ElementSelectionServiceJob getMatchingObjects( IElementSelectionInput input, IElementSelectionListener listener) { - elementSelectionInput = input; - elementSelectionListener = listener; ElementSelectionServiceJob job = createSelectionJob(); + JobData data = new JobData(); + data.elementSelectionInput = input; + data.elementSelectionListener = listener; + job.setName(getJobName(data)); + synchronized(jobs2Data) { + jobs2Data.put(job, data); + } job.schedule(); return job; } + + protected String getJobName() { + return StringStatics.BLANK; + } + /** * Creates the selection service job that manages the individual provider * search jobs. This method should configure the new job with the appropriate @@ -126,14 +159,20 @@ job.setPriority(Job.SHORT); return job; } + + public static final IJobManager jobManager = Platform.getJobManager(); /** * {@inheritDoc} */ public void run(IProgressMonitor monitor) { + JobData data = getJobData(); + if(data == null) + return; + List results = new ArrayList(); IOperation operation = new MatchingObjectsOperation( - elementSelectionInput); + data.elementSelectionInput); /** * Get the list of element selection providers based on the input. @@ -151,15 +190,15 @@ IElementSelectionProvider provider = (IElementSelectionProvider) i .next(); - addJob(provider); + addJob(data, provider); } /** * Start the provider jobs. */ HashMap jobsClone; - synchronized (jobs) { - jobsClone = (HashMap)jobs.clone(); + synchronized (data) { + jobsClone = (HashMap)data.jobs.clone(); } for (Iterator i = jobsClone.entrySet().iterator(); i.hasNext();) { Map.Entry entry = (Map.Entry) i.next(); @@ -174,10 +213,10 @@ /** * Now loop, waiting for the provider jobs to complete. */ - monitor.beginTask(getJobName(), 1000); + monitor.beginTask(getJobName(data), 1000); while (true) { - synchronized (jobs) { - if (jobs.size() == 0) { + synchronized (data) { + if (data.jobs.size() == 0) { break; } } @@ -186,8 +225,12 @@ * if the progress monitor is canceled, then cancel the running jobs. */ if (monitor.isCanceled()) { - cancelAllJobs(); - break; + synchronized(data) { + // nullify the element selection listener. + data.elementSelectionListener = null; + cancelAllJobs(); + break; + } } } monitor.done(); @@ -219,13 +262,16 @@ * * @return the name for the job. */ - protected String getJobName() { - String providerName = getClass().getName().substring( - getClass().getName().lastIndexOf('.') + 1); - String filter = elementSelectionInput.getInput(); - return NLS.bind( - CommonUIServicesMessages.ElementSelectionService_JobName, - new String[] {providerName, filter}); + protected String getJobName(JobData data) { + if((getJobName() != null && getJobName().equals(StringStatics.BLANK)) && data != null) { + String providerName = getClass().getName().substring( + getClass().getName().lastIndexOf('.') + 1); + String filter = data.elementSelectionInput.getInput(); + return NLS.bind( + CommonUIServicesMessages.ElementSelectionService_JobName, + new String[] {providerName, filter}); + } + return getJobName(); } /** @@ -233,11 +279,15 @@ * * @param provider an element selection provider. */ - private void addJob(IElementSelectionProvider provider) { + private void addJob(JobData data, IElementSelectionProvider provider) { ElementSelectionServiceJob job = provider.getMatchingObjects( - elementSelectionInput, this); - synchronized (jobs) { - jobs.put(provider, job); + data.elementSelectionInput, this); + synchronized (data) { + data.jobs.put(provider, job); + } + + synchronized(jobs2Data) { + jobs2Data.put(job, data); } } @@ -246,20 +296,26 @@ * * @param provider an element selection provider. */ - private void removeJob(IElementSelectionProvider provider) { + private void removeJob(JobData data, IElementSelectionProvider provider) { boolean end_of_matches = false; - synchronized (jobs) { - jobs.remove(provider); - if (jobs.size() == 0) { + Object job = null; + synchronized (data) { + job = data.jobs.remove(provider); + if (data.jobs.size() == 0) { end_of_matches = true; } } + /** * All the jobs have finished, send end of matches event. */ if (end_of_matches) { fireEndOfMatchesEvent(); } + + synchronized(jobs2Data) { + jobs2Data.remove(job); + } } /** @@ -270,11 +326,28 @@ */ protected void fireMatchingObjectEvent( final IMatchingObjectEvent matchingObjectEvent) { + final Job currentJob = jobManager.currentJob(); + if(currentJob == null) + return; + + JobData data = null; + synchronized(jobs2Data) { + data = (JobData)jobs2Data.get(currentJob); + } + + if(data == null) + return; + + final JobData finalData = data; PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { public void run() { - elementSelectionListener - .matchingObjectEvent(matchingObjectEvent); + synchronized(finalData) { + if(finalData.elementSelectionListener != null) { + finalData.elementSelectionListener + .matchingObjectEvent(matchingObjectEvent); + } + } } }); } @@ -294,20 +367,24 @@ * {@inheritDoc} */ public void matchingObjectEvent(IMatchingObjectEvent matchingObjectEvent) { + JobData data = getJobData(); + if(data == null) + return; if (matchingObjectEvent.getEventType() == MatchingObjectEventType.END_OF_MATCHES) { - removeJob(matchingObjectEvent.getMatchingObject().getProvider()); + removeJob(data, matchingObjectEvent.getMatchingObject().getProvider()); } else { fireMatchingObjectEvent(matchingObjectEvent); } } - + /** * Cancel the jobs running for the element selection service. */ protected void cancelAllJobs() { + JobData data = getJobData(); HashMap jobsClone; - synchronized (jobs) { - jobsClone = (HashMap) jobs.clone(); + synchronized (data) { + jobsClone = (HashMap) data.jobs.clone(); } for (Iterator i = jobsClone.entrySet().iterator(); i.hasNext();) { Map.Entry entry = (Map.Entry) i.next(); @@ -315,7 +392,7 @@ ElementSelectionServiceJob job = (ElementSelectionServiceJob) entry .getValue(); job.cancel(); - removeJob(provider); + removeJob(data, provider); } } @@ -333,4 +410,16 @@ CommonUIServicesPlugin.getPluginId(), "elementSelectionProviders"); //$NON-NLS-1$ } + + public void cancelJob(ElementSelectionServiceJob job) { + JobData data = null; + synchronized(jobs2Data) { + data = (JobData)jobs2Data.get(job); + } + + synchronized(data) { + data.elementSelectionListener = null; + } + job.cancel(); + } } Index: src/org/eclipse/gmf/runtime/common/ui/services/elementselection/AbstractElementSelectionProvider.java =================================================================== RCS file: /cvsroot/technology/org.eclipse.gmf/plugins/org.eclipse.gmf.runtime.common.ui.services/src/org/eclipse/gmf/runtime/common/ui/services/elementselection/AbstractElementSelectionProvider.java,v retrieving revision 1.3.2.1 diff -u -r1.3.2.1 AbstractElementSelectionProvider.java --- src/org/eclipse/gmf/runtime/common/ui/services/elementselection/AbstractElementSelectionProvider.java 12 Jul 2006 19:35:16 -0000 1.3.2.1 +++ src/org/eclipse/gmf/runtime/common/ui/services/elementselection/AbstractElementSelectionProvider.java 22 Sep 2006 18:59:48 -0000 @@ -50,8 +50,8 @@ public ElementSelectionServiceJob getMatchingObjects( IElementSelectionInput input, IElementSelectionListener listener) { elementSelectionInput = input; - elementSelectionListener = listener; ElementSelectionServiceJob job = createSelectionJob(); + elementSelectionListener = listener; return job; }