Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 99174 Details for
Bug 226052
[ui] - first filter text keystroke in available IU list can hang UI if no repos have been loaded
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read
this important communication.
[patch]
updated patch to create a new scheduling rule on input change
bug226052.patch (text/plain), 16.02 KB, created by
Susan McCourt
on 2008-05-07 16:28:33 EDT
(
hide
)
Description:
updated patch to create a new scheduling rule on input change
Filename:
MIME Type:
Creator:
Susan McCourt
Created:
2008-05-07 16:28:33 EDT
Size:
16.02 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.equinox.p2.ui >Index: src/org/eclipse/equinox/internal/provisional/p2/ui/query/QueryableMetadataRepositoryManager.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/query/QueryableMetadataRepositoryManager.java,v >retrieving revision 1.7 >diff -u -r1.7 QueryableMetadataRepositoryManager.java >--- src/org/eclipse/equinox/internal/provisional/p2/ui/query/QueryableMetadataRepositoryManager.java 23 Apr 2008 00:16:46 -0000 1.7 >+++ src/org/eclipse/equinox/internal/provisional/p2/ui/query/QueryableMetadataRepositoryManager.java 7 May 2008 20:25:53 -0000 >@@ -11,8 +11,7 @@ > package org.eclipse.equinox.internal.provisional.p2.ui.query; > > import java.net.URL; >-import java.util.ArrayList; >-import java.util.Arrays; >+import java.util.*; > import org.eclipse.core.runtime.*; > import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper; > import org.eclipse.equinox.internal.p2.ui.ProvUIActivator; >@@ -61,22 +60,13 @@ > * @return The collector argument > */ > public Collector query(Query query, Collector result, IProgressMonitor monitor) { >- ArrayList repoURLs = new ArrayList(); > IMetadataRepositoryManager manager = (IMetadataRepositoryManager) ServiceHelper.getService(ProvUIActivator.getContext(), IMetadataRepositoryManager.class.getName()); > if (manager == null) { > ProvUI.reportStatus(new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, ProvUIMessages.ProvisioningUtil_NoRepositoryManager), StatusManager.SHOW | StatusManager.LOG); > return result; > } >+ List repoURLs = getRepoLocations(manager); > >- if (repositories.getMetadataRepositories() != null) { >- repoURLs.addAll(Arrays.asList(repositories.getMetadataRepositories())); >- } else { >- repoURLs.addAll(Arrays.asList(manager.getKnownRepositories(repositories.getRepoFlags()))); >- if (repositories.getIncludeDisabledRepositories()) { >- repoURLs.addAll(Arrays.asList(manager.getKnownRepositories(IMetadataRepositoryManager.REPOSITORIES_DISABLED))); >- } >- >- } > SubMonitor sub = SubMonitor.convert(monitor, ProvUIMessages.QueryableMetadataRepositoryManager_RepositoryQueryProgress, repoURLs.size() * 2); > if (sub.isCanceled()) > return result; >@@ -99,4 +89,45 @@ > } > return result; > } >+ >+ /** >+ * Load all of the repositories referenced by this queryable. This is an expensive operation. >+ * @param monitor the progress monitor that should be used >+ */ >+ public void loadAll(IProgressMonitor monitor) { >+ IMetadataRepositoryManager manager = (IMetadataRepositoryManager) ServiceHelper.getService(ProvUIActivator.getContext(), IMetadataRepositoryManager.class.getName()); >+ if (manager == null) { >+ ProvUI.reportStatus(new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, ProvUIMessages.ProvisioningUtil_NoRepositoryManager), StatusManager.SHOW | StatusManager.LOG); >+ return; >+ } >+ List repoURLs = getRepoLocations(manager); >+ SubMonitor sub = SubMonitor.convert(monitor, ProvUIMessages.QueryableMetadataRepositoryManager_RepositoryQueryProgress, repoURLs.size() * 2); >+ if (sub.isCanceled()) >+ return; >+ for (int i = 0; i < repoURLs.size(); i++) { >+ if (sub.isCanceled()) >+ return; >+ try { >+ manager.loadRepository((URL) repoURLs.get(i), sub.newChild(1)); >+ } catch (ProvisionException e) { >+ //ignore unavailable repositories >+ if (e.getStatus().getCode() != ProvisionException.REPOSITORY_NOT_FOUND) >+ ProvUI.handleException(e, NLS.bind(ProvUIMessages.ProvisioningUtil_LoadRepositoryFailure, repoURLs.get(i)), StatusManager.LOG); >+ } >+ } >+ >+ } >+ >+ private List getRepoLocations(IMetadataRepositoryManager manager) { >+ ArrayList locations = new ArrayList(); >+ if (repositories.getMetadataRepositories() != null) { >+ locations.addAll(Arrays.asList(repositories.getMetadataRepositories())); >+ } else { >+ locations.addAll(Arrays.asList(manager.getKnownRepositories(repositories.getRepoFlags()))); >+ if (repositories.getIncludeDisabledRepositories()) { >+ locations.addAll(Arrays.asList(manager.getKnownRepositories(IMetadataRepositoryManager.REPOSITORIES_DISABLED))); >+ } >+ } >+ return locations; >+ } > } >Index: src/org/eclipse/equinox/internal/p2/ui/messages.properties >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/messages.properties,v >retrieving revision 1.55 >diff -u -r1.55 messages.properties >--- src/org/eclipse/equinox/internal/p2/ui/messages.properties 7 May 2008 19:52:34 -0000 1.55 >+++ src/org/eclipse/equinox/internal/p2/ui/messages.properties 7 May 2008 20:25:53 -0000 >@@ -137,6 +137,7 @@ > AvailableIUGroup_LoadingRepository=Loading {0} > AvailableIUGroup_RefreshOperationLabel=Refresh > AvailableIUGroup_ViewByToolTipText=View by >+DeferredFetchFilteredTree_RetrievingList=Retrieving List > Label_Profiles=All Software Profiles > Label_Repositories=Known Repositories > MetadataRepositoryElement_RepositoryLoadError=Error loading repository {0} >Index: src/org/eclipse/equinox/internal/p2/ui/ProvUIMessages.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ProvUIMessages.java,v >retrieving revision 1.48 >diff -u -r1.48 ProvUIMessages.java >--- src/org/eclipse/equinox/internal/p2/ui/ProvUIMessages.java 7 May 2008 19:52:34 -0000 1.48 >+++ src/org/eclipse/equinox/internal/p2/ui/ProvUIMessages.java 7 May 2008 20:25:53 -0000 >@@ -121,6 +121,7 @@ > public static String AvailableIUGroup_LoadingRepository; > public static String AvailableIUGroup_RefreshOperationLabel; > public static String AvailableIUGroup_ViewByToolTipText; >+ public static String DeferredFetchFilteredTree_RetrievingList; > public static String Label_Profiles; > public static String Label_Repositories; > public static String MetadataRepositoryElement_RepositoryLoadError; >Index: src/org/eclipse/equinox/internal/provisional/p2/ui/ProvisioningOperationRunner.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/provisional/p2/ui/ProvisioningOperationRunner.java,v >retrieving revision 1.11 >diff -u -r1.11 ProvisioningOperationRunner.java >--- src/org/eclipse/equinox/internal/provisional/p2/ui/ProvisioningOperationRunner.java 5 May 2008 22:16:41 -0000 1.11 >+++ src/org/eclipse/equinox/internal/provisional/p2/ui/ProvisioningOperationRunner.java 7 May 2008 20:25:53 -0000 >@@ -140,18 +140,7 @@ > job.setUser(op.isUser()); > job.setProperty(OPERATION_KEY, op); > job.setProperty(IProgressConstants.ICON_PROPERTY, ProvUIImages.getImageDescriptor(ProvUIImages.IMG_PROFILE)); >- scheduledJobs.add(job); >- job.addJobChangeListener(new JobChangeAdapter() { >- public void done(IJobChangeEvent event) { >- scheduledJobs.remove(event.getJob()); >- if (restartRequested) { >- requestRestart(restartRequired); >- } >- } >- }); >- Object[] listeners = jobListeners.getListeners(); >- for (int i = 0; i < listeners.length; i++) >- job.addJobChangeListener((IJobChangeListener) listeners[i]); >+ manageJob(job); > job.schedule(); > return job; > } >@@ -216,4 +205,18 @@ > return (Job[]) scheduledJobs.toArray(new Job[scheduledJobs.size()]); > } > >+ public static void manageJob(Job job) { >+ scheduledJobs.add(job); >+ job.addJobChangeListener(new JobChangeAdapter() { >+ public void done(IJobChangeEvent event) { >+ scheduledJobs.remove(event.getJob()); >+ if (restartRequested) { >+ requestRestart(restartRequired); >+ } >+ } >+ }); >+ Object[] listeners = jobListeners.getListeners(); >+ for (int i = 0; i < listeners.length; i++) >+ job.addJobChangeListener((IJobChangeListener) listeners[i]); >+ } > } >Index: src/org/eclipse/equinox/internal/p2/ui/dialogs/DeferredFetchFilteredTree.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.equinox/p2/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/DeferredFetchFilteredTree.java,v >retrieving revision 1.4 >diff -u -r1.4 DeferredFetchFilteredTree.java >--- src/org/eclipse/equinox/internal/p2/ui/dialogs/DeferredFetchFilteredTree.java 30 Apr 2008 22:46:53 -0000 1.4 >+++ src/org/eclipse/equinox/internal/p2/ui/dialogs/DeferredFetchFilteredTree.java 7 May 2008 20:25:53 -0000 >@@ -1,9 +1,12 @@ > package org.eclipse.equinox.internal.p2.ui.dialogs; > >-import org.eclipse.core.runtime.jobs.IJobChangeEvent; >-import org.eclipse.core.runtime.jobs.JobChangeAdapter; >+import org.eclipse.core.runtime.*; >+import org.eclipse.core.runtime.jobs.*; > import org.eclipse.equinox.internal.p2.ui.ProvUIMessages; >+import org.eclipse.equinox.internal.provisional.p2.ui.ProvisioningOperationRunner; > import org.eclipse.equinox.internal.provisional.p2.ui.dialogs.IViewMenuProvider; >+import org.eclipse.equinox.internal.provisional.p2.ui.query.QueriedElement; >+import org.eclipse.equinox.internal.provisional.p2.ui.query.QueryableMetadataRepositoryManager; > import org.eclipse.equinox.internal.provisional.p2.ui.viewers.DeferredQueryContentListener; > import org.eclipse.equinox.internal.provisional.p2.ui.viewers.DeferredQueryContentProvider; > import org.eclipse.jface.action.MenuManager; >@@ -31,6 +34,8 @@ > * > */ > public class DeferredFetchFilteredTree extends FilteredTree { >+ private static final long FILTER_DELAY_TIME = 200; >+ private static final String WAIT_STRING = ProvUIMessages.DeferredFetchFilteredTree_RetrievingList; > > ToolBar toolBar; > MenuManager menuManager; >@@ -40,6 +45,42 @@ > IViewMenuProvider viewMenuProvider; > DeferredQueryContentProvider contentProvider; > boolean useCheckBoxTree = false; >+ InputSchedulingRule filterRule; >+ String savedFilterText; >+ Job loadJob; >+ WorkbenchJob filterJob; >+ >+ class InputSchedulingRule implements ISchedulingRule { >+ Object input; >+ >+ InputSchedulingRule(Object input) { >+ this.input = input; >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.core.runtime.jobs.ISchedulingRule#contains(org.eclipse.core.runtime.jobs.ISchedulingRule) >+ */ >+ public boolean contains(ISchedulingRule rule) { >+ return rule == this; >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.core.runtime.jobs.ISchedulingRule#isConflicting(org.eclipse.core.runtime.jobs.ISchedulingRule) >+ */ >+ public boolean isConflicting(ISchedulingRule rule) { >+ if (rule instanceof InputSchedulingRule) { >+ InputSchedulingRule other = (InputSchedulingRule) rule; >+ if (input == null) >+ return other.getInput() == null; >+ return input.equals(other.getInput()); >+ } >+ return false; >+ } >+ >+ Object getInput() { >+ return input; >+ } >+ } > > public DeferredFetchFilteredTree(Composite parent, int treeStyle, PatternFilter filter, final IViewMenuProvider viewMenuProvider, Display display, boolean useCheckBoxViewer) { > super(parent); >@@ -78,6 +119,11 @@ > } > if (viewMenuProvider != null) > createViewMenu(filterParent); >+ filterParent.addDisposeListener(new DisposeListener() { >+ public void widgetDisposed(DisposeEvent e) { >+ cancelLoadJob(); >+ } >+ }); > return filterParent; > } > >@@ -121,6 +167,13 @@ > public void inputChanged(Viewer v, Object oldInput, Object newInput) { > if (newInput == null) > return; >+ // Cancel the load and filter jobs and null out the scheduling rule >+ // so that a new one will be created on the new input when needed. >+ cancelLoadJob(); >+ cancelAndResetFilterJob(); >+ filterRule = null; >+ contentProvider.setSynchronous(false); >+ > if (showFilterControls && filterText != null && !filterText.isDisposed()) { > filterText.setText(getInitialText()); > filterText.selectAll(); >@@ -136,22 +189,120 @@ > * @see org.eclipse.ui.dialogs.FilteredTree#doCreateRefreshJob() > */ > protected WorkbenchJob doCreateRefreshJob() { >- WorkbenchJob job = super.doCreateRefreshJob(); >- job.addJobChangeListener(new JobChangeAdapter() { >- public void aboutToRun(IJobChangeEvent event) { >+ filterJob = super.doCreateRefreshJob(); >+ filterJob.addJobChangeListener(new JobChangeAdapter() { >+ public void aboutToRun(final IJobChangeEvent event) { > display.syncExec(new Runnable() { > public void run() { > String text = getFilterString(); > // If we are about to filter and there is >- // actually filtering to do, set the content >- // provider to synchronous mode. >+ // actually filtering to do, force a load >+ // of the input and set the content >+ // provider to synchronous mode. We want the >+ // load job to complete before continuing with filtering. > if (text == null || (initialText != null && initialText.equals(text))) > return; >- contentProvider.setSynchronous(true); >+ if (!contentProvider.getSynchronous()) { >+ if (filterText != null && !filterText.isDisposed()) { >+ filterText.setEnabled(false); >+ filterText.setCursor(display.getSystemCursor(SWT.CURSOR_WAIT)); >+ savedFilterText = filterText.getText(); >+ filterText.setText(WAIT_STRING); >+ } >+ event.getJob().sleep(); >+ scheduleLoadJob(); >+ event.getJob().wakeUp(FILTER_DELAY_TIME); >+ contentProvider.setSynchronous(true); >+ } >+ } >+ }); >+ } >+ >+ public void done(IJobChangeEvent event) { >+ display.asyncExec(new Runnable() { >+ public void run() { >+ restoreFilterText(); >+ } >+ }); >+ } >+ >+ public void awake(IJobChangeEvent event) { >+ display.asyncExec(new Runnable() { >+ public void run() { >+ restoreFilterText(); > } > }); > } > }); >- return job; >+ filterJob.setRule(getFilterJobSchedulingRule()); >+ return filterJob; >+ } >+ >+ void restoreFilterText() { >+ if (filterText != null && !filterText.isDisposed() && !filterText.isEnabled()) { >+ filterText.setText(savedFilterText); >+ filterText.setEnabled(true); >+ filterText.setCursor(null); >+ filterText.setFocus(); >+ filterText.setSelection(savedFilterText.length(), savedFilterText.length()); >+ } >+ } >+ >+ InputSchedulingRule getFilterJobSchedulingRule() { >+ if (filterRule == null) { >+ Object input = null; >+ if (getViewer() != null) >+ input = getViewer().getInput(); >+ filterRule = new InputSchedulingRule(input); >+ } >+ return filterRule; >+ } >+ >+ void scheduleLoadJob() { >+ cancelLoadJob(); >+ loadJob = new Job(WAIT_STRING) { >+ protected IStatus run(IProgressMonitor monitor) { >+ if (this.getRule() instanceof InputSchedulingRule) { >+ Object input = ((InputSchedulingRule) this.getRule()).getInput(); >+ if (input instanceof QueriedElement) >+ if (((QueriedElement) input).getQueryable() instanceof QueryableMetadataRepositoryManager) { >+ QueryableMetadataRepositoryManager q = (QueryableMetadataRepositoryManager) ((QueriedElement) input).getQueryable(); >+ q.loadAll(monitor); >+ if (monitor.isCanceled()) >+ return Status.CANCEL_STATUS; >+ } >+ } >+ return Status.OK_STATUS; >+ } >+ }; >+ loadJob.setSystem(true); >+ loadJob.setUser(false); >+ loadJob.setRule(getFilterJobSchedulingRule()); >+ // Telling the operation runner about it ensures that listeners know we are running >+ // a provisioning-related job. >+ ProvisioningOperationRunner.manageJob(loadJob); >+ loadJob.schedule(); >+ } >+ >+ void cancelLoadJob() { >+ if (loadJob != null) { >+ loadJob.cancel(); >+ loadJob = null; >+ } >+ } >+ >+ void cancelAndResetFilterJob() { >+ if (filterJob != null) { >+ filterJob.cancel(); >+ filterJob.setRule(getFilterJobSchedulingRule()); >+ } >+ } >+ >+ protected void textChanged() { >+ // Don't refilter if we are merely resetting the filter back >+ // to what it was before loading repositories >+ if (filterText.getText().trim().equals(WAIT_STRING)) >+ return; >+ super.textChanged(); > } > } >\ No newline at end of file
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 226052
:
99141
|
99161
|
99174
|
99829