/* * 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.ui.internal.testing; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.swt.custom.StackLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.IPartListener; import org.eclipse.ui.IViewSite; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.ViewPart; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * A view to display and run dart:unittest tests. */ public class DartUnitView extends ViewPart { private DartUnitViewPage defaultPage; private DartUnitViewPage visiblePage; private List<DartUnitViewPage> pages = new ArrayList<DartUnitViewPage>(); private Composite parentComposite; IPartListener partListener = new IPartListener() { @Override public void partActivated(IWorkbenchPart part) { handleActivation(part); } @Override public void partBroughtToTop(IWorkbenchPart part) { handleActivation(part); } @Override public void partClosed(IWorkbenchPart part) { handleActivation(part.getSite().getPage().getActiveEditor()); } @Override public void partDeactivated(IWorkbenchPart part) { } @Override public void partOpened(IWorkbenchPart part) { } }; public DartUnitView() { } @Override public void createPartControl(Composite parent) { this.parentComposite = parent; parent.setLayout(new StackLayout()); defaultPage = createDefaultPage(); defaultPage.createControl(parent); showPage(defaultPage); } @Override public void dispose() { getSite().getPage().removePartListener(partListener); super.dispose(); } @Override public void init(IViewSite site) throws PartInitException { super.init(site); site.getPage().addPartListener(partListener); } @Override public void setFocus() { if (visiblePage != null) { defaultPage.setFocus(); } } protected DartUnitViewPage createDefaultPage() { return new DartUnitViewPage(); } @Override protected void setContentDescription(String description) { super.setContentDescription(description); } private DartUnitViewPage createPageFor(IProject project) { DartUnitViewPage page = new DartUnitViewPage(project); page.createControl(parentComposite); pages.add(page); return page; } private void deletePage(DartUnitViewPage page) { if (page == visiblePage) { showPage(defaultPage); } pages.remove(page); page.dispose(); } /** * Collect any pages that reference projects with no open editors. */ private void gcPages() { Set<IProject> referencedProjects = new HashSet<IProject>(); for (IEditorReference ref : getSite().getPage().getEditorReferences()) { IEditorPart editor = ref.getEditor(false); if (editor != null) { if (editor.getEditorInput() instanceof IFileEditorInput) { IFileEditorInput input = (IFileEditorInput) editor.getEditorInput(); referencedProjects.add(input.getFile().getProject()); } } } // collect unreferenced pages for (DartUnitViewPage page : new ArrayList<DartUnitViewPage>(pages)) { if (page == visiblePage) { continue; } if (!referencedProjects.contains(page.getProject())) { deletePage(page); } } } private DartUnitViewPage getPageFor(IProject project) { for (DartUnitViewPage page : pages) { if (project.equals(page.getProject())) { return page; } } return null; } private void handleActivation(IWorkbenchPart part) { if (part instanceof IEditorPart) { IEditorPart editor = (IEditorPart) part; if (editor.getEditorInput() instanceof IFileEditorInput) { IFileEditorInput input = (IFileEditorInput) editor.getEditorInput(); refocusContent(editor, input.getFile()); } } else if (part == null) { showPage(defaultPage); } } private void refocusContent(IEditorPart editor, IFile file) { IProject project = file.getProject(); swapPages(project); } private void showPage(DartUnitViewPage page) { if (visiblePage == page) { return; } if (page != defaultPage) { // Move the page to the end of the pages list. pages.remove(page); pages.add(page); } visiblePage = page; StackLayout layout = (StackLayout) parentComposite.getLayout(); layout.topControl = visiblePage.getControl(); parentComposite.layout(); page.activated(this); gcPages(); } private void swapPages(IProject project) { if (project == null) { showPage(defaultPage); } else if (getPageFor(project) != null) { showPage(getPageFor(project)); } else { DartUnitViewPage page = createPageFor(project); showPage(page); } } }