Java tutorial
/* * Copyright 2016 Alessandro Falappa. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.github.alexfalappa.nbspringboot.projects.initializr; import java.util.logging.Level; import javax.lang.model.SourceVersion; import javax.swing.DefaultComboBoxModel; import javax.swing.JComboBox; import javax.swing.JPanel; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.openide.WizardDescriptor; import org.openide.WizardValidationException; import org.openide.util.AsyncGUIJob; import org.openide.util.Exceptions; import com.fasterxml.jackson.databind.JsonNode; import static com.github.alexfalappa.nbspringboot.projects.initializr.InitializrProjectProps.WIZ_ARTIFACT; import static com.github.alexfalappa.nbspringboot.projects.initializr.InitializrProjectProps.WIZ_DESCRIPTION; import static com.github.alexfalappa.nbspringboot.projects.initializr.InitializrProjectProps.WIZ_GROUP; import static com.github.alexfalappa.nbspringboot.projects.initializr.InitializrProjectProps.WIZ_JAVA_VERSION; import static com.github.alexfalappa.nbspringboot.projects.initializr.InitializrProjectProps.WIZ_LANGUAGE; import static com.github.alexfalappa.nbspringboot.projects.initializr.InitializrProjectProps.WIZ_NAME; import static com.github.alexfalappa.nbspringboot.projects.initializr.InitializrProjectProps.WIZ_PACKAGE; import static com.github.alexfalappa.nbspringboot.projects.initializr.InitializrProjectProps.WIZ_PACKAGING; import static com.github.alexfalappa.nbspringboot.projects.initializr.InitializrProjectProps.WIZ_VERSION; public class InitializrProjectPanelVisual1 extends JPanel implements DocumentListener, AsyncGUIJob { public static final String PROP_PROJECT_NAME = "projectName"; private final DefaultComboBoxModel<NamedItem> dcbmLanguage = new DefaultComboBoxModel<>(); private final DefaultComboBoxModel<NamedItem> dcbmJavaVersion = new DefaultComboBoxModel<>(); private final DefaultComboBoxModel<NamedItem> dcbmPackaging = new DefaultComboBoxModel<>(); private final InitializrProjectWizardPanel1 panel; private JsonNode meta; private boolean initialized = false; private boolean failed = false; public InitializrProjectPanelVisual1(InitializrProjectWizardPanel1 panel) { initComponents(); this.panel = panel; } /** 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. */ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { lGroup = new javax.swing.JLabel(); lArtifact = new javax.swing.JLabel(); lName = new javax.swing.JLabel(); lDesc = new javax.swing.JLabel(); lPackage = new javax.swing.JLabel(); lPackaging = new javax.swing.JLabel(); lJavaVersion = new javax.swing.JLabel(); lLanguage = new javax.swing.JLabel(); txGroup = new javax.swing.JTextField(); txArtifact = new javax.swing.JTextField(); txName = new javax.swing.JTextField(); txDesc = new javax.swing.JTextField(); txPackage = new javax.swing.JTextField(); cbPackaging = new javax.swing.JComboBox<>(); cbJavaVersion = new javax.swing.JComboBox<>(); cbLanguage = new javax.swing.JComboBox<>(); lVersion = new javax.swing.JLabel(); txVersion = new javax.swing.JTextField(); lGroup.setLabelFor(txGroup); org.openide.awt.Mnemonics.setLocalizedText(lGroup, org.openide.util.NbBundle .getMessage(InitializrProjectPanelVisual1.class, "InitializrProjectPanelVisual1.lGroup.text")); // NOI18N lArtifact.setLabelFor(txArtifact); org.openide.awt.Mnemonics.setLocalizedText(lArtifact, org.openide.util.NbBundle .getMessage(InitializrProjectPanelVisual1.class, "InitializrProjectPanelVisual1.lArtifact.text")); // NOI18N lName.setLabelFor(txName); org.openide.awt.Mnemonics.setLocalizedText(lName, org.openide.util.NbBundle .getMessage(InitializrProjectPanelVisual1.class, "InitializrProjectPanelVisual1.lName.text")); // NOI18N lDesc.setLabelFor(txName); org.openide.awt.Mnemonics.setLocalizedText(lDesc, org.openide.util.NbBundle .getMessage(InitializrProjectPanelVisual1.class, "InitializrProjectPanelVisual1.lDesc.text")); // NOI18N lPackage.setLabelFor(txName); org.openide.awt.Mnemonics.setLocalizedText(lPackage, org.openide.util.NbBundle .getMessage(InitializrProjectPanelVisual1.class, "InitializrProjectPanelVisual1.lPackage.text")); // NOI18N lPackaging.setLabelFor(txName); org.openide.awt.Mnemonics.setLocalizedText(lPackaging, org.openide.util.NbBundle .getMessage(InitializrProjectPanelVisual1.class, "InitializrProjectPanelVisual1.lPackaging.text")); // NOI18N lJavaVersion.setLabelFor(txName); org.openide.awt.Mnemonics.setLocalizedText(lJavaVersion, org.openide.util.NbBundle.getMessage( InitializrProjectPanelVisual1.class, "InitializrProjectPanelVisual1.lJavaVersion.text")); // NOI18N lLanguage.setLabelFor(txName); org.openide.awt.Mnemonics.setLocalizedText(lLanguage, org.openide.util.NbBundle .getMessage(InitializrProjectPanelVisual1.class, "InitializrProjectPanelVisual1.lLanguage.text")); // NOI18N txGroup.setColumns(20); txGroup.setEnabled(false); txArtifact.setColumns(20); txArtifact.setEnabled(false); txName.setColumns(20); txName.setEnabled(false); txDesc.setColumns(20); txDesc.setEnabled(false); txPackage.setColumns(20); txPackage.setEnabled(false); cbPackaging.setEnabled(false); cbJavaVersion.setEnabled(false); cbLanguage.setEnabled(false); lVersion.setLabelFor(txName); org.openide.awt.Mnemonics.setLocalizedText(lVersion, org.openide.util.NbBundle .getMessage(InitializrProjectPanelVisual1.class, "InitializrProjectPanelVisual1.lVersion.text")); // NOI18N txVersion.setColumns(20); txVersion.setEnabled(false); 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.LEADING) .addComponent(lLanguage).addComponent(lGroup).addComponent(lArtifact) .addComponent(lName).addComponent(lDesc).addComponent(lPackage) .addComponent(lPackaging).addComponent(lVersion).addComponent(lJavaVersion)) .addGap(6, 6, 6) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(txGroup).addComponent(txArtifact).addComponent(txName) .addComponent(txDesc).addComponent(txPackage) .addComponent(cbPackaging, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(cbJavaVersion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(cbLanguage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(txVersion)) .addContainerGap())); layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup().addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lGroup).addComponent(txGroup, 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(lArtifact).addComponent(txArtifact, 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(lVersion).addComponent(txVersion, 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(lPackaging).addComponent(cbPackaging, 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.BASELINE) .addComponent(lName).addComponent(txName, 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(lDesc).addComponent(txDesc, 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(lPackage).addComponent(txPackage, 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.BASELINE) .addComponent(lLanguage).addComponent(cbLanguage, 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(lJavaVersion).addComponent(cbJavaVersion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))); }// </editor-fold>//GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JComboBox<String> cbJavaVersion; private javax.swing.JComboBox<String> cbLanguage; private javax.swing.JComboBox<String> cbPackaging; private javax.swing.JLabel lArtifact; private javax.swing.JLabel lDesc; private javax.swing.JLabel lGroup; private javax.swing.JLabel lJavaVersion; private javax.swing.JLabel lLanguage; private javax.swing.JLabel lName; private javax.swing.JLabel lPackage; private javax.swing.JLabel lPackaging; private javax.swing.JLabel lVersion; private javax.swing.JTextField txArtifact; private javax.swing.JTextField txDesc; private javax.swing.JTextField txGroup; private javax.swing.JTextField txName; private javax.swing.JTextField txPackage; private javax.swing.JTextField txVersion; // End of variables declaration//GEN-END:variables @Override public void addNotify() { super.addNotify(); //same problem as in 31086, initial focus on Cancel button txGroup.requestFocus(); } boolean valid(WizardDescriptor wizardDescriptor) { if (!initialized) { wizardDescriptor.putProperty(WizardDescriptor.PROP_INFO_MESSAGE, "Contacting service..."); return false; } if (failed) { wizardDescriptor.putProperty(WizardDescriptor.PROP_ERROR_MESSAGE, "Problems in contacting service!"); return false; } if (txGroup.getText().isEmpty()) { //Empty group wizardDescriptor.putProperty(WizardDescriptor.PROP_ERROR_MESSAGE, "Group can't be empty."); return false; } if (txArtifact.getText().isEmpty()) { //Empty artifact wizardDescriptor.putProperty(WizardDescriptor.PROP_ERROR_MESSAGE, "Artifact can't be empty."); return false; } if (txVersion.getText().isEmpty()) { //Empty version wizardDescriptor.putProperty(WizardDescriptor.PROP_ERROR_MESSAGE, "Version can't be empty."); return false; } if (txName.getText().isEmpty()) { //Empty name wizardDescriptor.putProperty(WizardDescriptor.PROP_ERROR_MESSAGE, "Name can't be empty."); return false; } if (!SourceVersion.isName(txPackage.getText())) { //Invalid package name wizardDescriptor.putProperty(WizardDescriptor.PROP_ERROR_MESSAGE, "Package Name is not a valid Java package name."); return false; } wizardDescriptor.putProperty(WizardDescriptor.PROP_ERROR_MESSAGE, ""); return true; } void store(WizardDescriptor wd) { wd.putProperty(WIZ_GROUP, txGroup.getText().trim()); wd.putProperty(WIZ_ARTIFACT, txArtifact.getText().trim()); wd.putProperty(WIZ_VERSION, txVersion.getText().trim()); wd.putProperty(WIZ_NAME, txName.getText().trim()); wd.putProperty(WIZ_DESCRIPTION, txDesc.getText().trim()); wd.putProperty(WIZ_PACKAGE, txPackage.getText().trim()); wd.putProperty(WIZ_JAVA_VERSION, cbJavaVersion.getSelectedItem()); wd.putProperty(WIZ_LANGUAGE, cbLanguage.getSelectedItem()); wd.putProperty(WIZ_PACKAGING, cbPackaging.getSelectedItem()); } void read(WizardDescriptor wd) { if (initialized) { this.txGroup.setText((String) wd.getProperty(WIZ_GROUP)); this.txArtifact.setText((String) wd.getProperty(WIZ_ARTIFACT)); this.txVersion.setText((String) wd.getProperty(WIZ_VERSION)); this.txName.setText((String) wd.getProperty(WIZ_NAME)); this.txDesc.setText((String) wd.getProperty(WIZ_DESCRIPTION)); this.txPackage.setText((String) wd.getProperty(WIZ_PACKAGE)); cbJavaVersion.setSelectedItem(wd.getProperty(WIZ_JAVA_VERSION)); cbLanguage.setSelectedItem(wd.getProperty(WIZ_LANGUAGE)); cbPackaging.setSelectedItem(wd.getProperty(WIZ_PACKAGING)); } } private void fillCombo(JsonNode attrNode, DefaultComboBoxModel<NamedItem> comboModel, JComboBox combo) { JsonNode valArray = attrNode.path("values"); comboModel.removeAllElements(); for (JsonNode val : valArray) { comboModel.addElement(new NamedItem(val.get("id").asText(), val.get("name").asText())); } combo.setModel(comboModel); combo.setSelectedItem(new NamedItem(attrNode.path("default").asText(), "")); } void validate(WizardDescriptor d) throws WizardValidationException { // nothing to validate } @Override public void insertUpdate(DocumentEvent e) { panel.fireChangeEvent(); } @Override public void removeUpdate(DocumentEvent e) { panel.fireChangeEvent(); } @Override public void changedUpdate(DocumentEvent e) { panel.fireChangeEvent(); } @Override public void construct() { try { meta = panel.getInitializrMetadata(); initialized = true; } catch (Exception ex) { panel.wizardDescriptor.putProperty(WizardDescriptor.PROP_ERROR_MESSAGE, "Could not query Initializr service"); Exceptions.printStackTrace(Exceptions.attachSeverity(ex, Level.WARNING)); failed = true; panel.fireChangeEvent(); } } @Override public void finished() { if (initialized) { // fill fields txGroup.setText(meta.path("groupId").path("default").asText()); txArtifact.setText(meta.path("artifactId").path("default").asText()); txVersion.setText(meta.path("version").path("default").asText()); txName.setText(meta.path("name").path("default").asText()); txDesc.setText(meta.path("description").path("default").asText()); txPackage.setText(meta.path("packageName").path("default").asText()); fillCombo(meta.path("javaVersion"), dcbmJavaVersion, cbJavaVersion); fillCombo(meta.path("language"), dcbmLanguage, cbLanguage); fillCombo(meta.path("packaging"), dcbmPackaging, cbPackaging); // add listeners for validation txGroup.getDocument().addDocumentListener(this); txArtifact.getDocument().addDocumentListener(this); txVersion.getDocument().addDocumentListener(this); txName.getDocument().addDocumentListener(this); txPackage.getDocument().addDocumentListener(this); // enable fields txGroup.setEnabled(true); txArtifact.setEnabled(true); txName.setEnabled(true); txDesc.setEnabled(true); txPackage.setEnabled(true); cbPackaging.setEnabled(true); cbJavaVersion.setEnabled(true); cbLanguage.setEnabled(true); txVersion.setEnabled(true); panel.fireChangeEvent(); } } }