package org.osbl.client.wings.devtools;
import org.osbl.ServiceProvider;
import org.osbl.client.wings.shell.*;
import org.osbl.client.wings.XOptionPane;
import org.osbl.client.wings.form.DelegateEnvironment;
import org.wings.*;
import org.wings.table.SDefaultTableCellRenderer;
import org.wings.border.SLineBorder;
import org.wingx.XTable;
import org.wingx.XScrollPane;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.ListSelectionEvent;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.*;
import java.util.*;
import java.util.List;
import java.beans.*;
import java.lang.reflect.Method;
public class ServiceBrowser
extends SPanel
implements Application
{
protected Environment environment = new DelegateEnvironment(true);
SList beansList = new SList();
PropertiesTableModel model = new PropertiesTableModel();
XTable propertiesTable = new XTable(model);
private ServiceProvider serviceProvider = ServiceProvider.getInstance();
public ServiceBrowser() {
super(new SBorderLayout());
beansList.setListData(serviceProvider.getServiceNames());
beansList.setSelectionMode(SList.SINGLE_SELECTION);
beansList.addListSelectionListener(new ListSelectionListener()
{
public void valueChanged(ListSelectionEvent e) {
String name = (String)beansList.getSelectedValue();
Object bean = serviceProvider.getService(name);
try {
PropertyDescriptor[] descriptors = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();
List list = new LinkedList();
for (int i = 0; i < descriptors.length; i++) {
PropertyDescriptor descriptor = descriptors[i];
if (descriptor.getReadMethod() != null)
list.add(descriptor);
}
model.setBean(bean);
model.setDescriptors((PropertyDescriptor[])list.toArray(new PropertyDescriptor[list.size()]));
}
catch (IntrospectionException e1) {
e1.printStackTrace();
model.setDescriptors(new PropertyDescriptor[0]);
}
}
});
propertiesTable.setEditable(false);
propertiesTable.setDefaultRenderer(new ValueCellRenderer());
XScrollPane scrollPane = new XScrollPane(propertiesTable);
add(beansList, SBorderLayout.NORTH);
add(scrollPane, SBorderLayout.CENTER);
environment.setContentPane(this);
environment.setTitle("org.osbl.client.wings.devtools.serviceBrowser");
}
public Environment getEnvironment() {
return environment;
}
class PropertiesTableModel
extends AbstractTableModel
{
Object bean;
PropertyDescriptor[] descriptors = new PropertyDescriptor[0];
public void setBean(Object bean) {
this.bean = bean;
fireTableDataChanged();
}
public void setDescriptors(PropertyDescriptor[] descriptors) {
this.descriptors = descriptors;
fireTableStructureChanged();
}
public int getRowCount() {
return descriptors.length;
}
public int getColumnCount() {
return 2;
}
public String getColumnName(int column) {
return new String[]{
"name",
"value"
}[column];
}
public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex) {
case 0:
return descriptors[rowIndex].getName();
case 1:
PropertyDescriptor descriptor = descriptors[rowIndex];
Method getter = descriptor.getReadMethod();
try {
return getter.invoke(bean);
}
catch (Exception e) {
e.printStackTrace();
return e.getMessage();
}
default:
return "";
}
}
}
private class ValueCellRenderer
extends SDefaultTableCellRenderer
{
public ValueCellRenderer() {
setStyle("SLabel wrap");
}
public SComponent getTableCellRendererComponent(STable table,
Object value,
boolean selected,
int row,
int col) {
if (value instanceof Throwable) {
Throwable throwable = (Throwable)value;
StringBuffer buffer = new StringBuffer(throwable.getMessage());
buffer.append("\n");
for (int i = 0; i < throwable.getStackTrace().length; i++) {
StackTraceElement traceElement = throwable.getStackTrace()[i];
buffer.append(traceElement.toString());
buffer.append("\n");
}
setText(buffer.toString());
}
else
setText("" + value);
return this;
}
}
}
|