static Xcls_WindowRooView _WindowRooView; public class Xcls_WindowRooView : Object { public Gtk.VPaned el; private Xcls_WindowRooView _this; public static Xcls_WindowRooView singleton() { if (_WindowRooView == null) { _WindowRooView= new Xcls_WindowRooView(); } return _WindowRooView; } public Xcls_viewbox viewbox; public Xcls_AutoRedraw AutoRedraw; public Xcls_viewcontainer viewcontainer; public Xcls_view view; public Xcls_inspectorcontainer inspectorcontainer; // my vars (def) public JsRender.JsRender file; // ctor public Xcls_WindowRooView() { _this = this; this.el = new Gtk.VPaned(); // my vars (dec) // set gobject values var child_0 = new Xcls_viewbox( _this ); child_0.ref(); this.el.pack1 ( child_0.el , true,true ); var child_1 = new Xcls_inspectorcontainer( _this ); child_1.ref(); this.el.pack2 ( child_1.el , true,true ); } // user defined functions public void createThumb () { if (this.file == null) { return; } var filename = this.file.getIconFileName(false); var win = this.el.get_parent_window(); var width = win.get_width(); var height = win.get_height(); Gdk.Pixbuf screenshot = Gdk.pixbuf_get_from_window(win, 0, 0, width, this.el.position); screenshot.save(filename,"png"); return; var p = new WebKit.PrintOperation(_this.view.el); var ps = new Gtk.PrintSettings(); ps.set_printer("Print to File"); ps.set("output-file-format", "pdf"); ps.set("output-uri", "file://" + filename + ".pdf"); // find the printer... /* var ar = Gtk.PaperSize.get_paper_sizes(false); var psetup = new Gtk.PageSetup(); for(var i = 0; i < ar.length(); i++) { if (ar.nth_data(i).get_name() =="iso_a4") { psetup.set_paper_size(ar.nth_data(i)); } } psetup.set_orientation(Gtk.PageOrientation.LANDSCAPE); p.set_page_setup(psetup); */ p.set_print_settings(ps); p.finished.connect(() => { print("creating thumbnail for " + filename + ".pdf\n"); var s = new Cairo.PdfSurface(filename + ".pdf", 400,400); s.write_to_png (filename); // var f = GLib.File.new_for_path (filename + ".pdf"); // f.delete(); }); p.print(); // should we hold until it's printed... } public void loadFile (JsRender.JsRender file) { this.file = file; this.view.renderJS(true); } public void requestRedraw () { this.view.renderJS(false); } public class Xcls_viewbox : Object { public Gtk.VBox el; private Xcls_WindowRooView _this; // my vars (def) // ctor public Xcls_viewbox(Xcls_WindowRooView _owner ) { _this = _owner; _this.viewbox = this; this.el = new Gtk.VBox( false, 0 ); // my vars (dec) // set gobject values var child_0 = new Xcls_HBox3( _this ); child_0.ref(); this.el.pack_start ( child_0.el , false,true,0 ); var child_1 = new Xcls_viewcontainer( _this ); child_1.ref(); this.el.pack_end ( child_1.el , true,true,0 ); } // user defined functions } public class Xcls_HBox3 : Object { public Gtk.HBox el; private Xcls_WindowRooView _this; // my vars (def) // ctor public Xcls_HBox3(Xcls_WindowRooView _owner ) { _this = _owner; this.el = new Gtk.HBox( true, 0 ); // my vars (dec) // set gobject values this.el.height_request = 20; this.el.vexpand = false; var child_0 = new Xcls_Button4( _this ); child_0.ref(); this.el.pack_start ( child_0.el , false,false,0 ); var child_1 = new Xcls_AutoRedraw( _this ); child_1.ref(); this.el.pack_start ( child_1.el , false,false,0 ); var child_2 = new Xcls_Button6( _this ); child_2.ref(); this.el.pack_start ( child_2.el , false,false,0 ); } // user defined functions } public class Xcls_Button4 : Object { public Gtk.Button el; private Xcls_WindowRooView _this; // my vars (def) // ctor public Xcls_Button4(Xcls_WindowRooView _owner ) { _this = _owner; this.el = new Gtk.Button(); // my vars (dec) // set gobject values this.el.label = "Redraw"; // listeners this.el.clicked.connect( ( ) => { _this.view.renderJS( true); }); } // user defined functions } public class Xcls_AutoRedraw : Object { public Gtk.CheckButton el; private Xcls_WindowRooView _this; // my vars (def) // ctor public Xcls_AutoRedraw(Xcls_WindowRooView _owner ) { _this = _owner; _this.AutoRedraw = this; this.el = new Gtk.CheckButton(); // my vars (dec) // set gobject values this.el.active = true; this.el.label = "Auto Redraw On"; // listeners this.el.toggled.connect( (state) => { this.el.set_label(this.el.active ? "Auto Redraw On" : "Auto Redraw Off"); }); } // user defined functions } public class Xcls_Button6 : Object { public Gtk.Button el; private Xcls_WindowRooView _this; // my vars (def) // ctor public Xcls_Button6(Xcls_WindowRooView _owner ) { _this = _owner; this.el = new Gtk.Button(); // my vars (dec) // set gobject values this.el.label = "Full Redraw"; // listeners this.el.clicked.connect( () => { _this.view.redraws = 99; _this.view.el.web_context.clear_cache(); _this.view.renderJS(true); }); } // user defined functions } public class Xcls_viewcontainer : Object { public Gtk.ScrolledWindow el; private Xcls_WindowRooView _this; // my vars (def) // ctor public Xcls_viewcontainer(Xcls_WindowRooView _owner ) { _this = _owner; _this.viewcontainer = this; this.el = new Gtk.ScrolledWindow( null, null ); // my vars (dec) // set gobject values this.el.shadow_type = Gtk.ShadowType.IN; var child_0 = new Xcls_view( _this ); child_0.ref(); this.el.add ( child_0.el ); // init method this.el.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); } // user defined functions } public class Xcls_view : Object { public WebKit.WebView el; private Xcls_WindowRooView _this; // my vars (def) public string renderedData; public bool refreshRequired; public WebKit.WebInspector inspector; public int redraws; public GLib.DateTime lastRedraw; public string runhtml; public bool pendingRedraw; // ctor public Xcls_view(Xcls_WindowRooView _owner ) { _this = _owner; _this.view = this; this.el = new WebKit.WebView(); // my vars (dec) this.renderedData = ""; this.refreshRequired = false; this.redraws = 0; this.lastRedraw = null; this.runhtml = ""; this.pendingRedraw = false; // set gobject values // init method { // this may not work!? var settings = this.el.get_settings(); settings.enable_developer_extras = true; // this was an attempt to change the url perms.. did not work.. // settings.enable_file_access_from_file_uris = true; // settings.enable_offline_web_application_cache - true; // settings.enable_universal_access_from_file_uris = true; // FIXME - base url of script.. // we need it so some of the database features work. this.el.load_html( "Render not ready" , //fixme - should be a config option! // or should we catch stuff and fix it up.. "http://localhost/app.Builder/" ); //this.el.open('file:///' + __script_path__ + '/../builder.html'); /* Gtk.drag_dest_set ( this.el, // Gtk.DestDefaults.MOTION | Gtk.DestDefaults.HIGHLIGHT, null, // list of targets Gdk.DragAction.COPY // what to do with data after dropped ); // print("RB: TARGETS : " + LeftTree.atoms["STRING"]); Gtk.drag_dest_set_target_list(this.el, this.get('/Window').targetList); */ GLib.Timeout.add_seconds(1, () =>{ //print("run refresh?"); if (this.el == null) { return false; } this.runRefresh(); return true; }); } // listeners this.el.script_dialog.connect( (dialog) => { if (this.el == null) { return true; } var msg = dialog.get_message(); if (msg.length < 4) { return false; } if (msg.substring(0,4) != "IPC:") { return false; } var ar = msg.split(":", 3); if (ar.length < 3) { return false; } switch(ar[1]) { case "SAVEHTML": _this.file.saveHTML(ar[2]); return true; default: return false; } }); this.el.show.connect( ( ) => { this.initInspector();; }); this.el.drag_drop.connect( ( ctx, x, y,time, ud) => { return false; /* print("TARGET: drag-drop"); var is_valid_drop_site = true; Gtk.drag_get_data ( w, // will receive 'drag-data-received' signal ctx, /* represents the current state of the DnD this.get('/Window').atoms["STRING"], /* the target type we want time /* time stamp ); /* No target offered by source => error return is_valid_drop_site; */ }); } // user defined functions public void runRefresh () { // this is run every 2 seconds from the init.. if (!this.refreshRequired) { // print("no refresh required"); return; } if (this.lastRedraw != null) { // do not redraw if last redraw was less that 5 seconds ago. if ((int64)(new DateTime.now_local()).difference(this.lastRedraw) < 5000 ) { return; } } if (_this.file == null) { return; } this.refreshRequired = false; // print("HTML RENDERING"); //this.get('/BottomPane').el.show(); //this.get('/BottomPane').el.set_current_page(2);// webkit inspector _this.file.webkit_page_id = this.el.get_page_id(); var js = _this.file.toSourcePreview(); if (js.length < 1) { print("no data"); return; } // var data = js[0]; this.redraws++; var project = _this.file.project; //print (project.fn); // set it to non-empty. // runhtml = runhtml.length ? runhtml : ''; // this.runhtml = this.runhtml || ''; // then we need to reload the browser using // load_html_string.. // then trigger a redraw once it's loaded.. this.pendingRedraw = true; var runhtml = "\n" ; // fix to make sure they are the same.. this.runhtml = project.runhtml; // need to modify paths string inhtml; var base_template = _this.file.project.base_template; if (base_template.length > 0 && !FileUtils.test( Builder4.Application.configDirectory() + "/resources/" + base_template, FileTest.EXISTS) ) { print("invalid base_template name - using default: %s\n", base_template); base_template = ""; } GLib.FileUtils.get_contents( Builder4.Application.configDirectory() + "/resources/" + (base_template.length > 0 ? base_template : "roo.builder.html") , out inhtml); this.renderedData = js; string js_src = js + "\n" + "Roo.onReady(function() {\n" + "if (" + _this.file.name +".show) " + _this.file.name +".show({});\n" + "Roo.XComponent.build();\n" + "});\n"; // print("render js: " + js); //if (!this.ready) { // console.log('not loaded yet'); //} this.lastRedraw = new DateTime.now_local(); var html = inhtml.replace("", runhtml + this.runhtml + "" + ""); //print("LOAD HTML " + html); var rootURL = _this.file.project.rootURL; this.el.load_html( html , //fixme - should be a config option! (rootURL.length > 0 ? rootURL : "http://localhost/app.Builder/") ); // force the inspector... this.initInspector(); // - no need for this, the builder javascript will call it when build is complete //GLib.Timeout.add_seconds(1, () => { // this.el.run_javascript("Builder.saveHTML()",null); // return false; //}); // print( "before render" + this.lastRedraw); // print( "after render" + (new Date())); } public void initInspector () { if (this.inspector == this.el.get_inspector()) { this.inspector.show(); this.inspector.open_window(); print("init inspecter called, and inspector is the same as existing\n"); return; } print("new inspector?\n"); this.inspector = this.el.get_inspector(); this.inspector.ref(); // got a new inspector... this.inspector.open_window.connect(() => { this.inspector = this.el.get_inspector(); print("inspector attach\n"); var wv = this.inspector.get_web_view(); if (wv != null) { print("got inspector web view\n"); _this.inspectorcontainer.el.add(wv); wv.show(); } else { //this.inspector.close(); //this.inspector = null; } return true; }); this.inspector.closed.connect(() => { print("inspector closed?!?"); // if this happens destroy the webkit.. // recreate it.. this.el.stop_loading(); if (_this.viewbox.el.get_parent() == null) { return; } _this.viewbox.el.remove(_this.viewcontainer.el); _this.el.remove(_this.inspectorcontainer.el); // destory seems to cause problems. //this.el.destroy(); //_this.viewcontainer.el.destroy(); //_this.inspectorcontainer.el.destroy(); this.el = null; var nv =new Xcls_viewcontainer(_this); nv.ref(); _this.viewbox.el.pack_end(nv.el,true,true,0); var inv =new Xcls_inspectorcontainer(_this); inv.ref(); _this.el.pack2(inv.el,true,true); inv.el.show_all(); nv.el.show_all(); //while(Gtk.events_pending ()) Gtk.main_iteration (); //_this.view.renderJS(true); _this.view.refreshRequired = true; }); this.inspector.show(); } public void renderJS (bool force) { // this is the public redraw call.. // we refresh in a loop privately.. var autodraw = _this.AutoRedraw.el.active; if (!autodraw && !force) { print("Skipping redraw - no force, and autodraw off"); return; } this.refreshRequired = true; } } public class Xcls_inspectorcontainer : Object { public Gtk.ScrolledWindow el; private Xcls_WindowRooView _this; // my vars (def) // ctor public Xcls_inspectorcontainer(Xcls_WindowRooView _owner ) { _this = _owner; _this.inspectorcontainer = this; this.el = new Gtk.ScrolledWindow( null, null ); // my vars (dec) // set gobject values this.el.shadow_type = Gtk.ShadowType.IN; // init method this.el.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); } // user defined functions } }