module Netzke # == Window # Ext.Window-based widget # # == Features # * Persistent position # * Persistent dimensions # # == Instance configuration # :height and :width - besides accepting a number (which would be just standard ExtJS), # can accept a string specifying relative sizes, calculated from current browser window dimensions. # E.g.: :height => "90%", :width => "60%" class Window < Base # Based on Ext.Window, naturally def self.js_base_class "Ext.Window" end # Set the passed item as the only aggregatee def initial_aggregatees res = {} res.merge!(:item => config[:item]) if config[:item] res end # Extends the JavaScript class def self.js_extend_properties { :layout => "fit", :init_component => <<-END_OF_JAVASCRIPT.l, function(){ // Width and height may be specified as percentage of available space, e.g. "60%". // Convert them into actual pixels. Ext.each(["width", "length"], function(k){ if (Ext.isString(this[k])) { this[k] = Ext.lib.Dom.getViewHeight() * parseFloat("." + this[k].substr(0, this[k].length - 1)); // "66%" => ".66" } }); // Superclass' initComponent #{js_full_class_name}.superclass.initComponent.call(this); // Set the move and resize events after window is shown, so that they don't fire at initial rendering this.on("show", function(){ this.on("move", this.onMove, this); this.on("resize", this.onSelfResize, this); // Work around firing "resize" event twice (currently a bug in ExtJS) }, this); if (this.itemConfig){ this.instantiateChild(this.itemConfig); } } END_OF_JAVASCRIPT :on_move => <<-END_OF_JAVASCRIPT.l, function(w,x,y){ this.moveToPosition({x:x, y:y}); } END_OF_JAVASCRIPT :on_self_resize => <<-END_OF_JAVASCRIPT.l, function(w, width, height){ this.selfResize({w:width, h:height}); } END_OF_JAVASCRIPT } end # Processing API calls from client api :move_to_position def move_to_position(params) update_persistent_ext_config(:x => params[:x].to_i, :y => params[:y].to_i) {} end api :self_resize def self_resize(params) update_persistent_ext_config(:width => params[:w].to_i, :height => params[:h].to_i) {} end end end