class MyInputHolder

this file is part of manqod manqod is distributed under the CDDL licence the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)

Attributes

caller[R]
default_is_set[R]
eventbox[R]
frame_button[R]
include_in_query_building[R]
info[R]
item[R]
query_result[R]
renderer[R]
title[R]
type_def[R]
widget[R]

Public Class Methods

new(item,caller) click to toggle source
The InputHolders is a container widget, holds input widets for the Form
  • item is a hash read from mysql

  • caller is the parent widget, usually the Form

# File lib/FormHolder/Form/InputHolder.rb, line 14
        def initialize(item,caller)
                @item=item
                @visibility=true
                @caller=caller
                @default_is_set=false
                if parentM.runmode=="wysiwygf"
                        @frame_button=Gtk::Button.new
                        else
                        @frame_button=nil
                end
                @query_result=Hash.new
                @widget=Gtk::Frame.new
                @expander=Gtk::Expander.new("").set_expanded(true)
                @expander.signal_connect("notify::expanded"){
                        set_visible
                        parentM.form_holder.vshrink(@widget.allocation.height)
                }
                @widget.set_label_widget(Gtk::HBox.new(false,10))
                if frame_button
                        frame_button.set_image(Gtk::Image.new(Gtk::Stock::PREFERENCES,Gtk::IconSize::MENU)).set_relief(Gtk::ReliefStyle::NONE)
                        frame_button.signal_connect('clicked'){|me|
                                menuw=Gtk::Window.new(Gtk::Window::POPUP)
#                               menuw.set_opacity(0.5)#  -- not compatible with galatea

                                menuw.add(menu=Gtk::Table.new(3,3))
                                menu.attach_defaults(go_left=Gtk::Button.new,0,1,1,2)
                                go_left.set_image(Gtk::Image.new(Gtk::Stock::GO_BACK,Gtk::IconSize::SMALL_TOOLBAR)).set_relief(Gtk::ReliefStyle::NONE).signal_connect('clicked',menuw,self){|me,parentw,ih|
                                        ih.item['x']=lzero(ih.item['x'].to_i-1,2)
                                        reattach
                                }
                                menu.attach_defaults(span_left=Gtk::Button.new,0,1,0,1)
                                span_left.set_image(Gtk::Image.new(Gtk::Stock::GOTO_FIRST,Gtk::IconSize::SMALL_TOOLBAR)).set_relief(Gtk::ReliefStyle::NONE).signal_connect('clicked',menuw){|me,parentw|
                                        ih.item['xspan']=lzero(ih.item['xspan'].to_i-1,2)
                                        reattach
                                }
                                
                                menu.attach_defaults(go_right=Gtk::Button.new,2,3,1,2)
                                go_right.set_image(Gtk::Image.new(Gtk::Stock::GO_FORWARD,Gtk::IconSize::SMALL_TOOLBAR)).set_relief(Gtk::ReliefStyle::NONE).signal_connect('clicked',menuw){|me,parentw|
                                        ih.item['x']=lzero(ih.item['x'].to_i+1,2)
                                        reattach
                                }
                                menu.attach_defaults(span_right=Gtk::Button.new,0,1,2,3)
                                span_right.set_image(Gtk::Image.new(Gtk::Stock::GOTO_LAST,Gtk::IconSize::SMALL_TOOLBAR)).set_relief(Gtk::ReliefStyle::NONE).signal_connect('clicked',menuw){|me,parentw|
                                        ih.item['xspan']=lzero(ih.item['xspan'].to_i+1,2)
                                        reattach
                                }
                                
                                menu.attach_defaults(go_up=Gtk::Button.new,1,2,0,1)
                                go_up.set_image(Gtk::Image.new(Gtk::Stock::GO_UP,Gtk::IconSize::SMALL_TOOLBAR)).set_relief(Gtk::ReliefStyle::NONE).signal_connect('clicked',menuw){|me,parentw|
                                        ih.item['y']=lzero(ih.item['y'].to_i-1,2)
                                        reattach
                                }
                                menu.attach_defaults(span_up=Gtk::Button.new,2,3,0,1)
                                span_up.set_image(Gtk::Image.new(Gtk::Stock::GOTO_TOP,Gtk::IconSize::SMALL_TOOLBAR)).set_relief(Gtk::ReliefStyle::NONE).signal_connect('clicked',menuw){|me,parentw|
                                        ih.item['yspan']=lzero(ih.item['yspan'].to_i-1,2)
                                        reattach
                                }

                                menu.attach_defaults(go_down=Gtk::Button.new,1,2,2,3)
                                go_down.set_image(Gtk::Image.new(Gtk::Stock::GO_DOWN,Gtk::IconSize::SMALL_TOOLBAR)).set_relief(Gtk::ReliefStyle::NONE).signal_connect('clicked',menuw){|me,parentw|
                                        ih.item['y']=lzero(ih.item['y'].to_i+1,2)
                                        reattach
                                }
                                menu.attach_defaults(span_down=Gtk::Button.new,2,3,2,3)
                                span_down.set_image(Gtk::Image.new(Gtk::Stock::GOTO_BOTTOM,Gtk::IconSize::SMALL_TOOLBAR)).set_relief(Gtk::ReliefStyle::NONE).signal_connect('clicked',menuw){|me,parentw|
                                        ih.item['yspan']=lzero(ih.item['yspan'].to_i+1,2)
                                        reattach
                                }

                                menu.attach_defaults(go_close=Gtk::Button.new,1,2,1,2)
                                go_close.set_image(Gtk::Image.new(Gtk::Stock::CLOSE,Gtk::IconSize::SMALL_TOOLBAR)).set_relief(Gtk::ReliefStyle::NONE).signal_connect('clicked',menuw){|me,parentw|
                                        parentw.hide
                                }
                                
                                menuw.set_modal(true).set_window_position(Gtk::Window::POS_MOUSE).show_all
=begin
#disabled per current compiz is generating the leave notify event in the wrong order
=end
                                menuw.signal_connect('leave-notify-event'){|me,e|
                                        me.hide if e.window == me.window
                                }
                                menuw.signal_connect("hide"){|me|
                                        query("update gtkformitems set x='#{ih.item['x']}', y='#{ih.item['y']}',xspan='#{ih.item['xspan']}', yspan='#{ih.item['yspan']}' where id='#{ih.item['id']}'")
                                }
                        }
                end
                
                #Button in info mode is editable
                item['editable']=(item['gtktype']=='gtk_button').to_s if caller.runmode == 'info'
                @widget.set_border_width(1)

                @widget.add(@eventbox=Gtk::EventBox.new)
                set_include_in_query_building(gtk_attribute("include-in-query-building"))
                repack_renderer
                
        end

