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-2006 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.apache.tools.ant.module.nodes;
043:
044: import java.awt.Image;
045: import java.util.ResourceBundle;
046: import javax.swing.event.ChangeEvent;
047: import javax.swing.event.ChangeListener;
048: import org.apache.tools.ant.module.AntModule;
049: import org.apache.tools.ant.module.api.AntProjectCookie;
050: import org.openide.ErrorManager;
051: import org.openide.filesystems.FileStateInvalidException;
052: import org.openide.loaders.DataNode;
053: import org.openide.loaders.DataObject;
054: import org.openide.nodes.Node;
055: import org.openide.nodes.Sheet;
056: import org.openide.util.Mutex;
057: import org.openide.util.NbBundle;
058: import org.openide.util.Utilities;
059: import org.openide.util.WeakListeners;
060: import org.w3c.dom.Element;
061:
062: public final class AntProjectNode extends DataNode implements
063: ChangeListener {
064:
065: public AntProjectNode(DataObject obj) {
066: this (obj, obj.getCookie(AntProjectCookie.class));
067: }
068:
069: private AntProjectNode(DataObject obj, AntProjectCookie cookie) {
070: super (obj, new AntProjectChildren(cookie));
071: cookie.addChangeListener(WeakListeners.change(this , cookie));
072: }
073:
074: @Override
075: public Image getIcon(int type) {
076: Image i = getBasicIcon();
077: try {
078: // #25248: annotate the build script icon
079: i = getDataObject().getPrimaryFile().getFileSystem()
080: .getStatus().annotateIcon(i, type,
081: getDataObject().files());
082: } catch (FileStateInvalidException fsie) {
083: AntModule.err.notify(ErrorManager.INFORMATIONAL, fsie);
084: }
085: return i;
086: }
087:
088: private Image getBasicIcon() {
089: AntProjectCookie.ParseStatus cookie = getCookie(AntProjectCookie.ParseStatus.class);
090: if (cookie.getFile() == null && cookie.getFileObject() == null) {
091: // Script has been invalidated perhaps? Don't continue, we would
092: // just get an NPE from the getParseException.
093: return Utilities
094: .loadImage("org/apache/tools/ant/module/resources/AntIconError.gif"); // NOI18N
095: }
096: if (!cookie.isParsed()) {
097: // Assume for now it is not erroneous.
098: return Utilities
099: .loadImage("org/apache/tools/ant/module/resources/AntIcon.gif"); // NOI18N
100: }
101: Throwable exc = cookie.getParseException();
102: if (exc != null) {
103: return Utilities
104: .loadImage("org/apache/tools/ant/module/resources/AntIconError.gif"); // NOI18N
105: } else {
106: return Utilities
107: .loadImage("org/apache/tools/ant/module/resources/AntIcon.gif"); // NOI18N
108: }
109: }
110:
111: @Override
112: public Image getOpenedIcon(int type) {
113: return getIcon(type);
114: }
115:
116: @Override
117: public String getShortDescription() {
118: AntProjectCookie cookie = getCookie(AntProjectCookie.class);
119: if (cookie.getFile() == null && cookie.getFileObject() == null) {
120: // Script has been invalidated perhaps? Don't continue, we would
121: // just get an NPE from the getParseException.
122: return super .getShortDescription();
123: }
124: Throwable exc = cookie.getParseException();
125: if (exc != null) {
126: String m = exc.getLocalizedMessage();
127: if (m != null) {
128: return m;
129: } else {
130: return exc.toString();
131: }
132: } else {
133: Element pel = cookie.getProjectElement();
134: if (pel != null) {
135: String projectName = pel.getAttribute("name"); // NOI18N
136: if (!projectName.equals("")) { // NOI18N
137: // Set the node description in the IDE to the name of the project
138: return NbBundle
139: .getMessage(AntProjectNode.class,
140: "LBL_named_script_description",
141: projectName);
142: } else {
143: // No name specified, OK.
144: return NbBundle.getMessage(AntProjectNode.class,
145: "LBL_anon_script_description");
146: }
147: } else {
148: // ???
149: return super .getShortDescription();
150: }
151: }
152: }
153:
154: @Override
155: protected Sheet createSheet() {
156: Sheet sheet = super .createSheet();
157:
158: Sheet.Set props = new Sheet.Set();
159: props.setName("project"); // NOI18N
160: props.setDisplayName(NbBundle.getMessage(AntProjectNode.class,
161: "LBL_proj_sheet"));
162: props.setShortDescription(NbBundle.getMessage(
163: AntProjectNode.class, "HINT_proj_sheet"));
164: add2Sheet(props);
165: sheet.put(props);
166:
167: return sheet;
168: }
169:
170: private class ProjectNameProperty extends AntProperty {
171: public ProjectNameProperty(String name) {
172: super (name);
173: }
174:
175: @Override
176: protected Element getElement() {
177: return getCookie(AntProjectCookie.class)
178: .getProjectElement();
179: }
180: }
181:
182: private class ProjectTargetProperty extends AntProperty {
183: public ProjectTargetProperty(String name) {
184: super (name);
185: }
186:
187: @Override
188: protected Element getElement() {
189: return getCookie(AntProjectCookie.class)
190: .getProjectElement();
191: }
192: }
193:
194: private void add2Sheet(Sheet.Set props) {
195: ResourceBundle bundle = NbBundle
196: .getBundle(AntProjectNode.class);
197:
198: // Create the required properties (XML attributes) of the Ant project
199: Node.Property<?> prop = new ProjectNameProperty("name"); // NOI18N
200: // Cannot reuse 'name' because it conflicts with the DataObject.PROP_NAME:
201: prop.setName("projectName"); // NOI18N
202: prop.setDisplayName(bundle.getString("PROP_projectName"));
203: prop.setShortDescription(bundle.getString("HINT_projectName"));
204: props.put(prop);
205: prop = new ProjectTargetProperty("default"); // NOI18N
206: prop.setDisplayName(bundle.getString("PROP_default"));
207: prop.setShortDescription(bundle.getString("HINT_default"));
208: props.put(prop);
209: }
210:
211: public void stateChanged(ChangeEvent ev) {
212: Mutex.EVENT.writeAccess(new Runnable() {
213: public void run() {
214: fireIconChange();
215: fireOpenedIconChange();
216: fireShortDescriptionChange(null, null);
217: fireCookieChange();
218: firePropertyChange(null, null, null);
219: }
220: });
221: }
222:
223: }
|