blob: 8c8181e1aa79e00411aeacf3893726d4b93f566e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.netbeans.modules.maven.newproject;
import java.awt.Component;
import java.awt.EventQueue;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
import org.netbeans.modules.maven.api.archetype.Archetype;
import org.netbeans.modules.maven.api.archetype.ArchetypeProvider;
import org.openide.WizardDescriptor;
import org.openide.util.Lookup;
import org.openide.util.RequestProcessor;
import org.openide.util.Utilities;
public class ChooseArchetypePanel extends JPanel {
private static final RequestProcessor RP = new RequestProcessor(ChooseArchetypePanel.class.getName(),5);
private static final Logger LOG = Logger.getLogger(ChooseArchetypePanel.class.getName());
private ChooseWizardPanel wizardPanel;
private final List<Archetype> archetypes = new ArrayList<Archetype>();
public ChooseArchetypePanel(ChooseWizardPanel wizPanel) {
initComponents();
this.wizardPanel = wizPanel;
textFilter.getDocument().addDocumentListener(new DocumentListener() {
@Override public void insertUpdate(DocumentEvent e) {
updateList();
}
@Override public void removeUpdate(DocumentEvent e) {
updateList();
}
@Override public void changedUpdate(DocumentEvent e) {}
});
DocumentListener dl = new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
wizardPanel.fireChangeEvent();
}
@Override
public void removeUpdate(DocumentEvent e) {
wizardPanel.fireChangeEvent();
}
@Override
public void changedUpdate(DocumentEvent e) {
wizardPanel.fireChangeEvent();
}
};
textArtifactId.getDocument().addDocumentListener(dl);
textGroupId.getDocument().addDocumentListener(dl);
textVersion.getDocument().addDocumentListener(dl);
textRepository.getDocument().addDocumentListener(dl);
listArtifact.setCellRenderer(new ArchetypeRenderer());
}
@Override
public void addNotify() {
super.addNotify();
if (archetypes.isEmpty()) {
listArtifact.setCursor(Utilities.createProgressCursor(listArtifact));
RP.post(new Runnable() {
@Override public void run() {
for (ArchetypeProvider provider : Lookup.getDefault().lookupAll(ArchetypeProvider.class)) {
final List<Archetype> added = provider.getArchetypes();
LOG.log(Level.FINE, "{0} -> {1}", new Object[] {provider, added});
Collections.sort(added, new Comparator<Archetype>() {
@Override
public int compare(Archetype o1, Archetype o2) {
int c = o1.getArtifactId().compareTo(o2.getArtifactId());
if(c != 0) {
return c;
}
String v1 = o1.getVersion();
String v2 = o2.getVersion();
if(v1 == null && v2 == null) {
return 0;
} else if(v1 == null) {
return 1;
} else if(v2 == null) {
return -1;
}
return new DefaultArtifactVersion(v1).compareTo(new DefaultArtifactVersion(v2)) * -1;
}
});
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
archetypes.addAll(added);
updateList();
}
});
}
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
listArtifact.setCursor(null);
if (listArtifact.getSelectedIndex() == -1 && listArtifact.getModel().getSize() > 0) {
listArtifact.setSelectedIndex(0);
}
}
});
}
});
}
}
private void updateList() {
Set<String> ids = new HashSet<String>();
String filter = textFilter.getText();
List<Archetype> filtered = new ArrayList<Archetype>();
for (Archetype a : archetypes) {
if (!showOld.isSelected() && !ids.add(a.getGroupId() + ":" + a.getArtifactId())) {
continue;
}
if (!filter.isEmpty() && !matches(a.getGroupId(), filter) && !matches(a.getArtifactId(), filter) && !matches(a.getVersion(), filter) &&
(a.getRepository() == null || !matches(a.getRepository(), filter))
&& !matches(a.getName(), filter) && (a.getDescription() == null || !matches(a.getDescription(), filter))) {
continue;
}
filtered.add(a);
}
Collections.sort(filtered, new Comparator<Archetype>() {
@Override
public int compare(Archetype o1, Archetype o2) {
return o1.getArtifactId().compareTo(o2.getArtifactId());
}
});
DefaultListModel model = new DefaultListModel();
for (Archetype a : filtered) {
model.addElement(a);
}
listArtifact.setModel(model);
}
private boolean matches(String field, String filter) {
return field.toLowerCase(Locale.ENGLISH).contains(filter.toLowerCase(Locale.ENGLISH));
}
private class ArchetypeRenderer extends DefaultListCellRenderer {
@Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
if (value instanceof Archetype) {
Archetype a = (Archetype) value;
String n = a.getName();
if (showOld.isSelected()) {
n += " (" + a.getVersion() + ")";
}
value = n;
}
return super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
}
}
// <editor-fold defaultstate="collapsed" desc="Generated Code (275:521)">//GEN-BEGIN:initComponents
private void initComponents() {
labelFilter = new javax.swing.JLabel();
textFilter = new javax.swing.JTextField();
showOld = new javax.swing.JCheckBox();
labelArchetypes = new javax.swing.JLabel();
jScrollPane2 = new javax.swing.JScrollPane();
listArtifact = new javax.swing.JList();
labelGroupId = new javax.swing.JLabel();
textGroupId = new javax.swing.JTextField();
labelArtifactId = new javax.swing.JLabel();
textArtifactId = new javax.swing.JTextField();
labelVersion = new javax.swing.JLabel();
textVersion = new javax.swing.JTextField();
labelRepository = new javax.swing.JLabel();
textRepository = new javax.swing.JTextField();
labelDesc = new javax.swing.JLabel();
jScrollPane1 = new javax.swing.JScrollPane();
taDescription = new javax.swing.JTextArea();
labelFilter.setLabelFor(textFilter);
org.openide.awt.Mnemonics.setLocalizedText(labelFilter, org.openide.util.NbBundle.getMessage(ChooseArchetypePanel.class, "ChooseArchetypePanel.labelFilter.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(showOld, org.openide.util.NbBundle.getMessage(ChooseArchetypePanel.class, "ChooseArchetypePanel.showOld.text")); // NOI18N
showOld.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
showOldActionPerformed(evt);
}
});
labelArchetypes.setLabelFor(listArtifact);
org.openide.awt.Mnemonics.setLocalizedText(labelArchetypes, org.openide.util.NbBundle.getMessage(ChooseArchetypePanel.class, "ChooseArchetypePanel.labelArchetypes.text")); // NOI18N
listArtifact.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
listArtifact.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
listArtifactValueChanged(evt);
}
});
jScrollPane2.setViewportView(listArtifact);
labelGroupId.setLabelFor(textGroupId);
org.openide.awt.Mnemonics.setLocalizedText(labelGroupId, org.openide.util.NbBundle.getMessage(ChooseArchetypePanel.class, "ChooseArchetypePanel.labelGroupId.text")); // NOI18N
labelArtifactId.setLabelFor(textArtifactId);
org.openide.awt.Mnemonics.setLocalizedText(labelArtifactId, org.openide.util.NbBundle.getMessage(ChooseArchetypePanel.class, "ChooseArchetypePanel.labelArtifactId.text")); // NOI18N
labelVersion.setLabelFor(textVersion);
org.openide.awt.Mnemonics.setLocalizedText(labelVersion, org.openide.util.NbBundle.getMessage(ChooseArchetypePanel.class, "ChooseArchetypePanel.labelVersion.text")); // NOI18N
labelRepository.setLabelFor(textRepository);
org.openide.awt.Mnemonics.setLocalizedText(labelRepository, org.openide.util.NbBundle.getMessage(ChooseArchetypePanel.class, "ChooseArchetypePanel.labelRepository.text")); // NOI18N
labelDesc.setLabelFor(taDescription);
org.openide.awt.Mnemonics.setLocalizedText(labelDesc, org.openide.util.NbBundle.getMessage(ChooseArchetypePanel.class, "LBL_Description")); // NOI18N
taDescription.setEditable(false);
taDescription.setBackground((java.awt.Color)(UIManager.get("TextArea.background")!=null?
UIManager.get("TextArea.background"):new java.awt.Color(238, 238, 238)));
taDescription.setColumns(20);
taDescription.setLineWrap(true);
taDescription.setRows(5);
taDescription.setText(org.openide.util.NbBundle.getMessage(ChooseArchetypePanel.class, "ChooseArchetypePanel.taDescription.text")); // NOI18N
taDescription.setWrapStyleWord(true);
jScrollPane1.setViewportView(taDescription);
taDescription.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(ChooseArchetypePanel.class, "ArchetypesPanel.taDescription.accessibledesc")); // NOI18N
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane1)
.addGroup(layout.createSequentialGroup()
.addComponent(labelFilter)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(textFilter)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(showOld))
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 636, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(labelGroupId)
.addComponent(labelVersion))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(textGroupId)
.addComponent(textVersion))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(labelArtifactId)
.addComponent(labelRepository))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(textArtifactId)
.addComponent(textRepository))
.addContainerGap())
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(labelArchetypes)
.addComponent(labelDesc))
.addGap(0, 0, Short.MAX_VALUE))
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(labelFilter)
.addComponent(textFilter, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(showOld))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(labelArchetypes)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 178, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(labelGroupId)
.addComponent(textGroupId, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(labelArtifactId)
.addComponent(textArtifactId, 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(labelVersion)
.addComponent(labelRepository)
.addComponent(textVersion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(textRepository, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(labelDesc)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 117, javax.swing.GroupLayout.PREFERRED_SIZE))
);
}// </editor-fold>//GEN-END:initComponents
private void listArtifactValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_listArtifactValueChanged
Archetype a = (Archetype) listArtifact.getSelectedValue();
if (a != null) {
textGroupId.setText(a.getGroupId());
textArtifactId.setText(a.getArtifactId());
textVersion.setText(a.getVersion());
textRepository.setText(a.getRepository());
String d = a.getDescription();
if (d != null) {
taDescription.setText(d.replaceAll("\\s+", " ").replaceAll("^ | $", ""));
} else {
taDescription.setText(null);
}
} else {
textGroupId.setText(null);
textArtifactId.setText(null);
textVersion.setText(null);
textRepository.setText(null);
taDescription.setText(null);
}
wizardPanel.fireChangeEvent();
}//GEN-LAST:event_listArtifactValueChanged
private void showOldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_showOldActionPerformed
updateList();
}//GEN-LAST:event_showOldActionPerformed
// Variables declaration - do not modify (275:518)//GEN-BEGIN:variables
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JLabel labelArchetypes;
private javax.swing.JLabel labelArtifactId;
private javax.swing.JLabel labelDesc;
private javax.swing.JLabel labelFilter;
private javax.swing.JLabel labelGroupId;
private javax.swing.JLabel labelRepository;
private javax.swing.JLabel labelVersion;
private javax.swing.JList listArtifact;
private javax.swing.JCheckBox showOld;
private javax.swing.JTextArea taDescription;
private javax.swing.JTextField textArtifactId;
private javax.swing.JTextField textFilter;
private javax.swing.JTextField textGroupId;
private javax.swing.JTextField textRepository;
private javax.swing.JTextField textVersion;
// End of variables declaration (275:519)//GEN-END:variables
void read(WizardDescriptor wizardDescriptor) {
}
void store(WizardDescriptor d) {
if (!textGroupId.getText().isEmpty()) {
Archetype a = new Archetype();
a.setGroupId(textGroupId.getText());
a.setArtifactId(textArtifactId.getText());
a.setVersion(textVersion.getText());
String r = textRepository.getText();
if (!r.isEmpty()) {
a.setRepository(r);
}
d.putProperty(MavenWizardIterator.PROP_ARCHETYPE, a);
}
}
void validate(WizardDescriptor wizardDescriptor) {
}
boolean valid(WizardDescriptor wizardDescriptor) {
return !textGroupId.getText().isEmpty() && !textArtifactId.getText().isEmpty() && !textVersion.getText().isEmpty();
}
}