Logo Search packages:      
Sourcecode: dbus-java version File versions  Download package

IntrospectAction.java

/*
   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();
                  
            }
      }
}

Generated by  Doxygen 1.6.0   Back to index