|
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.actions;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.swing.Action;
import org.netbeans.api.project.FileOwnerQuery;
import org.netbeans.api.project.Project;
import org.netbeans.spi.project.ActionProvider;
import org.netbeans.api.project.ProjectUtils;
import org.openide.filesystems.FileObject;
import org.openide.loaders.DataObject;
import org.openide.util.Lookup;
import org.openide.util.WeakSet;
/** Nice utility methods to be used in ProjectBased Actions
*
* @author Pet Hrebejk
*/
class ActionsUtil {
public static final ShortcutsManager SHORCUTS_MANAGER = new ShortcutsManager();
/** Registers property change listener on given lookup. (Or on the default
* lookup (if the paramater is null). The listener is notified when the
* set of currently selected projects changes.
*/
/*
public static Project getProjectFromLookup( Lookup lookup, String command ) {
Collection projects = getProjectsFromLookup( lookup, command );
if ( projects.isEmpty() || projects.size() > 1 ) {
return null;
}
else {
return (Project)projects.iterator().next();
}
}
*/
/** Finds all projects in given lookup. If the command is not null it will check
* whther given command is enabled on all projects. If and only if all projects
* have the command supported it will return array including the project. If there
* is one project with the command disabled it will return empty array.
*/
public static Project[] getProjectsFromLookup( Lookup lookup, String command ) {
Set result = new HashSet();
// First find out whether there is a project directly in the Lookup
Collection projects = lookup.lookup( new Lookup.Template( Project.class ) ).allInstances();
for( Iterator it = projects.iterator(); it.hasNext(); ) {
Project p = (Project)it.next();
result.add(p);
}
// Now try to guess the project from dataobjects
Collection dataObjects = lookup.lookup( new Lookup.Template( DataObject.class ) ).allInstances();
for( Iterator it = dataObjects.iterator(); it.hasNext(); ) {
DataObject dObj = (DataObject)it.next();
FileObject fObj = dObj.getPrimaryFile();
Project p = FileOwnerQuery.getOwner(fObj);
if ( p != null ) {
result.add( p );
}
}
Project[] projectsArray = new Project[ result.size() ];
result.toArray( projectsArray );
if ( command != null ) {
// All projects have to have the command enabled
for( int i = 0; i < projectsArray.length; i++ ) {
if ( !commandSupported( projectsArray[i], command, lookup ) ) {
return new Project[0];
}
}
}
return projectsArray;
}
/** In given lookup will find all FileObjects owned by given project
* with given command supported.
*/
public static FileObject[] getFilesFromLookup( Lookup lookup, Project project ) {
HashSet result = new HashSet();
Collection dataObjects = lookup.lookup( new Lookup.Template( DataObject.class ) ).allInstances();
for( Iterator it = dataObjects.iterator(); it.hasNext(); ) {
DataObject dObj = (DataObject)it.next();
FileObject fObj = dObj.getPrimaryFile();
Project p = FileOwnerQuery.getOwner(fObj);
if ( p != null && p.equals( project ) ) {
result.add( fObj );
}
}
FileObject[] fos = new FileObject[ result.size() ];
result.toArray( fos );
return fos;
}
/**
* Tests whether given command is available on the project and whether
* the action as to be enabled in current Context
* @param project Project to test
* @param command Command for test
* @param context Lookup representing current context or null if context
* does not matter.
*/
public static boolean commandSupported( Project project, String command, Lookup context ) {
//We have to look whether the command is supported by the project
ActionProvider ap = (ActionProvider)project.getLookup().lookup( ActionProvider.class );
if ( ap != null ) {
List commands = Arrays.asList( ap.getSupportedActions() );
if ( commands.contains( command ) ) {
if (context == null || ap.isActionEnabled(command, context)) {
//System.err.println("cS: true project=" + project + " command=" + command + " context=" + context);
return true;
}
}
}
//System.err.println("cS: false project=" + project + " command=" + command + " context=" + context);
return false;
}
public static String formatProjectSensitiveName( String namePattern, Project projects[] ) {
// Set the action's name
if ( projects == null || projects.length == 0 ) {
// No project selected
return ActionsUtil.formatName( namePattern, 0, null );
}
else {
// Some project selected
return ActionsUtil.formatName( namePattern, projects.length, ProjectUtils.getInformation( projects[0] ).getDisplayName() );
}
}
/** Good for formating names of actions with some two parameter pattern
* {0} nuber of objects (e.g. Projects or files ) and {1} name of one
* or first object (e.g. Project or file) or null if the number is == 0
*/
public static String formatName( String namePattern, int numberOfObjects, String firstObjectName ) {
return MessageFormat.format(
namePattern,
new Object[] {
new Integer( numberOfObjects ),
firstObjectName == null ? "" : firstObjectName,
});
}
// Innerclasses ------------------------------------------------------------
/** Manages shortcuts based on the action's command. Usefull for File and
* projects actions.
*/
public static class ShortcutsManager {
// command -> shortcut
HashMap shorcuts = new HashMap();
// command -> WeakSet of actions
HashMap actions = new HashMap();
public void registerAction( String command, Action action ) {
synchronized ( this ) {
Set commandActions = (Set)actions.get( command );
if ( commandActions == null ) {
commandActions = new WeakSet();
actions.put( command, commandActions );
}
commandActions.add( action );
}
Object shorcut = getShortcut( command );
if ( shorcut != null ) {
action.putValue( Action.ACCELERATOR_KEY, shorcut );
}
}
public void registerShorcut( String command, Object shortcut ) {
Set actionsToChange = null;
synchronized ( this ) {
Object exShorcut = getShortcut( command );
if ( ( exShorcut != null && exShorcut.equals( shortcut ) ) || // Shorcuts are equal
( exShorcut == null && shortcut == null ) ) { // or both are null
return; // No action needed
}
shorcuts.put( command, shortcut );
Set commandActions = (Set)actions.get( command );
if ( commandActions != null && !commandActions.isEmpty() ) {
actionsToChange = new HashSet();
actionsToChange.addAll( commandActions );
}
}
if ( actionsToChange != null ) {
// Need to change actions in existing actions
for( Iterator it = actionsToChange.iterator(); it.hasNext(); ) {
Action a = (Action)it.next();
if ( a != null ) {
a.putValue( Action.ACCELERATOR_KEY, shortcut );
}
}
}
}
public synchronized Object getShortcut( String command ) {
return shorcuts.get( command );
}
}
}
|
| ... 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.