Public Instance Methods

batch?() click to toggle source
# File lib/FormHolder/Form/InputHolder.rb, line 346
def batch?
        (gtk_attribute("batch") || "false").upcase == "TRUE"
end
data() click to toggle source

Returns the mysql field name of this widget

# File lib/FormHolder/Form/InputHolder.rb, line 258
def data
        item['data']
end
default() click to toggle source

Returns the default value of the input widget

# File lib/FormHolder/Form/InputHolder.rb, line 278
def default
        item['default']
end
default_set?() click to toggle source
# File lib/FormHolder/Form/InputHolder.rb, line 273
def default_set?
        @default_is_set == true
end
description() click to toggle source

Returns the description of the input widget

# File lib/FormHolder/Form/InputHolder.rb, line 319
def description
        item['description']
end
editable() click to toggle source

Returns String 'true' if the widget is editable

# File lib/FormHolder/Form/InputHolder.rb, line 327
def editable
        editable?
end
editable?() click to toggle source

Returns boolean true if the widget is editable

# File lib/FormHolder/Form/InputHolder.rb, line 331
def editable?
        item['editable'].to_s.upcase=='TRUE'
end
get_max() click to toggle source

Returns widget's max value

# File lib/FormHolder/Form/InputHolder.rb, line 375
def get_max
        item["max"]
end
get_min() click to toggle source

Returns widget's min value

# File lib/FormHolder/Form/InputHolder.rb, line 370
def get_min
        item["min"]
end
initial() click to toggle source

Returns the input widget's initial value(set by the Form on init)

# File lib/FormHolder/Form/InputHolder.rb, line 315
def initial
        item["initial"]
end
inspect() click to toggle source

Identify this widget

# File lib/FormHolder/Form/InputHolder.rb, line 465
def inspect
        "InputHolder of #{renderer.inspect}"
end
method_missing(sym,*args) click to toggle source

This hack returns the contained widget's if this class is called without method

# File lib/FormHolder/Form/InputHolder.rb, line 453
      def method_missing(sym,*args)
      renderer
end
multiselector?() click to toggle source

Returns true if the widget handles multiediting

# File lib/FormHolder/Form/InputHolder.rb, line 428
def multiselector?
        gtk_attribute("multiselector") == "true"
end
parentM() click to toggle source

Returns the parent module

# File lib/FormHolder/Form/InputHolder.rb, line 424
def parentM
        @caller
end
parentselected() click to toggle source

Returns the parent's selected id, usualy the calling List row's id

