/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.directory.studio.connection.ui.dnd;
import java.util.Set;
import org.apache.directory.studio.connection.core.Connection;
import org.apache.directory.studio.connection.core.ConnectionCorePlugin;
import org.apache.directory.studio.connection.core.ConnectionFolder;
import org.apache.directory.studio.connection.core.ConnectionFolderManager;
import org.apache.directory.studio.connection.core.ConnectionManager;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.dnd.DropTargetListener;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
/**
* This class implements a {@link DropTargetListener} that is used to
* drag and drop connections within the connections view.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class DropConnectionListener implements DropTargetListener
{
/**
* {@inheritDoc}
*
* This implementation checks if the event's data type is
* supported. If not supported dropping is rejected.
*/
public void dragEnter( DropTargetEvent event )
{
if ( !ConnectionTransfer.getInstance().isSupportedType( event.currentDataType ) )
{
event.detail = DND.DROP_NONE;
}
}
/**
* {@inheritDoc}
*
* This implementation just calls {@link #dragOver(DropTargetEvent)}.
*/
public void dragOperationChanged( DropTargetEvent event )
{
dragOver( event );
}
/**
* {@inheritDoc}
*
* This implementation does nothing.
*/
public void dragLeave( DropTargetEvent event )
{
}
/**
* {@inheritDoc}
*
* This implementation checks if the event's data type is
* supported. If not supported dropping is rejected.
*/
public void dragOver( DropTargetEvent event )
{
try
{
// move connection folder: check that the new connection folder is not the same or a parent folder
boolean isMoveConnectionFolderForbidden = false;
if ( ( ( event.detail == DND.DROP_MOVE ) || ( event.detail == DND.DROP_NONE ) ) &&
( ConnectionTransfer.getInstance().isSupportedType( event.currentDataType ) ) &&
( ( event.item != null ) && ( event.item.getData() instanceof ConnectionFolder ) ) )
{
ConnectionFolderManager connectionFolderManager = ConnectionCorePlugin.getDefault()
.getConnectionFolderManager();
ConnectionFolder overFolder = ( ConnectionFolder ) event.item.getData();
Set<ConnectionFolder> allParentFolders = connectionFolderManager
.getAllParentFolders( overFolder );
if ( event.widget instanceof DropTarget )
{
DropTarget dropTarget = ( DropTarget ) event.widget;
if ( dropTarget.getControl() instanceof Tree )
{
Tree tree = ( Tree ) dropTarget.getControl();
for ( TreeItem treeItem : tree.getSelection() )
{
if ( treeItem.getData() instanceof ConnectionFolder )
{
ConnectionFolder folder = ( ConnectionFolder ) treeItem.getData();
if ( allParentFolders.contains( folder ) )
{
isMoveConnectionFolderForbidden = true;
break;
}
}
}
}
}
}
if ( !ConnectionTransfer.getInstance().isSupportedType( event.currentDataType ) )
{
event.detail = DND.DROP_NONE;
}
else if ( isMoveConnectionFolderForbidden )
{
event.detail = DND.DROP_NONE;
}
else if ( event.detail == DND.DROP_LINK )
{
event.detail = DND.DROP_NONE;
}
else if ( event.detail == DND.DROP_NONE )
{
event.detail = DND.DROP_DEFAULT;
}
}
catch ( Exception e )
{
event.detail = DND.DROP_NONE;
e.printStackTrace();
}
}
/**
* {@inheritDoc}
*
* This implementation does nothing.
*/
public void dropAccept( DropTargetEvent event )
{
}
/**
* {@inheritDoc}
*
* This implementation drops the dragged connection to
* the selected position.
*/
public void drop( DropTargetEvent event )
{
ConnectionManager connectionManager = ConnectionCorePlugin.getDefault().getConnectionManager();
ConnectionFolderManager connectionFolderManager = ConnectionCorePlugin.getDefault()
.getConnectionFolderManager();
try
{
if ( ConnectionTransfer.getInstance().isSupportedType( event.currentDataType ) )
{
// get connection and folders to handle
Object[] objects = ( Object[] ) event.data;
Object target;
if ( event.item == null )
{
target = connectionFolderManager .getRootConnectionFolder();
}
else
{
target = event.item.getData();
}
ConnectionFolder targetFolder = null;
if ( target instanceof ConnectionFolder )
{
targetFolder = ( ConnectionFolder ) target;
}
else if ( target instanceof Connection )
{
Connection connection = ( Connection ) target;
targetFolder = connectionFolderManager.getParentConnectionFolder( connection );
}
for ( Object object : objects )
{
if ( object instanceof Connection )
{
Connection connection = ( Connection ) object;
if ( event.detail == DND.DROP_MOVE )
{
ConnectionFolder parentConnectionFolder = connectionFolderManager
.getParentConnectionFolder( connection );
parentConnectionFolder.removeConnectionId( connection.getId() );
targetFolder.addConnectionId( connection.getId() );
}
else if ( event.detail == DND.DROP_COPY )
{
Connection newConnection = ( Connection ) connection.clone();
connectionManager.addConnection( newConnection );
targetFolder.addConnectionId( newConnection.getId() );
}
}
else if ( object instanceof ConnectionFolder )
{
ConnectionFolder folder = ( ConnectionFolder ) object;
if ( event.detail == DND.DROP_MOVE )
{
ConnectionFolder parentConnectionFolder = connectionFolderManager
.getParentConnectionFolder( folder );
parentConnectionFolder.removeSubFolderId( folder.getId() );
targetFolder.addSubFolderId( folder.getId() );
// TODO: expand target folder
}
else if ( event.detail == DND.DROP_COPY )
{
ConnectionFolder newFolder = ( ConnectionFolder ) folder.clone();
connectionFolderManager.addConnectionFolder( newFolder );
targetFolder.addSubFolderId( newFolder.getId() );
// TODO: expand target folder
}
}
}
}
else
{
event.detail = DND.DROP_NONE;
}
}
catch ( Exception e )
{
event.detail = DND.DROP_NONE;
e.printStackTrace();
}
}
}