class RTable

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

dragging[RW]
fields[R]
indexes[R]
parentM[R]
table[R]
table_id[R]
widget[R]
x[R]
y[R]

Public Class Methods

new(parentM,td) click to toggle source
Calls superclass method
# File lib/RelationBuilder/RTable.rb, line 7
def initialize(parentM,td)
        @parentM=parentM
        @shown=false
        super()
        visible_window=false
        @dragging=false
        @widget=Gtk::Frame.new
        @widget.set_label_widget(Gtk::HBox.new(false,1))
        @widget.label_widget.pack_start(@label=Gtk::Label.new)
        @widget.label_widget.pack_start(@frame_button=Gtk::Button.new.set_relief(Gtk::ReliefStyle::NONE))
        add(@widget)
        @widget.add(Gtk::VButtonBox.new)
        @widget.set_label_xalign(0.5)
        @fields=Hash.new
        update(td)
        
        signal_connect('button-press-event'){|me,ev|
                parentM.set_focused_item(self)
                @parentM.clear
                case ev.button
                        when 2
                                @xshift=ev.x
                                @yshift=ev.y
                                @dragging=true
                        when 3
                                menu=Gtk::Menu.new
                                menu.append(rent=Gtk::ImageMenuItem.new("rename table").set_image(Gtk::Image.new(Gtk::Stock::EDIT,Gtk::IconSize::MENU)))
                                rent.signal_connect("activate",self){|me,table|
                                        dialog=Gtk::MessageDialog.new(get_ancestor(Gtk::Window),Gtk::Dialog::Flags::MODAL,Gtk::MessageDialog::QUESTION,Gtk::MessageDialog::ButtonsType::YES_NO,"rename table?")
                                        dialog.vbox.pack_start(new_table=Gtk::Entry.new.set_text(@table))
                                        dialog.show_all
                                        if dialog.run == Gtk::Dialog::ResponseType::YES
                                                rename_me(new_table.text)
                                        end
                                        dialog.destroy
                                }

                                menu.append(rt=Gtk::ImageMenuItem.new("remove table").set_image(Gtk::Image.new(Gtk::Stock::REMOVE,Gtk::IconSize::MENU)))
                                rt.signal_connect("activate",self){|me,table|
                                        dialog=Gtk::MessageDialog.new(get_ancestor(Gtk::Window),Gtk::Dialog::Flags::MODAL,Gtk::MessageDialog::QUESTION,Gtk::MessageDialog::ButtonsType::YES_NO,"remove table?")
                                        dialog.vbox.pack_start(remove_from_db=Gtk::ToggleButton.new("remove from database",false).set_draw_indicator(false))
                                        dialog.show_all
                                        if dialog.run == Gtk::Dialog::ResponseType::YES
                                                parentM.remove_table(@table,remove_from_db.active?)
                                        end
                                        dialog.destroy
                                }

                                menu.append(tt=Gtk::ImageMenuItem.new("truncate table").set_image(Gtk::Image.new(Gtk::Stock::DELETE,Gtk::IconSize::MENU)))
                                tt.signal_connect("activate",self){|me,table|
                                                truncate_table
                                }

                        menu.show_all
                        menu.popup(nil,nil,ev.button,ev.time)
                        menu.signal_connect("deactivate",self){|menu,table|
                                table.parentM.set_focused_item(nil)
                        }
                end
                true
        }
        signal_connect('motion-notify-event',parentM){|me,event,parentM|
                if @dragging
                        @x=parentM.widget.pointer[0]-@xshift 
                        @y=parentM.widget.pointer[1]-@yshift 
                        move_me
                end
                true
        }
        signal_connect('button-release-event'){|me,event|
                move_me
                save_me
                parentM.set_focused_item(nil)
                true
        }
end

Public Instance Methods

