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,305 @@
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 MyButton < Gtk::Button
6
+ include Conf
7
+ include ManqodCommon
8
+ include GtkAttributes
9
+ def initialize(properties,caller,holder=nil)
10
+ @caller=caller
11
+ @properties=properties
12
+ @holder=holder
13
+ @show_icon=if gtk_attribute('show-mode') then gtk_attribute('show-mode') == 'icon only' || gtk_attribute('show-mode') == 'icon and text' || false else true end
14
+ @show_text=if gtk_attribute('show-mode') then gtk_attribute('show-mode') == 'text only' || gtk_attribute('show-mode') == 'icon and text' || false else true end
15
+ @column_of_sensitivity=if gtk_attribute('column-of-sensitivity') then @caller.list.list_model.headers[gtk_attribute('column-of-sensitivity')]["model_col"] else nil end
16
+ super()
17
+ set_use_underline(true)
18
+ set_relief(Gtk::ReliefStyle::NONE)
19
+
20
+
21
+ # signal_connect('enter-notify-event'){|me,event|me.set_state(Gtk::STATE_SELECTED)}
22
+ # signal_connect('leave-notify-event'){|me,event|me.set_state(Gtk::STATE_NORMAL)}
23
+
24
+ case @properties['btfunct']
25
+ when 'add'
26
+ @properties['display']='add' if @properties['display'].empty?
27
+ set_label(@properties['display']) if show_text?
28
+ set_image(Gtk::Image.new(Gtk::Stock::ADD,Gtk::IconSize.from_name(get_conf(0,0,"button-size")))) if show_icon?
29
+ signal_connect('clicked') do |c|
30
+ if @properties['target_moditemid'].to_i >0
31
+ case @properties['moditem_render_mode']
32
+ when 'embedded' then @caller.list.changed if @caller.notebook
33
+ when 'newwindow'
34
+ begin
35
+ form=Myform::MyFormHolder.new("dialog",self,"add",target).set_parentM(@caller.list)
36
+ ret=form.run(@caller.list.get_cursor_id)
37
+ ensure
38
+ form.destroy
39
+ end
40
+ end
41
+ else #builtin
42
+ edebug("builtin add row on #{@caller.list}","list-button","info")
43
+ @caller.list.add_row(nil)
44
+ end
45
+ end
46
+ when 'modify'
47
+ @properties['display']='modify' if @properties['display'].empty?
48
+ set_label(@properties['display']) if show_text?
49
+ set_image(Gtk::Image.new(Gtk::Stock::EDIT,Gtk::IconSize.from_name(get_conf(0,0,"button-size")))) if show_icon?
50
+ signal_connect('clicked') { |c|
51
+ if @properties['target_moditemid'].to_i >0
52
+ case @properties['moditem_render_mode']
53
+ when 'embedded' then @caller.list.changed if @caller.notebook
54
+ when 'newwindow'
55
+ begin
56
+ form=Myform::MyFormHolder.new("dialog",self,"modify",target).set_parentM(@caller.list)
57
+ ret=form.run(@caller.list.get_cursor_id, @caller.list.selected_ids)
58
+ ensure
59
+ form.destroy
60
+ end
61
+ end
62
+ end #if
63
+ }
64
+ when 'wysiwygf'
65
+ @properties['display']='wysiwyg' if @properties['display'].empty?
66
+ set_label(@properties['display']) if show_text?
67
+ set_image(Gtk::Image.new(Gtk::Stock::PROPERTIES,Gtk::IconSize.from_name(get_conf(0,0,"button-size")))) if show_icon?
68
+ signal_connect('clicked'){|c|
69
+ if @caller.list.get_cursor_id
70
+ form=Myform::MyFormHolder.new("dialog",self,"wysiwygf",target).set_parentM(@caller.list)
71
+ ret=form.run(@caller.list.get_cursor_id)
72
+ end
73
+ }
74
+ when 'info'
75
+ properties['display']='info' if properties['display'].empty?
76
+ set_label(properties['display']) if show_text?
77
+ set_image(Gtk::Image.new(Gtk::Stock::INFO,Gtk::IconSize.from_name(get_conf(0,0,"button-size")))) if show_icon?
78
+ signal_connect('clicked') do |c|
79
+ if properties['target_moditemid'].to_i >0
80
+ case properties['moditem_render_mode']
81
+ when 'embedded'
82
+ caller.list.changed if caller.notebook
83
+
84
+ when 'newwindow'
85
+ if @caller.list.get_cursor_id
86
+ form=Myform::MyFormHolder.new("dialog",self,"info",target).set_parentM(@caller.list)
87
+ ret=form.run(@caller.list.get_cursor_id)
88
+ end
89
+ end
90
+ end #if
91
+ end
92
+ when 'copy'
93
+ @properties['display']='copy' if @properties['display'].empty?
94
+ set_label(@properties['display']) if show_text?
95
+ set_image(Gtk::Image.new(Gtk::Stock::COPY,Gtk::IconSize.from_name(get_conf(0,0,"button-size")))) if show_icon?
96
+ signal_connect('clicked'){|c|
97
+ if @properties['target_moditemid'].to_i >0
98
+ case @properties['moditem_render_mode']
99
+ when 'embedded'
100
+ @caller.list.changed if @caller.notebook
101
+
102
+ when 'newwindow'
103
+ if @caller.list.get_cursor_id
104
+ form=Myform::MyFormHolder.new("dialog",self,"copy",target).set_parentM(@caller.list)
105
+ ret=form.run(@caller.list.get_cursor_id)
106
+ end
107
+ end
108
+ else #builtin
109
+ warner=Gtk::MessageDialog.new(get_ancestor(Gtk::Window),Gtk::Dialog::DESTROY_WITH_PARENT,Gtk::MessageDialog::QUESTION,Gtk::MessageDialog::BUTTONS_YES_NO,"#{@properties['display']}?")
110
+ warner.set_image(Gtk::Image.new(Gtk::Stock::COPY,Gtk::IconSize::DIALOG))
111
+ if warner.show_all.run == Gtk::Dialog::RESPONSE_YES
112
+ @caller.list.duplicate_selected(self)
113
+ end
114
+ warner.destroy
115
+ end
116
+ }
117
+ when 'remove'
118
+ @properties['display']='remove' if @properties['display'].empty?
119
+ set_label(@properties['display']) if show_text?
120
+ set_image(Gtk::Image.new(Gtk::Stock::REMOVE,Gtk::IconSize.from_name(get_conf(0,0,"button-size")))) if show_icon?
121
+ signal_connect('clicked'){|me|
122
+ ids=Array.new
123
+ @caller.list.selection.selected_each { |model, path, iter| ids.push(iter[@caller.list.list_model.column_of_id])}
124
+ ids.each{|id_to_lock| @caller.list.list_model.lock_iter(id_to_lock)}
125
+ warner=Gtk::MessageDialog.new(get_ancestor(Gtk::Window),Gtk::Dialog::DESTROY_WITH_PARENT,Gtk::MessageDialog::QUESTION,Gtk::MessageDialog::BUTTONS_YES_NO,"#{@properties['display']} #{ids.size}?")
126
+ warner.set_image(Gtk::Image.new(Gtk::Stock::REMOVE,Gtk::IconSize::DIALOG))
127
+ begin
128
+ if warner.show_all.run == Gtk::Dialog::RESPONSE_YES
129
+ if @properties['target_moditemid'].to_i >0
130
+ ids.each{|id_to_rm|
131
+ @caller.list.set_cursor_id(id_to_rm)
132
+ if @caller.list.get_cursor_id
133
+ form=Myform::MyFormHolder.new("dialog",self,"remove",target).set_parentM(@caller.list)
134
+ ret=form.run(@caller.list.get_cursor_id)
135
+ @caller.list.remove_selected(self) if ret>=0
136
+ end
137
+ }
138
+ else
139
+ @caller.list.remove_selected(self,ids)
140
+ end
141
+ end
142
+ ensure
143
+ ids.each{|id_to_unlock| @caller.list.list_model.unlock_iter(id_to_unlock)}
144
+ ids=nil
145
+ warner.close
146
+ end
147
+ }
148
+ when 'print'
149
+ @properties['display']='print' if @properties['display'].empty?
150
+ set_label(@properties['display']) if show_text?
151
+ set_image(Gtk::Image.new(Gtk::Stock::PRINT,Gtk::IconSize.from_name(get_conf(0,0,"button-size")))) if show_icon?
152
+ signal_connect('clicked') do |c|
153
+ if @properties['target_moditemid'].to_i >0
154
+ ids=Array.new
155
+ @caller.list.selection.selected_each { |model, path, iter| ids.push(iter[@caller.list.list_model.column_of_id])}
156
+ if printop=MyPrintOperation.new(@caller.list,@properties['target_moditemid'].to_i,ids.join(","))
157
+ printop.run(Gtk::PrintOperation::Action::PRINT_DIALOG)
158
+ end
159
+ ids=nil
160
+ else
161
+ #builtin list print
162
+ @caller.list.gtkprint
163
+ end
164
+ end
165
+ when 'pwysiwyg'
166
+ @properties['display']='wysiwyg print editor' if @properties['display'].empty?
167
+ set_label(@properties['display']) if show_text?
168
+ set_image(Gtk::Image.new(Gtk::Stock::PRINT_PREVIEW,Gtk::IconSize.from_name(get_conf(0,0,"button-size")))) if show_icon?
169
+ signal_connect('clicked'){ |c|
170
+ WysiwygPrintEditor.new(self,@caller.list.get_cursor_id).run if @caller.list.get_cursor_id
171
+ }
172
+ when 'export'
173
+ properties['display']='export' if properties['display'].empty?
174
+ set_label(properties['display']) if show_text?
175
+ set_image(Gtk::Image.new(Gtk::Stock::CONVERT,Gtk::IconSize.from_name(get_conf(0,0,"button-size")))) if show_icon?
176
+ signal_connect('clicked'){|c|
177
+ filechooser=Gtk::FileChooserDialog.new("Export to file",
178
+ @caller.get_ancestor(Gtk::Window),
179
+ Gtk::FileChooser::ACTION_SAVE,
180
+ nil,
181
+ [Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_CANCEL],
182
+ [Gtk::Stock::CONVERT, Gtk::Dialog::RESPONSE_ACCEPT])
183
+ filechooser.set_filename(get_conf(@caller.list.list_id,0,"csvfilename")) unless get_conf(@caller.list.list_id,0,"csvfilename").nil?
184
+ filechooser.add_filter(csv=Gtk::FileFilter.new.add_pattern("*.csv").set_name('csv'))
185
+ filechooser.set_filter(csv)
186
+
187
+ # filechooser.set_current_folder(get_conf(@caller.list.list_id,0,"csvfolder"))
188
+ if filechooser.run == Gtk::Dialog::RESPONSE_ACCEPT
189
+ # set_conf(@caller.list.list_id,0,"csvfolder",filechooser.current_folder)
190
+ set_conf(@caller.list.list_id,0,"csvfilename",filechooser.filename)
191
+ @caller.list.list_model.to_csv(filechooser.filename)
192
+ end
193
+ filechooser.destroy
194
+ }
195
+
196
+ when 'import'
197
+ properties['display']='import' if properties['display'].empty?
198
+ set_label(properties['display']) if show_text?
199
+ set_image(Gtk::Image.new(Gtk::Stock::CONVERT,Gtk::IconSize.from_name(get_conf(0,0,"button-size")))) if show_icon?
200
+ signal_connect('clicked'){|c|
201
+ filechooser=Gtk::FileChooserDialog.new("Import from file",
202
+ @caller.get_ancestor(Gtk::Window),
203
+ Gtk::FileChooser::ACTION_OPEN,
204
+ nil,
205
+ [Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_CANCEL],
206
+ [Gtk::Stock::CONVERT, Gtk::Dialog::RESPONSE_ACCEPT])
207
+ filechooser.set_filename(get_conf(@caller.list.list_id,0,"csvfilename")) unless get_conf(@caller.list.list_id,0,"csvfilename").nil?
208
+ filechooser.add_filter(csv=Gtk::FileFilter.new.add_pattern("*.csv").set_name('csv'))
209
+ filechooser.set_filter(csv)
210
+
211
+ if filechooser.run == Gtk::Dialog::RESPONSE_ACCEPT
212
+ set_conf(@caller.list.list_id,0,"csvfilename",filechooser.filename)
213
+ @caller.list.list_model.from_csv(filechooser.filename)
214
+ end
215
+ filechooser.destroy
216
+ }
217
+
218
+ else
219
+ p "Unknown Button: "+@properties['btfunct']
220
+ end
221
+ modify_label_widget_font if show_text?
222
+ #use the list's tips to set tooltip for this button
223
+ @caller.list.tip.set_tip(self,@properties['display'],nil)
224
+ end
225
+ attr_accessor :properties
226
+ attr_accessor :caller
227
+
228
+ def modify_label_widget_font
229
+ label_widget.modify_font(Pango::FontDescription.new(get_conf(0,0,"list-button-font"))) unless label_widget.nil?
230
+ end
231
+
232
+ def image_widget
233
+ w=nil
234
+ child.child.each{|ch|
235
+ w=ch if ch.class.name == "Gtk::Image"
236
+ }
237
+ w
238
+ end
239
+ def label_widget
240
+ w=nil
241
+ if show_icon?
242
+ child.child.each{|ch| w=ch if ch.class.name == "Gtk::Label" }
243
+ else
244
+ each{|ch| w=ch if ch.class.name == "Gtk::Label"}
245
+ end
246
+ w
247
+ end
248
+
249
+ def target
250
+ case function
251
+ when "wysiwygf" then parentselected
252
+ else @properties['target_moditemid']
253
+ end
254
+ end
255
+ def function
256
+ @properties['btfunct']
257
+ end
258
+
259
+ def parentselected
260
+ @caller.list.get_cursor_id
261
+ end
262
+
263
+ def parentM
264
+ @caller.parentM
265
+ end
266
+
267
+ def show_text?
268
+ @show_text
269
+ end
270
+ def show_icon?
271
+ @show_icon
272
+ end
273
+ def group
274
+ gtk_attribute("group")
275
+ end
276
+ def group_widget
277
+ @holder.groups[group] if group
278
+ end
279
+
280
+ def update(notifier)
281
+ case @properties['btfunct']
282
+ when 'add','import' then set_sensitive((notifier.parentM ? notifier.parentM.get_cursor_id> -1 : true) && (@column_of_sensitivity && notifier.list_model.iter_at_cursor ? notifier.list_model.iter_at_cursor[@column_of_sensitivity]=='true' : true ))
283
+ when 'print' then set_sensitive(if @properties['target_moditemid'].to_i >0 then notifier.get_cursor_id else true end)
284
+ else set_sensitive(!notifier.get_cursor_id.nil? && notifier.list_model.iter_at_cursor && notifier.list_model.iter_at_cursor[notifier.list_model.column_of_sensitive] && selection_sensitive?)
285
+ end
286
+ end
287
+
288
+ def selection_sensitive?
289
+ if @column_of_sensitivity then
290
+ r=@caller.list.list_model.iter_at_cursor[@column_of_sensitivity]=='true'
291
+ @caller.list.selection.selected_each { |model, path, iter|
292
+ r=false if iter[@column_of_sensitivity]=='false' }
293
+ r
294
+ else
295
+ true
296
+ end
297
+ end
298
+
299
+ def inspect
300
+ "MyListButton #{@properties['display']} of #{@caller.list}"
301
+ end
302
+ def to_s
303
+ inspect
304
+ end
305
+ end
@@ -0,0 +1,26 @@
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 OrderingButton < Gtk::Button
6
+ include Conf
7
+ def initialize(list_holder,orientation)
8
+ @list_holder=list_holder
9
+ @orientation=orientation
10
+ super()
11
+ set_relief(Gtk::ReliefStyle::NONE)
12
+ set_image(Gtk::Image.new(@orientation,Gtk::IconSize.from_name(get_conf(0,0,"button-size"))))
13
+ signal_connect('clicked'){|me|
14
+ @list_holder.list.list_model.move_up_id(@list_holder.list.get_cursor_id) if @orientation == Gtk::Stock::GO_UP
15
+ @list_holder.list.list_model.move_down_id(@list_holder.list.get_cursor_id) if @orientation == Gtk::Stock::GO_DOWN
16
+ }
17
+ end
18
+ def update
19
+ set_no_show_all(@list_holder.list.gtk_attribute("ordering").nil?)
20
+ set_visible(!@list_holder.list.gtk_attribute("ordering").nil?)
21
+ end
22
+ def to_s
23
+ "OrderingButton of #{@list_holder}"
24
+ end
25
+ end
26
+
@@ -0,0 +1,23 @@
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
+ public
6
+ class SumPanelButton < Gtk::ToggleButton
7
+ include Conf
8
+ def initialize(list_holder)
9
+ @list_holder=list_holder
10
+ super()
11
+ set_relief(Gtk::ReliefStyle::NONE)
12
+ set_image(Gtk::Image.new(Gtk::Stock::ZOOM_IN,Gtk::IconSize.from_name(get_conf(0,0,"button-size"))))
13
+ signal_connect('toggled'){|me|
14
+ me.list_holder.list_panel.set_visibility
15
+ set_conf(list_holder.list.get_id,0,"sum-panel",me.active?.to_s)
16
+ }
17
+ end
18
+ attr_accessor :list_holder
19
+
20
+ def update
21
+ set_active(get_conf(list_holder.list.list_id,0,"sum-panel")=="true")
22
+ end
23
+ end
@@ -0,0 +1,94 @@
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 ListButtonHolder
6
+ include ManqodCommon
7
+
8
+ def initialize(list_holder,orientation)
9
+ @list_holder=list_holder
10
+ @list_id=nil
11
+ @default=nil
12
+ @groups=Hash.new
13
+ set_orientation(orientation)
14
+ # list_buttons.set_layout_style(Gtk::ButtonBox::SPREAD)
15
+ list_holder.list.add_observer(self)
16
+ end
17
+ attr_reader :holder, :list_buttons, :advanced_buttons, :list_holder, :advanced_filter, :sum_button, :archive_button, :groups
18
+
19
+ def update(notifier,reload=false)
20
+ if notifier.list_id == @list_id && !reload
21
+ list_buttons.each{|button| button.update(notifier)}
22
+ else
23
+ @list_id=notifier.list_id
24
+ load_buttons
25
+ end
26
+ self
27
+ end
28
+ def set_orientation(new_orientation)
29
+ unless new_orientation == @orientation
30
+ @orientation = new_orientation
31
+ @holder.remove(advanced_buttons).remove(list_buttons) unless @holder.nil?
32
+ @holder.destroy unless @holder.nil? or @holder.destroyed?
33
+ if advanced_buttons.nil? or advanced_buttons.destroyed?
34
+ @advanced_buttons=Gtk::HBox.new.set_homogeneous(false)
35
+ advanced_buttons.pack_start(@advanced_filter=AdvancedFilterButton.new(@list_holder))
36
+ advanced_buttons.pack_start(@sum_button=SumPanelButton.new(@list_holder))
37
+ advanced_buttons.pack_start(@archive_button=ArchiveButton.new(@list_holder))
38
+ advanced_buttons.pack_start(@up_button=OrderingButton.new(@list_holder,Gtk::Stock::GO_UP))
39
+ advanced_buttons.pack_start(@down_button=OrderingButton.new(@list_holder,Gtk::Stock::GO_DOWN))
40
+ end
41
+ case @orientation
42
+ when Gtk::ORIENTATION_VERTICAL
43
+ @holder=Gtk::VBox.new
44
+ @list_buttons=Gtk::VBox.new#.set_homogeneous(false).set_layout_style(Gtk::ButtonBox::START)
45
+ holder.pack_start(list_buttons,false,false,0)
46
+ holder.pack_start(list_holder.info,true,true)
47
+ holder.pack_start(advanced_buttons,false,false,0)
48
+ else
49
+ # when Gtk::ORIENTATION_HORIZONTAL
50
+ @holder=Gtk::HBox.new
51
+ @list_buttons=Gtk::HBox.new#.set_homogeneous(false).set_layout_style(Gtk::ButtonBox::END)
52
+ holder.pack_start(advanced_buttons,false,false,0)
53
+ holder.pack_start(list_holder.info,true,true)
54
+ holder.pack_end(list_buttons,false,false,0)
55
+ end
56
+ load_buttons
57
+ @holder.signal_connect('destroy'){|me|
58
+ @holder.remove(list_holder.info) unless list_holder.info.destroyed?
59
+ }
60
+ end
61
+ end
62
+
63
+ def load_buttons
64
+ @default=nil
65
+ @groups.clear
66
+ list_buttons.each{|button| button.destroy unless button.destroyed?}
67
+ # admin_rows("select * from buttons where moditemid='#{list_holder.list.get_id}' and (grp_id in (-1,0) or (select count(id) from usergroups where userid='#{nick_id}' and groupid=grp_id)>0) order by oid"){|row|
68
+ return if list_holder.list.list_model.drbmodel.nil?
69
+ @archive_button.update
70
+ @up_button.update
71
+ @down_button.update
72
+ list_holder.list.list_model.drbmodel.buttons(nick_id).each{|row|
73
+ button=MyButton.new(row.rehash,list_holder,self)
74
+ if button.group && !@groups.has_key?(button.group)
75
+ @groups[button.group]=ButtonGroup.new(self,button.group)
76
+ list_buttons.pack_start(@groups[button.group])
77
+ end
78
+ if button.group
79
+ button.group_widget.pack_start(button)
80
+ else
81
+ list_buttons.pack_start(button)
82
+ end
83
+ button.update(list_holder.list)
84
+ @default=button if @default.nil? and button.function != 'add'
85
+ }
86
+ holder.show_all
87
+ end
88
+
89
+ def activate_default
90
+ @default.clicked if @default && !@list_holder.list.list_model.locked?(@list_holder.list.get_cursor_id) && @default.sensitive?
91
+ end
92
+
93
+ end
94
+
@@ -0,0 +1,94 @@
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 MyFRendererCombo < Gtk::ComboBox
6
+ include ManqodCommon
7
+ include Conf
8
+ def initialize(caller,header)
9
+ @header=header
10
+ @caller=caller
11
+ @defval=get_conf(caller.list.get_id,header["id"],"filter") || "-1"
12
+ @mycombomodel=Gtk::ListStore.new(String,String)
13
+ @filter=Gtk::TreeModelFilter.new(@mycombomodel)
14
+ @typed=""
15
+ super()
16
+ set_model(@filter)
17
+ update()
18
+ set_row_separator_func{|model, iter|
19
+ iter[1]=='separator' or iter[0]=='---'
20
+ }
21
+ @filter.set_visible_func{|model, iter|
22
+ if iter[0] and @typed
23
+ ret=iter[0].upcase.index(@typed.upcase)
24
+ # print iter[0],":",iter[0][0 .. @typed.length]," == ",@typed," = ",ret,"\n"
25
+ ret
26
+ end
27
+ }
28
+ # update
29
+ signal_connect('changed'){|me|
30
+ set_conf(caller.list.get_id,header['id'],"filter",self.active_iter[1])
31
+ @caller.list.refilter
32
+ }
33
+ signal_connect('key-press-event'){|me,key|
34
+ case key.keyval
35
+ when ?a .. ?z,?A .. ?Z, ?0 .. ?9 then @typed=@typed+key.keyval.chr
36
+ when 65288 then @typed="" if @typed.length==1
37
+ @typed=@typed[0 .. @typed.length-2] if @typed.length>0
38
+ end
39
+ # print "current filter: ",@typed,",",@typed.length,"\n"
40
+ @filter.refilter
41
+ }
42
+ end
43
+ def update(new_value=@defval)
44
+ set_model(nil)
45
+ @defval=new_value
46
+ @mycombomodel.clear
47
+ if @header['wantnew']
48
+ append_row("-1","")
49
+ append_row("---","---")
50
+ end
51
+ if @header['admin']
52
+ admin_rows(@header['querySQL'],@header['key'].include?(".")){|row| append_row(row[@header['key']],row[@header['display']])}
53
+ else
54
+ rows(@header['querySQL'],@header['key'].include?(".")){|row| append_row(row[@header['key']],row[@header['display']])}
55
+ end unless @header['querySQL'].length == 0
56
+ set_model(@mycombomodel)
57
+ select_value()
58
+ end
59
+
60
+ def append_row(cdata,cdisplay)
61
+ iter=@mycombomodel.append
62
+ iter[0]=cdisplay
63
+ iter[1]=cdata
64
+ end
65
+
66
+ def get_value_from_text(selected_combo_text)
67
+ selected_combo_value=nil
68
+ @mycombomodel.each {|model, path, iter|
69
+ if iter[1]==selected_combo_text
70
+ selected_combo_value=iter[0]
71
+ end
72
+ }
73
+ return selected_combo_value
74
+ end
75
+
76
+ def get_text_from_value(selected_combo_value)
77
+ selected_combo_text=nil
78
+ @mycombomodel.each {|model, path, iter|
79
+ if iter[0]==selected_combo_value
80
+ selected_combo_text=iter[1]
81
+ end
82
+ }
83
+ return selected_combo_text
84
+ end
85
+
86
+ def text
87
+ return self.active_iter[1]
88
+ end
89
+
90
+ def select_value(selected_value=@defval)
91
+ @defval=selected_value
92
+ @mycombomodel.each {|model, path, iter| self.set_active(path.indices[0]) if iter[1]==@defval }
93
+ end
94
+ end #MyFRendererCombo
@@ -0,0 +1,11 @@
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 MyFRendererConstCombo < MyFRendererCombo
6
+ def initialize(caller,header,defval)
7
+ item['admin']=true
8
+ item['querySQL']="select cdata,cdisplay from scv where combo='"+header['data']+"' order by cdisplay"
9
+ super
10
+ end
11
+ end
@@ -0,0 +1,26 @@
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 MyFRendererText < Gtk::Entry
6
+ include Conf
7
+ def initialize(caller,header)
8
+ @to_filter=0
9
+ super()
10
+ set_has_frame(true)
11
+ set_editable(true)
12
+ set_text(get_conf(caller.list.get_id,header["id"],"filter") || "")
13
+ self.signal_connect("changed",caller,header){|me,caller,header|
14
+ set_conf(caller.list.get_id,header["id"],"filter",me.text)
15
+ @to_filter=@to_filter+1
16
+ Gtk.timeout_add(1000){
17
+ @to_filter=@to_filter-1
18
+ caller.list.refilter if @to_filter==0
19
+ false
20
+ }
21
+ }
22
+ end
23
+ def update(newtext="")
24
+ set_text(newtext)
25
+ end
26
+ end
@@ -0,0 +1,41 @@
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 MyFRendererToggle < Gtk::Alignment
6
+ include ManqodCommon
7
+ include Conf
8
+ def initialize(caller,header)
9
+ @caller=caller
10
+ @header=header
11
+ @filter=get_conf(caller.list.get_id,header["id"],"filter") || ""
12
+ @renderer=Gtk::CheckButton.new
13
+ super(@header['align'].to_f,0.5,0,0)
14
+ add(@renderer)
15
+ case @filter
16
+ when "=true" then @renderer.set_active(true).set_inconsistent(false);
17
+ when "=false" then @renderer.set_active(false).set_inconsistent(false);
18
+ else @renderer.set_active(false).set_inconsistent(true);
19
+ end
20
+ @renderer.signal_connect("released"){|me|
21
+ if @filter=="" then @filter="=true" else
22
+ if @filter=="=true" then @filter="=false" else
23
+ @filter=""
24
+ end
25
+ end
26
+ case @filter
27
+ when "=true" then @renderer.set_active(true).set_inconsistent(false);
28
+ when "=false" then @renderer.set_active(false).set_inconsistent(false);
29
+ else @renderer.set_active(false).set_inconsistent(true);
30
+ end
31
+ edebug("active: #{@renderer.active?},inconsistent: #{@renderer.inconsistent?}|#{@filter}|","filter-toggle")
32
+ set_conf(caller.list.get_id,header['id'],"filter",@filter)
33
+ @caller.list.refilter
34
+ }
35
+ end
36
+ def update(newvalue=@filter)
37
+ einfo("updated"+newvalue.to_s,"filter-toggle")
38
+ @filter=newvalue
39
+ end
40
+ end
41
+
@@ -0,0 +1,58 @@
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 MyFRenderer < Gtk::EventBox
6
+ include Conf
7
+
8
+ def initialize(list,column)
9
+ @column=column
10
+ @header=column.header
11
+ @list=list
12
+ @defval=defval
13
+ super()
14
+ case @header['type']
15
+ when 'gtk_text' then @renderer=MyFRendererText.new(self,@header)
16
+ when 'gtk_toggle' then @renderer=MyFRendererToggle.new(self,@header)
17
+ when 'gtk_const_combo' then
18
+ @header['admin']=true
19
+ @header['querySQL']="select * from scv where combo='"+@header['data']+"' order by cdisplay"
20
+ @header['wantnew']=true
21
+ @renderer=MyFRendererCombo.new(self,@header)
22
+ when 'gtk_combo' then
23
+ @header['wantnew']=true
24
+ @renderer=MyFRendererCombo.new(self,@header)
25
+ else
26
+ @renderer=MyFRendererText.new(self,@header)
27
+ end
28
+
29
+ add(renderer)
30
+ @last_width=width_request
31
+ end
32
+ attr_accessor :header
33
+ attr_accessor :list
34
+ attr_accessor :defval
35
+ attr_accessor :renderer
36
+ attr_accessor :header
37
+
38
+ def update(newtext="")
39
+ renderer.update(newtext) if renderer
40
+ end
41
+ def set_width_request(new_width)
42
+ if width_request != new_width and @last_width != new_width
43
+ @last_width=width_request
44
+ renderer.set_width_request(new_width)
45
+ end
46
+ self
47
+ end
48
+ def width_request
49
+ renderer.width_request
50
+ end
51
+ def get_list_id
52
+ list.get_id
53
+ end
54
+ def set_height_request(h)
55
+ renderer.set_height_request(h)
56
+ end
57
+ end
58
+