/******************************************************************************* * Copyright (C) 2011, Dariusz Luksza <dariusz@luksza.org> * * 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 *******************************************************************************/ package org.eclipse.egit.ui.internal.synchronize.mapping; import static org.eclipse.egit.ui.internal.CommonUtils.runCommand; import static org.eclipse.egit.ui.internal.actions.ActionCommands.ADD_TO_INDEX; import static org.eclipse.egit.ui.internal.actions.ActionCommands.REMOVE_FROM_INDEX; import java.util.Iterator; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.egit.ui.internal.synchronize.model.GitModelCache; import org.eclipse.egit.ui.internal.synchronize.model.GitModelCacheFile; import org.eclipse.egit.ui.internal.synchronize.model.GitModelCacheTree; import org.eclipse.egit.ui.internal.synchronize.model.GitModelWorkingFile; import org.eclipse.egit.ui.internal.synchronize.model.GitModelWorkingTree; import org.eclipse.jface.util.LocalSelectionTransfer; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.swt.dnd.DropTargetEvent; import org.eclipse.swt.dnd.TransferData; import org.eclipse.swt.dnd.URLTransfer; import org.eclipse.ui.navigator.CommonDropAdapter; import org.eclipse.ui.navigator.CommonDropAdapterAssistant; /** * Drop Adapter Assistant for the Git Change Set model */ public class GitChangeSetDropAdapterAssistant extends CommonDropAdapterAssistant { private static final URLTransfer SELECTION_TRANSFER = URLTransfer .getInstance(); /** * Stage operation type */ private static final String STAGE_OP = "STAGE"; //$NON-NLS-1$ /** * Unstage operation type */ private static final String UNSTAGE_OP = "UNSTAGE"; //$NON-NLS-1$ /** * Unsupported operation type */ private static final String UNSUPPORTED_OP = "UNSUPPORTED"; //$NON-NLS-1$ @Override public IStatus validateDrop(Object target, int operationCode, TransferData transferType) { TreeSelection selection = (TreeSelection) LocalSelectionTransfer .getTransfer().getSelection(); String operation = getOperationType(selection); if (!UNSUPPORTED_OP.equals(operation)) { if (target instanceof GitModelWorkingTree) { if (UNSTAGE_OP.equals(operation)) return Status.OK_STATUS; } else if (STAGE_OP.equals(operation) && target instanceof GitModelCache) return Status.OK_STATUS; } return Status.CANCEL_STATUS; } @Override public IStatus handleDrop(CommonDropAdapter aDropAdapter, DropTargetEvent aDropTargetEvent, Object aTarget) { TreeSelection selection = (TreeSelection) LocalSelectionTransfer .getTransfer().getSelection(); String operation = getOperationType(selection); if (STAGE_OP.equals(operation)) runCommand(ADD_TO_INDEX, selection); else if (UNSTAGE_OP.equals(operation)) runCommand(REMOVE_FROM_INDEX, selection); return Status.OK_STATUS; } @Override public boolean isSupportedType(TransferData aTransferType) { return SELECTION_TRANSFER.isSupportedType(aTransferType); } private String getOperationType(TreeSelection selection) { String operation = null; for (Iterator<?> i = selection.iterator(); i.hasNext();) { String tmpOperation = null; Object next = i.next(); if (next instanceof GitModelWorkingFile) tmpOperation = STAGE_OP; else if (next instanceof GitModelCacheFile) tmpOperation = UNSTAGE_OP; else if (next instanceof GitModelCacheTree) { if (((GitModelCacheTree) next).isWorkingTree()) tmpOperation = STAGE_OP; else tmpOperation = UNSTAGE_OP; } else { operation = UNSUPPORTED_OP; break; } if (operation == null) operation = tmpOperation; else if (!operation.equals(tmpOperation)) { operation = UNSUPPORTED_OP; break; } } return operation; } }