alter_field(alter_field=nil,after_field=nil) click to toggle source
# File lib/RelationBuilder/RTable.rb, line 222
def alter_field(alter_field=nil,after_field=nil)
        dialog=Gtk::MessageDialog.new(get_ancestor(Gtk::Window),Gtk::Dialog::Flags::MODAL,Gtk::MessageDialog::QUESTION,Gtk::MessageDialog::ButtonsType::OK_CANCEL,if after_field then "add after `#{after_field}`" else "alter `#{alter_field["Field"]}`" end).set_title("Field preferences")
        i=0
        dialog.vbox.pack_start(Gtk::Table.new(2,2).
                attach_defaults(Gtk::Label.new("name"),0,1,i,i+1).attach_defaults(field_name=Gtk::Entry.new,1,2,i,i+=1).
                attach_defaults(Gtk::Label.new("type"),0,1,i,i+1).attach_defaults(field_type=Gtk::Combo.new(["TEXT","TINYINT","INT","BIGINT","REAL","DOUBLE","FLOAT","NUMERIC","DATE","TIME","TIMESTAMP","DATETIME","YEAR","CHAR","VARCHAR","BINARY","VARBiNARY","BLOB","TINYBLOB","MEDIUMBLOB","LONGBLOB","TINYTEXT"]).set_allow_empty(false),1,2,i,i+=1).
                attach_defaults(Gtk::Label.new("size"),0,1,i,i+1).attach_defaults(field_size=Gtk::Entry.new,1,2,i,i+=1).
                attach_defaults(Gtk::Label.new("default"),0,1,i,i+1).attach_defaults(field_default=Gtk::Entry.new,1,2,i,i+=1).
                attach_defaults(bb=Gtk::HButtonBox.new,0,2,i,i+=1)
        )
        bb.
                pack_start(field_null=Gtk::ToggleButton.new("NOT NULL",false).set_image(Gtk::Image.new(Gtk::Stock::CLEAR,Gtk::IconSize::MENU))).
                pack_start(field_index=Gtk::ToggleButton.new("NOT INDEX",false).set_image(Gtk::Image.new(Gtk::Stock::INDEX,Gtk::IconSize::MENU)))
        field_null.signal_connect("toggled"){|me| me.set_label(me.active? ? "NULL" : "NOT NULL")}
        field_index.signal_connect("toggled"){|me| me.set_label(me.active? ? "INDEX" : "NOT INDEX")}
        if alter_field
                field_name.set_text(alter_field["Field"]) 
                field_type.entry.set_text(alter_field["Type"])
                field_size.set_text(alter_field['Size'] || "")
                field_default.set_text(alter_field['Default'] || "")
                field_null.set_active(alter_field["Null"] == "YES")
                field_index.set_active(alter_field["Key"] == "MUL")
        end
        dialog.show_all
        if dialog.run == Gtk::Dialog::ResponseType::OK
                if after_field
                        sql="ALTER TABLE `#{@table}` ADD `#{field_name.text}` 
                        #{field_type.entry.text}#{field_size.text!="" ? "(#{field_size.text})" : ""}
                        #{field_null.active? ? "NULL" : "NOT NULL"} 
                        #{field_default.text!="" ? "DEFAULT '#{field_default.text}' " : ""} 
                        AFTER `#{after_field}`";
                        sql2=field_index.active? ? "alter table `#{@table}` add index(`#{field_name.text}`)" : nil
                        else
                        if alter_field["Field"] != field_name.text
                                sql="ALTER TABLE `#{@table}` CHANGE `#{alter_field["Field"]}` `#{field_name.text}` 
                                #{field_type.entry.text}#{field_size.text!="" ? "(#{field_size.text})":""}
                                #{field_null.active? ? "NULL" : "NOT NULL"} 
                                #{field_default.text!="" ? "DEFAULT '#{field_default.text}' ":""}"
                        sql2=field_index.active? != (alter_field["Key"] == "MUL") ? field_index.active? ? "alter table `#{@table}` add index(`#{field_name.text}`)" : "alter table `#{@table}` drop index `#{field_name.text}`" : nil
                                @fields[alter_field["Field"]].destroy
                                @fields.delete(alter_field["Field"])
                        else
                                sql="ALTER TABLE `#{@table}` MODIFY `#{field_name.text}` 
                                #{field_type.entry.text}#{field_size.text!="" ? "(#{field_size.text})":""}
                                #{field_null.active? ? "NULL" : "NOT NULL"} 
                                #{field_default.text!="" ? "DEFAULT '#{field_default.text}' ":""}"
                        sql2=field_index.active? != (alter_field["Key"] == "MUL") ? field_index.active? ? "alter table `#{@table}` add index(`#{field_name.text}`)" : "alter table `#{@table}` drop index `#{field_name.text}`" : nil
                        end
                end
                
                begin
                        client.query(sql)
                        client.query(sql2) if sql2
                rescue =>err
                        retry if tell_exception("error altering the table",backtrace_to_debug(err),"server","error",false,true,err)
                end
                parentM.reload_server_rb(true,@table)
        end
        dialog.destroy
end
center_on_me() click to toggle source
# File lib/RelationBuilder/RTable.rb, line 289
def center_on_me
        show_neighbours
        widget.realize unless widget.realized?
        sx,sy = widget.translate_coordinates(@parentM.widget,-@parentM.allocation.width/3,-@parentM.allocation.height/3)
        sx1,sy1 = widget.translate_coordinates(@parentM.widget,widget.allocation.width+@parentM.allocation.height/3,widget.allocation.height+@parentM.allocation.height/3)
        @parentM.hadjustment.clamp_page(sx,sx1)
        @parentM.vadjustment.clamp_page(sy,sy1)
end
hide_me() click to toggle source
# File lib/RelationBuilder/RTable.rb, line 164
def hide_me
        @parentM.widget.remove(self) if @shown
        @shown=false
        self
end
inspect() click to toggle source
# File lib/RelationBuilder/RTable.rb, line 283
def inspect
        "RTable:#{table}"
end
is_view?() click to toggle source
# File lib/RelationBuilder/RTable.rb, line 297
def is_view?
        @is_view
end
move_me(newx=@x,newy=@y) click to toggle source
# File lib/RelationBuilder/RTable.rb, line 131
def move_me(newx=@x,newy=@y)
        @x=newx
        @y=newy
        parent.move(self,@x,@y) if parent
