|
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.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyVetoException;
import java.beans.VetoableChangeListener;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.StringTokenizer;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
import javax.swing.text.EditorKit;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.StyleSheet;
import org.openide.ErrorManager;
import org.openide.WizardDescriptor;
import org.openide.explorer.ExplorerManager;
import org.openide.explorer.view.BeanTreeView;
import org.openide.explorer.view.ListView;
import org.openide.filesystems.FileObject;
import org.openide.loaders.*;
import org.openide.nodes.Children;
import org.openide.nodes.FilterNode;
import org.openide.nodes.Node;
import org.openide.nodes.NodeNotFoundException;
import org.openide.nodes.NodeOp;
import org.openide.util.NbBundle;
import org.openide.util.RequestProcessor;
/**
*
* @author tom
*/
public class TemplatesPanelGUI extends javax.swing.JPanel implements PropertyChangeListener {
public static interface Builder {
public Children createCategoriesChildren (DataFolder folder);
public Children createTemplatesChildren (DataFolder folder);
public String getCategoriesName ();
public String getTemplatesName ();
public char getCategoriesMnemonic ();
public char getTemplatesMnemonic ();
public void fireChange ();
}
public static final String TEMPLATES_FOLDER = "templatesFolder"; //NOI18N
public static final String TARGET_TEMPLATE = "targetTemplate"; //NOI18N
private static final String ATTR_INSTANTIATING_DESC = "instantiatingWizardURL"; //NOI18N
private Builder firer;
private static final RequestProcessor RP = new RequestProcessor();
/** Creates new form TemplatesPanelGUI */
public TemplatesPanelGUI (Builder firer) {
assert firer != null : "Builder can not be null"; //NOI18N
this.firer = firer;
initComponents();
postInitComponents ();
setName (NbBundle.getMessage(TemplatesPanelGUI.class, "TXT_SelectTemplate")); // NOI18N
}
public void setTemplatesFolder (final FileObject folder) {
DataFolder dobj = DataFolder.findFolder (folder);
((ExplorerProviderPanel)this.categoriesPanel).setRootNode(new FilterNode (
dobj.getNodeDelegate(), this.firer.createCategoriesChildren(dobj)));
}
public void setSelectedCategoryByName (final String categoryName) {
if (categoryName != null) {
((ExplorerProviderPanel)this.categoriesPanel).setSelectedNode (categoryName);
} else {
// if categoryName is null then select first category leastwise
((CategoriesPanel)this.categoriesPanel).selectFirstCategory ();
}
}
public String getSelectedCategoryName () {
return ((ExplorerProviderPanel)this.categoriesPanel).getSelectionPath();
}
public void setSelectedTemplateByName (final String templateName) {
final TemplatesPanel tempExplorer = ((TemplatesPanel)this.projectsPanel);
SwingUtilities.invokeLater (new Runnable () {
public void run () {
if (templateName != null) {
tempExplorer.setSelectedNode (templateName);
if (tempExplorer.getSelectionPath () == null) {
tempExplorer.selectFirstTemplate ();
}
} else {
tempExplorer.selectFirstTemplate ();
}
}
});
}
public String getSelectedTemplateName () {
return ((TemplatesPanel)this.projectsPanel).getSelectionPath();
}
public FileObject getSelectedTemplate () {
Node[] nodes = (Node[]) ((ExplorerProviderPanel)this.projectsPanel).getSelectedNodes();
if (nodes != null && nodes.length == 1) {
DataObject dobj = (DataObject) nodes[0].getCookie (DataObject.class);
if (dobj != null) {
while (dobj instanceof DataShadow) {
dobj = ((DataShadow)dobj).getOriginal();
}
return dobj.getPrimaryFile();
}
}
return null;
}
public void propertyChange (PropertyChangeEvent event) {
if (event.getSource() == this.categoriesPanel) {
if (ExplorerManager.PROP_SELECTED_NODES.equals (event.getPropertyName ())) {
Node[] selectedNodes = (Node[]) event.getNewValue();
if (selectedNodes != null && selectedNodes.length == 1) {
String lastSelectedTemplate = getSelectedTemplateName ();
try {
((ExplorerProviderPanel)this.projectsPanel).setSelectedNodes(new Node[0]);
} catch (PropertyVetoException e) {
/*Ignore it*/
}
DataObject template = (DataObject) selectedNodes[0].getCookie(DataFolder.class);
if (template != null) {
FileObject fo = template.getPrimaryFile();
((ExplorerProviderPanel)this.projectsPanel).setRootNode(
new FilterNode (selectedNodes[0], this.firer.createTemplatesChildren((DataFolder)template)));
// after change of root select the first template to make easy move in wizard
this.setSelectedTemplateByName (lastSelectedTemplate);
}
}
}
}
else if (event.getSource() == this.projectsPanel) {
if (ExplorerManager.PROP_SELECTED_NODES.equals (event.getPropertyName())) {
Node[] selectedNodes = (Node[]) event.getNewValue ();
if (selectedNodes != null && selectedNodes.length == 1) {
DataObject template = (DataObject) selectedNodes[0].getCookie(DataObject.class);
if (template != null) {
FileObject fo = template.getPrimaryFile();
URL descURL = getDescription (template);
if (descURL != null) {
try {
// this.description.setPage (descURL);
// Set page does not work well if there are mutiple calls to that
// see issue #49067. This is a hotfix for the bug which causes
// synchronous loading of the content. It should be improved later
// by doing it in request processor.
this.description.read( descURL.openStream(), descURL );
} catch (IOException e) {
this.description.setText (ResourceBundle.getBundle("org/netbeans/modules/project/ui/Bundle").getString("TXT_NoDescription"));
}
}
else {
this.description.setText (ResourceBundle.getBundle("org/netbeans/modules/project/ui/Bundle").getString("TXT_NoDescription"));
}
}
} else {
// bugfix #46738, Description in New Project dialog doesn't show description of selected categories
this.description.setText (ResourceBundle.getBundle("org/netbeans/modules/project/ui/Bundle").getString("TXT_NoDescription"));
}
this.firer.fireChange ();
}
}
}
private void postInitComponents () {
this.jLabel1.setText (this.firer.getCategoriesName());
this.jLabel1.setDisplayedMnemonic(this.firer.getCategoriesMnemonic());
this.jLabel2.setText (this.firer.getTemplatesName());
this.jLabel2.setDisplayedMnemonic (this.firer.getTemplatesMnemonic());
this.categoriesPanel.addPropertyChangeListener(this);
this.projectsPanel.addPropertyChangeListener(this);
this.description.setEditorKit(new HTMLEditorKit());
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
private void initComponents() {//GEN-BEGIN:initComponents
java.awt.GridBagConstraints gridBagConstraints;
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
categoriesPanel = new CategoriesPanel ();
projectsPanel = new TemplatesPanel ();
jLabel3 = new javax.swing.JLabel();
jScrollPane1 = new javax.swing.JScrollPane();
description = new javax.swing.JEditorPane();
setLayout(new java.awt.GridBagLayout());
setPreferredSize(new java.awt.Dimension(500, 230));
jLabel1.setDisplayedMnemonic(java.util.ResourceBundle.getBundle("org/netbeans/modules/project/ui/Bundle").getString("MNE_Categories").charAt(0));
jLabel1.setLabelFor(categoriesPanel);
jLabel1.setText(java.util.ResourceBundle.getBundle("org/netbeans/modules/project/ui/Bundle").getString("CTL_Categories"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 0.4;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 6);
add(jLabel1, gridBagConstraints);
jLabel2.setDisplayedMnemonic(java.util.ResourceBundle.getBundle("org/netbeans/modules/project/ui/Bundle").getString("MNE_Templates").charAt(0));
jLabel2.setLabelFor(projectsPanel);
jLabel2.setText(java.util.ResourceBundle.getBundle("org/netbeans/modules/project/ui/Bundle").getString("CTL_Templates"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 0.6;
gridBagConstraints.insets = new java.awt.Insets(0, 6, 0, 0);
add(jLabel2, gridBagConstraints);
categoriesPanel.setBorder(new javax.swing.border.EtchedBorder());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 0.4;
gridBagConstraints.weighty = 0.7;
gridBagConstraints.insets = new java.awt.Insets(2, 0, 6, 6);
add(categoriesPanel, gridBagConstraints);
projectsPanel.setBorder(new javax.swing.border.EtchedBorder());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 0.6;
gridBagConstraints.weighty = 0.7;
gridBagConstraints.insets = new java.awt.Insets(2, 6, 6, 0);
add(projectsPanel, gridBagConstraints);
jLabel3.setDisplayedMnemonic(java.util.ResourceBundle.getBundle("org/netbeans/modules/project/ui/Bundle").getString("CTL_DescriptionMnemonic").charAt(0));
jLabel3.setLabelFor(description);
jLabel3.setText(java.util.ResourceBundle.getBundle("org/netbeans/modules/project/ui/Bundle").getString("CTL_Description"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(2, 0, 0, 0);
add(jLabel3, gridBagConstraints);
description.setEditable(false);
description.setText(java.util.ResourceBundle.getBundle("org/netbeans/modules/project/ui/Bundle").getString("TXT_NoDescription"));
description.setPreferredSize(new java.awt.Dimension(100, 66));
jScrollPane1.setViewportView(description);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.gridheight = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 0.3;
gridBagConstraints.insets = new java.awt.Insets(2, 0, 0, 0);
add(jScrollPane1, gridBagConstraints);
}//GEN-END:initComponents
private URL getDescription (DataObject dobj) {
//XXX: Some templates are using templateWizardURL others instantiatingWizardURL. What is correct?
FileObject fo = dobj.getPrimaryFile();
URL desc = (URL) fo.getAttribute(ATTR_INSTANTIATING_DESC);
if (desc != null) {
return desc;
}
desc = TemplateWizard.getDescription (dobj);
return desc;
}
private static abstract class ExplorerProviderPanel extends JPanel implements ExplorerManager.Provider, PropertyChangeListener, VetoableChangeListener {
private ExplorerManager manager;
protected ExplorerProviderPanel () {
this.manager = new ExplorerManager ();
this.manager.addPropertyChangeListener(this);
this.manager.addVetoableChangeListener(this);
this.initGUI ();
}
public void setRootNode (Node node) {
this.manager.setRootContext(node);
}
public Node getRootNode () {
return this.manager.getRootContext();
}
public Node[] getSelectedNodes () {
return this.manager.getSelectedNodes();
}
public void setSelectedNodes (Node[] nodes) throws PropertyVetoException {
this.manager.setSelectedNodes(nodes);
}
public void setSelectedNode (String path) {
if (path == null) {
return;
}
StringTokenizer tk = new StringTokenizer (path,"/"); //NOI18N
String[] names = new String[tk.countTokens()];
for (int i=0;tk.hasMoreTokens();i++) {
names[i] = tk.nextToken();
}
try {
Node node = NodeOp.findPath(this.manager.getRootContext(),names);
if (node != null) {
this.manager.setSelectedNodes(new Node[] {node});
}
} catch (PropertyVetoException e) {
//Skeep it, not important
}
catch (NodeNotFoundException e) {
//Skeep it, not important
}
}
public String getSelectionPath () {
Node[] selectedNodes = this.manager.getSelectedNodes();
if (selectedNodes == null || selectedNodes.length != 1) {
return null;
}
Node rootNode = this.manager.getRootContext();
String[] path = NodeOp.createPath(selectedNodes[0],rootNode);
StringBuffer builder = new StringBuffer ();
for (int i=0; i< path.length; i++) {
builder.append('/'); //NOI18N
builder.append(path[i]);
}
return builder.substring(1);
}
public ExplorerManager getExplorerManager() {
return this.manager;
}
public void propertyChange (final PropertyChangeEvent event) {
// workaround of issue 43502, update of Help button set back the focus
// to component which is active when this change starts
//XXX: this workaround causes problems in the selection of templates
// and should be removed, this workaround can be workarounded in the
// setSelectedTemplateByName when template name is null
// select the first template only if no template is already selected,
// but nicer solution is to remove this workaround at all.
SwingUtilities.invokeLater (new Runnable () {
public void run () {
firePropertyChange(event.getPropertyName(),
event.getOldValue(), event.getNewValue());
}
});
}
public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException {
if (ExplorerManager.PROP_SELECTED_NODES.equals (evt.getPropertyName())) {
Node[] newValue = (Node[]) evt.getNewValue();
if (newValue == null || (newValue.length != 1 && newValue.length != 0)) {
throw new PropertyVetoException ("Invalid length",evt); //NOI18N
}
}
}
public void requestFocus () {
this.createComponent().requestFocus();
}
protected abstract JComponent createComponent ();
private void initGUI () {
this.setLayout (new GridBagLayout());
GridBagConstraints c = new GridBagConstraints ();
c.gridx = GridBagConstraints.RELATIVE;
c.gridy = GridBagConstraints.RELATIVE;
c.gridwidth = GridBagConstraints.REMAINDER;
c.gridheight = GridBagConstraints.REMAINDER;
c.fill = GridBagConstraints.BOTH;
c.anchor = GridBagConstraints.NORTHWEST;
c.weightx = 1.0;
c.weighty = 1.0;
JComponent component = this.createComponent ();
((GridBagLayout)this.getLayout()).setConstraints(component, c);
this.add (component);
}
}
private static class CategoriesBeanTreeView extends BeanTreeView {
public CategoriesBeanTreeView () {
super ();
this.tree.setEditable(false);
}
public void selectFirstCategory () {
SwingUtilities.invokeLater (new Runnable () {
public void run () {
tree.setSelectionRow (0);
}
});
}
}
private static final class CategoriesPanel extends ExplorerProviderPanel {
private CategoriesBeanTreeView btv;
protected synchronized JComponent createComponent () {
if (this.btv == null) {
this.btv = new CategoriesBeanTreeView ();
this.btv.setRootVisible(false);
this.btv.setPopupAllowed(false);
this.btv.setDefaultActionAllowed(false);
this.btv.getAccessibleContext ().setAccessibleName (NbBundle.getMessage (TemplatesPanelGUI.class, "ACSN_CategoriesPanel")); // NOI18N
this.btv.getAccessibleContext ().setAccessibleDescription (NbBundle.getMessage (TemplatesPanelGUI.class, "ACSD_CategoriesPanel")); // NOI18N
}
return this.btv;
}
public void selectFirstCategory () {
btv.selectFirstCategory ();
}
}
private static class TemplatesListView extends ListView implements ActionListener {
public TemplatesListView () {
super ();
// bugfix #44717, Enter key must work regardless if TemplatesPanels is focused
list.unregisterKeyboardAction (KeyStroke.getKeyStroke (KeyEvent.VK_ENTER, 0, false));
getAccessibleContext ().setAccessibleName ("OUTER LIST");
getAccessibleContext ().setAccessibleDescription ("DESC OUTER LIST");
setDefaultProcessor( this );
}
public void actionPerformed( ActionEvent e ) {
// Do nothing
}
}
private static final class TemplatesPanel extends ExplorerProviderPanel {
private ListView list;
protected synchronized JComponent createComponent () {
if (this.list == null) {
this.list = new TemplatesListView ();
this.list.setPopupAllowed(false);
this.list.getAccessibleContext ().setAccessibleName (NbBundle.getMessage (TemplatesPanelGUI.class, "ACSN_TemplatesPanel")); // NOI18N
this.list.getAccessibleContext ().setAccessibleDescription (NbBundle.getMessage (TemplatesPanelGUI.class, "ACSD_TemplatesPanel")); // NOI18N
}
return this.list;
}
public void selectFirstTemplate () {
try {
Children ch = getExplorerManager ().getRootContext ().getChildren ();
if (ch.getNodesCount () > 0) {
getExplorerManager ().setSelectedNodes (new Node[] { ch.getNodes ()[0] });
}
} catch (PropertyVetoException pve) {
// doesn't matter, can ignore it
}
}
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel categoriesPanel;
private javax.swing.JEditorPane description;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JPanel projectsPanel;
// End of variables declaration//GEN-END:variables
void warmUp (FileObject templatesFolder) {
if (templatesFolder != null) {
DataFolder df = DataFolder.findFolder (templatesFolder);
if (df != null) {
df.getChildren();
}
}
}
void doFinished (FileObject temlatesFolder, String category, String template) {
assert temlatesFolder != null;
this.setTemplatesFolder (temlatesFolder);
this.setSelectedCategoryByName (category);
this.setSelectedTemplateByName (template);
categoriesPanel.requestFocus ();
if (description.getEditorKit() instanceof HTMLEditorKit) {
// override the Swing default CSS to make the HTMLEditorKit use the
// same font as the rest of the UI.
// XXX the style sheet is shared by all HTMLEditorKits. We must
// detect if it has been tweaked by ourselves or someone else
// (code completion javadoc popup for example) and avoid doing the
// same thing again
HTMLEditorKit htmlkit = (HTMLEditorKit) description.getEditorKit();
StyleSheet css = htmlkit.getStyleSheet();
if (css.getStyleSheets() != null)
return;
StyleSheet css2 = new StyleSheet();
Font f = jLabel1.getFont();
css2.addRule(new StringBuffer("body { font-size: ").append(f.getSize()) // NOI18N
.append("; font-family: ").append(f.getName()).append("; }").toString()); // NOI18N
css2.addStyleSheet(css);
htmlkit.setStyleSheet(css2);
}
}
}
|
| ... 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.