blob: 3e5a744679c5e4e337e508c914b24e0333556c32 [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.apache.felix.upnp.tester.gui;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.util.Dictionary;
import java.util.Hashtable;
import javax.swing.AbstractAction;
import javax.swing.AbstractCellEditor;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSlider;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.TableModelEvent;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableModel;
import org.osgi.service.upnp.UPnPAction;
import org.osgi.service.upnp.UPnPException;
import org.osgi.service.upnp.UPnPStateVariable;
import org.apache.felix.upnp.basedriver.util.Converter;
import org.apache.felix.upnp.tester.Mediator;
/*
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public class ActionPanel extends JPanel {
UPnPAction action;
ArgumentsModel argsModel;
MyTable table;
JPanel buttonPanel;
OutputArgumentsModel outArgsModel;
JTable outTable;
/**
*
*/
public ActionPanel() {
super(new GridBagLayout());
buildButtonPanel();
buildTable();
add(new JScrollPane(table),Util.setConstrains(0,0,1,1,100,100));
add(new JScrollPane(outTable),Util.setConstrains(0,1,1,1,100,100));
add(buttonPanel,Util.setConstrains(1,0,1,1,1,1));
}
private void buildButtonPanel(){
buttonPanel = new JPanel();
JButton doAction = new JButton("Do Action");
doAction.addActionListener(new AbstractAction(){
public void actionPerformed(ActionEvent e) {
outArgsModel.clearData();
Dictionary params = null;
Dictionary result = null;
if (argsModel.getRowCount()!= 0){
if (table.isEditing()) table.getCellEditor().stopCellEditing();
params = new Hashtable();
for (int i =0;i<argsModel.getRowCount();i++){
String name = (String) argsModel.getValueAt(i,0);
String value = (String)argsModel.getValueAt(i,3);
try {
params.put(
name,
Converter.parseString(
value,
action.getStateVariable(name).getUPnPDataType()));
} catch (Exception ex) {
LogPanel.log("Error invoking action (bad parameter)");
return ;
}
}
}
try {result = action.invoke(params);}
catch (UPnPException ex){
String error =
"===== Action Failed =====" +
"\nUPnP Error Code::\n " +ex.getUPnPError_Code() +
"\nUPnP Error Description::\n " +ex.getMessage();
printReport(params,error);
JOptionPane.showMessageDialog(
Mediator.getPropertiesViewer(),error);
}
catch (Exception ex){
printReport(params,ex.getMessage());
JOptionPane.showMessageDialog(
Mediator.getPropertiesViewer(),
ex.getMessage()
);
}
if (result != null) {
printReport(params,result);
outArgsModel.setData(action,result);
JOptionPane.showMessageDialog(
Mediator.getPropertiesViewer(),
"Action invoked!"
);
}
}
private void printReport(Dictionary params,Object result) {
String input = "";
String output = "";
if (params != null) input = params.toString();
if (output != null) output = result.toString();
String method = action.getName();
String report = "\n==== Action:: " + method + " ====\n"
+ input
+ "\n----------- result ----------\n"
+ output
+ "\n-----------------------------";
LogPanel.log(report);
}
});
buttonPanel.add(doAction);
}
private void buildTable(){
argsModel = new ArgumentsModel();
table = new MyTable(argsModel);
argsModel.setTable(table);
outArgsModel = new OutputArgumentsModel();
outTable = new JTable(outArgsModel);
}
public void setArguments(UPnPAction action){
this.action = action;
argsModel.setData(action);
outArgsModel.clearData();
}
}
//thanks to Thomas Wagner 18/10/2005
class OutputArgumentsModel extends ArgumentsModel {
public OutputArgumentsModel() {
super();
header = new String[]{"output arg name","related Var","Java \\ UpnP type","value"};
}
public void clearData() {
names = new String[]{""};
related = new String[]{""};
types = new String[]{""};
values = new String[]{""};
size=0;
this.fireTableChanged(new TableModelEvent(this));
}
public void setData(UPnPAction action, Object result){
Hashtable res = (Hashtable) result;
String[] names = action.getOutputArgumentNames();
size = 0;
this.names = names;
if (names!=null){
values = new String[names.length];
types = new String[names.length];
related = new String[names.length];
for (int i=0;i<names.length;i++) {
UPnPStateVariable currentStateVar = action.getStateVariable(names[i]);
Object value = res.get(names[i]);
values[i]=value.toString();
related[i] = currentStateVar.getName();
String javaType =currentStateVar.getJavaDataType().toString();
javaType = javaType.substring(javaType.lastIndexOf('.')+1);
String upnpType = currentStateVar.getUPnPDataType();
types[i] = javaType + " \\ " + upnpType;
}
size = names.length;
}
this.fireTableChanged(new TableModelEvent(this));
}
}
//thanks to Thomas Wagner 12/10/2005
class ArgumentsModel extends AbstractTableModel {
int size = 0;
private MyTable table;
String[] names = new String[]{""};
String[] related = new String[]{""};
String[] types = new String[]{""};
String[] values = new String[]{""};
String[] header = new String[]{"arg name","related Var","Java \\ UpnP type","value"};
public void setTable(MyTable table) {
this.table = table;
}
public int getColumnCount() { return 4; }
public int getRowCount() { return size;}
public String getColumnName(int col) { return header[col]; }
public boolean isCellEditable(int rowIndex, int columnIndex) {
return (columnIndex ==3);
}
public Object getValueAt(int row, int col) {
if (col == 0) return names[row];
else if (col == 1) return related[row];
else if (col == 2) return types[row];
else if (col == 3) return values[row];
return null;
}
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
values[rowIndex]= (String) aValue;
}
public void setData(UPnPAction action){
table.deleteMyCellEditors();
String[] names = action.getInputArgumentNames();
size = 0;
this.names = names;
if (names!=null){
values = new String[names.length];
related = new String[names.length];
types = new String[names.length];
for (int i=0;i<names.length;i++) {
values[i]="";
UPnPStateVariable currentStateVar = action.getStateVariable(names[i]);
related[i] = currentStateVar.getName();
String javaType = currentStateVar.getJavaDataType().toString();
javaType = javaType.substring(javaType.lastIndexOf('.')+1);
String upnpType = currentStateVar.getUPnPDataType();
types[i] = javaType + " \\ " + upnpType;
//handle allowed value list
if ( currentStateVar.getAllowedValues() != null) {
String av[] = currentStateVar.getAllowedValues();
JComboBox comboBox = new JComboBox();
for (int j = 0; j < av.length; j++) {
comboBox.addItem(av[j]);
}
values[i] = av[0]; //preset the first value from list
table.setMyCellEditor(new DefaultCellEditor(comboBox),i);
}
//handle default value
if (currentStateVar.getDefaultValue() != null) {
String val = currentStateVar.getDefaultValue().toString();
if(val.length() > 0)
values[i] = val;
}
//handle range values
if ((currentStateVar.getMaximum()!= null)
&&(currentStateVar.getMinimum()!= null)){
int max = currentStateVar.getMaximum().intValue();
int min = currentStateVar.getMinimum().intValue();
int value = min;
try { value = Integer.parseInt(values[i]);}
catch (NumberFormatException ignored){}
table.setMyCellEditor(new SliderEditor(min,max,value),i);
}
}
size = names.length;
}
this.fireTableChanged(new TableModelEvent(this));
this.fireTableStructureChanged();
}
}
// thanks to Thomas Wagner 12/10/2005
class MyTable extends JTable {
private Hashtable cellEditors;
public MyTable(TableModel dm) {
super(dm);
cellEditors = new Hashtable();
}
public void setMyCellEditor(TableCellEditor editor,int col){
cellEditors.put(new Integer(col),editor);
}
public void deleteMyCellEditors(){
cellEditors.clear();
}
//overwritten JTable method
public TableCellEditor getCellEditor(int row,int col) {
TableCellEditor tce = (TableCellEditor) cellEditors.get(new Integer(row));
if( tce != null) {
return tce;
} else {
return super.getCellEditor(row,col);
}
}
}
class SliderEditor extends AbstractCellEditor implements TableCellEditor
{
JPanel editor;
JTextField text;
JSlider slider;
public SliderEditor(int min, int max, int value){
editor = new JPanel(new BorderLayout());
//editor.setBorder(new EmptyBorder(1,0,1,0));
text = new JTextField(Integer.toString(max).length());
slider = new JSlider(SwingConstants.HORIZONTAL,min,max,value);
editor.add(text,BorderLayout.WEST);
editor.add(slider);
slider.addChangeListener(new ChangeListener(){
public void stateChanged(ChangeEvent e) {
//if (! replSlider.getValueIsAdjusting()){
text.setText(new Integer(slider.getValue()).toString());
//}
}
});
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
text.setText((String) value);
try {
slider.setValue(Integer.parseInt((String)value));
} catch (NumberFormatException ignored) {}
return editor;
}
public Object getCellEditorValue() {
return text.getText();
}
}