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
+
+
+
+
+
+
+
+
+
+
+