/* * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* * NewApplicationTypeForm.java * * Created on Oct 22, 2008, 2:40:07 PM */ package com.sun.tools.visualvm.modules.customtype.ui; import com.sun.tools.visualvm.modules.customtype.ApplicationType; import com.sun.tools.visualvm.modules.customtype.actions.ValidationSupport; import com.sun.tools.visualvm.modules.customtype.icons.ImageUtils; import java.awt.Color; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.JFileChooser; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.filechooser.FileFilter; /** * * @author Jaroslav Bachorik */ public class ApplicationTypeForm extends javax.swing.JPanel { final private static String defaultName = "<" + "New Application Type" + ">"; final private static String defaultDescription = "<" + "Put description here" + ">"; final private static ImageIcon DEFAULT_ICON = new javax.swing.ImageIcon(ApplicationTypeForm.class.getResource("/com/sun/tools/visualvm/modules/customtype/ui/application.png")); // NOI18N private ApplicationType applicationType; private File iconFile = null; private boolean iconFileReset = false; private ValidationSupport validationSupport = new ValidationSupport() { @Override public boolean isValid() { return !appTypeName.getText().isEmpty(); } }; /** Creates new form NewApplicationTypeForm */ public ApplicationTypeForm(ApplicationType appType) { initComponents(); applicationType = appType; appTypeName.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { validationSupport.updateValidity(); } @Override public void removeUpdate(DocumentEvent e) { validationSupport.updateValidity(); } @Override public void changedUpdate(DocumentEvent e) { validationSupport.updateValidity(); } }); loadData(); } /** 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. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { iconMenu = new javax.swing.JPopupMenu(); resetIcon = new javax.swing.JMenuItem(); nameLabel = new javax.swing.JLabel(); mainClassLabel = new javax.swing.JLabel(); urlLabel = new javax.swing.JLabel(); jLabel4 = new javax.swing.JLabel(); appTypeName = new javax.swing.JTextField(); appTypeMainClass = new javax.swing.JTextField(); appTypeUrl = new javax.swing.JTextField(); descriptionLabel = new javax.swing.JLabel(); jScrollPane1 = new javax.swing.JScrollPane(); appTypeDescription = new javax.swing.JTextArea(); jScrollPane2 = new javax.swing.JScrollPane(); jTextPane1 = new javax.swing.JTextPane(); appTypeIcon = new javax.swing.JButton(); resetIcon.setText(org.openide.util.NbBundle.getMessage(ApplicationTypeForm.class, "ApplicationTypeForm.resetIcon.text")); // NOI18N resetIcon.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { resetIconActionPerformed(evt); } }); iconMenu.add(resetIcon); nameLabel.setDisplayedMnemonic('N'); nameLabel.setLabelFor(appTypeName); nameLabel.setText(org.openide.util.NbBundle.getMessage(ApplicationTypeForm.class, "ApplicationTypeForm.nameLabel.text")); // NOI18N mainClassLabel.setDisplayedMnemonic('C'); mainClassLabel.setLabelFor(appTypeMainClass); mainClassLabel.setText(org.openide.util.NbBundle.getMessage(ApplicationTypeForm.class, "ApplicationTypeForm.mainClassLabel.text")); // NOI18N urlLabel.setDisplayedMnemonic('U'); urlLabel.setLabelFor(appTypeUrl); urlLabel.setText(org.openide.util.NbBundle.getMessage(ApplicationTypeForm.class, "ApplicationTypeForm.urlLabel.text")); // NOI18N jLabel4.setDisplayedMnemonic('I'); jLabel4.setLabelFor(appTypeIcon); jLabel4.setText(org.openide.util.NbBundle.getMessage(ApplicationTypeForm.class, "ApplicationTypeForm.jLabel4.text")); // NOI18N appTypeName.setText(org.openide.util.NbBundle.getMessage(ApplicationTypeForm.class, "ApplicationTypeForm.appTypeName.text")); // NOI18N appTypeName.setFocusCycleRoot(true); appTypeName.setNextFocusableComponent(appTypeIcon); appTypeName.addFocusListener(new java.awt.event.FocusAdapter() { public void focusGained(java.awt.event.FocusEvent evt) { appTypeNameFocusGained(evt); } public void focusLost(java.awt.event.FocusEvent evt) { appTypeNameFocusLost(evt); } }); appTypeName.addKeyListener(new java.awt.event.KeyAdapter() { public void keyTyped(java.awt.event.KeyEvent evt) { appTypeNameKeyTyped(evt); } }); appTypeMainClass.setEditable(false); appTypeMainClass.setText(org.openide.util.NbBundle.getMessage(ApplicationTypeForm.class, "ApplicationTypeForm.appTypeMainClass.text")); // NOI18N appTypeMainClass.setNextFocusableComponent(appTypeUrl); appTypeUrl.setText(org.openide.util.NbBundle.getMessage(ApplicationTypeForm.class, "ApplicationTypeForm.appTypeUrl.text")); // NOI18N appTypeUrl.setNextFocusableComponent(appTypeDescription); appTypeUrl.addFocusListener(new java.awt.event.FocusAdapter() { public void focusGained(java.awt.event.FocusEvent evt) { appTypeUrlFocusGained(evt); } public void focusLost(java.awt.event.FocusEvent evt) { appTypeUrlFocusLost(evt); } }); descriptionLabel.setDisplayedMnemonic('D'); descriptionLabel.setLabelFor(appTypeDescription); descriptionLabel.setText(org.openide.util.NbBundle.getMessage(ApplicationTypeForm.class, "ApplicationTypeForm.descriptionLabel.text")); // NOI18N appTypeDescription.setColumns(20); appTypeDescription.setLineWrap(true); appTypeDescription.setRows(5); appTypeDescription.setTabSize(4); appTypeDescription.setWrapStyleWord(true); appTypeDescription.setNextFocusableComponent(appTypeName); appTypeDescription.addFocusListener(new java.awt.event.FocusAdapter() { public void focusGained(java.awt.event.FocusEvent evt) { appTypeDescriptionFocusGained(evt); } public void focusLost(java.awt.event.FocusEvent evt) { appTypeDescriptionFocusLost(evt); } }); jScrollPane1.setViewportView(appTypeDescription); jScrollPane2.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1)); jScrollPane2.setViewportBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1)); jScrollPane2.setOpaque(false); jTextPane1.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1)); jTextPane1.setContentType(org.openide.util.NbBundle.getMessage(ApplicationTypeForm.class, "ApplicationTypeForm.jTextPane1.contentType")); // NOI18N jTextPane1.setEditable(false); jTextPane1.setText(org.openide.util.NbBundle.getMessage(ApplicationTypeForm.class, "ApplicationTypeForm.jTextPane1.text")); // NOI18N jScrollPane2.setViewportView(jTextPane1); appTypeIcon.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/sun/tools/visualvm/modules/customtype/ui/application.png"))); // NOI18N appTypeIcon.setText(org.openide.util.NbBundle.getMessage(ApplicationTypeForm.class, "ApplicationTypeForm.appTypeIcon.text")); // NOI18N appTypeIcon.setComponentPopupMenu(iconMenu); appTypeIcon.setHideActionText(true); appTypeIcon.setNextFocusableComponent(appTypeMainClass); appTypeIcon.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { appTypeIconActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 463, Short.MAX_VALUE) .addComponent(mainClassLabel, javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(urlLabel) .addComponent(descriptionLabel) .addComponent(nameLabel)) .addGap(8, 8, 8) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 379, Short.MAX_VALUE) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(appTypeName, javax.swing.GroupLayout.DEFAULT_SIZE, 297, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabel4) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(appTypeIcon)) .addComponent(appTypeUrl, javax.swing.GroupLayout.DEFAULT_SIZE, 379, Short.MAX_VALUE) .addComponent(appTypeMainClass, javax.swing.GroupLayout.DEFAULT_SIZE, 379, Short.MAX_VALUE)))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(nameLabel) .addComponent(appTypeName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGap(6, 6, 6)) .addGroup(layout.createSequentialGroup() .addComponent(appTypeIcon) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED))) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(mainClassLabel) .addComponent(appTypeMainClass, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(urlLabel) .addComponent(appTypeUrl, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(descriptionLabel) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 99, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 67, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap()) ); }// </editor-fold>//GEN-END:initComponents private void appTypeNameFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_appTypeNameFocusGained appTypeName.setSelectionStart(0); appTypeName.setSelectionEnd(appTypeName.getText().length()); }//GEN-LAST:event_appTypeNameFocusGained private void appTypeNameFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_appTypeNameFocusLost appTypeName.setSelectionEnd(0); }//GEN-LAST:event_appTypeNameFocusLost private void appTypeDescriptionFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_appTypeDescriptionFocusGained appTypeDescription.setSelectionStart(0); appTypeDescription.setSelectionEnd(appTypeDescription.getText().length()); }//GEN-LAST:event_appTypeDescriptionFocusGained private void appTypeDescriptionFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_appTypeDescriptionFocusLost appTypeDescription.setSelectionEnd(0); }//GEN-LAST:event_appTypeDescriptionFocusLost private void appTypeUrlFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_appTypeUrlFocusGained appTypeUrl.setSelectionStart(0); appTypeUrl.setSelectionEnd(appTypeUrl.getText().length()); }//GEN-LAST:event_appTypeUrlFocusGained private void appTypeUrlFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_appTypeUrlFocusLost appTypeUrl.setSelectionEnd(0); }//GEN-LAST:event_appTypeUrlFocusLost private void appTypeNameKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_appTypeNameKeyTyped validationSupport.updateValidity(); }//GEN-LAST:event_appTypeNameKeyTyped private void appTypeIconActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_appTypeIconActionPerformed JFileChooser jfc = new JFileChooser(); jfc.setFileFilter(new FileFilter() { @Override public boolean accept(File f) { return (f.isDirectory() || f.getName().endsWith("png") || f.getName().endsWith("jpg") || f.getName().endsWith("jpeg") || f.getName().endsWith("gif")); } @Override public String getDescription() { return "Icon files"; } }); if (jfc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { iconFile = jfc.getSelectedFile(); try { BufferedImage img = ImageIO.read(iconFile); appTypeIcon.setIcon(new ImageIcon(ImageUtils.resizeImage(img, 16, 16))); iconFileReset = false; } catch (IOException iOException) { } } }//GEN-LAST:event_appTypeIconActionPerformed private void resetIconActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_resetIconActionPerformed iconFile = null; appTypeIcon.setIcon(DEFAULT_ICON); iconFileReset = true; }//GEN-LAST:event_resetIconActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JTextArea appTypeDescription; private javax.swing.JButton appTypeIcon; private javax.swing.JTextField appTypeMainClass; private javax.swing.JTextField appTypeName; private javax.swing.JTextField appTypeUrl; private javax.swing.JLabel descriptionLabel; private javax.swing.JPopupMenu iconMenu; private javax.swing.JLabel jLabel4; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JTextPane jTextPane1; private javax.swing.JLabel mainClassLabel; private javax.swing.JLabel nameLabel; private javax.swing.JMenuItem resetIcon; private javax.swing.JLabel urlLabel; // End of variables declaration//GEN-END:variables private void loadData() { iconFileReset = false; appTypeName.setText(applicationType.getName() == null || applicationType.getName().isEmpty() ? defaultName : applicationType.getName()); appTypeMainClass.setText(applicationType.getMainClass()); appTypeUrl.setText(applicationType.getInfoURL() != null ? applicationType.getInfoURL().toString() : ""); appTypeDescription.setText((applicationType.getDescription() != null && !applicationType.getDescription().isEmpty()) ? applicationType.getDescription() : defaultDescription); if (applicationType.getIconURL() != null) { BufferedImage iconImage = null; try { iconImage = ImageIO.read(applicationType.getIconURL()); } catch (IOException e) { } if (iconImage != null) { iconImage = ImageUtils.resizeImage(iconImage, 16, 16); } appTypeIcon.setIcon(new ImageIcon(iconImage)); } else { appTypeIcon.setIcon(DEFAULT_ICON); } appTypeMainClass.setEditable(appTypeMainClass.getText().isEmpty()); } public boolean storeData() { boolean result = true; if (appTypeName.getText().isEmpty() || appTypeName.getText().equals(defaultName)) { nameLabel.setForeground(Color.RED); result = false; } else { nameLabel.setForeground(Color.BLACK); } URL infoUrl = null; if (!appTypeUrl.getText().isEmpty()) { try { infoUrl = new URL(appTypeUrl.getText()); urlLabel.setForeground(Color.BLACK); } catch (MalformedURLException e) { urlLabel.setForeground(Color.RED); result = false; } } else { urlLabel.setForeground(Color.BLACK); } if (result) { applicationType.setName(appTypeName.getText()); applicationType.setMainClass(appTypeMainClass.getText()); applicationType.setDescription(appTypeDescription.getText().equals(defaultDescription) ? "" : appTypeDescription.getText()); if (iconFileReset) { applicationType.setIconURL(null); } else if (iconFile != null) { try { applicationType.setIconURL(iconFile.toURI().toURL()); } catch (IOException e) { } } applicationType.setInfoUrl(infoUrl); } return result; } public ValidationSupport getValidationSupport() { return validationSupport; } }