class MyRendererModel

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

column_order[RW]
filterer[RW]
header_types[RW]
mymodel[RW]
pc[RW]
renderers[RW]
type_def[RW]
typed[RW]

Public Class Methods

new(pc) click to toggle source
Calls superclass method
# File lib/FormHolder/Form/InputHolder/Common/Model.rb, line 45
  def initialize(pc)
        @idx=Hash.new
        @pc=pc
        @typed=""
        td=item["type_def"]
        ta=Hash.new
        @desc=Hash.new
        @filterer=Filterer.new(self)
        @column_order=Array.new
        
        if multiselector?
                ta[:multiselector]=:multiselector
                column_order.push(:multiselector)
        end

        td.split("]").each{|t|
                if first=t.index("[")
                        parts=t[first+1 .. t.length].split(":")
                        hkey=parts[0]
                        hval=parts[1]||""
                        hdesc=parts[2]||""
                        ta[hkey]=hval
                        @desc[hkey]=hdesc
                        column_order.push(hkey)
                        edebug("header keys: |#{hkey}|=>|#{ta[hkey]}|(#{@desc[hkey]})","form-combo")
                end
        }
        
        if ta.empty?
          @type_def={'cdisplay'=>"text"}
          column_order.push('cdisplay')
          else
          @type_def=ta
        end
        
        @header_types=Array.new.push(String) #for id?
        @renderers=Hash.new
#                 set_wrap_width(1)
        i=1
#                 type_def.each_pair{|key,val|
        column_order.each{|key|
          case type_def[key]
                       when :multiselector
                               if pc.class.name == "MyRendererList::List"
                                       renderer=Gtk::CellRendererToggle.new.set_activatable(true)
                                                column=Gtk::TreeViewColumn.new("",renderer, {:active => i})
                                                pc.append_column(column)
                                                renderer.signal_connect("toggled",i,self){|me,path,col,fmodel|
                                                        iter=fmodel.convert_iter_to_child_iter(fmodel.get_iter(path))
                                                        iter[col]=!iter[col]
                                                }

                                                header_types.push(TrueClass)
                                                renderers[key]=renderer
                                                pc.parentM.set_multiselector(self)
                               else
                                       ewarn("multiselector attribute can only be interpreted on a List Form item")
                               end
                          when "text"
                                renderer=Gtk::CellRendererText.new
#                               renderer.set_width(20)
                                case pc.class.name
                                  when "MyRendererCombo","MyRendererConstCombo", "FieldCombo"
                                                pc.pack_start(renderer,true)
                                                pc.add_attribute(renderer,:text,i)
                                  when "MyRendererList::List"
                                                column=Gtk::TreeViewColumn.new(@desc[key]||"",renderer, {:text => i})
                                                pc.append_column(column)
                                  else
                                                edebug("unknown parent widget for this model!","form-combo","error")
                                end
                                header_types.push(String)
                                renderers[key]=renderer
                          when "pixbuf"
                                        renderer=Gtk::CellRendererPixbuf.new
                                case pc.class.name
                                  when "MyRendererCombo"
                                                pc.pack_start(renderer,true)
                                                pc.add_attribute(renderer,:pixbuf,i)
                                  when "MyRendererList"
                                                column=Gtk::TreeViewColumn.new(header,renderer, {:pixbuf => i})
                                                pc.append_column(column)
                                end
                                header_types.push(Gdk::Pixbuf)
                                renderers[key]=renderer

                          when "toggle"
                                renderer=Gtk::CellRendererToggle.new
#                               renderer.set_width(20)
                                case pc.class.name
                                  when "MyRendererCombo","MyRendererConstCombo", "FieldCombo"
                                                pc.pack_start(renderer,true)
                                                pc.add_attribute(renderer,:active,i)
                                  when "MyRendererList::List"
                                                column=Gtk::TreeViewColumn.new(key,renderer, {:active => i})
#                                               column.set_cell_data_func(renderer) { |column, cell, model, iter,col_num| cell.active=iter[i]=='true'}
                                                pc.append_column(column)
                                  else
                                                edebug("unknown parent widget for this model!","form-combo","error")
                                end
                                header_types.push(TrueClass)
                                renderers[key]=renderer
                                when "hidden"
                                header_types.push(String)
                                renderer=nil
                          else 
                                renderer=nil
          end
          i=i+1 if renderer
        }
        @tree_key=pc.gtk_attribute("tree_key")
        @tree=!@tree_key.nil?
        header_types.push(TrueClass)#visible
        @column_of_visible=header_types.size-1
        @mymodel=if @tree then Gtk::TreeStore.new(*header_types) else Gtk::ListStore.new(*header_types) end

        super(mymodel)
        set_visible_column(@column_of_visible)
#  pc.set_has_frame(false)
        pc.set_model(self)
        pc.set_row_separator_func{|model, iter|  
          iter[0]=='separator' or iter[1]=='---'
        }
  end

Public Instance Methods

