Java tutorial
/* * This file is part of the OpenSCADA project * * Copyright (C) 2006-2012 TH4 SYSTEMS GmbH (http://th4-systems.com) * Copyright (C) 2013 Jens Reimann (ctron@dentrassi.de) * * OpenSCADA is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenSCADA is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenSCADA. If not, see * <http://opensource.org/licenses/lgpl-3.0.html> for a copy of the LGPLv3 License. */ package org.openscada.da.ui.widgets.realtime; import java.util.Collection; import java.util.LinkedList; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.viewers.ColumnPixelData; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.swt.SWT; import org.eclipse.swt.dnd.DND; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.dnd.URLTransfer; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.TreeColumn; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IMemento; import org.eclipse.ui.IViewSite; import org.eclipse.ui.IWorkbenchActionConstants; import org.openscada.da.ui.connection.data.Item; import org.openscada.da.ui.connection.dnd.ItemTransfer; import org.openscada.da.ui.widgets.Activator; public class RealTimeListViewer implements RealtimeListAdapter { private final RemoveAction removeAction; private TreeViewer viewer; private final ListData list = new ListData(); private ItemListContentProvider contentProvider; private LinkedList<Integer> initialColWidth; public RealTimeListViewer() { this.removeAction = new RemoveAction(this); } public void createControl(final Composite parent) { parent.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(final DisposeEvent e) { dispose(); } }); this.viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.FULL_SELECTION); TreeViewerColumn col; col = new TreeViewerColumn(this.viewer, SWT.NONE); col.getColumn().setText(Messages.RealTimeListViewer_Col_Text_Id); col.setLabelProvider(new ItemCellLabelProvider()); col = new TreeViewerColumn(this.viewer, SWT.NONE); col.getColumn().setText(Messages.RealTimeListViewer_Col_Text_State); col.setLabelProvider(new ItemCellLabelProvider()); col = new TreeViewerColumn(this.viewer, SWT.NONE); col.getColumn().setText(Messages.RealTimeListViewer_Col_Text_Type); col.setLabelProvider(new ItemCellLabelProvider()); col = new TreeViewerColumn(this.viewer, SWT.NONE); col.getColumn().setText(Messages.RealTimeListViewer_Col_Text_Value); col.setLabelProvider(new ItemCellLabelProvider()); this.viewer.getTree().setHeaderVisible(true); final TableLayout tableLayout = new TableLayout(); applyInitialColWidth(tableLayout); this.viewer.getTree().setLayout(tableLayout); this.viewer.setContentProvider(this.contentProvider = new ItemListContentProvider()); this.viewer.setComparator(new ListEntryComparator()); this.viewer.setInput(this.list); this.viewer.addSelectionChangedListener(this.removeAction); addDragSupport(); addDropSupport(); } protected void applyInitialColWidth(final TableLayout tableLayout) { if (this.initialColWidth != null && !this.initialColWidth.isEmpty()) { for (final Integer w : this.initialColWidth) { tableLayout.addColumnData(new ColumnPixelData(w, true)); } } else { tableLayout.addColumnData(new ColumnWeightData(200, true)); tableLayout.addColumnData(new ColumnWeightData(100, true)); tableLayout.addColumnData(new ColumnWeightData(100, true)); tableLayout.addColumnData(new ColumnWeightData(200, true)); } } public ISelectionProvider getSelectionProvider() { return this.viewer; } public void dispose() { this.viewer.removeSelectionChangedListener(this.removeAction); this.list.clear(); this.contentProvider.dispose(); } @Override public void remove(final ListEntry entry) { this.list.remove(entry); } @Override public void remove(final Collection<ListEntry> entries) { this.list.removeAll(entries); } @Override public void add(final ListEntry entry) { this.list.add(entry); } public void clear() { this.list.clear(); } private void addDropSupport() { this.viewer.addDropSupport(DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK, new Transfer[] { ItemTransfer.getInstance(), TextTransfer.getInstance() }, new ItemDropAdapter(this.viewer, this)); } private void addDragSupport() { this.viewer.addDragSupport( DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK, new Transfer[] { ItemTransfer.getInstance(), URLTransfer.getInstance(), TextTransfer.getInstance() }, new RealtimeListDragSourceListener(this.viewer)); } public void setMenu(final Menu menu) { this.viewer.getControl().setMenu(menu); } public void addDoubleClickListener(final IDoubleClickListener listener) { this.viewer.addDoubleClickListener(listener); } public void removeDoubleClickListener(final IDoubleClickListener listener) { this.viewer.removeDoubleClickListener(listener); } public void loadFrom(final IMemento memento) { if (memento == null) { return; } try { { this.initialColWidth = new LinkedList<Integer>(); final IMemento tableMemento = memento.getChild("tableCols"); //$NON-NLS-1$ if (tableMemento != null) { int i = 0; Integer w; while ((w = tableMemento.getInteger("col_" + i)) != null) //$NON-NLS-1$ { this.initialColWidth.add(w); i++; } } } for (final IMemento child : memento.getChildren("item")) //$NON-NLS-1$ { final Item item = Item.loadFrom(child); if (item != null) { this.list.add(item); } } } catch (final Exception e) { Activator.getDefault().getLog().log(new Status(IStatus.ERROR, Activator.PLUGIN_ID, Messages.RealTimeListViewer_ErrorLoadingData, e)); } } public void saveTo(final IMemento memento) { if (memento == null) { return; } { final IMemento tableMemento = memento.createChild("tableCols"); //$NON-NLS-1$ for (int i = 0; i < this.viewer.getTree().getColumnCount(); i++) { final TreeColumn col = this.viewer.getTree().getColumn(i); tableMemento.putInteger("col_" + i, col.getWidth()); //$NON-NLS-1$ } } for (final ListEntry entry : this.list.getItems()) { final Item item = entry.getItem(); item.saveTo(memento.createChild("item")); //$NON-NLS-1$ } } public void setFocus() { this.viewer.getControl().setFocus(); } private void hookContextMenu(final IViewSite viewSite) { final MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$ menuMgr.setRemoveAllWhenShown(true); menuMgr.addMenuListener(new IMenuListener() { @Override public void menuAboutToShow(final IMenuManager manager) { fillContextMenu(manager); } }); final Menu menu = menuMgr.createContextMenu(this.viewer.getControl()); this.viewer.getControl().setMenu(menu); viewSite.registerContextMenu(menuMgr, this.viewer); } private void fillContextMenu(final IMenuManager manager) { // Other plug-ins can contribute there actions here manager.add(this.removeAction); manager.add(new Separator()); manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); } private void contributeToActionBars(final IViewSite viewSite) { final IActionBars bars = viewSite.getActionBars(); fillLocalPullDown(bars.getMenuManager()); fillLocalToolBar(bars.getToolBarManager()); } public void contribueTo(final IViewSite viewSite) { viewSite.setSelectionProvider(this.viewer); hookContextMenu(viewSite); contributeToActionBars(viewSite); } protected void fillLocalToolBar(final IToolBarManager manager) { manager.add(this.removeAction); } protected void fillLocalPullDown(final IMenuManager manager) { manager.add(this.removeAction); } }