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.presenter; import org.eclipse.jface.dialogs.Dialog; 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.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.ListViewer; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.Viewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.PlatformUI; import de.instantouch.model.base.SnakeString; import de.instantouch.model.base.SnakeType; import de.instantouch.model.base.ref.SnakeOption; import de.instantouch.model.base.ref.SnakeTypeSelectionCreator; import de.instantouch.model.collections.SnakeEntity; import de.instantouch.model.collections.SnakeList; import de.instantouch.model.exception.SnakeModelException; import de.instantouch.model.log.SnakeLog; import de.instanttouch.api.model.ISnakeModification; import de.instanttouch.ui.scaffolding.swt.Activator; import de.instanttouch.ui.scaffolding.swt.dialog.SnakeDialog; import de.instanttouch.ui.scaffolding.swt.dialog.SnakeSelectTypeDialog; import de.instanttouch.ui.scaffolding.swt.error.SnakeExceptionHandler; import de.instanttouch.ui.scaffolding.swt.extensions.SnakeDialogRegistry; import de.instanttouch.ui.scaffolding.swt.viewer.SnakeScrolledComposite; import de.instanttouch.ui.scaffolding.swt.viewer.SnakeTableViewer; import de.instanttouch.ui.scaffolding.swt.viewer.SnakeViewerFilter; public class SnakeListPresenter<T extends SnakeType> extends SnakePresenter { protected SnakeList<T> list = null; private ListViewer elements = null; private SnakeTableViewer tableViewer = null; protected boolean allowOk = true; private boolean bValidate = false; protected IDoubleClickListener doubleClickListener; public SnakeListPresenter(Composite parent, int style, SnakeList<T> list, boolean allowOk) { super(parent, style, list); this.list = list; this.allowOk = allowOk; } @Override public void init(Object layoutData, boolean bValidate) { this.bValidate = bValidate; composite.setLayoutData(layoutData); composite.setLayout(new GridLayout(6, false)); Label label = new Label(composite, SWT.NONE); label.setText(list.getName()); String desc = type.getConstraints().getDescription(); if (desc != null) { label.setToolTipText(desc); } GridData labelLayoutData = new GridData(); // labelLayoutData.widthHint = 100; label.setLayoutData(labelLayoutData); if (type.getConstraints().isEnabled()) { Button configure = new Button(composite, SWT.PUSH); String path = "icons/add.png"; Image image = Activator.getImage(path); configure.setImage(image); configure.setText("add"); configure.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { add(); } }); Button delete = new Button(composite, SWT.PUSH); path = "icons/delete.png"; image = Activator.getImage(path); delete.setImage(image); delete.setText("del"); delete.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { ISelection selection = tableViewer != null ? tableViewer.getSelection() : elements.getSelection(); if (selection instanceof IStructuredSelection) { IStructuredSelection structuredSelection = (IStructuredSelection) selection; Object selected = structuredSelection.getFirstElement(); if (selected instanceof SnakeType) { T type = (T) selected; list.remove(type); refresh(); } } } }); String count = "(" + list.size() + " elements)"; label = new Label(composite, SWT.NONE); label.setText(count); desc = type.getConstraints().getDescription(); if (desc != null) { label.setToolTipText(desc); } } boolean tableCanBeUsed = false; try { SnakeType innerType = list.newElement(); if (innerType != null && innerType.handleAsBasic()) { tableCanBeUsed = true; } else if (innerType instanceof SnakeEntity) { tableCanBeUsed = SnakeTableViewer.onlyBasicTypes((SnakeEntity) innerType); } } catch (Exception e) { SnakeLog.log(e); } GridData listLayoutData = new GridData(GridData.FILL_BOTH); listLayoutData.widthHint = 200; listLayoutData.heightHint = 100; listLayoutData.horizontalSpan = 6; if (tableCanBeUsed) { try { boolean matchName = true; SnakeViewerFilter filter = new SnakeViewerFilter(new SnakeString("filter pattern"), matchName); SnakeComposite filterComposite; try { filterComposite = filter.createComposite(composite); GridData gridData = new GridData(); // gridData.widthHint = 250; filterComposite.setLayoutData(gridData); } catch (SnakeModelException e) { SnakeExceptionHandler.handle(e); } SnakeScrolledComposite scrolledComposite = new SnakeScrolledComposite(composite, SWT.NONE); scrolledComposite.setLayout(new GridLayout(6, false)); scrolledComposite.setLayoutData(listLayoutData); tableViewer = new SnakeTableViewer(scrolledComposite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION, list); tableViewer.getTable().setLayoutData(listLayoutData); tableViewer.addFilter(filter); tableViewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { selectOption(event); } }); scrolledComposite.setContent(tableViewer.getTable()); } catch (SnakeModelException e) { SnakeLog.warning("failed creating SnakeTableViewer for list:" + list.getClass().getCanonicalName()); } } if (!tableCanBeUsed || tableViewer == null) { elements = new ListViewer(composite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL); elements.getControl().setLayoutData(listLayoutData); elements.setLabelProvider(new LabelProvider() { @Override public Image getImage(Object element) { // TODO Auto-generated method stub return super.getImage(element); } @Override public String getText(Object element) { if (element instanceof SnakeType) { SnakeType type = (SnakeType) element; return /* * TODO really needed ? type.getName() + * ", value= " + */type.toString(); } return super.getText(element); } }); elements.setContentProvider(new IStructuredContentProvider() { @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { // TODO Auto-generated method stub } @Override public void dispose() { // TODO Auto-generated method stub } @Override public Object[] getElements(Object inputElement) { return list.all().toArray(); } }); elements.setInput(list); elements.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { selectOption(event); } }); elements.addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { if (list instanceof SnakeOption) { SnakeDialog snakeDialog = getDialog(); if (snakeDialog != null) { snakeDialog.close(); } } else { ISelection selection = event.getSelection(); if (selection instanceof IStructuredSelection) { IStructuredSelection structuredSelection = (IStructuredSelection) selection; Object selected = structuredSelection.getFirstElement(); if (selected instanceof SnakeType) { SnakeType type = (SnakeType) selected; open(type); } } } } }); } } protected void open(SnakeType type) { Dialog typeDialog = SnakeDialogRegistry.createForType(composite.getShell(), type, true, bValidate); if (typeDialog != null) { if (Dialog.OK == typeDialog.open()) { refresh(); } } } protected void add() { try { // create element if (list.getElementCreator() instanceof SnakeTypeSelectionCreator) { SnakeTypeSelectionCreator creator = (SnakeTypeSelectionCreator) list.getElementCreator(); Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(); SnakeSelectTypeDialog selectDialog = new SnakeSelectTypeDialog(shell, creator, "select element type"); if (selectDialog.open() != Dialog.OK) { return; } } T type = list.newElement(); type.setParent(list); SnakeType dialogType = type.getReference() == null ? type : type.getReference(); // edit new element Dialog dialog = SnakeDialogRegistry.createForType(composite.getShell(), dialogType, allowOk, bValidate); if (dialog.open() == Dialog.OK) { list.add(type); refresh(); } else { type.setParent(null); } } catch (Exception e) { SnakeExceptionHandler.handle(e); } } public void refresh() { if (tableViewer != null) { tableViewer.setInput(list); tableViewer.refresh(); } else if (elements != null) { elements.setInput(list); elements.refresh(); } } @Override public void update(ISnakeModification iModification) { refresh(); } private void selectOption(SelectionChangedEvent event) { if (!(list instanceof SnakeOption)) { return; } SnakeOption options = (SnakeOption) list; ISelection selection = event.getSelection(); if (selection instanceof IStructuredSelection) { IStructuredSelection structuredSelection = (IStructuredSelection) selection; Object selected = structuredSelection.getFirstElement(); if (selected instanceof SnakeType) { SnakeType selectedChild = (SnakeType) selected; options.clearSelection(); options.setSelected(selectedChild); } } } }