manqod 1.1505.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. data/bin/manqod +309 -0
  2. data/doc/HOWTOS +11 -0
  3. data/doc/INSTALL +6 -0
  4. data/doc/LICENCE +450 -0
  5. data/doc/README +33 -0
  6. data/doc/benchmarkings/ListLoader.rb +177 -0
  7. data/doc/manqod.png +0 -0
  8. data/doc/manqod.svg +99 -0
  9. data/doc/server.conf.example +24 -0
  10. data/lib/About.rb +93 -0
  11. data/lib/BarMenu/BarMenuItem.rb +46 -0
  12. data/lib/BarMenu.rb +76 -0
  13. data/lib/ButtonMenu/ButtonMenuItem.rb +82 -0
  14. data/lib/ButtonMenu/EndSeparator.rb +14 -0
  15. data/lib/ButtonMenu/StartSeparator.rb +14 -0
  16. data/lib/ButtonMenu.rb +154 -0
  17. data/lib/Common/Conf.rb +119 -0
  18. data/lib/Common/Eprint.rb +180 -0
  19. data/lib/Common/EventCache.rb +41 -0
  20. data/lib/Common/Fixnum.rb +18 -0
  21. data/lib/Common/Images.rb +41 -0
  22. data/lib/Common/ManqodDB.rb +40 -0
  23. data/lib/Common/MyExec.rb +77 -0
  24. data/lib/Common/MyImage.rb +47 -0
  25. data/lib/Common/Nick.rb +25 -0
  26. data/lib/Common/String.rb +15 -0
  27. data/lib/FormHolder/Form/InputHolder/Button.rb +133 -0
  28. data/lib/FormHolder/Form/InputHolder/Calendar.rb +101 -0
  29. data/lib/FormHolder/Form/InputHolder/CalendarButton.rb +117 -0
  30. data/lib/FormHolder/Form/InputHolder/ColorButton.rb +54 -0
  31. data/lib/FormHolder/Form/InputHolder/Combo.rb +82 -0
  32. data/lib/FormHolder/Form/InputHolder/ComboWithNew.rb +103 -0
  33. data/lib/FormHolder/Form/InputHolder/Common/Model.rb +337 -0
  34. data/lib/FormHolder/Form/InputHolder/ConstCombo.rb +18 -0
  35. data/lib/FormHolder/Form/InputHolder/ConstText.rb +17 -0
  36. data/lib/FormHolder/Form/InputHolder/Duration.rb +73 -0
  37. data/lib/FormHolder/Form/InputHolder/EditableList.rb +57 -0
  38. data/lib/FormHolder/Form/InputHolder/FieldCombo.rb +40 -0
  39. data/lib/FormHolder/Form/InputHolder/FieldList.rb +40 -0
  40. data/lib/FormHolder/Form/InputHolder/FileChooser.rb +131 -0
  41. data/lib/FormHolder/Form/InputHolder/FontButton.rb +37 -0
  42. data/lib/FormHolder/Form/InputHolder/FormImage.rb +74 -0
  43. data/lib/FormHolder/Form/InputHolder/HScale.rb +44 -0
  44. data/lib/FormHolder/Form/InputHolder/Hidden.rb +41 -0
  45. data/lib/FormHolder/Form/InputHolder/Label.rb +40 -0
  46. data/lib/FormHolder/Form/InputHolder/List.rb +176 -0
  47. data/lib/FormHolder/Form/InputHolder/MultiLine.rb +63 -0
  48. data/lib/FormHolder/Form/InputHolder/Password.rb +41 -0
  49. data/lib/FormHolder/Form/InputHolder/QBuilder/QObject.rb +269 -0
  50. data/lib/FormHolder/Form/InputHolder/QBuilder.rb +333 -0
  51. data/lib/FormHolder/Form/InputHolder/RadioGroup.rb +82 -0
  52. data/lib/FormHolder/Form/InputHolder/SourceView.rb +100 -0
  53. data/lib/FormHolder/Form/InputHolder/Spin.rb +49 -0
  54. data/lib/FormHolder/Form/InputHolder/Text.rb +55 -0
  55. data/lib/FormHolder/Form/InputHolder/TimeStamp.rb +82 -0
  56. data/lib/FormHolder/Form/InputHolder/TimeStampButton.rb +93 -0
  57. data/lib/FormHolder/Form/InputHolder/Toggle.rb +43 -0
  58. data/lib/FormHolder/Form/InputHolder.rb +458 -0
  59. data/lib/FormHolder/Form.rb +529 -0
  60. data/lib/FormHolder.rb +203 -0
  61. data/lib/Gtk.rb +101 -0
  62. data/lib/GtkAttributes.rb +76 -0
  63. data/lib/Kernel.rb +48 -0
  64. data/lib/ListHolder/EditableList/CellRenderers/Combo.rb +91 -0
  65. data/lib/ListHolder/EditableList/CellRenderers/ComboText.rb +22 -0
  66. data/lib/ListHolder/EditableList/CellRenderers/ConstCombo.rb +12 -0
  67. data/lib/ListHolder/EditableList/CellRenderers/ConstText.rb +23 -0
  68. data/lib/ListHolder/EditableList/CellRenderers/Pixbuf.rb +18 -0
  69. data/lib/ListHolder/EditableList/CellRenderers/Progress.rb +36 -0
  70. data/lib/ListHolder/EditableList/CellRenderers/Text.rb +51 -0
  71. data/lib/ListHolder/EditableList/CellRenderers/Toggle.rb +35 -0
  72. data/lib/ListHolder/EditableList/Column.rb +223 -0
  73. data/lib/ListHolder/EditableList/DrbListModel.rb +809 -0
  74. data/lib/ListHolder/EditableList/ListPrintOperation/ColumnsHeaderLayout.rb +56 -0
  75. data/lib/ListHolder/EditableList/ListPrintOperation/CustomPageSetup.rb +100 -0
  76. data/lib/ListHolder/EditableList/ListPrintOperation/FooterLayout.rb +26 -0
  77. data/lib/ListHolder/EditableList/ListPrintOperation/HeaderLayout.rb +35 -0
  78. data/lib/ListHolder/EditableList/ListPrintOperation/IterLayout.rb +89 -0
  79. data/lib/ListHolder/EditableList/ListPrintOperation.rb +365 -0
  80. data/lib/ListHolder/EditableList.rb +309 -0
  81. data/lib/ListHolder/GanttHolder/Gantt/Rectangle.rb +290 -0
  82. data/lib/ListHolder/GanttHolder/Gantt.rb +317 -0
  83. data/lib/ListHolder/GanttHolder/GanttFooter.rb +27 -0
  84. data/lib/ListHolder/GanttHolder/GanttScaler.rb +60 -0
  85. data/lib/ListHolder/GanttHolder.rb +31 -0
  86. data/lib/ListHolder/HistoryWindow.rb +63 -0
  87. data/lib/ListHolder/ListButtonHolder/ArchiveButton.rb +37 -0
  88. data/lib/ListHolder/ListButtonHolder/ButtonGroup.rb +32 -0
  89. data/lib/ListHolder/ListButtonHolder/FilterButton.rb +28 -0
  90. data/lib/ListHolder/ListButtonHolder/ListButton.rb +305 -0
  91. data/lib/ListHolder/ListButtonHolder/OrderingButton.rb +26 -0
  92. data/lib/ListHolder/ListButtonHolder/SumPanelButton.rb +23 -0
  93. data/lib/ListHolder/ListButtonHolder.rb +94 -0
  94. data/lib/ListHolder/ListPanel/ListFilter/FRenderer/Combo.rb +94 -0
  95. data/lib/ListHolder/ListPanel/ListFilter/FRenderer/ConstCombo.rb +11 -0
  96. data/lib/ListHolder/ListPanel/ListFilter/FRenderer/Text.rb +26 -0
  97. data/lib/ListHolder/ListPanel/ListFilter/FRenderer/Toggle.rb +41 -0
  98. data/lib/ListHolder/ListPanel/ListFilter/FRenderer.rb +58 -0
  99. data/lib/ListHolder/ListPanel/ListFilter.rb +42 -0
  100. data/lib/ListHolder/ListPanel/ListSum/Text.rb +32 -0
  101. data/lib/ListHolder/ListPanel/ListSum.rb +72 -0
  102. data/lib/ListHolder/ListPanel.rb +60 -0
  103. data/lib/ListHolder.rb +241 -0
  104. data/lib/LoginWindow.rb +77 -0
  105. data/lib/MainRouter.rb +64 -0
  106. data/lib/ManqodCommon.rb +295 -0
  107. data/lib/ManqodHelp/FormatEditor/FormatJustificationWidget.rb +76 -0
  108. data/lib/ManqodHelp/FormatsEditor.rb +139 -0
  109. data/lib/ManqodHelp/HelpBrowser/FormatTagTable/FormatTag.rb +84 -0
  110. data/lib/ManqodHelp/HelpBrowser/FormatTagTable.rb +39 -0
  111. data/lib/ManqodHelp/HelpBrowser.rb +135 -0
  112. data/lib/ManqodHelp/HelpIndex.rb +62 -0
  113. data/lib/ManqodHelp/HelpToolbar.rb +16 -0
  114. data/lib/ManqodHelp.rb +120 -0
  115. data/lib/ManqodRPC.rb +37 -0
  116. data/lib/Memcache.rb +82 -0
  117. data/lib/MyConfig.rb +93 -0
  118. data/lib/Print/PrintItem/TextLayout.rb +47 -0
  119. data/lib/Print/PrintItem.rb +240 -0
  120. data/lib/Print.rb +199 -0
  121. data/lib/PrintEditor/ItemInfo/ItemImage.rb +30 -0
  122. data/lib/PrintEditor/ItemInfo/ItemList.rb +44 -0
  123. data/lib/PrintEditor/ItemInfo/ItemTextAlignment.rb +27 -0
  124. data/lib/PrintEditor/ItemInfo.rb +129 -0
  125. data/lib/PrintEditor/PageLayout.rb +91 -0
  126. data/lib/PrintEditor/PrintEditorItem.rb +310 -0
  127. data/lib/PrintEditor.rb +195 -0
  128. data/lib/RelationBuilder/RTable/RField.rb +91 -0
  129. data/lib/RelationBuilder/RTable.rb +293 -0
  130. data/lib/RelationBuilder/Relation/RelationHandle.rb +70 -0
  131. data/lib/RelationBuilder/Relation.rb +161 -0
  132. data/lib/RelationBuilder/RunQuery.rb +55 -0
  133. data/lib/RelationBuilder/SearchWindow.rb +72 -0
  134. data/lib/RelationBuilder.rb +468 -0
  135. data/lib/SB/ListProgress.rb +150 -0
  136. data/lib/SB/Messaging.rb +77 -0
  137. data/lib/SB.rb +29 -0
  138. data/lib/mynotebook.rb +131 -0
  139. data/lib/mytouchwindow.rb +162 -0
  140. data/lib/mywindow.rb +134 -0
  141. data/lib/wysiwyg-print-label.rb +57 -0
  142. 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
+