# File lib/FormHolder/Form/InputHolder.rb, line 409
def parentselected
        caller.parentselected
end
querySQL() click to toggle source

Returns the widget's query SQL, if there is one

# File lib/FormHolder/Form/InputHolder.rb, line 323
def querySQL
        item['querysql']
end
reattach() click to toggle source

Reattaches the widget, useful on dynamic changing Forms and in the wysiwyg editor

# File lib/FormHolder/Form/InputHolder.rb, line 457
def reattach
      @caller.reattach(self)
end
repack_renderer() click to toggle source
# File lib/FormHolder/Form/InputHolder.rb, line 113
def repack_renderer
        @item['wantnew']=target.to_i != -1
        @title=if ['gtk_toggle','qbuilder'].include?(@item['gtktype']) then nil; else @item['description'];end
        @widget.label_widget.each{|ch| @widget.label_widget.remove(ch)}
        if gtk_attribute("expander")||'false' == 'true'
                @widget.label_widget.pack_start(@expander.set_label(title))
                lw=@expander
                else
                @widget.label_widget.pack_start(Gtk::Label.new(title))
                lw=@widget.label_widget
        end
        #set the font
        if caller.runmode == 'info' then lw.modify_font(Pango::FontDescription.new(get_conf(0,0,"info-frame-font")))
                else lw.modify_font(Pango::FontDescription.new(get_conf(0,0,"form-frame-font")))
        end
        @widget.label_widget.pack_start(@frame_button) if frame_button
        @renderer.destroy if @renderer

        @renderer=case @item['gtktype']
                when 'gtk_hidden' then MyRendererHidden.new(self)
                when 'gtk_label' then MyRendererLabel.new(self)
                when 'gtk_text'
                        if caller.runmode=="info" then MyRendererLabel.new(self)
                                else MyRendererText.new(self)
                        end
                when 'gtk_spinbutton'
                        if caller.runmode=="info" then MyRendererLabel.new(self)
                                else MyRendererSpin.new(self)
                        end
                when 'gtk_duration' then MyRendererDuration.new(self)
                when 'gtk_hscale' then MyRendererHScale.new(self)
                when 'gtk_calendar' then MyRendererCalendar.new(self)
                when 'gtk_calendar_button' then MyRendererCalendarButton.new(self)
                when 'gtk_timestamp' then MyRendererTimeStamp.new(self)
                when 'gtk_timestamp_button' then MyRendererTimeStampButton.new(self)
                when 'gtk_toggle' then MyRendererToggle.new(self)
                when 'gtk_button' then MyRendererButton.new(self)
                when 'gtk_color_button' then MyRendererColorButton.new(self)
                when 'gtk_font_button' then MyRendererFontButton.new(self)
                when 'gtk_const_radio' then MyRendererRadioGroup.new(self)
                when 'gtk_password' then MyRendererPassword.new(self)
                when 'gtk_combo' then MyRendererCombo.new(self)
                when 'gtk_combo_wn' then MyRendererComboWithNew.new(self)
                when 'gtk_const_combo' then MyRendererConstCombo.new(self)
                when 'gtk_consttext' then MyRendererConstText.new(self)
                when 'gtk_field_combo' then FieldCombo.new(self)
                when 'gtk_field_list' then FieldList.new(self)
                when 'gtk_image' then FormImage.new(self)
                when 'gtk_multiline' then MyRendererMultiline.new(self)
                when 'gtk_source' then
                    begin
                        MySourceView.new(self)
                    rescue =>err
                    einfo(err.message + "\n" + err.backtrace.join("\n"))
                        MyRendererMultiline.new(self)
                    end
                when 'gtk_list' then MyRendererList.new(self)
                when 'gtk_editable_list' then  MyRendererEditableList.new(self)
                when 'fileload'
                        @item['action']='load'
                        MyFileChooserButton.new(self)
                when 'filesave'
                        @item['action']='save'
                        MyFileChooserButton.new(self)
                when 'qbuilder'
                        QBuilder.new(self)
                else
                        edebug("#{self} unknown renderer type: #{@item['gtktype']}","form","warning")
                        nil
        end

        if @renderer then
                unless @renderer.class == MyRendererHidden
                        if caller.runmode=="info"
                                @renderer.modify_font(Pango::FontDescription.new(get_conf(0,0,"info-item-font")))
                                else
                                @renderer.modify_font(Pango::FontDescription.new(get_conf(0,0,"form-item-font")))
                        end
                        @renderer.set_height_request(@item['hrequest'].to_i) if @item['hrequest'].to_i>0
                        @renderer.set_width_request(@item['wrequest'].to_i) if @item['wrequest'].to_i>0
                        eventbox.add(@renderer)
                end
        end
        set_visible(@renderer.class != MyRendererHidden)
        #type_def parsing
        td=@item["type_def"]
        @type_def=Hash.new
        if @item["type_def"].length>3
                td.split("]").each{|t|
                        if first=t.index("[")
                                parts=t[first+1 .. t.length].split(":")
                                hkey=parts[0]
                                hval=parts[1]||""
                                hdesc=parts[2]||""
                                @type_def[hkey]=[hval,hdesc]
                        end
                }
                set_default(-1) if parentM.runmode=="add"
                edebug("header keys: #{@type_def.inspect}","form-combo") 
        end
        if rel=gtk_attribute('relation')
                @relation=parentM.admin_qrow("select relations.* from relations where relations.id='#{rel}'").rehash
                if parentM.table == @relation["dst_table"]
                        @relation["src_table"],@relation["src_field"]=@relation["dst_table"],@relation["dst_field"];
                end
                #overwrite querysql if relation attribute defined
                item['querysql']=case @item["gtktype"]
                        when "gtk_combo","gtk_combo_wn","gtk_list" then "select * from `#{@relation["dst_table"]}`#{@relation["rel_custom"].length>2 ? " where #{@relation["rel_custom"]}" : ""}"
                        else "select * from `#{@relation["dst_table"]}` where `#{@relation["dst_field"]}`='\#{default}'"
                end
                #add order by tree_key
                item["querysql"]="#{item['querysql']} order by #{gtk_attribute("tree_key")}" unless gtk_attribute("tree_key").nil?
                s=""
                @type_def.each_key{|key| s="#{s}, #{key}"}
                item['querysql']="#{item['querysql']} #{(gtk_attribute("tree_key").nil? ? "order by":",")} #{s[2..s.length]}" if s.length>0
                edebug("generated query:#{querySQL}","sql")
        end
        item['querysql']=add_where(item['querysql'],"#{guess_base(item['querysql'])}.id = '" + "#" +"{default}'") if caller.runmode == 'info' && item['querysql'].length>0
        self
