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,529 @@
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
+ module Myform
6
+ include ManqodCommon
7
+ class MyForm < Gtk::Notebook
8
+ include Observable
9
+ include ManqodCommon
10
+ include GtkAttributes
11
+ include Conf
12
+
13
+ def initialize(caller,form_id,runmode)
14
+ @caller=caller
15
+ @table=nil
16
+ @parentselected=nil
17
+ @new_parentselected=nil
18
+ @querySQL=""
19
+ @runmode=runmode
20
+ @additional_on_update=""
21
+ @additional_on_insert=""
22
+ @batch=nil
23
+ @batch_support=false
24
+ set_id(form_id)
25
+ @items=Array.new
26
+ @tips=Gtk::Tooltips.new.enable
27
+ @tmp=Hash.new
28
+ @built=false
29
+ @multiselector=nil
30
+ super()
31
+ @tabs.sort{|a,b| a[1]['minX'].to_f <=> b[1]['minX'].to_f}.each{|t|
32
+ tab=t[0]
33
+ @tabs[tab]["widget"]=Gtk::Table.new(0,0,false)
34
+ @tabs[tab]["widget"].set_border_width(0)
35
+ @tabs[tab]["widget"].set_resize_mode(Gtk::ResizeMode::PARENT)
36
+ @tabs[tab]["widget"].resize(1+ @tabs[tab]['maxY'].to_i-@tabs[tab]['minY'].to_i,1+ @tabs[tab]['maxX'].to_i-@tabs[tab]['minX'].to_i)
37
+
38
+ append_page(@tabs[tab]["widget"],Gtk::Label.new(@tabs[tab]["title"]))
39
+ }
40
+
41
+ set_show_tabs(@tabs.size>1)
42
+ set_show_border(@tabs.size>1)
43
+ set_tab_pos(case gtk_attribute("tab-position")
44
+ when "BOTTOM" then Gtk::PositionType::BOTTOM
45
+ when "RIGHT" then Gtk::PositionType::RIGHT
46
+ when "LEFT" then Gtk::PositionType::LEFT
47
+ else Gtk::PositionType::TOP
48
+ end
49
+ )
50
+ set_enable_popup(false)
51
+ set_scrollable(true)
52
+
53
+ signal_connect('destroy'){|me| set_conf(get_id,0,"page",page)}
54
+
55
+ @is_embedded=nil
56
+ end
57
+
58
+ attr_accessor :id,:title, :batch
59
+ attr_accessor :runmode
60
+ attr_accessor :querySQL
61
+ attr_accessor :moditem
62
+ attr_accessor :parentselected
63
+ attr_accessor :new_parentselected
64
+ attr_accessor :ag
65
+ attr_reader :table, :tmp
66
+ attr_accessor :is_embedded, :additional_on_insert, :additional_on_update
67
+
68
+ def is_embedded
69
+ @is_embedded
70
+ end
71
+ def embedd?
72
+ if @moditem && @moditem['on_embed'].length >0
73
+ eeval(@moditem['on_embed'],self)
74
+ else
75
+ true
76
+ end
77
+ end
78
+ def wysiwygf?
79
+ form_holder.runmode == "wysiwygf"
80
+ end
81
+
82
+ def form_holder
83
+ @caller
84
+ end
85
+
86
+ def admin
87
+ if wysiwygf?
88
+ ManqodDB.instance.manqod_db
89
+ else
90
+ ManqodDB.instance.manqod_db.admin
91
+ end
92
+ end
93
+
94
+ def client
95
+ if wysiwygf?
96
+ ManqodDB.instance.manqod_db.client
97
+ else
98
+ ManqodDB.instance.manqod_db
99
+ end
100
+ end
101
+
102
+ def cache
103
+ if wysiwygf?
104
+ ManqodDB.instance.ccache
105
+ else
106
+ ManqodDB.instance.cache
107
+ end
108
+ end
109
+
110
+ def set_ag(ag)
111
+ @ag=ag
112
+ ag.connect(Gdk::Keyval::GDK_KEY_space, Gdk::Window::CONTROL_MASK, Gtk::ACCEL_VISIBLE){
113
+ focused=@caller.holder.focus.parent
114
+ if focused and focused.class.name=="MySourceView"
115
+ ret=focused.test_content
116
+ if ret
117
+ tell_exception("query is ok","fields: #{ret.num_fields}\n rows: #{ret.num_rows}","sql","normal",false)
118
+ end
119
+ end
120
+ }
121
+ ag.connect(Gdk::Keyval::GDK_KEY_f, Gdk::Window::CONTROL_MASK, Gtk::ACCEL_VISIBLE){
122
+ unless @caller.holder.focus.nil?
123
+ if (focused=@caller.holder.focus.parent) && focused.class.name == "MySourceView" then
124
+ focused.run_search(self)
125
+ end
126
+ if (focused=@caller.holder.focus.parent) && ["MyRendererComboWithNew","MyRendererCombo","MyRendererConstCombo","FieldCombo"].include?(focused.class.name) then
127
+ focused.model.filterer.run(self)
128
+ end
129
+ if (focused=@caller.holder.focus.parent.parent) && focused.class.name == "MyRendererList" then
130
+ focused.model.filterer.run(self)
131
+ end
132
+ end
133
+ }
134
+ end
135
+
136
+ def set_multiselector(widget)
137
+ @multiselector=widget
138
+ end
139
+
140
+ def query(sql)
141
+ if wysiwygf?
142
+ begin
143
+ ret=ManqodDB.instance.manqod_db.client.query(sql)
144
+ tell_exception("Database Error","Duplicate entry","sql","error") if ret == -1
145
+ ret
146
+ rescue =>err
147
+ retry if tell_exception("error in server connection",backtrace_to_debug(err),"server","error",false,true,"#{err}")
148
+ end
149
+ else
150
+ begin
151
+ ret=ManqodDB.instance.manqod_db.query(sql)
152
+ tell_exception("Database Error","Duplicate entry","sql","error") if ret == -1
153
+ ret
154
+ rescue =>err
155
+ retry if tell_exception("error in server connection",backtrace_to_debug(err),"server","error",false,true,"#{err}")
156
+ end
157
+ end
158
+ end
159
+
160
+ def qrow(sql,with_table=false)
161
+ if wysiwygf?
162
+ begin
163
+ ManqodDB.instance.manqod_db.client.qrow(sql,with_table)
164
+ rescue =>err
165
+ retry if tell_exception("error in server connection",backtrace_to_debug(err),"server","error",false,true,"#{err}")
166
+ end
167
+ else
168
+ begin
169
+ ManqodDB.instance.manqod_db.qrow(sql,with_table)
170
+ rescue =>err
171
+ retry if tell_exception("error in server connection",backtrace_to_debug(err),"server","error",false,true,"#{err}")
172
+ end
173
+ end
174
+ end
175
+
176
+ def admin_qrow(sql,with_table=false)
177
+ if wysiwygf?
178
+ begin
179
+ ManqodDB.instance.manqod_db.qrow(sql,with_table)
180
+ rescue =>err
181
+ retry if tell_exception("error in server connection",backtrace_to_debug(err),"server","error",false,true,"#{err}")
182
+ end
183
+ else
184
+ begin
185
+ ManqodDB.instance.manqod_db.admin.qrow(sql,with_table)
186
+ rescue =>err
187
+ retry if tell_exception("error in server connection",backtrace_to_debug(err),"server","error",false,true,"#{err}")
188
+ end
189
+ end
190
+ end
191
+
192
+ def rows(sql)
193
+ if wysiwygf?
194
+ begin
195
+ ManqodDB.instance.manqod_db.client.rows(sql){|row| yield row}
196
+ rescue =>err
197
+ retry if tell_exception("error in server connection",backtrace_to_debug(err),"server","error",false,true,"#{err}")
198
+ end
199
+ else
200
+ begin
201
+ ManqodDB.instance.manqod_db.rows(sql){|row| yield row}
202
+ rescue =>err
203
+ retry if tell_exception("error in server connection",backtrace_to_debug(err),"server","error",false,true,"#{err}")
204
+ end
205
+ end
206
+ end
207
+
208
+ def batch_support?
209
+ @batch_support
210
+ end
211
+
212
+ def batch?
213
+ batch_support? && batch.class == Array
214
+ end
215
+
216
+ def get_id
217
+ @form_id
218
+ end
219
+ def set_id(form_id)
220
+ @form_id=form_id
221
+ begin
222
+ @moditem=cache.get("#{get_id}moditem")
223
+ moditem_attributes=cache.get("#{get_id}attributes")
224
+ @querySQL=moditem_attributes[:querySQL]
225
+ @table=moditem_attributes[:table]
226
+ @tabs=moditem_attributes[:tabs]
227
+ @title=@moditem['display']
228
+ @batch_support=moditem_attributes[:batch]
229
+ rescue => err
230
+ retry if warn("can't load form: id=[#{@form_id}]",err,nil,"error",nil,true,backtrace_to_debug(err))
231
+ end
232
+ self
233
+ end
234
+ def set_runmode(runmode)
235
+ @runmode=runmode
236
+ self
237
+ end
238
+ def parentM
239
+ @caller.parentM
240
+ end
241
+ def items
242
+ @items
243
+ end
244
+ def findItem(data)
245
+ ret=nil
246
+ @items.each{ |item| ret=item if item.data == data or item.data == "#{@table}.#{data}"}
247
+ warn("form item: #{data} not found","tried [#{data}], [#{@table}.#{data}]","form",ERROR) if ret.nil?
248
+ ret
249
+ end
250
+
251
+ def method_missing(sym,*args)
252
+ findItem(sym.to_s)
253
+ end
254
+
255
+ def itemValue(data)
256
+ item=findItem(data)
257
+ ret=""
258
+ ret=item.text if item and item.text
259
+ edebug("itemValue: #{data.inspect} : #{item.inspect} text:#{item.text unless item.nil?} return: #{ret}","form")
260
+ ret
261
+ end
262
+ alias item_value itemValue
263
+
264
+ def to_s
265
+ "Form id:#{get_id}(#{@title}[#{runmode}#{@multiselector ? "|multiselector":""}:#{@parentselected}])"
266
+ end
267
+
268
+ def update(notifier, pid=@parentselected,rm=@runmode)
269
+ einfo("notification from #{notifier} for [#{pid}]")
270
+ @items.each{|i| i.unset_default} if @runmode!=rm && @built
271
+ @runmode=rm
272
+ @parentselected=pid
273
+ case notifier.class.name
274
+ when 'MyEditableList'
275
+ # @parentselected=notifier.get_cursor_id
276
+ @list_key=parentM.list_model.list_key
277
+ if ['add','modify'].include?(runmode)
278
+ @runmode='add'
279
+ @runmode='modify' if @parentselected and @parentselected.to_i>=0
280
+ end
281
+ when 'MyButton'
282
+ @list_key="id" #FIXME
283
+ # @runmode=notifier.function
284
+ # @parentselected=notifier.parentselected
285
+ when 'MyRendererComboWithNew','MyRendererList', 'MyRendererButton'
286
+ @list_key="id" #FIXME
287
+ # @parentselected=notifier.text
288
+ when 'MyTouchWindow'
289
+ @runmode='add'
290
+ when 'NilClass'
291
+ #we just run, currently known to call MyForm.update(nil) is from the Touchscreen stuff, kinda reinitialize
292
+ when 'BarMenuItem', 'ButtonMenuItem'
293
+ # @runmode='dry'
294
+ ## set_id(notifier.target)
295
+ else
296
+ edebug("unknown routing: "+notifier.class.name,"form","warning")
297
+ end
298
+
299
+
300
+ unless @built
301
+ edebug("building","form")
302
+ if @runmode then
303
+ @items.each{ |item| remove(item)} #destroy previous items
304
+ if @caller.holder.class.name=='Gtk::Dialog'
305
+ @caller.holder.title=@title
306
+ pw=@caller.get_ancestor(MyWindow)
307
+ if pw.class.name=="MyWindow"
308
+ @caller.holder.set_icon(pw.mymenu.last.image.pixbuf)
309
+ else
310
+ @caller.holder.set_icon(pw.icon)
311
+ end
312
+ end
313
+ @additional_on_update=String.new(@moditem['additional_on_update'])
314
+ @additional_on_insert=String.new(@moditem['additional_on_insert'])
315
+
316
+
317
+ @items.clear
318
+ i=cache.get("#{get_id}items")
319
+ i.each{|itemp|
320
+ item=MyInputHolder.new(itemp,self)
321
+ @tips.set_tip(item.eventbox,itemp['hint'],'extra hint')
322
+ attach(item)
323
+ @items << item
324
+ }
325
+
326
+ #setting observers, dependency tree built from itemVaule()-s in the SQLs
327
+ @items.each{|item|
328
+ q=String.new(item.querySQL)
329
+ while first=q.index("itemValue(")
330
+ var_first=first+"itemValue(".length
331
+ q=q[var_first .. q.length]
332
+ last=q.index(")")-1
333
+ dep=q[0 .. last].gsub("'","")
334
+ if driverItem=findItem(dep)
335
+ edebug(item.data+" depends on "+driverItem.data,"form","info")
336
+ driverItem.add_observer(item)
337
+ end
338
+ q=q[last .. q.length]
339
+ end
340
+ }
341
+ end
342
+ end
343
+
344
+ #if modify or copy than we load the default items' data
345
+ case @runmode
346
+ when 'modify','copy','info' then
347
+ itemdata=qrow(eeval("\"#{@querySQL}\""),true)
348
+ end
349
+ @items.each{|i|
350
+ default_data=nil
351
+ if itemdata then
352
+ default_data=itemdata[i.data] if itemdata.has_key?(i.data)
353
+ default_data=itemdata["#{@table}.#{i.data}"] if itemdata.has_key?("#{@table}.#{i.data}")
354
+ else
355
+ case i.type
356
+ when 'gtk_combo','gtk_combo_wn','gtk_const_combo' then default_data="-1"
357
+ else default_data=""
358
+ end
359
+ end
360
+ i.item["initial"]=default_data
361
+ }
362
+
363
+ run_events(get_id,'form-OnUpdate')
364
+
365
+ @items.each{|i| i.update(self,i.default_set? ? i.default : i.initial )}
366
+ @built=true
367
+
368
+ show_all
369
+ set_page(get_conf(get_id,0,"page").to_i) if get_conf(get_id,0,"page")
370
+ end #update
371
+
372
+ def apply_changes(caller)
373
+ s="";
374
+ #check if required items are filled
375
+ @items.each { |item| if item.editable && item.required && (item.text==nil || (item.text!=nil && (item.text.length==0 || (item.text=="-1" && ['gtk_const_combo','gtk_combo','gtk_combo_wn','gtk_list'].include?(item.type))))) then s=s+item.description+"?\n";end}
376
+ if s.length >0
377
+ #there were some unfilled but required form items
378
+ warner=Gtk::MessageDialog.new(get_ancestor(Gtk::Window),Gtk::Dialog::DESTROY_WITH_PARENT,Gtk::MessageDialog::QUESTION,Gtk::MessageDialog::BUTTONS_OK,s)
379
+ warner.set_image(Gtk::Image.new(Gtk::Stock::FIND_AND_REPLACE,Gtk::IconSize::DIALOG))
380
+ warner.show_all.run
381
+ warner.destroy
382
+ return -1
383
+ else
384
+ run_events(get_id,'form-OnApply-beforeSQL')
385
+ #/event OnApply
386
+ if @runmode
387
+ items_to_update=0
388
+ isql=""
389
+ #build the query
390
+ if @multiselector && @multiselector.toggled_ids.size > 0
391
+ sql="insert into #{@table} (#{@multiselector.item['data']},"
392
+ @items.each { |item|
393
+ sql="#{sql}#{item.data}," if item.text && (item.include_in_query_building || (item.include_in_query_building.nil? && item.editable?)) && !item.multiselector?
394
+ }
395
+ sql=sql[0 .. sql.rindex(',')-1] unless sql.rindex(',').nil? #strip last ,
396
+ autoadd_child_key=(parentM.class.name == "MyEditableList" && parentM.list_model.key_child && !(sql.index(" #{parentM.list_model.key_child} ")))
397
+ #adding child_key/parent_key
398
+ if autoadd_child_key
399
+ begin
400
+ sql="#{sql}, #{parentM.list_model.key_child}"
401
+ rescue =>err
402
+ eerror("can't auto-add child_key: #{parentM.list_model.key_child} => #{err}","form")
403
+ end
404
+ end
405
+
406
+ sql="#{sql}) values "
407
+
408
+ @multiselector.toggled_ids.each{|tid|
409
+ isql="(#{tid},"
410
+ @items.each { |item|
411
+ isql="#{isql} '#{escape_string(item.text)}'," if item.text && (item.include_in_query_building || (item.include_in_query_building.nil? && item.editable?)) && !item.multiselector?
412
+ }
413
+ isql=isql[0 .. isql.rindex(',')-1] unless isql.rindex(',').nil? #strip last ,
414
+ if autoadd_child_key
415
+ begin
416
+ isql="#{isql}, '#{parentM.list_model.parentM.iter_at_cursor[parentM.list_model.column_of_parent_key]}'" if parentM.list_model.key_child.index(".")==nil || parentM.list_model.key_child.index("#{@table}.")
417
+ rescue => err
418
+ eerror("can't auto-add child_key: #{parentM.list_model.key_child} => #{err}","form")
419
+ end
420
+ end
421
+ isql="#{isql})"
422
+ sql="#{sql} #{isql},"
423
+ }
424
+ sql=sql[0 .. sql.rindex(',')-1] unless sql.rindex(',').nil? #strip last ,
425
+ else
426
+ @items.each { |item|
427
+ if item.text && (item.include_in_query_building || (item.include_in_query_building.nil? && item.editable?))
428
+ isql="#{isql} #{item.data} = '#{escape_string(item.text)}' ,"
429
+ items_to_update+=1
430
+ end
431
+ }
432
+ end
433
+ if (items_to_update != 0) or (@runmode=='remove')
434
+ isql=isql[0 .. isql.rindex(',')-1] if !isql.rindex(',').nil?
435
+ case @runmode
436
+ when 'add','copy'
437
+ sql="insert into #{@table} set #{isql}";
438
+ sql=sql+", "+eeval("\"#{@additional_on_insert}\"") if @additional_on_insert.length>0
439
+ #auto-adding child_key
440
+ if parentM.class.name == "MyEditableList"
441
+ #adding child_key/parent_key
442
+ if parentM.list_model.key_child # and ck=parentM.list_model.key_child[parentM.list_model.key_child.rindex(".")+1 .. parentM.list_model.key_child.length]
443
+ unless sql.index(" #{parentM.list_model.key_child} ")
444
+ begin
445
+ sql="#{sql}, #{parentM.list_model.key_child} ='#{parentM.list_model.parentM.iter_at_cursor[parentM.list_model.column_of_parent_key]}'" if parentM.list_model.key_child.index(".")==nil || parentM.list_model.key_child.index("#{@table}.")
446
+ rescue =>err
447
+ eerror("can't auto-add child_key: #{parentM.list_model.key_child} => #{err}","form")
448
+ end
449
+ end
450
+ end
451
+ #adding child_key2/parent_key2
452
+ if parentM.list_model.key_child2 # and ck=parentM.list_model.key_child2[parentM.list_model.key_child2.rindex(".")+1 .. parentM.list_model.key_child2.length]
453
+ unless sql.index(" #{parentM.list_model.key_child2} ")
454
+ begin
455
+ sql="#{sql}, #{parentM.list_model.key_child2} ='#{parentM.list_model.parentM.iter_at_cursor[parentM.list_model.column_of_parent_key2]}'" if parentM.list_model.key_child2.index(".")==nil || parentM.list_model.key_child2.index("#{@table}.")
456
+ rescue =>err
457
+ eerror("can't auto-add child_key2: #{err}","form")
458
+ end
459
+ end
460
+ end
461
+ end
462
+
463
+ when 'modify'
464
+ sql="update `#{@table}` set #{isql}";
465
+ sql="#{sql}, "+eeval("\"#{@additional_on_update}\"") if @additional_on_update.length>0;
466
+ sql="#{sql} where #{@list_key} #{batch? ? "in (#{batch.join(",")})": "= '#{@parentselected}'"}"
467
+ when 'remove'
468
+ sql="delete from `#{@table}` where #{@list_key}='#{@parentselected}'"
469
+ end
470
+ end
471
+
472
+ einfo(sql,"form")
473
+ ret=if sql && query(sql) then
474
+ -1 #error unless nil?
475
+ else
476
+ if @runmode == 'modify' then
477
+ @new_parentselected=@parentselected
478
+ else
479
+ @new_parentselected=qrow("select #{@list_key} from #{table} order by #{@list_key} desc limit 1")[@list_key]
480
+ end
481
+ end
482
+
483
+ run_events(get_id,'form-OnApply-afterSQL')
484
+ @parentselected=new_parentselected
485
+ ret=@parentselected if ret.nil?
486
+
487
+ if @multiselector && @multiselector.toggled_ids.size>0
488
+ new_ids=Array.new
489
+ rows("select #{@list_key} from #{table} order by #{@list_key} desc limit #{@multiselector.toggled_ids.size}").each{|newid| new_ids.push(newid[@list_key].to_i)}
490
+ changed_ids_of_base(table,new_ids)
491
+ else
492
+ if batch?
493
+ batch.each{|b| changed_ids_of_base(table,b.to_i)}
494
+ else
495
+ changed_ids_of_base(table,@parentselected.to_i)
496
+ end
497
+ end
498
+ changed
499
+ notify_observers(self)
500
+
501
+ return ret.to_i
502
+ end
503
+ end
504
+ end
505
+
506
+ def reattach(wg)
507
+ @tabs[wg.item["tab"]]["widget"].remove(wg.widget)
508
+ attach(wg)
509
+ end
510
+ def attach(wg)
511
+ yshrink=wg.gtk_attribute('vertical-shrink') == 'true'
512
+ yfill=yexpand=['gtk_timestamp','gtk_calendar','gtk_const_radio','gtk_field_list','gtk_multiline','gtk_source','gtk_list','gtk_editable_list','filesave','fileload','qbuilder'].include?(wg.item['gtktype'])
513
+ yfill=wg.gtk_attribute('vertical-fill') == 'true' if wg.gtk_attribute('vertical-fill')
514
+ yexpand=wg.gtk_attribute('vertical-expand') == 'true' if wg.gtk_attribute('vertical-expand')
515
+ yopts=(yfill ? Gtk::FILL : 0)|(yexpand ? Gtk::EXPAND : 0)|(yshrink ? Gtk::SHRINK : 0)
516
+ xexpand=(wg.gtk_attribute('horizontal-expand')||'true') == 'true'
517
+ xfill=(wg.gtk_attribute('horizontal-fill')||'true') == 'true'
518
+ xshrink=(wg.gtk_attribute('horizontal-shrink')||'false') == 'true'
519
+ xopts=(xfill ? Gtk::AttachOptions::FILL : 0)|(xexpand ? Gtk::AttachOptions::EXPAND : 0)|(xshrink ? Gtk::AttachOptions::SHRINK : 0)
520
+ wg.item['x']='0' if wg.item['x'].to_i<0
521
+ wg.item['y']='0' if wg.item['y'].to_i<0
522
+ wg.item['xspan']='1' if wg.item['xspan'].to_i<1
523
+ wg.item['yspan']='1' if wg.item['yspan'].to_i<1
524
+ @tabs[wg.item["tab"]]["widget"].attach(wg.widget,wg.item['x'].to_i,wg.item['x'].to_i+wg.item['xspan'].to_i,wg.item['y'].to_i,wg.item['y'].to_i+wg.item['yspan'].to_i,xopts,yopts)
525
+ end
526
+ end
527
+
528
+ end
529
+