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,56 @@
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 ColumnsHeaderLayout
6
+ def initialize(pop,cr,columns,h_font)
7
+ @header_height=0
8
+ @y=0
9
+ @header_layouts=Hash.new
10
+ @pop=pop
11
+ columns.each{|col|
12
+ if col.printable?
13
+ text_cell = cr.create_pango_layout
14
+ text_cell.set_font_description(Pango::FontDescription.new(h_font)).set_width((pop.column_width[col.data]-@pop.header_line_width*2)*Pango::SCALE)
15
+ text_cell.set_alignment(col.pango_layout_alignment)
16
+ text_cell.set_wrap(Pango::Layout::WRAP_WORD_CHAR).set_ellipsize(Pango::Layout::ELLIPSIZE_NONE)
17
+ #set_alignment(Pango::Layout::ALIGN_CENTER).
18
+ text_cell.set_text(col.text)
19
+ text_cell_text_height = text_cell.size[1].to_f / Pango::SCALE
20
+ text_cell_text_width = text_cell.size[0].to_f / Pango::SCALE
21
+ @header_height = text_cell_text_height+@pop.header_line_width*2 if @header_height < text_cell_text_height+@pop.header_line_width*2
22
+ header_layouts[col.data]=text_cell
23
+ end
24
+ }
25
+ @header_height = @header_height + @pop.header_line_width
26
+ end
27
+ attr_accessor :header_height, :y, :header_layouts
28
+
29
+ def height
30
+ @header_height
31
+ end
32
+ def set_y(newY)
33
+ @y=newY
34
+ self
35
+ end
36
+
37
+ def draw(cr)
38
+ header_layouts.each_pair{|key,layout|
39
+ if @pop.draw_header_cell_borders
40
+ cr.set_line_width(@pop.header_line_width)
41
+ cr.rectangle(@pop.column_pos[key],y,@pop.column_width[key],header_height)
42
+ if @pop.fill_header_background
43
+ cr.move_to(@pop.column_pos[key]+@pop.header_line_width+3,y+@pop.header_line_width+3)
44
+ cr.set_source_rgb(0.9,0.9,0.9)
45
+ cr.fill_preserve()
46
+ cr.set_source_rgb(0,0,0)
47
+ end
48
+ end
49
+ cr.move_to(@pop.column_pos[key]+@pop.header_line_width,y+@pop.header_line_width)
50
+ cr.show_pango_layout(layout)
51
+ cr.stroke
52
+ }
53
+ cr.stroke
54
+ end
55
+ end
56
+
@@ -0,0 +1,100 @@
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 CustomPageSetup < Gtk::Table
6
+ def initialize(pop)
7
+ @pop=pop
8
+ @page_setup=@pop.default_page_setup
9
+ super(4,4,false)
10
+ set_border_width(10)
11
+ set_row_spacings(5)
12
+ set_column_spacings(5)
13
+
14
+ #orientation
15
+ ochooser=Gtk::VBox.new(true)
16
+
17
+ ochooser.pack_start(pch=Gtk::RadioButton.new(Gtk::Stock::ORIENTATION_PORTRAIT).set_active(page_setup.orientation==Gtk::PrintSettings::ORIENTATION_PORTRAIT))
18
+ pch.signal_connect("toggled"){|me| page_setup.set_orientation(Gtk::PrintSettings::ORIENTATION_PORTRAIT) if me.active?}
19
+
20
+ ochooser.pack_start(lch=Gtk::RadioButton.new(pch,Gtk::Stock::ORIENTATION_LANDSCAPE).set_active(page_setup.orientation==Gtk::PrintSettings::ORIENTATION_LANDSCAPE))
21
+ lch.signal_connect("toggled"){|me| page_setup.set_orientation(Gtk::PrintSettings::ORIENTATION_LANDSCAPE) if me.active?}
22
+
23
+ ochooser.pack_start(rlch=Gtk::RadioButton.new(pch,Gtk::Stock::ORIENTATION_REVERSE_LANDSCAPE).set_active(page_setup.orientation==Gtk::PrintSettings::ORIENTATION_REVERSE_LANDSCAPE))
24
+ rlch.signal_connect("toggled"){|me| page_setup.set_orientation(Gtk::PrintSettings::ORIENTATION_REVERSE_LANDSCAPE) if me.active?}
25
+
26
+ ochooser.pack_start(rpch=Gtk::RadioButton.new(pch,Gtk::Stock::ORIENTATION_REVERSE_PORTRAIT).set_active(page_setup.orientation==Gtk::PrintSettings::ORIENTATION_REVERSE_PORTRAIT))
27
+ rpch.signal_connect("toggled"){|me| page_setup.set_orientation(Gtk::PrintSettings::ORIENTATION_REVERSE_PORTRAIT) if me.active?}
28
+
29
+ #format
30
+ pchooser=Gtk::VBox.new(true)
31
+ pchooser.pack_start(a3=Gtk::RadioButton.new("A3").set_active(page_setup.paper_size.name==Gtk::PaperSize::A3))
32
+ a3.signal_connect("toggled"){|me| page_setup.set_paper_size_and_default_margins(Gtk::PaperSize.new(Gtk::PaperSize::A3)) if me.active?}
33
+
34
+ pchooser.pack_start(a4=Gtk::RadioButton.new(a3,"A4").set_active(page_setup.paper_size.name==Gtk::PaperSize::A4))
35
+ a4.signal_connect("toggled"){|me| page_setup.set_paper_size_and_default_margins(Gtk::PaperSize.new(Gtk::PaperSize::A4)) if me.active?}
36
+
37
+ pchooser.pack_start(a5=Gtk::RadioButton.new(a3,"A5").set_active(page_setup.paper_size.name==Gtk::PaperSize::A5))
38
+ a5.signal_connect("toggled"){|me,ps| page_setup.set_paper_size_and_default_margins(Gtk::PaperSize.new(Gtk::PaperSize::A5)) if me.active?}
39
+
40
+ pchooser.pack_start(b5=Gtk::RadioButton.new(a3,"B5").set_active(page_setup.paper_size.name==Gtk::PaperSize::B5))
41
+ b5.signal_connect("toggled"){|me| page_setup.set_paper_size_and_default_margins(Gtk::PaperSize.new(Gtk::PaperSize::B5)) if me.active?}
42
+
43
+ pchooser.pack_start(executive=Gtk::RadioButton.new(a3,"executive").set_active(page_setup.paper_size.name==Gtk::PaperSize::EXECUTIVE))
44
+ executive.signal_connect("toggled"){|me| page_setup.set_paper_size_and_default_margins(Gtk::PaperSize.new(Gtk::PaperSize::EXECUTIVE)) if me.active?}
45
+
46
+ pchooser.pack_start(legal=Gtk::RadioButton.new(a3,"legal").set_active(page_setup.paper_size.name==Gtk::PaperSize::LEGAL))
47
+ legal.signal_connect("toggled"){|me| page_setup.set_paper_size_and_default_margins(Gtk::PaperSize.new(Gtk::PaperSize::LEGAL)) if me.active?}
48
+
49
+ pchooser.pack_start(letter=Gtk::RadioButton.new(a3,"letter").set_active(page_setup.paper_size.name==Gtk::PaperSize::LETTER))
50
+ letter.signal_connect("toggled"){|me| page_setup.set_paper_size_and_default_margins(Gtk::PaperSize.new(Gtk::PaperSize::LETTER)) if me.active?}
51
+
52
+ # margins=Gtk::Table.new(2,2)
53
+ # margins.attach(topm=Gtk::SpinButton.new(0,10,0.1),0,1,0,1,Gtk::FILL,Gtk::FILL)
54
+ # topm.signal_connect("value-changed",@page_setup){|me,arg1,ps| ps.
55
+
56
+ #page_setup
57
+ page_setup_b=Gtk::Button.new("change")
58
+ page_setup_b.signal_connect("clicked"){|b|
59
+ @page_setup=Gtk::PrintOperation.run_page_setup_dialog(get_ancestor(Gtk::Window), @page_setup)
60
+ }
61
+
62
+ #custom print settings like line on header/footer
63
+ csettings=Gtk::VBox.new(false)
64
+ csettings.pack_start(draw_header_line=Gtk::CheckButton.new("draw header line").set_active(@pop.draw_header_line))
65
+ draw_header_line.signal_connect("toggled"){|me| @pop.draw_header_line=me.active?}
66
+ csettings.pack_start(draw_footer_line=Gtk::CheckButton.new("draw footer line").set_active(@pop.draw_footer_line))
67
+ draw_footer_line.signal_connect("toggled"){|me| @pop.draw_footer_line=me.active?}
68
+ csettings.pack_start(draw_header_background=Gtk::CheckButton.new("draw header background").set_active(@pop.draw_header_background))
69
+ draw_header_background.signal_connect("toggled"){|me| @pop.draw_header_background=me.active?}
70
+ csettings.pack_start(print_date=Gtk::CheckButton.new("print date").set_active(@pop.print_date))
71
+ print_date.signal_connect("toggled"){|me| @pop.print_date=me.active?}
72
+
73
+ csettings.pack_start(font_table=Gtk::Table.new(5,2,false))
74
+ font_table.attach(Gtk::Label.new("header font"),0,1,0,1).attach(header_font=Gtk::FontButton.new(@pop.header_font),1,2,0,1)
75
+ header_font.signal_connect("font-set"){|me| @pop.header_font=me.font_name}
76
+
77
+ font_table.attach(Gtk::Label.new("date font"),0,1,1,2).attach(date_font=Gtk::FontButton.new(@pop.date_font),1,2,1,2)
78
+ date_font.signal_connect("font-set"){|me| @pop.date_font=me.font_name}
79
+
80
+ font_table.attach(Gtk::Label.new("footer font"),0,1,2,3).attach(header_font=Gtk::FontButton.new(@pop.footer_font),1,2,2,3)
81
+ header_font.signal_connect("font-set"){|me| @pop.footer_font=me.font_name}
82
+
83
+ font_table.attach(Gtk::Label.new("column header font"),0,1,3,4).attach(column_header_font=Gtk::FontButton.new(@pop.column_header_font),1,2,3,4)
84
+ column_header_font.signal_connect("font-set"){|me| @pop.column_header_font=me.font_name}
85
+
86
+ font_table.attach(Gtk::Label.new("cell font"),0,1,4,5).attach(cell_font=Gtk::FontButton.new(@pop.cell_font),1,2,4,5)
87
+ cell_font.signal_connect("font-set"){|me| @pop.cell_font=me.font_name}
88
+
89
+
90
+
91
+ attach(Gtk::Frame.new("Orientation").set_child(ochooser).set_shadow_type(Gtk::ShadowType::NONE),0,1,0,1,Gtk::FILL,Gtk::FILL)
92
+ attach(Gtk::Frame.new("Paper size").set_child(pchooser).set_shadow_type(Gtk::ShadowType::NONE),1,2,0,1,Gtk::FILL,Gtk::FILL)
93
+ attach(Gtk::Frame.new("Print setup").set_child(page_setup_b).set_shadow_type(Gtk::ShadowType::NONE),0,1,1,2,Gtk::FILL,Gtk::FILL)
94
+ attach(Gtk::Frame.new("Custom settings").set_child(csettings).set_shadow_type(Gtk::ShadowType::NONE),1,2,1,2,Gtk::FILL,Gtk::FILL)
95
+ show_all
96
+ end
97
+ attr_accessor :page_setup
98
+
99
+ end
100
+
@@ -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 FooterLayout
6
+ def initialize(cr,pop)
7
+ @pop=pop
8
+ @layout=cr.create_pango_layout
9
+ layout.set_text("00").set_width(@pop.pango_width).set_alignment(Pango::Layout::ALIGN_CENTER)
10
+ @y = @pop.height-layout.size[1]/Pango::SCALE-cr.line_width-1
11
+ edebug("footer_position: #{@y}","printing","debug")
12
+ end
13
+ attr_accessor :y, :layout
14
+
15
+ def draw(cr,page_num)
16
+ layout.set_text((page_num+1).to_s + " / "+ @pop.n_pages.to_s).set_font_description(Pango::FontDescription.new(@pop.footer_font))
17
+ if @pop.draw_footer_line
18
+ cr.set_line_width(@pop.footer_line_width)
19
+ cr.move_to(0,y)
20
+ cr.line_to(@pop.width,y)
21
+ end
22
+ cr.move_to(0,y+cr.line_width+1)
23
+ cr.show_pango_layout(layout)
24
+ end
25
+ end
26
+
@@ -0,0 +1,35 @@
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 HeaderLayout
6
+ def initialize(cr,pop)
7
+ @pop=pop
8
+ @layout = cr.create_pango_layout
9
+ layout.set_text(pop.list.title).set_width(@pop.pango_width)
10
+ layout.set_font_description(Pango::FontDescription.new(@pop.header_font))
11
+ layout.set_wrap(Pango::Layout::WRAP_WORD).set_ellipsize(Pango::Layout::ELLIPSIZE_NONE).set_single_paragraph_mode(true)
12
+ layout.set_alignment(Pango::Layout::Alignment::CENTER)
13
+
14
+ @tlayout = cr.create_pango_layout
15
+ tlayout.set_text(Time.new.strftime("%m/%d/%Y")).set_width(@pop.pango_width).set_alignment(Pango::Layout::ALIGN_RIGHT)
16
+ tlayout.set_font_description(Pango::FontDescription.new(@pop.date_font))
17
+ tlayout.set_wrap(Pango::Layout::WRAP_WORD).set_ellipsize(Pango::Layout::ELLIPSIZE_NONE)
18
+
19
+ @height=2*layout.size[1]/Pango::SCALE+cr.line_width*3
20
+ end
21
+ attr_accessor :height, :layout, :tlayout
22
+
23
+ def draw(cr)
24
+ cr.move_to(0,0) #position on begining of page
25
+ cr.show_pango_layout(layout) #draw header
26
+ cr.show_pango_layout(tlayout) if @pop.print_date
27
+ if @pop.draw_header_line
28
+ cr.set_line_width(@pop.header_line_width)
29
+ cr.move_to(0,2*layout.size[1]/Pango::SCALE+cr.line_width) #move below header
30
+ cr.line_to(@pop.width,2*layout.size[1]/Pango::SCALE+cr.line_width) #draw the line
31
+ end
32
+ cr.stroke
33
+ end
34
+ end
35
+
@@ -0,0 +1,89 @@
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 IterLayout
6
+ include ManqodCommon
7
+ def initialize(cr,iter,columns,pop,font)
8
+ @row_height=0
9
+ @page=0
10
+ @y=0
11
+ @pop=pop
12
+ @cell_layouts=Hash.new
13
+ @insptext=""
14
+ @cr=cr
15
+ @crlw=0
16
+ #create the layouts for the cells, and find out the highest cell
17
+ columns.each{|col|
18
+ if col.printable?
19
+ text_cell = cr.create_pango_layout
20
+ text_cell.set_font_description(Pango::FontDescription.new(font)).set_width((pop.column_width[col.data]-@pop.cell_line_width)*Pango::SCALE)
21
+ text_cell.set_alignment(col.pango_layout_alignment)
22
+ text_cell.set_wrap(Pango::Layout::WRAP_WORD_CHAR).set_ellipsize(Pango::Layout::ELLIPSIZE_NONE)
23
+ text_to_display=case col.header["type"]
24
+ when "gtk_duration" then Time.at(iter[col.colnum] || 0).strftime(col.duration_format)
25
+ when "gtk_timestamp" then Time.at(iter[col.colnum] || 0).strftime(col.timestamp_format)
26
+ when "gtk_const_text" then col.renderer.get_display(iter[col.colnum].to_s)
27
+ when "gtk_const_combo","gtk_combo" then col.renderer.get_text_from_value(iter[col.colnum].to_s)
28
+ else
29
+ case col.data_type.to_s
30
+ when "Bignum","Integer","Float" then number_format(iter[col.colnum],col.decimals_attribute)
31
+ else iter[col.colnum].to_s
32
+ end
33
+ end
34
+ text_cell.set_text(text_to_display.to_s)
35
+ text_height = text_cell.size[1] / Pango::SCALE
36
+ @row_height = text_height+@pop.cell_line_width+@pop.row_underline if @row_height < text_height+@pop.cell_line_width+@pop.row_underline
37
+ cell_layouts[col.data] = text_cell
38
+ @insptext+="#{col.data_type}:#{text_cell.text}\t"
39
+ end
40
+ }
41
+ end
42
+ attr_accessor :page, :y, :pop, :cell_layouts, :row_height
43
+
44
+ def set_line_above(line_above)
45
+ if @line_above=line_above
46
+ @crlw=@pop.sum_line_width
47
+ @row_height=@row_height+@crlw*3
48
+ end
49
+ self
50
+ end
51
+
52
+ def height
53
+ @row_height
54
+ end
55
+ def set_y(newY)
56
+ @y=newY
57
+ self
58
+ end
59
+
60
+ def draw(cr)
61
+ min_x=60000
62
+ max_x=0
63
+ cell_layouts.each_pair{|key,layout|
64
+ min_x=pop.column_pos[key] if min_x>pop.column_pos[key]
65
+ max_x=pop.column_pos[key]+pop.column_width[key] if max_x<pop.column_pos[key]+pop.column_width[key]
66
+ cr.move_to(pop.column_pos[key]+@pop.cell_line_width,y+@crlw*3+@pop.cell_line_width)
67
+ cr.show_pango_layout(layout)
68
+ cr.stroke
69
+ }
70
+
71
+ if @line_above
72
+ cr.set_line_width(@pop.sum_line_width)
73
+ cr.move_to(min_x,y+@crlw)
74
+ cr.line_to(max_x,y+@crlw)
75
+ cr.stroke
76
+ end
77
+ if @pop.row_underline>0
78
+ cr.set_line_width(@pop.row_underline)
79
+ cr.move_to(min_x,y+@row_height)
80
+ cr.line_to(max_x,y+@row_height)
81
+ cr.stroke
82
+ end
83
+ end
84
+
85
+ def inspect
86
+ @insptext+"\theight=#{height}\ty=#{y}\tpage=#{page}"
87
+ end
88
+ end
89
+
@@ -0,0 +1,365 @@
1
+ #this file is part of manqod
2
+ #manqod is distributed under the CDDL licence
3
+ #the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)
4
+
5
+ module ListPrint
6
+ class ListPrintOperation < Gtk::PrintOperation
7
+ include Conf
8
+
9
+ def initialize(list)
10
+ @list=list
11
+ @print_sums=list.gtk_attribute("print_sums") || "true" =="true"
12
+ @sum_font=list.gtk_attribute("sum_font") || "verdana bold 6"
13
+ @cell_font=list.gtk_attribute("cell_font") || "verdana 6"
14
+ @columns_header_font=list.gtk_attribute("columns_header_font") || "verdana bold 6"
15
+ @header_font=list.gtk_attribute("header_font") || "verdana bold 10"
16
+ @footer_font=list.gtk_attribute("footer_font") || "verdana 6"
17
+ @date_font=list.gtk_attribute("date_font") || "verdana 5"
18
+ @print_date=list.gtk_attribute("print_date") || "true" == "true"
19
+ @row_spacing=(list.gtk_attribute("row_spacing") || 1.0).to_f
20
+ @column_spacing=(list.gtk_attribute("column_spacing") || 1.0).to_f
21
+ @draw_footer_line=list.gtk_attribute("draw_footer_line") || "true" == "true"
22
+ @line_above_parent=list.gtk_attribute("line_above_parent") || "true" == "true"
23
+ @draw_header_line=list.gtk_attribute("draw_header_line") || "true" == "true"
24
+ @draw_header_cell_borders=list.gtk_attribute("draw_header_cell_borders") || "true" == "true"
25
+ @fill_header_background=list.gtk_attribute("fill_header_background") || "true" == "true"
26
+ @row_underline=(list.gtk_attribute("row_underline") || 0.0).to_f
27
+
28
+ if @print_with_child=list.gtk_attribute("print_with_child")
29
+ @child_list=list.child_by_id(@print_with_child.to_i)
30
+ end
31
+ @print_sub_sums=list.gtk_attribute("print_sub_sums") || "true" == "true"
32
+ @child_indent=(list.gtk_attribute("child_indent") || 100).to_f
33
+ @child_cell_font=list.gtk_attribute("child_cell_font") || "verdana 5"
34
+ @child_sum_font=list.gtk_attribute("child_sum_font") || "verdana bold 5"
35
+ @child_columns_header_font=list.gtk_attribute("child_columns_header_font") || "verdana bold 5"
36
+
37
+ @header_line_width=(list.gtk_attribute("header_line_width") || 1.0).to_f
38
+ @footer_line_width=(list.gtk_attribute("footer_line_width") || 1.0).to_f
39
+ @cell_line_width=(list.gtk_attribute("cell_line_width") || 0.3).to_f
40
+ @sum_line_width=(list.gtk_attribute("sum_line_width") || 0.6).to_f
41
+
42
+ @line_width=1
43
+
44
+ super()
45
+ set_show_progress(true)
46
+ set_use_full_page(false)
47
+ set_unit(Gtk::PaperSize::UNIT_POINTS)
48
+
49
+ # n_pages=1
50
+
51
+
52
+ signal_connect("begin-print",@list) { |pop, context,list|
53
+ edebug("begin print","printing","info")
54
+ cr = context.cairo_context
55
+ cr.set_line_width(@line_width)
56
+ @height = context.page_setup.get_page_height(Gtk::PaperSize::UNIT_POINTS).to_f
57
+ @width = context.page_setup.get_page_width(Gtk::PaperSize::UNIT_POINTS).to_f
58
+
59
+ columns_width_sum=0.0
60
+ col_cnt=0
61
+ list.columns.each{|col|
62
+ if col.printable?
63
+ columns_width_sum+=col.width.to_f
64
+ col_cnt+=1
65
+ end
66
+ } #summ the width of all columns
67
+ coef=(width-col_cnt*@column_spacing)/columns_width_sum
68
+ edebug("colums width sum: #{columns_width_sum}","printing","info")
69
+
70
+ #@column_width will store the column positions on the context
71
+ @column_width=Hash.new
72
+ @column_pos=Hash.new
73
+ col_cur_pos=0.0
74
+ list.columns.each{|col|
75
+ if col.printable?
76
+ @column_pos[col.data]=col_cur_pos
77
+ @column_width[col.data]=col.width.to_f*coef
78
+ col_cur_pos+=@column_width[col.data]+@column_spacing
79
+ end
80
+ }
81
+ if child_list
82
+ columns_width_sum=@child_indent.to_f
83
+ col_cnt=0
84
+ child_list.columns.each{|col|
85
+ if col.printable?
86
+ columns_width_sum+=col.width.to_f
87
+ col_cnt+=1
88
+ end
89
+ } #summ the width of all columns
90
+ coef=(width-col_cnt*@column_spacing)/columns_width_sum
91
+ edebug("child colums width sum: #{columns_width_sum}","printing","info")
92
+
93
+ #@column_width will store the column positions on the context
94
+ col_cur_pos=@child_indent.to_f*coef
95
+ child_list.columns.each{|col|
96
+ if col.printable?
97
+ @column_pos[col.data]=col_cur_pos
98
+ @column_width[col.data]=col.width.to_f*coef
99
+ col_cur_pos+=@column_width[col.data]+@column_spacing
100
+ end
101
+ }
102
+ end
103
+
104
+
105
+
106
+ @current_height=0
107
+ @header=HeaderLayout.new(cr,self)
108
+ @current_height=@current_height+@header.height
109
+ @columns_header=ColumnsHeaderLayout.new(self,cr,list.columns,@columns_header_font)
110
+ @columns_header.y=@current_height
111
+ @current_height=@current_height+@columns_header.height+@row_spacing
112
+ if child_list
113
+ @child_columns_header=ColumnsHeaderLayout.new(self,cr,child_list.columns,@child_columns_header_font) if child_list
114
+ @child_columns_header.y=@current_height
115
+ @current_height=@current_height+@child_columns_header.height+@row_spacing
116
+ end
117
+ @headers_height=@current_height
118
+
119
+ @footer=FooterLayout.new(cr,self)
120
+
121
+ @iter_layouts = []
122
+
123
+ @sums=Hash.new
124
+ list.columns.each{|col| @sums[col.colnum]=0 if col.summable?}
125
+
126
+ if child_list
127
+ if print_sub_sums
128
+ @sub_sums=Hash.new
129
+ child_list.columns.each{|col| @sub_sums[col.colnum]=0 if col.summable?}
130
+ end
131
+ @citer=nil
132
+ end
133
+
134
+ @piter=nil
135
+ #list.model.iter_first
136
+ @past_last=false
137
+ @page_n=0
138
+ }
139
+ signal_connect("paginate",@list) { |pop, context,list|
140
+ edebug("paginate: #{@page_n}","printing","info")
141
+
142
+ page_full=false
143
+ cr = context.cairo_context
144
+ while true
145
+ if @child_list
146
+ #step first on citer if citer is nil
147
+ if @citer.nil?
148
+ @citer=@child_list.list_model.data.iter_first
149
+ else
150
+ @citer=nil unless @citer.next!
151
+ end unless @piter.nil?
152
+ #go to next valid citer which meets key-relation
153
+ begin
154
+ break if @citer.nil?
155
+ go_next=false
156
+ #check for parent_key
157
+ go_next=true unless @citer[child_list.list_model.column_of_child_key] == @piter[child_list.list_model.column_of_parent_key]
158
+ #check for parent_key2
159
+ go_next=true unless @citer[child_list.list_model.column_of_child_key2] == @piter[child_list.list_model.column_of_parent_key2] if !child_list.list_model.column_of_child_key2.nil? && go_next
160
+ #check child's filters
161
+ filter_count=0
162
+ filter_hits=0
163
+ @child_list.columns.each{|column|
164
+ fl=get_conf(@child_list.get_id,column.header["id"],"filter").to_s.upcase
165
+ case column.header['type']
166
+ when 'gtk_combo', 'gtk_const_combo' then fl = (fl=="-1" or fl=="") ? "" : "=#{fl}"
167
+ end
168
+ comp=@citer[column.header["model_col"]].to_s.upcase
169
+ if fl.length>0
170
+ filter_count=filter_count+1
171
+ filter_hits=filter_hits+
172
+ if ['gtk_int','Integer','gtk_float','gtk_progress','gtk_duration','gtk_timestamp'].include? column.header['type']
173
+ case fl[0].chr
174
+ when "<" then comp.to_f < fl[1 .. fl.length].to_f ? 1: 0
175
+ when ">" then comp.to_f > fl[1 .. fl.length].to_f ? 1: 0
176
+ when "!" then comp.to_f != fl[1 .. fl.length].to_f ? 1: 0
177
+ when "=" then comp.to_f == fl[1 .. fl.length].to_f ? 1: 0
178
+ else comp.to_f == fl[1 .. fl.length].to_f ? 1: 0
179
+ end
180
+ else
181
+ case fl[0].chr
182
+ when "=" then comp == fl[1 .. fl.length] ? 1: 0
183
+ when "<" then comp < fl[1 .. fl.length] ? 1: 0
184
+ when ">" then comp > fl[1 .. fl.length] ? 1: 0
185
+ when "!" then comp != fl[1 .. fl.length] ? 1: 0
186
+ else comp.index(fl) ? 1: 0
187
+ end
188
+ end
189
+ end
190
+ }
191
+ go_next=filter_hits != filter_count unless go_next
192
+
193
+ @citer=nil if !@citer.next! if go_next
194
+ end while go_next
195
+ #if citer is nil we go to next piter
196
+ if @citer.nil?
197
+ #print sub_sums
198
+ if print_sub_sums and @sum_avail
199
+ il=IterLayout.new(cr,@sub_sums,child_list.columns, self,child_sum_font )
200
+ # print il.inspect
201
+ il.set_line_above(true)
202
+ lay_it(il)
203
+ #clear sums
204
+ @sub_sums.each_key{|key| @sub_sums[key]=0}
205
+ @sum_avail=false
206
+ end
207
+
208
+ #we print piter
209
+ if @piter.nil?
210
+ break if past_last=!@piter=list.model.iter_first
211
+ else
212
+ break if past_last=!@piter.next!
213
+ end
214
+ @sums.each_key{|key| @sums[key]=@sums[key]+@piter[key].to_f}
215
+ il=IterLayout.new(cr,@piter,list.columns, self,cell_font)
216
+ il.set_line_above(line_above_parent)
217
+ break if lay_it(il)
218
+ else
219
+ #calc sums
220
+ if print_sub_sums
221
+ @sub_sums.each_key{|key| @sub_sums[key]=@sub_sums[key]+@citer[key].to_f}
222
+ @sum_avail=true
223
+ end
224
+ # p "citer: #{@citer[child_list.column_of_id]} #{@past_last} #{il.inspect}"
225
+ #we print citer
226
+ il=IterLayout.new(cr,@citer,child_list.columns, self,child_cell_font)
227
+ break if lay_it(il)
228
+ end
229
+
230
+ else
231
+ if @piter.nil?
232
+ break if past_last=!@piter=list.model.iter_first
233
+ end
234
+ @sums.each_key{|key| @sums[key]=@sums[key]+@piter[key].to_f} if @piter
235
+ il=IterLayout.new(cr,@piter,list.columns, self,cell_font)
236
+ if lay_it(il)
237
+ #do not print it twice
238
+ past_last=!@piter.next!
239
+ break
240
+ end
241
+ break if past_last=!@piter.next!
242
+ edebug("piter: #{@piter[list.list_model.column_of_id]} #{@past_last}","printing","debug")
243
+ end
244
+ end
245
+
246
+ if past_last and print_sums
247
+ il=IterLayout.new(cr,@sums,list.columns, self,sum_font)
248
+ il.set_line_above(true)
249
+ lay_it(il)
250
+ end
251
+
252
+ pop.set_n_pages(@page_n+1)
253
+ einfo("paginated #{pop.n_pages} pages","printing")
254
+ past_last
255
+ } #paginate
256
+
257
+ signal_connect('draw-page'){|me,context,page_number|
258
+ edebug("draw-page: #{page_number}","printing","info")
259
+ cr = context.cairo_context
260
+ @header.draw(cr)
261
+ @columns_header.draw(cr)
262
+ @child_columns_header.draw(cr) if child_list
263
+ @footer.draw(cr,page_number)
264
+
265
+ #draw cells
266
+ @iter_layouts.each{|il|
267
+ il.draw(cr) if il.page == page_number
268
+ }
269
+ cr.stroke
270
+ }
271
+ signal_connect('status-changed'){|pop|
272
+ einfo("status:#{pop.status_string}","printing")
273
+ }
274
+ end #initialize
275
+ attr_accessor :list, :column_width, :column_pos, :height, :width, :custom_page_setup, :top, :bottom, :left, :right
276
+ attr_accessor :draw_header_line
277
+ attr_accessor :draw_footer_line
278
+ attr_accessor :line_above_parent
279
+ attr_accessor :draw_header_cell_borders
280
+ attr_accessor :print_date
281
+ attr_accessor :header_font
282
+ attr_accessor :columns_header_font
283
+ attr_accessor :child_columns_header_font
284
+ attr_accessor :footer_font
285
+ attr_accessor :date_font
286
+ attr_accessor :cell_font
287
+ attr_accessor :sum_font
288
+ attr_accessor :child_sum_font
289
+ attr_accessor :child_cell_font
290
+ attr_accessor :child_list
291
+ attr_accessor :child_indent
292
+ attr_accessor :columns
293
+ attr_accessor :print_sub_sums
294
+ attr_accessor :print_sums
295
+ attr_accessor :draw_footer_line, :footer_line_width
296
+ attr_accessor :draw_header_line
297
+ attr_accessor :fill_header_background, :header_line_width
298
+ attr_accessor :row_spacing
299
+ attr_accessor :column_spacing
300
+ attr_reader :cell_line_width, :sum_line_width, :row_underline
301
+ def lay_it(il)
302
+ if @current_height + il.row_height > @footer.y
303
+ #page full
304
+ page_full=true
305
+ einfo("page full","printing")
306
+ edebug("current_height: #{@current_height}, row.height: #{il.height}, footer_position: #{@footer.y}","printing")
307
+ @current_height=@headers_height
308
+ @page_n=@page_n+1
309
+ end
310
+ il.page=@page_n
311
+ il.y=@current_height
312
+ @current_height=@current_height+il.row_height+@row_spacing
313
+ @iter_layouts.push(il)
314
+ edebug(il.inspect,"printing")
315
+ page_full
316
+ end
317
+
318
+ def pango_width
319
+ width * Pango::SCALE
320
+ end
321
+ def pango_height
322
+ height * Pango::SCALE
323
+ end
324
+
325
+ def run_print_dialog
326
+
327
+ res = run(Gtk::PrintOperation::Action::PRINT_DIALOG, list.get_ancestor(Gtk::Window))
328
+ einfo("return: "+
329
+ case res
330
+ when RESULT_ERROR
331
+ "error"
332
+ when RESULT_CANCEL
333
+ "cancelled"
334
+ when RESULT_APPLY
335
+ "applied"
336
+ when RESULT_IN_PROGRESS
337
+ "in progress"
338
+ end,"printing")
339
+ end
340
+ def to_s;"<ListPrintOperation:#{@list.moditem["display"]}>";end
341
+
342
+ end
343
+
344
+ def gtkprint
345
+ @pop=ListPrintOperation.new(self)
346
+ ps=Gtk::PageSetup.new
347
+ case gtk_attribute("page_orientation").upcase
348
+ when "LANDSCAPE" then ps.set_orientation(Gtk::PrintSettings::PageOrientation::LANDSCAPE)
349
+ when "PORTRAIT" then ps.set_orientation(Gtk::PrintSettings::PageOrientation::PORTRAIT)
350
+ end if gtk_attribute("page_orientation")
351
+ case gtk_attribute("paper_size").upcase
352
+ when "A3" then ps.set_paper_size_and_default_margins(Gtk::PaperSize.new(Gtk::PaperSize::A3))
353
+ when "A4" then ps.set_paper_size_and_default_margins(Gtk::PaperSize.new(Gtk::PaperSize::A4))
354
+ when "A5" then ps.set_paper_size_and_default_margins(Gtk::PaperSize.new(Gtk::PaperSize::A5))
355
+ end if gtk_attribute("paper_size")
356
+ pop.set_default_page_setup(ps)
357
+ #restore saved print_settings
358
+ pop.print_settings=Gtk::PrintSettings.new.deserialize(get_conf(list_id,0,'print_settings'))
359
+ #run the dialog
360
+ pop.run_print_dialog
361
+ #save the settings
362
+ set_conf(list_id,0,'print_settings',pop.print_settings.serialize)
363
+ end
364
+ end
365
+