blob: ef3662f777c3324ceed0ce7f2cd176a7cf5d80c1 [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.j2ee.core.support.java.method;
import java.awt.Component;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.lang.model.element.TypeElement;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.text.JTextComponent;
import org.netbeans.api.java.source.ClassIndex.NameKind;
import org.netbeans.api.java.source.ClassIndex.SearchScope;
import org.netbeans.api.java.source.ClasspathInfo;
import org.netbeans.api.java.source.ElementHandle;
import org.netbeans.api.java.source.ui.TypeElementFinder;
import org.openide.util.NbBundle;
/**
*
* @author Martin Adamek
*/
public final class ExceptionsPanel extends javax.swing.JPanel {
private final ExceptionsTableModel tableModel;
private final ClasspathInfo cpInfo;
public ExceptionsPanel(List<String> parameters, ClasspathInfo cpInfo) {
initComponents();
tableModel = new ExceptionsTableModel(parameters);
this.cpInfo = cpInfo;
table.setModel(tableModel);
table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); // NOI18N
// ListSelectionListener listSelectionListener = new ListSelectionListenerImpl();
// table.getSelectionModel().addListSelectionListener(listSelectionListener);
// table.getColumnModel().getSelectionModel().addListSelectionListener(listSelectionListener);
table.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
updateButtons();
}
});
table.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent e) {
updateButtons();
}
});
updateButtons();
}
public List<String> getExceptions() {
return tableModel.getExceptions();
}
/** 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() {
jScrollPane1 = new javax.swing.JScrollPane();
table = new javax.swing.JTable();
addButton = new javax.swing.JButton();
removeButton = new javax.swing.JButton();
upButton = new javax.swing.JButton();
downButton = new javax.swing.JButton();
editButton = new javax.swing.JButton();
table.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
},
new String [] {
}
));
jScrollPane1.setViewportView(table);
table.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(ExceptionsPanel.class, "ACSN_ExceptionsTab")); // NOI18N
table.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(ExceptionsPanel.class, "ACSD_ExceptionsTab")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(addButton, org.openide.util.NbBundle.getMessage(ExceptionsPanel.class, "ParametersPanel.addButton.text")); // NOI18N
addButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
addButtonActionPerformed(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(removeButton, org.openide.util.NbBundle.getMessage(ExceptionsPanel.class, "ParametersPanel.removeButton.text")); // NOI18N
removeButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
removeButtonActionPerformed(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(upButton, org.openide.util.NbBundle.getMessage(ExceptionsPanel.class, "ParametersPanel.upButton.text")); // NOI18N
upButton.setEnabled(false);
upButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
upButtonActionPerformed(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(downButton, org.openide.util.NbBundle.getMessage(ExceptionsPanel.class, "ParametersPanel.downButton.text")); // NOI18N
downButton.setEnabled(false);
downButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
downButtonActionPerformed(evt);
}
});
org.openide.awt.Mnemonics.setLocalizedText(editButton, org.openide.util.NbBundle.getMessage(ExceptionsPanel.class, "ExceptionsPanel.editButton.text_1")); // NOI18N
editButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
editButtonActionPerformed(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()
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 241, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(addButton)
.addComponent(removeButton)
.addComponent(editButton)
.addComponent(upButton)
.addComponent(downButton))
.addContainerGap())
);
layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {addButton, downButton, editButton, removeButton, upButton});
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(addButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(removeButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(editButton)
.addGap(18, 18, 18)
.addComponent(upButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(downButton))
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 276, Short.MAX_VALUE))
.addContainerGap())
);
addButton.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(ExceptionsPanel.class, "ACSD_AddExceptionIntoTab")); // NOI18N
removeButton.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(ExceptionsPanel.class, "ACSD_RemoveExceptionFromTab")); // NOI18N
upButton.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(ExceptionsPanel.class, "ACSD_MoveUpInExcepTab")); // NOI18N
downButton.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(ExceptionsPanel.class, "ACSD_MoveDownInExceptionTab")); // NOI18N
editButton.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(ExceptionsPanel.class, "ACSD_editExceptionButton")); // NOI18N
}// </editor-fold>//GEN-END:initComponents
private void downButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_downButtonActionPerformed
int selIndex = table.getSelectedRow();
int newIndex = selIndex + 1;
if (newIndex < tableModel.getExceptions().size()) {
tableModel.set(newIndex, tableModel.set(selIndex, tableModel.getException(newIndex)));
table.setRowSelectionInterval(newIndex, newIndex);
updateButtons();
}
}//GEN-LAST:event_downButtonActionPerformed
private void upButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_upButtonActionPerformed
int selIndex = table.getSelectedRow();
int newIndex = selIndex - 1;
if (newIndex >= 0) {
tableModel.set(newIndex, tableModel.set(selIndex, tableModel.getException(newIndex)));
table.setRowSelectionInterval(newIndex, newIndex);
updateButtons();
}
}//GEN-LAST:event_upButtonActionPerformed
private void removeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_removeButtonActionPerformed
int selectedRow = table.getSelectedRow();
if (selectedRow > -1) {
tableModel.removeException(selectedRow);
}
if (selectedRow == table.getRowCount()) {
selectedRow--;
}
table.getSelectionModel().setSelectionInterval(selectedRow, selectedRow);
updateButtons();
}//GEN-LAST:event_removeButtonActionPerformed
private void addButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_addButtonActionPerformed
ElementHandle<TypeElement> handle = browseExceptions();
if (handle != null) {
int index = tableModel.addException(handle.getQualifiedName());
table.getSelectionModel().setSelectionInterval(index, index);
table.getColumnModel().getSelectionModel().setSelectionInterval(0, 0);
updateButtons();
}
}//GEN-LAST:event_addButtonActionPerformed
private void editButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_editButtonActionPerformed
final ElementHandle<TypeElement> handle = browseExceptions();
if (handle != null) {
int index = table.getSelectedRow();
table.getSelectionModel().setSelectionInterval(index, index);
table.getColumnModel().getSelectionModel().setSelectionInterval(0, 0);
tableModel.setValueAt(handle.getQualifiedName(), index, 0);
}
}//GEN-LAST:event_editButtonActionPerformed
private ElementHandle<TypeElement> browseExceptions() {
return TypeElementFinder.find(cpInfo, new TypeElementFinder.Customizer() {
public Set<ElementHandle<TypeElement>> query(ClasspathInfo classpathInfo, String textForQuery, NameKind nameKind, Set<SearchScope> searchScopes) {
return classpathInfo.getClassIndex().getDeclaredTypes(textForQuery, nameKind, searchScopes);
}
public boolean accept(ElementHandle<TypeElement> typeHandle) {
return true;
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton addButton;
private javax.swing.JButton downButton;
private javax.swing.JButton editButton;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JButton removeButton;
private javax.swing.JTable table;
private javax.swing.JButton upButton;
// End of variables declaration//GEN-END:variables
private void updateButtons() {
int selIndex = table.getSelectedRow();
boolean oneSelected = table.getSelectedRowCount() == 1;
removeButton.setEnabled(oneSelected);
editButton.setEnabled(oneSelected);
upButton.setEnabled(oneSelected && (selIndex > 0));
downButton.setEnabled(oneSelected && (selIndex < tableModel.getRowCount() - 1));
}
// accessible for test
static class ExceptionsTableModel extends AbstractTableModel {
private final List<String> exceptions;
public ExceptionsTableModel(List<String> parameters) {
this.exceptions = new ArrayList<String>(parameters);
}
public List<String> getExceptions() {
return exceptions;
}
public int addException(String exceptionName) {
int index = exceptions.size();
exceptions.add(exceptionName);
fireTableRowsInserted(index, index);
return index;
}
public void removeException(int index) {
exceptions.remove(index);
fireTableRowsDeleted(index, index);
}
public String getException(int index) {
return exceptions.get(index);
}
public String set(int index, String exception) {
return exceptions.set(index, exception);
}
public int getRowCount() {
return exceptions.size();
}
public int getColumnCount() {
return 1;
}
public Object getValueAt(int row, int column) {
Object result = null;
if (row >= 0) {
result = exceptions.get(row);
}
return result;
}
public String getColumnName(int column) {
return NbBundle.getMessage(ParametersPanel.class, "ExceptionsPanel.LBL_Exception");
}
public boolean isCellEditable(int row, int column) {
return true;
}
public void setValueAt(Object aValue, int row, int column) {
exceptions.set(row, (String) aValue);
fireTableCellUpdated(row, column);
}
// JTable uses this method to determine the default renderer/editor for each cell.
// If we didn't implement this method, then the last column would contain
// text ("true"/"false"), rather than a check box.
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
}
private class ListSelectionListenerImpl implements ListSelectionListener {
public void valueChanged(ListSelectionEvent e) {
table.editCellAt(table.getSelectedRow(), table.getSelectedColumn());
Component editor = table.getEditorComponent();
if (editor != null) {
editor.requestFocus();
}
if (editor instanceof JTextComponent) {
JTextComponent textComp = (JTextComponent) editor;
textComp.selectAll();
}
}
}
}