|
What this is
Other links
The source code/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License * Version 1.0 (the "License"). You may not use this file except in * compliance with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is NetBeans. The Initial Developer of the Original * Code is Sun Microsystems, Inc. Portions Copyright 1997-2004 Sun * Microsystems, Inc. All Rights Reserved. */ package org.netbeans.modules.project.ui; import java.awt.Component; import java.awt.Cursor; import java.awt.event.ActionEvent; import java.util.*; import java.io.File; import javax.swing.Action; import javax.swing.JFrame; import javax.swing.SwingUtilities; import org.netbeans.api.project.FileOwnerQuery; import org.netbeans.api.project.Project; import org.openide.ErrorManager; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.loaders.DataObject; import org.openide.nodes.Node; import org.openide.text.CloneableEditorSupport; import org.openide.util.ContextAwareAction; import org.openide.util.Mutex; import org.openide.util.NbBundle; import org.openide.util.Utilities; import org.openide.windows.Mode; import org.openide.windows.TopComponent; import org.openide.windows.WindowManager; /** The util methods for projectui module. * * @author Jiri Rechtacek */ public class ProjectUtilities { /** Creates a new instance of CloseAllProjectDocuments */ private ProjectUtilities () { } /** Closes all documents in editor area which are owned by one of given projects. * If some documents are modified then an user is notified by Save/Discard/Cancel dialog. * Dialog is showed only once for all project's documents together. * * @param p project to close * @return false if an user cancel the Save/Discard/Cancel dialog, true otherwise */ final public static boolean closeAllDocuments (Project[] projects) { if (projects == null) { throw new IllegalArgumentException ("No proects are specified."); // NOI18N } if (projects.length == 0) { // no projects to close, no documents will be closed return true; } List/*Project*/ listOfProjects = Arrays.asList (projects); Set/*DataObject*/ modifiedFiles = new HashSet (); Set/*TopComponent*/ tc2close = new HashSet (); Mode editorMode = WindowManager.getDefault ().findMode (CloneableEditorSupport.EDITOR_MODE); TopComponent[] openTCs = editorMode.getTopComponents (); for (int i = 0; i < openTCs.length; i++) { DataObject dobj = (DataObject)openTCs[i].getLookup ().lookup (DataObject.class); if (dobj != null) { FileObject fobj = dobj.getPrimaryFile (); Project owner = FileOwnerQuery.getOwner (fobj); if (listOfProjects.contains (owner)) { modifiedFiles.add (dobj); tc2close.add (openTCs[i]); } } } if (modifiedFiles.isEmpty ()) { return true; } boolean result = ExitDialog.showDialog (modifiedFiles); if (result) { // close documents Iterator it = tc2close.iterator (); while (it.hasNext ()) { ((TopComponent)it.next ()).close (); } } return result; } /** Closes all documents of the given project in editor area. If some documents * are modified then an user is notified by Save/Discard/Cancel dialog. * * @param p project to close * @return false if an user cancel the Save/Discard/Cancel dialog, true otherwise */ final public static boolean closeAllDocuments (Project p) { if (p == null) { throw new IllegalArgumentException ("No specified project."); // NOI18N } return closeAllDocuments (new Project[] { p }); } /** Invokes the preferred action on given object and tries to select it in * corresponding view, e.g. in logical view if possible otherwise * in physical project's view. * Note: execution this methods can invokes new threads to assure the action * is called in EQ. * * @param newDo new data object */ final public static void openAndSelectNewObject (final DataObject newDo) { // call the preferred action on main class Mutex.EVENT.writeAccess (new Runnable () { public void run () { final Node node = newDo.getNodeDelegate (); Action a = node.getPreferredAction(); if (a instanceof ContextAwareAction) { a = ((ContextAwareAction)a).createContextAwareInstance(node.getLookup ()); } if (a != null) { a.actionPerformed(new ActionEvent(node, ActionEvent.ACTION_PERFORMED, "")); // NOI18N } // next action -> expand && select main class in package view final ProjectTab ptLogial = ProjectTab.findDefault (ProjectTab.ID_LOGICAL); final ProjectTab ptPhysical = ProjectTab.findDefault (ProjectTab.ID_PHYSICAL); // invoke later, Mutex.EVENT.writeAccess isn't suffice to // select && expand if the focus is outside ProjectTab SwingUtilities.invokeLater (new Runnable () { public void run () { boolean success = ptLogial.selectNode (newDo.getPrimaryFile (), false); if (!success) { ptPhysical.selectNode (newDo.getPrimaryFile (), false); } } }); } }); } /** Checks if the given file name can be created in the target folder. * * @param targetFolder target folder (e.g. source group) * @param folderName name of the folder relative to target folder * @param newObjectName name of created file * @param extension extension of created file * @return localized error message or null if all right */ final public static String canUseFileName (FileObject targetFolder, String folderName, String newObjectName, String extension) { if (extension != null && extension.length () > 0) { StringBuffer sb = new StringBuffer (); sb.append (newObjectName); sb.append ('.'); // NOI18N sb.append (extension); newObjectName = sb.toString (); } String relFileName = folderName == null ? newObjectName : folderName + "/" + newObjectName; // NOI18N // test whether the selected folder on selected filesystem already exists if (targetFolder == null) { return NbBundle.getMessage (ProjectUtilities.class, "MSG_fs_or_folder_does_not_exist"); // NOI18N } // target filesystem should be writable if (!targetFolder.canWrite ()) { return NbBundle.getMessage (ProjectUtilities.class, "MSG_fs_is_readonly"); // NOI18N } if (existFileName(targetFolder, relFileName)) { return NbBundle.getMessage (ProjectUtilities.class, "MSG_file_already_exist", newObjectName); // NOI18N } // all ok return null; } private static boolean existFileName(FileObject targetFolder, String relFileName) { boolean result = false; File fileForTargetFolder = FileUtil.toFile(targetFolder); if (fileForTargetFolder.exists()) { result = new File (fileForTargetFolder, relFileName).exists(); } else { result = targetFolder.getFileObject (relFileName) != null; } return result; } public static class WaitCursor implements Runnable { private boolean show; private WaitCursor( boolean show ) { this.show = show; } public static void show() { invoke( new WaitCursor( true ) ); } public static void hide() { invoke( new WaitCursor( false ) ); } private static void invoke( WaitCursor wc ) { if ( SwingUtilities.isEventDispatchThread() ) { wc.run(); } else { SwingUtilities.invokeLater( wc ); } } public void run() { try { JFrame f = (JFrame)WindowManager.getDefault ().getMainWindow (); Component c = f.getGlassPane (); c.setVisible ( show ); c.setCursor (show ? Cursor.getPredefinedCursor (Cursor.WAIT_CURSOR) : null); } catch (NullPointerException npe) { ErrorManager.getDefault ().notify (ErrorManager.INFORMATIONAL, npe); } } } } |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.