/* * Copyright (c) 2012, the Dart project authors. * * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.eclipse.org/legal/epl-v10.html * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package com.google.dart.tools.search2.internal.ui.text; import com.google.dart.tools.search.ui.text.AbstractTextSearchResult; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IPartListener2; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPartReference; import org.eclipse.ui.IWorkbenchWindow; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class WindowAnnotationManager { private IWorkbenchWindow fWindow; private Map<IEditorPart, EditorAnnotationManager> fAnnotationManagers; private IPartListener2 fPartListener; private ArrayList<AbstractTextSearchResult> fSearchResults; public WindowAnnotationManager(IWorkbenchWindow window) { fWindow = window; fAnnotationManagers = new HashMap<IEditorPart, EditorAnnotationManager>(); fSearchResults = new ArrayList<AbstractTextSearchResult>(); initEditors(); fPartListener = new IPartListener2() { public void partActivated(IWorkbenchPartReference partRef) { startHighlighting(getEditor(partRef)); } public void partBroughtToTop(IWorkbenchPartReference partRef) { startHighlighting(getEditor(partRef)); } public void partClosed(IWorkbenchPartReference partRef) { stopHighlighting(getEditor(partRef)); } public void partDeactivated(IWorkbenchPartReference partRef) { } public void partOpened(IWorkbenchPartReference partRef) { } public void partHidden(IWorkbenchPartReference partRef) { stopHighlighting(getEditor(partRef)); } public void partVisible(IWorkbenchPartReference partRef) { startHighlighting(getEditor(partRef)); } public void partInputChanged(IWorkbenchPartReference partRef) { updateHighlighting(getEditor(partRef)); } }; fWindow.getPartService().addPartListener(fPartListener); } private void startHighlighting(IEditorPart editor) { if (editor == null) return; EditorAnnotationManager mgr = fAnnotationManagers.get(editor); if (mgr == null) { mgr = new EditorAnnotationManager(editor); fAnnotationManagers.put(editor, mgr); mgr.setSearchResults(fSearchResults); } } private void updateHighlighting(IEditorPart editor) { if (editor == null) return; EditorAnnotationManager mgr = fAnnotationManagers.get(editor); if (mgr != null) { mgr.doEditorInputChanged(); } } private void initEditors() { IWorkbenchPage[] pages = fWindow.getPages(); for (int i = 0; i < pages.length; i++) { IEditorReference[] editors = pages[i].getEditorReferences(); for (int j = 0; j < editors.length; j++) { IEditorPart editor = editors[j].getEditor(false); if (editor != null && pages[i].isPartVisible(editor)) { startHighlighting(editor); } } } } private void stopHighlighting(IEditorPart editor) { if (editor == null) return; EditorAnnotationManager mgr = fAnnotationManagers.remove(editor); if (mgr != null) mgr.dispose(); } private IEditorPart getEditor(IWorkbenchPartReference partRef) { if (partRef instanceof IEditorReference) { return ((IEditorReference) partRef).getEditor(false); } return null; } void dispose() { fWindow.getPartService().removePartListener(fPartListener); for (Iterator<EditorAnnotationManager> mgrs = fAnnotationManagers.values().iterator(); mgrs.hasNext();) { EditorAnnotationManager mgr = mgrs.next(); mgr.dispose(); } fAnnotationManagers = null; } void addSearchResult(AbstractTextSearchResult result) { boolean alreadyShown = fSearchResults.contains(result); fSearchResults.add(result); if (!alreadyShown) { for (Iterator<EditorAnnotationManager> mgrs = fAnnotationManagers.values().iterator(); mgrs.hasNext();) { EditorAnnotationManager mgr = mgrs.next(); mgr.addSearchResult(result); } } } void removeSearchResult(AbstractTextSearchResult result) { fSearchResults.remove(result); boolean stillShown = fSearchResults.contains(result); if (!stillShown) { for (Iterator<EditorAnnotationManager> mgrs = fAnnotationManagers.values().iterator(); mgrs.hasNext();) { EditorAnnotationManager mgr = mgrs.next(); mgr.removeSearchResult(result); } } } }