/* * This file is part of the OpenSCADA project * Copyright (C) 2006-2012 TH4 SYSTEMS GmbH (http://th4-systems.com) * * 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.ca.ui.editor.config; import java.util.Iterator; import java.util.Map; import org.eclipse.jface.action.Action; 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.ColumnWeightData; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TableViewerColumn; import org.eclipse.jface.viewers.ViewerSorter; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Menu; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.PartInitException; import org.openscada.ui.databinding.AdapterHelper; import org.openscada.ui.databinding.observable.ObservableMapContentProvider; public class BasicEditor extends AbstractConfigurationEditor { public static final String EDITOR_ID = "org.openscada.ca.ui.connection.editors.BasicEditor"; private TableViewer viewer; private final Action deleteAction; private final Action insertAction; public BasicEditor () { this ( false ); } public BasicEditor ( final boolean nested ) { super ( nested ); this.deleteAction = new Action ( "Delete" ) { @Override public void run () { handleDelete (); }; }; this.insertAction = new Action ( "Insert" ) { @Override public void run () { handleInsert (); }; }; } @Override public void init ( final IEditorSite site, final IEditorInput input ) throws PartInitException { setPartName ( input.toString () ); setSite ( site ); try { setInput ( input ); } catch ( final Exception e ) { throw new PartInitException ( "Failed to initialize editor", e ); } } @Override protected void setInput ( final IEditorInput input ) { super.setInput ( input ); createViewer (); } private void createViewer () { if ( getEditorInput () != null && this.viewer != null ) { this.viewer.setInput ( getEditorInput ().getDataMap () ); this.viewer.setLabelProvider ( new ConfigurationCellLabelProvider () ); } } @Override public void createPartControl ( final Composite parent ) { this.viewer = new TableViewer ( parent, SWT.FULL_SELECTION | SWT.MULTI ); final TableLayout tableLayout = new TableLayout (); this.viewer.getTable ().setLayout ( tableLayout ); TableViewerColumn col; col = new TableViewerColumn ( this.viewer, SWT.NONE ); col.setLabelProvider ( new ConfigurationCellLabelProvider () ); col.getColumn ().setText ( "Key" ); tableLayout.addColumnData ( new ColumnWeightData ( 100, true ) ); col = new TableViewerColumn ( this.viewer, SWT.NONE ); col.setLabelProvider ( new ConfigurationCellLabelProvider () ); col.getColumn ().setText ( "Value" ); tableLayout.addColumnData ( new ColumnWeightData ( 200, true ) ); this.viewer.getTable ().setHeaderVisible ( true ); this.viewer.setContentProvider ( new ObservableMapContentProvider () ); createViewer (); this.viewer.setSorter ( new ViewerSorter () ); this.viewer.addDoubleClickListener ( new IDoubleClickListener () { @Override public void doubleClick ( final DoubleClickEvent event ) { triggerEditDialog ( event.getSelection () ); } } ); getSite ().setSelectionProvider ( this.viewer ); hookContextMenu ( getEditorSite () ); fillLocalToolBar ( getEditorSite ().getActionBars ().getToolBarManager () ); } protected void triggerEditDialog ( final ISelection selection ) { if ( selection.isEmpty () || ! ( selection instanceof IStructuredSelection ) ) { return; } final Object o = ( (IStructuredSelection)selection ).getFirstElement (); final Map.Entry<?, ?> entry = AdapterHelper.adapt ( o, Map.Entry.class ); if ( entry == null ) { return; } final EntryEditDialog dlg = new EntryEditDialog ( getSite ().getShell (), entry ); if ( dlg.open () == Window.OK ) { updateEntry ( "" + entry.getKey (), dlg.getKey (), dlg.getValue () ); } } @Override public void setFocus () { this.viewer.getControl ().setFocus (); } protected void handleInsert () { final EntryEditDialog dlg = new EntryEditDialog ( getSite ().getShell (), null ); if ( dlg.open () == Window.OK ) { insertEntry ( dlg.getKey (), dlg.getValue () ); } } protected void handleDelete () { final ISelection sel = this.viewer.getSelection (); if ( sel == null || sel.isEmpty () || ! ( sel instanceof IStructuredSelection ) ) { return; } final IStructuredSelection selection = (IStructuredSelection)sel; final Iterator<?> i = selection.iterator (); while ( i.hasNext () ) { final Object o = i.next (); final Map.Entry<?, ?> entry = AdapterHelper.adapt ( o, Map.Entry.class ); if ( entry != null ) { deleteEntry ( "" + entry.getKey () ); } } } // editor actions private void hookContextMenu ( final IEditorSite editorSite ) { 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 ); editorSite.registerContextMenu ( menuMgr, this.viewer ); } private void fillContextMenu ( final IMenuManager manager ) { // Other plug-ins can contribute there actions here manager.add ( this.deleteAction ); manager.add ( new Separator () ); manager.add ( new Separator ( IWorkbenchActionConstants.MB_ADDITIONS ) ); } private void contributeToActionBars ( final IEditorSite editor ) { final IActionBars bars = editor.getActionBars (); fillLocalPullDown ( bars.getMenuManager () ); fillLocalToolBar ( bars.getToolBarManager () ); } public void contribueTo ( final IEditorSite viewSite ) { hookContextMenu ( viewSite ); contributeToActionBars ( viewSite ); } protected void fillLocalToolBar ( final IToolBarManager manager ) { manager.add ( this.deleteAction ); manager.add ( this.insertAction ); } protected void fillLocalPullDown ( final IMenuManager manager ) { manager.add ( this.deleteAction ); manager.add ( this.insertAction ); } }