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 org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IContentProvider; import org.eclipse.jface.viewers.IDoubleClickListener; 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.TableViewer; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.PlatformUI; import de.instantouch.model.base.SnakeString; import de.instantouch.model.base.SnakeType; import de.instantouch.model.collections.SnakeEntity; import de.instantouch.model.collections.SnakeList; import de.instantouch.model.collections.SnakeMap; import de.instantouch.model.exception.SnakeModelException; import de.instantouch.model.exception.SnakeNotImplementedException; import de.instantouch.model.exception.SnakeWrongTypeException; 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.error.SnakeExceptionHandler; import de.instanttouch.ui.scaffolding.swt.extensions.SnakeDialogRegistry; public class SnakeTableViewer extends TableViewer { protected SnakeType type = null; protected SnakeString pattern = null; protected SnakeAction doubleClickAction = new SnakeOpenAction("open type dialog"); protected SnakeAction selectAction = null; private IContentProvider contentProvider = null; public SnakeTableViewer(Composite parent, int style, SnakeType type) throws SnakeModelException { super(parent, style); this.type = type; create(parent); } protected void create(Composite parent) throws SnakeModelException { Table table = getTable(); if (type instanceof SnakeMap) { TableColumn column = new TableColumn(table, SWT.NONE); column.setWidth(20); column.setText(""); column.setResizable(false); column = new TableColumn(table, SWT.NONE); column.setWidth(100); column.setText("key"); column.setResizable(true); column = new TableColumn(table, SWT.NONE); column.setWidth(300); column.setText("value"); column.setResizable(true); } else if (type instanceof SnakeList) { SnakeType innerType; try { innerType = ((SnakeList) type).newElement(); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException e2) { throw new SnakeModelException(e2.getMessage()); } TableColumn column = new TableColumn(table, SWT.NONE); column.setWidth(20); column.setText(""); column.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (e.getSource() instanceof TableColumn) { try { sort((TableColumn) e.getSource()); } catch (SnakeModelException e1) { SnakeExceptionHandler.handle(e1); } } } }); if (innerType.handleAsBasic()) { column = new TableColumn(table, SWT.NONE); column.setWidth(300); column.setText(innerType.getName()); column.setResizable(true); } else if (innerType instanceof SnakeEntity) { SnakeEntity entity = (SnakeEntity) innerType; if (!onlyBasicTypes(entity)) { throw new SnakeWrongTypeException( "entity: " + entity.getName() + " cannot be displaed in SnakeTableViewer"); } for (SnakeType child : entity.getVisibleChildren()) { column = new TableColumn(table, SWT.NONE); double width = child.getConstraints().hasWidth() ? child.getConstraints().getWidth() : 100; Double convert = new Double(width); column.setWidth(convert.intValue()); column.setResizable(true); column.setText(child.getName()); column.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (e.getSource() instanceof TableColumn) { try { sort((TableColumn) e.getSource()); } catch (SnakeModelException e1) { SnakeExceptionHandler.handle(e1); } } } }); if (child instanceof SnakeString) { SnakeString asString = (SnakeString) child; if (asString.getConstraints().isLarge()) { column.setWidth(250); } } } } } GridData layoutData = new GridData(GridData.FILL_BOTH); // layoutData.widthHint = 100; // layoutData.heightHint = 50; getControl().setLayoutData(layoutData); setLabelProvider(new SnakeTableLabelProvider()); contentProvider = new SnakeStructuredContentProvider(); setContentProvider(contentProvider); getTable().setLinesVisible(true); setInput(type); addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { ISelection selection = event.getSelection(); if (selection instanceof IStructuredSelection) { IStructuredSelection structuredSelection = (IStructuredSelection) selection; Object selected = structuredSelection.getFirstElement(); if (selected instanceof SnakeType) { if (selected != getInput() && doubleClickAction != null) { doubleClickAction.setInput((SnakeType) selected); doubleClickAction.run(); refresh(); } } } } }); addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { ISelection selection = event.getSelection(); if (selection instanceof IStructuredSelection) { IStructuredSelection structuredSelection = (IStructuredSelection) selection; Object selected = structuredSelection.getFirstElement(); if (selected instanceof SnakeType) { if (selected != getInput() && selectAction != null) { selectAction.setInput((SnakeType) selected); selectAction.run(); refresh(); } } } } }); table.setHeaderVisible(true); table.setLinesVisible(true); 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 static boolean onlyBasicTypes(SnakeEntity struct) { boolean onlyBasic = true; for (SnakeType child : struct.getChildren()) { if (!child.handleAsBasic()) { onlyBasic = false; break; } } return onlyBasic; } protected void open(SnakeType type) { boolean bValidate = false; boolean allowOk = true; Dialog typeDialog = SnakeDialogRegistry.createForType(getTable().getShell(), type, allowOk, bValidate); if (typeDialog != null) { if (Dialog.OK == typeDialog.open()) { refresh(); } } } public void setDoubleClickAction(SnakeAction doubleClickAction) { this.doubleClickAction = doubleClickAction; } public SnakeAction getSelectAction() { return selectAction; } public void setSelectAction(SnakeAction selectAction) { this.selectAction = selectAction; } @Override public void addFilter(final ViewerFilter filter) { if (filter instanceof SnakeViewerFilter) { final SnakeViewerFilter myFilter = (SnakeViewerFilter) filter; SnakeString pattern = myFilter.getPattern(); if (pattern != null) { ISnakeTypeListener listener = new ISnakeTypeListener() { @Override public void onChange(ISnakeModification modification) { refresh(); } }; pattern.addListener(listener); } } super.addFilter(filter); } public SnakeViewerFilter getFilter(int index) { SnakeViewerFilter jdsiFilter = null; if (index < getFilters().length) { ViewerFilter filter = getFilters()[index]; if (filter instanceof SnakeViewerFilter) { jdsiFilter = (SnakeViewerFilter) filter; } } return jdsiFilter; } @SuppressWarnings("unchecked") protected void sort(TableColumn column) throws SnakeModelException { int index = -1; if (type instanceof SnakeList) { for (int i = 0; i < getTable().getColumnCount(); i++) { TableColumn checkColumn = getTable().getColumn(i); if (checkColumn == column) { index = i; break; } } if (getTable().getSortColumn() == column) { int sortDirection = getTable().getSortDirection(); sortDirection = sortDirection == SWT.UP ? SWT.DOWN : SWT.UP; getTable().setSortDirection(sortDirection); } else { getTable().setSortDirection(SWT.UP); getTable().setSortColumn(column); } if (contentProvider instanceof SnakeStructuredContentProvider) { SnakeStructuredContentProvider jdsiContentProvider = (SnakeStructuredContentProvider) contentProvider; if (index == 0) { jdsiContentProvider.noSort(); } else { jdsiContentProvider.sortBy(column.getText(), getTable().getSortDirection()); } } else { throw new SnakeNotImplementedException("implement sort in lazy Vector"); } refresh(); } else { throw new SnakeWrongTypeException("are any other types than list needed?"); } } @Override protected Object[] filter(Object[] elements) { return super.filter(elements); } public SnakeType getFirstSelected() { SnakeType selected = null; ISelection selection = getSelection(); if (selection instanceof IStructuredSelection) { Object type = ((IStructuredSelection) selection).getFirstElement(); if (type instanceof SnakeType) { selected = (SnakeType) type; } } return selected; } }