1 11 package org.eclipse.jface.internal.text.revisions; 12 13 import org.eclipse.core.runtime.ListenerList; 14 15 import org.eclipse.jface.text.ITextSelection; 16 import org.eclipse.jface.text.ITextViewer; 17 import org.eclipse.jface.text.revisions.Revision; 18 19 import org.eclipse.jface.viewers.IPostSelectionProvider; 20 import org.eclipse.jface.viewers.ISelection; 21 import org.eclipse.jface.viewers.ISelectionChangedListener; 22 import org.eclipse.jface.viewers.ISelectionProvider; 23 import org.eclipse.jface.viewers.IStructuredSelection; 24 import org.eclipse.jface.viewers.SelectionChangedEvent; 25 import org.eclipse.jface.viewers.StructuredSelection; 26 27 40 public final class RevisionSelectionProvider implements ISelectionProvider { 41 42 46 private final class PostSelectionListener implements ISelectionChangedListener { 47 private final IPostSelectionProvider fPostProvider; 48 49 public PostSelectionListener(IPostSelectionProvider postProvider) { 50 postProvider.addPostSelectionChangedListener(this); 51 fPostProvider= postProvider; 52 } 53 54 public void selectionChanged(SelectionChangedEvent event) { 55 ISelection selection= event.getSelection(); 56 if (selection instanceof ITextSelection) { 57 ITextSelection ts= (ITextSelection) selection; 58 int offset= ts.getOffset(); 59 setSelectedRevision(fPainter.getRevision(offset)); 60 } 61 62 } 63 64 public void dispose() { 65 fPostProvider.removePostSelectionChangedListener(this); 66 } 67 } 68 69 private final RevisionPainter fPainter; 70 private final ListenerList fListeners= new ListenerList(); 71 72 75 private ITextViewer fViewer; 76 79 private PostSelectionListener fSelectionListener; 80 83 private Revision fSelection; 84 89 private boolean fIgnoreEvents= false; 90 91 96 RevisionSelectionProvider(RevisionPainter painter) { 97 fPainter= painter; 98 } 99 100 103 public void addSelectionChangedListener(ISelectionChangedListener listener) { 104 fListeners.add(listener); 105 } 106 107 110 public void removeSelectionChangedListener(ISelectionChangedListener listener) { 111 fListeners.remove(listener); 112 } 113 114 117 public ISelection getSelection() { 118 if (fSelection == null) 119 return StructuredSelection.EMPTY; 120 return new StructuredSelection(fSelection); 121 } 122 123 126 public void setSelection(ISelection selection) { 127 if (fIgnoreEvents) 128 return; 129 if (selection instanceof IStructuredSelection) { 130 Object first= ((IStructuredSelection) selection).getFirstElement(); 131 if (first instanceof Revision) 132 fPainter.handleRevisionSelected((Revision) first); 133 else if (first instanceof String ) 134 fPainter.handleRevisionSelected((String ) first); 135 else if (selection.isEmpty()) 136 fPainter.handleRevisionSelected((Revision) null); 137 } 138 } 139 140 145 void install(ITextViewer viewer) { 146 uninstall(); 147 fViewer= viewer; 148 if (fViewer != null) { 149 ISelectionProvider provider= fViewer.getSelectionProvider(); 150 if (provider instanceof IPostSelectionProvider) { 151 IPostSelectionProvider postProvider= (IPostSelectionProvider) provider; 152 fSelectionListener= new PostSelectionListener(postProvider); 153 } 154 } 155 } 156 157 160 void uninstall() { 161 fViewer= null; 162 if (fSelectionListener != null) { 163 fSelectionListener.dispose(); 164 fSelectionListener= null; 165 } 166 } 167 168 173 void revisionSelected(Revision revision) { 174 setSelectedRevision(revision); 175 } 176 177 182 private void setSelectedRevision(Revision revision) { 183 if (revision != fSelection) { 184 fSelection= revision; 185 fireSelectionEvent(); 186 } 187 } 188 189 private void fireSelectionEvent() { 190 fIgnoreEvents= true; 191 try { 192 ISelection selection= getSelection(); 193 SelectionChangedEvent event= new SelectionChangedEvent(this, selection); 194 195 Object [] listeners= fListeners.getListeners(); 196 for (int i= 0; i < listeners.length; i++) 197 ((ISelectionChangedListener) listeners[i]).selectionChanged(event); 198 } finally { 199 fIgnoreEvents= false; 200 } 201 } 202 } 203 | Popular Tags |