/******************************************************************************* * Copyright (c) 2008 Hallvard Traetteberg. * 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: * Hallvard Traetteberg - initial API and implementation ******************************************************************************/ package org.eclipse.e4.tm.ui; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.emf.edit.domain.IEditingDomainProvider; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IPartListener; import org.eclipse.ui.IViewSite; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.PartInitException; import org.eclipse.ui.actions.TextActionHandler; import org.eclipse.ui.part.ViewPart; public abstract class AbstractTmSelectionView extends ViewPart { protected IEditingDomainProvider editingDomainProvider; protected ISelectionProvider selectionProvider; public void init(IViewSite site) throws PartInitException { super.init(site); getSite().getWorkbenchWindow().getPartService().addPartListener(partListener); } public void dispose() { getSite().getWorkbenchWindow().getPartService().removePartListener(partListener); setEditingDomainProvider(null); super.dispose(); } protected void setEditingDomainProvider(IEditingDomainProvider editingDomainProvider) { if (this.editingDomainProvider == editingDomainProvider) { return; } if (this.editingDomainProvider != null) { } this.editingDomainProvider = editingDomainProvider; if (this.editingDomainProvider != null) { } updateView(); } protected void updateView() { } public Object getAdapter(Class type) { Object o = super.getAdapter(type); if (o == null && editingDomainProvider instanceof IAdaptable) { o = ((IAdaptable)editingDomainProvider).getAdapter(type); } return o; } private void updateProviders(IWorkbenchPart part) { setSelectionProvider(getAdapter(part, ISelectionProvider.class)); setEditingDomainProvider(getAdapter(part, IEditingDomainProvider.class)); } protected <T> T getAdapter(IWorkbenchPart part, Class<T> c) { IWorkbenchPage workbenchPage = getViewSite().getWorkbenchWindow().getActivePage(); if (workbenchPage == null) { return null; } IEditorPart editorPart = workbenchPage.getActiveEditor(); return (editorPart != null ? (T)editorPart.getAdapter(c) : null); } private IPartListener partListener = new IPartListener() { public void partActivated(IWorkbenchPart part) { updateProviders(part); } public void partBroughtToTop(IWorkbenchPart part) { updateProviders(part); } public void partClosed(IWorkbenchPart part) { updateProviders(part); } public void partDeactivated(IWorkbenchPart part) { updateProviders(part); } public void partOpened(IWorkbenchPart part) { updateProviders(part); } }; private ISelectionChangedListener selectionChangedListener = new ISelectionChangedListener(){ public void selectionChanged(SelectionChangedEvent event) { AbstractTmSelectionView.this.selectionChanged(event.getSelection()); } }; protected void setSelectionProvider(ISelectionProvider selectionProvider) { if (this.selectionProvider != null) { this.selectionProvider.removeSelectionChangedListener(selectionChangedListener); selectionChanged(StructuredSelection.EMPTY); } this.selectionProvider = selectionProvider; if (this.selectionProvider != null) { this.selectionProvider.addSelectionChangedListener(selectionChangedListener); selectionChanged(this.selectionProvider.getSelection()); } } protected Object selection = null; public void selectionChanged(SelectionChangedEvent event) { selectionChanged(event.getSelection()); } protected void selectionChanged(ISelection selection) { Object oldSelection = this.selection; this.selection = null; if (selection.isEmpty()) { } else if (selection instanceof IStructuredSelection) { Object o = ((IStructuredSelection)selection).getFirstElement(); if (isValidSelection(o)) { this.selection = o; } } if (this.selection != oldSelection) { updateView(); } } protected boolean isValidSelection(Object o) { return true; } private TextActionHandler textActionHandler; void registerTextControl(final Text textControl) { textControl.addFocusListener(new FocusListener() { public void focusGained(FocusEvent e) { textActionHandler.addText(textControl); } public void focusLost(FocusEvent e) { textActionHandler.removeText(textControl); } }); } public void createPartControl(Composite parent) { textActionHandler = new TextActionHandler(getViewSite().getActionBars()); createActions(); createMenu(); createToolbar(); } protected Text createTextControl(Composite parent, int style) { Text textControl = new Text(parent, style); textActionHandler.addText(textControl); return textControl; } protected void disposeTextControl(Text textControl) { if (! textControl.isDisposed()) { textActionHandler.removeText(textControl); } } protected void createActions() { } private void createMenu() { createMenu(getViewSite().getActionBars().getMenuManager()); } protected void createMenu(IMenuManager mgr) { } private void createToolbar() { createToolbar(getViewSite().getActionBars().getToolBarManager()); } protected void createToolbar(IToolBarManager mgr) { } }