|
What this is
Other links
The source code/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License * Version 1.0 (the "License"). You may not use this file except in * compliance with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is NetBeans. The Initial Developer of the Original * Code is Sun Microsystems, Inc. Portions Copyright 1997-2000 Sun * Microsystems, Inc. All Rights Reserved. */ package org.netbeans.modules.vcs.advanced.commands; import java.awt.datatransfer.*; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Collection; import java.util.IdentityHashMap; import java.util.Iterator; import java.util.Map; import org.openide.cookies.InstanceCookie; import org.openide.nodes.*; import org.openide.util.datatransfer.PasteType; import org.netbeans.modules.vcscore.commands.VcsCommand; import org.netbeans.modules.vcscore.util.VcsUtilities; import org.netbeans.modules.vcs.advanced.commands.ConditionedCommandsBuilder.ConditionedPropertiesCommand; import org.netbeans.modules.vcs.advanced.commands.ConditionedCommandsBuilder.ConditionedProperty; import org.netbeans.modules.vcs.advanced.variables.Condition; import org.netbeans.modules.vcscore.cmdline.UserCommand; import org.netbeans.modules.vcscore.cmdline.UserCommandSupport; class CommandCopySupport extends Object { public static DataFlavor COMMAND_COPY_FLAVOR = new CommandDataFlavor( CommandNode.class, "COMMAND_COPY_FLAVOR"); // NOI18N public static DataFlavor COMMAND_CUT_FLAVOR = new CommandDataFlavor( CommandNode.class, "COMMAND_COPY_FLAVOR"); // NOI18N static class CommandDataFlavor extends DataFlavor { private static final long serialVersionUID = 6305496575494482601L; CommandDataFlavor(Class representationClass, String name) { super(representationClass, name); } } // ----------- public static class CommandTransferable implements Transferable { private CommandNode cmd; private DataFlavor[] flavors; CommandTransferable(DataFlavor flavor, CommandNode cmd) { this(new DataFlavor[] { flavor }, cmd); } CommandTransferable(DataFlavor[] flavors, CommandNode cmd) { this.flavors = flavors; this.cmd = cmd; } public DataFlavor[] getTransferDataFlavors() { return flavors; } public boolean isDataFlavorSupported(DataFlavor flavor) { for (int i = 0; i < flavors.length; i++) { if (flavors[i] == flavor) { // comparison based on exact instances, as these are static in this node return true; } } return false; } public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, java.io.IOException { if (flavor instanceof CommandDataFlavor) { return cmd; } throw new UnsupportedFlavorException(flavor); } } // ----------- /** Method for checking whether a component can be moved to a container * (the component should not be pasted to its own sub-container * or even to itself). * public static boolean canPasteCut(VcsCommand sourceCmd, FormModel targetForm, ComponentContainer targetContainer) { if (sourceComponent.getFormModel() != targetForm) return true; if (targetContainer == null || targetContainer == targetForm.getModelContainer()) return targetForm.getModelContainer().getIndexOf(sourceComponent) < 0; RADComponent targetComponent = (RADComponent) targetContainer; return sourceComponent != targetComponent && sourceComponent.getParentComponent() != targetComponent && !sourceComponent.isParentComponent(targetComponent); } */ // ----------- /** Paste type for meta components. */ public static class CommandPaste extends PasteType { private Transferable transferable; private CommandNode targetNode; //private FormModel targetForm; public CommandPaste(Transferable t, CommandNode targetNode) { //FormModel targetForm) { this.transferable = t; this.targetNode = targetNode; //this.targetForm = targetForm; } public Transferable paste() throws java.io.IOException { boolean fromCut = transferable.isDataFlavorSupported(COMMAND_CUT_FLAVOR); CommandNode sourceNode = null; try { sourceNode = (CommandNode) transferable.getTransferData(fromCut ? COMMAND_CUT_FLAVOR : COMMAND_COPY_FLAVOR); } catch (java.io.IOException e) { } // ignore - should not happen catch (UnsupportedFlavorException e) { } // ignore - should not happen //if (sourceCommand == null) // return null; if (!fromCut) { // pasting copy of RADComponent copyCommands(sourceNode, targetNode); /* targetForm.getComponentCreator() .copyComponent(sourceComponent, targetContainer); */ return null; } else { // pasting cut RADComponent (same instance) if (!targetNode.equals(sourceNode.getParentNode())) { //CommandNode newNode = new CommandNode(Children.LEAF, sourceCommand.getCommand()); sourceNode.destroy(); copyCommands(sourceNode, targetNode); //targetNode.getChildren().add(new Node[] { newNode }); return null; } /* FormModel sourceForm = sourceComponent.getFormModel(); if (sourceForm != targetForm) { // taken from another form Node sourceNode = sourceComponent.getNodeReference(); // delete component in the source if (sourceNode != null) sourceNode.destroy(); else throw new IllegalStateException(); sourceComponent.initialize(targetForm); } else { // moving within the same form if (!canPasteCut(sourceComponent, targetForm, targetContainer)) return transferable; // ignore paste // remove source component from its parent sourceForm.removeComponent(sourceComponent); } */ // return new copy flavor, as the first one was used already return new CommandTransferable(COMMAND_COPY_FLAVOR, sourceNode); } } } private static UserCommand copyVcsCommand(VcsCommand cmd) { if (cmd == null) return null; UserCommand newCmd = new UserCommand(); newCmd.setName(cmd.getName()); newCmd.setDisplayName(cmd.getDisplayName()); String[] propNames = cmd.getPropertyNames(); for (int i = 0; i < propNames.length; i++) { newCmd.setProperty(propNames[i], cmd.getProperty(propNames[i])); } return newCmd; } private static void copyCommands(CommandNode sourceNode, CommandNode targetNode) { VcsCommand scmd = sourceNode.getCommand(); Condition mc = sourceNode.getMainCondition(); Collection cproperties = sourceNode.getConditionedProperties(); Children ch; if (Children.LEAF.equals(sourceNode.getChildren())) { ch = Children.LEAF; } else { ch = new Children.Array(); } UserCommand cmd = copyVcsCommand(scmd); if (cmd != null) { cmd.setName(VcsUtilities.createUniqueName(cmd.getName(), targetNode.getAllCommandsNames())); } CommandNode newNode; if (cproperties != null) { //CommandsTree ct = new CommandsTree(new UserCommandSupport(cmd, null)); //ConditionedCommandsBuilder ccbuilder = new ConditionedCommandsBuilder() ConditionedPropertiesCommand cpc = new ConditionedPropertiesCommand(new UserCommandSupport(cmd, null)); for (Iterator it = cproperties.iterator(); it.hasNext(); ) { ConditionedProperty cp = (ConditionedProperty) it.next(); Condition c = cp.getCondition(); if (c != null) c = (Condition) c.clone(); Map valuesByConditions = new IdentityHashMap(); Map vbc = cp.getValuesByConditions(); for (Iterator vbcIt = vbc.keySet().iterator(); vbcIt.hasNext(); ) { Condition vc = (Condition) vbcIt.next(); Object value = vbc.get(vc); if (vc != null) vc = (Condition) vc.clone(); if (value instanceof Cloneable) { try { Method cloneM = value.getClass().getMethod("clone", new Class[0]); value = cloneM.invoke(value, new Object[0]); } catch (NoSuchMethodException nsmex) { } catch (SecurityException sex) { } catch (IllegalAccessException iaex) { } catch (IllegalArgumentException iaex) { } catch (InvocationTargetException itex) { } } valuesByConditions.put(vc, value); } cp = new ConditionedProperty(cp.getName(), c, valuesByConditions); cpc.addConditionedProperty(cp); } if (mc != null) mc = (Condition) mc.clone(); newNode = new CommandNode(ch, cmd, mc, cpc); } else { newNode = new CommandNode(ch, cmd); } targetNode.getChildren().add(new Node[] { newNode }); Node[] sourceSubnodes = sourceNode.getChildren().getNodes(); for (int i = 0; i < sourceSubnodes.length; i++) { copyCommands((CommandNode) sourceSubnodes[i], newNode); } } } |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.