2014-10-07 21 views
6

Come posso distinguere correttamente, all'interno di un che viene aggiunto tramite ResourcePlugin.getWorkspace().addResourceChangeListener(...) che un progetto è stato cancellato/rinominato?IResourceChangeEvent - come identificare un progetto cancellare/rinominare

Attraverso le prove, sembrerebbe che il IResourceChangeEvent.getDelta() -> IResourceDelta sarebbe la risposta.

Da Eclipse API:

Dopo-il-fatto segnalazioni in batch di creazioni arbitrarie, le eliminazioni e modifiche a una o più risorse espresse in gerarchico delta risorsa. Il tipo di evento è POST_CHANGE e getDelta restituisce il delta gerarchico . Il delta della risorsa è radicato nello spazio di lavoro root. Questi eventi vengono trasmessi alle parti interessate dopo una serie di modifiche alle risorse e si verificano sia che la costruzione automatica sia abilitata o meno. L'area di lavoro è chiusa per la modifica durante la notifica di questi eventi . Il delta segnalato in questo ciclo di eventi è identico per tutti gli ascoltatori registrati per questo tipo di evento.

EDIT: aggiungendo i miei risultati finora

Così, il Event.getType() è POST_CHANGE e non ci deve essere o

  • un delta che contiene un bambino IResourceDelta che ha il getKind() == REMOVED per una delezione e il delta getResource().getType() == PROJECT in modo che sappiamo che è un progetto (questo IResourceDelta non dovrebbe avere figli)

  • un getDelta() che contiene due bambini IResourceDelta che hanno getKind() == REMOVED e getKind() == ADDED, anche la getResource().getType() == PROJECT, e quelli IResourceDelta non contengono figli Delta (ho osservato che quando un file viene rinominato/cancellato, il IProject la risorsa appartiene è quello che è in prima fila dei figli del genitore Delta ...)

qualcuno può confermare questa supposizione? E 'davvero necessario fare una ricerca approfondita sugli alberi per capire se l'evento è un progetto rinominato/cancella o un file/cartella?

risposta

1
  • è necessario aggiungere un cambiamento risorsa ascoltatore attraverso ResourcePlugin.getWorkspace().addResourceChangeListener(listener, IResourceChangeEvent.POST_CHANGE)

  • Nel vostro ascoltatore, utilizzare un IResourceDeltaVisitor per visitare tutti i cambiamenti nel delta via event.getDelta().accept(...)

  • Il visitatore deve guardare nei progetti che sono REMOVED

  • Se vi state aspettando e progetto da rimosso e creato con lo stesso nome (come accade per i file & cartelle durante gli eventi di generazione), quindi oltre al REMOVED, guardate anche per REPLACED nel delta

+1

utilizzando questo metodo, come riconoscerei un progetto rinominato? –

+0

Ho la stessa domanda di Vlad. Come identificare solo l'evento di rinomina? – 2c00L

+0

ha trovato una risposta: http://stackoverflow.com/questions/30170492/how-to-use-an-iresourcechangelistener-to-detect-a-file-rename-and-set-the-editor?lq=1 – chani