/* * Copyright (c) 2011, 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.ui.omni.elements; import com.google.dart.tools.ui.omni.OmniBoxMessages; import com.google.dart.tools.ui.omni.OmniElement; import com.google.dart.tools.ui.omni.OmniProposalProvider; import org.eclipse.ui.IViewReference; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.activities.WorkbenchActivityHelper; import org.eclipse.ui.views.IViewDescriptor; import org.eclipse.ui.views.IViewRegistry; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; /** * Provider for view elements. */ public class ViewProvider extends OmniProposalProvider { private OmniElement[] cachedElements; private final Map<String, ViewElement> idToElement = new HashMap<String, ViewElement>(); private final Collection<String> multiInstanceViewIds = new HashSet<String>(0); public void addOpenViews(Collection<ViewElement> elements) { IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); IViewRegistry viewRegistry = PlatformUI.getWorkbench().getViewRegistry(); IViewReference[] refs = page.getViewReferences(); for (int i = 0; i < refs.length; i++) { IViewDescriptor viewDescriptor = viewRegistry.find(refs[i].getId()); addElement( viewDescriptor, elements, refs[i].getSecondaryId(), refs[i].getContentDescription()); } } @Override public OmniElement getElementForId(String id) { getElements(id); return idToElement.get(id); } @Override public OmniElement[] getElements(String pattern) { if (PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() == null) { cachedElements = null; return new OmniElement[0]; } if (cachedElements == null) { IViewDescriptor[] views = PlatformUI.getWorkbench().getViewRegistry().getViews(); Collection<ViewElement> elements = new HashSet<ViewElement>(views.length); for (int i = 0; i < views.length; i++) { if (!WorkbenchActivityHelper.filterItem(views[i])) { addElement(views[i], elements, null, null); } } addOpenViews(elements); markMultiInstance(elements); cachedElements = elements.toArray(new OmniElement[elements.size()]); } return cachedElements; } @Override public String getId() { return getClass().getName(); } @Override public String getName() { return OmniBoxMessages.OmniBox_Views; } private void addElement(IViewDescriptor viewDesc, Collection<ViewElement> elements, String secondaryId, String desc) { ViewElement viewElement = new ViewElement(viewDesc, this); viewElement.setSecondaryId(secondaryId); viewElement.setContentDescription(desc); boolean added = elements.add(viewElement); if (added) { idToElement.put(viewElement.getId(), viewElement); } else { // *could* be multinstance multiInstanceViewIds.add(viewDesc.getId()); } } private void markMultiInstance(Collection<ViewElement> elements) { for (Iterator<String> i = multiInstanceViewIds.iterator(); i.hasNext();) { String viewId = i.next(); ViewElement firstInstance = null; for (Iterator<ViewElement> j = elements.iterator(); j.hasNext();) { ViewElement viewElement = j.next(); if (viewElement.getPrimaryId().equals(viewId)) { if (firstInstance == null) { firstInstance = viewElement; } else { firstInstance.setMultiInstance(true); viewElement.setMultiInstance(true); } } } } } }