001 /*
002 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003 *
004 * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005 *
006 * The contents of this file are subject to the terms of either the GNU
007 * General Public License Version 2 only ("GPL") or the Common
008 * Development and Distribution License("CDDL") (collectively, the
009 * "License"). You may not use this file except in compliance with the
010 * License. You can obtain a copy of the License at
011 * http://www.netbeans.org/cddl-gplv2.html
012 * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013 * specific language governing permissions and limitations under the
014 * License. When distributing the software, include this License Header
015 * Notice in each file and include the License file at
016 * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017 * particular file as subject to the "Classpath" exception as provided
018 * by Sun in the GPL Version 2 section of the License file that
019 * accompanied this code. If applicable, add the following below the
020 * License Header, with the fields enclosed by brackets [] replaced by
021 * your own identifying information:
022 * "Portions Copyrighted [year] [name of copyright owner]"
023 *
024 * Contributor(s):
025 *
026 * The Original Software is NetBeans. The Initial Developer of the Original
027 * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
028 * Microsystems, Inc. All Rights Reserved.
029 *
030 * If you wish your version of this file to be governed by only the CDDL
031 * or only the GPL Version 2, indicate your decision by adding
032 * "[Contributor] elects to include this software in this distribution
033 * under the [CDDL or GPL Version 2] license." If you do not indicate a
034 * single choice of license, a recipient has the option to distribute
035 * your version of this file under either the CDDL, the GPL Version 2 or
036 * to extend the choice of license to its licensees as provided above.
037 * However, if you add GPL Version 2 code and therefore, elected the GPL
038 * Version 2 license, then the option applies only if the new code is
039 * made subject to such option by the copyright holder.
040 */
041
042 package org.netbeans.modules.j2ee.deployment.impl.ui;
043
044 import org.openide.nodes.Node;
045 import org.openide.nodes.FilterNode;
046 import org.openide.nodes.Sheet;
047 import org.openide.nodes.Node.PropertySet;
048 import javax.swing.Action;
049 import java.util.List;
050 import java.util.Arrays;
051 import java.util.ArrayList;
052
053 /**
054 * A node to filter the original children and extending its action by
055 * an extension node.
056 *
057 * Created on December 19, 2003, 11:21 AM
058 * @author nn136682
059 */
060 public class FilterXNode extends FilterNode {
061
062 private Node xnode;
063
064 private boolean extendsActions = true;
065
066 public FilterXNode(Node original, Node xnode, boolean extendsActions) {
067 this (original, xnode, extendsActions, null);
068 }
069
070 public FilterXNode(Node original, Node xnode,
071 boolean extendsActions, Children xchildren) {
072 super (original, xchildren);
073 this .xnode = xnode;
074 disableDelegation(DELEGATE_GET_ACTIONS);
075 this .extendsActions = extendsActions;
076 }
077
078 protected Node getXNode() {
079 return xnode;
080 }
081
082 protected void setXNode(Node xnode) {
083 this .xnode = xnode;
084 }
085
086 public static class XChildren extends Children {
087 public XChildren(Node original) {
088 super (original);
089 }
090
091 public void update() {
092 addNotify();
093 }
094 }
095
096 public Action[] getActions(boolean context) {
097 List actions = new ArrayList();
098 if (extendsActions) {
099 actions.addAll(Arrays.asList(xnode.getActions(context)));
100 }
101 actions
102 .addAll(Arrays
103 .asList(getOriginal().getActions(context)));
104 return (Action[]) actions.toArray(new Action[actions.size()]);
105 }
106
107 public org.openide.nodes.Node.Cookie getCookie(Class type) {
108 org.openide.nodes.Node.Cookie c = null;
109 if (xnode != null)
110 c = xnode.getCookie(type);
111 if (c == null)
112 c = getOriginal().getCookie(type);
113 if (c == null)
114 c = super .getCookie(type);
115 return c;
116 }
117
118 public PropertySet[] getPropertySets() {
119 return merge(getOriginal().getPropertySets(), xnode
120 .getPropertySets());
121 }
122
123 public void refreshChildren() {
124 org.openide.nodes.Children c = getChildren();
125 if (c instanceof XChildren)
126 ((XChildren) c).update();
127 }
128
129 public static PropertySet merge(PropertySet overriding,
130 PropertySet base) {
131 Sheet.Set overridden;
132 if (base instanceof Sheet.Set)
133 overridden = (Sheet.Set) base;
134 else {
135 overridden = new Sheet.Set();
136 overridden.put(base.getProperties());
137 }
138 overridden.put(overriding.getProperties());
139 return overridden;
140 }
141
142 public static PropertySet[] merge(PropertySet[] overridingSets,
143 PropertySet[] baseSets) {
144 java.util.Map ret = new java.util.HashMap();
145 for (int i = 0; i < baseSets.length; i++) {
146 ret.put(baseSets[i].getName(), baseSets[i]);
147 }
148 for (int j = 0; j < overridingSets.length; j++) {
149 PropertySet base = (PropertySet) ret.get(overridingSets[j]
150 .getName());
151 if (base == null) {
152 ret.put(overridingSets[j].getName(), overridingSets[j]);
153 } else {
154 base = merge(overridingSets[j], base);
155 ret.put(base.getName(), base);
156 }
157 }
158
159 PropertySet top = (PropertySet) ret.remove(Sheet.PROPERTIES);
160 List retList = new ArrayList();
161 if (top != null)
162 retList.add(top);
163 retList.addAll(ret.values());
164 return (PropertySet[]) retList.toArray(new PropertySet[retList
165 .size()]);
166 }
167 }
|