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,91 @@
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
+
6
+ class PageLayout < Gtk::ScrolledWindow
7
+ include ManqodCommon
8
+ include Conf
9
+
10
+ def initialize(print_editor)
11
+ @print_editor=print_editor
12
+ super()
13
+ @widget=Gtk::Layout.new
14
+ @widget.set_size_request(
15
+ @print_editor.page_setup.get_page_width(Gtk::PaperSize::UNIT_POINTS).to_f*@print_editor.zoom,
16
+ @print_editor.page_setup.get_page_height(Gtk::PaperSize::UNIT_POINTS).to_f*@print_editor.zoom
17
+ )
18
+ add_with_viewport(@eb=Gtk::EventBox.new.add(@widget))
19
+ #.set_policy(Gtk::POLICY_AUTOMATIC,Gtk::POLICY_AUTOMATIC)
20
+ # @widget.modify_bg(Gtk::StateType::NORMAL,Gdk::Color.parse("#0FFFFF"))
21
+ @eb.set_visible_window(false)
22
+ @eb.set_border_width(0)
23
+
24
+ @widget.signal_connect('expose-event'){|me,event|
25
+ return false if @print_editor.page_setup.nil?
26
+ cr=me.bin_window.create_cairo_context
27
+ cr.scale(@print_editor.zoom,@print_editor.zoom)
28
+ cr.set_line_width(0.2)
29
+ cr.set_source_rgba(0,0,1,1)
30
+
31
+ ps=@print_editor.page_setup
32
+ paper_height = ps.get_page_height(Gtk::PaperSize::UNIT_POINTS).to_f
33
+ paper_width = ps.get_page_width(Gtk::PaperSize::UNIT_POINTS).to_f
34
+
35
+ cr.rectangle(0,0,paper_width,paper_height)
36
+
37
+ cr.rectangle(
38
+ ps.get_left_margin(Gtk::PaperSize::UNIT_POINTS),
39
+ ps.get_top_margin(Gtk::PaperSize::UNIT_POINTS),
40
+ paper_width-ps.get_left_margin(Gtk::PaperSize::UNIT_POINTS)-ps.get_right_margin(Gtk::PaperSize::UNIT_POINTS),
41
+ paper_height-ps.get_top_margin(Gtk::PaperSize::UNIT_POINTS)-ps.get_bottom_margin(Gtk::PaperSize::UNIT_POINTS)
42
+ )
43
+ cr.stroke_preserve
44
+ cr.set_source_rgba(1,1,1,0.5)
45
+ cr.fill(true)
46
+ # cr.move_to(paper_width/2,paper_height/2)
47
+ # cr.fill
48
+ cr.stroke
49
+ }
50
+ @eb.signal_connect('button-press-event'){|me,event| @print_editor.set_focused_item(nil)}
51
+ end
52
+ attr_accessor :print_editor
53
+
54
+ def inc_size(w,h)
55
+ @widget.set_width_request(w.to_i*print_editor.zoom+10) if @widget.allocation.width < w.to_i*print_editor.zoom+10
56
+ @widget.set_height_request(h.to_i*print_editor.zoom+10) if @widget.allocation.height < h.to_i*print_editor.zoom+10
57
+ end
58
+
59
+ def put(page_num,gtk_type,id=nil,x=0,y=0,width=100,height=100,text='',font="",ta="left")
60
+ l=PrintEditorItem.new(self,page_num,id,x,y,width,height,gtk_type,text,font,ta)
61
+ inc_size(x+width,y+height)
62
+ @widget.put(l,l.x*print_editor.zoom,l.y*print_editor.zoom)
63
+ l.text_from_mysql(text)
64
+ show_all
65
+ l
66
+ end
67
+
68
+ def move(ch)
69
+ inc_size(ch.x+ch.width,ch.y+ch.height)
70
+ @widget.move(ch,ch.x*print_editor.zoom,ch.y*print_editor.zoom)
71
+ end
72
+ def remove(item)
73
+ @widget.remove(item)
74
+ end
75
+
76
+ def to_mysql
77
+ @widget.each{|ch| ch.to_mysql}
78
+ end
79
+
80
+ def clear
81
+ unless @widget.window.nil?
82
+ @widget.each{|ch| ch.zoomed}
83
+ @widget.window.invalidate(Gdk::Rectangle.new(0,0,@widget.allocation.width,@widget.allocation.height),true)
84
+ end
85
+ end
86
+
87
+ def to_s
88
+ "Page of #{@print_editor}"
89
+ end
90
+ end
91
+
@@ -0,0 +1,310 @@
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 PrintEditorItem < Gtk::EventBox
6
+ include ManqodCommon
7
+ def initialize(page_layout,page_num,id,x,y,width,height,gtk_type,text,font,text_alignment="left")
8
+ @id=id
9
+ @x=x
10
+ @y=y
11
+ @pagenum=page_num
12
+ @page_layout=page_layout
13
+ @gtk_type=gtk_type
14
+ @editable=true
15
+ @width=width
16
+ @height=height
17
+ @text=text
18
+ @font=font
19
+ @dragging=false
20
+ @resizing=false
21
+ super()
22
+ @child=case gtk_type
23
+ when 'line','rectange' then Gtk::DrawingArea.new
24
+ when 'text' then Gtk::TextView.new#.set_editable(true).set_sensitive(true)
25
+ when 'list' then Gtk::Frame.new("list")
26
+ when 'image' then Gtk::Image.new(Gtk::Stock::MISSING_IMAGE,Gtk::IconSize::DIALOG)
27
+ else Gtk::Label.new("unknown object")
28
+ end
29
+ modify_font
30
+ @child.modify_base(Gtk::StateType::PRELIGHT,Gdk::Color.parse("#EFEFEF"))
31
+ @child.modify_base(Gtk::StateType::NORMAL,Gdk::Color.parse("#FBFBFB"))
32
+ set_text_alignment(text_alignment)
33
+ add(@child)
34
+ set_size_request(width,height)
35
+ set_can_focus(true)
36
+ set_visible_window(true)
37
+ set_border_width(0)
38
+ set_above_child(true)# unless @gtk_type == "text"
39
+ show_all
40
+ @child.signal_connect('expose-event'){|me,event|
41
+ case gtk_type
42
+ when 'line'
43
+ cr=me.window.create_cairo_context
44
+ cr.scale(print_editor.zoom,print_editor.zoom)
45
+ cr.move_to(0,0).line_to(@width,@height)
46
+ cr.stroke
47
+ when 'rectangle'
48
+ cr=me.window.create_cairo_context
49
+ cr.scale(print_editor.zoom,print_editor.zoom)
50
+ cr.rectangle(0,0,@width,@height)
51
+ cr.stroke
52
+ when 'text',"list","image"
53
+ else
54
+ edebug("unknown print-type: #{gtk_type}","printing","warning")
55
+ end
56
+ }
57
+ signal_connect('button-press-event'){|me,event|
58
+ if event.event_type == Gdk::Event::BUTTON2_PRESS then
59
+ set_above_child(false) if @gtk_type == "text"
60
+ else
61
+ print_editor.set_focused_item(self)
62
+ if event.state.control_mask?
63
+ @xshift=event.x
64
+ @yshift=event.y
65
+ @owidth=@width*zoom
66
+ @oheight=@height*zoom
67
+ @pX,@pY=parent.pointer
68
+ case event.button
69
+ when 1 then @dragging=true
70
+ when 2 then @resizing=true
71
+ end
72
+ end
73
+ end
74
+ true
75
+ }
76
+ signal_connect('motion-notify-event'){|me,event|
77
+ snap=5
78
+ if @dragging or @resizing
79
+ pe=print_editor
80
+ pe.set_focused_item(self)
81
+ px=parent.pointer[0]
82
+ py=parent.pointer[1]
83
+ if @dragging
84
+ info.item_x.set_value(((px-@xshift)/zoom/snap).round*snap)
85
+ info.item_y.set_value(((py-@yshift)/zoom/snap).round*snap)
86
+ end
87
+ if @resizing
88
+ info.item_width.set_value(((@owidth+px-@pX)/zoom/snap).round*snap)
89
+ info.item_height.set_value(((@oheight+py-@pY)/zoom/snap).round*snap)
90
+ end
91
+
92
+ end
93
+ }
94
+ signal_connect('button-release-event'){|me,event| @dragging=false;@resizing=false;}
95
+
96
+ end
97
+ attr_reader :id, :x, :y, :width, :height, :gtk_type, :pagenum, :font, :editable, :text_alignment
98
+ attr_reader :page_layout, :dragging, :drawing
99
+
100
+ def info
101
+ print_editor.info
102
+ end
103
+ def zoomed
104
+ move_me
105
+ set_size_request
106
+ end
107
+ def zoom
108
+ print_editor.zoom
109
+ end
110
+
111
+ def move_me(newx=@x,newy=@y,new_page=@page_num)
112
+ @x=newx
113
+ @y=newy
114
+ @page_num=new_page
115
+ page_layout.move(self)
116
+ end
117
+
118
+ def set_size_request(new_width=@width,new_height=@height)
119
+ if @gtk_type == "image" and !@image_iter.nil?
120
+ #image keep aspect ratio
121
+ im=DrbImages.instance.client_image_of_id(@image_iter[0])
122
+ if @width != new_width then
123
+ @width=new_width
124
+ @height=im.height*@width / im.width
125
+ info.item_height.set_value(@height)
126
+ else
127
+ @height=new_height
128
+ @width=im.width*@height / im.height
129
+ info.item_width.set_value(@width)
130
+ end
131
+ super(width*zoom,height*zoom)
132
+ @child.set_pixbuf(im.scale(@width*zoom,@height*zoom))
133
+ page_layout.print_editor.tips.set_tip(self,"#{im.width}x#{im.height} (#{sprintf('%.2f',@width / im.width)})",'extra hint')
134
+ else
135
+ #not image
136
+ @width=new_width
137
+ @height=new_height
138
+ super(width*zoom,height*zoom)
139
+ end
140
+ end
141
+
142
+ def text
143
+ case @gtk_type
144
+ when "text" then @text=text_to_mysql
145
+ when "list","image" then @text
146
+ else ""
147
+ end
148
+ end
149
+
150
+ def set_editable(editable)
151
+ if @gtk_type=="text"
152
+ @child.set_editable(editable)
153
+ @child.set_sensitive(editable)
154
+ end
155
+ self
156
+ end
157
+
158
+ def modify_font(new_font=@font)
159
+ if @gtk_type=="text"
160
+ @font=new_font
161
+ edebug("setting font :"+@font,"printing","info")
162
+ fontdesc=Pango::FontDescription.new(@font)
163
+ @child.modify_font(fontdesc) unless fontdesc.nil?
164
+ end
165
+ self
166
+ end
167
+ def set_text_alignment(na="left")
168
+ @text_alignment=na
169
+ if @gtk_type == "text"
170
+ @child.set_justification(
171
+ case na
172
+ when "right" then Gtk::Justification::RIGHT
173
+ when "center" then Gtk::Justification::CENTER
174
+ else Gtk::Justification::LEFT
175
+ end
176
+ )
177
+ end
178
+ end
179
+
180
+ def set_text(newtext=@text)
181
+ @text=newtext
182
+ case @gtk_type
183
+ when "text" then text_from_mysql(@text)
184
+ when "image" then
185
+ @image_iter=nil
186
+ info.item_image.model.each{|model,path,iter|
187
+ @image_iter=iter if @text.to_i == iter[0]
188
+ }
189
+ if @image_iter.nil?
190
+ @child=Gtk::Image.new(Gtk::Stock::MISSING_IMAGE,Gtk::IconSize::DIALOG)
191
+ else
192
+ @child.set_pixbuf(DrbImages.instance.client_image_of_id(@image_iter[0]).scale(@width,@height))
193
+ end
194
+ end
195
+ self
196
+ end
197
+
198
+ def unfocus
199
+ @dragging=false
200
+ set_state(Gtk::STATE_NORMAL)
201
+ set_above_child(true)
202
+ edebug("deselected","printing","info")
203
+ end
204
+
205
+ def to_mysql
206
+ if id.nil?
207
+ query("insert into gtkprintitems set printid='#{moditemid}', gtktype='#{gtk_type}', page_number='#{pagenum}', x='#{x}', y='#{y}', width='#{width}', height='#{height}', txt='#{text_to_mysql}', font='#{font}', text_alignment='#{text_alignment}'")
208
+ else
209
+ query("update gtkprintitems set printid='#{moditemid}', gtktype='#{gtk_type}', page_number='#{pagenum}', x='#{x}', y='#{y}', width='#{width}', height='#{height}', txt='#{text_to_mysql}', font='#{font}', text_alignment='#{text_alignment}' where id='#{id}'")
210
+ end
211
+ edebug("saved","printing","info")
212
+ end
213
+
214
+ def remove_from_mysql
215
+ query("delete from gtkprintitems where id='#{id}'")
216
+ edebug("deleted","printing","info")
217
+ end
218
+
219
+ def moditemid
220
+ print_editor.moditemid
221
+ end
222
+
223
+ def print_editor
224
+ @page_layout.print_editor
225
+ end
226
+
227
+ def text_from_mysql(nt=text)
228
+ if @gtk_type=="text"
229
+ ont=nt.clone
230
+ mydata=get_ancestor(WysiwygPrintEditor).mydata
231
+ found=false
232
+ while first=nt.index("{")
233
+ found=true
234
+ @child.buffer.insert_at_cursor(nt[0 .. first-1]) if first >= 1
235
+ if last=nt[first .. nt.length].index("}")
236
+ last=last+first
237
+ datak=nt[first+1 .. last-1]
238
+ if mydata.has_key?(datak)
239
+ mydata[datak]="N/A" if mydata[datak].nil? || mydata[datak] == ""
240
+ edebug("has key: [#{datak}] -> [#{mydata[datak]}]","printing","debug")
241
+ unless tag = @child.buffer.tag_table.lookup(datak)
242
+ tag=Gtk::TextTag.new(datak).set_foreground_gdk(Gdk::Color.new(65000,0,0))
243
+ @child.buffer.tag_table.add(tag)
244
+ end
245
+ @child.buffer.insert_at_cursor(mydata[datak])
246
+ bounds=@child.buffer.selection_bounds
247
+ bounds[0].backward_cursor_positions(mydata[datak].length)
248
+ @child.buffer.apply_tag(tag,bounds[0],bounds[1])
249
+ nt=nt[last+1 .. nt.length+1]
250
+ else
251
+ edebug("no key: #{datak}","printing","debug")
252
+ @child.buffer.insert_at_cursor(datak)
253
+ nt=nt[last+1 .. nt.length+1]
254
+ end
255
+ else
256
+ nt=nt[first+1 .. nt.length+1]
257
+ @child.buffer.insert_at_cursor("{"+nt)
258
+ end
259
+ end
260
+
261
+ @child.buffer.insert_at_cursor(nt) if nt.length>0
262
+ edebug("from_mysql: [#{ont}] -> buffer: [#{@child.buffer.text}]","printing","debug")
263
+ end
264
+ end
265
+
266
+ def text_to_mysql
267
+ if @gtk_type=="text"
268
+ i=@child.buffer.bounds[0]
269
+ tag="start"
270
+ plast=nil
271
+ while !tag.nil?
272
+ tag=nil
273
+ first=nil
274
+ if i.begins_tag?(nil) then
275
+ first=i.offset;
276
+ tag=i.toggled_tags(true)[0]
277
+ else
278
+ if i.forward_to_tag_toggle(nil) then
279
+ first=i.offset
280
+ tag=i.toggled_tags(true)[0]
281
+ end
282
+ end
283
+ if tag and i.forward_to_tag_toggle(tag) then last=i.offset;end
284
+ unless tag.nil?
285
+ if plast.nil?
286
+ ret=@child.buffer.get_text(@child.buffer.bounds[0],@child.buffer.get_iter_at_offset(first))
287
+ else
288
+ ret="#{ret}#{@child.buffer.get_text(@child.buffer.get_iter_at_offset(plast),@child.buffer.get_iter_at_offset(first))}"
289
+ end
290
+ ret="#{ret}{#{tag.name}}"
291
+ plast=last
292
+ end
293
+ end
294
+ if plast.nil?
295
+ ret=@child.buffer.text
296
+ else
297
+ ret="#{ret}#{@child.buffer.get_text(@child.buffer.get_iter_at_offset(plast),@child.buffer.bounds[1])}"
298
+ end
299
+ edebug("to_mysql: [#{@child.buffer.text}] -> [#{ret}]","printing","debug")
300
+ else
301
+ ret=text
302
+ end
303
+ ret
304
+ end
305
+
306
+ def to_s
307
+ "PrintItem{#{@gtk_type},id:#{id}}"
308
+ end
309
+ end
310
+
@@ -0,0 +1,195 @@
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
+
6
+
7
+ class WysiwygPrintEditor < Gtk::Window
8
+ include ManqodCommon
9
+ include Conf
10
+ def initialize(caller,moditemid)
11
+ @zoom=1
12
+ @caller=caller
13
+ @focused_item=nil
14
+ @moditemid=moditemid
15
+ @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}'")
16
+ @sql=@moditem["sql"]
17
+ @sql=@moditem["querysql"] if @moditem["querysql"].length>5
18
+ # lastwhere=@sql.rindex("where")-1 or @sql.length
19
+ # @sql=@sql[0 .. lastwhere]+" order by id desc limit 1"
20
+ @sql="#{@sql} limit 1"
21
+ myres=client.query(@sql)
22
+
23
+ @mydata=if myres then myres.fetch_hash(true) else Hash.new end
24
+ @mydata=Hash.new if @mydata.nil?
25
+
26
+ @page_setup=Gtk::PageSetup.new
27
+ page_setup.paper_size=Gtk::PaperSize.new(@moditem["paper_size_name"])
28
+ page_setup.orientation=case @moditem["orientation"]
29
+ when "portrait" then Gtk::PrintSettings::PageOrientation::PORTRAIT
30
+ when "reverse_portrait" then Gtk::PrintSettings::PageOrientation::REVERSE_PORTRAIT
31
+ when "landscape" then Gtk::PrintSettings::PageOrientation::LANDSCAPE
32
+ when "reverse_landscape" then Gtk::PrintSettings::PageOrientation::REVERSE_LANDSCAPE
33
+ else Gtk::PrintSettings::PageOrientation::PORTRAIT
34
+ end
35
+ page_setup.set_left_margin(@moditem["left_margin"].to_f,Gtk::PaperSize::UNIT_MM) if !@moditem["left_margin"].nil?
36
+ page_setup.set_right_margin(@moditem["right_margin"].to_f,Gtk::PaperSize::UNIT_MM) if !@moditem["right_margin"].nil?
37
+ page_setup.set_top_margin(@moditem["top_margin"].to_f,Gtk::PaperSize::UNIT_MM) if !@moditem["top_margin"].nil?
38
+ page_setup.set_bottom_margin(@moditem["bottom_margin"].to_f,Gtk::PaperSize::UNIT_MM) if !@moditem["bottom_margin"].nil?
39
+ super()
40
+ realize
41
+ @tips=Gtk::Tooltips.new.enable
42
+ set_title("WYSIWYG Print Editor - "+@moditem["display"])
43
+ maximize
44
+ @tabs=Gtk::Notebook.new
45
+
46
+ is=Gtk::IconSize.from_name(get_conf(0,0,"button-size"))
47
+ #item buttons
48
+ buttons=Gtk::Toolbar.new
49
+ buttons.append(Gtk::VSeparator.new)
50
+ buttons.append("text",nil,nil,Gtk::Image.new(Gtk::Stock::ADD,is)){set_focused_item(nth_page(tabs.page).put(@tabs.page,'text')) if tabs.page>-1}
51
+ buttons.append("line",nil,nil,Gtk::Image.new(Gtk::Stock::ADD,is)){set_focused_item(nth_page(tabs.page).put(@tabs.page,'line')) if tabs.page>-1}
52
+ buttons.append("rectangle",nil,nil,Gtk::Image.new(Gtk::Stock::ADD,is)){set_focused_item(nth_page(tabs.page).put(@tabs.page,'rectangle')) if tabs.page>-1}
53
+ buttons.append("list",nil,nil,Gtk::Image.new(Gtk::Stock::ADD,is)){set_focused_item(nth_page(tabs.page).put(@tabs.page,'list')) if tabs.page>-1}
54
+ buttons.append("image",nil,nil,Gtk::Image.new(Gtk::Stock::ADD,is)){set_focused_item(nth_page(tabs.page).put(@tabs.page,'image')) if tabs.page>-1}
55
+ buttons.append(Gtk::VSeparator.new)
56
+ buttons.append("clone",nil,nil,Gtk::Image.new(Gtk::Stock::COPY,is)){
57
+ set_focused_item(nth_page(tabs.page).put(@tabs.page,@focused_item.gtk_type,nil,@focused_item.x+@info.clone_x.value,@focused_item.y+@info.clone_y.value,@focused_item.width,@focused_item.height,@focused_item.text,@focused_item.font,@focused_item.text_alignment)) if tabs.page>-1 && @focused_item
58
+ }
59
+ buttons.append(Gtk::VSeparator.new)
60
+ buttons.append("remove",nil,nil,Gtk::Image.new(Gtk::Stock::DELETE,is)){
61
+ unless focused_item.nil?
62
+ edebug("removing #{focused_item}","printing","info")
63
+ focused_item.remove_from_mysql
64
+ focused_item.page_layout.remove(focused_item)
65
+ set_focused_item(nil)
66
+ end
67
+ }
68
+ buttons.append(Gtk::VSeparator.new)
69
+
70
+ #page buttons
71
+ buttons.append("page",nil,nil,Gtk::Image.new(Gtk::Stock::ADD,is)){
72
+ tabs.append_page(lay=PageLayout.new(self),Gtk::Label.new("page "+(tabs.n_pages+1).to_s))
73
+ tabs.show_all
74
+ }
75
+ buttons.append("page",nil,nil,Gtk::Image.new(Gtk::Stock::REMOVE,is)){
76
+ tabs.remove_page(tabs.page)
77
+ }
78
+
79
+ buttons.append('setup',nil,nil,Gtk::Image.new(Gtk::Stock::PRINT,Gtk::IconSize.from_name(get_conf(0,0,"button-size")))){
80
+ @page_setup=Gtk::PrintOperation.run_page_setup_dialog(self.get_ancestor(Gtk::Window), page_setup)
81
+ nth_page(tabs.page).clear
82
+ }
83
+ buttons.append(Gtk::VSeparator.new)
84
+ #common buttons
85
+ buttons.append("20%",nil,nil,Gtk::Image.new(Gtk::Stock::ZOOM_IN,is)){
86
+ @zoom+=0.2 unless @zoom>5
87
+ @tabs.each{|page| page.clear}
88
+ }
89
+ buttons.append("100%",nil,nil,Gtk::Image.new(Gtk::Stock::ZOOM_100,is)){
90
+ @zoom=1
91
+ @tabs.each{|page| page.clear}
92
+ }
93
+ buttons.append("20%",nil,nil,Gtk::Image.new(Gtk::Stock::ZOOM_OUT,is)){
94
+ @zoom-=0.2 unless @zoom<0.5
95
+ @tabs.each{|page| page.clear}
96
+ }
97
+
98
+ buttons.append('preview',nil,nil,Gtk::Image.new(Gtk::Stock::PRINT,Gtk::IconSize.from_name(get_conf(0,0,"button-size")))){
99
+ to_mysql
100
+ if testp=MyPrintOperation.new(self,moditemid)
101
+ testp.run(Gtk::PrintOperation::ACTION_PREVIEW)
102
+ end
103
+ }
104
+ buttons.append('close',nil,nil,Gtk::Image.new(Gtk::Stock::CLOSE,Gtk::IconSize.from_name(get_conf(0,0,"button-size")))){
105
+ self.destroy
106
+ }
107
+ buttons.append(Gtk::VSeparator.new)
108
+ signal_connect("destroy"){|me,ev| to_mysql}
109
+
110
+ @info=LayItemInfo.new.set_width_request(200)
111
+
112
+ tab_holder=Gtk::HPaned.new#(false,0)
113
+ tab_holder.pack1(tabs,true,true)
114
+ tab_holder.pack2(info,false,false)
115
+
116
+ holder=Gtk::VBox.new(false,1)
117
+ holder.pack_start(tab_holder,true,true,0)
118
+ holder.pack_end(buttons,false,false,0)
119
+
120
+ add(holder)
121
+ self
122
+ end
123
+ attr_accessor :caller
124
+ attr_accessor :tabs
125
+ attr_accessor :focused_item
126
+ attr_accessor :mydata
127
+ attr_accessor :moditemid
128
+ attr_accessor :page_setup
129
+ attr_accessor :info, :zoom, :tips
130
+
131
+ def set_focused_item(item)
132
+ return if focused_item == item
133
+ focused_item.unfocus unless focused_item.nil?
134
+ @focused_item=item
135
+ if focused_item.nil?
136
+ set_focus_child(nil)
137
+ else
138
+ focused_item.set_state(Gtk::STATE_PRELIGHT)
139
+ focused_item.set_editable(true)
140
+ focused_item.set_has_focus(true)
141
+ set_focus_child(focused_item)
142
+ edebug(focused_item.text+" selected","printing","info")
143
+ end
144
+ info.update(focused_item)
145
+ focused_item
146
+ end
147
+
148
+ def run
149
+ item_res=query("select * from gtkprintitems where printid='#{@moditemid}' order by page_number,gtktype")
150
+ page_num=0
151
+ while itemdata=item_res.fetch_hash()
152
+ while nth_page(itemdata["page_number"].to_i).nil?
153
+ page_num+=1
154
+ page=tabs.append_page(lay=PageLayout.new(self),Gtk::Label.new("page #{page_num}"))
155
+ end
156
+ nth_page(itemdata["page_number"].to_i).put(itemdata["page_number"],itemdata["gtktype"],itemdata["id"],itemdata["x"].to_i,itemdata["y"].to_i,itemdata["width"].to_i,itemdata["height"].to_i,itemdata["txt"],itemdata["font"],itemdata["text_alignment"])
157
+ end
158
+ show_all
159
+ info.update(focused_item)
160
+ end
161
+
162
+ def nth_page(page_no)
163
+ ret=tabs.get_nth_page(page_no.to_i)
164
+ end
165
+
166
+ def to_mysql
167
+ #=Gtk::PaperSize.new(@moditem["paper_size_name"])
168
+ $sql="replace into gtkprintpages set moditem_id='#{moditemid}', paper_size_name='#{page_setup.paper_size.name}', orientation='#{
169
+ case page_setup.orientation
170
+ when Gtk::PrintSettings::PageOrientation::PORTRAIT then "portrait"
171
+ when Gtk::PrintSettings::PageOrientation::REVERSE_PORTRAIT then "reverse_portrait"
172
+ when Gtk::PrintSettings::PageOrientation::LANDSCAPE then "landscape"
173
+ when Gtk::PrintSettings::PageOrientation::REVERSE_LANDSCAPE then "reverse_landscape"
174
+ else "portrait"
175
+ end}',
176
+ left_margin='#{page_setup.get_left_margin(Gtk::PaperSize::UNIT_MM)}',"+
177
+ "right_margin='#{page_setup.get_right_margin(Gtk::PaperSize::UNIT_MM)}',"+
178
+ "top_margin='#{page_setup.get_top_margin(Gtk::PaperSize::UNIT_MM)}',"+
179
+ "bottom_margin='#{page_setup.get_bottom_margin(Gtk::PaperSize::UNIT_MM)}'"
180
+ query($sql)
181
+ edebug("saved","printing","info")
182
+ page_num=0
183
+ tabs.each{|tab|
184
+ nth_page(page_num).to_mysql unless nth_page(page_num).nil?
185
+ page_num+=1
186
+ }
187
+ end
188
+
189
+ def to_s
190
+ "WysiwygPrintEditor"
191
+ end
192
+ def inspect
193
+ to_s
194
+ end
195
+ end
@@ -0,0 +1,91 @@
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 RField < Gtk::ToggleButton
6
+ def initialize(table,field=nil)
7
+ @table=table
8
+ super("",false)
9
+ remove(child)
10
+ @label=Gtk::Label.new
11
+ set_child(@index_holder=Gtk::Table.new(5,2))
12
+ set_field(field)
13
+ signal_connect("toggled"){|me,ev| @table.parentM.changed(self)}
14
+ signal_connect('button-press-event'){|me,ev|
15
+ if ev.button == 3
16
+ @table.parentM.set_focused_item(@table)
17
+ menu=Gtk::Menu.new
18
+ menu.signal_connect("deactivate",self){|menu,table| @table.parentM.set_focused_item(nil)}
19
+ menu.append(pr=Gtk::ImageMenuItem.new("`#{field_name}` properties").set_image(Gtk::Image.new(Gtk::Stock::PROPERTIES,Gtk::IconSize::MENU)))
20
+ pr.signal_connect("activate"){|me| @table.alter_field(@field)}
21
+ if @table.parentM.rel_ed_status == :start
22
+ menu.append(re=Gtk::ImageMenuItem.new("finish add relation here `#{field_name}`").set_image(Gtk::Image.new(Gtk::Stock::CONNECT,Gtk::IconSize::MENU)))
23
+ re.signal_connect("activate"){|me| @table.parentM.rel_edit(self,:finish)}
24
+ menu.append(rc=Gtk::ImageMenuItem.new("cancel relation").set_image(Gtk::Image.new(Gtk::Stock::CANCEL,Gtk::IconSize::MENU)))
25
+ rc.signal_connect("activate"){|me| @table.parentM.rel_edit(self,:cancel)}
26
+ else
27
+ menu.append(re=Gtk::ImageMenuItem.new("start add relation here `#{field_name}`").set_image(Gtk::Image.new(Gtk::Stock::CONNECT,Gtk::IconSize::MENU)))
28
+ re.signal_connect("activate"){|me| @table.parentM.rel_edit(self,:start)}
29
+ end
30
+ menu.append(rf=Gtk::ImageMenuItem.new("remove field `#{field_name}`").set_image(Gtk::Image.new(Gtk::Stock::REMOVE,Gtk::IconSize::MENU)))
31
+ rf.signal_connect("activate"){|me| @table.remove_field(field_name)}
32
+ menu.append(afa=Gtk::ImageMenuItem.new("append field after `#{field_name}`").set_image(Gtk::Image.new(Gtk::Stock::ADD,Gtk::IconSize::MENU)))
33
+ afa.signal_connect("activate"){|me| @table.alter_field(nil,field_name)}
34
+ menu.show_all
35
+ menu.popup(nil,nil,ev.button,ev.time)
36
+ true
37
+ else
38
+ false
39
+ end
40
+ }
41
+ end
42
+ attr_reader :field, :table
43
+
44
+ def set_field(field)
45
+ @field=field
46
+ @label.set_label(field["Field"])
47
+ if f=@field["Type"].index("(")
48
+ @field["Size"]=field["Type"][f+1 .. field["Type"].index(")") -1]
49
+ @field["Type"]=field["Type"][0 .. f-1]
50
+ end
51
+
52
+ #set style
53
+ set_style(@table.parentM.field_style[@field["Type"]]) if @table.parentM.field_style.has_key?(@field["Type"])
54
+ #remove old images
55
+ @index_holder.children.each{|ch| @index_holder.remove(ch)}
56
+ #read label
57
+ @index_holder.attach(@label,0,1,0,2)
58
+ #add images
59
+ @table.indexes.each{|index|
60
+ n=@index_holder.children.size-1
61
+ if index["field"]==@field["Field"]
62
+ @index_holder.attach(Gtk::Image.new(if index["name"]=="PRIMARY"
63
+ then @table.parentM.img_primary.scale(10,10)
64
+ else if index["unique"]
65
+ then @table.parentM.img_unique.scale(10,10)
66
+ else @table.parentM.img_index.scale(10,10)
67
+ end
68
+ end),1+n/2,1+n/2+1,n%2,n%2+1,Gtk::SHRINK)
69
+ end
70
+ }
71
+ show_all
72
+ end
73
+
74
+ def field_name
75
+ @field["Field"] || "undefined"
76
+ end
77
+ def table_name
78
+ @table.table
79
+ end
80
+ def table_width
81
+ @table.widget.allocation.width
82
+ end
83
+
84
+ def inspect
85
+ "RField:#{field_name} of #{table}"
86
+ end
87
+ def to_s
88
+ inspect
89
+ end
90
+ end
91
+