/*
D-Bus Java Viewer
Copyright (c) 2006 Peter Cox
This program is free software; you can redistribute it and/or modify it
under the terms of either the GNU Lesser General Public License Version 2 or the
Academic Free Licence Version 2.1.
Full licence texts are included in the COPYING file with this program.
*/
package org.freedesktop.dbus.viewer;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.io.StringReader;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.ListSelectionModel;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.freedesktop.DBus.Introspectable;
import org.freedesktop.dbus.bin.CreateInterface;
@SuppressWarnings("serial")
final class IntrospectAction extends AbstractAction implements ListSelectionListener
{
private final JTable table;
IntrospectAction(JTable table)
{
super("Introspect");
setEnabled(false);
this.table = table;
ListSelectionModel selectionModel = table.getSelectionModel();
selectionModel.addListSelectionListener(this);
selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}
/** {@inheritDoc} */
public void valueChanged(ListSelectionEvent e)
{
if (!e.getValueIsAdjusting())
{
DBusTableModel model = (DBusTableModel) table.getModel();
int selection = table.getSelectedRow();
if (selection > -1 && selection < model.getRowCount())
{
DBusEntry entry = model.getEntry(selection);
final Introspectable introspectable = entry.getIntrospectable();
setEnabled(introspectable != null);
}
}
}
/** {@inheritDoc} */
public void actionPerformed(ActionEvent e)
{
int row = table.getSelectedRow();
DBusTableModel model = (DBusTableModel) table.getModel();
if (row > -1 && row < model.getRowCount())
{
DBusEntry entry = model.getEntry(row);
final String xmlFile = entry.getName() + ".xml";
final Introspectable introspectable = entry.getIntrospectable();
new Thread(new Runnable()
{
public void run()
{
StringStreamFactory factory = new StringStreamFactory();
CreateInterface createInterface = new CreateInterface(factory, false);
try
{
String xml = introspectable.Introspect();
String docType = "<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\"\n\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">";
createInterface.createInterface(new StringReader(xml.replace(docType, "")));
final JTabbedPane tabbedPane = new JTabbedPane();
tabbedPane.addTab(xmlFile, createSourceTab(xmlFile, xml));
for (String file : factory.streamMap.keySet())
{
final String source = factory.streamMap.get(file).toString();
tabbedPane.addTab(file, createSourceTab(file, source));
}
tabbedPane.setPreferredSize(new Dimension(600, 400));
final JPanel introspectionPanel = new JPanel(new BorderLayout());
introspectionPanel.add(tabbedPane, BorderLayout.CENTER);
JPanel southPanel = new JPanel();
southPanel.add(new JButton(new SaveFileAction(tabbedPane)));
southPanel.add(new JButton(new SaveAllAction(tabbedPane)));
introspectionPanel.add(southPanel, BorderLayout.SOUTH);
SwingUtilities.invokeLater(new Runnable()
{
@SuppressWarnings("synthetic-access")
public void run()
{
JOptionPane.showMessageDialog(table, introspectionPanel, "Introspection", JOptionPane.PLAIN_MESSAGE);
}
});
}
catch (final Exception e)
{
e.printStackTrace();
SwingUtilities.invokeLater(new Runnable()
{
@SuppressWarnings("synthetic-access")
public void run()
{
JOptionPane.showMessageDialog(table, e.getMessage(), "Introspection Failed", JOptionPane.ERROR_MESSAGE);
}
});
}
}
private JScrollPane createSourceTab(String file, final String source)
{
JTextArea area = new JTextArea(source);
area.setLineWrap(true);
area.setWrapStyleWord(true);
return new JScrollPane(area, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
}
}).start();
}
}
}