blob: cc6cbb5f7ae5291ee55e3deafe0c71d7b43d1dab [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.customizer;
import java.awt.Color;
import org.netbeans.modules.maven.runjar.PropertySplitter;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.JTextComponent;
import org.codehaus.plexus.util.StringUtils;
import org.jdom.Verifier;
import org.netbeans.api.annotations.common.NullAllowed;
import org.netbeans.api.java.platform.JavaPlatform;
import org.netbeans.api.java.platform.JavaPlatformManager;
import org.netbeans.modules.maven.ActionProviderImpl;
import org.netbeans.modules.maven.NbMavenProjectImpl;
import org.netbeans.modules.maven.TestChecker;
import org.netbeans.modules.maven.TextValueCompleter;
import org.netbeans.modules.maven.actions.RunCustomMavenAction;
import org.netbeans.modules.maven.api.Constants;
import org.netbeans.modules.maven.api.NbMavenProject;
import org.netbeans.modules.maven.api.ProjectProfileHandler;
import org.netbeans.modules.maven.api.customizer.ModelHandle2;
import static org.netbeans.modules.maven.customizer.Bundle.*;
import org.netbeans.modules.maven.embedder.EmbedderFactory;
import org.netbeans.modules.maven.execute.ActionToGoalUtils;
import org.netbeans.modules.maven.execute.DefaultReplaceTokenProvider;
import org.netbeans.modules.maven.execute.model.ActionToGoalMapping;
import org.netbeans.modules.maven.execute.model.NetbeansActionMapping;
import org.netbeans.modules.maven.options.DontShowAgainSettings;
import org.netbeans.modules.maven.spi.grammar.GoalsProvider;
import org.netbeans.spi.project.ActionProvider;
import org.openide.DialogDescriptor;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.awt.Mnemonics;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.util.Exceptions;
import org.openide.util.HelpCtx;
import org.openide.util.ImageUtilities;
import org.openide.util.Lookup;
import org.openide.util.NbBundle;
import org.openide.util.NbBundle.Messages;
import org.openide.util.RequestProcessor;
/**
*
* @author mkleint
*/
public class ActionMappings extends javax.swing.JPanel implements HelpCtx.Provider {
public static final String CUSTOM_ACTION_PREFIX = "CUSTOM-"; //NOI18N
private static final RequestProcessor RP = new RequestProcessor(ActionMappings.class);
private NbMavenProjectImpl project;
private ModelHandle2 handle;
private final HashMap<String, String> titles = new HashMap<String, String>();
private final GoalsListener goalsListener;
private final TextValueCompleter goalcompleter;
private final TextValueCompleter profilecompleter;
private final ProfilesListener profilesListener;
private final PackagingsListener packagingsListener;
private final PropertiesListener propertiesListener;
private final RecursiveListener recursiveListener;
private final DepsListener depsListener;
private ActionToGoalMapping actionmappings;
private ActionListener comboListener;
private ActionMappings() {
initComponents();
lstMappings.setCellRenderer(new Renderer());
lstMappings.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
goalsListener = new GoalsListener();
profilesListener = new ProfilesListener();
packagingsListener = new PackagingsListener();
propertiesListener = new PropertiesListener();
recursiveListener = new RecursiveListener();
depsListener = new DepsListener();
FocusListener focus = new FocusListener() {
@Override public void focusGained(FocusEvent e) {
if (e.getComponent() == txtGoals) {
lblHint.setText(NbBundle.getMessage(ActionMappings.class, "ActionMappings.txtGoals.hint"));
}
if (e.getComponent() == txtProfiles) {
lblHint.setText(NbBundle.getMessage(ActionMappings.class, "ActinMappings.txtProfiles.hint"));
}
if (e.getComponent() == epProperties) {
lblHint.setText(NbBundle.getMessage(ActionMappings.class, "ActinMappings.txtProperties.hint"));
}
if (e.getComponent() == txtPackagings) {
lblHint.setText(NbBundle.getMessage(ActionMappings.class, "ActinMappings.txtPackagings.hint"));
}
}
@Override public void focusLost(FocusEvent e) {
lblHint.setText(""); //NOI18N
}
};
txtGoals.addFocusListener(focus);
txtProfiles.addFocusListener(focus);
epProperties.addFocusListener(focus);
txtPackagings.addFocusListener(focus);
goalcompleter = new TextValueCompleter(Collections.<String>emptyList(), txtGoals, " "); //NOI18N
profilecompleter = new TextValueCompleter(Collections.<String>emptyList(), txtProfiles, " "); //NOI18N
if( "Aqua".equals(UIManager.getLookAndFeel().getID()) ) { //NOI18N
this.lblHint.setOpaque(true);
jScrollPane2.setBorder(null);
}
}
public ActionMappings(ActionToGoalMapping mapp) {
this();
actionmappings = mapp;
loadMappings();
cbRecursively.setVisible(false);
comConfiguration.setVisible(false);
lblConfiguration.setVisible(false);
clearFields();
Mnemonics.setLocalizedText(btnAdd, NbBundle.getMessage(ActionMappings.class, "ActionMappings.btnAdd.text2"));
Mnemonics.setLocalizedText(btnRemove, NbBundle.getMessage(ActionMappings.class, "ActionMappings.btnRemove.text2"));
}
/** Creates new form ActionMappings */
public ActionMappings(ModelHandle2 hand, NbMavenProjectImpl proj) {
this();
project = proj;
handle = hand;
txtPackagings.setVisible(false);
lblPackagings.setVisible(false);
jButton1.setVisible(false);
titles.put(ActionProvider.COMMAND_BUILD, NbBundle.getMessage(ActionMappings.class, "COM_Build_project"));
titles.put(ActionProvider.COMMAND_CLEAN, NbBundle.getMessage(ActionMappings.class, "COM_Clean_project"));
titles.put(ActionProvider.COMMAND_COMPILE_SINGLE, NbBundle.getMessage(ActionMappings.class, "COM_Compile_file"));
titles.put(ActionProvider.COMMAND_DEBUG, NbBundle.getMessage(ActionMappings.class, "COM_Debug_project"));
titles.put(ActionProviderImpl.COMMAND_DEBUG_MAIN, NbBundle.getMessage(ActionMappings.class, "COM_Debug_file_main"));
titles.put(ActionProvider.COMMAND_DEBUG_SINGLE + ".deploy", NbBundle.getMessage(ActionMappings.class, "COM_Debug_file_deploy"));
titles.put(ActionProvider.COMMAND_DEBUG_STEP_INTO, null);
titles.put(ActionProvider.COMMAND_DEBUG_TEST_SINGLE, NbBundle.getMessage(ActionMappings.class, "COM_Debug_test"));
titles.put(ActionProvider.COMMAND_REBUILD, NbBundle.getMessage(ActionMappings.class, "COM_ReBuild_project"));
titles.put(ActionProvider.COMMAND_RUN, NbBundle.getMessage(ActionMappings.class, "COM_Run_project"));
titles.put(ActionProviderImpl.COMMAND_RUN_MAIN, NbBundle.getMessage(ActionMappings.class, "COM_Run_file_main"));
titles.put(ActionProvider.COMMAND_RUN_SINGLE + ".deploy", NbBundle.getMessage(ActionMappings.class, "COM_Run_file_deploy"));
titles.put(ActionProvider.COMMAND_TEST, NbBundle.getMessage(ActionMappings.class, "COM_Test_project"));
titles.put(ActionProvider.COMMAND_TEST_SINGLE, NbBundle.getMessage(ActionMappings.class, "COM_Test_file"));
titles.put(ActionProvider.COMMAND_PROFILE, NbBundle.getMessage(ActionMappings.class, "COM_Profile_project"));
titles.put(ActionProviderImpl.COMMAND_PROFILE_MAIN, NbBundle.getMessage(ActionMappings.class, "COM_Profile_file_main"));
titles.put(ActionProvider.COMMAND_PROFILE_SINGLE + ".deploy", NbBundle.getMessage(ActionMappings.class, "COM_Profile_file_deploy"));
titles.put(ActionProvider.COMMAND_PROFILE_TEST_SINGLE, NbBundle.getMessage(ActionMappings.class, "COM_Profile_test"));
titles.put("javadoc", NbBundle.getMessage(ActionMappings.class, "COM_Javadoc_project"));
titles.put(ActionProviderImpl.BUILD_WITH_DEPENDENCIES, NbBundle.getMessage(ActionMappings.class, "COM_Build_WithDeps_project"));
titles.put(ActionProviderImpl.COMMAND_INTEGRATION_TEST_SINGLE, NbBundle.getMessage(ActionMappings.class, "COM_Integration_Test_file"));
titles.put(ActionProviderImpl.COMMAND_DEBUG_INTEGRATION_TEST_SINGLE, NbBundle.getMessage(ActionMappings.class, "COM_Debug_Integration_test"));
comConfiguration.setEditable(false);
comConfiguration.setRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
Component com = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if (com instanceof JLabel) {
if (value == ActionMappings.this.handle.getActiveConfiguration()) {
com.setFont(com.getFont().deriveFont(Font.BOLD));
}
}
return com;
}
});
setupConfigurations();
loadMappings();
clearFields();
comboListener = new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
clearFields();
loadMappings();
addListeners();
}
};
}
private boolean isGlobal() {
return project == null;
}
public static void showAddPropertyPopupMenu(JButton btn, JTextComponent area, JTextField goalsField, @NullAllowed NbMavenProjectImpl project) {
JPopupMenu menu = new JPopupMenu();
menu.add(new SkipTestsAction(area));
menu.add(new DebugMavenAction(area));
menu.add(new EnvVarAction(area));
menu.add(createJdkSubmenu(area));
menu.add(createGlobalVarSubmenu(area));
if (project != null) {
menu.add(new PluginPropertyAction(area, goalsField, project));
}
menu.add(createFileSelectionSubmenu(area));
menu.show(btn, btn.getSize().width, 0);
}
private void addListeners() {
comConfiguration.addActionListener(comboListener);
}
@Override
public void removeNotify() {
super.removeNotify();
clearFields();
}
@Override
public void addNotify() {
super.addNotify();
setupConfigurations();
loadMappings();
addListeners();
RP.post(new Runnable() {
@Override public void run() {
final Set<String> strs = new HashSet<String>();
final GoalsProvider provider = Lookup.getDefault().lookup(GoalsProvider.class);
if (provider != null) {
strs.addAll(provider.getAvailableGoals());
}
try {
strs.addAll(EmbedderFactory.getProjectEmbedder().getLifecyclePhases());
} catch (RuntimeException e) { //TODO why do we catch?
// oh wel just ignore..
e.printStackTrace();
}
List<String> allProfiles = null;
if (project != null) {
ProjectProfileHandler profileHandler = project.getLookup().lookup(ProjectProfileHandler.class);
allProfiles = profileHandler.getAllProfiles();
}
final List<String> profiles = allProfiles;
SwingUtilities.invokeLater(new Runnable() {
@Override public void run() {
goalcompleter.setValueList(strs, false); //do not bother about partial results, too many intermediate apis..
if (profiles != null) {
profilecompleter.setValueList(profiles, false);
}
}
});
}
});
}
/** 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() {
java.awt.GridBagConstraints gridBagConstraints;
lblConfiguration = new javax.swing.JLabel();
comConfiguration = new javax.swing.JComboBox();
jScrollPane1 = new javax.swing.JScrollPane();
lstMappings = new javax.swing.JList();
btnAdd = new javax.swing.JButton();
btnRemove = new javax.swing.JButton();
lblGoals = new javax.swing.JLabel();
txtGoals = new javax.swing.JTextField();
lblProfiles = new javax.swing.JLabel();
txtProfiles = new javax.swing.JTextField();
lblProperties = new javax.swing.JLabel();
cbRecursively = new javax.swing.JCheckBox();
lblMappings = new javax.swing.JLabel();
jScrollPane2 = new javax.swing.JScrollPane();
lblHint = new javax.swing.JLabel();
btnAddProps = new javax.swing.JButton();
cbBuildWithDeps = new javax.swing.JCheckBox();
jScrollPane5 = new javax.swing.JScrollPane();
epProperties = new javax.swing.JEditorPane();
lblPackagings = new javax.swing.JLabel();
txtPackagings = new javax.swing.JTextField();
jButton1 = new javax.swing.JButton();
setLayout(new java.awt.GridBagLayout());
lblConfiguration.setLabelFor(comConfiguration);
org.openide.awt.Mnemonics.setLocalizedText(lblConfiguration, org.openide.util.NbBundle.getMessage(ActionMappings.class, "ActionMappings.lblConfiguration.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(5, 12, 0, 0);
add(lblConfiguration, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 7;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 4;
gridBagConstraints.gridheight = 2;
gridBagConstraints.ipadx = 427;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(0, 18, 0, 12);
add(comConfiguration, gridBagConstraints);
comConfiguration.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(ActionMappings.class, "ActionMappings.comConfiguration.AccessibleContext.accessibleDescription")); // NOI18N
jScrollPane1.setMinimumSize(new java.awt.Dimension(243, 130));
jScrollPane1.setPreferredSize(new java.awt.Dimension(243, 130));
lstMappings.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
lstMappingsValueChanged(evt);
}
});
jScrollPane1.setViewportView(lstMappings);
lstMappings.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(ActionMappings.class, "ActionMappings.lstMappings.AccessibleContext.accessibleDescription")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 7;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.gridheight = 5;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.ipadx = 62;
gridBagConstraints.ipady = -21;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(6, 18, 0, 0);
add(jScrollPane1, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(btnAdd, org.openide.util.NbBundle.getMessage(ActionMappings.class, "ActionMappings.btnAdd.text")); // NOI18N
btnAdd.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnAddActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 10;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridheight = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.ipadx = 15;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(6, 6, 0, 12);
add(btnAdd, gridBagConstraints);
btnAdd.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(ActionMappings.class, "ActionMappings.btnAdd.AccessibleContext.accessibleDescription")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(btnRemove, org.openide.util.NbBundle.getMessage(ActionMappings.class, "ActionMappings.btnRemove.text")); // NOI18N
btnRemove.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnRemoveActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 10;
gridBagConstraints.gridy = 4;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.ipadx = 14;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(6, 6, 0, 12);
add(btnRemove, gridBagConstraints);
btnRemove.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(ActionMappings.class, "ActionMappings.btnRemove.AccessibleContext.accessibleDescription")); // NOI18N
lblGoals.setLabelFor(txtGoals);
org.openide.awt.Mnemonics.setLocalizedText(lblGoals, org.openide.util.NbBundle.getMessage(ActionMappings.class, "ActionMappings.lblGoals.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 7;
gridBagConstraints.gridwidth = 4;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(20, 12, 0, 0);
add(lblGoals, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 7;
gridBagConstraints.gridy = 7;
gridBagConstraints.gridwidth = 4;
gridBagConstraints.gridheight = 2;
gridBagConstraints.ipadx = 455;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(18, 18, 0, 12);
add(txtGoals, gridBagConstraints);
txtGoals.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(ActionMappings.class, "ActionMappings.txtGoals.AccessibleContext.accessibleDescription")); // NOI18N
lblProfiles.setLabelFor(txtProfiles);
org.openide.awt.Mnemonics.setLocalizedText(lblProfiles, org.openide.util.NbBundle.getMessage(ActionMappings.class, "ActionMappings.lblProfiles.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 9;
gridBagConstraints.gridwidth = 6;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(8, 12, 0, 0);
add(lblProfiles, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 7;
gridBagConstraints.gridy = 9;
gridBagConstraints.gridwidth = 4;
gridBagConstraints.gridheight = 2;
gridBagConstraints.ipadx = 455;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(6, 18, 0, 12);
add(txtProfiles, gridBagConstraints);
txtProfiles.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(ActionMappings.class, "ActionMappings.txtProfiles.AccessibleContext.accessibleDescription")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(lblProperties, org.openide.util.NbBundle.getMessage(ActionMappings.class, "ActionMappings.lblProperties.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 13;
gridBagConstraints.gridwidth = 5;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(6, 12, 0, 0);
add(lblProperties, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(cbRecursively, org.openide.util.NbBundle.getMessage(ActionMappings.class, "ActionMappings.cbRecursively.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 7;
gridBagConstraints.gridy = 15;
gridBagConstraints.gridwidth = 4;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(2, 18, 0, 0);
add(cbRecursively, gridBagConstraints);
lblMappings.setLabelFor(lstMappings);
org.openide.awt.Mnemonics.setLocalizedText(lblMappings, org.openide.util.NbBundle.getMessage(ActionMappings.class, "LBL_Actions")); // NOI18N
lblMappings.setVerticalAlignment(javax.swing.SwingConstants.BOTTOM);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(6, 12, 0, 0);
add(lblMappings, gridBagConstraints);
jScrollPane2.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1));
lblHint.setVerticalAlignment(javax.swing.SwingConstants.BOTTOM);
jScrollPane2.setViewportView(lblHint);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 7;
gridBagConstraints.gridy = 17;
gridBagConstraints.gridwidth = 4;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.ipadx = 436;
gridBagConstraints.ipady = 120;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(2, 18, 0, 12);
add(jScrollPane2, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(btnAddProps, org.openide.util.NbBundle.getMessage(ActionMappings.class, "ActionMappings.btnAddProps.text")); // NOI18N
btnAddProps.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnAddPropsActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 14;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(6, 12, 0, 0);
add(btnAddProps, gridBagConstraints);
btnAddProps.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(ActionMappings.class, "ActionMappings.btnAddProps.AccessibleContext.accessibleDescription")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(cbBuildWithDeps, org.openide.util.NbBundle.getMessage(ActionMappings.class, "ActionMappings.cbBuildWithDeps.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 7;
gridBagConstraints.gridy = 16;
gridBagConstraints.gridwidth = 4;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(2, 18, 0, 0);
add(cbBuildWithDeps, gridBagConstraints);
cbBuildWithDeps.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(ActionMappings.class, "ActionMappings.cbBuildWithDeps.AccessibleContext.accessibleDescription")); // NOI18N
epProperties.setContentType("text/x-properties"); // NOI18N
jScrollPane5.setViewportView(epProperties);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 7;
gridBagConstraints.gridy = 13;
gridBagConstraints.gridwidth = 4;
gridBagConstraints.gridheight = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.ipadx = 437;
gridBagConstraints.ipady = 24;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(6, 18, 0, 12);
add(jScrollPane5, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(lblPackagings, org.openide.util.NbBundle.getMessage(ActionMappings.class, "ActionMappings.lblPackagings.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 11;
gridBagConstraints.gridwidth = 7;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(8, 12, 0, 0);
add(lblPackagings, gridBagConstraints);
txtPackagings.setText(org.openide.util.NbBundle.getMessage(ActionMappings.class, "ActionMappings.txtPackagings.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 7;
gridBagConstraints.gridy = 11;
gridBagConstraints.gridwidth = 4;
gridBagConstraints.gridheight = 2;
gridBagConstraints.ipadx = 455;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(6, 18, 0, 12);
add(txtPackagings, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(jButton1, org.openide.util.NbBundle.getMessage(ActionMappings.class, "ActionMappings.jButton1.text")); // NOI18N
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 10;
gridBagConstraints.gridy = 5;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(6, 6, 0, 12);
add(jButton1, gridBagConstraints);
}// </editor-fold>//GEN-END:initComponents
//GEN-FIRST:event_btnAddActionPerformed
private void btnAddActionPerformed(java.awt.event.ActionEvent evt) {//GEN-HEADEREND:event_btnAddActionPerformed
NotifyDescriptor.InputLine nd = new NonEmptyInputLine(org.openide.util.NbBundle.getMessage(ActionMappings.class, "TIT_Add_action"), org.openide.util.NbBundle.getMessage(ActionMappings.class, "LBL_AddAction"));
Object ret = DialogDisplayer.getDefault().notify(nd);
if (ret == NotifyDescriptor.OK_OPTION) {
NetbeansActionMapping nam = new NetbeansActionMapping();
nam.setDisplayName(nd.getInputText());
nam.setActionName(CUSTOM_ACTION_PREFIX + nd.getInputText());
getActionMappings().addAction(nam);
if (handle != null) {
handle.markAsModified(getActionMappings());
}
MappingWrapper wr = new MappingWrapper(nam);
wr.setUserDefined(true);
((DefaultListModel)lstMappings.getModel()).addElement(wr);
lstMappings.setSelectedIndex(lstMappings.getModel().getSize() - 1);
lstMappings.ensureIndexIsVisible(lstMappings.getModel().getSize() - 1);
}
}//GEN-LAST:event_btnAddActionPerformed
private void btnRemoveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRemoveActionPerformed
Object obj = lstMappings.getSelectedValue();//GEN-HEADEREND:event_btnRemoveActionPerformed
if (obj == null) {
return;
}
MappingWrapper wr = (MappingWrapper)obj;
NetbeansActionMapping mapp = wr.getMapping();
if (mapp != null) {
if (mapp.getActionName().startsWith(CUSTOM_ACTION_PREFIX)) {
((DefaultListModel)lstMappings.getModel()).removeElement(wr);
}
//remove toolbar if associated. //TODO remove somehow in apply()
if (wr.getToolbarIconPath() != null) {
try {
//delete
RunCustomMavenAction.deleteDeclaration(wr.getActionName());
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
}
// try removing from model, if exists..
Iterator<NetbeansActionMapping> it = getActionMappings().getActions().iterator();
while (it.hasNext()) {
if (mapp.getActionName().equals(it.next().getActionName())) {
it.remove();
if (handle != null) {
mapp = ActionToGoalUtils.getDefaultMapping(mapp.getActionName(), project);
} else {
mapp = null;
}
wr.setMapping(mapp);
wr.setUserDefined(false);
lstMappingsValueChanged(null);
if (handle != null) {
handle.markAsModified(getActionMappings());
}
break;
}
}
}
}//GEN-LAST:event_btnRemoveActionPerformed
private void updateEnabledControls(MappingWrapper wr) {
boolean notEmpty = wr != null;
if (notEmpty) {
lblGoals.setEnabled(true);
lblHint.setEnabled(true);
lblPackagings.setEnabled(true);
lblProfiles.setEnabled(true);
lblProperties.setEnabled(true);
txtGoals.setEnabled(true);
epProperties.setEnabled(true);
txtProfiles.setEnabled(true);
cbRecursively.setEnabled(true);
cbBuildWithDeps.setEnabled(true);
btnAddProps.setEnabled(true);
btnRemove.setEnabled(true);
if (isGlobal()) {
txtPackagings.setEnabled(true);
}
} else {
clearFields();
btnRemove.setEnabled(false);
}
}
private void lstMappingsValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_lstMappingsValueChanged
MappingWrapper wr = (MappingWrapper)lstMappings.getSelectedValue();
updateEnabledControls(wr);
if (wr != null) {
NetbeansActionMapping mapp = wr.getMapping();
txtGoals.getDocument().removeDocumentListener(goalsListener);
txtProfiles.getDocument().removeDocumentListener(profilesListener);
epProperties.getDocument().removeDocumentListener(propertiesListener);
cbRecursively.removeActionListener(recursiveListener);
cbBuildWithDeps.removeActionListener(depsListener);
if (isGlobal()) {
txtPackagings.getDocument().removeDocumentListener(packagingsListener);
txtPackagings.setText(createSpaceSeparatedList(mapp != null ? mapp.getPackagings() : Collections.<String>emptyList()));
txtPackagings.getDocument().addDocumentListener(packagingsListener);
}
txtGoals.setText(createSpaceSeparatedList(mapp != null ? mapp.getGoals() : Collections.<String>emptyList()));
txtProfiles.setText(createSpaceSeparatedList(mapp != null ? mapp.getActivatedProfiles() : Collections.<String>emptyList()));
epProperties.setText(createPropertiesList(mapp != null ? mapp.getProperties() : Collections.<String,String>emptyMap()));
epProperties.setCaretPosition(0);
if (handle != null && "pom".equals(handle.getProject().getPackaging())) { //NOI18N
cbRecursively.setEnabled(true);
cbRecursively.setSelected(mapp != null ? mapp.isRecursive() : true);
}
cbBuildWithDeps.setSelected(mapp != null && ActionProviderImpl.BUILD_WITH_DEPENDENCIES.equals(mapp.getPreAction())); //NOI18N
if (mapp != null && ActionProviderImpl.BUILD_WITH_DEPENDENCIES.equals(mapp.getActionName())) { //NOI18N
cbBuildWithDeps.setEnabled(false);
} else {
cbBuildWithDeps.setEnabled(true);
}
txtGoals.getDocument().addDocumentListener(goalsListener);
txtProfiles.getDocument().addDocumentListener(profilesListener);
epProperties.getDocument().addDocumentListener(propertiesListener);
cbRecursively.addActionListener(recursiveListener);
cbBuildWithDeps.addActionListener(depsListener);
btnAddProps.setEnabled(true);
updateColor(wr);
if (handle == null) { //only global settings
updateToolbarButton(wr);
}
}
}//GEN-LAST:event_lstMappingsValueChanged
private void btnAddPropsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAddPropsActionPerformed
showAddPropertyPopupMenu(btnAddProps, epProperties, txtGoals, project);
}//GEN-LAST:event_btnAddPropsActionPerformed
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
Object obj = lstMappings.getSelectedValue();
if (obj != null) {
MappingWrapper wr = (MappingWrapper)obj;
if (wr.getToolbarIconPath() != null) {
wr.setToolbarPath(null);
updateToolbarButton(wr);
} else {
//add
JPanel pnl = new JPanel();
pnl.setLayout(new FlowLayout(FlowLayout.LEADING));
pnl.add(new JLabel(LBL_SetIcon()));
List<String> allIcons = RunCustomMavenAction.createAllActionIcons();
for (int i = 0; i < lstMappings.getModel().getSize(); i++) {
MappingWrapper wr0 = (MappingWrapper) lstMappings.getModel().getElementAt(i);
if (wr0.getToolbarIconPath() != null) {
allIcons.remove(wr0.getToolbarIconPath());
}
}
DefaultComboBoxModel<String> cbModel = new DefaultComboBoxModel<String>(allIcons.toArray(new String[0]));
boolean hasAvailable;
if (cbModel.getSize() != 0) {
hasAvailable = true;
JComboBox<String> cb = new JComboBox<String>();
cb.setModel(cbModel);
pnl.add(cb);
cb.setRenderer(new DefaultListCellRenderer() {
@Override
public Component getListCellRendererComponent(JList arg0, Object arg1, int arg2, boolean arg3, boolean arg4) {
Component sup = super.getListCellRendererComponent(arg0, arg1, arg2, arg3, arg4);
if (sup instanceof JLabel && arg1 != null) {
JLabel lbl = (JLabel) sup;
lbl.setIcon(ImageUtilities.loadImageIcon((String) arg1, false));
lbl.setText("");
}
return sup;
}
});
} else {
hasAvailable = false;
pnl.add(new JLabel(LBL_No_More_Icons()));
}
DialogDescriptor dd = new DialogDescriptor(pnl, TIT_SetIcon());
if (!hasAvailable) {
dd.setOptions(new Object[] {BTN_Close()});
dd.setClosingOptions(dd.getOptions());
}
Object ret = DialogDisplayer.getDefault().notify(dd);
if (ret == DialogDescriptor.OK_OPTION) {
wr.setToolbarPath((String) cbModel.getSelectedItem());
updateToolbarButton(wr);
}
}
}
}//GEN-LAST:event_jButton1ActionPerformed
@Messages({"LBL_SetIcon=Set Icon:",
"LBL_No_More_Icons=<No more slots available>",
"BTN_Close=Close",
"TIT_SetIcon=Set Toolbar Action Icon"
})
private void loadMappings() {
DefaultListModel model = new DefaultListModel();
if (handle != null) {
boolean isWar = NbMavenProject.TYPE_WAR.equalsIgnoreCase(project.getProjectWatcher().getPackagingType());
addSingleAction(ActionProvider.COMMAND_BUILD, model);
addSingleAction(ActionProvider.COMMAND_CLEAN, model);
addSingleAction(ActionProvider.COMMAND_REBUILD, model);
addSingleAction(ActionProviderImpl.BUILD_WITH_DEPENDENCIES, model);
addSingleAction(ActionProvider.COMMAND_TEST, model);
addSingleAction(ActionProvider.COMMAND_TEST_SINGLE, model);
addSingleAction(ActionProviderImpl.COMMAND_INTEGRATION_TEST_SINGLE, model);
addSingleAction(ActionProvider.COMMAND_RUN, model);
addSingleAction(ActionProvider.COMMAND_RUN_SINGLE + ".main", model); //NOI18N
if (isWar) {
addSingleAction(ActionProvider.COMMAND_RUN_SINGLE + ".deploy", model); //NOI18N
}
addSingleAction(ActionProvider.COMMAND_DEBUG, model);
addSingleAction(ActionProvider.COMMAND_DEBUG_SINGLE + ".main", model); //NOI18N
if (isWar) {
addSingleAction(ActionProvider.COMMAND_DEBUG_SINGLE + ".deploy", model); //NOI18N
}
addSingleAction(ActionProvider.COMMAND_DEBUG_TEST_SINGLE, model);
addSingleAction(ActionProviderImpl.COMMAND_DEBUG_INTEGRATION_TEST_SINGLE, model);
addSingleAction(ActionProvider.COMMAND_PROFILE, model);
addSingleAction(ActionProvider.COMMAND_PROFILE_SINGLE + ".main", model); // NOI18N
if (isWar) {
addSingleAction(ActionProvider.COMMAND_PROFILE_SINGLE + ".deploy", model); //NOI18N
}
addSingleAction("javadoc", model); //NOI18N
}
for (NetbeansActionMapping elem : getActionMappings().getActions()) {
if (elem.getActionName().startsWith(CUSTOM_ACTION_PREFIX)) {
MappingWrapper wr = new MappingWrapper(elem);
model.addElement(wr);
wr.setUserDefined(true);
}
}
lstMappings.setModel(model);
}
private void addSingleAction(String action, DefaultListModel model) {
NetbeansActionMapping mapp = null;
for (NetbeansActionMapping elem : getActionMappings().getActions()) {
if (action.equals(elem.getActionName())) {
mapp = elem;
break;
}
}
boolean userDefined = true;
if (mapp == null) {
mapp = ActionToGoalUtils.getDefaultMapping(action, project);
userDefined = false;
}
MappingWrapper wr;
if (mapp == null) {
wr = new MappingWrapper(action);
} else {
wr = new MappingWrapper(mapp);
}
wr.setUserDefined(userDefined);
model.addElement(wr);
}
private String createSpaceSeparatedList(List<String> list) {
if (list != null) {
StringBuilder b = new StringBuilder();
for (String elem : list) {
if (b.length() > 0) {
b.append(' ');
}
b.append(elem);
}
return b.toString();
} else {
return "";
}
}
@Override
public HelpCtx getHelpCtx() {
return CustomizerProviderImpl.HELP_CTX;
}
private void clearFields() {
comConfiguration.removeActionListener(comboListener);
txtGoals.getDocument().removeDocumentListener(goalsListener);
txtProfiles.getDocument().removeDocumentListener(profilesListener);
epProperties.getDocument().removeDocumentListener(propertiesListener);
txtPackagings.getDocument().removeDocumentListener(packagingsListener);
txtGoals.setText(""); //NOI18N
txtProfiles.setText(""); //NOI18N
epProperties.setText(""); //NOI18N
txtPackagings.setText("");
txtGoals.getDocument().addDocumentListener(goalsListener);
txtProfiles.getDocument().addDocumentListener(profilesListener);
epProperties.getDocument().addDocumentListener(propertiesListener);
txtPackagings.getDocument().addDocumentListener(packagingsListener);
txtGoals.setEnabled(false);
epProperties.setEnabled(false);
txtProfiles.setEnabled(false);
txtPackagings.setEnabled(false);
updateColor(null);
cbRecursively.setEnabled(false);
cbBuildWithDeps.setEnabled(false);
btnAddProps.setEnabled(false);
if (handle == null) { //only global settings
jButton1.setEnabled(false);
jButton1.setIcon(null);
jButton1.setText(BTN_ShowToolbar());
}
lblGoals.setEnabled(false);
lblHint.setEnabled(false);
lblPackagings.setEnabled(false);
lblProfiles.setEnabled(false);
lblProperties.setEnabled(false);
}
private void updateColor(MappingWrapper wr) {
if (isGlobal()) {
return;
}
Font fnt = lblGoals.getFont();
fnt = fnt.deriveFont(wr != null && wr.isUserDefined() ? Font.BOLD : Font.PLAIN);
lblGoals.setFont(fnt);
lblProperties.setFont(fnt);
lblProfiles.setFont(fnt);
}
public static String createPropertiesList(Map<? extends String,? extends String> properties) {
StringBuilder b = new StringBuilder();
if (properties != null) {
for (Map.Entry<? extends String,? extends String> entry : properties.entrySet()) {
if (b.length() > 0) {
b.append('\n');
}
b.append(entry.getKey()).append('=').append(entry.getValue());
if (entry.getValue().endsWith("\\")) {
// we interpret \ at the end of the line as the properties file editor, as a continuation on the next line. This
//has a sideeffect on entries ending with \ naturally
b.append(" ");
}
}
}
return b.toString();
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnAdd;
private javax.swing.JButton btnAddProps;
private javax.swing.JButton btnRemove;
private javax.swing.JCheckBox cbBuildWithDeps;
private javax.swing.JCheckBox cbRecursively;
private javax.swing.JComboBox comConfiguration;
private javax.swing.JEditorPane epProperties;
private javax.swing.JButton jButton1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JScrollPane jScrollPane5;
private javax.swing.JLabel lblConfiguration;
private javax.swing.JLabel lblGoals;
private javax.swing.JLabel lblHint;
private javax.swing.JLabel lblMappings;
private javax.swing.JLabel lblPackagings;
private javax.swing.JLabel lblProfiles;
private javax.swing.JLabel lblProperties;
private javax.swing.JList lstMappings;
private javax.swing.JTextField txtGoals;
private javax.swing.JTextField txtPackagings;
private javax.swing.JTextField txtProfiles;
// End of variables declaration//GEN-END:variables
private void writeProperties(final NetbeansActionMapping mapp) {
mapp.setProperties(convertStringToActionProperties(epProperties.getText()));
if (handle != null) {
handle.markAsModified(getActionMappings());
}
}
public static Map<String, String> convertStringToActionProperties(String text) {
PropertySplitter split = new PropertySplitter(text);
String tok = split.nextPair();
Map<String,String> props = new LinkedHashMap<String,String>();
while (tok != null) {
String[] prp = StringUtils.split(tok, "=", 2); //NOI18N
if (prp.length >= 1 ) {
String key = prp[0];
//in case the user adds -D by mistake, remove it to get a parsable xml file.
if (key.startsWith("-D")) { //NOI18N
key = key.substring("-D".length()); //NOI18N
}
if (key.startsWith("-")) { //NOI18N
key = key.substring(1);
}
if (key.endsWith("=")) {
key = key.substring(0, key.length() - 1);
}
if (key.trim().length() > 0 && Verifier.checkElementName(key.trim()) == null) {
props.put(key.trim(), prp.length > 1 ? prp[1] : "");
}
}
tok = split.nextPair();
}
return props;
}
private ActionToGoalMapping getActionMappings() {
assert handle != null || actionmappings != null;
if (handle != null) {
return handle.getActionMappings((ModelHandle2.Configuration) comConfiguration.getSelectedItem());
}
return actionmappings;
}
@Messages({
"BTN_ShowToolbar=Show in Toolbar",
"BTN_HideToolbar=Hide from Toolbar"
})
private void updateToolbarButton(MappingWrapper wr) {
//TODO exclude run/debug and any default mappings.
jButton1.setEnabled(true);
if (wr.getToolbarIconPath() != null) {
//TODO set title?? show icon?
jButton1.setIcon(ImageUtilities.loadImageIcon(wr.getToolbarIconPath(), false));
jButton1.setText(BTN_HideToolbar());
} else {
jButton1.setIcon(null);
jButton1.setText(BTN_ShowToolbar());
}
}
public void applyToolbarChanges() {
for (int i = 0; i < lstMappings.getModel().getSize(); i++) {
MappingWrapper wr = (MappingWrapper) lstMappings.getModel().getElementAt(i);
if (wr.hasToolbarPathChanged()) {
if (wr.getOrigToolbarIconPath() != null) {
try {
//delete
RunCustomMavenAction.deleteDeclaration(wr.getActionName());
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
}
if (wr.getToolbarIconPath() != null) {
try {
RunCustomMavenAction.createActionDeclaration(wr.getActionName(), wr.getActionName(), wr.getToolbarIconPath());
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
}
}
}
}
@NbBundle.Messages({
"# {0} - disabled action name",
"FMT_DisabledAction={0} - disabled"
})
private static class Renderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(JList list, Object value,
int arg2, boolean arg3,
boolean arg4) {
Component supers = super.getListCellRendererComponent(list, value, arg2, arg3, arg4);
if (supers instanceof JLabel && value instanceof MappingWrapper) {
MappingWrapper wr = (MappingWrapper)value;
JLabel lbl = (JLabel)supers;
if (wr.isUserDefined()) {
lbl.setFont(lbl.getFont().deriveFont(Font.BOLD));
} else {
lbl.setFont(lbl.getFont().deriveFont(Font.PLAIN));
}
if (ActionToGoalUtils.isDisabledMapping(wr.getMapping())) {
lbl.setForeground(Color.lightGray);
lbl.setText(Bundle.FMT_DisabledAction(lbl.getText()));
}
}
return supers;
}
}
private class MappingWrapper {
private NetbeansActionMapping mapping;
private final String action;
private boolean userDefined = false;
private final String origToolbarIconPath;
private String toolbarIconPath;
MappingWrapper(String action) {
this.action = action;
origToolbarIconPath = RunCustomMavenAction.actionDeclarationIconPath(action);
toolbarIconPath = origToolbarIconPath;
}
MappingWrapper(NetbeansActionMapping mapp) {
action = mapp.getActionName();
mapping = mapp;
origToolbarIconPath = RunCustomMavenAction.actionDeclarationIconPath(action);
toolbarIconPath = origToolbarIconPath;
}
public void setMapping(NetbeansActionMapping mapp) {
mapping = mapp;
}
public String getActionName() {
return action;
}
public NetbeansActionMapping getMapping() {
return mapping;
}
@Override
public String toString() {
if (titles.get(action) != null) {
return titles.get(action);
}
if (mapping != null) {
if (mapping.getDisplayName() != null) {
return mapping.getDisplayName();
}
return mapping.getActionName();
}
return action;
}
public boolean isUserDefined() {
return userDefined;
}
public void setUserDefined(boolean userDefined) {
this.userDefined = userDefined;
}
public void setToolbarPath(String path) {
toolbarIconPath = path;
}
public boolean hasToolbarPathChanged() {
return (toolbarIconPath == null && origToolbarIconPath != null) || (toolbarIconPath != null && !toolbarIconPath.equals(origToolbarIconPath));
}
public String getOrigToolbarIconPath() {
return origToolbarIconPath;
}
public String getToolbarIconPath() {
return toolbarIconPath;
}
}
private abstract class TextFieldListener implements DocumentListener {
@Override public void insertUpdate(DocumentEvent e) {
doUpdate();
}
@Override public void removeUpdate(DocumentEvent e) {
doUpdate();
}
@Override public void changedUpdate(DocumentEvent e) {
doUpdate();
}
protected MappingWrapper doUpdate() {
MappingWrapper map = (MappingWrapper)lstMappings.getSelectedValue();
if (map != null) {
if (!map.isUserDefined()) {
NetbeansActionMapping mapping = map.getMapping();
if (mapping == null) {
mapping = new NetbeansActionMapping();
mapping.setActionName(map.getActionName());
map.setMapping(mapping);
}
getActionMappings().addAction(mapping);
if (handle != null) {
handle.markAsModified(getActionMappings());
}
map.setUserDefined(true);
updateColor(map);
}
}
return map;
}
}
private class GoalsListener extends TextFieldListener {
@Override
protected MappingWrapper doUpdate() {
MappingWrapper wr = super.doUpdate();
boolean wasEnabled = ActionToGoalUtils.isDisabledMapping(wr.getMapping());
if (wr != null) {
String text = txtGoals.getText();
StringTokenizer tok = new StringTokenizer(text, " "); //NOI18N
NetbeansActionMapping mapp = wr.getMapping();
List<String> goals = new ArrayList<String>();
while (tok.hasMoreTokens()) {
String token = tok.nextToken();
goals.add(token);
}
mapp.setGoals(goals);
if (handle != null) {
handle.markAsModified(getActionMappings());
}
if (ActionToGoalUtils.isDisabledMapping(wr.getMapping()) != wasEnabled) {
lstMappings.repaint();
}
}
return wr;
}
}
private class ProfilesListener extends TextFieldListener {
@Override
protected MappingWrapper doUpdate() {
MappingWrapper wr = super.doUpdate();
if (wr != null) {
String text = txtProfiles.getText();
StringTokenizer tok = new StringTokenizer(text, " ,"); //NOI18N
NetbeansActionMapping mapp = wr.getMapping();
List<String> profs = new ArrayList<String>();
while (tok.hasMoreTokens()) {
String token = tok.nextToken();
profs.add(token);
}
mapp.setActivatedProfiles(profs);
if (handle != null) {
handle.markAsModified(getActionMappings());
}
}
return wr;
}
}
private class PackagingsListener extends TextFieldListener {
@Override
protected MappingWrapper doUpdate() {
MappingWrapper wr = super.doUpdate();
if (wr != null) {
String text = txtPackagings.getText().trim();
StringTokenizer tok = new StringTokenizer(text, " ,"); //NOI18N
NetbeansActionMapping mapp = wr.getMapping();
List<String> packs = new ArrayList<String>();
while (tok.hasMoreTokens()) {
String token = tok.nextToken();
packs.add(token.trim());
}
mapp.setPackagings(packs);
if (handle != null) {
handle.markAsModified(getActionMappings());
}
}
return wr;
}
}
private class PropertiesListener extends TextFieldListener {
@Override
protected MappingWrapper doUpdate() {
MappingWrapper wr = super.doUpdate();
if (wr != null) {
NetbeansActionMapping mapp = wr.getMapping();
writeProperties(mapp);
}
return wr;
}
}
private class RecursiveListener implements ActionListener {
@Override public void actionPerformed(ActionEvent e) {
MappingWrapper map = (MappingWrapper)lstMappings.getSelectedValue();
if (map != null) {
if (!map.isUserDefined()) {
NetbeansActionMapping mapping = map.getMapping();
if (mapping == null) {
mapping = new NetbeansActionMapping();
mapping.setActionName(map.getActionName());
}
getActionMappings().addAction(mapping);
map.setUserDefined(true);
updateColor(map);
}
map.getMapping().setRecursive(cbRecursively.isSelected());
if (handle != null) {
handle.markAsModified(getActionMappings());
}
}
}
}
private class DepsListener implements ActionListener {
private boolean shown = false;
@Override
@Messages("HINT_Build_WithDependencies=<html><h2>Please note:</h2>Build with Dependencies delegates to the action of the same name and performs it before the current action is performed.<p> The Build with Dependencies action relies on Maven's --project-list and --also-make switches to perform its duties.")
public void actionPerformed(ActionEvent e) {
MappingWrapper map = (MappingWrapper)lstMappings.getSelectedValue();
if (map != null) {
if (!map.isUserDefined()) {
NetbeansActionMapping mapping = map.getMapping();
if (mapping == null) {
mapping = new NetbeansActionMapping();
mapping.setActionName(map.getActionName());
}
getActionMappings().addAction(mapping);
map.setUserDefined(true);
updateColor(map);
}
if (cbBuildWithDeps.isSelected()) {
if (!shown && DontShowAgainSettings.getDefault().showWarningAboutBuildWithDependencies()) {
WarnPanel panel = new WarnPanel(HINT_Build_WithDependencies());
NotifyDescriptor dd = new NotifyDescriptor.Message(panel, NotifyDescriptor.PLAIN_MESSAGE);
DialogDisplayer.getDefault().notify(dd);
if (panel.disabledWarning()) {
DontShowAgainSettings.getDefault().dontShowWarningAboutBuildWithDependenciesAnymore();
}
shown = true;
}
map.getMapping().setPreAction(ActionProviderImpl.BUILD_WITH_DEPENDENCIES);
} else {
map.getMapping().setPreAction(null);
}
if (handle != null) {
handle.markAsModified(getActionMappings());
}
}
}
}
private void setupConfigurations() {
if (handle != null) {
lblConfiguration.setVisible(true);
comConfiguration.setVisible(true);
DefaultComboBoxModel comModel = new DefaultComboBoxModel();
for (ModelHandle2.Configuration conf : handle.getConfigurations()) {
comModel.addElement(conf);
}
comConfiguration.setModel(comModel);
comConfiguration.setSelectedItem(handle.getActiveConfiguration());
} else {
lblConfiguration.setVisible(false);
comConfiguration.setVisible(false);
DefaultComboBoxModel comModel = new DefaultComboBoxModel();
comConfiguration.setModel(comModel);
}
}
static class SkipTestsAction extends AbstractAction {
private final JTextComponent area;
SkipTestsAction(JTextComponent area) {
putValue(Action.NAME, NbBundle.getMessage(ActionMappings.class, "ActionMappings.skipTests"));
this.area = area;
}
@Override public void actionPerformed(ActionEvent e) {
String replace = TestChecker.PROP_SKIP_TEST + "=true"; //NOI18N
String pattern = ".*" + TestChecker.PROP_SKIP_TEST + "([\\s]*=[\\s]*[\\S]+).*"; //NOI18N
replacePattern(pattern, area, replace, true);
}
}
static class DebugMavenAction extends AbstractAction {
private final JTextComponent area;
DebugMavenAction(JTextComponent area) {
putValue(Action.NAME, NbBundle.getMessage(ActionMappings.class, "ActionMappings.debugMaven"));
this.area = area;
}
@Override public void actionPerformed(ActionEvent e) {
String replace = Constants.ACTION_PROPERTY_JPDALISTEN + "=maven"; //NOI18N
String pattern = ".*" + Constants.ACTION_PROPERTY_JPDALISTEN + "([\\s]*=[\\s]*[\\S]+).*"; //NOI18N
replacePattern(pattern, area, replace, true);
}
}
static class PluginPropertyAction extends AbstractAction {
private final JTextComponent area;
private final JTextField goals;
private final NbMavenProjectImpl project;
PluginPropertyAction(JTextComponent area, JTextField goals, NbMavenProjectImpl prj) {
putValue(Action.NAME, NbBundle.getMessage(ActionMappings.class, "TXT_PLUGIN_EXPRESSION"));
this.area = area;
this.goals = goals;
this.project = prj;
}
@Override
@Messages("TIT_PLUGIN_EXPRESSION=Add Plugin Expression Property")
public void actionPerformed(ActionEvent e) {
GoalsProvider provider = Lookup.getDefault().lookup(GoalsProvider.class);
if (provider != null) {
AddPropertyDialog panel = new AddPropertyDialog(project, goals.getText());
DialogDescriptor dd = new DialogDescriptor(panel, TIT_PLUGIN_EXPRESSION());
dd.setOptions(new Object[] {panel.getOkButton(), DialogDescriptor.CANCEL_OPTION});
dd.setClosingOptions(new Object[] {panel.getOkButton(), DialogDescriptor.CANCEL_OPTION});
DialogDisplayer.getDefault().notify(dd);
if (dd.getValue() == panel.getOkButton()) {
String expr = panel.getSelectedExpression();
if (expr != null) {
String props = area.getText();
String sep = "\n";//NOI18N
if (props.endsWith("\n") || props.trim().length() == 0) {//NOI18N
sep = "";//NOI18N
}
props = props + sep + expr + "="; //NOI18N
area.setText(props);
area.setSelectionStart(props.length() - (expr + "=").length()); //NOI18N
area.setSelectionEnd(props.length());
area.requestFocusInWindow();
}
}
}
}
}
static class EnvVarAction extends AbstractAction {
private final JTextComponent area;
EnvVarAction(JTextComponent area) {
putValue(Action.NAME, NbBundle.getMessage(ActionMappings.class, "ActionMappings.envVar"));
this.area = area;
}
@Override public void actionPerformed(ActionEvent e) {
String props = area.getText();
String sep = "\n";//NOI18N
if (props.endsWith("\n") || props.trim().length() == 0) {//NOI18N
sep = "";//NOI18N
}
props = props + sep + "Env.FOO=bar"; //NOI18N
area.setText(props);
area.setSelectionStart(props.length() - "Env.FOO=bar".length()); //NOI18N
area.setSelectionEnd(props.length());
area.requestFocusInWindow();
}
}
@Messages("ActionMappings.globalVar=Reference IDE Global Variable")
private static JMenu createGlobalVarSubmenu(JTextComponent area) {
JMenu menu = new JMenu();
menu.setText(ActionMappings_globalVar());
Map<String, String> vars = DefaultReplaceTokenProvider.readVariables();
boolean hasAny = false;
for (Map.Entry<String, String> ent : vars.entrySet()) {
hasAny = true;
menu.add(new UseGlobalVarAction(area, ent.getKey()));
}
if (!hasAny) {
menu.setEnabled(false);
}
return menu;
}
@Messages("ActionMappings.jdkVar=Use JDK for Maven build")
private static JMenu createJdkSubmenu(JTextComponent area) {
JMenu menu = new JMenu();
menu.setText(ActionMappings_jdkVar());
boolean hasAny = false;
for (JavaPlatform platform : JavaPlatformManager.getDefault().getInstalledPlatforms()) {
hasAny = true;
if (platform.getInstallFolders().size() > 0) {
menu.add(new JdkAction(area, platform.getDisplayName(), platform.getInstallFolders().iterator().next()));
}
}
if (!hasAny) {
menu.setEnabled(false);
}
return menu;
}
static class JdkAction extends AbstractAction {
private final JTextComponent area;
private final String value;
JdkAction(JTextComponent area, String displayName, FileObject value) {
putValue(Action.NAME, displayName); //NOI18N
this.area = area;
this.value = FileUtil.toFile(value).getAbsolutePath();
}
@Override public void actionPerformed(ActionEvent e) {
String props = area.getText();
String sep = "\n";//NOI18N
if (props.endsWith("\n") || props.trim().length() == 0) {//NOI18N
sep = "";//NOI18N
}
String val = "Env.JAVA_HOME=" + value;
props = props + sep + val;
area.setText(props);
area.setSelectionStart(props.length() - val.length()); //NOI18N
area.setSelectionEnd(props.length());
area.requestFocusInWindow();
}
}
@Messages("ActionMappings.fileExpressions=IDE Selection Expressions")
private static JMenu createFileSelectionSubmenu(JTextComponent area) {
JMenu menu = new JMenu();
menu.setText(ActionMappings_fileExpressions());
menu.add(new FileVariableAction(area, "packageClassName"));
menu.add(new FileVariableAction(area, "className"));
menu.add(new FileVariableAction(area, "classNameWithExtension"));
menu.add(new FileVariableAction(area, "webPagePath"));
menu.add(new FileVariableAction(area, "classPathScope"));
menu.add(new FileVariableAction(area, "absolutePathName"));
return menu;
}
static class UseGlobalVarAction extends AbstractAction {
private final JTextComponent area;
private final String key;
UseGlobalVarAction(JTextComponent area, String key) {
putValue(Action.NAME, "${" + key + "}"); //NOI18N
this.area = area;
this.key = key;
}
@Override public void actionPerformed(ActionEvent e) {
try {
area.getDocument().insertString(area.getCaretPosition(), "${" + key + "}", null); //NOI18N
} catch (BadLocationException ex) {
String text = area.getText();
text = text + "${" + key + "}"; //NOI18N
area.setText(text);
area.requestFocusInWindow();
}
}
}
static class FileVariableAction extends AbstractAction {
private final JTextComponent area;
private final String key;
FileVariableAction(JTextComponent area, String key) {
putValue(Action.NAME, "${" + key + "}"); //NOI18N
this.area = area;
this.key = key;
}
@Override public void actionPerformed(ActionEvent e) {
try {
area.getDocument().insertString(area.getCaretPosition(), "${" + key + "}", null); //NOI18N
} catch (BadLocationException ex) {
String text = area.getText();
text = text + "${" + key + "}"; //NOI18N
area.setText(text);
area.requestFocusInWindow();
}
}
}
private static void replacePattern(String pattern, JTextComponent area, String replace, boolean select) {
String props = area.getText();
Matcher match = Pattern.compile(pattern, Pattern.DOTALL).matcher(props);
if (match.matches()) {
int begin = props.indexOf(TestChecker.PROP_SKIP_TEST);
props = props.replace(TestChecker.PROP_SKIP_TEST + match.group(1), replace); //NOI18N
area.setText(props);
if (select) {
area.setSelectionStart(begin);
area.setSelectionEnd(begin + replace.length());
area.requestFocusInWindow();
}
} else {
String sep = "\n";//NOI18N
if (props.endsWith("\n") || props.trim().length() == 0) {//NOI18N
sep = "";//NOI18N
}
props = props + sep + replace; //NOI18N
area.setText(props);
if (select) {
area.setSelectionStart(props.length() - replace.length());
area.setSelectionEnd(props.length());
area.requestFocusInWindow();
}
}
}
private static class NonEmptyInputLine extends NotifyDescriptor.InputLine implements DocumentListener {
@SuppressWarnings("LeakingThisInConstructor")
NonEmptyInputLine(String text, String title) {
super(text, title);
textField.getDocument().addDocumentListener(this);
checkValid();
}
@Override public void insertUpdate(DocumentEvent arg0) {
checkValid();
}
@Override public void removeUpdate(DocumentEvent arg0) {
checkValid();
}
@Override public void changedUpdate(DocumentEvent arg0) {
checkValid();
}
private void checkValid () {
setValid(textField.getText() != null && textField.getText().trim().length() > 0);
}
}
}