end
required() click to toggle source

Returns String 'true' if the widget is required to have data entered by the user on Form submit If the widget has no data and the Form is submitted by the user, a warning popup window will be presented to the user

# File lib/FormHolder/Form/InputHolder.rb, line 380
def required
        item['required'].to_s=='true'
end
run_query() click to toggle source

Runs the item's query sql and sets the item's default to the returned value

# File lib/FormHolder/Form/InputHolder.rb, line 440
def run_query
        @query_result=Hash.new
        return false if item['querysql'].length<5
        sql=eeval("\"#{item['querysql']}\"")
        edebug("runnning query: #{sql}","sql")
        ret=if item['admin'].to_s == 'true' then parentM.admin_qrow(sql) else parentM.qrow(sql) end
        @query_result=ret.rehash if ret
        if @query_result.has_key?(short_data)
                edebug("new value: #{ret[short_data]}","form")
                item['default']=@query_result[short_data]
        end
end
set_data(da) click to toggle source

Sets the mysql field of this widget, the Form uses this

# File lib/FormHolder/Form/InputHolder.rb, line 283
def set_data(da)
        item['data']=da
        self
end
set_default(new_value) click to toggle source

Sets the default value, the Form uses this before update

# File lib/FormHolder/Form/InputHolder.rb, line 263
def set_default(new_value)
        item['default']=new_value
        @default_is_set=true
        self
end
set_editable(ed=item['editable']) click to toggle source
# File lib/FormHolder/Form/InputHolder.rb, line 335
def set_editable(ed=item['editable'])
        item['editable']=parentM.batch? ? ed.to_s.upcase=='TRUE' && batch? : ed.to_s
        renderer.set_sensitive(self.editable?)
        self
end
set_expanded(exp) click to toggle source

Sets if the widget is expanded

# File lib/FormHolder/Form/InputHolder.rb, line 461
def set_expanded(exp)
      @expander.set_expanded(exp)
end
set_include_in_query_building(iqb=nil) click to toggle source

Returns true if the widget will be included in the Form's query buiding; will it be saved?

# File lib/FormHolder/Form/InputHolder.rb, line 350
def set_include_in_query_building(iqb=nil)
        if(iqb.nil?) then
                @include_in_query_building=nil
                else
                @include_in_query_building=(iqb.to_s.upcase=='TRUE')
        end
        self
end
set_max(l_max) click to toggle source

Sets the widget's max value, used only if widget is SpinButton

# File lib/FormHolder/Form/InputHolder.rb, line 365
def set_max(l_max)
        item["max"]=l_max.to_s
        self
