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 javax.swing.JFileChooser;
048: import org.netbeans.api.project.FileOwnerQuery;
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.ui.UIUtil;
053: import org.openide.ErrorManager;
054: import org.openide.filesystems.FileObject;
055: import org.openide.filesystems.FileUtil;
056: import org.openide.loaders.DataObject;
057: import org.openide.nodes.Node;
058: import org.openide.util.HelpCtx;
059: import org.openide.util.NbBundle;
060: import org.openide.util.actions.CookieAction;
061: import org.openide.windows.WindowManager;
062:
063: /**
064: * Lets user pick an icon for a given layer file.
065: * @author Jesse Glick
066: */
067: public class PickIconAction extends CookieAction {
068:
069: protected void performAction(Node[] activatedNodes) {
070: FileObject f = activatedNodes[0].getCookie(DataObject.class)
071: .getPrimaryFile();
072: URL location = (URL) f
073: .getAttribute("WritableXMLFileSystem.location"); // NOI18N
074: assert location != null : f;
075: NbModuleProject p = (NbModuleProject) FileOwnerQuery
076: .getOwner(URI.create(location.toExternalForm()));
077: assert p != null : location;
078: FileObject src = p.getSourceDirectory();
079: JFileChooser chooser = UIUtil.getIconFileChooser();
080: FileUtil.preventFileChooserSymlinkTraversal(chooser, FileUtil
081: .toFile(src));
082: if (chooser.showOpenDialog(WindowManager.getDefault()
083: .getMainWindow()) != JFileChooser.APPROVE_OPTION) {
084: return;
085: }
086: FileObject icon = FileUtil.toFileObject(chooser
087: .getSelectedFile());
088: // XXX might instead get WritableXMLFileSystem.cp and search for it in there:
089: String iconPath = FileUtil.getRelativePath(src, icon);
090: try {
091: if (iconPath == null) {
092: String folderPath;
093: String layerPath = ManifestManager.getInstance(
094: p.getManifest(), false).getLayer();
095: if (layerPath != null) {
096: folderPath = layerPath.substring(0, layerPath
097: .lastIndexOf('/'));
098: } else {
099: folderPath = p.getCodeNameBase().replace('.', '/')
100: + "/resources"; // NOI18N
101: }
102: FileObject folder = FileUtil.createFolder(src,
103: folderPath);
104: FileUtil.copyFile(icon, folder, icon.getName(), icon
105: .getExt());
106: iconPath = folderPath + '/' + icon.getNameExt();
107: }
108: f.setAttribute("SystemFileSystem.icon", new URL(
109: "nbresloc:/" + iconPath)); // NOI18N
110: } catch (IOException e) {
111: Util.err.notify(ErrorManager.INFORMATIONAL, e);
112: }
113: }
114:
115: protected boolean enable(Node[] activatedNodes) {
116: if (!super .enable(activatedNodes)) {
117: return false;
118: }
119: FileObject f = activatedNodes[0].getCookie(DataObject.class)
120: .getPrimaryFile();
121: URL location = (URL) f
122: .getAttribute("WritableXMLFileSystem.location"); // NOI18N
123: return location != null; // #63458
124: }
125:
126: public String getName() {
127: return NbBundle.getMessage(PickIconAction.class,
128: "LBL_pick_icon");
129: }
130:
131: protected Class[] cookieClasses() {
132: return new Class[] { DataObject.class };
133: }
134:
135: protected int mode() {
136: return MODE_EXACTLY_ONE;
137: }
138:
139: public HelpCtx getHelpCtx() {
140: return null;
141: }
142:
143: protected boolean asynchronous() {
144: return false;
145: }
146:
147: }
|