/******************************************************************************* * Copyright (c) 2009, 2012 SpringSource, a divison of VMware, Inc. * 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: * SpringSource, a division of VMware, Inc. - initial API and implementation *******************************************************************************/ package org.eclipse.virgo.ide.runtime.internal.ui.editor; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.TreePath; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.pde.internal.ui.IHelpContextIds; import org.eclipse.pde.internal.ui.PDEPlugin; import org.eclipse.pde.internal.ui.PDEPluginImages; import org.eclipse.pde.internal.ui.PDEUIMessages; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.navigator.CommonViewer; import org.eclipse.ui.part.MultiPageEditorPart; import org.eclipse.ui.views.contentoutline.ContentOutlinePage; import org.eclipse.virgo.ide.runtime.internal.ui.ServerUiPlugin; import org.eclipse.virgo.ide.runtime.internal.ui.sorters.ArtefactSignatureSorter; import org.eclipse.wst.server.ui.internal.editor.ServerEditor; /** * @author Miles Parker */ @SuppressWarnings("restriction") public class ServerOutlinePage extends ContentOutlinePage { private CommonViewer contentOutlineViewer; protected Object input; final ServerEditor editor; public ServerOutlinePage(ServerEditor editor) { this.editor = editor; } private IEditorPart getActiveEditor() { try { Method method = MultiPageEditorPart.class.getDeclaredMethod("getActiveEditor", new Class[] {}); method.setAccessible(true); Object result = method.invoke(this.editor, new Object[] {}); return (IEditorPart) result; } catch (Exception e) { throw new RuntimeException(e); } } /** * @see org.eclipse.ui.views.contentoutline.ContentOutlinePage#getControl() */ @Override public Control getControl() { return this.contentOutlineViewer.getControl(); } /** * @see org.eclipse.ui.views.contentoutline.ContentOutlinePage#getTreeViewer() */ @Override protected TreeViewer getTreeViewer() { return this.contentOutlineViewer; } @Override public void createControl(Composite parent) { super.createControl(parent); this.contentOutlineViewer = new CommonViewer(ServerUiPlugin.RUNTIME_OUTLINE_VIEW_ID, parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); // contentOutlineViewer.addSelectionChangedListener(this); this.contentOutlineViewer.setInput(this.editor); this.contentOutlineViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection sel = (IStructuredSelection) event.getSelection(); ISelection selection = getTreeViewer().getSelection(); if (selection instanceof TreeSelection) { TreeSelection treeSel = (TreeSelection) selection; if (treeSel.getPaths().length > 0) { TreePath firstPath = treeSel.getPaths()[0]; if (firstPath.getFirstSegment() instanceof IEditorPart) { IEditorPart newPart = (IEditorPart) firstPath.getFirstSegment(); if (getActiveEditor() != newPart) { ServerOutlinePage.this.editor.setActiveEditor(newPart); } List<Object> leafList = new ArrayList<Object>(); for (TreePath path : treeSel.getPaths()) { leafList.add(path.getLastSegment()); } if (leafList.size() > 0) { ISelectionChangedListener pageListener = newPart.getAdapter(ISelectionChangedListener.class); if (pageListener instanceof ISelectionChangedListener) { pageListener.selectionChanged(new SelectionChangedEvent(getTreeViewer(), new StructuredSelection(leafList))); } } } } else if (sel.getFirstElement() instanceof IEditorPart) { ServerOutlinePage.this.editor.setActiveEditor((IEditorPart) sel.getFirstElement()); } } } }); this.contentOutlineViewer.setSorter(new ArtefactSignatureSorter()); registerContextMenu(this.contentOutlineViewer); } protected void registerContextMenu(StructuredViewer viewer) { MenuManager manager = new MenuManager(); Menu menu = manager.createContextMenu(viewer.getControl()); viewer.getControl().setMenu(menu); getSite().registerContextMenu("Something", manager, viewer); } class SortingAction extends Action { private boolean sortingOn; public SortingAction() { super(); PlatformUI.getWorkbench().getHelpSystem().setHelp(this, IHelpContextIds.OUTLINE_SORT_ACTION); setText(PDEUIMessages.PDEMultiPageContentOutline_SortingAction_label); setImageDescriptor(PDEPluginImages.DESC_ALPHAB_SORT_CO); setDisabledImageDescriptor(PDEPluginImages.DESC_ALPHAB_SORT_CO_DISABLED); setToolTipText(PDEUIMessages.PDEMultiPageContentOutline_SortingAction_tooltip); setDescription(PDEUIMessages.PDEMultiPageContentOutline_SortingAction_description); setChecked(this.sortingOn); } @Override public void run() { setChecked(isChecked()); valueChanged(isChecked()); } private void valueChanged(final boolean on) { this.sortingOn = on; PDEPlugin.getDefault().getPreferenceStore().setValue("PDEMultiPageContentOutline.SortingAction.isChecked", on); //$NON-NLS-1$ } } }