/******************************************************************************* * Copyright (c) 2008 Olivier Moises * * 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: * Olivier Moises- initial API and implementation *******************************************************************************/ package org.eclipse.wazaabi.ide.ui.outline; import java.util.ArrayList; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.emf.common.notify.Notifier; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.gef.EditPartViewer; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.part.Page; import org.eclipse.ui.views.contentoutline.IContentOutlinePage; import org.eclipse.wazaabi.engine.swt.commons.editparts.SWTRootEditPart; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public abstract class AbstractOutlinePage extends Page implements IContentOutlinePage, IAdaptable, ISelectionChangedListener { final static Logger logger = LoggerFactory .getLogger(AbstractOutlinePage.class); private OutlineViewer outlineViewer; private ISelection selection; private ArrayList<ISelectionChangedListener> listeners = new ArrayList<ISelectionChangedListener>(); private final EditPartViewer treeEditorViewer; private Composite container = null; public AbstractOutlinePage(EditPartViewer treeEditorViewer) { this.treeEditorViewer = treeEditorViewer; } public void addSelectionChangedListener(ISelectionChangedListener listener) { listeners.add(listener); } @Override public void createControl(Composite parent) { container = new Composite(parent, SWT.NONE); container.setLayout(new FillLayout()); createOutlineViewer(container); initializeOutlineViewer(); } protected void createOutlineViewer(Composite parent) { outlineViewer = new OutlineViewer(parent, new SWTRootEditPart()); } @Override public void dispose() { listeners.clear(); super.dispose(); } public Object getAdapter(@SuppressWarnings("rawtypes") Class adapter) { return null; } @Override public Control getControl() { return container; } protected Object getEditorModel() { if (getTreeEditorViewer().getContents() != null) return getTreeEditorViewer().getContents().getModel(); return null; } public OutlineViewer getOutlineViewer() { return outlineViewer; } public ISelection getSelection() { return selection; } public EditPartViewer getTreeEditorViewer() { return treeEditorViewer; } protected Object getVisibleContents(Object contents) { if (contents instanceof Resource && !((Resource) contents).getContents().isEmpty()) return ((Resource) contents).getContents().get(0); return contents; } protected void initializeOutlineViewer() { setViewerContents(getVisibleContents(getEditorModel())); } public void refreshSelection() { if (getOutlineViewer() != null && getOutlineViewer().getControl() != null && !getOutlineViewer().getControl().isDisposed()) getOutlineViewer().refreshSelection(); } public void removeSelectionChangedListener( ISelectionChangedListener listener) { listeners.remove(listener); } public void selectionChanged(SelectionChangedEvent event) { // we notify all the selectionChangedListeners of this viewer setSelection(event.getSelection()); } @Override public void setFocus() { if (container != null && !container.isDisposed()) container.setFocus(); } public void setSelection(ISelection selection) { if (selection == null) { if (this.selection == null) return; } else if (selection.equals(this.selection)) return; SelectionChangedEvent e = new SelectionChangedEvent(this, selection); if (getOutlineViewer() != null) getOutlineViewer().selectionChanged(e); this.selection = selection; if (listeners == null) return; for (int i = 0; i < listeners.size(); i++) { ((ISelectionChangedListener) listeners.get(i)).selectionChanged(e); } } protected void setViewerContents(Object newContents) { if (newContents instanceof EObject) { getOutlineViewer().setContents( EcoreUtil.copy((EObject) newContents)); } else getOutlineViewer().setContents(newContents); if (newContents instanceof Notifier) container.layout(true, true); } }