blob: 106ffb290723e6ca7e62d15f30bbdcdc3986ff91 [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.xml.tools.java.generator;
import org.netbeans.modules.xml.tools.generator.*;
import org.netbeans.modules.xml.tools.java.generator.SAXGeneratorAbstractPanel;
import org.netbeans.modules.xml.tools.java.generator.ParsletBindings;
import org.netbeans.modules.xml.tools.java.generator.GenerateSupportUtils;
import org.netbeans.modules.xml.tools.java.generator.ElementBindings;
import java.awt.*;
import java.util.*;
import java.beans.*;
//import org.openide.src.Type;
//import org.openide.src.Identifier;
import org.openide.util.*;
import javax.swing.*;
import javax.swing.table.*;
import java.net.URL;
import java.net.MalformedURLException;
/**
* Allows to define mapping element name => (method identifier, return type)
* in visual way. Class holding methods performing convertions is called parslet (set
* of mini-parsers).
*
* @author Petr Kuzel
* @version
*/
public final class SAXGeneratorParsletPanel extends SAXGeneratorAbstractPanel {
/** Serial Version UID */
private static final long serialVersionUID =6038099487791703339L;
private TableModel tableModel; //it is based on model
private static final int ELEMENT_COLUMN = 0;
private static final int METHOD_COLUMN = 1; // represents parslet
private static final int TYPE_COLUMN = 2;
private static final int COLUMNS = 3;
private static final String NO_METHOD = "[none]"; // NOI18N
private final String[] COLUMN_NAMES = new String[] {
NbBundle.getMessage(SAXGeneratorParsletPanel.class, "SAXGeneratorParsletPanel.table.column1"),
NbBundle.getMessage(SAXGeneratorParsletPanel.class, "SAXGeneratorParsletPanel.table.column2"),
NbBundle.getMessage(SAXGeneratorParsletPanel.class, "SAXGeneratorParsletPanel.table.column3"),
};
private final ValidatingTextField.Validator TYPE_VALIDATOR = new ValidatingTextField.Validator() {
public boolean isValid(String value) {
boolean ret = GenerateSupportUtils.isValidReturnType(value);
setValid(ret);
return ret;
}
public String getReason() {
return NbBundle.getMessage(SAXGeneratorParsletPanel.class, "MSG_parslet_err_1");
}
};
private final ValidatingTextField.Validator METHOD_VALIDATOR = new ValidatingTextField.Validator() {
public boolean isValid(String value) {
boolean ret = NO_METHOD.equals(value) || Utilities.isJavaIdentifier(value);
setValid(ret);
return ret;
}
public String getReason() {
return NbBundle.getMessage(SAXGeneratorParsletPanel.class, "MSG_parslet_err_2");
}
};
/** Creates new form SAXGeneratorParsletPanel */
public SAXGeneratorParsletPanel() {
// try {
// this.putClientProperty(WizardDescriptor.PROP_HELP_URL, new URL("nbresloc:/org/netbeans/modules/xml/tools/generator/SAXGeneratorParsletPanel.html")); //NOI18N
// } catch (MalformedURLException ex) {
// }
}
/** 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.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
descTextArea = new javax.swing.JTextArea();
tableScrollPane = new javax.swing.JScrollPane();
table = new javax.swing.JTable();
setName(NbBundle.getMessage(SAXGeneratorParsletPanel.class, "SAXGeneratorParsletPanel.Form.name")); // NOI18N
setPreferredSize(new java.awt.Dimension(480, 350));
setLayout(new java.awt.GridBagLayout());
descTextArea.setEditable(false);
descTextArea.setFont(javax.swing.UIManager.getFont ("Label.font"));
descTextArea.setForeground(new java.awt.Color(102, 102, 153));
descTextArea.setLineWrap(true);
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("org/netbeans/modules/xml/tools/java/generator/Bundle"); // NOI18N
descTextArea.setText(bundle.getString("DESC_saxw_convertors")); // NOI18N
descTextArea.setWrapStyleWord(true);
descTextArea.setDisabledTextColor(javax.swing.UIManager.getColor ("Label.foreground"));
descTextArea.setEnabled(false);
descTextArea.setOpaque(false);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
gridBagConstraints.weightx = 1.0;
add(descTextArea, gridBagConstraints);
table.setModel(tableModel);
tableScrollPane.setViewportView(table);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.gridheight = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(12, 0, 0, 0);
add(tableScrollPane, gridBagConstraints);
}// </editor-fold>//GEN-END:initComponents
/**
* Prepare all models used by this form
*/
private void initModels() {
// there is one huge table allowing main customization
tableModel = new ParsletsTableModel();
}
/**
* Upadate view according to model.
*/
protected void initView() {
initModels();
initComponents ();
table = new ParsletsTable();
table.setModel(tableModel);
tableScrollPane.setViewportView(table); //install it
//set some height margin to take care of []
int margin = 5;
int height = table.getRowHeight();
// Determine highest cell in the row
for (int c=0; c<table.getColumnCount(); c++) {
TableCellRenderer r = table.getCellRenderer(0, c);
Component comp = table.prepareRenderer(r, 0, c);
int h = comp.getPreferredSize().height;
height = Math.max(height, h);
}
table.setRowHeight(height + margin);
initAccessibility();
}
protected void updateView() {
}
/**
* Our table model directly updates model data.
* We need just reset parslets if not used.
*/
protected void updateModel() {
// if (parsletsCheckBox.isSelected()==false) {
// model.getParsletBindings().clear();
// }
}
// ~~~~~~~~~~~~~~ Table and its model ~~~~~~~~~~~~~~~~~~~~
/**
* The table using dynamic cell editors for TYPE_COLUMN and METHOD_COLUMN
*/
private class ParsletsTable extends JTable {
/** Serial Version UID */
private static final long serialVersionUID =1076091649418718319L;
public ParsletsTable() {
getTableHeader().setReorderingAllowed(false);
// setRowHeight(Util.getTextCellHeight(this));
}
public TableCellEditor getCellEditor(int row, int column) {
switch (column) {
case METHOD_COLUMN:
Vector all = new Vector(model.getParsletBindings().keySet());
JComboBox editor = new JComboBox(all);
editor.addItem(NO_METHOD);
ValidatingTextField methodInput = new ValidatingTextField();
methodInput.setValidator(METHOD_VALIDATOR);
editor.setEditor(methodInput);
editor.setEditable(true);
return new DefaultCellEditor(editor);
case TYPE_COLUMN:
String[] vals = {
"int", "boolean","long", "java.util.Date", "java.net.URL", // NOI18N
"java.lang.String", "java.lang.String[]" // NOI18N
};
JComboBox type_editor = new JComboBox(vals);
ValidatingTextField typeInput = new ValidatingTextField();
typeInput.setValidator(TYPE_VALIDATOR);
type_editor.setEditor(typeInput);
type_editor.setEditable(true);
return new DefaultCellEditor(type_editor);
default:
return super.getCellEditor(row, column);
}
}
}
/**
* Model contrainig some parslets issues
*/
private class ParsletsTableModel extends AbstractTableModel {
/** Serial Version UID */
private static final long serialVersionUID =3516749023312029787L;
public String getColumnName(int col) {
return COLUMN_NAMES[col];
}
public int getRowCount() {
if (model == null) return 0;
return model.getElementBindings().size();
}
public int getColumnCount() {
return COLUMNS;
}
/**
* @return Type or String depending on column
*/
public Object getValueAt(int row, int column) {
ElementBindings.Entry entry = model.getElementBindings().getEntry(row);
if (entry == null) {
return null;
}
ParsletBindings parslets = model.getParsletBindings();
// set to parslet or null if none assigned
String parslet = entry.getParslet();
switch (column) {
case ELEMENT_COLUMN:
return entry.getElement();
case TYPE_COLUMN: {
if (parslet == null) {
return String.class.getName();
} else {
return parslets.getReturnType(parslet).toString();
}
}
case METHOD_COLUMN: {
if (parslet == null) {
return NO_METHOD;
} else {
return parslet;
}
}
}
return null;
}
/**
* @param value must be a String regardless column
*/
public void setValueAt(Object value, int row, int col) {
// new RuntimeException("Setting Value to " + value).printStackTrace();
//TODO: Retouche
// if (col == TYPE_COLUMN) {
// if (TYPE_VALIDATOR.isValid((String) value) == false) return;
// } else if (col == METHOD_COLUMN) {
// if (METHOD_VALIDATOR.isValid((String)value) == false) return;
// }
//
// ElementBindings binds = model.getElementBindings();
// ElementBindings.Entry entry = binds.getEntry(row);
//
// // set to parslet or null if none assigned
// String currentParslet = entry.getParslet();
//
// ParsletBindings parslets = model.getParsletBindings();
// ParsletBindings.Entry parsletEntry = parslets.getEntry(currentParslet);
//
// switch (col) {
// case TYPE_COLUMN:
// // all parslets of the same name must return same type
// if (currentParslet == null) {
// break; // can not set a value
// } else {
// if (binds.getParsletUsageCount(currentParslet)>1) {
// if ( Util.THIS.isLoggable() ) /* then */ Util.THIS.debug("Cannot change"); // NOI18N
// } else {
// Type returnType =
// Type.createClass(Identifier.create((String)value));
// parsletEntry.setReturnType(returnType);
// }
// }
// break;
//
// // setting parslet determines return value
// case METHOD_COLUMN:
//
// String identifier = (String)value;
// String oldReturnType = parslets.getReturnType(currentParslet).toString();
//
// if (binds.getParsletUsageCount(currentParslet) == 1) {
// parslets.remove(currentParslet);
// }
// if (NO_METHOD.equals(identifier) == false) {
// entry.setParslet(identifier);
//
// if (parslets.getEntry(identifier) == null) {
// //parslets.put(identifier, (String) getValueAt(row, TYPE_COLUMN));
// parslets.put(identifier, oldReturnType);
// } else {
// fireTableRowsUpdated(row,row);
// }
// } else {
// entry.setParslet(null);
// fireTableRowsUpdated(row,row);
// }
// break;
//
// }
// if ( Util.THIS.isLoggable() ) /* then */ Util.THIS.debug(model.toString());
}
public boolean isCellEditable(int row, int col) {
return col != ELEMENT_COLUMN;
}
}; //ParsletsTableModel
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JTextArea descTextArea;
private javax.swing.JTable table;
private javax.swing.JScrollPane tableScrollPane;
// End of variables declaration//GEN-END:variables
/** Initialize accesibility
*/
public void initAccessibility(){
this.getAccessibleContext().setAccessibleDescription(NbBundle.getMessage(SAXGeneratorParsletPanel.class, "ACSD_SAXGeneratorParsletPanel"));
table.getAccessibleContext().setAccessibleDescription(NbBundle.getMessage(SAXGeneratorParsletPanel.class, "ACSD_ParsletsTable"));
table.getAccessibleContext().setAccessibleName(NbBundle.getMessage(SAXGeneratorParsletPanel.class, "ACSN_ParsletsTable"));
}
}