#!/usr/local/bin/ruby -w # Sample Application for Ruby/GTK - gtk-xmlviewer.rb # Beispielprogramm fuer Ruby/GTK -gtk-xmlviewer.rb require 'gtk' require 'nqxml/treeparser' class XMLViewer < Gtk::Window def initialize super(Gtk::WINDOW_TOPLEVEL) set_title('Ruby/Gtk XML Viewer') set_usize(600, 400) menubar = createMenubar @treeList = Gtk::Tree.new @treeList.show @columnList = Gtk::CList.new(['Attribut', 'Wert']) @columnList.show bottom = Gtk::HBox.new(false, 0) bottom.pack_start(@treeList, true, true, 0) bottom.pack_start(@columnList, true, true, 0) bottom.show contents = Gtk::VBox.new(false, 0) contents.pack_start(menubar, false, false, 0) contents.pack_start(bottom, true, true, 0) add(contents) contents.show signal_connect(Gtk::Widget::SIGNAL_DELETE_EVENT) { exit } end def createMenubar menubar = Gtk::MenuBar.new fileMenuItem = Gtk::MenuItem.new("Datei") fileMenu = Gtk::Menu.new openItem = Gtk::MenuItem.new("Öffnen...") openItem.signal_connect(Gtk::MenuItem::SIGNAL_ACTIVATE) { openDocument } openItem.show fileMenu.add(openItem) quitItem = Gtk::MenuItem.new("Beenden") quitItem.signal_connect(Gtk::MenuItem::SIGNAL_ACTIVATE) { exit } quitItem.show fileMenu.add(quitItem) fileMenuItem.set_submenu(fileMenu) fileMenuItem.show helpMenuItem = Gtk::MenuItem.new("Hilfe") helpMenu = Gtk::Menu.new aboutItem = Gtk::MenuItem.new("Über..") aboutItem.signal_connect(Gtk::MenuItem::SIGNAL_ACTIVATE) { showMessageBox('Über XMLViewer', 'Ruby/GTK Beispielprogramm') } aboutItem.show helpMenu.add(aboutItem) helpMenuItem.set_submenu(helpMenu) helpMenuItem.show menubar.append(fileMenuItem) menubar.append(helpMenuItem) menubar.show menubar end def selectItem(entity) @columnList.clear if entity.kind_of?(NQXML::NamedAttributes) keys = entity.attrs.keys.sort keys.each { |key| @columnList.append([key, entity.attrs[key]]) } end end def populateTreeList(docRootNode, treeRoot) entity = docRootNode.entity if entity.instance_of?(NQXML::Tag) treeItem = Gtk::TreeItem.new(entity.to_s) treeRoot.append(treeItem) if docRootNode.children.length > 0 subTree = Gtk::Tree.new treeItem.set_subtree(subTree) docRootNode.children.each do |node| populateTreeList(node, subTree) end end treeItem.signal_connect(Gtk::Item::SIGNAL_SELECT) { selectItem(entity) } treeItem.show elsif entity.instance_of?(NQXML::Text) && entity.to_s.strip.length != 0 treeItem = Gtk::TreeItem.new(entity.to_s) treeRoot.append(treeItem) treeItem.signal_connect(Gtk::Item::SIGNAL_SELECT) { selectItem(entity) } treeItem.show end end def loadDocument(filename) @document = nil begin @document = NQXML::TreeParser.new(File.new(filename)).document rescue NQXML::ParserError => ex showMessageBox("Fehler", "XML Document kann nicht geparst werden") end if @document @treeList.children.each { |child| @treeList.remove_child(child) } populateTreeList(@document.rootNode, @treeList) end end def openDocument dlg =Gtk::FileSelection.new('Öffnen Datei') dlg.ok_button.signal_connect(Gtk::Button::SIGNAL_CLICKED) { dlg.hide filename =dlg.get_filename loadDocument(filename) if filename } dlg.cancel_button.signal_connect(Gtk::Button::SIGNAL_CLICKED) { dlg.hide } dlg.show end def showMessageBox(title, msg) msgBox = Gtk::Dialog.new msgLabel = Gtk::Label.new(msg) msgLabel.show okButton = Gtk::Button.new('OK') okButton.show okButton.signal_connect(Gtk::Button::SIGNAL_CLICKED) { msgBox.hide } msgBox.set_usize(250, 100) msgBox.vbox.pack_start(msgLabel) msgBox.action_area.pack_start(okButton) msgBox.set_title(title) msgBox.show end end if $0 == __FILE__ mainWindow = XMLViewer.new mainWindow.show Gtk::main end