/* * 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.da.ui.widgets.realtime; import java.net.URI; import java.net.URISyntaxException; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerDropAdapter; import org.eclipse.swt.dnd.TextTransfer; import org.eclipse.swt.dnd.TransferData; import org.openscada.da.ui.connection.data.Item; import org.openscada.da.ui.connection.data.Item.Type; import org.openscada.da.ui.connection.dnd.ItemTransfer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class ItemDropAdapter extends ViewerDropAdapter { private final static Logger logger = LoggerFactory.getLogger ( ItemDropAdapter.class ); private final RealtimeListAdapter list; public ItemDropAdapter ( final Viewer viewer, final RealtimeListAdapter list ) { super ( viewer ); this.list = list; setFeedbackEnabled ( true ); setSelectionFeedbackEnabled ( true ); } @Override public boolean performDrop ( final Object data ) { logger.debug ( "Dropping: {}", data ); if ( data instanceof Item[] ) { dropItems ( (Item[])data ); return true; } if ( data instanceof String ) { dropString ( data ); return true; } return false; } private void dropString ( final Object data ) { final TreeViewer viewer = (TreeViewer)getViewer (); final String toks[] = ( (String)data ).split ( "[\\n\\r]+" ); //$NON-NLS-1$ for ( final String tok : toks ) { try { final URI uri = new URI ( tok ); if ( uri.getScheme () == null ) { final String[] stoks = tok.split ( "#" ); final Item item = new Item ( stoks[0], stoks[1], Type.ID ); dropItem ( item, viewer ); } else if ( uri.getFragment () != null ) { final String[] stoks = tok.split ( "#", 2 ); final Item item = new Item ( stoks[0], uri.getFragment (), Type.URI ); dropItem ( item, viewer ); } } catch ( final URISyntaxException e ) { final String[] stoks = tok.split ( "#" ); final Item item = new Item ( stoks[0], stoks[1], Type.ID ); dropItem ( item, viewer ); } } } private void dropItems ( final Item[] items ) { final TreeViewer viewer = (TreeViewer)getViewer (); for ( final Item item : items ) { dropItem ( item, viewer ); } } private void dropItem ( final Item item, final TreeViewer viewer ) { logger.info ( "Dropped item: {} ({})", item, item.getType () ); final ListEntry entry = new ListEntry (); entry.setDataItem ( new Item ( item ) ); this.list.add ( entry ); } @Override public boolean validateDrop ( final Object target, final int operation, final TransferData transferData ) { if ( ItemTransfer.getInstance ().isSupportedType ( transferData ) ) { return true; } if ( TextTransfer.getInstance ().isSupportedType ( transferData ) ) { return true; } return false; } }