2009-11-19 3 views
2

J'essaye de développer un plugin qui fonctionnera quand n'importe quel travail d'éclipse est programmé.Eclipse tous les emplois listener

Fondamentalement, je veux être en mesure de savoir quand un travail est dans la boîte de dialogue de progression et de le surveiller.

Y a-t-il un écouteur qui peut être configuré pour attraper le mendicité et la fin de tels travaux?

Répondre

2

Quand on y pense, le ProgressView fait exactement cela: chaque fois qu'un travail démarre, il l'affiche dans sa vue.
Note, comme mentionné dans ce fil, la ProgressView is tightly coupled with the eclipse Jobs API (elle ne peut pas surveiller tout fil de plain vanilla)

alt text
(De l'article On the Job: The Eclipse Jobs API)

Alors peut-être vous pouvez commencer par regardant le code org.eclipse.ui.internal.progress.ProgressView, qui a besoin d'un ProgressViewerContentProvider, sur la base d'une ProgressContentProvider (mise en œuvre d'un IProgressUpdateCollector)

la toute chose semble être basée sur la ProgressViewUpdater singleton, ce qui crée un thread d'interface utilisateur en charge de la surveillance de ces travaux:

/** 
    * Create the update job that handles the updatesInfo. 
    */ 
    private void createUpdateJob() { 
     updateJob = new WorkbenchJob(ProgressMessages.ProgressContentProvider_UpdateProgressJob) { 
      /* 
      * (non-Javadoc) 
      * 
      * @see org.eclipse.ui.progress.UIJob#runInUIThread(org.eclipse.core.runtime.IProgressMonitor) 
      */ 
      public IStatus runInUIThread(IProgressMonitor monitor) { 

       //Abort the job if there isn't anything 
       if (collectors.length == 0) { 
        return Status.CANCEL_STATUS; 
       } 

       if (currentInfo.updateAll) { 
        synchronized (updateLock) { 
         currentInfo.reset(); 
        } 
        for (int i = 0; i < collectors.length; i++) { 
         collectors[i].refresh(); 
        } 

       } else { 
        //Lock while getting local copies of the caches. 
        Object[] updateItems; 
        Object[] additionItems; 
        Object[] deletionItems; 
        synchronized (updateLock) { 
         currentInfo.processForUpdate(); 

         updateItems = currentInfo.refreshes.toArray(); 
         additionItems = currentInfo.additions.toArray(); 
         deletionItems = currentInfo.deletions.toArray(); 

         currentInfo.reset(); 
        } 

        for (int v = 0; v < collectors.length; v++) { 
         IProgressUpdateCollector collector = collectors[v]; 

         if (updateItems.length > 0) { 
          collector.refresh(updateItems); 
         } 
         if (additionItems.length > 0) { 
          collector.add(additionItems); 
         } 
         if (deletionItems.length > 0) { 
          collector.remove(deletionItems); 
         } 
        } 
       } 

       return Status.OK_STATUS; 
      } 
     }; 
     updateJob.setSystem(true); 
     updateJob.setPriority(Job.DECORATE); 
     updateJob.setProperty(ProgressManagerUtil.INFRASTRUCTURE_PROPERTY, new Object()); 

    } 
+0

bonne réponse, VonC. : Pouce en l'air: – pimpf0r

+0

Merci, je vais essayer demain. – Valadas

0

Vous pouvez écouter la JobChangeListener dans le IJobManager pour le début et la fin des travaux.

IJobManager manager = Job.getJobManager(); 
manager.addJobChangeListener(myJobChangeListener); 

IJobChangeListener reçoit les événements suivants.

public void aboutToRun(IJobChangeEvent event); 
public void awake(IJobChangeEvent event); 
public void done(IJobChangeEvent event); 
public void running(IJobChangeEvent event); 
public void scheduled(IJobChangeEvent event); 
public void sleeping(IJobChangeEvent event); 

Cependant, je n'ai pas trouvé un moyen de suivre la progression d'un travail en cours. Je serais curieux si quelqu'un a.