end
set_min(l_min) click to toggle source

Sets the widget's min value, used only if widget is SpinButton

# File lib/FormHolder/Form/InputHolder.rb, line 359
def set_min(l_min)
        item["min"]=l_min.to_s
        self
end
set_required(req) click to toggle source

Sets the required's value

# File lib/FormHolder/Form/InputHolder.rb, line 384
def set_required(req)
        item['required']=req.to_s
        self
end
set_sensitive(sensi) click to toggle source
# File lib/FormHolder/Form/InputHolder.rb, line 341
def set_sensitive(sensi)
        renderer.set_sensitive(sensi)
        self
end
set_shadow() click to toggle source

Sets the widget's gtk shadow

# File lib/FormHolder/Form/InputHolder.rb, line 234
def set_shadow
        shadow=case caller.runmode
                when "info" then Gtk::SHADOW_ETCHED_IN
                else Gtk::SHADOW_OUT
        end
        shadow=Gtk::SHADOW_NONE if ['gtk_button'].include?(item['gtktype'])
        attr_shadow=case gtk_attribute('border-shadow')
                when 'none' then Gtk::ShadowType::NONE
                when 'in' then Gtk::ShadowType::IN
                when 'out' then Gtk::ShadowType::OUT
                when 'etched-in' then Gtk::ShadowType::ETCHED_IN
                when 'etched-out' then Gtk::ShadowType::ETCHED_OUT
        end
        shadow=attr_shadow unless attr_shadow.nil?
        shadow=Gtk::ShadowType::NONE unless @expander.expanded?
        @widget.set_shadow_type(shadow) unless shadow.nil?
end
set_target(new_target) click to toggle source

Sets the widget's target module item

# File lib/FormHolder/Form/InputHolder.rb, line 405
def set_target(new_target)
        item['to_call']=new_target
end
set_visibility(vis) click to toggle source

hides/unhides the widget

# File lib/FormHolder/Form/InputHolder.rb, line 289
def set_visibility(vis)
        @visibility=vis
        @widget.set_no_show_all(!@visibility)
        self
end
set_visible(visibility=@visibility) click to toggle source
Calls superclass method
# File lib/FormHolder/Form/InputHolder.rb, line 294
def set_visible(visibility=@visibility)
        set_visibility(visibility)
        super(@visibilty)
        if @visibility
                @widget.show_all
        else
                @widget.hide
        end

        if @expander
                @renderer.set_visible(@expander.expanded? && visibility)
                @renderer.set_no_show_all(!(@expander.expanded? && visibility))
        end
        set_shadow
        self
end
short_data() click to toggle source

Returns the item's mysql field value

# File lib/FormHolder/Form/InputHolder.rb, line 432
def short_data
        if i=item['data'].rindex(".")
                item['data'][i+1 .. item['data'].length]
                else
                item['data']
        end
end
target() click to toggle source

Returns the widget's target module item

# File lib/FormHolder/Form/InputHolder.rb, line 389
def target
        item['to_call']
end
target_module() click to toggle source

Returns the widget's target module

# File lib/FormHolder/Form/InputHolder.rb, line 401
def target_module
        item['modname']
end
target_runmode() click to toggle source

Returns the widget's target runmode

# File lib/FormHolder/Form/InputHolder.rb, line 393
def target_runmode
        case parentM.runmode 
                when "info" then "info"
                when "wysiwygf" then "wysiwygf"
                else (text.to_i == -1 || text.to_i == 0 ? "add" : "modify" )
        end
end
text() click to toggle source

Returns the current value of the input widget

# File lib/FormHolder/Form/InputHolder.rb, line 253
def text
        renderer.text if renderer
end
to_s() click to toggle source
# File lib/FormHolder/Form/InputHolder.rb, line 468
def to_s
        inspect
end
type() click to toggle source

Returns the input widget type

# File lib/FormHolder/Form/InputHolder.rb, line 311
def type
        item['gtktype']
end
unset_default() click to toggle source
# File lib/FormHolder/Form/InputHolder.rb, line 269
def unset_default
        @default_is_set=false
end
update(notifier=nil,new_value=item['default']) click to toggle source

Updates the widget

# File lib/FormHolder/Form/InputHolder.rb, line 413
def update(notifier=nil,new_value=item['default'])
        item['default']=new_value
        edebug("Update notification from #{notifier} for #{data} = [#{new_value}]","form","info")
        before=Time.now
        set_editable
        renderer.update(new_value) if renderer
        after=Time.now
        diff=after-before
        edebug("#{@item['gtktype']}:#{@item['data']} updated in #{diff.to_s}","time","info")
end