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,240 @@
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 PrintItem
6
+ include ManqodCommon
7
+
8
+ def initialize(pop,itemdata,cr)
9
+ @pop=pop
10
+ @type=itemdata["gtktype"]
11
+ @x=itemdata["x"].to_f
12
+ @y=itemdata["y"].to_f
13
+ @txt=itemdata["txt"]
14
+ @font=itemdata["font"]
15
+ @width=itemdata["width"].to_f
16
+ @height=itemdata["height"].to_f
17
+ @page=itemdata["page_number"].to_i
18
+ @text_alignment=itemdata["text_alignment"]
19
+ @item_id=itemdata["id"]
20
+ @page_shift=0
21
+ @start_iter=nil
22
+ @cr=cr
23
+ end
24
+ attr_reader :type, :x, :y, :txt, :font, :width, :height, :page, :cr, :text_alignment
25
+ attr_reader :column_width, :draw_header_cell_borders, :column_pos, :fill_header_background, :header_line_width, :row_underline
26
+ attr_reader :cell_line_width, :sum_line_width, :list, :next_iter
27
+
28
+ def draw(cr_to_draw_to)
29
+ @cr=cr_to_draw_to
30
+ edebug("drawing item","printing","debug")
31
+ case @type
32
+ when "text" then
33
+ @layout.draw(cr)
34
+ when "line" then
35
+ cr.move_to(x,y)
36
+ cr.line_to(x+width,y+height)
37
+ when "rectangle" then
38
+ cr.rectangle(x,y,width,height)
39
+ when "list" then
40
+ unless @layout.nil?
41
+ #still draw a rectangle
42
+ cr.rectangle(x,y,width,height)
43
+ @layout.draw(cr)
44
+ else
45
+ cr.set_line_width(@cell_line_width)
46
+ list.columns.each{|col|
47
+ if col.printable?
48
+ cr.move_to(@column_pos[col.data],@columns_header.y + @columns_header.height + @header_line_width)
49
+ cr.line_to(@column_pos[col.data],@sum_y) #FIXME
50
+ end
51
+ }
52
+ cr.stroke
53
+ #draw a border around the list
54
+ cr.rectangle(x,y,width,@sum_y-y+@sum_height)
55
+ cr.stroke
56
+ #lay the layouts, including header
57
+ @layouts.each{|il| il.draw(cr)}
58
+ end
59
+ when 'image' then
60
+ cr.set_source_pixbuf(@pixbuf,@x,@y)
61
+ cr.paint
62
+ else
63
+ edebug("unknown print item #{@type}","printing","warning")
64
+ end
65
+ cr.stroke
66
+ end
67
+
68
+ def update
69
+ case @type
70
+ when "text" then @layout=TextLayout.new(cr,@txt,@font,@width,@x,@y,@text_alignment)
71
+ when 'image' then
72
+ pb = if client.nil?
73
+ DrbImages.instance.image_of_id(@txt.to_i,nil)
74
+ else
75
+ MyImage.new(@txt,true).pixbuf #FIXME! use the cache
76
+ end
77
+ @pixbuf = pb.scale(@width,@height)
78
+ when "list" then
79
+ list_id=@txt
80
+ @list=@pop.caller_object.holder.notebook.moditem_by_id(list_id) unless @pop.is_test
81
+ if @pop.is_test? or list.nil?
82
+ #printing a rectangle insted
83
+ @layout=TextLayout.new(cr,
84
+ if @pop.is_test?
85
+ "list ##{list_id} is here"
86
+ else
87
+ edebug("list ##{list_id} not found","printing","warning")
88
+ "list ##{list_id} not found"
89
+ end,
90
+ @font,@width,@x,@y)
91
+ else
92
+ #building the list
93
+ @print_sums=list.gtk_attribute("print_sums")=="true"
94
+ @sum_font=list.gtk_attribute("sum_font") || "verdana bold 6"
95
+ @cell_font=list.gtk_attribute("cell_font") || "verdana 6"
96
+ @columns_header_font=list.gtk_attribute("columns_header_font") || "verdana bold 6"
97
+ @row_spacing=list.gtk_attribute("row_spacing").to_f || 1.0
98
+ @column_spacing=list.gtk_attribute("column_spacing").to_f || 1.0
99
+ @draw_header_cell_borders=list.gtk_attribute("draw_header_cell_borders")=="true"
100
+ @fill_header_background=list.gtk_attribute("fill_header_background")=="true"
101
+ @header_line_width=list.gtk_attribute("header_line_width").to_f || 1.0
102
+ @draw_header_line=list.gtk_attribute("draw_header_line") == "true"
103
+ @cell_line_width=list.gtk_attribute("cell_line_width").to_f || 0.3
104
+ @sum_line_width=list.gtk_attribute("sum_line_width").to_f || 0.6
105
+ @print_title=list.gtk_attribute("print_title")=="true"
106
+ @row_underline=(list.gtk_attribute("row_underline") || 0.0).to_f
107
+
108
+ @layouts=Array.new
109
+ @current_height=y
110
+ if @print_title
111
+ title_layout=TextLayout.new(cr,"#{list.title}",@font,@width,@x,@current_height,'center')
112
+ @layouts.push(title_layout)
113
+ @current_height+=title_layout.height
114
+ end
115
+
116
+
117
+ columns_width_sum=0.0
118
+ col_cnt=0
119
+ list.columns.each{|col|
120
+ if col.printable?
121
+ columns_width_sum+=col.width.to_f
122
+ col_cnt+=1
123
+ end
124
+ } #summ the width of all columns
125
+
126
+ eerror("no printable columns for #{list}") if columns_width_sum==0
127
+ coef=(width-col_cnt*@column_spacing)/columns_width_sum
128
+ edebug("colums width sum: #{columns_width_sum}","printing","debug")
129
+
130
+ #@column_width will store the column positions on the context
131
+ @column_width=Hash.new
132
+ @column_pos=Hash.new #column positions
133
+ @sums=Hash.new #cell value sums are calculated here
134
+ col_cur_x=@x
135
+ list.columns.each{|col|
136
+ if col.printable?
137
+ @column_pos[col.data]=col_cur_x
138
+ @column_width[col.data]=col.width.to_f*coef
139
+ col_cur_x+=@column_width[col.data]+@column_spacing
140
+ @sums[col.colnum]=0 if col.header['type']=="gtk_int" or col.header['type']=="gtk_float"
141
+ end
142
+ }
143
+
144
+ @columns_header=ColumnsHeaderLayout.new(self,cr,list.columns,@columns_header_font).set_y(@current_height)
145
+ @layouts.push(@columns_header)
146
+ @current_height += @columns_header.height + @header_line_width
147
+
148
+ @sum_y=@y+height #max y for iters, when less rows than designed, we'll have the footer @ design position
149
+
150
+ @sum_height=if @print_sums then @columns_header.height else 0 end #FIXME: calculating with header_height for sum_height
151
+ @sum_y-=@sum_height
152
+
153
+ iter=@start_iter
154
+ while true
155
+ if iter.nil?
156
+ iter=list.list_model.sorter.iter_first
157
+ else
158
+ prev_iter=iter.clone
159
+ iter=nil if !iter.next!
160
+ end
161
+ while !iter.nil? and not (iter[list.list_model.column_of_child_key].to_i == @pop.myrows[@pop.current_row][list.list_model.key_parent].to_i or (!list.list_model.column_of_child_key2.nil? and iter[list.list_model.column_of_child_key2].to_i == @pop.myrows[@pop.current_row][list.list_model.key_parent2].to_i)) do
162
+ iter=nil if !iter.next!
163
+ end
164
+ if iter.nil?
165
+ break
166
+ else
167
+ il=IterLayout.new(cr,iter,list.columns, self,@cell_font)
168
+
169
+ #extend the sublist till the bottom of page
170
+ if @current_height + il.row_height > @sum_y and !@extended
171
+ @sum_y=@pop.paper_height - @sum_height
172
+ @extended=true
173
+ edebug("forcing page_shift for list #{list}","printing","info")
174
+ end
175
+ if @current_height + il.row_height > @pop.paper_height - @sum_height
176
+ #no more space
177
+ page_full=true
178
+ @next_iter=prev_iter
179
+ edebug("breaking list #{list} to the next page","printing","info")
180
+ break
181
+ end
182
+ il.y=@current_height
183
+ @current_height+=il.row_height+@row_spacing
184
+ @layouts.push(il)
185
+ @sums.each_key{|key| @sums[key]=@sums[key]+iter[key].to_f}
186
+ end
187
+ end
188
+
189
+ if @print_sums
190
+ il=IterLayout.new(cr,@sums,list.columns, self,@sum_font).set_y(@sum_y).set_line_above(@print_sums)
191
+ @layouts.push(il)
192
+ end
193
+
194
+ end
195
+
196
+ end
197
+
198
+ self
199
+ end
200
+ def type?(to_check)
201
+ @type == to_check
202
+ end
203
+ def page?(to_check)
204
+ @page.to_i == to_check.to_i
205
+ end
206
+ def extended?
207
+ @extended == true
208
+ end
209
+ def set_page_shift(new_page_shift)
210
+ @page_shift=new_page_shift
211
+ @page+=@page_shift
212
+ self
213
+ end
214
+
215
+ def set_txt(new_txt)
216
+ @txt=new_txt
217
+ self
218
+ end
219
+ def set_start_iter(new_start_iter)
220
+ @start_iter=new_start_iter
221
+ self
222
+ end
223
+ def set_y(new_y)
224
+ @y=new_y
225
+ self
226
+ end
227
+ def set_height(new_height)
228
+ @height=new_height
229
+ self
230
+ end
231
+
232
+ def inspect
233
+ "<PrintItem: id:#{@item_id}, type:#{@type}, page:#{@page}, txt:#{@txt}>"
234
+ end
235
+ def to_s
236
+ inspect
237
+ end
238
+
239
+ end
240
+
data/lib/Print.rb ADDED
@@ -0,0 +1,199 @@
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 MyPrintOperation < Gtk::PrintOperation
6
+ include Conf
7
+ include ManqodCommon
8
+
9
+ def initialize(caller_object,moditemid,ids_to_print=nil)
10
+ @parentselected=nil
11
+ @is_test=ids_to_print.nil?
12
+ @caller_object=caller_object
13
+ @ids_to_print=ids_to_print
14
+ case caller_object.class.name
15
+ when 'MyEditableList' then @parentselected=caller_object.get_cursor_id
16
+ when 'WysiwygPrintEditor'
17
+ else
18
+ edebug("unknown routing: "+caller_object.class.name,"printing","error")
19
+ end
20
+ @moditemid=moditemid
21
+ if is_test?
22
+ @moditem=qrow("select moditems.*,gtkprintpages.*,queries.sql from moditems left join queries on moditems.query_sql_id = queries.id left join gtkprintpages on moditems.id = gtkprintpages.moditem_id where moditems.id='#{@moditemid}'")
23
+ else
24
+ @moditem=admin.qrow("select moditems.*,gtkprintpages.*,queries.sql from moditems left join queries on moditems.query_sql_id = queries.id left join gtkprintpages on moditems.id = gtkprintpages.moditem_id where moditems.id='#{@moditemid}'")
25
+ end
26
+ super()
27
+ set_show_progress(true)
28
+ set_use_full_page(false)
29
+ set_unit(Gtk::PaperSize::UNIT_POINTS)
30
+
31
+ set_default_page_setup(Gtk::PageSetup.new)
32
+ default_page_setup.paper_size=Gtk::PaperSize.new(@moditem["paper_size_name"])
33
+ default_page_setup.orientation=case @moditem["orientation"]
34
+ when "portrait" then Gtk::PrintSettings::PageOrientation::PORTRAIT
35
+ when "reverse_portrait" then Gtk::PrintSettings::PageOrientation::REVERSE_PORTRAIT
36
+ when "landscape" then Gtk::PrintSettings::PageOrientation::LANDSCAPE
37
+ when "reverse_landscape" then Gtk::PrintSettings::PageOrientation::REVERSE_LANDSCAPE
38
+ else Gtk::PrintSettings::PageOrientation::PORTRAIT
39
+ end
40
+ default_page_setup.set_left_margin(@moditem["left_margin"].to_f,Gtk::PaperSize::UNIT_MM) if !@moditem["left_margin"].nil?
41
+ default_page_setup.set_right_margin(@moditem["right_margin"].to_f,Gtk::PaperSize::UNIT_MM) if !@moditem["right_margin"].nil?
42
+ default_page_setup.set_top_margin(@moditem["top_margin"].to_f,Gtk::PaperSize::UNIT_MM) if !@moditem["top_margin"].nil?
43
+ default_page_setup.set_bottom_margin(@moditem["bottom_margin"].to_f,Gtk::PaperSize::UNIT_MM) if !@moditem["bottom_margin"].nil?
44
+
45
+ signal_connect("begin-print") { |pop, context|
46
+ edebug("begin print","printing","info")
47
+ cr = context.cairo_context
48
+ # page_height=pop.default_page_setup.get_page_height(Gtk::PaperSize::UNIT_POINTS)
49
+ # paper_height=pop.default_page_setup.get_paper_height(Gtk::PaperSize::UNIT_POINTS)
50
+ @paper_height = context.page_setup.get_page_height(Gtk::PaperSize::UNIT_POINTS).to_f
51
+ @paper_width = context.page_setup.get_page_width(Gtk::PaperSize::UNIT_POINTS).to_f
52
+
53
+ @item_res=if is_test? then query("select * from gtkprintitems where printid='#{@moditemid}' order by page_number,y")
54
+ else item_res=admin.query("select * from gtkprintitems where printid='#{@moditemid}' order by page_number,y") end
55
+ @items_data=Array.new
56
+ while itemdata=@item_res.fetch_hash()
57
+ @items_data.push(itemdata.rehash)
58
+ end
59
+ @items_data_iter=nil
60
+ @items=Array.new
61
+
62
+ @sql=@moditem["sql"]
63
+ @sql=@moditem["querysql"] if @moditem["querysql"].length>5
64
+ if is_test?
65
+ @sql="#{@sql} limit 1"
66
+ myres=client.query(@sql)
67
+ else
68
+ myres=query(add_where(@sql,"#{guess_base(@sql)}.id in (#{@ids_to_print})"))
69
+ end
70
+ @myrows=Hash.new
71
+ @row_num=0
72
+ while myrow=myres.fetch_hash(true)
73
+ @row_num+=1
74
+ @myrows[@row_num]=myrow.rehash
75
+ end
76
+
77
+ # set_n_pages(@myrows.size*@pages.size)
78
+ @page_n=0
79
+ @current_row=1
80
+ @current_page=0
81
+ @page_shift=0
82
+ @sublist_start_iter=nil
83
+ pop.set_n_pages(@page_n)
84
+ }
85
+
86
+ signal_connect('paginate'){|pop,context|
87
+ cr=context.cairo_context
88
+ #start iterating PrintItems here
89
+ @items_data_iter=@items_data.first if @items_data_iter.nil?
90
+
91
+ if @items_data.include?(@items_data_iter)
92
+ @items.push(i=PrintItem.new(self,@items_data_iter,cr))
93
+
94
+ #start the broken sublist at top of page
95
+ i.set_height(i.y+i.height).set_y(0) if @prev_extended and i.type?("list")
96
+
97
+ i.set_txt(text_from_mysql(@myrows[current_row],@items_data_iter["txt"])).
98
+ set_page_shift(@page_shift).
99
+ set_start_iter(@sublist_start_iter).
100
+ update
101
+ #making sure page_n is max(i.page)
102
+ @page_n=i.page if @page_n<i.page
103
+ einfo("paginated: #{i}","printing")
104
+ #list continuation
105
+ @sublist_start_iter=i.next_iter
106
+ @prev_extended=i.extended?
107
+ end
108
+ if @sublist_start_iter or i.extended?
109
+ #we continue on next page
110
+ @page_shift+=1
111
+ einfo("sublist forced page_shift: #{@page_shift}","printing")
112
+ end
113
+ unless @sublist_start_iter
114
+ #iterate through the raw data
115
+ if @items_data_iter=@items_data[@items_data.index(@items_data_iter)+1]
116
+ false
117
+ else
118
+ if @current_row<@row_num
119
+ #next mysql row
120
+ @current_row+=1
121
+ @items_data_iter=@items_data.first
122
+ @page_shift=@page_n+1
123
+ einfo("page_shift: #{@page_shift}","printing")
124
+ false
125
+ else
126
+ #finish, setting n_pages
127
+ pop.set_n_pages(@page_n+1)
128
+ edebug("finished paginating at #{pop.n_pages}","printing")
129
+ true
130
+ end
131
+ end
132
+ end
133
+ }
134
+
135
+ signal_connect('draw-page'){|pop,context,page_number|
136
+ einfo("drawing page #{page_number+1}/#{pop.n_pages})","printing")
137
+ cr = context.cairo_context
138
+ @items.each{|item|
139
+ cr.set_line_width(1)
140
+ item.draw(cr) if item.page?(page_number) and !item.type?('image')
141
+ }
142
+
143
+ #workaround for the not printing text after an image in .ps
144
+ @items.each{|item|
145
+ edebug("drawing item #{item}","printing")
146
+ item.draw(cr) if item.page?(page_number) and item.type?('image')
147
+ }
148
+ }
149
+
150
+ self
151
+ end
152
+ attr_accessor :caller_object, :parentselected, :moditemid, :page_setup, :is_test, :pages, :current_row
153
+ attr_reader :myrows, :paper_width, :paper_height
154
+
155
+ def run(action)
156
+ #set_n_pages(pages["page_count"].to_i)
157
+ # set_default_page_setup(page_setup)
158
+ self.print_settings=Gtk::PrintSettings.new.deserialize(get_conf(moditemid,0,'print_settings'))
159
+ run_events(@moditemid,'print-Action')
160
+ super(action,caller_object.get_ancestor(Gtk::Window))
161
+ set_conf(moditemid,0,'print_settings',print_settings.serialize)
162
+ end
163
+
164
+ def text_from_mysql(mydata,nt=text)
165
+ found=false
166
+ rett=""
167
+ while first=nt.index("{")
168
+ found=true
169
+ rett=rett+nt[0 .. first-1] if first-1>=0
170
+ if last=nt[first .. nt.length].index("}")
171
+ last=last+first
172
+ datak=nt[first+1 .. last-1]
173
+ if mydata.has_key?(datak)
174
+ rett=rett+mydata[datak].to_s
175
+ nt=nt[last+1 .. nt.length]
176
+ else
177
+ rett=rett+datak
178
+ nt=nt[last+1 .. nt.length]
179
+ end#if
180
+ else
181
+ nt=nt[first+1 .. nt.length]
182
+ rett=rett+"{"+nt
183
+ end#if
184
+ end
185
+ if found
186
+ rett=rett+nt[1 .. nt.length] if nt.length>=1
187
+ else
188
+ rett=rett+nt if !nt.nil?
189
+ end
190
+ rett
191
+ end
192
+
193
+ def to_s
194
+ "<MyPrintOperation:#{@moditem["display"]}>"
195
+ end
196
+ def is_test?
197
+ @is_test
198
+ end
199
+ end
@@ -0,0 +1,30 @@
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 ItemImage < Gtk::ComboBox
6
+ include ManqodCommon
7
+ def initialize
8
+ super(Gtk::ListStore.new(Integer,String,Gdk::Pixbuf))
9
+ frenderer=Gtk::CellRendererText.new
10
+ irenderer=Gtk::CellRendererPixbuf.new
11
+ pack_start(frenderer,true).add_attribute(frenderer,:text,1).
12
+ pack_start(irenderer,true).add_attribute(irenderer,:pixbuf,2)
13
+ DrbImages.instance.client_each{|image_id,im|
14
+ i=model.append
15
+ i[0]=im.image_id
16
+ i[1]=im.filename
17
+ i[2]=im.resize(32)
18
+ }
19
+ signal_connect("changed"){|me| @item.set_text(me.active_iter[0].to_s) unless me.active_iter.nil? or @item.nil?}
20
+ end
21
+ attr_reader :item
22
+ def update(item)
23
+ @item=item
24
+ found=nil
25
+ model.each{|model,path,iter| found=iter if @item.text.to_i == iter[0]}
26
+ if found then set_active_iter(found) else set_active(-1) end
27
+ self
28
+ end
29
+ end
30
+
@@ -0,0 +1,44 @@
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 ItemList < Gtk::ComboBox
6
+ include ManqodCommon
7
+ def initialize
8
+ @updated=false
9
+ super(Gtk::ListStore.new(String,String))
10
+ frenderer=Gtk::CellRendererText.new
11
+ pack_start(frenderer,true).add_attribute(frenderer,:text,1)
12
+ signal_connect("changed"){|me|
13
+ unless me.active_iter.nil? or @item.nil?
14
+ @item.set_text(me.active_iter[0].to_s)
15
+ @item.child.set_label(active_iter[1])
16
+ end
17
+ }
18
+ end
19
+ attr_reader :updated, :item
20
+ def update(item)
21
+ @item=item
22
+ rows("select moditems.id,moditems.display
23
+ from moditems
24
+ left join modules on moditems.modid = modules.id
25
+ left join buttons on buttons.moditemid = moditems.parent
26
+ where modules.modname = 'listing'
27
+ and buttons.target_moditemid = '#{@item.moditemid}'"){|sublist|
28
+ i=model.append
29
+ i[0]=sublist["id"]
30
+ i[1]=sublist["display"]
31
+ } unless @updated
32
+ @updated=true
33
+ found=nil
34
+ model.each{|model,path,iter| found=iter if @item.text.to_s == iter[0]}
35
+ if found then
36
+ set_active_iter(found)
37
+ @item.child.set_label(found[1])
38
+ else
39
+ set_active(-1)
40
+ end
41
+ self
42
+ end
43
+ end
44
+
@@ -0,0 +1,27 @@
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 ItemTextAlignment < Gtk::HBox
6
+ include ManqodCommon
7
+ def initialize
8
+ super()
9
+ pack_start(@left=Gtk::RadioButton.new("left").set_draw_indicator(false))
10
+ pack_start(@center=Gtk::RadioButton.new(@left,"center").set_draw_indicator(false))
11
+ pack_start(@right=Gtk::RadioButton.new(@left,"right").set_draw_indicator(false))
12
+ @left.signal_connect("toggled"){|me| @item.set_text_alignment("left") if @left.active? }
13
+ @center.signal_connect("toggled"){|me| @item.set_text_alignment("center") if me.active? }
14
+ @right.signal_connect("toggled"){|me| @item.set_text_alignment("right") if me.active? }
15
+ end
16
+ attr_reader :updated, :item
17
+ def update(item)
18
+ @item=item
19
+ case @item.text_alignment
20
+ when "right" then @right.set_active(true)
21
+ when "center" then @center.set_active(true)
22
+ else @left.set_active(true)
23
+ end
24
+ self
25
+ end
26
+ end
27
+
@@ -0,0 +1,129 @@
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 LayItemInfo < Gtk::Table
6
+ include Conf
7
+ include ManqodCommon
8
+
9
+
10
+ def initialize
11
+ super(3,10,false)
12
+ set_border_width(1)
13
+
14
+ attach(Gtk::Frame.new("type").add(@item_type=Gtk::Label.new("none")),0,3,0,1,Gtk::FILL,Gtk::SHRINK)
15
+
16
+ attach(Gtk::Frame.new("left").add(@item_x=Gtk::SpinButton.new(0,5000,1)),0,1,1,2,Gtk::FILL,Gtk::SHRINK)
17
+ attach(Gtk::Frame.new("width").add(@item_width=Gtk::SpinButton.new(0,5000,1)),1,2,1,2,Gtk::FILL,Gtk::SHRINK)
18
+ attach(Gtk::Frame.new("right").add(@item_right=Gtk::SpinButton.new(0,5000,1)),2,3,1,2,Gtk::FILL,Gtk::SHRINK)
19
+
20
+ attach(Gtk::Frame.new("top").add(@item_y=Gtk::SpinButton.new(0,5000,1)),0,1,2,3,Gtk::FILL,Gtk::SHRINK)
21
+ attach(Gtk::Frame.new("height").add(@item_height=Gtk::SpinButton.new(0,5000,1)),1,2,2,3,Gtk::FILL,Gtk::SHRINK)
22
+ attach(Gtk::Frame.new("bottom").add(@item_bottom=Gtk::SpinButton.new(0,5000,1)),2,3,2,3,Gtk::FILL,Gtk::SHRINK)
23
+
24
+ attach(Gtk::Frame.new("page number").add(@item_pagenum=Gtk::SpinButton.new(0,10,1).set_sensitive(false)),0,3,3,4,Gtk::FILL,Gtk::SHRINK)
25
+ attach(@font_frame=Gtk::Frame.new("font").add(@item_font=Gtk::FontButton.new("")),0,3,4,5,Gtk::FILL,Gtk::SHRINK)
26
+ attach(@text_frame=Gtk::Frame.new("text").add(@item_text=Gtk::TextView.new(@buffer=Gtk::TextBuffer.new.set_text("none"))),0,3,5,6)
27
+ attach(@image_frame=Gtk::Frame.new("image").add(@item_image=ItemImage.new),0,3,6,7,Gtk::FILL,Gtk::SHRINK)
28
+ attach(@list_frame=Gtk::Frame.new("list").add(@item_list=ItemList.new),0,3,7,8,Gtk::FILL,Gtk::SHRINK)
29
+ attach(@align_frame=Gtk::Frame.new("list").add(@item_align=ItemTextAlignment.new),0,3,8,9,Gtk::FILL,Gtk::SHRINK)
30
+
31
+ attach(Gtk::Label.new("clone"),0,1,9,10,Gtk::FILL,Gtk::SHRINK)
32
+ attach(Gtk::Frame.new("left+").add(@clone_x=Gtk::SpinButton.new(0,5000,1)),1,2,9,10,Gtk::FILL,Gtk::SHRINK)
33
+ attach(Gtk::Frame.new("top+").add(@clone_y=Gtk::SpinButton.new(0,5000,1)),2,3,9,10,Gtk::FILL,Gtk::SHRINK)
34
+
35
+
36
+ attach(Gtk::Label.new,0,3,10,11)
37
+
38
+ @item_x.signal_connect('value-changed'){|me|
39
+ unless item.nil? || @item_x.value == @item.x
40
+ item.move_me(@item_x.value,@item.y)
41
+ @item_right.set_value(@item_x.value+@item_width.value)
42
+ end
43
+ }
44
+ @item_width.signal_connect('value-changed'){|me|
45
+ unless item.nil? || @item_width.value == @item.width
46
+ item.set_size_request(@item_width.value,@item.height)
47
+ @item_right.set_value(@item_x.value+@item_width.value)
48
+ end
49
+ }
50
+
51
+ @item_y.signal_connect('value-changed'){|me|
52
+ unless item.nil? || @item_y.value == @item.y
53
+ item.move_me(@item.x,@item_y.value)
54
+ @item_bottom.set_value(@item_y.value+@item_height.value)
55
+ end
56
+ }
57
+ @item_height.signal_connect('value-changed'){|me|
58
+ unless item.nil? || @item_height.value == @item.height
59
+ item.set_size_request(@item.width,@item_height.value)
60
+ @item_bottom.set_value(@item_y.value+@item_height.value)
61
+ end
62
+ }
63
+
64
+ @item_right.signal_connect('value-changed'){|me| @item_x.set_value(me.value-@item_width.value)}
65
+ @item_bottom.signal_connect('value-changed'){|me| @item_y.set_value(me.value-@item_height.value)}
66
+
67
+ @item_pagenum.signal_connect('value-changed'){|me| item.move_me(@item.x,@item.y,@item_pagenum.value) unless item.nil?}
68
+ @item_font.signal_connect("font-set"){|me| @item.modify_font(me.font_name) unless @item.nil?}
69
+
70
+ item_text.signal_connect('populate-popup'){|me,menu|
71
+ m=Gtk::ImageMenuItem.new("Insert Mysql Data Source").set_image(Gtk::Image.new(Gtk::Stock::ADD,Gtk::IconSize::IconSize::MENU))
72
+ m.submenu=Gtk::Menu.new
73
+ get_ancestor(WysiwygPrintEditor).mydata.sort.each{|h|
74
+ mm=Gtk::ImageMenuItem.new("#{h[0]}(#{h[1]})",false).set_image(Gtk::Image.new(Gtk::Stock::ADD,Gtk::IconSize::IconSize::MENU))
75
+ mm.signal_connect('activate',me.buffer,h[0],h[1]){|me,buffer,key,data|
76
+ data="N/A" if data.nil? || data == ""
77
+ unless tag = buffer.tag_table.lookup(key)
78
+ tag=Gtk::TextTag.new(key).set_foreground_gdk(Gdk::Color.new(65000,0,0))
79
+ buffer.tag_table.add(tag)
80
+ end
81
+ buffer.insert_at_cursor(data)
82
+ bounds=buffer.selection_bounds
83
+ bounds[0].backward_cursor_positions(data.length)
84
+ buffer.apply_tag(tag,bounds[0],bounds[1])
85
+ }
86
+ m.submenu.append(mm)
87
+ }
88
+ menu.append(m)
89
+
90
+ menu.show_all
91
+ }
92
+
93
+ end
94
+ attr_accessor :item_type, :item_x, :item_y, :item_width, :item_height, :item_text, :item_pagenum, :item_font, :item, :item_image, :item_list
95
+ attr_reader :clone_x, :clone_y
96
+
97
+ def update(item)
98
+ set_visible(!item.nil?)
99
+ unless item.nil?
100
+ @item=item
101
+ @item_type.set_label(item.gtk_type)
102
+ @item_x.set_value(item.x)
103
+ @item_y.set_value(item.y)
104
+ @item_width.set_value(item.width)
105
+ @item_right.set_value(@item_x.value+@item_width.value)
106
+ @item_height.set_value(item.height)
107
+ @item_bottom.set_value(@item_y.value+@item_height.value)
108
+ @item_pagenum.set_value(item.pagenum.to_f)
109
+ @text_frame.set_visible(['text','list'].include?(item.gtk_type))
110
+ @font_frame.set_visible(item.gtk_type=="text")
111
+ @align_frame.set_visible(item.gtk_type=="text")
112
+ @image_frame.set_visible(item.gtk_type=="image")
113
+ @list_frame.set_visible(item.gtk_type=="list")
114
+ case item.gtk_type
115
+ when "text"
116
+ # item_text.set_label(item.text)
117
+ item_text.set_buffer(item.child.buffer)
118
+ item_font.set_font_name(item.font)
119
+ @item_align.update(item)
120
+ when "image" then item_image.update(item)
121
+ when "list" then item_list.update(item)
122
+ else
123
+ # item_text.set_label("")
124
+ item_text.set_buffer(@buffer)
125
+ # item_font.set_label("")
126
+ end
127
+ end
128
+ end
129
+ end