blob: 1075c203bd530c7ce31c73d350898f1f04d1a9e6 [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.javascript2.debug.ui.breakpoints;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URI;
import javax.swing.DefaultComboBoxModel;
import org.netbeans.api.debugger.DebuggerManager;
import org.netbeans.api.debugger.Properties;
import org.netbeans.modules.javascript2.debug.EditorLineHandlerFactory;
import org.netbeans.modules.javascript2.debug.ui.JSUtils;
import org.netbeans.modules.javascript2.debug.breakpoints.JSLineBreakpoint;
import org.netbeans.spi.debugger.ui.Controller;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.text.Line;
import org.openide.util.HelpCtx;
import org.openide.util.RequestProcessor;
/**
*
* @author david
*/
public class JSLineBreakpointCustomizerPanel extends javax.swing.JPanel
implements ControllerProvider, HelpCtx.Provider {
private static final int MAX_SAVED_CONDITIONS = 10;
private static final RequestProcessor RP = new RequestProcessor(JSLineBreakpointCustomizerPanel.class);
private final Controller controller;
private final JSLineBreakpoint lb;
private boolean createBreakpoint;
private static JSLineBreakpoint createBreakpoint() {
Line line = JSUtils.getCurrentLine();
if (line == null) {
return null;
}
return JSUtils.createLineBreakpoint(line);
}
/**
* Creates new form LineBreakpointCustomizer
*/
public JSLineBreakpointCustomizerPanel() {
this(createBreakpoint());
createBreakpoint = true;
}
/**
* Creates new form LineBreakpointCustomizer
*/
public JSLineBreakpointCustomizerPanel(JSLineBreakpoint lb) {
this.lb = lb;
initComponents();
controller = createController();
if (lb != null) {
Line line = JSUtils.getLine(lb);
FileObject fo = line.getLookup().lookup(FileObject.class);
if (fo != null) {
File file = FileUtil.toFile(fo);
if (file != null) {
fileTextField.setText(file.getAbsolutePath());
} else {
fileTextField.setText(fo.toURL().toExternalForm());
}
}
lineTextField.setText(Integer.toString(line.getLineNumber() + 1));
Object[] conditions = getSavedConditions();
conditionComboBox.setModel(new DefaultComboBoxModel(conditions));
String condition = lb.getCondition();
if (condition != null && !condition.isEmpty()) {
conditionCheckBox.setSelected(true);
conditionComboBox.setEnabled(true);
conditionComboBox.getEditor().setItem(condition);
} else {
conditionCheckBox.setSelected(false);
conditionComboBox.setEnabled(false);
}
}
}
private static Object[] getSavedConditions() {
return Properties.getDefault().getProperties("debugger.javascript").
getArray("BPConditions", new Object[0]);
}
private static void saveCondition(String condition) {
Object[] savedConditions = getSavedConditions();
Object[] conditions = null;
boolean containsCondition = false;
for (int i = 0; i < savedConditions.length; i++) {
Object c = savedConditions[i];
if (condition.equals(c)) {
containsCondition = true;
conditions = savedConditions;
if (i > 0) {
System.arraycopy(conditions, 0, conditions, 1, i);
conditions[0] = condition;
}
break;
}
}
if (!containsCondition) {
if (savedConditions.length < MAX_SAVED_CONDITIONS) {
conditions = new Object[savedConditions.length + 1];
conditions[0] = condition;
System.arraycopy(savedConditions, 0, conditions, 1, savedConditions.length);
} else {
conditions = savedConditions;
System.arraycopy(conditions, 0, conditions, 1, conditions.length - 1);
conditions[0] = condition;
}
}
Properties.getDefault().getProperties("debugger.javascript").
setArray("BPConditions", conditions);
}
protected Controller createController() {
return new CustomizerController();
}
public Controller getController() {
return controller;
}
protected RequestProcessor getUpdateRP() {
return RP;
}
/**
* 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() {
fileLabel = new javax.swing.JLabel();
fileTextField = new javax.swing.JTextField();
lineLabel = new javax.swing.JLabel();
lineTextField = new javax.swing.JTextField();
jSeparator1 = new javax.swing.JSeparator();
conditionCheckBox = new javax.swing.JCheckBox();
conditionComboBox = new javax.swing.JComboBox();
fileLabel.setLabelFor(fileTextField);
org.openide.awt.Mnemonics.setLocalizedText(fileLabel, org.openide.util.NbBundle.getMessage(JSLineBreakpointCustomizerPanel.class, "JSLineBreakpointCustomizerPanel.fileLabel.text")); // NOI18N
fileTextField.setToolTipText(org.openide.util.NbBundle.getMessage(JSLineBreakpointCustomizerPanel.class, "JSLineBreakpointCustomizerPanel.fileTextField.toolTipText")); // NOI18N
lineLabel.setLabelFor(lineTextField);
org.openide.awt.Mnemonics.setLocalizedText(lineLabel, org.openide.util.NbBundle.getMessage(JSLineBreakpointCustomizerPanel.class, "JSLineBreakpointCustomizerPanel.lineLabel.text")); // NOI18N
lineTextField.setToolTipText(org.openide.util.NbBundle.getMessage(JSLineBreakpointCustomizerPanel.class, "JSLineBreakpointCustomizerPanel.lineTextField.toolTipText")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(conditionCheckBox, org.openide.util.NbBundle.getMessage(JSLineBreakpointCustomizerPanel.class, "JSLineBreakpointCustomizerPanel.conditionCheckBox.text")); // NOI18N
conditionCheckBox.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
conditionCheckBoxActionPerformed(evt);
}
});
conditionComboBox.setEditable(true);
conditionComboBox.setToolTipText(org.openide.util.NbBundle.getMessage(JSLineBreakpointCustomizerPanel.class, "JSLineBreakpointCustomizerPanel.conditionComboBox.toolTipText")); // NOI18N
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(conditionCheckBox)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(conditionComboBox, 0, 330, Short.MAX_VALUE))
.addComponent(jSeparator1)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(lineLabel)
.addComponent(fileLabel))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(fileTextField)
.addComponent(lineTextField))))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(fileLabel)
.addComponent(fileTextField, 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(lineLabel)
.addComponent(lineTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(conditionCheckBox)
.addComponent(conditionComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
}// </editor-fold>//GEN-END:initComponents
private void conditionCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_conditionCheckBoxActionPerformed
conditionComboBox.setEnabled(conditionCheckBox.isSelected());
if (conditionCheckBox.isSelected()) {
conditionComboBox.requestFocusInWindow();
}
}//GEN-LAST:event_conditionCheckBoxActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JCheckBox conditionCheckBox;
private javax.swing.JComboBox conditionComboBox;
private javax.swing.JLabel fileLabel;
private javax.swing.JTextField fileTextField;
private javax.swing.JSeparator jSeparator1;
private javax.swing.JLabel lineLabel;
private javax.swing.JTextField lineTextField;
// End of variables declaration//GEN-END:variables
@Override
public HelpCtx getHelpCtx() {
return new org.openide.util.HelpCtx("NetbeansDebuggerLineBreakpointJavaScript"); // NOI18N
}
private static String toURL(String filePath) {
URI uri = null;
try {
uri = URI.create(filePath);
} catch (Exception ex) {
}
if (uri == null || !uri.isAbsolute()) {
File f = new File(filePath);
uri = f.toURI();
}
try {
return uri.toURL().toExternalForm();
} catch (MalformedURLException ex) {
}
return filePath;
}
private class CustomizerController implements Controller {
@Override
public boolean ok() {
JSLineBreakpoint lb = JSLineBreakpointCustomizerPanel.this.lb;
String fileStr = toURL(fileTextField.getText());
int lineNumber;
try {
lineNumber = Integer.parseInt(lineTextField.getText());
} catch (NumberFormatException nfex) {
return false;
}
lineNumber--;
Line line = JSUtils.getLine(fileStr, lineNumber);
if (line == null) {
return false;
}
if (lb != null) {
updateBreakpoint(line);
} else {
lb = JSUtils.createLineBreakpoint(line);
}
String condition = null;
if (conditionCheckBox.isSelected()) {
condition = conditionComboBox.getSelectedItem().toString().trim();
}
if (condition != null && !condition.isEmpty()) {
lb.setCondition(condition);
saveCondition(condition);
} else {
lb.setCondition(null);
}
if (createBreakpoint) {
DebuggerManager.getDebuggerManager().addBreakpoint(lb);
}
return true;
}
private void updateBreakpoint(final Line line) {
getUpdateRP().post(new Runnable() {
@Override
public void run() {
lb.setLineHandler(JSUtils.createLineHandler(line));
}
});
}
@Override
public boolean cancel() {
return true;
}
@Override
public boolean isValid() {
return true;
}
@Override
public void addPropertyChangeListener(PropertyChangeListener l) {
}
@Override
public void removePropertyChangeListener(PropertyChangeListener l) {
}
}
}