org.vaadin.netbeans.maven.project.AddOnOptionsPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.vaadin.netbeans.maven.project.AddOnOptionsPanel.java

Source

/*
 * Copyright 2000-2013 Vaadin Ltd.
 *
 * 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 org.vaadin.netbeans.maven.project;

import java.awt.Component;
import java.awt.Image;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.swing.Icon;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

import org.apache.maven.project.MavenProject;
import org.netbeans.api.java.classpath.ClassPath;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.ProjectUtils;
import org.netbeans.api.project.SourceGroup;
import org.netbeans.modules.maven.api.NbMavenProject;
import org.netbeans.modules.maven.api.customizer.ModelHandle2;
import org.netbeans.modules.maven.model.ModelOperation;
import org.netbeans.modules.maven.model.Utilities;
import org.netbeans.modules.maven.model.pom.POMExtensibilityElement;
import org.netbeans.modules.maven.model.pom.POMModel;
import org.netbeans.modules.maven.model.pom.Properties;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.loaders.DataObject;
import org.openide.loaders.DataObjectNotFoundException;
import org.openide.nodes.AbstractNode;
import org.openide.nodes.Children;
import org.openide.nodes.FilterNode;
import org.openide.nodes.Node;
import org.openide.nodes.NodeAcceptor;
import org.openide.nodes.NodeOperation;
import org.openide.util.ImageUtilities;
import org.openide.util.Lookup;
import org.openide.util.NbBundle;
import org.openide.util.UserCancelException;
import org.vaadin.netbeans.utils.JavaUtils;
import org.vaadin.netbeans.utils.POMUtils;
import org.vaadin.netbeans.utils.XmlUtils;

/**
 * @author denis
 */
public class AddOnOptionsPanel extends VersionPanel {

    private static final String IMPLEMENTATION_VENDOR = "Implementation-Vendor"; // NOI18N

    private static final String IMPLEMENTATION_TITLE = "Implementation-Title"; // NOI18N

    private static final String IMPLEMENTATION_VERSION = "Implementation-Version"; // NOI18N

