blob: b0aa5ea6f0edd82ca56ceecf0e31602ad9f4dea1 [file]
/*
* 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.form;
import java.beans.*;
import java.util.*;
import java.awt.*;
/** The MethodPicker is a form which allows user to pick one of methods
* with specified required return type.
*
* @author Ian Formanek
* @version 1.00, Aug 29, 1998
*/
public class MethodPicker extends javax.swing.JPanel {
static final long serialVersionUID =7355140527892160804L;
/** Initializes the Form */
public MethodPicker(FormModel formModel, RADComponent componentToSelect, Class requiredType) {
this.formModel = formModel;
this.requiredType = requiredType;
initComponents();
java.util.List componentsList = formModel.getMetaComponents();
Collections.sort(componentsList, new ParametersPicker.ComponentComparator());
components = new RADComponent[componentsList.size()];
componentsList.toArray(components);
int selIndex = -1;
for (Iterator it = componentsList.iterator(); it.hasNext(); ) {
RADComponent radComp = (RADComponent) it.next();
if (componentToSelect != null && componentToSelect == radComp)
selIndex = componentsCombo.getItemCount();
if (radComp == formModel.getTopRADComponent())
componentsCombo.addItem(
FormUtils.getBundleString("CTL_FormTopContainerName")); // NOI18N
else
componentsCombo.addItem(radComp.getName());
}
if (selIndex >= 0)
componentsCombo.setSelectedIndex(selIndex);
updateMethodList();
componentLabel.setText(FormUtils.getBundleString("CTL_CW_Component")); // NOI18N
listLabel.setText(FormUtils.getBundleString("CTL_CW_MethodList")); // NOI18N
componentLabel.setDisplayedMnemonic(
FormUtils.getBundleString("CTL_CW_Component_Mnemonic").charAt(0)); // NOI18N
listLabel.setDisplayedMnemonic(
FormUtils.getBundleString("CTL_CW_MethodList_Mnemonic").charAt(0)); // NOI18N
componentsCombo.getAccessibleContext().setAccessibleDescription(
FormUtils.getBundleString("ACSD_CTL_CW_Component")); // NOI18N
methodList.getAccessibleContext().setAccessibleDescription(
FormUtils.getBundleString("ACSD_CTL_CW_MethodList")); // NOI18N
getAccessibleContext().setAccessibleDescription(
FormUtils.getBundleString("ACSD_MethodPicker")); // NOI18N
// HelpCtx.setHelpIDString(this, "gui.connecting.code"); // NOI18N
}
public boolean isPickerValid() {
return pickerValid;
}
private void setPickerValid(boolean v) {
boolean old = pickerValid;
pickerValid = v;
firePropertyChange("pickerValid", old, pickerValid); // NOI18N
}
RADComponent getSelectedComponent() {
return selectedComponent;
}
void setSelectedComponent(RADComponent selectedComponent) {
if (selectedComponent != null)
componentsCombo.setSelectedItem(selectedComponent.getName());
}
MethodDescriptor getSelectedMethod() {
if ((selectedComponent == null) ||(methodList.getSelectedIndex() == -1))
return null;
return descriptors [methodList.getSelectedIndex()];
}
void setSelectedMethod(MethodDescriptor selectedMethod) {
if (selectedMethod == null) {
methodList.setSelectedIndex(-1);
} else {
methodList.setSelectedValue(FormUtils.getMethodName(selectedMethod), true);
}
}
// ----------------------------------------------------------------------------
// private methods
private void addComponentsRecursively(ComponentContainer cont, Vector vect) {
RADComponent[] children = cont.getSubBeans();
for (int i = 0; i < children.length; i++) {
vect.addElement(children[i]);
if (children[i] instanceof ComponentContainer)
addComponentsRecursively((ComponentContainer)children[i], vect);
}
}
private void updateMethodList() {
RADComponent sel = getSelectedComponent();
if (sel == null) {
methodList.setListData(new Object [0]);
methodList.revalidate();
methodList.repaint();
} else {
MethodDescriptor[] descs = sel.getBeanInfo().getMethodDescriptors();
ArrayList filtered = new ArrayList();
for (int i = 0; i < descs.length; i ++) {
if (requiredType.isAssignableFrom(descs[i].getMethod().getReturnType()) &&
(descs[i].getMethod().getParameterTypes().length == 0)) // [FUTURE: - currently we allow only methods without params]
{
filtered.add(descs[i]);
}
}
// sort the methods by name
Collections.sort(filtered, new Comparator() {
public int compare(Object o1, Object o2) {
return((MethodDescriptor)o1).getName().compareTo(((MethodDescriptor)o2).getName());
}
}
);
descriptors = new MethodDescriptor[filtered.size()];
filtered.toArray(descriptors);
String[] items = new String [descriptors.length];
for (int i = 0; i < descriptors.length; i++)
items[i] = FormUtils.getMethodName(descriptors[i]);
methodList.setListData(items);
methodList.revalidate();
methodList.repaint();
}
}
private void updateState() {
if ((getSelectedComponent() == null) || (getSelectedMethod() == null)) {
setPickerValid(false);
} else {
setPickerValid(getSelectedMethod().getMethod().getParameterTypes().length == 0);
}
}
/** 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 FormEditor.
*/
private void initComponents() {//GEN-BEGIN:initComponents
java.awt.GridBagConstraints gridBagConstraints;
componentLabel = new javax.swing.JLabel();
componentsCombo = new javax.swing.JComboBox();
listLabel = new javax.swing.JLabel();
propertiesScrollPane = new javax.swing.JScrollPane();
methodList = new javax.swing.JList();
setLayout(new java.awt.GridBagLayout());
setBorder(new javax.swing.border.EmptyBorder(new java.awt.Insets(12, 12, 0, 11)));
componentLabel.setLabelFor(componentsCombo);
componentLabel.setText(FormUtils.getBundleString("CTL_Component"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 5, 6);
add(componentLabel, gridBagConstraints);
componentsCombo.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
componentsComboItemStateChanged(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 5, 0);
add(componentsCombo, gridBagConstraints);
listLabel.setLabelFor(methodList);
listLabel.setText(FormUtils.getBundleString("CTL_Component"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 2, 0);
add(listLabel, gridBagConstraints);
methodList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
methodList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
methodListValueChanged(evt);
}
});
propertiesScrollPane.setViewportView(methodList);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
add(propertiesScrollPane, gridBagConstraints);
}//GEN-END:initComponents
private void methodListValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_methodListValueChanged
if (methodList.getSelectedIndex() == -1)
selectedMethod = null;
else
selectedMethod = descriptors[methodList.getSelectedIndex()];
updateState();
}//GEN-LAST:event_methodListValueChanged
private void componentsComboItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_componentsComboItemStateChanged
if (componentsCombo.getSelectedIndex() == -1)
selectedComponent = null;
else
selectedComponent = components[componentsCombo.getSelectedIndex()];
updateMethodList();
}//GEN-LAST:event_componentsComboItemStateChanged
/** Closes the dialog */
private void closeDialog(java.awt.event.WindowEvent evt) {//GEN-FIRST:closeDialog
}//GEN-LAST:closeDialog
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel listLabel;
private javax.swing.JLabel componentLabel;
private javax.swing.JList methodList;
private javax.swing.JComboBox componentsCombo;
private javax.swing.JScrollPane propertiesScrollPane;
// End of variables declaration//GEN-END:variables
private FormModel formModel;
private boolean pickerValid = false;
private RADComponent[] components;
private Class requiredType;
private MethodDescriptor[] descriptors;
private RADComponent selectedComponent;
private MethodDescriptor selectedMethod;
}