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.netbeans.modules.apisupport.project.layers;
043:
044: import java.io.IOException;
045: import java.net.URI;
046: import java.net.URL;
047: import org.netbeans.api.project.FileOwnerQuery;
048: import org.netbeans.api.project.Project;
049: import org.netbeans.modules.apisupport.project.ManifestManager;
050: import org.netbeans.modules.apisupport.project.NbModuleProject;
051: import org.netbeans.modules.apisupport.project.Util;
052: import org.netbeans.modules.apisupport.project.spi.NbModuleProvider;
053: import org.netbeans.spi.project.support.ant.EditableProperties;
054: import org.openide.DialogDisplayer;
055: import org.openide.ErrorManager;
056: import org.openide.NotifyDescriptor;
057: import org.openide.filesystems.FileObject;
058: import org.openide.loaders.DataObject;
059: import org.openide.nodes.Node;
060: import org.openide.util.HelpCtx;
061: import org.openide.util.NbBundle;
062: import org.openide.util.actions.CookieAction;
063:
064: /**
065: * Lets user pick a localized display name for a given layer file.
066: * @author Jesse Glick
067: */
068: public class PickNameAction extends CookieAction {
069:
070: private static FileObject findFile(Node[] activatedNodes) {
071: return ((DataObject) activatedNodes[0]
072: .getCookie(DataObject.class)).getPrimaryFile();
073: }
074:
075: private static NbModuleProvider findProject(FileObject f) {
076: URL location = (URL) f
077: .getAttribute("WritableXMLFileSystem.location"); // NOI18N
078: if (location == null) {
079: return null;
080: }
081: Project p = FileOwnerQuery.getOwner(URI.create(location
082: .toExternalForm()));
083:
084: assert p != null : location;
085: NbModuleProvider prov = p.getLookup().lookup(
086: NbModuleProvider.class);
087: assert prov != null : location;
088: return prov;
089: }
090:
091: private static String findBundlePath(NbModuleProvider p) {
092: FileObject src = p.getSourceDirectory();
093: ManifestManager mm = ManifestManager.getInstance(Util
094: .getManifest(p.getManifestFile()), false);
095: String bundlePath = mm.getLocalizingBundle();
096: if (bundlePath != null && bundlePath.endsWith(".properties")
097: && src.getFileObject(bundlePath) != null) {
098: return bundlePath;
099: } else {
100: return null;
101: }
102: }
103:
104: protected void performAction(Node[] activatedNodes) {
105: NotifyDescriptor.InputLine d = new NotifyDescriptor.InputLine(
106: NbBundle.getMessage(PickNameAction.class,
107: "PickNameAction_dialog_label"), NbBundle
108: .getMessage(PickNameAction.class,
109: "PickNameAction_dialog_title"));
110: if (DialogDisplayer.getDefault().notify(d) != NotifyDescriptor.OK_OPTION) {
111: return;
112: }
113: String name = d.getInputText();
114: FileObject f = findFile(activatedNodes);
115: NbModuleProvider p = findProject(f);
116: String bundlePath = findBundlePath(p);
117: try {
118: FileObject properties = p.getSourceDirectory()
119: .getFileObject(bundlePath);
120: EditableProperties ep = Util.loadProperties(properties);
121: ep.setProperty(f.getPath(), name);
122: Util.storeProperties(properties, ep);
123: f.setAttribute("SystemFileSystem.localizingBundle",
124: bundlePath.substring(
125: 0,
126: bundlePath.length()
127: - ".properties".length()).replace(
128: '/', '.')); // NOI18N
129: } catch (IOException e) {
130: Util.err.notify(ErrorManager.INFORMATIONAL, e);
131: }
132: }
133:
134: protected boolean enable(Node[] activatedNodes) {
135: if (!super .enable(activatedNodes)) {
136: return false;
137: }
138: FileObject f = findFile(activatedNodes);
139: if (f == null) {
140: return false;
141: }
142: NbModuleProvider p = findProject(f);
143: if (p == null) {
144: return false;
145: }
146: return findBundlePath(p) != null;
147: }
148:
149: public String getName() {
150: return NbBundle.getMessage(PickIconAction.class,
151: "LBL_pick_name");
152: }
153:
154: protected Class[] cookieClasses() {
155: return new Class[] { DataObject.class };
156: }
157:
158: protected int mode() {
159: return MODE_EXACTLY_ONE;
160: }
161:
162: public HelpCtx getHelpCtx() {
163: return null;
164: }
165:
166: protected boolean asynchronous() {
167: return false;
168: }
169:
170: }
|