    public AddOnOptionsPanel(Lookup context) {
        myProject = context.lookup(Project.class);
        initComponents();

        initVersions(context, myVaadinVersion);

        readOptions(context);
        final ModelHandle2 handle = context.lookup(ModelHandle2.class);
        final AddonModification modification = new AddonModification();

        myVaadinVersion.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                final String version = (String) myVaadinVersion.getModel().getSelectedItem();
                if (version == null) {
                    return;
                }
                addModification(handle, modification);
            }

        });

        DocumentListener listener = new DocumentListener() {

            @Override
            public void removeUpdate(DocumentEvent e) {
                update();
            }

            @Override
            public void insertUpdate(DocumentEvent e) {
                update();
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                update();
            }

            private void update() {
                addModification(handle, modification);
            }
        };
        for (Component component : getComponents()) {
            if (component instanceof JTextField) {
                ((JTextField) component).getDocument().addDocumentListener(listener);
            }
        }
    }

    private void readOptions(Lookup context) {
        Project project = context.lookup(Project.class);
        NbMavenProject mvnProject = project.getLookup().lookup(NbMavenProject.class);
        MavenProject mavenProject = mvnProject.getMavenProject();
        File file = mavenProject.getFile();
        FileObject pom = FileUtil.toFileObject(FileUtil.normalizeFile(file));

        final String[] version = new String[1];
        final String[] title = new String[1];
        final String[] vendor = new String[1];
        final String[] widgetset = new String[1];
        ModelOperation<POMModel> operation = new ModelOperation<POMModel>() {

            @Override
            public void performOperation(POMModel model) {
                Properties properties = model.getProject().getProperties();
                if (properties != null) {
                    version[0] = properties.getProperty(IMPLEMENTATION_VERSION);
                    title[0] = properties.getProperty(IMPLEMENTATION_TITLE);
                    vendor[0] = properties.getProperty(IMPLEMENTATION_VENDOR);
                }
                POMExtensibilityElement widgetsets = POMUtils.getWidgetsets(model);
                if (widgetsets != null) {
                    widgetset[0] = widgetsets.getElementText();
                    if (widgetset[0] != null) {
                        widgetset[0] = widgetset[0].trim();
                    }
                }
            }
        };
        Utilities.performPOMModelOperations(pom, Collections.singletonList(operation));

        myImplTitle.setText(title[0]);
        myImplVersion.setText(version[0]);
        myImplVendor.setText(vendor[0]);
        myWidgetset.setText(widgetset[0]);
    }

    private void addModification(ModelHandle2 handle, AddonModification newOperation) {
        List<ModelOperation<POMModel>> pomOperations = handle.getPOMOperations();
        for (ModelOperation<POMModel> operation : pomOperations) {
            if (operation instanceof AddonModification) {
                handle.removePOMModification(operation);
            }
        }
        handle.addPOMModification(newOperation);
    }

    /**
     * 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() {

        versionLbl = new javax.swing.JLabel();
        myVaadinVersion = new javax.swing.JComboBox<String>();
        implVersionLbl = new javax.swing.JLabel();
        myImplVersion = new javax.swing.JTextField();
        implTitle = new javax.swing.JLabel();
        myImplTitle = new javax.swing.JTextField();
        implVendorLbl = new javax.swing.JLabel();
        myImplVendor = new javax.swing.JTextField();
        widgetsetLbl = new javax.swing.JLabel();
        myWidgetset = new javax.swing.JTextField();
        myBrowse = new javax.swing.JButton();

        versionLbl.setLabelFor(myVaadinVersion);
        org.openide.awt.Mnemonics.setLocalizedText(versionLbl,
                org.openide.util.NbBundle.getMessage(AddOnOptionsPanel.class, "LBL_VaadinVersion")); // NOI18N

        implVersionLbl.setLabelFor(myImplVersion);
        org.openide.awt.Mnemonics.setLocalizedText(implVersionLbl,
                org.openide.util.NbBundle.getMessage(AddOnOptionsPanel.class, "LBL_ImplVersion")); // NOI18N

        implTitle.setLabelFor(myImplTitle);
        org.openide.awt.Mnemonics.setLocalizedText(implTitle,
                org.openide.util.NbBundle.getMessage(AddOnOptionsPanel.class, "LBL_ImplTitle")); // NOI18N

        implVendorLbl.setLabelFor(myImplVendor);
        org.openide.awt.Mnemonics.setLocalizedText(implVendorLbl,
                org.openide.util.NbBundle.getMessage(AddOnOptionsPanel.class, "LBL_ImplVendor")); // NOI18N

        widgetsetLbl.setLabelFor(myWidgetset);
        org.openide.awt.Mnemonics.setLocalizedText(widgetsetLbl,
                org.openide.util.NbBundle.getMessage(AddOnOptionsPanel.class, "LBL_Widgetset")); // NOI18N

        myWidgetset.setEditable(false);

        org.openide.awt.Mnemonics.setLocalizedText(myBrowse,
                org.openide.util.NbBundle.getMessage(AddOnOptionsPanel.class, "LBL_Browse")); // NOI18N
        myBrowse.addActionListener(new java.awt.event.ActionListener() {

            public void actionPerformed(java.awt.event.ActionEvent evt) {
                browse(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup().addContainerGap()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(
                                        layout.createSequentialGroup().addComponent(
                                                implVendorLbl)
                                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                .addComponent(myImplVendor))
                                .addGroup(layout.createSequentialGroup()
                                        .addGroup(layout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(implVersionLbl).addComponent(
                                                        versionLbl)
                                                .addComponent(implTitle).addComponent(widgetsetLbl))
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addGroup(layout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                                .addComponent(myVaadinVersion, 0, 412, Short.MAX_VALUE)
                                                .addComponent(myImplVersion).addComponent(myImplTitle)
                                                .addGroup(layout.createSequentialGroup().addComponent(myWidgetset)
                                                        .addPreferredGap(
                                                                javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                                        .addComponent(myBrowse)))))
                        .addContainerGap()));
        layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup().addContainerGap()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(versionLbl).addComponent(myVaadinVersion,
                                        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(widgetsetLbl)
                                .addComponent(myWidgetset, javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addComponent(myBrowse))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(implVersionLbl).addComponent(myImplVersion,
                                        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(implTitle).addComponent(myImplTitle,
                                        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(implVendorLbl).addComponent(myImplVendor,
                                        javax.swing.GroupLayout.PREFERRED_SIZE,
                                        javax.swing.GroupLayout.DEFAULT_SIZE,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));

        versionLbl.getAccessibleContext().setAccessibleName(
                org.openide.util.NbBundle.getMessage(AddOnOptionsPanel.class, "ACSN_VaadinVersion")); // NOI18N
        versionLbl.getAccessibleContext().setAccessibleDescription(
                org.openide.util.NbBundle.getMessage(AddOnOptionsPanel.class, "ACSD_VaadinVersion")); // NOI18N
        myVaadinVersion.getAccessibleContext()
                .setAccessibleName(versionLbl.getAccessibleContext().getAccessibleName());
        myVaadinVersion.getAccessibleContext()
                .setAccessibleDescription(versionLbl.getAccessibleContext().getAccessibleDescription());
        implVersionLbl.getAccessibleContext().setAccessibleName(
                org.openide.util.NbBundle.getMessage(AddOnOptionsPanel.class, "ACSN_ImplVersion")); // NOI18N
        implVersionLbl.getAccessibleContext().setAccessibleDescription(
                org.openide.util.NbBundle.getMessage(AddOnOptionsPanel.class, "ACSD_ImplVersion")); // NOI18N
        myImplVersion.getAccessibleContext()
                .setAccessibleName(implVersionLbl.getAccessibleContext().getAccessibleName());
        myImplVersion.getAccessibleContext()
                .setAccessibleDescription(implVersionLbl.getAccessibleContext().getAccessibleDescription());
        implTitle.getAccessibleContext()
                .setAccessibleName(org.openide.util.NbBundle.getMessage(AddOnOptionsPanel.class, "ACSN_ImplTitle")); // NOI18N
        implTitle.getAccessibleContext().setAccessibleDescription(
                org.openide.util.NbBundle.getMessage(AddOnOptionsPanel.class, "ACSD_ImplTitle")); // NOI18N
        myImplTitle.getAccessibleContext().setAccessibleName(implTitle.getAccessibleContext().getAccessibleName());
        myImplTitle.getAccessibleContext()
                .setAccessibleDescription(implTitle.getAccessibleContext().getAccessibleDescription());
        implVendorLbl.getAccessibleContext()
                .setAccessibleName(implVendorLbl.getAccessibleContext().getAccessibleName());
        implVendorLbl.getAccessibleContext()
                .setAccessibleDescription(implVendorLbl.getAccessibleContext().getAccessibleDescription());
        widgetsetLbl.getAccessibleContext()
                .setAccessibleName(org.openide.util.NbBundle.getMessage(AddOnOptionsPanel.class, "ACSN_Widgetset")); // NOI18N
        widgetsetLbl.getAccessibleContext().setAccessibleDescription(
                org.openide.util.NbBundle.getMessage(AddOnOptionsPanel.class, "ACSD_Widgetset")); // NOI18N
        myWidgetset.getAccessibleContext()
                .setAccessibleName(widgetsetLbl.getAccessibleContext().getAccessibleName());
        myWidgetset.getAccessibleContext().setAccessibleDescription(
                org.openide.util.NbBundle.getMessage(AddOnOptionsPanel.class, "ACSD_WidgetsetValue")); // NOI18N
        myBrowse.getAccessibleContext()
                .setAccessibleName(org.openide.util.NbBundle.getMessage(AddOnOptionsPanel.class, "ACSN_Browse")); // NOI18N
        myBrowse.getAccessibleContext().setAccessibleDescription(
                org.openide.util.NbBundle.getMessage(AddOnOptionsPanel.class, "ACSD_Browse")); // NOI18N
    }// </editor-fold>//GEN-END:initComponents

    @NbBundle.Messages({ "selectWidgetset=Select Widgetset", "existingWidgetset=Existing Widgetsets:" })
    private void browse(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browse
        List<Node> nodes = new LinkedList<>();
        collectNodes(JavaUtils.getJavaSourceGroups(myProject), nodes);
        collectNodes(JavaUtils.getResourcesSourceGroups(myProject), nodes);

        Children children = new Children.Array();
        children.add(nodes.toArray(new Node[nodes.size()]));
        final Icon icon = ProjectUtils.getInformation(myProject).getIcon();
        AbstractNode root = new AbstractNode(children) {

            @Override
            public Image getIcon(int type) {
                return ImageUtilities.icon2Image(icon);
            }

            @Override
            public Image getOpenedIcon(int type) {
                return getIcon(type);
            }
        };
        root.setDisplayName(ProjectUtils.getInformation(myProject).getDisplayName());
        try {
            Node[] result = NodeOperation.getDefault().select(Bundle.selectWidgetset(), Bundle.existingWidgetset(),
                    root, new NodeAcceptor() {

                        @Override
                        public boolean acceptNodes(Node[] nodes) {
                            if (nodes.length != 1) {
                                return false;
                            }
                            FileObject fileObject = nodes[0].getLookup().lookup(FileObject.class);
                            if (fileObject == null) {
                                return false;
                            }
                            return fileObject.getNameExt().endsWith(XmlUtils.GWT_XML);
                        }
                    });
            if (result.length == 1) {
                FileObject widgetset = result[0].getLookup().lookup(FileObject.class);
                ClassPath classPath = ClassPath.getClassPath(widgetset, ClassPath.SOURCE);
                String name = classPath.getResourceName(widgetset, '.', true);
                name = name.substring(0, name.length() - XmlUtils.GWT_XML.length());
                myWidgetset.setText(name);
            }
        } catch (UserCancelException ignore) {
        }

    }//GEN-LAST:event_browse

    private void collectNodes(SourceGroup[] groups, List<Node> nodes) {
        for (SourceGroup sourceGroup : groups) {
            FileObject rootFolder = sourceGroup.getRootFolder();
            try {
                FilterNode node = new FilterNode(DataObject.find(rootFolder).getNodeDelegate());
                nodes.add(node);
            } catch (DataObjectNotFoundException ignore) {
            }
        }
    }

    private final class AddonModification implements ModelOperation<POMModel> {

        @Override
        public void performOperation(POMModel model) {
            Properties properties = model.getProject().getProperties();
            boolean needProperties = properties == null;
            if (needProperties) {
                properties = model.getFactory().createProperties();
            }
            List<POMExtensibilityElement> props = properties.getExtensibilityElements();
            Map<String, POMExtensibilityElement> values = new HashMap<>();
            for (POMExtensibilityElement param : props) {
                values.put(param.getQName().getLocalPart(), param);
            }
            String version = (String) myVaadinVersion.getModel().getSelectedItem();
            if (version != null) {
                POMExtensibilityElement versionElement = values.get(POMUtils.VAADIN_PLUGIN_VERSION);
                if (versionElement == null) {
                    versionElement = POMUtils.createElement(model, POMUtils.VAADIN_PLUGIN_VERSION,
                            version.toString());
                    properties.addExtensibilityElement(versionElement);
                } else {
                    String oldValue = POMUtils.getValue(versionElement);
                    if (oldValue == null || !oldValue.equals(version.toString())) {
                        versionElement.setElementText(version.toString());
                    }
                }
            }
            POMUtils.setTextField(IMPLEMENTATION_TITLE, values, myImplTitle, properties);
            POMUtils.setTextField(IMPLEMENTATION_VERSION, values, myImplVersion, properties);
            POMUtils.setTextField(IMPLEMENTATION_VENDOR, values, myImplVendor, properties);
            if (needProperties) {
                model.getProject().setProperties(properties);
            }

            POMExtensibilityElement widgetsets = POMUtils.getWidgetsets(model);
            if (widgetsets == null) {
                POMUtils.createWidgetset(model, myWidgetset.getText().trim());
            } else {
                POMUtils.setWidgetset(widgetsets, myWidgetset.getText().trim());
            }
        }

    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel implTitle;

    private javax.swing.JLabel implVendorLbl;

    private javax.swing.JLabel implVersionLbl;

    private javax.swing.JButton myBrowse;

    private javax.swing.JTextField myImplTitle;

    private javax.swing.JTextField myImplVendor;

    private javax.swing.JTextField myImplVersion;

    private javax.swing.JComboBox<String> myVaadinVersion;

    private javax.swing.JTextField myWidgetset;

    private javax.swing.JLabel versionLbl;

    private javax.swing.JLabel widgetsetLbl;

    // End of variables declaration//GEN-END:variables

    private Project myProject;
}