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())) {