manqod 1.1505.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/manqod +309 -0
- data/doc/HOWTOS +11 -0
- data/doc/INSTALL +6 -0
- data/doc/LICENCE +450 -0
- data/doc/README +33 -0
- data/doc/benchmarkings/ListLoader.rb +177 -0
- data/doc/manqod.png +0 -0
- data/doc/manqod.svg +99 -0
- data/doc/server.conf.example +24 -0
- data/lib/About.rb +93 -0
- data/lib/BarMenu/BarMenuItem.rb +46 -0
- data/lib/BarMenu.rb +76 -0
- data/lib/ButtonMenu/ButtonMenuItem.rb +82 -0
- data/lib/ButtonMenu/EndSeparator.rb +14 -0
- data/lib/ButtonMenu/StartSeparator.rb +14 -0
- data/lib/ButtonMenu.rb +154 -0
- data/lib/Common/Conf.rb +119 -0
- data/lib/Common/Eprint.rb +180 -0
- data/lib/Common/EventCache.rb +41 -0
- data/lib/Common/Fixnum.rb +18 -0
- data/lib/Common/Images.rb +41 -0
- data/lib/Common/ManqodDB.rb +40 -0
- data/lib/Common/MyExec.rb +77 -0
- data/lib/Common/MyImage.rb +47 -0
- data/lib/Common/Nick.rb +25 -0
- data/lib/Common/String.rb +15 -0
- data/lib/FormHolder/Form/InputHolder/Button.rb +133 -0
- data/lib/FormHolder/Form/InputHolder/Calendar.rb +101 -0
- data/lib/FormHolder/Form/InputHolder/CalendarButton.rb +117 -0
- data/lib/FormHolder/Form/InputHolder/ColorButton.rb +54 -0
- data/lib/FormHolder/Form/InputHolder/Combo.rb +82 -0
- data/lib/FormHolder/Form/InputHolder/ComboWithNew.rb +103 -0
- data/lib/FormHolder/Form/InputHolder/Common/Model.rb +337 -0
- data/lib/FormHolder/Form/InputHolder/ConstCombo.rb +18 -0
- data/lib/FormHolder/Form/InputHolder/ConstText.rb +17 -0
- data/lib/FormHolder/Form/InputHolder/Duration.rb +73 -0
- data/lib/FormHolder/Form/InputHolder/EditableList.rb +57 -0
- data/lib/FormHolder/Form/InputHolder/FieldCombo.rb +40 -0
- data/lib/FormHolder/Form/InputHolder/FieldList.rb +40 -0
- data/lib/FormHolder/Form/InputHolder/FileChooser.rb +131 -0
- data/lib/FormHolder/Form/InputHolder/FontButton.rb +37 -0
- data/lib/FormHolder/Form/InputHolder/FormImage.rb +74 -0
- data/lib/FormHolder/Form/InputHolder/HScale.rb +44 -0
- data/lib/FormHolder/Form/InputHolder/Hidden.rb +41 -0
- data/lib/FormHolder/Form/InputHolder/Label.rb +40 -0
- data/lib/FormHolder/Form/InputHolder/List.rb +176 -0
- data/lib/FormHolder/Form/InputHolder/MultiLine.rb +63 -0
- data/lib/FormHolder/Form/InputHolder/Password.rb +41 -0
- data/lib/FormHolder/Form/InputHolder/QBuilder/QObject.rb +269 -0
- data/lib/FormHolder/Form/InputHolder/QBuilder.rb +333 -0
- data/lib/FormHolder/Form/InputHolder/RadioGroup.rb +82 -0
- data/lib/FormHolder/Form/InputHolder/SourceView.rb +100 -0
- data/lib/FormHolder/Form/InputHolder/Spin.rb +49 -0
- data/lib/FormHolder/Form/InputHolder/Text.rb +55 -0
- data/lib/FormHolder/Form/InputHolder/TimeStamp.rb +82 -0
- data/lib/FormHolder/Form/InputHolder/TimeStampButton.rb +93 -0
- data/lib/FormHolder/Form/InputHolder/Toggle.rb +43 -0
- data/lib/FormHolder/Form/InputHolder.rb +458 -0
- data/lib/FormHolder/Form.rb +529 -0
- data/lib/FormHolder.rb +203 -0
- data/lib/Gtk.rb +101 -0
- data/lib/GtkAttributes.rb +76 -0
- data/lib/Kernel.rb +48 -0
- data/lib/ListHolder/EditableList/CellRenderers/Combo.rb +91 -0
- data/lib/ListHolder/EditableList/CellRenderers/ComboText.rb +22 -0
- data/lib/ListHolder/EditableList/CellRenderers/ConstCombo.rb +12 -0
- data/lib/ListHolder/EditableList/CellRenderers/ConstText.rb +23 -0
- data/lib/ListHolder/EditableList/CellRenderers/Pixbuf.rb +18 -0
- data/lib/ListHolder/EditableList/CellRenderers/Progress.rb +36 -0
- data/lib/ListHolder/EditableList/CellRenderers/Text.rb +51 -0
- data/lib/ListHolder/EditableList/CellRenderers/Toggle.rb +35 -0
- data/lib/ListHolder/EditableList/Column.rb +223 -0
- data/lib/ListHolder/EditableList/DrbListModel.rb +809 -0
- data/lib/ListHolder/EditableList/ListPrintOperation/ColumnsHeaderLayout.rb +56 -0
- data/lib/ListHolder/EditableList/ListPrintOperation/CustomPageSetup.rb +100 -0
- data/lib/ListHolder/EditableList/ListPrintOperation/FooterLayout.rb +26 -0
- data/lib/ListHolder/EditableList/ListPrintOperation/HeaderLayout.rb +35 -0
- data/lib/ListHolder/EditableList/ListPrintOperation/IterLayout.rb +89 -0
- data/lib/ListHolder/EditableList/ListPrintOperation.rb +365 -0
- data/lib/ListHolder/EditableList.rb +309 -0
- data/lib/ListHolder/GanttHolder/Gantt/Rectangle.rb +290 -0
- data/lib/ListHolder/GanttHolder/Gantt.rb +317 -0
- data/lib/ListHolder/GanttHolder/GanttFooter.rb +27 -0
- data/lib/ListHolder/GanttHolder/GanttScaler.rb +60 -0
- data/lib/ListHolder/GanttHolder.rb +31 -0
- data/lib/ListHolder/HistoryWindow.rb +63 -0
- data/lib/ListHolder/ListButtonHolder/ArchiveButton.rb +37 -0
- data/lib/ListHolder/ListButtonHolder/ButtonGroup.rb +32 -0
- data/lib/ListHolder/ListButtonHolder/FilterButton.rb +28 -0
- data/lib/ListHolder/ListButtonHolder/ListButton.rb +305 -0
- data/lib/ListHolder/ListButtonHolder/OrderingButton.rb +26 -0
- data/lib/ListHolder/ListButtonHolder/SumPanelButton.rb +23 -0
- data/lib/ListHolder/ListButtonHolder.rb +94 -0
- data/lib/ListHolder/ListPanel/ListFilter/FRenderer/Combo.rb +94 -0
- data/lib/ListHolder/ListPanel/ListFilter/FRenderer/ConstCombo.rb +11 -0
- data/lib/ListHolder/ListPanel/ListFilter/FRenderer/Text.rb +26 -0
- data/lib/ListHolder/ListPanel/ListFilter/FRenderer/Toggle.rb +41 -0
- data/lib/ListHolder/ListPanel/ListFilter/FRenderer.rb +58 -0
- data/lib/ListHolder/ListPanel/ListFilter.rb +42 -0
- data/lib/ListHolder/ListPanel/ListSum/Text.rb +32 -0
- data/lib/ListHolder/ListPanel/ListSum.rb +72 -0
- data/lib/ListHolder/ListPanel.rb +60 -0
- data/lib/ListHolder.rb +241 -0
- data/lib/LoginWindow.rb +77 -0
- data/lib/MainRouter.rb +64 -0
- data/lib/ManqodCommon.rb +295 -0
- data/lib/ManqodHelp/FormatEditor/FormatJustificationWidget.rb +76 -0
- data/lib/ManqodHelp/FormatsEditor.rb +139 -0
- data/lib/ManqodHelp/HelpBrowser/FormatTagTable/FormatTag.rb +84 -0
- data/lib/ManqodHelp/HelpBrowser/FormatTagTable.rb +39 -0
- data/lib/ManqodHelp/HelpBrowser.rb +135 -0
- data/lib/ManqodHelp/HelpIndex.rb +62 -0
- data/lib/ManqodHelp/HelpToolbar.rb +16 -0
- data/lib/ManqodHelp.rb +120 -0
- data/lib/ManqodRPC.rb +37 -0
- data/lib/Memcache.rb +82 -0
- data/lib/MyConfig.rb +93 -0
- data/lib/Print/PrintItem/TextLayout.rb +47 -0
- data/lib/Print/PrintItem.rb +240 -0
- data/lib/Print.rb +199 -0
- data/lib/PrintEditor/ItemInfo/ItemImage.rb +30 -0
- data/lib/PrintEditor/ItemInfo/ItemList.rb +44 -0
- data/lib/PrintEditor/ItemInfo/ItemTextAlignment.rb +27 -0
- data/lib/PrintEditor/ItemInfo.rb +129 -0
- data/lib/PrintEditor/PageLayout.rb +91 -0
- data/lib/PrintEditor/PrintEditorItem.rb +310 -0
- data/lib/PrintEditor.rb +195 -0
- data/lib/RelationBuilder/RTable/RField.rb +91 -0
- data/lib/RelationBuilder/RTable.rb +293 -0
- data/lib/RelationBuilder/Relation/RelationHandle.rb +70 -0
- data/lib/RelationBuilder/Relation.rb +161 -0
- data/lib/RelationBuilder/RunQuery.rb +55 -0
- data/lib/RelationBuilder/SearchWindow.rb +72 -0
- data/lib/RelationBuilder.rb +468 -0
- data/lib/SB/ListProgress.rb +150 -0
- data/lib/SB/Messaging.rb +77 -0
- data/lib/SB.rb +29 -0
- data/lib/mynotebook.rb +131 -0
- data/lib/mytouchwindow.rb +162 -0
- data/lib/mywindow.rb +134 -0
- data/lib/wysiwyg-print-label.rb +57 -0
- metadata +231 -0
@@ -0,0 +1,293 @@
|
|
1
|
+
#this file is part of manqod
|
2
|
+
#manqod is distributed under the CDDL licence
|
3
|
+
#the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)
|
4
|
+
|
5
|
+
class RTable < Gtk::EventBox
|
6
|
+
include ManqodCommon
|
7
|
+
def initialize(parentM,table=nil,table_id = nil,x=0,y=0)
|
8
|
+
@parentM=parentM
|
9
|
+
@table_id=if table_id then table_id.to_i else nil end
|
10
|
+
@x=x
|
11
|
+
@y=y
|
12
|
+
@shown=false
|
13
|
+
super()
|
14
|
+
visible_window=false
|
15
|
+
@dragging=false
|
16
|
+
@widget=Gtk::Frame.new
|
17
|
+
@widget.set_label_widget(Gtk::HBox.new(false,1))
|
18
|
+
@widget.label_widget.pack_start(@label=Gtk::Label.new)
|
19
|
+
@widget.label_widget.pack_start(@frame_button=Gtk::Button.new.set_relief(Gtk::ReliefStyle::NONE))
|
20
|
+
add(@widget)
|
21
|
+
@widget.add(Gtk::VButtonBox.new)
|
22
|
+
@widget.set_label_xalign(0.5)
|
23
|
+
@fields=Hash.new
|
24
|
+
@indexes=Array.new
|
25
|
+
set_table(table)
|
26
|
+
|
27
|
+
signal_connect('button-press-event'){|me,ev|
|
28
|
+
parentM.set_focused_item(self)
|
29
|
+
@parentM.clear
|
30
|
+
case ev.button
|
31
|
+
when 2
|
32
|
+
@xshift=ev.x
|
33
|
+
@yshift=ev.y
|
34
|
+
@dragging=true
|
35
|
+
when 3
|
36
|
+
menu=Gtk::Menu.new
|
37
|
+
menu.append(rent=Gtk::ImageMenuItem.new("rename table").set_image(Gtk::Image.new(Gtk::Stock::EDIT,Gtk::IconSize::MENU)))
|
38
|
+
rent.signal_connect("activate",self){|me,table|
|
39
|
+
dialog=Gtk::MessageDialog.new(get_ancestor(Gtk::Window),Gtk::Dialog::Flags::MODAL,Gtk::MessageDialog::QUESTION,Gtk::MessageDialog::ButtonsType::YES_NO,"rename table?")
|
40
|
+
dialog.vbox.pack_start(new_table=Gtk::Entry.new.set_text(@table))
|
41
|
+
dialog.show_all
|
42
|
+
if dialog.run == Gtk::Dialog::ResponseType::YES
|
43
|
+
rename_me(new_table.text)
|
44
|
+
end
|
45
|
+
dialog.destroy
|
46
|
+
}
|
47
|
+
|
48
|
+
menu.append(rt=Gtk::ImageMenuItem.new("remove table").set_image(Gtk::Image.new(Gtk::Stock::REMOVE,Gtk::IconSize::MENU)))
|
49
|
+
rt.signal_connect("activate",self){|me,table|
|
50
|
+
dialog=Gtk::MessageDialog.new(get_ancestor(Gtk::Window),Gtk::Dialog::Flags::MODAL,Gtk::MessageDialog::QUESTION,Gtk::MessageDialog::ButtonsType::YES_NO,"remove table?")
|
51
|
+
dialog.vbox.pack_start(remove_from_db=Gtk::ToggleButton.new("remove from database",false).set_draw_indicator(false))
|
52
|
+
dialog.show_all
|
53
|
+
if dialog.run == Gtk::Dialog::ResponseType::YES
|
54
|
+
parentM.remove_table(@table,remove_from_db.active?)
|
55
|
+
end
|
56
|
+
dialog.destroy
|
57
|
+
}
|
58
|
+
|
59
|
+
menu.append(tt=Gtk::ImageMenuItem.new("truncate table").set_image(Gtk::Image.new(Gtk::Stock::DELETE,Gtk::IconSize::MENU)))
|
60
|
+
tt.signal_connect("activate",self){|me,table|
|
61
|
+
truncate_table
|
62
|
+
}
|
63
|
+
|
64
|
+
menu.show_all
|
65
|
+
menu.popup(nil,nil,ev.button,ev.time)
|
66
|
+
menu.signal_connect("deactivate",self){|menu,table|
|
67
|
+
table.parentM.set_focused_item(nil)
|
68
|
+
}
|
69
|
+
end
|
70
|
+
true
|
71
|
+
}
|
72
|
+
signal_connect('motion-notify-event',parentM){|me,event,parentM|
|
73
|
+
if @dragging
|
74
|
+
@x=parentM.widget.pointer[0]-@xshift
|
75
|
+
@y=parentM.widget.pointer[1]-@yshift
|
76
|
+
move_me
|
77
|
+
end
|
78
|
+
true
|
79
|
+
}
|
80
|
+
signal_connect('button-release-event'){|me,event|
|
81
|
+
move_me
|
82
|
+
save_me
|
83
|
+
parentM.set_focused_item(nil)
|
84
|
+
true
|
85
|
+
}
|
86
|
+
end
|
87
|
+
attr_reader :table_id, :table ,:parentM, :fields, :widget, :x, :y, :widget, :indexes
|
88
|
+
attr_accessor :dragging
|
89
|
+
|
90
|
+
def set_table(table)
|
91
|
+
@table=table
|
92
|
+
@label.set_label(table)
|
93
|
+
if !table.nil?
|
94
|
+
@is_view=false
|
95
|
+
client_fields("show create table `#{table}`"){|f| @is_view=true if f["name"].include?("View")}
|
96
|
+
if is_view?
|
97
|
+
@frame_button.set_image(Gtk::Image.new(Gtk::Stock::ABOUT,Gtk::IconSize::MENU))
|
98
|
+
@widget.set_shadow_type(Gtk::ShadowType::IN).modify_bg(Gtk::StateType::NORMAL,Gdk::Color.parse('#E0D130'))
|
99
|
+
else
|
100
|
+
@frame_button.set_image(Gtk::Image.new(Gtk::Stock::FILE,Gtk::IconSize::MENU))
|
101
|
+
@widget.set_shadow_type(Gtk::ShadowType::OUT)
|
102
|
+
end
|
103
|
+
reload
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def reload
|
108
|
+
@indexes.clear
|
109
|
+
client_rows("show indexes from #{table}"){|index|
|
110
|
+
@indexes.push({"name"=>index["Key_name"],"unique"=>index["Non_unique"]=="0", "field"=>index["Column_name"]})
|
111
|
+
}
|
112
|
+
i=0
|
113
|
+
client_rows("show fields from #{table}"){|field|
|
114
|
+
if @fields.has_key?(field["Field"])
|
115
|
+
@fields[field["Field"]].set_field(field)
|
116
|
+
else
|
117
|
+
@widget.child.pack_start_defaults(@fields[field["Field"]]=RField.new(self,field))
|
118
|
+
end
|
119
|
+
@widget.child.reorder_child(@fields[field["Field"]],i)
|
120
|
+
i+=1
|
121
|
+
}
|
122
|
+
show_all
|
123
|
+
end
|
124
|
+
|
125
|
+
def move_me(newx=@x,newy=@y)
|
126
|
+
@x=newx
|
127
|
+
@y=newy
|
128
|
+
parent.move(self,@x,@y) if parent
|
129
|
+
end
|
130
|
+
|
131
|
+
def rename_me(new_table)
|
132
|
+
client_query("rename table `#{@table}` to `#{new_table}`")
|
133
|
+
@table=new_table
|
134
|
+
@fields.each{|field,field_wg|
|
135
|
+
parentM.relations.each{|rel|
|
136
|
+
if rel.rfield1 == field_wg or rel.rfield2 == field_wg
|
137
|
+
rel.save
|
138
|
+
end
|
139
|
+
}
|
140
|
+
}
|
141
|
+
|
142
|
+
save_me
|
143
|
+
set_table(new_table)
|
144
|
+
end
|
145
|
+
|
146
|
+
def save_me
|
147
|
+
query("update tables set rbx='#{x}', rby='#{y}', name='#{@table}' where id='#{table_id}'")
|
148
|
+
end
|
149
|
+
|
150
|
+
def show_me
|
151
|
+
@parentM.widget.put(self,x,y) unless @shown
|
152
|
+
@shown=true
|
153
|
+
self
|
154
|
+
end
|
155
|
+
|
156
|
+
def hide_me
|
157
|
+
@parentM.widget.remove(self) if @shown
|
158
|
+
@shown=false
|
159
|
+
self
|
160
|
+
end
|
161
|
+
|
162
|
+
def set_visibility(vis)
|
163
|
+
if vis
|
164
|
+
show_me
|
165
|
+
else
|
166
|
+
hide_me
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def shown?
|
171
|
+
@shown
|
172
|
+
end
|
173
|
+
|
174
|
+
def show_neighbours
|
175
|
+
show_me
|
176
|
+
@parentM.relations.each{|rel|
|
177
|
+
if rel.rfield1.table == self || rel.rfield2.table == self
|
178
|
+
rel.rfield1.table.show_me
|
179
|
+
rel.rfield2.table.show_me
|
180
|
+
rel.show_me
|
181
|
+
end
|
182
|
+
}
|
183
|
+
end
|
184
|
+
|
185
|
+
def remove_field(field)
|
186
|
+
dialog=Gtk::MessageDialog.new(nil,Gtk::Dialog::Flags::MODAL,Gtk::MessageDialog::QUESTION,Gtk::MessageDialog::ButtonsType::YES_NO,"remove field `#{field}`?")
|
187
|
+
dialog.show_all
|
188
|
+
if dialog.run == Gtk::Dialog::ResponseType::YES
|
189
|
+
parentM.relations.each{|rel|
|
190
|
+
if rel.rfield1 == @fields[field] or rel.rfield2 == @fields[field]
|
191
|
+
edebug("removing #{rel}","relation-builder","debug")
|
192
|
+
rel.remove
|
193
|
+
end
|
194
|
+
}
|
195
|
+
|
196
|
+
client.query("alter table `#{table}` drop `#{field}`")
|
197
|
+
@fields[field].destroy
|
198
|
+
@fields.delete(field)
|
199
|
+
parentM.clear
|
200
|
+
# reload
|
201
|
+
end
|
202
|
+
dialog.destroy
|
203
|
+
end
|
204
|
+
|
205
|
+
def truncate_table
|
206
|
+
dialog=Gtk::MessageDialog.new(nil,Gtk::Dialog::Flags::MODAL,Gtk::MessageDialog::QUESTION,Gtk::MessageDialog::ButtonsType::YES_NO,"truncate table?")
|
207
|
+
dialog.show_all
|
208
|
+
if dialog.run == Gtk::Dialog::ResponseType::YES
|
209
|
+
client.query("truncate table `#{table}`")
|
210
|
+
end
|
211
|
+
dialog.destroy
|
212
|
+
end
|
213
|
+
|
214
|
+
def alter_field(alter_field=nil,after_field=nil)
|
215
|
+
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")
|
216
|
+
i=0
|
217
|
+
dialog.vbox.pack_start(Gtk::Table.new(2,2).
|
218
|
+
attach_defaults(Gtk::Label.new("name"),0,1,i,i+1).attach_defaults(field_name=Gtk::Entry.new,1,2,i,i+=1).
|
219
|
+
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).
|
220
|
+
attach_defaults(Gtk::Label.new("size"),0,1,i,i+1).attach_defaults(field_size=Gtk::Entry.new,1,2,i,i+=1).
|
221
|
+
attach_defaults(Gtk::Label.new("default"),0,1,i,i+1).attach_defaults(field_default=Gtk::Entry.new,1,2,i,i+=1).
|
222
|
+
attach_defaults(bb=Gtk::HButtonBox.new,0,2,i,i+=1)
|
223
|
+
)
|
224
|
+
bb.
|
225
|
+
pack_start(field_null=Gtk::ToggleButton.new("NOT NULL",false).set_image(Gtk::Image.new(Gtk::Stock::CLEAR,Gtk::IconSize::MENU))).
|
226
|
+
pack_start(field_index=Gtk::ToggleButton.new("NOT INDEX",false).set_image(Gtk::Image.new(Gtk::Stock::INDEX,Gtk::IconSize::MENU)))
|
227
|
+
field_null.signal_connect("toggled"){|me| me.set_label(me.active? ? "NULL" : "NOT NULL")}
|
228
|
+
field_index.signal_connect("toggled"){|me| me.set_label(me.active? ? "INDEX" : "NOT INDEX")}
|
229
|
+
if alter_field
|
230
|
+
field_name.set_text(alter_field["Field"])
|
231
|
+
field_type.entry.set_text(alter_field["Type"])
|
232
|
+
field_size.set_text(alter_field['Size'] || "")
|
233
|
+
field_default.set_text(alter_field['Default'] || "")
|
234
|
+
field_null.set_active(alter_field["Null"] == "YES")
|
235
|
+
field_index.set_active(alter_field["Key"] == "MUL")
|
236
|
+
end
|
237
|
+
dialog.show_all
|
238
|
+
if dialog.run == Gtk::Dialog::ResponseType::OK
|
239
|
+
if after_field
|
240
|
+
sql="ALTER TABLE `#{@table}` ADD `#{field_name.text}`
|
241
|
+
#{field_type.entry.text}#{field_size.text!="" ? "(#{field_size.text})" : ""}
|
242
|
+
#{field_null.active? ? "NULL" : "NOT NULL"}
|
243
|
+
#{field_default.text!="" ? "DEFAULT '#{field_default.text}' " : ""}
|
244
|
+
AFTER `#{after_field}`";
|
245
|
+
sql2=field_index.active? ? "alter table `#{@table}` add index(`#{field_name.text}`)" : nil
|
246
|
+
else
|
247
|
+
if alter_field["Field"] != field_name.text
|
248
|
+
sql="ALTER TABLE `#{@table}` CHANGE `#{alter_field["Field"]}` `#{field_name.text}`
|
249
|
+
#{field_type.entry.text}#{field_size.text!="" ? "(#{field_size.text})":""}
|
250
|
+
#{field_null.active? ? "NULL" : "NOT NULL"}
|
251
|
+
#{field_default.text!="" ? "DEFAULT '#{field_default.text}' ":""}"
|
252
|
+
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
|
253
|
+
@fields[alter_field["Field"]].destroy
|
254
|
+
@fields.delete(alter_field["Field"])
|
255
|
+
else
|
256
|
+
sql="ALTER TABLE `#{@table}` MODIFY `#{field_name.text}`
|
257
|
+
#{field_type.entry.text}#{field_size.text!="" ? "(#{field_size.text})":""}
|
258
|
+
#{field_null.active? ? "NULL" : "NOT NULL"}
|
259
|
+
#{field_default.text!="" ? "DEFAULT '#{field_default.text}' ":""}"
|
260
|
+
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
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
begin
|
265
|
+
client.query(sql)
|
266
|
+
client.query(sql2) if sql2
|
267
|
+
rescue =>err
|
268
|
+
retry if tell_exception("error altering the table",backtrace_to_debug(err),"server","error",false,true,err)
|
269
|
+
end
|
270
|
+
reload
|
271
|
+
end
|
272
|
+
dialog.destroy
|
273
|
+
end
|
274
|
+
|
275
|
+
def inspect
|
276
|
+
"RTable:#{table}"
|
277
|
+
end
|
278
|
+
def to_s
|
279
|
+
inspect
|
280
|
+
end
|
281
|
+
def center_on_me
|
282
|
+
show_neighbours
|
283
|
+
widget.realize unless widget.realized?
|
284
|
+
sx,sy = widget.translate_coordinates(@parentM.widget,-@parentM.allocation.width/3,-@parentM.allocation.height/3)
|
285
|
+
sx1,sy1 = widget.translate_coordinates(@parentM.widget,widget.allocation.width+@parentM.allocation.height/3,widget.allocation.height+@parentM.allocation.height/3)
|
286
|
+
@parentM.hadjustment.clamp_page(sx,sx1)
|
287
|
+
@parentM.vadjustment.clamp_page(sy,sy1)
|
288
|
+
end
|
289
|
+
def is_view?
|
290
|
+
@is_view
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
@@ -0,0 +1,70 @@
|
|
1
|
+
#this file is part of manqod
|
2
|
+
#manqod is distributed under the CDDL licence
|
3
|
+
#the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)
|
4
|
+
|
5
|
+
class RelationHandle < Gtk::EventBox
|
6
|
+
def initialize(relation,x,y)
|
7
|
+
super()
|
8
|
+
visible_window=false
|
9
|
+
add(@widget=Gtk::ToggleButton.new)
|
10
|
+
set_above_child(true)
|
11
|
+
@widget.set_size_request(10,10)
|
12
|
+
@dragging=false
|
13
|
+
@relation=relation
|
14
|
+
@x=x
|
15
|
+
@y=y
|
16
|
+
@widget.signal_connect("toggled"){|me,ev|
|
17
|
+
@relation.parentM.review_all
|
18
|
+
@relation.parentM.changed(@relation)
|
19
|
+
}
|
20
|
+
signal_connect('button-press-event'){|me,ev|
|
21
|
+
@relation.parentM.set_focused_item(self)
|
22
|
+
case ev.button
|
23
|
+
when 1
|
24
|
+
@widget.set_active(!@widget.active?)
|
25
|
+
when 2
|
26
|
+
@xshift=ev.x
|
27
|
+
@yshift=ev.y
|
28
|
+
@dragging=true
|
29
|
+
when 3
|
30
|
+
menu=Gtk::Menu.new
|
31
|
+
menu.signal_connect("deactivate"){|menu| @relation.parentM.set_focused_item(nil)}
|
32
|
+
menu.append(er=Gtk::ImageMenuItem.new("properties").set_image(Gtk::Image.new(Gtk::Stock::PROPERTIES,Gtk::IconSize::MENU)))
|
33
|
+
er.signal_connect("activate"){|me| @relation.edit}
|
34
|
+
menu.append(rr=Gtk::ImageMenuItem.new("remove").set_image(Gtk::Image.new(Gtk::Stock::DISCONNECT,Gtk::IconSize::MENU)))
|
35
|
+
rr.signal_connect("activate"){|me| @relation.remove}
|
36
|
+
menu.show_all
|
37
|
+
menu.popup(nil,nil,ev.button,ev.time)
|
38
|
+
end
|
39
|
+
true
|
40
|
+
}
|
41
|
+
signal_connect('motion-notify-event'){|me,event|
|
42
|
+
if @dragging
|
43
|
+
@x=@relation.parentM.widget.pointer[0]-@xshift
|
44
|
+
@y=@relation.parentM.widget.pointer[1]-@yshift
|
45
|
+
move_me
|
46
|
+
end
|
47
|
+
true
|
48
|
+
}
|
49
|
+
signal_connect('button-release-event'){|me,event|
|
50
|
+
if @dragging
|
51
|
+
@relation.save
|
52
|
+
@dragging=false
|
53
|
+
end
|
54
|
+
@relation.parentM.set_focused_item(nil)
|
55
|
+
true
|
56
|
+
}
|
57
|
+
end
|
58
|
+
attr_reader :widget, :x, :y
|
59
|
+
attr_accessor :dragging
|
60
|
+
|
61
|
+
def move_me(newx=x,newy=y)
|
62
|
+
@x=newx
|
63
|
+
@y=newy
|
64
|
+
parent.move(self,x,y) if parent
|
65
|
+
end
|
66
|
+
def to_s
|
67
|
+
"Handle of #{@relation}"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
@@ -0,0 +1,161 @@
|
|
1
|
+
#this file is part of manqod
|
2
|
+
#manqod is distributed under the CDDL licence
|
3
|
+
#the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)
|
4
|
+
|
5
|
+
class Relation
|
6
|
+
include ManqodCommon
|
7
|
+
|
8
|
+
def initialize(parentM,rfield1,rfield2,rel_name="",rel_type="o",relation_id=nil,xi=0,yi=0,rel_custom="")
|
9
|
+
super()
|
10
|
+
@rfield1=rfield1
|
11
|
+
@rfield2=rfield2
|
12
|
+
@parentM=parentM
|
13
|
+
@rel_type=rel_type
|
14
|
+
@rel_name=rel_name
|
15
|
+
@rel_custom=rel_custom
|
16
|
+
@relation_id=if relation_id then relation_id.to_i else nil;end
|
17
|
+
@handle=RelationHandle.new(self,xi,yi)
|
18
|
+
# if coo=rfield1.translate_coordinates(parentM.widget,0,0) and coo2=rfield2.translate_coordinates(parentM.widget,0,0)
|
19
|
+
# @handle.move_me(x || 0,y || 0)
|
20
|
+
# end
|
21
|
+
# parentM.widget.show_all
|
22
|
+
@shown=false
|
23
|
+
end
|
24
|
+
attr_reader :rfield1, :rfield2, :parentM, :rel_type, :handle, :relation_id, :rel_name, :rel_custom
|
25
|
+
|
26
|
+
def x
|
27
|
+
@handle.x
|
28
|
+
end
|
29
|
+
def y
|
30
|
+
@handle.y
|
31
|
+
end
|
32
|
+
|
33
|
+
def show_me
|
34
|
+
parentM.widget.put(@handle,@handle.x,@handle.y) unless @shown
|
35
|
+
@handle.show_all
|
36
|
+
@shown=true
|
37
|
+
self
|
38
|
+
end
|
39
|
+
def hide_me
|
40
|
+
parentM.widget.remove(@handle) if @shown
|
41
|
+
@shown=false
|
42
|
+
self
|
43
|
+
end
|
44
|
+
def set_visibility(vis)
|
45
|
+
if vis
|
46
|
+
show_me
|
47
|
+
else
|
48
|
+
hide_me
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def shown?
|
53
|
+
@shown
|
54
|
+
end
|
55
|
+
|
56
|
+
def active?
|
57
|
+
@handle.widget.active?
|
58
|
+
end
|
59
|
+
def set_active(new_a)
|
60
|
+
@handle.widget.set_active(new_a)
|
61
|
+
end
|
62
|
+
|
63
|
+
def set_rel_type(rel_type)
|
64
|
+
@rel_type=rel_type
|
65
|
+
end
|
66
|
+
|
67
|
+
def save
|
68
|
+
if @relation_id.nil?
|
69
|
+
query("insert into relations set rel_type='#{@rel_type}'")
|
70
|
+
@relation_id=qrow("select id from `relations` order by id desc limit 1")["id"]
|
71
|
+
parentM.clear
|
72
|
+
edebug("#{self} inserted","relation-builder","info")
|
73
|
+
end
|
74
|
+
if rfield1.nil? or rfield2.nil?
|
75
|
+
edebug("id:#{@relation_id} has a lost table","relation-builder","warning")
|
76
|
+
else
|
77
|
+
query("update relations set src_table = '#{@rfield1.table.table}', dst_table = '#{@rfield2.table.table}', src_field='#{@rfield1.field["Field"]}', dst_field='#{@rfield2.field["Field"]}', rel_type='#{@rel_type}', rbx='#{@handle.x}', rby='#{@handle.y}', rel_name='#{@rel_name}', rel_custom='#{@rel_custom}' where id='#{@relation_id}'")
|
78
|
+
edebug("updated","relation-builder","info")
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def set_rfield2(new_rfield2=rfield2)
|
83
|
+
@rfield2=new_rfield2
|
84
|
+
end
|
85
|
+
|
86
|
+
def remove
|
87
|
+
query("delete from relations where id='#{@relation_id}'") if !@relation_id.nil?
|
88
|
+
parentM.relations.delete(self)
|
89
|
+
parentM.clear
|
90
|
+
@handle.destroy
|
91
|
+
end
|
92
|
+
|
93
|
+
def edit
|
94
|
+
dialog=Gtk::Dialog.new("relation properties",
|
95
|
+
@handle.get_ancestor(Gtk::Window),
|
96
|
+
Gtk::Dialog::MODAL | Gtk::Dialog::DESTROY_WITH_PARENT,
|
97
|
+
[Gtk::Stock::OK, Gtk::Dialog::RESPONSE_ACCEPT] #,
|
98
|
+
# [Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_REJECT]
|
99
|
+
)
|
100
|
+
dialog.vbox.
|
101
|
+
pack_start_defaults(many2one=Gtk::ToggleButton.new("Many to One")).
|
102
|
+
pack_start_defaults(rel_dir=Gtk::Button.new("change direction")).
|
103
|
+
pack_start_defaults(description=Gtk::Label.new).
|
104
|
+
pack_start_defaults(Gtk::HBox.new.pack_start_defaults(Gtk::Label.new("alias")).pack_start_defaults(rel_name_widget=Gtk::Entry.new.set_text(@rel_name))).
|
105
|
+
pack_start_defaults(Gtk::HBox.new.pack_start_defaults(Gtk::Label.new("and join condition")).pack_start_defaults(rel_custom_widget=Gtk::Entry.new.set_text(@rel_custom))).
|
106
|
+
pack_start_defaults(remove_rel=Gtk::ToggleButton.new("Remove"))
|
107
|
+
|
108
|
+
rel_dir.signal_connect('pressed'){|me|
|
109
|
+
a=@rfield1
|
110
|
+
@rfield1=@rfield2
|
111
|
+
@rfield2=a
|
112
|
+
description.set_label("#{if many2one.active? then "Many" else "One" end} #{@rfield1.table_name} to One #{@rfield2.table_name}") unless @rfield1.nil? or @rfield2.nil?
|
113
|
+
}
|
114
|
+
many2one.signal_connect("toggled"){|me|
|
115
|
+
description.set_label("#{if many2one.active? then "Many" else "One" end} #{@rfield1.table_name} to One #{@rfield2.table_name}") unless @rfield1.nil? or @rfield2.nil?
|
116
|
+
}
|
117
|
+
many2one.set_active(rel_type=="m")
|
118
|
+
|
119
|
+
description.set_label("#{if many2one.active? then "Many" else "One" end} #{@rfield1.table_name} to One #{@rfield2.table_name}") unless @rfield1.nil? or @rfield2.nil?
|
120
|
+
dialog.signal_connect('response'){|dialog,response|
|
121
|
+
# rfield1.set_active(false)
|
122
|
+
# rfield2.set_active(false)
|
123
|
+
if response == Gtk::Dialog::RESPONSE_ACCEPT
|
124
|
+
if remove_rel.active?
|
125
|
+
remove
|
126
|
+
else
|
127
|
+
@rel_name=rel_name_widget.text
|
128
|
+
@rel_custom=rel_custom_widget.text
|
129
|
+
set_rel_type(if many2one.active? then "m"; else "o";end)
|
130
|
+
save
|
131
|
+
show_me
|
132
|
+
end
|
133
|
+
end
|
134
|
+
dialog.destroy
|
135
|
+
}
|
136
|
+
dialog.show_all
|
137
|
+
end
|
138
|
+
|
139
|
+
def other_field(rfield)
|
140
|
+
if rfield == rfield1
|
141
|
+
rfield2
|
142
|
+
else
|
143
|
+
if rfield == rfield2
|
144
|
+
rfield1
|
145
|
+
else
|
146
|
+
nil
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def visible?
|
152
|
+
@handle.visible?
|
153
|
+
end
|
154
|
+
|
155
|
+
def inspect
|
156
|
+
"relation #{@rel_name}(#{relation_id}) #{rfield1.table.table}.#{rfield1.field_name} <-> #{rfield2.table.table}.#{rfield2.field_name}"
|
157
|
+
end
|
158
|
+
def to_s
|
159
|
+
"relation #{rel_type} of #{rfield1} and #{rfield2}"
|
160
|
+
end
|
161
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
#this file is part of manqod
|
2
|
+
#manqod is distributed under the CDDL licence
|
3
|
+
#the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)
|
4
|
+
|
5
|
+
class RunQuery < Gtk::Window
|
6
|
+
include ManqodCommon
|
7
|
+
def initialize(rb)
|
8
|
+
@rb=rb
|
9
|
+
super()
|
10
|
+
whsv=false
|
11
|
+
begin
|
12
|
+
whsv=Gtk::SourceView::BUILD_VERSION
|
13
|
+
rescue => err
|
14
|
+
einfo("no Gtk::SourceView, falling back")
|
15
|
+
end
|
16
|
+
set_size_request(600,300)
|
17
|
+
set_destroy_with_parent(true)
|
18
|
+
set_modal(true)
|
19
|
+
set_window_position(Gtk::Window::POS_CENTER_ON_PARENT)
|
20
|
+
set_decorated(true)
|
21
|
+
#hide on escape
|
22
|
+
signal_connect("key-release-event"){|me,ev| hide if ev.keyval == Gdk::Keyval::GDK_KEY_Escape}
|
23
|
+
@ag=Gtk::AccelGroup.new
|
24
|
+
@ag.connect(Gdk::Keyval::GDK_KEY_q, Gdk::Window::CONTROL_MASK, Gtk::ACCEL_VISIBLE){show_all}
|
25
|
+
|
26
|
+
add(Gtk::VBox.new.
|
27
|
+
pack_start(@widget=whsv ? Gtk::SourceView.new : Gtk::TextView.new,true,true).
|
28
|
+
pack_start(Gtk::HBox.new.pack_start(Gtk::Label.new).
|
29
|
+
pack_start(runb=Gtk::Button.new("Run"),false,false),false,false)
|
30
|
+
)
|
31
|
+
if whsv
|
32
|
+
@widget.buffer.set_language(Gtk::SourceLanguageManager.new.get_language("sql"))
|
33
|
+
@widget.set_auto_indent(true).
|
34
|
+
set_highlight_current_line(true).
|
35
|
+
set_indent_on_tab(true).
|
36
|
+
set_show_line_numbers(true).
|
37
|
+
set_indent_on_tab(true).
|
38
|
+
set_indent_width(4)
|
39
|
+
end
|
40
|
+
@widget.set_editable(true)
|
41
|
+
runb.signal_connect('clicked'){|me|
|
42
|
+
client_query(@widget.buffer.text)
|
43
|
+
}
|
44
|
+
end
|
45
|
+
|
46
|
+
def hide
|
47
|
+
super
|
48
|
+
@rb.set_focused_item(nil)
|
49
|
+
end
|
50
|
+
def update(win)
|
51
|
+
win.add_accel_group(@ag)
|
52
|
+
set_transient_for(win)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
@@ -0,0 +1,72 @@
|
|
1
|
+
#this file is part of manqod
|
2
|
+
#manqod is distributed under the CDDL licence
|
3
|
+
#the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)
|
4
|
+
|
5
|
+
class SearchWindow < Gtk::Window
|
6
|
+
def initialize(rb)
|
7
|
+
@rb=rb
|
8
|
+
super(Gtk::Window::POPUP)
|
9
|
+
add(
|
10
|
+
Gtk::Table.new(3,2).
|
11
|
+
attach(@search_entry=Gtk::Entry.new.set_can_default(true),0,3,0,1).
|
12
|
+
attach(@left_arrow=Gtk::Button.new.set_image(Gtk::Image.new(Gtk::Stock::GO_BACK,Gtk::IconSize::SMALL_TOOLBAR)).set_can_focus(false).set_can_default(false),0,1,1,2,Gtk::EXPAND,Gtk::EXPAND).
|
13
|
+
attach(@combo=Gtk::ComboBox.new(Gtk::TreeModelFilter.new(Gtk::ListStore.new(String,TrueClass))).set_width_request(300).set_can_focus(false).set_can_default(false),1,2,1,2).
|
14
|
+
attach(@right_arrow=Gtk::Button.new.set_image(Gtk::Image.new(Gtk::Stock::GO_FORWARD,Gtk::IconSize::SMALL_TOOLBAR)).set_can_focus(false).set_can_default(false),2,3,1,2)
|
15
|
+
)
|
16
|
+
set_destroy_with_parent(true)
|
17
|
+
set_modal(true)
|
18
|
+
set_window_position(Gtk::Window::POS_CENTER_ON_PARENT)
|
19
|
+
set_decorated(false)
|
20
|
+
@combo.pack_start(renderer=Gtk::CellRendererText.new,true).add_attribute(renderer,:text,0)
|
21
|
+
@combo.model.set_visible_column(1)
|
22
|
+
@combo.signal_connect("changed"){
|
23
|
+
if @combo.active_iter and @rb.tables.has_key?(@combo.active_iter[0])
|
24
|
+
@rb.tables[@combo.active_iter[0]].center_on_me
|
25
|
+
@rb.set_focused_item(@rb.tables[@combo.active_iter[0]])
|
26
|
+
end
|
27
|
+
}
|
28
|
+
#hide on escape
|
29
|
+
@search_entry.signal_connect("key-release-event"){|me,ev| hide if ev.keyval == Gdk::Keyval::GDK_KEY_Escape}
|
30
|
+
@combo.signal_connect("key-release-event"){|me,ev| hide if ev.keyval == Gdk::Keyval::GDK_KEY_Escape}
|
31
|
+
#step left
|
32
|
+
@left_arrow.signal_connect("pressed"){|me|
|
33
|
+
unless i=@combo.active_iter then i=@combo.model.iter_first end
|
34
|
+
ii=@combo.model.iter_first
|
35
|
+
iip=ii.clone
|
36
|
+
until ii == i do iip=ii.clone;ii.next!;end
|
37
|
+
@combo.set_active_iter(iip)
|
38
|
+
}
|
39
|
+
#step right
|
40
|
+
@right_arrow.signal_connect("pressed"){|me|
|
41
|
+
if i=@combo.active_iter then i.next! else i=@combo.model.iter_first end
|
42
|
+
@combo.set_active_iter(i)
|
43
|
+
}
|
44
|
+
@search_entry.signal_connect("key-release-event"){|me,ev|
|
45
|
+
@combo.model.child_model.each{|model,path,iter|
|
46
|
+
iter[1]=!iter[0].upcase.index(me.text.upcase).nil?
|
47
|
+
}
|
48
|
+
}
|
49
|
+
|
50
|
+
@ag=Gtk::AccelGroup.new
|
51
|
+
@ag.connect(Gdk::Keyval::GDK_KEY_f, Gdk::Window::CONTROL_MASK, Gtk::ACCEL_VISIBLE){
|
52
|
+
show_all
|
53
|
+
}
|
54
|
+
end
|
55
|
+
|
56
|
+
def hide
|
57
|
+
super
|
58
|
+
@rb.set_focused_item(nil)
|
59
|
+
end
|
60
|
+
|
61
|
+
def update(win)
|
62
|
+
win.add_accel_group(@ag)
|
63
|
+
set_transient_for(win)
|
64
|
+
@combo.model.child_model.clear
|
65
|
+
@rb.tables.each_key{|tname|
|
66
|
+
iter=@combo.model.child_model.append()# if tname.upcase.index(me.text.upcase)
|
67
|
+
iter[0]=tname
|
68
|
+
}
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|