001: /*******************************************************************************
002: * Copyright (c) 2004 Andrei Loskutov.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the BSD License
005: * which accompanies this distribution, and is available at
006: * http://www.opensource.org/licenses/bsd-license.php
007: * Contributor: Andrei Loskutov - initial API and implementation
008: *******************************************************************************/package de.loskutov.bco.views;
009:
010: import org.eclipse.core.filebuffers.IFileBuffer;
011: import org.eclipse.core.filebuffers.IFileBufferListener;
012: import org.eclipse.core.runtime.IPath;
013: import org.eclipse.jdt.core.IJavaElement;
014: import org.eclipse.jface.text.ITextSelection;
015: import org.eclipse.jface.viewers.ISelection;
016: import org.eclipse.jface.viewers.IStructuredSelection;
017: import org.eclipse.swt.widgets.Display;
018: import org.eclipse.ui.IPartListener2;
019: import org.eclipse.ui.ISelectionListener;
020: import org.eclipse.ui.IWorkbenchPart;
021: import org.eclipse.ui.IWorkbenchPartReference;
022:
023: /**
024: * @author Andrei
025: */
026: public class EditorListener implements ISelectionListener,
027: IFileBufferListener, IPartListener2 {
028: protected BytecodeOutlineView view;
029:
030: EditorListener(BytecodeOutlineView view) {
031: this .view = view;
032: }
033:
034: /**
035: * clean view reference
036: */
037: public void dispose() {
038: this .view = null;
039: }
040:
041: /**
042: * @param part
043: * @param selection
044: *
045: */
046: public void selectionChanged(IWorkbenchPart part,
047: ISelection selection) {
048: if (!(selection instanceof ITextSelection)) {
049: if (selection instanceof IStructuredSelection) {
050: IStructuredSelection ssel = (IStructuredSelection) selection;
051: if (ssel.isEmpty()) {
052: return;
053: }
054: if (ssel.getFirstElement() instanceof IJavaElement) {
055: /*
056: * this may be selection in outline view. If so, the editor selection
057: * would be changed but no event would be sent :(
058: * So we just delay the call and wait for new selection in editor
059: */
060: Display display = Display.getDefault();
061: // fork
062: display.asyncExec(new Runnable() {
063: public void run() {
064: view.checkOpenEditors(true);
065: }
066: });
067: }
068: }
069: return;
070: }
071: view.handleSelectionChanged(part, selection);
072: }
073:
074: /**
075: * @see org.eclipse.core.filebuffers.IFileBufferListener#dirtyStateChanged(org.eclipse.core.filebuffers.IFileBuffer, boolean)
076: */
077: public void dirtyStateChanged(IFileBuffer buffer,
078: final boolean isDirty) {
079: if (!view.isLinkedWithEditor()) {
080: return;
081: }
082: if (isSupportedBuffer(buffer)) { //$NON-NLS-1$
083: // first call set only view flag - cause
084: view.handleBufferIsDirty(isDirty);
085:
086: // second call will really refresh view
087: if (!isDirty) {
088: // this one will be called in UI thread after some delay, because we need
089: // to wait until the bytecode will be written on disk
090: final Runnable runnable2 = new Runnable() {
091: public void run() {
092: view.handleBufferIsDirty(isDirty);
093: }
094: };
095: // this one will be called in UI thread ASAP and allow us to leave
096: // current (probably non-UI) thread
097: Runnable runnable1 = new Runnable() {
098: public void run() {
099: Display display = Display.getCurrent();
100: display.timerExec(1000, runnable2);
101: }
102: };
103: Display display = Display.getDefault();
104: // fork
105: display.asyncExec(runnable1);
106: }
107: }
108: }
109:
110: private boolean isSupportedBuffer(IFileBuffer buffer) {
111: String fileExtension = buffer.getLocation().getFileExtension();
112: // TODO export to properties
113: return "java".equals(fileExtension);// || "groovy".equals(fileExtension); //$NON-NLS-1$//$NON-NLS-2$
114: }
115:
116: /**
117: * @see org.eclipse.ui.IPartListener2#partClosed(org.eclipse.ui.IWorkbenchPartReference)
118: */
119: public void partClosed(IWorkbenchPartReference partRef) {
120: view.handlePartHidden(partRef.getPart(false));
121: }
122:
123: /**
124: * @see org.eclipse.ui.IPartListener2#partHidden(org.eclipse.ui.IWorkbenchPartReference)
125: */
126: public void partHidden(IWorkbenchPartReference partRef) {
127: view.handlePartHidden(partRef.getPart(false));
128: }
129:
130: /**
131: * @see org.eclipse.ui.IPartListener2#partOpened(org.eclipse.ui.IWorkbenchPartReference)
132: */
133: public void partOpened(IWorkbenchPartReference partRef) {
134: view.handlePartVisible(partRef.getPart(false));
135: }
136:
137: /**
138: * @see org.eclipse.ui.IPartListener2#partVisible(org.eclipse.ui.IWorkbenchPartReference)
139: */
140: public void partVisible(IWorkbenchPartReference partRef) {
141: view.handlePartVisible(partRef.getPart(false));
142: }
143:
144: /**
145: * @see org.eclipse.core.filebuffers.IFileBufferListener#bufferDisposed(org.eclipse.core.filebuffers.IFileBuffer)
146: */
147: public void bufferDisposed(IFileBuffer buffer) {
148: // is not used here
149: }
150:
151: /**
152: * @see org.eclipse.core.filebuffers.IFileBufferListener#bufferCreated(org.eclipse.core.filebuffers.IFileBuffer)
153: */
154: public void bufferCreated(IFileBuffer buffer) {
155: // is not used here
156: }
157:
158: /**
159: * @see org.eclipse.core.filebuffers.IFileBufferListener#bufferContentAboutToBeReplaced(org.eclipse.core.filebuffers.IFileBuffer)
160: */
161: public void bufferContentAboutToBeReplaced(IFileBuffer buffer) {
162: // is not used here
163: }
164:
165: /**
166: * @see org.eclipse.core.filebuffers.IFileBufferListener#bufferContentReplaced(org.eclipse.core.filebuffers.IFileBuffer)
167: */
168: public void bufferContentReplaced(IFileBuffer buffer) {
169: // is not used here
170: }
171:
172: /**
173: * @see org.eclipse.core.filebuffers.IFileBufferListener#stateChanging(org.eclipse.core.filebuffers.IFileBuffer)
174: */
175: public void stateChanging(IFileBuffer buffer) {
176: // is not used here
177: }
178:
179: /**
180: * @see org.eclipse.core.filebuffers.IFileBufferListener#stateValidationChanged(org.eclipse.core.filebuffers.IFileBuffer, boolean)
181: */
182: public void stateValidationChanged(IFileBuffer buffer,
183: boolean isStateValidated) {
184: // is not used here
185: }
186:
187: /**
188: * @see org.eclipse.core.filebuffers.IFileBufferListener#underlyingFileMoved(org.eclipse.core.filebuffers.IFileBuffer, org.eclipse.core.runtime.IPath)
189: */
190: public void underlyingFileMoved(IFileBuffer buffer, IPath path) {
191: //is not used here
192: }
193:
194: /**
195: * @see org.eclipse.core.filebuffers.IFileBufferListener#underlyingFileDeleted(org.eclipse.core.filebuffers.IFileBuffer)
196: */
197: public void underlyingFileDeleted(IFileBuffer buffer) {
198: //is not used here
199: }
200:
201: /**
202: * @see org.eclipse.core.filebuffers.IFileBufferListener#stateChangeFailed(org.eclipse.core.filebuffers.IFileBuffer)
203: */
204: public void stateChangeFailed(IFileBuffer buffer) {
205: //is not used here
206: }
207:
208: /**
209: * @see org.eclipse.ui.IPartListener2#partInputChanged(org.eclipse.ui.IWorkbenchPartReference)
210: */
211: public void partInputChanged(IWorkbenchPartReference partRef) {
212: // is not used here
213: }
214:
215: /**
216: * @see org.eclipse.ui.IPartListener2#partActivated(org.eclipse.ui.IWorkbenchPartReference)
217: */
218: public void partActivated(IWorkbenchPartReference partRef) {
219: // is not used here
220: }
221:
222: /**
223: * @see org.eclipse.ui.IPartListener2#partBroughtToTop(org.eclipse.ui.IWorkbenchPartReference)
224: */
225: public void partBroughtToTop(IWorkbenchPartReference partRef) {
226: // is not used here
227: }
228:
229: /**
230: * @see org.eclipse.ui.IPartListener2#partDeactivated(org.eclipse.ui.IWorkbenchPartReference)
231: */
232: public void partDeactivated(IWorkbenchPartReference partRef) {
233: // is not used here
234: }
235:
236: }
|