end
reload() click to toggle source
# File lib/RelationBuilder/RTable.rb, line 111
        def reload
=begin
                @indexes.clear
                client_rows("show indexes from #{table}"){|index|
                        @indexes.push({"name"=>index["Key_name"],"unique"=>index["Non_unique"]=="0", "field"=>index["Column_name"]})
                }
=end
                i=0
                @fields_data.each_pair{|field_name,field|
                        if @fields.has_key?(field["Field"])
                                @fields[field["Field"]].set_field(field)
                                else
                                @widget.child.pack_start_defaults(@fields[field["Field"]]=RField.new(self,field)) 
                        end
                        @widget.child.reorder_child(@fields[field["Field"]],i)
                        i+=1
                }
                show_all
        end
remove_field(field) click to toggle source
# File lib/RelationBuilder/RTable.rb, line 193
def remove_field(field)
        dialog=Gtk::MessageDialog.new(nil,Gtk::Dialog::Flags::MODAL,Gtk::MessageDialog::QUESTION,Gtk::MessageDialog::ButtonsType::YES_NO,"remove field `#{field}`?")
        dialog.show_all
        if dialog.run == Gtk::Dialog::ResponseType::YES
                parentM.relations.each_value{|rel|
                        if rel.rfield1 == @fields[field] or rel.rfield2 == @fields[field]
                                edebug("removing #{rel}","relation-builder","debug")
                                rel.remove
                        end
                }

                client.query("alter table `#{table}` drop `#{field}`")
                @fields[field].destroy
                @fields.delete(field)
                parentM.clear
                parentM.reload_server_rb(true,@table)
        end
        dialog.destroy
end
rename_me(new_table) click to toggle source
# File lib/RelationBuilder/RTable.rb, line 137
def rename_me(new_table)
        client_query("rename table `#{@table}` to `#{new_table}`")
        @table=new_table
        @fields.each{|field,field_wg|
                parentM.relations.each_value{|rel|
                        if rel.rfield1 == field_wg or rel.rfield2 == field_wg
                                rel.save
                        end
                }
        }

        save_me
        set_table(@table)
        parentM.reload_server_rb(true,@table)
end
save_me() click to toggle source
# File lib/RelationBuilder/RTable.rb, line 153
def save_me
        query("update tables set rbx='#{x}', rby='#{y}', name='#{@table}' where id='#{table_id}'")
        @parentM.reload_server_rb(false,@table)
end
set_table(table) click to toggle source
# File lib/RelationBuilder/RTable.rb, line 86
def set_table(table)
        @table=table
        @label.set_label(table)
        unless table.nil?
                if is_view?
                        @frame_button.set_image(Gtk::Image.new(Gtk::Stock::ABOUT,Gtk::IconSize::MENU))
                        @widget.set_shadow_type(Gtk::ShadowType::IN).modify_bg(Gtk::StateType::NORMAL,Gdk::Color.parse('#E0D130'))
                        else
                        @frame_button.set_image(Gtk::Image.new(Gtk::Stock::FILE,Gtk::IconSize::MENU))
                        @widget.set_shadow_type(Gtk::ShadowType::OUT)
                end
                reload
        end
end
set_visibility(vis) click to toggle source
# File lib/RelationBuilder/RTable.rb, line 170
def set_visibility(vis)
        if vis
                show_me
                else
                hide_me
        end
end
show_me() click to toggle source
# File lib/RelationBuilder/RTable.rb, line 158
def show_me
        @parentM.widget.put(self,x,y) unless @shown
        @shown=true
        self
end
show_neighbours() click to toggle source
# File lib/RelationBuilder/RTable.rb, line 182
def show_neighbours
        show_me
        @parentM.relations.each_value{|rel|
                if rel.rfield1.table == self || rel.rfield2.table == self
                        rel.rfield1.table.show_me
                        rel.rfield2.table.show_me
                        rel.show_me
                end
        }
end
shown?() click to toggle source
# File lib/RelationBuilder/RTable.rb, line 178
def shown?
        @shown
end
to_s() click to toggle source
# File lib/RelationBuilder/RTable.rb, line 286
def to_s
        inspect
end
truncate_table() click to toggle source
# File lib/RelationBuilder/RTable.rb, line 213
def truncate_table
        dialog=Gtk::MessageDialog.new(nil,Gtk::Dialog::Flags::MODAL,Gtk::MessageDialog::QUESTION,Gtk::MessageDialog::ButtonsType::YES_NO,"truncate table?")
        dialog.show_all
        if dialog.run == Gtk::Dialog::ResponseType::YES
                client.query("truncate table `#{table}`")
        end
        dialog.destroy
end
update(td) click to toggle source
# File lib/RelationBuilder/RTable.rb, line 101
def update(td)
        @table_id=(td["id"] ? td["id"].to_i : nil)
        @x=td["rbx"]
        @y=td["rby"]
        @fields_data=td["fields"]
        @indexes=td["indexes"]
        @is_view=td["view"]
        set_table(td["name"])
end