Index: core/windows/src/org/netbeans/core/windows/actions/ActionUtils.java =================================================================== RCS file: /cvs/core/windows/src/org/netbeans/core/windows/actions/ActionUtils.java,v --- core/windows/src/org/netbeans/core/windows/actions/ActionUtils.java 1.7.2.1 +++ core/windows/src/org/netbeans/core/windows/actions/ActionUtils.java @@ -213,1 +213,5 @@ - setEnabled(tc instanceof TopComponent.Cloneable); --- + boolean canClone = (tc instanceof TopComponent.Cloneable); + if (tc instanceof TopComponent.Cloneable2) { + canClone = ((TopComponent.Cloneable2)tc).canClone(); + } + setEnabled(canClone); @@ -286,0 +290,6 @@ + if (tc instanceof TopComponent.Cloneable2) { + if (!((TopComponent.Cloneable2)tc).canClone()) { + // shall not get here, but just in case it does, just ignore. + return; + } + } Index: core/windows/src/org/netbeans/core/windows/actions/CloneDocumentAction.java =================================================================== RCS file: /cvs/core/windows/src/org/netbeans/core/windows/actions/CloneDocumentAction.java,v --- core/windows/src/org/netbeans/core/windows/actions/CloneDocumentAction.java 1.5.2.1 +++ core/windows/src/org/netbeans/core/windows/actions/CloneDocumentAction.java @@ -49,1 +49,5 @@ - --- + if (tc instanceof TopComponent.Cloneable2) { + if (!((TopComponent.Cloneable2)tc).canClone()) { + return; + } + } @@ -69,1 +73,5 @@ - setEnabled(tc instanceof TopComponent.Cloneable --- + boolean tcCloneable = (tc instanceof TopComponent.Cloneable); + if (tc instanceof TopComponent.Cloneable2) { + tcCloneable = ((TopComponent.Cloneable2)tc).canClone(); + } + setEnabled(tcCloneable Index: core/windows/src/org/netbeans/core/windows/view/dnd/TopComponentDragSupport.java =================================================================== RCS file: /cvs/core/windows/src/org/netbeans/core/windows/view/dnd/TopComponentDragSupport.java,v --- core/windows/src/org/netbeans/core/windows/view/dnd/TopComponentDragSupport.java 1.9.2.1 +++ core/windows/src/org/netbeans/core/windows/view/dnd/TopComponentDragSupport.java @@ -303,4 +303,3 @@ - if(firstTC instanceof TopComponent.Cloneable) { - canCopy = true; - } else { - canCopy = false; --- + canCopy = (firstTC instanceof TopComponent.Cloneable); + if (firstTC instanceof TopComponent.Cloneable2) { + canCopy = ((TopComponent.Cloneable2)firstTC).canClone(); @@ -816,1 +815,7 @@ - return tc; --- + Object toReturn = tc; + if (tc instanceof TopComponent.Cloneable2) { + if (!((TopComponent.Cloneable2)tc).canClone()) { + toReturn = null; + } + } + return toReturn; @@ -830,10 +835,16 @@ - return new DataFlavor[] { - new DataFlavor(MIME_TOP_COMPONENT, null), - new DataFlavor( - MIME_TOP_COMPONENT_CLONEABLE, null) - }; - } else { - return new DataFlavor[] { - new DataFlavor(MIME_TOP_COMPONENT, null) - }; - } --- + boolean canClone = true; + if (tc instanceof TopComponent.Cloneable2) { + canClone = ((TopComponent.Cloneable2)tc).canClone(); + } + if (canClone) { + return new DataFlavor[] { + new DataFlavor(MIME_TOP_COMPONENT, null), + new DataFlavor( + MIME_TOP_COMPONENT_CLONEABLE, null) + }; + } + // otherwise go with the default.. + } + return new DataFlavor[] { + new DataFlavor(MIME_TOP_COMPONENT, null) + }; @@ -855,1 +866,5 @@ - return true; --- + boolean canClone = true; + if (tc instanceof TopComponent.Cloneable2) { + canClone = ((TopComponent.Cloneable2)tc).canClone(); + } + return canClone; Index: openide/src/org/openide/windows/DummyWindowManager.java =================================================================== RCS file: /cvs/openide/src/org/openide/windows/DummyWindowManager.java,v --- openide/src/org/openide/windows/DummyWindowManager.java 1.6.8.1 +++ openide/src/org/openide/windows/DummyWindowManager.java @@ -202,7 +202,3 @@ - if (DEFAULT_ACTIONS_CLONEABLE == null) { - DEFAULT_ACTIONS_CLONEABLE = loadActions (new String[] { - "Save", // NOI18N - "CloneView", // NOI18N - null, - "CloseView" // NOI18N - }); --- + boolean canClone = true; + if (tc instanceof TopComponent.Cloneable2) { + canClone = ((TopComponent.Cloneable2)tc).canClone(); @@ -210,8 +206,10 @@ - return DEFAULT_ACTIONS_CLONEABLE; - } else { - if (DEFAULT_ACTIONS_NOT_CLONEABLE == null) { - DEFAULT_ACTIONS_NOT_CLONEABLE = loadActions (new String[] { - "Save", // NOI18N - null, - "CloseView" // NOI18N - }); --- + if (canClone) { + if (DEFAULT_ACTIONS_CLONEABLE == null) { + DEFAULT_ACTIONS_CLONEABLE = loadActions (new String[] { + "Save", // NOI18N + "CloneView", // NOI18N + null, + "CloseView" // NOI18N + }); + } + return DEFAULT_ACTIONS_CLONEABLE; @@ -219,2 +217,10 @@ - return DEFAULT_ACTIONS_NOT_CLONEABLE; - } --- + // if cannot clone, go on.. + } + if (DEFAULT_ACTIONS_NOT_CLONEABLE == null) { + DEFAULT_ACTIONS_NOT_CLONEABLE = loadActions (new String[] { + "Save", // NOI18N + null, + "CloseView" // NOI18N + }); + } + return DEFAULT_ACTIONS_NOT_CLONEABLE; Index: openide/src/org/openide/windows/TopComponent.java =================================================================== RCS file: /cvs/openide/src/org/openide/windows/TopComponent.java,v --- openide/src/org/openide/windows/TopComponent.java 1.127.4.1 +++ openide/src/org/openide/windows/TopComponent.java @@ -169,8 +169,14 @@ - am.put("cloneWindow", new javax.swing.AbstractAction() { // NOI18N - public void actionPerformed(ActionEvent evt) { - TopComponent cloned = ((TopComponent.Cloneable) - TopComponent.this).cloneComponent(); - cloned.open(); - cloned.requestActive(); - } - }); --- + boolean canClone = true; + if (this instanceof TopComponent.Cloneable2) { + canClone = ((TopComponent.Cloneable2)this).canClone(); + } + if (canClone) { + am.put("cloneWindow", new javax.swing.AbstractAction() { // NOI18N + public void actionPerformed(ActionEvent evt) { + TopComponent cloned = ((TopComponent.Cloneable) + TopComponent.this).cloneComponent(); + cloned.open(); + cloned.requestActive(); + } + }); + } @@ -767,0 +773,16 @@ + } + + // mkleint - multiviews. + /** + * Extension of TopCpmponent.Cloneable. + *Each top component that wishes to be cloned conditionally should implement + * this interface, so CloneAction can check it and call the cloneComponent + * method. The condition shall be constant during lifecycle of the TopComponent, + * allows to subclass TopComponent.Cloneable classes and prohibit cloning for them. + * + */ + public static interface Cloneable2 extends Cloneable { + /** + * + */ + public boolean canClone(); Index: openide/api/doc/changes/apichanges.xml =================================================================== RCS file: /cvs/openide/api/doc/changes/apichanges.xml,v --- openide/api/doc/changes/apichanges.xml 1.192.4.2 +++ openide/api/doc/changes/apichanges.xml @@ -119,0 +119,41 @@ + + Instance based Cloneability of TopComponents. + + + + + + Introduced new interface TopComponent.Cloneable2 which extends TopComponent.Cloneable and add method canClone(). Classes + implementing this interface can decide wheather a particular instance is cloneable or not. + + + + + + + + + + + + + + In order to implement MultiViews, these changes were necessary to the org.openide.text package. +
    +
  • Added new subinterface to NbDocument -> NbDocument.CustomToolbar which lets the implementors to define a custom toolbar. + It allows to present the toolbar in different environments (eg. multiviews)
  • +
  • CloneableEditorSupport defined a new interface CloneableEditorSupport.Pane and has a new protected method createPane()
  • +
  • The deprecated EditorSupport has a new protected method createPane()
  • +
  • CloneableEditor implements CloneableEditorSupport.Pane, thus + updateTitle was changed from protected to public and 2 additional methods from Pane interfacewere added
  • + +
+
+ + + + + +
+ +