diff --git a/properties/src/org/netbeans/modules/properties/PropertiesDataNode.java b/properties/src/org/netbeans/modules/properties/PropertiesDataNode.java
--- a/properties/src/org/netbeans/modules/properties/PropertiesDataNode.java
+++ b/properties/src/org/netbeans/modules/properties/PropertiesDataNode.java
@@ -50,14 +50,12 @@ import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.IOException;
-import java.util.*;
import java.text.MessageFormat;
+import java.util.List;
+import java.util.Locale;
import org.openide.DialogDescriptor;
-import org.openide.filesystems.FileLock;
import org.openide.filesystems.FileObject;
-import org.openide.filesystems.FileUtil;
-import org.openide.loaders.DataFolder;
import org.openide.loaders.DataNode;
import org.openide.loaders.DataObject;
import org.openide.nodes.Children;
@@ -124,8 +122,7 @@ public class PropertiesDataNode extends
*/
final class NameUpdater implements PropertyChangeListener {
- /**
- */
+ @Override
public void propertyChange(PropertyChangeEvent e) {
if (DataObject.PROP_FILES.equals(e.getPropertyName())) {
PropertiesDataObject propDO = (PropertiesDataObject) getDataObject();
@@ -172,103 +169,75 @@ public class PropertiesDataNode extends
return new BundleNodeCustomizer((PropertiesDataObject)getDataObject());
}
- /** Creates paste types for this node. Overrides superclass method.
- * @param transferable transferable in clipboard
- * @param types PasteType
's valid for this node. */
@Override
public void createPasteTypes(Transferable transferable, List types) {
super.createPasteTypes(transferable, types);
- // Copy/paste mode?
- int mode = NodeTransfer.COPY;
-
- Node node = NodeTransfer.node(transferable, mode);
-
- if(node == null || !(node instanceof PropertiesLocaleNode)) {
- // Cut/paste mode?
- mode = NodeTransfer.MOVE;
-
- node = NodeTransfer.node(transferable, mode);
-
- if(node == null || !(node instanceof PropertiesLocaleNode))
- return;
-
- PropertiesFileEntry entry = (PropertiesFileEntry)((PropertiesLocaleNode)node).getFileEntry();
- if(((PropertiesDataObject)getDataObject()).files().contains(entry.getFile())) {
+ Element.ItemElem item;
+ Node node = NodeTransfer.node(transferable, NodeTransfer.MOVE);
+ if (node != null && node.canDestroy()) {
+ item = node.getCookie(Element.ItemElem.class);
+ if (item == null || node == getChildren().findChild(item.getKey())) {
return;
}
+ types.add(new EntryPasteType(item, node));
+ } else {
+ item = NodeTransfer.cookie(transferable, NodeTransfer.COPY, Element.ItemElem.class);
+ if (item != null) {
+ types.add(new EntryPasteType(item, null));
+ }
+ }
+ }
+
+ /**
+ * A {@link PasteType} for pasting the key nodes of properties files. This
+ * class adds or updates the property key, value and comment of the copied
+ * node to the properties file of this {@link PropertiesDataNode}. Also
+ * destroys the copied node in case a cut action was performed.
+ */
+ private class EntryPasteType extends PasteType {
+
+ /**
+ * The {@link Element.ItemElem} to paste.
+ */
+ private final Element.ItemElem item;
+
+ /**
+ * The {@link Node} to destroy in case of a cut action.
+ */
+ private final Node node;
+
+ /**
+ * Creates a new instance of {@link EntryPasteType}.
+ *
+ * @param item the {@link Element.ItemElem} to paste
+ * @param node the {@link Node} to destroy in case a cut action was
+ * performed, otherwise it should be {@code null}
+ */
+ public EntryPasteType(final Element.ItemElem item, final Node node) {
+ this.item = item;
+ this.node = node;
}
- PropertiesFileEntry entry = (PropertiesFileEntry)((PropertiesLocaleNode)node).getFileEntry();
- types.add(new EntryPasteType(entry, mode));
- }
+ @Override
+ public Transferable paste() throws IOException {
+ final PropertiesStructure properties = ((PropertiesFileEntry)((PropertiesDataObject)getDataObject())
+ .getPrimaryEntry()).getHandler().getStructure();
+ final Element.ItemElem storedItem = properties.getItem(item.getKey());
- /** Paste type for PropertiesDataNode
. */
- private class EntryPasteType extends PasteType {
-
- /** Entry to copy/move. */
- private PropertiesFileEntry entry;
-
- /** Flag for copying/moving. */
- private int flag;
-
-
- /** Constructor.
- * @param entry entry to copy/move
- * @param flag flag for moving/copying */
- public EntryPasteType(PropertiesFileEntry entry, int flag) {
- this.entry = entry;
- this.flag = flag;
- }
-
- /** Peforms paste action. Implements superclass abstract method.
- * @exception IOException if error occured */
- public Transferable paste() throws IOException {
- DataFolder dataFolder = PropertiesDataNode.this.getDataObject().getFolder();
-
- if(dataFolder == null)
- return null;
-
- FileObject folder = dataFolder.getPrimaryFile();
-
- String newName = getDataObject().getPrimaryFile().getName() + Util.getLocaleSuffix(entry);
-
- int entryIndex = ((PropertiesDataObject)getDataObject()).getBundleStructure().getEntryIndexByFileName(newName);
-
- // Has such item -> find brother.
- if(entryIndex != -1) {
- newName = FileUtil.findFreeFileName(folder, newName, entry.getFile().getExt());
+ if (storedItem == null) {
+ properties.addItem(item.getKey(), item.getValue(), item.getComment());
+ } else {
+ storedItem.setValue(item.getValue());
+ storedItem.setComment(item.getComment());
}
- if(flag == NodeTransfer.COPY) {
- FileObject fileObject = entry.getFile();
- fileObject.copy(folder, newName, fileObject.getExt());
-
- } else if(flag == NodeTransfer.MOVE) {
- FileObject fileObject = entry.getFile();
- FileLock lock = entry.takeLock();
-
- // removing secondary entry from original data object
- ((PropertiesDataObject) entry.getDataObject()).removeSecondaryEntry2(entry);
- try {
- FileObject fo2 = fileObject.move(lock, folder, newName, fileObject.getExt());
- try {
- // Invokes the method for recognition fo2's primary fila and data object.
- // Secondary entry in destination data object is created and registered
- DataObject.find(fo2);
- }
- catch (Exception e) {
- }
- } finally {
- lock.releaseLock ();
- }
+ if (node != null) {
+ node.destroy();
}
-
return null;
}
-
- } // End of class EntryPasteType.
-
+ }
/** New type for properties node. It creates new locale for ths bundle. */
private class NewLocaleType extends NewType {
@@ -280,6 +249,7 @@ public class PropertiesDataNode extends
}
/** Overrides superclass method. */
+ @Override
public void create() throws IOException {
final PropertiesDataObject propertiesDataObject = (PropertiesDataObject)getCookie(DataObject.class);
@@ -293,6 +263,7 @@ public class PropertiesDataNode extends
DialogDescriptor.OK_CANCEL_OPTION,
DialogDescriptor.OK_OPTION,
new ActionListener() {
+ @Override
public void actionPerformed(ActionEvent evt) {
if (evt.getSource() == DialogDescriptor.OK_OPTION) {
if (containsLocale(propertiesDataObject, panel.getLocale())) {