This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

View | Details | Raw Unified | Return to bug 230126
Collapse All | Expand All

(-)a/openide.loaders/src/org/openide/loaders/OpenSupport.java (+1 lines)
Lines 134-139 Link Here
134
    PropertyChangeListener, VetoableChangeListener {
134
    PropertyChangeListener, VetoableChangeListener {
135
        /** generated Serialized Version UID */
135
        /** generated Serialized Version UID */
136
        static final long serialVersionUID = -1934890789745432531L;
136
        static final long serialVersionUID = -1934890789745432531L;
137
137
        /** object to serialize and be connected to*/
138
        /** object to serialize and be connected to*/
138
        private DataObject obj;
139
        private DataObject obj;
139
        
140
        
(-)a/openide.windows/manifest.mf (-1 / +1 lines)
Lines 1-6 Link Here
1
Manifest-Version: 1.0
1
Manifest-Version: 1.0
2
OpenIDE-Module: org.openide.windows
2
OpenIDE-Module: org.openide.windows
3
OpenIDE-Module-Specification-Version: 6.64
3
OpenIDE-Module-Specification-Version: 6.65
4
OpenIDE-Module-Localizing-Bundle: org/openide/windows/Bundle.properties
4
OpenIDE-Module-Localizing-Bundle: org/openide/windows/Bundle.properties
5
AutoUpdate-Essential-Module: true
5
AutoUpdate-Essential-Module: true
6
6
(-)a/openide.windows/src/org/openide/windows/CloneableOpenSupport.java (+5 lines)
Lines 94-99 Link Here
94
     * @see #openCloneableTopComponent
94
     * @see #openCloneableTopComponent
95
     */
95
     */
96
    public void open() {
96
    public void open() {
97
        CloneableOpenSupport redirect = CloneableOpenSupportRedirector.findRedirect(this);
98
        if (redirect != null) {
99
            redirect.open();
100
            return;
101
        }
97
        //Bugfix #10688 open() is now run in AWT thread
102
        //Bugfix #10688 open() is now run in AWT thread
98
        Mutex.EVENT.writeAccess(
103
        Mutex.EVENT.writeAccess(
99
            new Runnable() {
104
            new Runnable() {
(-)a/openide.windows/src/org/openide/windows/CloneableOpenSupportRedirector.java (+121 lines)
Line 0 Link Here
1
/*
2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3
 *
4
 * Copyright 2013 Oracle and/or its affiliates. All rights reserved.
5
 *
6
 * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
7
 * Other names may be trademarks of their respective owners.
8
 *
9
 * The contents of this file are subject to the terms of either the GNU
10
 * General Public License Version 2 only ("GPL") or the Common
11
 * Development and Distribution License("CDDL") (collectively, the
12
 * "License"). You may not use this file except in compliance with the
13
 * License. You can obtain a copy of the License at
14
 * http://www.netbeans.org/cddl-gplv2.html
15
 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
16
 * specific language governing permissions and limitations under the
17
 * License.  When distributing the software, include this License Header
18
 * Notice in each file and include the License file at
19
 * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
20
 * particular file as subject to the "Classpath" exception as provided
21
 * by Oracle in the GPL Version 2 section of the License file that
22
 * accompanied this code. If applicable, add the following below the
23
 * License Header, with the fields enclosed by brackets [] replaced by
24
 * your own identifying information:
25
 * "Portions Copyrighted [year] [name of copyright owner]"
26
 *
27
 * If you wish your version of this file to be governed by only the CDDL
28
 * or only the GPL Version 2, indicate your decision by adding
29
 * "[Contributor] elects to include this software in this distribution
30
 * under the [CDDL or GPL Version 2] license." If you do not indicate a
31
 * single choice of license, a recipient has the option to distribute
32
 * your version of this file under either the CDDL, the GPL Version 2 or
33
 * to extend the choice of license to its licensees as provided above.
34
 * However, if you add GPL Version 2 code and therefore, elected the GPL
35
 * Version 2 license, then the option applies only if the new code is
36
 * made subject to such option by the copyright holder.
37
 *
38
 * Contributor(s):
39
 *
40
 * Portions Copyrighted 2013 Sun Microsystems, Inc.
41
 */
42
package org.openide.windows;
43
44
import java.util.Collection;
45
import java.util.concurrent.atomic.AtomicReference;
46
import org.openide.util.Lookup;
47
import org.openide.util.LookupEvent;
48
import org.openide.util.LookupListener;
49
50
/**
51
 * Allows to find another {@link CloneableOpenSupport} that all the
52
 * requests passed to given one should be redirected to. This is useful
53
 * for redirecting operation on <a href="@org-openide-filesystems@/org/openide/filesystems/FileObject.html">
54
 * FileObject</a> to another one in cases when two <code>FileObject</code>s
55
 * represent the same physical file.
56
 * <p>
57
 * Instances should be registered to default lookup.
58
 * @author akrasny
59
 * @since 6.65
60
 */
61
public abstract class CloneableOpenSupportRedirector {
62
63
    private static final Lookup.Result<CloneableOpenSupportRedirector> lkp = Lookup.getDefault().lookup(new Lookup.Template<>(CloneableOpenSupportRedirector.class));
64
    private static final AtomicReference<Collection<? extends CloneableOpenSupportRedirector>> redirectors = new AtomicReference<>();
65
    private static final LookupListener listener = new LookupListener() {
66
        @Override
67
        public void resultChanged(LookupEvent ev) {
68
            redirectors.set(lkp.allInstances());
69
        }
70
    };
71
72
    static {
73
        lkp.addLookupListener(listener);
74
        listener.resultChanged(null);
75
    }
76
77
    /** Find a delegate for given {@link CloneableOpenSupport}'s {@link CloneableOpenSupport.Env}.
78
     *
79
     * @param env the environment associated with current CloneableOpenSupport
80
     * @return null or another CloneableOpenSupport to use as a replacement
81
     */
82
    protected abstract CloneableOpenSupport redirect(CloneableOpenSupport.Env env);
83
84
    protected abstract void opened(CloneableOpenSupport.Env env);
85
86
    protected abstract void closed(CloneableOpenSupport.Env env);
87
88
    static CloneableOpenSupport findRedirect(CloneableOpenSupport one) {
89
        final CloneableOpenSupport.Env env = one.env;
90
        Collection<? extends CloneableOpenSupportRedirector> rlist = redirectors.get();
91
        if (rlist != null) {
92
            for (CloneableOpenSupportRedirector r : rlist) {
93
                CloneableOpenSupport ces = r.redirect(env);
94
                if (ces != null && ces != one) {
95
                    return ces;
96
                }
97
            }
98
        }
99
        return null;
100
    }
101
102
    static void notifyOpened(CloneableOpenSupport one) {
103
        final CloneableOpenSupport.Env env = one.env;
104
        Collection<? extends CloneableOpenSupportRedirector> rlist = redirectors.get();
105
        if (rlist != null) {
106
            for (CloneableOpenSupportRedirector r : rlist) {
107
                r.opened(env);
108
            }
109
        }
110
    }
111
112
    static void notifyClosed(CloneableOpenSupport one) {
113
        final CloneableOpenSupport.Env env = one.env;
114
        Collection<? extends CloneableOpenSupportRedirector> rlist = redirectors.get();
115
        if (rlist != null) {
116
            for (CloneableOpenSupportRedirector r : rlist) {
117
                r.closed(env);
118
            }
119
        }
120
    }
121
}
(-)a/openide.windows/src/org/openide/windows/CloneableTopComponent.java (-1 / +12 lines)
Lines 191-196 Link Here
191
    protected void componentOpened() {
191
    protected void componentOpened() {
192
        super.componentOpened();
192
        super.componentOpened();
193
        getReference().register(this);
193
        getReference().register(this);
194
        CloneableOpenSupport cos = getLookup().lookup(CloneableOpenSupport.class);
195
        if (cos != null) {
196
            CloneableOpenSupportRedirector.notifyOpened(cos);
197
        }
194
    }
198
    }
195
199
196
    /** Overrides superclass method, adds unregistering from references.
200
    /** Overrides superclass method, adds unregistering from references.
Lines 199-205 Link Here
199
        super.componentClosed();
203
        super.componentClosed();
200
204
201
        if (!isOpened()) {
205
        if (!isOpened()) {
202
            getReference().unregister(this);
206
            try {
207
                CloneableOpenSupport cos = getLookup().lookup(CloneableOpenSupport.class);
208
                if (cos != null) {
209
                    CloneableOpenSupportRedirector.notifyClosed(cos);
210
                }
211
            } finally {
212
                getReference().unregister(this);
213
            }
203
        }
214
        }
204
    }
215
    }
205
216

Return to bug 230126