add_iter(row) click to toggle source
# File lib/FormHolder/Form/InputHolder/Common/Model.rb, line 224
def add_iter(row)
                        iter=if @tree then mymodel.append(if row[@tree_key].to_i == -1 then nil else find_iter_by_id(row[@tree_key])end) else mymodel.append end
                        iter[0]=row['id'] if row.has_key?("id")
                        iter[0]=row['cdata'] if row.has_key?("cdata")
                        @idx[row['id']]=iter.clone if row.has_key?("id")

                        i=0
                        column_order.each{|key|
                        if type_def.has_key?(key) #key!="id" and key!="cdata" and
                                i=i+1
                                case type_def[key]
                                        when "text","hidden"
                                                iter[i]=row[key].to_s
                                                if row.has_key?(key) and !row[key].nil? 
                                                        @max_col_widths[key]=row[key].to_s.length unless @max_col_widths.has_key?(key)
                                                        @max_col_widths[key]=row[key].to_s.length unless @max_col_widths[key] > row[key].to_s.length
                                                end
                                        when "pixbuf"
                                                if row[key].class.name == "String"
                                                        if row[key].length > 3
                                                                a=Array.new
                                                                row[key].each_byte{|v|a.push(v)}
                                                                begin
                                                                        if pixdata=Gdk::Pixdata.deserialize(a) then iter[i]=pixdata.to_pixbuf(true);end
                                                                        rescue Gdk::PixbufError => err
                                                                end
                                                                else
                                                                iter[i]=client_image_of_id(row[key],"gtk-menu")
                                                        end
                                                end
                                        when 'toggle'
                                                iter[i]=row[key] == 'true'
                                end
                        end
                        }
                        iter[@column_of_visible]=true
end
admin() click to toggle source
# File lib/FormHolder/Form/InputHolder/Common/Model.rb, line 327
def admin
        parentM.admin
end
cell_value(col,iter_id=pc.text) click to toggle source
# File lib/FormHolder/Form/InputHolder/Common/Model.rb, line 286
def cell_value(col,iter_id=pc.text)
        fiter=nil
        ret=nil
        each {|model, path, iter| fiter=iter if iter[0].to_s==iter_id.to_s }
        if fiter and c=column_order.index(col)
                ret=fiter[c+1]
        end
        ret
end
default() click to toggle source
# File lib/FormHolder/Form/InputHolder/Common/Model.rb, line 333
def default
        item["default"]
end
find_iter_by_id(iter_id) click to toggle source
# File lib/FormHolder/Form/InputHolder/Common/Model.rb, line 296
def find_iter_by_id(iter_id)
        @idx[iter_id]
end
header_descriptions?() click to toggle source
# File lib/FormHolder/Form/InputHolder/Common/Model.rb, line 311
def header_descriptions?
        c=0
        @desc.each_value{|h| c+=1 if h.length>0}
        c!=0
end
item() click to toggle source
# File lib/FormHolder/Form/InputHolder/Common/Model.rb, line 178
def item
        pc.item
end
multiselector?() click to toggle source
# File lib/FormHolder/Form/InputHolder/Common/Model.rb, line 307
def multiselector?
        pc.class.name == "MyRendererList::List" && pc.pc.pc.multiselector?
end
my() click to toggle source
# File lib/FormHolder/Form/InputHolder/Common/Model.rb, line 330
def my
        parentM.my
end
parentM() click to toggle source
# File lib/FormHolder/Form/InputHolder/Common/Model.rb, line 321
def parentM
        pc.parentM
end
parentselected() click to toggle source
# File lib/FormHolder/Form/InputHolder/Common/Model.rb, line 324
def parentselected
        pc.parentselected
end
refilter() click to toggle source
# File lib/FormHolder/Form/InputHolder/Common/Model.rb, line 262
def refilter
        mymodel.each{|model,path,iter|
       if typed.nil? || typed == "" || iter[0] == 'separator' || iter[0] == '-1' then
               iter[@column_of_visible]=true
       else
                        j=0
                        model.n_columns.downto(1){|i|
                                if iter[i-1].class.name=="String"
                                        j+=1 if iter[i-1].upcase.index(typed.upcase)
                                end
                        }
                        if j>0
                                i=iter.clone
                                while i=i.parent
                                        i[@column_of_visible]=true
                                end
                                iter[@column_of_visible]=true
                                else
                                iter[@column_of_visible]=false
                        end
                end
  }
end
to_s() click to toggle source
# File lib/FormHolder/Form/InputHolder/Common/Model.rb, line 317
def to_s
        "model of #{pc}"
end
toggled_ids() click to toggle source
# File lib/FormHolder/Form/InputHolder/Common/Model.rb, line 300
def toggled_ids
        ti=Array.new
        each {|model, path, iter| ti.push(iter[0]) if iter[1] == true} if multiselector?

        ti
end
update() click to toggle source
# File lib/FormHolder/Form/InputHolder/Common/Model.rb, line 182
def update
        pc.set_model(nil)
        mymodel.clear
        @idx.clear
        #query gtkattribute
        if item["querysql"].length == 0 && sqlid=pc.gtk_attribute("query")
                if sql=parentM.admin.qrow("select `sql` from `queries` where `id` = '#{sqlid}'")["sql"]
                        item["querysql"]=sql
                end
        end
        if item['wantnew']
                iter=if @tree then mymodel.append(nil) else mymodel.append end
                iter[0]='-1';iter[@column_of_visible]=true
                iter=if @tree then mymodel.append(nil) else mymodel.append end
                iter[0]='separator';iter[@column_of_visible]=true
        end
        @max_col_widths=Hash.new
        if item['field']
                client_fields(item['querysql']){|field|
                                row=Hash.new
                                row['name']=field["name"]
                                row['id']=row["name"]
                                row['type']="#{field['type']}(#{field['length']}"+if field.has_key?("decimals") then "/#{field['decimals']}" else "" end + ")"
                                add_iter(row)
                        }
                else
                begin
                        if item['admin']
                                parentM.admin.rows(eeval("\"#{item['querysql']}\"")).each{|row| add_iter(row);}
                                else
                                parentM.rows(eeval("\"#{item['querysql']}\"")).each{|row| add_iter(row);}
                        end
                rescue => err
                        retry if tell_exception("query error",backtrace_to_debug(err),"server","error",false,true,err.to_s)
                end
        end if item['querysql'].length>5
        
        @max_col_widths.each_pair{|key,col_width| renderers[key].set_width_chars(col_width) if renderers.has_key?(key)}

        pc.set_model(self)
end