Java tutorial
/******************************************************************************* * Copyright (c) 2014 Joachim Tessmer. * 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: * Joachim Tessmer - initial API and implementation ******************************************************************************/ package de.instanttouch.ui.scaffolding.swt.viewer; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ITreeSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.PlatformUI; import de.instantouch.model.base.SnakeString; import de.instantouch.model.base.SnakeType; import de.instanttouch.api.model.ISnakeModification; import de.instanttouch.api.model.ISnakeTypeListener; import de.instanttouch.ui.scaffolding.swt.action.SnakeAction; import de.instanttouch.ui.scaffolding.swt.action.SnakeActionRegistry; import de.instanttouch.ui.scaffolding.swt.action.SnakeOpenAction; import de.instanttouch.ui.scaffolding.swt.dnd.ISnakeDnDContainer; import de.instanttouch.ui.scaffolding.swt.dnd.SnakeDragSource; import de.instanttouch.ui.scaffolding.swt.util.SnakeRefreshJob; public class SnakeTreeViewer extends TreeViewer implements ISnakeDnDContainer { protected SnakeAction doubleClickAction = new SnakeOpenAction("open type dialog"); protected SnakeAction selectAction = null; private Job updateJob = null; public SnakeTreeViewer(Composite parent, int style) { super(parent, style); init(); } private void init() { setLabelProvider(new SnakeLabelProvider()); setContentProvider(new SnakeTreeContentProvider()); addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { if (null != doubleClickAction) { ISelection selection = getSelection(); if (selection instanceof ITreeSelection) { ITreeSelection treeSelection = (ITreeSelection) selection; Object selected = treeSelection.getFirstElement(); if (selected instanceof SnakeType) { if (selected != getInput() && doubleClickAction != null) { if (selectAction != null) { selectAction.setInput(null); selectAction.run(); } doubleClickAction.setInput((SnakeType) selected); doubleClickAction.run(); refresh(); } } } } } }); addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { if (null != selectAction) { ISelection selection = getSelection(); if (selection instanceof ITreeSelection) { ITreeSelection treeSelection = (ITreeSelection) selection; Object selected = treeSelection.getFirstElement(); if (selected instanceof SnakeType) { selected = selected != getInput() ? selected : null; if (selectAction != null) { selectAction.setInput((SnakeType) selected); selectAction.run(); refresh(); } } } } } }); final IMenuListener menuListener = new IMenuListener() { @Override public void menuAboutToShow(IMenuManager manager) { final Object selected; if (getSelection() instanceof TreeSelection) { selected = ((TreeSelection) getSelection()).getFirstElement(); } else { selected = null; } if (selected instanceof SnakeType) { SnakeType type = (SnakeType) selected; for (SnakeAction action : SnakeActionRegistry.getAllAvailableActions(type)) { if (action.getTarget() != null) { // todo check that workbenchpart matches } action.setInput(type); manager.add(action); } } manager.updateAll(true); } }; PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() { @Override public void run() { MenuManager menuManager = new MenuManager(); menuManager.setRemoveAllWhenShown(true); Menu menu = menuManager.createContextMenu(getControl()); getControl().setMenu(menu); menuManager.addMenuListener(menuListener); } }); } public void setInput(SnakeType type) { super.setInput(type); } public SnakeAction getDoubleClickAction() { return doubleClickAction; } public void setDoubleClickAction(SnakeAction doubleClickAction) { this.doubleClickAction = doubleClickAction; } public void setSelectAction(SnakeAction selectAction) { this.selectAction = selectAction; } @Override public void refresh() { if (updateJob == null) { updateJob = new SnakeRefreshJob("refresh tree view") { @Override public void refresh() { if (!getTree().isDisposed()) { SnakeTreeViewer.super.refresh(); } } }; updateJob.setSystem(true); } updateJob.schedule(); } @Override public void addFilter(ViewerFilter filter) { if (filter instanceof SnakeViewerFilter) { SnakeViewerFilter jdsiFilter = (SnakeViewerFilter) filter; SnakeString pattern = jdsiFilter.getPattern(); if (pattern != null) { ISnakeTypeListener listener = new ISnakeTypeListener() { @Override public void onChange(ISnakeModification modification) { refresh(); } }; pattern.addListener(listener); } } super.addFilter(filter); } @Override public SnakeType getFirstChild() { SnakeType type = null; Object selected = null; if (getSelection() instanceof TreeSelection) { selected = ((TreeSelection) getSelection()).getFirstElement(); } else { selected = null; } if (selected instanceof SnakeType) { type = (SnakeType) selected; } return type; } @Override public List<SnakeType> getAllSelected() { List<SnakeType> all = new ArrayList<SnakeType>(); if (getSelection() instanceof TreeSelection) { TreeSelection treeSelection = (TreeSelection) getSelection(); for (Object selected : treeSelection.toList()) { if (selected instanceof SnakeType) { SnakeType type = (SnakeType) selected; all.add(type); } } } return all; } @Override public Viewer getViewer() { return this; } public void startDragSupport() { new SnakeDragSource(this); } public void select(SnakeType jdsiType) { // TODO Auto-generated method stub } }