/******************************************************************************* * Copyright (c) 2009 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation * Zend Technologies *******************************************************************************/ package org.eclipse.php.internal.ui.projectoutlineview; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.dltk.core.DLTKCore; import org.eclipse.dltk.core.IModelElement; import org.eclipse.dltk.core.IScriptProject; import org.eclipse.dltk.internal.ui.navigator.ScriptExplorerLabelProvider; import org.eclipse.dltk.internal.ui.scriptview.ScriptExplorerActionGroup; import org.eclipse.dltk.internal.ui.scriptview.ScriptExplorerPart; import org.eclipse.dltk.ui.DLTKUIPlugin; import org.eclipse.dltk.ui.ModelElementSorter; import org.eclipse.dltk.ui.PreferenceConstants; import org.eclipse.dltk.ui.viewsupport.ProblemTreeViewer; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.php.internal.ui.PHPUIMessages; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IPartListener; import org.eclipse.ui.IWorkbenchPart; /** * Project Outline for the php perspective, it is based on the * {@link ScriptExplorerPart} Registration to the page part (editor) is done to * change the project context * * @author Roy, 2008 * @version 2.0 (by NirC, 2008) */ public class ProjectOutlinePart extends ScriptExplorerPart implements IPartListener { @Override public ProjectOutlineContentProvider createContentProvider() { boolean showCUChildren = DLTKUIPlugin.getDefault().getPreferenceStore() .getBoolean(PreferenceConstants.SHOW_SOURCE_MODULE_CHILDREN); return new ProjectOutlineContentProvider(showCUChildren) { @Override protected IPreferenceStore getPreferenceStore() { return DLTKUIPlugin.getDefault().getPreferenceStore(); } }; } @Override public String getTitleToolTip() { return PHPUIMessages.PHPProjectOutline_title_tooltip; } @Override protected ScriptExplorerLabelProvider createLabelProvider() { final IPreferenceStore store = DLTKUIPlugin.getDefault().getPreferenceStore(); return new ProjectOutlineLabelProvider(getContentProvider(), store); } @Override protected ScriptExplorerActionGroup getActionGroup() { return new PHPProjectOutlineActionGroup(this); } /* * (non-Javadoc) * * @see org.eclipse.dltk.internal.ui.scriptview.ScriptExplorerPart# * createPartControl (org.eclipse.swt.widgets.Composite) */ @Override public void createPartControl(Composite parent) { super.createPartControl(parent); // register this view to the page getSite().getPage().addPartListener(this); selectProject(null); // activateContext(); } // /** // * Activate a context that this view uses. It will be tied to this view // * activation events and will be removed when the view is disposed. // */ // private void activateContext() { // IContextService contextService = (IContextService) getSite() // .getService(IContextService.class); // contextService.activateContext("org.eclipse.php.ui.contexts.window"); // //$NON-NLS-1$ // } @Override protected void setComparator() { getTreeViewer().setComparator(new ModelElementSorter()); } private void setInputAsEditor(IScriptProject scriptProject) { final TreeViewer treeViewer = getTreeViewer(); if (null == treeViewer.getInput() || !treeViewer.getInput().equals(scriptProject)) { treeViewer.setInput(scriptProject); } } private void setInputAsEditor(IEditorPart editor) { setInputAsEditor((IScriptProject) getInput(editor)); } /* * (non-Javadoc) * * @see org.eclipse.dltk.internal.ui.scriptview.ScriptExplorerPart#dispose() */ @Override public void dispose() { // unregister to the page getSite().getPage().removePartListener(this); super.dispose(); } private Object getInput(IEditorPart editor) { final IEditorInput editorInput = editor.getEditorInput(); final IFile file = (IFile) editorInput.getAdapter(IFile.class); if (file != null) { final IProject project = file.getProject(); return DLTKCore.create(project); } return null; } @Override public void partActivated(IWorkbenchPart part) { selectProject(part); } private void selectProject(IWorkbenchPart part) { IEditorPart editor = getSite().getPage().getActiveEditor(); if (editor != null) { setInputAsEditor(editor); } else if (part instanceof ScriptExplorerPart) { setInputAsExplorerProject(part); return; } } private void setInputAsExplorerProject(IWorkbenchPart part) { final TreeSelection input = (TreeSelection) ((ScriptExplorerPart) part).getTreeViewer().getSelection(); IScriptProject scriptProject = null; // getting selected project (from ScriptExplorerPart selection. if (input.getFirstElement() instanceof IModelElement) { scriptProject = (IScriptProject) ((IModelElement) input.getFirstElement()) .getAncestor(IModelElement.SCRIPT_PROJECT); } if (null == scriptProject) { // If no project is selected - choosing the first project IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects(); if (null != projects && projects.length != 0) { scriptProject = DLTKCore.create(projects[0]); } } setInputAsEditor(scriptProject); return; } @Override public void partBroughtToTop(IWorkbenchPart part) { } @Override public void partClosed(IWorkbenchPart part) { } @Override public void partDeactivated(IWorkbenchPart part) { } @Override public void partOpened(IWorkbenchPart part) { selectProject(part); } /** * Enable lazy loading for group elements */ @Override protected ProblemTreeViewer createViewer(Composite composite) { return new ProjectOutlineProblemTreeViewer(composite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); } protected class ProjectOutlineProblemTreeViewer extends PackageExplorerProblemTreeViewer { public ProjectOutlineProblemTreeViewer(Composite parent, int style) { super(parent, style); } /** * Always return true for elements to reduce model queries */ @Override protected boolean evaluateExpandableWithFilters(Object parent) { return false; } } }