/* * zapolygen - zavai polygen applet * * Copyright (C) 2009 Enrico Zini * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ using GLib; /* protected class PolygenPage : Object { public string name { get; construct; } public Gtk.ListStore model; public Gtk.TreeView list; public Gtk.ScrolledWindow scroll; public signal void selected(string page, string name, string type); public PolygenPage(string name) { Object(name: name); model = new Gtk.ListStore(3, typeof(string), typeof(string), typeof(string)); list = new Gtk.TreeView.with_model(model); list.insert_column_with_attributes (-1, "Name", new Gtk.CellRendererText(), "text", 0); list.insert_column_with_attributes (-1, "Title", new Gtk.CellRendererText(), "text", 1); scroll = new Gtk.ScrolledWindow (null, null); scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); scroll.add(list); list.row_activated += on_row_activated; } public void select() { // Get currently selected/focused Gtk.TreePath path; Gtk.TreeViewColumn col; list.get_cursor(out path, out col); // Activate it list.row_activated(path, col); } private void on_row_activated(Gtk.TreeView tv, Gtk.TreePath path, Gtk.TreeViewColumn column) { Gtk.TreeIter iter; if (!model.get_iter(out iter, path)) return; Value grm_name, grm_type; model.get_value(iter, 0, out grm_name); model.get_value(iter, 2, out grm_type); selected(name, (string)grm_name, (string)grm_type); } } */ protected class PolygenRun : Gtk.VBox { public Gtk.ScrolledWindow scroll; protected Gtk.TextBuffer text_buffer; protected Gtk.TextView text; protected Regex unhtml; protected Regex seplines; public string grm_name { get; set; } public string grm_type { get; set; } public PolygenRun() throws RegexError { grm_name = ""; grm_type = ""; unhtml = new Regex("[ ]*<[^>]+>[ ]*", 0, 0); seplines = new Regex("\n"); text_buffer = new Gtk.TextBuffer(null); text = new Gtk.TextView.with_buffer(text_buffer); text.wrap_mode = Gtk.WrapMode.WORD; text.cursor_visible = false; text.editable = false; text.add_events(Gdk.EventMask.BUTTON_PRESS_MASK); text.button_press_event += on_button_press; scroll = new Gtk.ScrolledWindow (null, null); scroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); scroll.add(text); pack_start(scroll, true, true, 0); } public bool on_button_press(Gdk.EventButton event) { update(); return true; } public void update() { if (grm_name == "") return; string[] args = new string[5]; args[0] = "/usr/bin/polygen"; args[1] = "/usr/share/polygen/" + grm_name + ".grm"; if (grm_type == "line/text" || grm_type == "line/html") { args[2] = "-X"; args[3] = "10"; args[4] = null; } else args[2] = null; int pipe_out; string result; try { Process.spawn_async_with_pipes(homedir, args, null, 0, null, null, null, out pipe_out, null); IOChannel ch = new IOChannel.unix_new(pipe_out); size_t res_len; ch.read_to_end(out result, out res_len); ch.shutdown(false); if (grm_type == "line/html" || grm_type == "block/html") { result = unhtml.replace(result, (long)res_len, 0, " ", 0); } else if (grm_type == "line/text") { result = seplines.replace(result, (long)res_len, 0, "\n\n", 0); } } catch (Error e) { result = "Error: " + e.message; } text_buffer.text = result; Gtk.TextIter iter; text_buffer.get_iter_at_offset(out iter, 0); Gtk.TextMark mark = text_buffer.create_mark(null, iter, true); text.scroll_mark_onscreen(mark); } } public class Polygen : Gtk.Window { //protected Gee.ArrayList pages; protected Gtk.Notebook notebook; protected PolygenRun result; protected Gtk.ListStore grammars; protected FisheyeListView grammarlist; private void add_grammar(string page, string name, string type, string title) { /* PolygenPage pg = null; foreach (PolygenPage p in pages) { if (p.name == page) { pg = p; break; } } if (pg == null) { pg = new PolygenPage(page); pg.selected += on_selected; pages.add(pg); } Gtk.TreeIter iter; pg.model.append (out iter); pg.model.set(iter, 0, name); pg.model.set(iter, 1, title); pg.model.set(iter, 2, type); */ Gtk.TreeIter iter; grammars.append (out iter); grammars.set(iter, 0, "%s/%s - %s".printf(page, name, title)); grammars.set(iter, 1, "%s/%s".printf(page, name)); grammars.set(iter, 2, type); } /* protected void on_selected(string page, string name, string type) { result.grm_name = page + "/" + name; result.grm_type = type; result.update(); notebook.set_current_page(notebook.get_n_pages()-1); } */ public Polygen(string label, IOChannel data) throws ConvertError, IOChannelError, RegexError { title = label; destroy += Gtk.main_quit; grammars = new Gtk.ListStore(3, typeof(string), typeof(string), typeof(string)); var vbox = new Gtk.VBox(false, 0); add(vbox); //pages = new Gee.ArrayList(); while (true) { string line; var res = data.read_line(out line, null, null); if (res != IOStatus.NORMAL) break; string[] vals = line.split(" ", 3); if (vals == null) break; string[] np = vals[0].split("/", 2); if (np == null) break; add_grammar(np[0], np[1], vals[1], vals[2].strip()); } grammarlist = new FisheyeListView(); grammarlist.set_model(grammars); grammarlist.row_activated += on_row_activated; notebook = new Gtk.Notebook(); notebook.append_page(grammarlist, new Gtk.Label("Grammars")); /* foreach (PolygenPage p in pages) { notebook.append_page(p.scroll, new Gtk.Label(p.name)); } */ result = new PolygenRun(); notebook.append_page(result, new Gtk.Label("Result")); vbox.pack_start(notebook, true, true, 0); //Gtk.Button select = new Gtk.Button.with_label("Select"); //button_box.pack_start(select, true, true, 0); //select.clicked += on_click; } public void on_row_activated(Gtk.TreePath path) { Gtk.TreeIter iter; grammars.get_iter(out iter, path); string grm; string type; grammars.get(iter, 1, out grm, 2, out type, -1); stdout.printf("Clicked on %s %s\n", type, grm); result.grm_name = grm; result.grm_type = type; result.update(); notebook.set_current_page(notebook.get_n_pages()-1); } /* private void on_click(Gtk.Button b) { stderr.printf("ZA\n"); if (notebook.page >= pages.size) result.update(); // If we are in the result page, just update else { PolygenPage page = pages[notebook.page]; page.select(); } } */ } string homedir; static int main (string[] args) { Gtk.init (ref args); homedir = GLib.Environment.get_home_dir() + "/.zavai"; Polygen polygen; try { var data = new IOChannel.file(homedir + "/polygen-info", "r"); polygen = new Polygen("Polygen", data); polygen.set_size_request(300, 500); polygen.show_all(); data.shutdown(false); //zavai.registry.register_applet("ui.polygen", polygen); //zavai.registry.getmenu("menu.misc").add_applet("ui.polygen"); } catch (Error e) { stderr.printf("%s", e.message); } Gtk.main(); return 0; }