/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
*
* Oracle and Java are registered trademarks of Oracle and/or its affiliates.
* Other names may be trademarks of their respective owners.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common
* Development and Distribution License("CDDL") (collectively, the
* "License"). You may not use this file except in compliance with the
* License. You can obtain a copy of the License at
* http://www.netbeans.org/cddl-gplv2.html
* or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
* specific language governing permissions and limitations under the
* License. When distributing the software, include this License Header
* Notice in each file and include the License file at
* nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the GPL Version 2 section of the License file that
* accompanied this code. If applicable, add the following below the
* License Header, with the fields enclosed by brackets [] replaced by
* your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*
* Contributor(s):
*
* The Original Software is NetBeans. The Initial Developer of the Original
* Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
* Microsystems, Inc. All Rights Reserved.
*
* If you wish your version of this file to be governed by only the CDDL
* or only the GPL Version 2, indicate your decision by adding
* "[Contributor] elects to include this software in this distribution
* under the [CDDL or GPL Version 2] license." If you do not indicate a
* single choice of license, a recipient has the option to distribute
* your version of this file under either the CDDL, the GPL Version 2 or
* to extend the choice of license to its licensees as provided above.
* However, if you add GPL Version 2 code and therefore, elected the GPL
* Version 2 license, then the option applies only if the new code is
* made subject to such option by the copyright holder.
*/
package org.netbeans.modules.ruby.rubyproject;
import java.awt.Component;
import java.beans.BeanInfo;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.DefaultListCellRenderer;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JList;
import org.netbeans.modules.ruby.spi.project.support.rake.PropertyEvaluator;
import org.openide.filesystems.FileUtil;
import org.openide.loaders.DataFolder;
import org.openide.util.ImageUtilities;
import org.openide.util.NbBundle;
/** Classes containing code speciic for handling UI of J2SE project classpath
*
* @author Petr Hrebejk
*/
public class JavaClassPathUi {
private JavaClassPathUi() {}
// Innerclasses ------------------------------------------------------------
/** Renderer which can be used to render the classpath in lists
*/
public static class ClassPathListCellRenderer extends DefaultListCellRenderer {
private static final Pattern FOREIGN_PLAIN_FILE_REFERENCE = Pattern.compile("\\$\\{file\\.reference\\.([^${}]+)\\}"); // NOI18N
private static final Pattern UNKNOWN_FILE_REFERENCE = Pattern.compile("\\$\\{([^${}]+)\\}"); // NOI18N
private static String RESOURCE_ICON_JAR = "org/netbeans/modules/ruby/rubyproject/ui/resources/jar.gif"; //NOI18N
private static String RESOURCE_ICON_LIBRARY = "org/netbeans/modules/ruby/rubyproject/ui/resources/libraries.gif"; //NOI18N
private static String RESOURCE_ICON_ARTIFACT = "org/netbeans/modules/ruby/rubyproject/ui/resources/projectDependencies.gif"; //NOI18N
private static String RESOURCE_ICON_CLASSPATH = "org/netbeans/modules/ruby/rubyproject/ui/resources/referencedClasspath.gif"; //NOI18N
private static String RESOURCE_ICON_BROKEN_BADGE = "org/netbeans/modules/ruby/rubyproject/ui/resources/brokenProjectBadge.gif"; //NOI18N
private static ImageIcon ICON_JAR = ImageUtilities.loadImageIcon(RESOURCE_ICON_JAR, false);
private static ImageIcon ICON_FOLDER = null;
private static ImageIcon ICON_LIBRARY = ImageUtilities.loadImageIcon(RESOURCE_ICON_LIBRARY, false);
private static ImageIcon ICON_ARTIFACT = ImageUtilities.loadImageIcon(RESOURCE_ICON_ARTIFACT, false);
private static ImageIcon ICON_CLASSPATH = ImageUtilities.loadImageIcon(RESOURCE_ICON_CLASSPATH, false);
private static ImageIcon ICON_BROKEN_BADGE = ImageUtilities.loadImageIcon(RESOURCE_ICON_BROKEN_BADGE, false);
private static ImageIcon ICON_BROKEN_JAR;
private static ImageIcon ICON_BROKEN_LIBRARY;
private static ImageIcon ICON_BROKEN_ARTIFACT;
private PropertyEvaluator evaluator;
// Contains well known paths in the RubyProject
private static final Map WELL_KNOWN_PATHS_NAMES = new HashMap();
static {
// WELL_KNOWN_PATHS_NAMES.put( RubyProjectProperties.JAVAC_CLASSPATH, NbBundle.getMessage( RubyProjectProperties.class, "LBL_JavacClasspath_DisplayName" ) );
// WELL_KNOWN_PATHS_NAMES.put( RubyProjectProperties.JAVAC_TEST_CLASSPATH, NbBundle.getMessage( RubyProjectProperties.class,"LBL_JavacTestClasspath_DisplayName") );
// WELL_KNOWN_PATHS_NAMES.put( RubyProjectProperties.RUN_CLASSPATH, NbBundle.getMessage( RubyProjectProperties.class, "LBL_RunClasspath_DisplayName" ) );
// WELL_KNOWN_PATHS_NAMES.put( RubyProjectProperties.RUN_TEST_CLASSPATH, NbBundle.getMessage( RubyProjectProperties.class, "LBL_RunTestClasspath_DisplayName" ) );
// WELL_KNOWN_PATHS_NAMES.put( RubyProjectProperties.BUILD_CLASSES_DIR, NbBundle.getMessage( RubyProjectProperties.class, "LBL_BuildClassesDir_DisplayName" ) );
// WELL_KNOWN_PATHS_NAMES.put( RubyProjectProperties.BUILD_TEST_CLASSES_DIR, NbBundle.getMessage (RubyProjectProperties.class,"LBL_BuildTestClassesDir_DisplayName") );
};
public ClassPathListCellRenderer( PropertyEvaluator evaluator ) {
super();
this.evaluator = evaluator;
}
public Component getListCellRendererComponent( JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
ProjectPropertyExtender.Item item = (ProjectPropertyExtender.Item)value;
super.getListCellRendererComponent( list, getDisplayName( item ), index, isSelected, cellHasFocus );
setIcon( getIcon( item ) );
setToolTipText( getToolTipText( item ) );
return this;
}
private String getDisplayName( ProjectPropertyExtender.Item item ) {
switch ( item.getType() ) {
// case ProjectPropertyExtender.Item.TYPE_LIBRARY:
// if ( item.isBroken() ) {
// return NbBundle.getMessage( RubyClassPathUi.class, "LBL_MISSING_LIBRARY", getLibraryName( item ) );
// }
// else {
// return item.getLibrary().getDisplayName();
// }
// case ProjectPropertyExtender.Item.TYPE_CLASSPATH:
// String name = (String)WELL_KNOWN_PATHS_NAMES.get( ClassPathSupport.getAntPropertyName( item.getReference() ) );
// return name == null ? item.getReference() : name;
// case ProjectPropertyExtender.Item.TYPE_ARTIFACT:
// if ( item.isBroken() ) {
// return NbBundle.getMessage( RubyClassPathUi.class, "LBL_MISSING_PROJECT", getProjectName( item ) );
// }
// else {
// Project p = item.getArtifact().getProject();
// ProjectInformation pi = ProjectUtils.getInformation(p);
// String projectName = pi.getDisplayName();
// return MessageFormat.format (NbBundle.getMessage(RubyClassPathUi.class,"MSG_ProjectArtifactFormat"), new Object[] {
// projectName,
// item.getArtifactURI().toString()
// });
// }
case ProjectPropertyExtender.Item.TYPE_JAR:
if ( item.isBroken() ) {
return NbBundle.getMessage( JavaClassPathUi.class, "LBL_MISSING_FILE", getFileRefName( item ) );
}
else {
return item.getFile().getPath();
}
}
return item.getReference(); // XXX
}
static Icon getIcon( ProjectPropertyExtender.Item item ) {
switch ( item.getType() ) {
case ProjectPropertyExtender.Item.TYPE_LIBRARY:
if ( item.isBroken() ) {
if ( ICON_BROKEN_LIBRARY == null ) {
ICON_BROKEN_LIBRARY = new ImageIcon( ImageUtilities.mergeImages( ICON_LIBRARY.getImage(), ICON_BROKEN_BADGE.getImage(), 7, 7 ) );
}
return ICON_BROKEN_LIBRARY;
}
else {
return ICON_LIBRARY;
}
// case ProjectPropertyExtender.Item.TYPE_ARTIFACT:
// if ( item.isBroken() ) {
// if ( ICON_BROKEN_ARTIFACT == null ) {
// ICON_BROKEN_ARTIFACT = new ImageIcon( ImageUtilities.mergeImages( ICON_ARTIFACT.getImage(), ICON_BROKEN_BADGE.getImage(), 7, 7 ) );
// }
// return ICON_BROKEN_ARTIFACT;
// }
// else {
// Project p = item.getArtifact().getProject();
// if (p != null) {
// ProjectInformation pi = ProjectUtils.getInformation(p);
// return pi.getIcon();
// }
// return ICON_ARTIFACT;
// }
case ProjectPropertyExtender.Item.TYPE_JAR:
if ( item.isBroken() ) {
if ( ICON_BROKEN_JAR == null ) {
ICON_BROKEN_JAR = new ImageIcon( ImageUtilities.mergeImages( ICON_JAR.getImage(), ICON_BROKEN_BADGE.getImage(), 7, 7 ) );
}
return ICON_BROKEN_JAR;
}
else {
File file = item.getFile();
return file.isDirectory() ? getFolderIcon() : ICON_JAR;
}
case ProjectPropertyExtender.Item.TYPE_CLASSPATH:
return ICON_CLASSPATH;
}
return null; // XXX
}
private String getToolTipText( ProjectPropertyExtender.Item item ) {
if ( item.isBroken() &&
( item.getType() == ProjectPropertyExtender.Item.TYPE_JAR ||
item.getType() == ProjectPropertyExtender.Item.TYPE_ARTIFACT ) ) {
return evaluator.evaluate( item.getReference() );
}
return getDisplayName( item ); // XXX
}
private static ImageIcon getFolderIcon() {
if ( ICON_FOLDER == null ) {
DataFolder dataFolder = DataFolder.findFolder( FileUtil.getConfigRoot() );
ICON_FOLDER = new ImageIcon( dataFolder.getNodeDelegate().getIcon( BeanInfo.ICON_COLOR_16x16 ) );
}
return ICON_FOLDER;
}
private String getProjectName( ProjectPropertyExtender.Item item ) {
String ID = item.getReference();
// something in the form of "${reference.project-name.id}"
return ID.substring(12, ID.indexOf(".", 12)); // NOI18N
}
private String getLibraryName( ProjectPropertyExtender.Item item ) {
String ID = item.getReference();
// something in the form of "${libs.junit.classpath}"
return ID.substring(7, ID.indexOf(".classpath")); // NOI18N
}
private String getFileRefName( ProjectPropertyExtender.Item item ) {
String ID = item.getReference();
// something in the form of "${file.reference.smth.jar}"
Matcher m = FOREIGN_PLAIN_FILE_REFERENCE.matcher(ID);
if (m.matches()) {
return m.group(1);
}
m = UNKNOWN_FILE_REFERENCE.matcher(ID);
if (m.matches()) {
return m.group(1);
}
return ID;
}
}
//
// public static class EditMediator implements ActionListener, ListSelectionListener {
//
// private final Project project;
// private final JList list;
// private final DefaultListModel listModel;
// private final ListSelectionModel selectionModel;
// private final ButtonModel addJar;
// private final ButtonModel addLibrary;
// private final ButtonModel addAntArtifact;
// private final ButtonModel remove;
// private final ButtonModel moveUp;
// private final ButtonModel moveDown;
//
// public EditMediator( Project project,
// JList list,
// DefaultListModel listModel,
// ButtonModel addJar,
// ButtonModel addLibrary,
// ButtonModel addAntArtifact,
// ButtonModel remove,
// ButtonModel moveUp,
// ButtonModel moveDown ) {
//
// // Remember all buttons
//
// this.list = list;
//
// if ( !( list.getModel() instanceof DefaultListModel ) ) {
// throw new IllegalArgumentException( "The list's model has to be of class DefaultListModel" ); // NOI18N
// }
//
// this.listModel = (DefaultListModel)list.getModel();
// this.selectionModel = list.getSelectionModel();
//
// this.addJar = addJar;
// this.addLibrary = addLibrary;
// this.addAntArtifact = addAntArtifact;
// this.remove = remove;
// this.moveUp = moveUp;
// this.moveDown = moveDown;
//
// this.project = project;
// }
//
// public static void register(Project project,
// JList list,
// DefaultListModel listModel,
// ButtonModel addJar,
// ButtonModel addLibrary,
// ButtonModel addAntArtifact,
// ButtonModel remove,
// ButtonModel moveUp,
// ButtonModel moveDown ) {
//
// EditMediator em = new EditMediator( project,
// list,
// listModel,
// addJar,
// addLibrary,
// addAntArtifact,
// remove,
// moveUp,
// moveDown );
//
// // Register the listener on all buttons
// addJar.addActionListener( em );
// addLibrary.addActionListener( em );
// addAntArtifact.addActionListener( em );
// remove.addActionListener( em );
// moveUp.addActionListener( em );
// moveDown.addActionListener( em );
// // On list selection
// em.selectionModel.addListSelectionListener( em );
// // Set the initial state of the buttons
// em.valueChanged( null );
// }
//
// // Implementation of ActionListener ------------------------------------
//
// /** Handles button events
// */
// public void actionPerformed( ActionEvent e ) {
//
// Object source = e.getSource();
//
// if ( source == addJar ) {
// // Let user search for the Jar file
// JFileChooser chooser = new JFileChooser();
// FileUtil.preventFileChooserSymlinkTraversal(chooser, null);
// chooser.setFileSelectionMode( JFileChooser.FILES_AND_DIRECTORIES );
// chooser.setMultiSelectionEnabled( true );
// chooser.setDialogTitle( NbBundle.getMessage( J2SEClassPathUi.class, "LBL_AddJar_DialogTitle" ) ); // NOI18N
// //#61789 on old macosx (jdk 1.4.1) these two method need to be called in this order.
// chooser.setAcceptAllFileFilterUsed( false );
// chooser.setFileFilter( new SimpleFileFilter(
// NbBundle.getMessage( J2SEClassPathUi.class, "LBL_ZipJarFolderFilter" ), // NOI18N
// new String[] {"ZIP","JAR"} ) ); // NOI18N
// File curDir = FoldersListSettings.getDefault().getLastUsedClassPathFolder();
// chooser.setCurrentDirectory (curDir);
// int option = chooser.showOpenDialog( SwingUtilities.getWindowAncestor( list ) ); // Sow the chooser
//
// if ( option == JFileChooser.APPROVE_OPTION ) {
//
// File files[] = chooser.getSelectedFiles();
// int[] newSelection = ClassPathUiSupport.addJarFiles( listModel, list.getSelectedIndices(), files );
// list.setSelectedIndices( newSelection );
// curDir = FileUtil.normalizeFile(chooser.getCurrentDirectory());
// FoldersListSettings.getDefault().setLastUsedClassPathFolder(curDir);
// }
// }
// else if ( source == addLibrary ) {
// Set/*<Library>*/includedLibraries = new HashSet ();
// for (int i=0; i< listModel.getSize(); i++) {
// ClassPathSupport.Item item = (ClassPathSupport.Item) listModel.get(i);
// if (item.getType() == ClassPathSupport.Item.TYPE_LIBRARY && !item.isBroken() ) {
// includedLibraries.add( item.getLibrary() );
// }
// }
// Object[] options = new Object[] {
// new JButton (NbBundle.getMessage (J2SEClassPathUi.class,"LBL_AddLibrary")),
// DialogDescriptor.CANCEL_OPTION
// };
// ((JButton)options[0]).setEnabled(false);
// ((JButton)options[0]).getAccessibleContext().setAccessibleDescription (NbBundle.getMessage (J2SEClassPathUi.class,"AD_AddLibrary"));
// LibrariesChooser panel = new LibrariesChooser ((JButton)options[0], includedLibraries);
// DialogDescriptor desc = new DialogDescriptor(panel,NbBundle.getMessage( J2SEClassPathUi.class, "LBL_CustomizeCompile_Classpath_AddLibrary" ),
// true, options, options[0], DialogDescriptor.DEFAULT_ALIGN,null,null);
// Dialog dlg = DialogDisplayer.getDefault().createDialog(desc);
// dlg.setVisible(true);
// if (desc.getValue() == options[0]) {
// int[] newSelection = ClassPathUiSupport.addLibraries( listModel, list.getSelectedIndices(), panel.getSelectedLibraries(), includedLibraries );
// list.setSelectedIndices( newSelection );
// }
// dlg.dispose();
// }
// else if ( source == addAntArtifact ) {
// AntArtifactChooser.ArtifactItem artifactItems[] = AntArtifactChooser.showDialog(
// new String[] { JavaProjectConstants.ARTIFACT_TYPE_JAR, JavaProjectConstants.ARTIFACT_TYPE_FOLDER},
// project, list.getParent() );
// if (artifactItems != null) {
// int[] newSelection = ClassPathUiSupport.addArtifacts( listModel, list.getSelectedIndices(), artifactItems);
// list.setSelectedIndices( newSelection );
// }
// }
// else if ( source == remove ) {
// int[] newSelection = ClassPathUiSupport.remove( listModel, list.getSelectedIndices() );
// list.setSelectedIndices( newSelection );
// }
// else if ( source == moveUp ) {
// int[] newSelection = ClassPathUiSupport.moveUp( listModel, list.getSelectedIndices() );
// list.setSelectedIndices( newSelection );
// }
// else if ( source == moveDown ) {
// int[] newSelection = ClassPathUiSupport.moveDown( listModel, list.getSelectedIndices() );
// list.setSelectedIndices( newSelection );
// }
// }
//
//
// /** Handles changes in the selection
// */
// public void valueChanged( ListSelectionEvent e ) {
//
// // remove enabled only if selection is not empty
// boolean canRemove = false;
// // and when the selection does not contain unremovable item
// if ( selectionModel.getMinSelectionIndex() != -1 ) {
// canRemove = true;
// int iMin = selectionModel.getMinSelectionIndex();
// int iMax = selectionModel.getMinSelectionIndex();
// for ( int i = iMin; i <= iMax; i++ ) {
//
// if ( selectionModel.isSelectedIndex( i ) ) {
// ClassPathSupport.Item item = (ClassPathSupport.Item)listModel.get( i );
// if ( item.getType() == ClassPathSupport.Item.TYPE_CLASSPATH ) {
// canRemove = false;
// break;
// }
// }
// }
// }
//
// // addJar allways enabled
// // addLibrary allways enabled
// // addArtifact allways enabled
// // editButton.setEnabled( edit );
// remove.setEnabled( canRemove );
// moveUp.setEnabled( ClassPathUiSupport.canMoveUp( selectionModel ) );
// moveDown.setEnabled( ClassPathUiSupport.canMoveDown( selectionModel, listModel.getSize() ) );
//
// }
// }
//
// private static class SimpleFileFilter extends FileFilter {
//
// private String description;
// private Collection extensions;
//
//
// public SimpleFileFilter (String description, String[] extensions) {
// this.description = description;
// this.extensions = Arrays.asList(extensions);
// }
//
// public boolean accept(File f) {
// if (f.isDirectory())
// return true;
// String name = f.getName();
// int index = name.lastIndexOf('.'); //NOI18N
// if (index <= 0 || index==name.length()-1)
// return false;
// String extension = name.substring (index+1).toUpperCase();
// return this.extensions.contains(extension);
// }
//
// public String getDescription() {
// return this.description;
// }
// }
}