thinreports 0.9.1 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/test.yml +39 -0
  3. data/.gitignore +1 -0
  4. data/CHANGELOG.md +59 -2
  5. data/Dockerfile +12 -0
  6. data/Gemfile +7 -4
  7. data/README.md +44 -22
  8. data/Rakefile +14 -31
  9. data/lib/thinreports.rb +16 -15
  10. data/lib/thinreports/config.rb +2 -24
  11. data/lib/thinreports/core/errors.rb +6 -17
  12. data/lib/thinreports/core/format/base.rb +62 -61
  13. data/lib/thinreports/core/shape.rb +10 -12
  14. data/lib/thinreports/core/shape/base.rb +3 -12
  15. data/lib/thinreports/core/shape/base/interface.rb +34 -32
  16. data/lib/thinreports/core/shape/base/internal.rb +45 -43
  17. data/lib/thinreports/core/shape/basic.rb +12 -12
  18. data/lib/thinreports/core/shape/basic/block_format.rb +8 -6
  19. data/lib/thinreports/core/shape/basic/block_interface.rb +24 -22
  20. data/lib/thinreports/core/shape/basic/block_internal.rb +28 -26
  21. data/lib/thinreports/core/shape/basic/format.rb +11 -9
  22. data/lib/thinreports/core/shape/basic/interface.rb +79 -77
  23. data/lib/thinreports/core/shape/basic/internal.rb +17 -14
  24. data/lib/thinreports/core/shape/image_block.rb +9 -9
  25. data/lib/thinreports/core/shape/image_block/format.rb +7 -5
  26. data/lib/thinreports/core/shape/image_block/interface.rb +15 -13
  27. data/lib/thinreports/core/shape/image_block/internal.rb +10 -8
  28. data/lib/thinreports/core/shape/list.rb +13 -13
  29. data/lib/thinreports/core/shape/list/format.rb +83 -77
  30. data/lib/thinreports/core/shape/list/manager.rb +179 -176
  31. data/lib/thinreports/core/shape/list/page.rb +91 -93
  32. data/lib/thinreports/core/shape/list/page_state.rb +42 -40
  33. data/lib/thinreports/core/shape/list/section_format.rb +28 -26
  34. data/lib/thinreports/core/shape/list/section_interface.rb +42 -40
  35. data/lib/thinreports/core/shape/list/section_internal.rb +21 -19
  36. data/lib/thinreports/core/shape/manager.rb +4 -13
  37. data/lib/thinreports/core/shape/manager/format.rb +21 -19
  38. data/lib/thinreports/core/shape/manager/internal.rb +87 -84
  39. data/lib/thinreports/core/shape/manager/target.rb +93 -95
  40. data/lib/thinreports/core/shape/page_number.rb +9 -9
  41. data/lib/thinreports/core/shape/page_number/format.rb +20 -18
  42. data/lib/thinreports/core/shape/page_number/interface.rb +20 -18
  43. data/lib/thinreports/core/shape/page_number/internal.rb +46 -44
  44. data/lib/thinreports/core/shape/style.rb +5 -14
  45. data/lib/thinreports/core/shape/style/base.rb +121 -120
  46. data/lib/thinreports/core/shape/style/basic.rb +12 -10
  47. data/lib/thinreports/core/shape/style/graphic.rb +35 -33
  48. data/lib/thinreports/core/shape/style/text.rb +113 -107
  49. data/lib/thinreports/core/shape/text.rb +9 -9
  50. data/lib/thinreports/core/shape/text/format.rb +10 -9
  51. data/lib/thinreports/core/shape/text/interface.rb +13 -11
  52. data/lib/thinreports/core/shape/text/internal.rb +14 -12
  53. data/lib/thinreports/core/shape/text_block.rb +10 -10
  54. data/lib/thinreports/core/shape/text_block/format.rb +35 -33
  55. data/lib/thinreports/core/shape/text_block/formatter.rb +26 -24
  56. data/lib/thinreports/core/shape/text_block/formatter/basic.rb +25 -25
  57. data/lib/thinreports/core/shape/text_block/formatter/datetime.rb +15 -12
  58. data/lib/thinreports/core/shape/text_block/formatter/number.rb +52 -34
  59. data/lib/thinreports/core/shape/text_block/formatter/padding.rb +17 -14
  60. data/lib/thinreports/core/shape/text_block/interface.rb +25 -23
  61. data/lib/thinreports/core/shape/text_block/internal.rb +66 -68
  62. data/lib/thinreports/core/utils.rb +7 -3
  63. data/lib/thinreports/generator/pdf.rb +24 -25
  64. data/lib/thinreports/generator/pdf/document.rb +109 -110
  65. data/lib/thinreports/generator/pdf/document/draw_shape.rb +57 -51
  66. data/lib/thinreports/generator/pdf/document/draw_template_items.rb +50 -47
  67. data/lib/thinreports/generator/pdf/document/font.rb +67 -58
  68. data/lib/thinreports/generator/pdf/document/graphics.rb +32 -33
  69. data/lib/thinreports/generator/pdf/document/graphics/attributes.rb +121 -121
  70. data/lib/thinreports/generator/pdf/document/graphics/basic.rb +112 -114
  71. data/lib/thinreports/generator/pdf/document/graphics/image.rb +58 -150
  72. data/lib/thinreports/generator/pdf/document/graphics/text.rb +149 -137
  73. data/lib/thinreports/generator/pdf/document/page.rb +60 -64
  74. data/lib/thinreports/generator/pdf/document/parse_color.rb +37 -37
  75. data/lib/thinreports/generator/pdf/drawer/base.rb +41 -41
  76. data/lib/thinreports/generator/pdf/drawer/list.rb +56 -54
  77. data/lib/thinreports/generator/pdf/drawer/list_section.rb +42 -40
  78. data/lib/thinreports/generator/pdf/drawer/page.rb +101 -96
  79. data/lib/thinreports/generator/pdf/prawn_ext.rb +4 -30
  80. data/lib/thinreports/generator/pdf/prawn_ext/calc_image_dimensions.rb +32 -0
  81. data/lib/thinreports/generator/pdf/prawn_ext/width_of.rb +35 -0
  82. data/lib/thinreports/layout.rb +5 -7
  83. data/lib/thinreports/layout/base.rb +5 -9
  84. data/lib/thinreports/layout/format.rb +17 -13
  85. data/lib/thinreports/layout/legacy_schema.rb +17 -13
  86. data/lib/thinreports/layout/version.rb +22 -25
  87. data/lib/thinreports/report.rb +4 -6
  88. data/lib/thinreports/report/base.rb +24 -51
  89. data/lib/thinreports/report/internal.rb +13 -15
  90. data/lib/thinreports/report/page.rb +5 -11
  91. data/lib/thinreports/version.rb +2 -2
  92. data/thinreports.gemspec +10 -19
  93. metadata +13 -288
  94. data/.travis.yml +0 -19
  95. data/examples/character_spacing/character_spacing.rb +0 -8
  96. data/examples/character_spacing/character_spacing.tlf +0 -293
  97. data/examples/dynamic_image/dynamic_image.rb +0 -31
  98. data/examples/dynamic_image/dynamic_image.tlf +0 -661
  99. data/examples/dynamic_image/img200x100.png +0 -0
  100. data/examples/dynamic_image/img50x50.png +0 -0
  101. data/examples/dynamic_style/dynamic_style.rb +0 -150
  102. data/examples/dynamic_style/dynamic_style.tlf +0 -1835
  103. data/examples/dynamic_style/dynamic_style_in_list.tlf +0 -344
  104. data/examples/dynamic_style/image.png +0 -0
  105. data/examples/eudc/eudc.rb +0 -20
  106. data/examples/eudc/eudc.tlf +0 -180
  107. data/examples/eudc/eudc.ttf +0 -0
  108. data/examples/helper.rb +0 -50
  109. data/examples/hidden_shapes/hidden_shapes.rb +0 -9
  110. data/examples/hidden_shapes/hidden_shapes.tlf +0 -449
  111. data/examples/list_events/list_events.rb +0 -32
  112. data/examples/list_events/list_events.tlf +0 -361
  113. data/examples/list_manual_generation/list_manual_generation.rb +0 -22
  114. data/examples/list_manual_generation/list_manual_generation.tlf +0 -132
  115. data/examples/list_page_number/list_page_number.rb +0 -17
  116. data/examples/list_page_number/list_page_number.tlf +0 -254
  117. data/examples/page_number/page_number.rb +0 -33
  118. data/examples/page_number/page_number.tlf +0 -215
  119. data/examples/palleted_png/palleted_png.png +0 -0
  120. data/examples/palleted_png/palleted_png.rb +0 -11
  121. data/examples/palleted_png/palleted_png.tlf +0 -47
  122. data/examples/password_setting/password_setting.rb +0 -10
  123. data/examples/password_setting/password_setting.tlf +0 -45
  124. data/examples/report_callbacks/report_callbacks.rb +0 -14
  125. data/examples/report_callbacks/report_callbacks.tlf +0 -147
  126. data/examples/single_line_tblock/single_line_tblock.rb +0 -13
  127. data/examples/single_line_tblock/single_line_tblock.tlf +0 -170
  128. data/examples/tblock_overflow/tblock_overflow.rb +0 -20
  129. data/examples/tblock_overflow/tblock_overflow.tlf +0 -538
  130. data/examples/tblock_styles/font_size.tlf +0 -383
  131. data/examples/tblock_styles/tblock_styles.rb +0 -43
  132. data/examples/tblock_styles/tblock_styles.tlf +0 -889
  133. data/examples/text_align/text_align.rb +0 -8
  134. data/examples/text_align/text_align.tlf +0 -241
  135. data/examples/typeB_page_size/B4_ISO.tlf +0 -45
  136. data/examples/typeB_page_size/B4_JIS.tlf +0 -45
  137. data/examples/typeB_page_size/typeB_page_size.rb +0 -17
  138. data/examples/word_wrap/word_wrap.rb +0 -26
  139. data/examples/word_wrap/word_wrap.tlf +0 -297
  140. data/lib/thinreports/generator.rb +0 -29
  141. data/lib/thinreports/generator/base.rb +0 -40
  142. data/lib/thinreports/generator/configuration.rb +0 -31
  143. data/lib/thinreports/report/events.rb +0 -32
  144. data/test/data/font.ttf +0 -0
  145. data/test/data/image_normal.jpg +0 -0
  146. data/test/data/image_normal.png +0 -0
  147. data/test/data/image_normal_jpg_noext +0 -0
  148. data/test/data/image_normal_png_noext +0 -0
  149. data/test/data/image_pallete_based.png +0 -0
  150. data/test/data/legacy_layout/all-items.tlf +0 -1
  151. data/test/schema_helper.rb +0 -121
  152. data/test/test_helper.rb +0 -42
  153. data/test/tmp/.gitkeep +0 -0
  154. data/test/unit/core/format/test_base.rb +0 -152
  155. data/test/unit/core/shape/base/test_internal.rb +0 -87
  156. data/test/unit/core/shape/basic/test_block_format.rb +0 -23
  157. data/test/unit/core/shape/basic/test_block_interface.rb +0 -29
  158. data/test/unit/core/shape/basic/test_block_internal.rb +0 -55
  159. data/test/unit/core/shape/basic/test_format.rb +0 -37
  160. data/test/unit/core/shape/basic/test_interface.rb +0 -108
  161. data/test/unit/core/shape/basic/test_internal.rb +0 -55
  162. data/test/unit/core/shape/image_block/test_interface.rb +0 -24
  163. data/test/unit/core/shape/image_block/test_internal.rb +0 -31
  164. data/test/unit/core/shape/list/test_format.rb +0 -111
  165. data/test/unit/core/shape/list/test_manager.rb +0 -67
  166. data/test/unit/core/shape/list/test_page.rb +0 -82
  167. data/test/unit/core/shape/list/test_page_state.rb +0 -31
  168. data/test/unit/core/shape/list/test_section_format.rb +0 -36
  169. data/test/unit/core/shape/list/test_section_interface.rb +0 -75
  170. data/test/unit/core/shape/list/test_section_internal.rb +0 -50
  171. data/test/unit/core/shape/manager/test_format.rb +0 -38
  172. data/test/unit/core/shape/manager/test_internal.rb +0 -132
  173. data/test/unit/core/shape/manager/test_target.rb +0 -140
  174. data/test/unit/core/shape/page_number/test_format.rb +0 -55
  175. data/test/unit/core/shape/page_number/test_interface.rb +0 -33
  176. data/test/unit/core/shape/page_number/test_internal.rb +0 -81
  177. data/test/unit/core/shape/styles/test_base.rb +0 -191
  178. data/test/unit/core/shape/styles/test_basic.rb +0 -24
  179. data/test/unit/core/shape/styles/test_graphic.rb +0 -50
  180. data/test/unit/core/shape/styles/test_text.rb +0 -97
  181. data/test/unit/core/shape/text/test_format.rb +0 -44
  182. data/test/unit/core/shape/text/test_internal.rb +0 -20
  183. data/test/unit/core/shape/text_block/formatter/test_basic.rb +0 -24
  184. data/test/unit/core/shape/text_block/formatter/test_datetime.rb +0 -49
  185. data/test/unit/core/shape/text_block/formatter/test_number.rb +0 -76
  186. data/test/unit/core/shape/text_block/formatter/test_padding.rb +0 -77
  187. data/test/unit/core/shape/text_block/test_format.rb +0 -169
  188. data/test/unit/core/shape/text_block/test_formatter.rb +0 -28
  189. data/test/unit/core/shape/text_block/test_interface.rb +0 -63
  190. data/test/unit/core/shape/text_block/test_internal.rb +0 -128
  191. data/test/unit/core/test_shape.rb +0 -52
  192. data/test/unit/core/test_utils.rb +0 -68
  193. data/test/unit/generator/pdf/document/graphics/test_attributes.rb +0 -135
  194. data/test/unit/generator/pdf/document/graphics/test_basic.rb +0 -45
  195. data/test/unit/generator/pdf/document/graphics/test_image.rb +0 -150
  196. data/test/unit/generator/pdf/document/graphics/test_text.rb +0 -171
  197. data/test/unit/generator/pdf/document/test_font.rb +0 -84
  198. data/test/unit/generator/pdf/document/test_graphics.rb +0 -42
  199. data/test/unit/generator/pdf/document/test_page.rb +0 -122
  200. data/test/unit/generator/pdf/document/test_parse_color.rb +0 -30
  201. data/test/unit/generator/pdf/test_document.rb +0 -20
  202. data/test/unit/generator/test_base.rb +0 -40
  203. data/test/unit/generator/test_configuration.rb +0 -21
  204. data/test/unit/generator/test_pdf.rb +0 -24
  205. data/test/unit/layout/test_base.rb +0 -41
  206. data/test/unit/layout/test_format.rb +0 -100
  207. data/test/unit/layout/test_legacy_schema.rb +0 -574
  208. data/test/unit/layout/test_version.rb +0 -95
  209. data/test/unit/report/test_base.rb +0 -262
  210. data/test/unit/report/test_internal.rb +0 -206
  211. data/test/unit/test_config.rb +0 -51
  212. data/test/unit/test_layout.rb +0 -12
  213. data/test/unit/test_report.rb +0 -18
@@ -1,226 +1,229 @@
1
- # coding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Thinreports
4
- module Core::Shape
4
+ module Core
5
+ module Shape
6
+ module List
7
+ class Manager
8
+ include Utils
5
9
 
6
- class List::Manager
7
- include Utils
10
+ # @return [Thinreports::Core::Shape:::List::Page]
11
+ attr_reader :current_page
8
12
 
9
- # @return [Thinreports::Core::Shape:::List::Page]
10
- attr_reader :current_page
13
+ # @return [Thinreports::Core::Shape::List::PageState]
14
+ attr_reader :current_page_state
11
15
 
12
- # @return [Thinreports::Core::Shape::List::PageState]
13
- attr_reader :current_page_state
16
+ # @return [Integer]
17
+ attr_accessor :page_count
14
18
 
15
- # @return [Integer]
16
- attr_accessor :page_count
19
+ # @return [Proc]
20
+ attr_accessor :page_finalize_handler
17
21
 
18
- # @return [Proc]
19
- attr_accessor :page_finalize_handler
22
+ # @return [Proc]
23
+ attr_accessor :page_footer_handler
20
24
 
21
- # @return [Proc]
22
- attr_accessor :page_footer_handler
25
+ # @return [Proc]
26
+ attr_accessor :footer_handler
23
27
 
24
- # @return [Proc]
25
- attr_accessor :footer_handler
28
+ # @param [Thinreports::Core::Shape::List::Page] page
29
+ def initialize(page)
30
+ switch_current!(page)
26
31
 
27
- # @param [Thinreports::Core::Shape::List::Page] page
28
- def initialize(page)
29
- switch_current!(page)
32
+ @finalized = false
33
+ @page_count = 0
30
34
 
31
- @finalized = false
32
- @page_count = 0
35
+ @page_finalize_handler = nil
36
+ @page_footer_handler = nil
37
+ @footer_handler = nil
38
+ end
33
39
 
34
- @page_finalize_handler = nil
35
- @page_footer_handler = nil
36
- @footer_handler = nil
37
- end
40
+ # @param [Thinreports::Core::Shape::List::Page] page
41
+ # @return [Thinreports::Core::Shape::List::Manager]
42
+ def switch_current!(page)
43
+ @current_page = page
44
+ @current_page_state = page.internal
45
+ self
46
+ end
38
47
 
39
- # @param [Thinreports::Core::Shape::List::Page] page
40
- # @return [Thinreports::Core::Shape::List::Manager]
41
- def switch_current!(page)
42
- @current_page = page
43
- @current_page_state = page.internal
44
- self
45
- end
48
+ # @yield [new_list]
49
+ # @yieldparam [Thinreports::Core::Shape::List::Page] new_list
50
+ def change_new_page(&block)
51
+ finalize_page
52
+ new_page = report.internal.copy_page
46
53
 
47
- # @yield [new_list]
48
- # @yieldparam [Thinreports::Core::Shape::List::Page] new_list
49
- def change_new_page(&block)
50
- finalize_page
51
- new_page = report.internal.copy_page
54
+ block.call(new_page.list(current_page.id)) if block_given?
55
+ end
52
56
 
53
- if block_given?
54
- block.call(new_page.list(current_page.id))
55
- end
56
- end
57
+ # @param [Hash] values ({})
58
+ # @yield [header]
59
+ # @yieldparam [Thinreports::Core::Shape::List::SectionInterface] header
60
+ # @return [Thinreports::Core::Shape::List::SectionInterface]
61
+ # @raise [Thinreports::Errors::DisabledListSection]
62
+ def build_header(values = {}, &block)
63
+ raise Thinreports::Errors::DisabledListSection, 'header' unless format.has_header?
57
64
 
58
- # @param [Hash] values ({})
59
- # @yield [header]
60
- # @yieldparam [Thinreports::Core::Shape::List::SectionInterface] header
61
- # @return [Thinreports::Core::Shape::List::SectionInterface]
62
- # @raise [Thinreports::Errors::DisabledListSection]
63
- def build_header(values = {}, &block)
64
- unless format.has_header?
65
- raise Thinreports::Errors::DisabledListSection.new('header')
66
- end
67
- current_page_state.header ||= init_section(:header)
68
- build_section(header_section, values, &block)
69
- end
65
+ current_page_state.header ||= init_section(:header)
66
+ build_section(header_section, values, &block)
67
+ end
70
68
 
71
- # @return [Thinreports::Core::Shape::List::SectionInterface]
72
- def header_section
73
- current_page_state.header
74
- end
69
+ # @return [Thinreports::Core::Shape::List::SectionInterface]
70
+ def header_section
71
+ current_page_state.header
72
+ end
75
73
 
76
- # @param (see #build_section)
77
- # @return [Boolean]
78
- def add_detail(values = {}, &block)
79
- return false if current_page_state.finalized?
74
+ # @param (see #build_section)
75
+ # @return [Boolean]
76
+ def add_detail(values = {}, &block)
77
+ return false if current_page_state.finalized?
78
+
79
+ successful = true
80
+
81
+ if overflow_with?(:detail)
82
+ if auto_page_break?
83
+ change_new_page do |new_list|
84
+ new_list.manager.insert_detail(values, &block)
85
+ end
86
+ else
87
+ finalize
88
+ successful = false
89
+ end
90
+ else
91
+ insert_detail(values, &block)
92
+ end
93
+ successful
94
+ end
80
95
 
81
- successful = true
96
+ # @param values (see Thinreports::Core::Shape::Manager::Target#values)
97
+ # @yield [section,]
98
+ # @yieldparam [Thinreports::Core::Shape::List::SectionInterface] section
99
+ # @return [Thinreports::Core::Shape::List::SectionInterface]
100
+ def insert_detail(values = {}, &block)
101
+ detail = build_section(init_section(:detail), values, &block)
102
+ insert_row(detail)
103
+ end
82
104
 
83
- if overflow_with?(:detail)
84
- if auto_page_break?
85
- change_new_page do |new_list|
86
- new_list.manager.insert_detail(values, &block)
87
- end
88
- else
89
- finalize
90
- successful = false
105
+ # @param [Thinreports::Core::Shape::List::SectionInterface] row
106
+ # @return [Thinreports::Core::Shape::List::SectionInterface]
107
+ def insert_row(row)
108
+ row.internal.move_top_to(current_page_state.height)
109
+
110
+ current_page_state.rows << row
111
+ current_page_state.height += row.height
112
+ row
91
113
  end
92
- else
93
- insert_detail(values, &block)
94
- end
95
- successful
96
- end
97
114
 
98
- # @param values (see Thinreports::Core::Shape::Manager::Target#values)
99
- # @yield [section,]
100
- # @yieldparam [Thinreports::Core::Shape::List::SectionInterface] section
101
- # @return [Thinreports::Core::Shape::List::SectionInterface]
102
- def insert_detail(values = {}, &block)
103
- detail = build_section(init_section(:detail), values, &block)
104
- insert_row(detail)
105
- end
115
+ # @param [Thinreports::Core::Shape::List::SectionInterface] section
116
+ # @param values (see Thinreports::Core::Shape::Manager::Target#values)
117
+ # @yield [section,]
118
+ # @yieldparam [Thinreports::Core::Shape::List::SectionInterface] section
119
+ # @return [Thinreports::Core::Shape::List::SectionInterface]
120
+ def build_section(section, values = {}, &block)
121
+ section.values(values)
122
+ call_block_in(section, &block)
123
+ end
106
124
 
107
- # @param [Thinreports::Core::Shape::List::SectionInterface] row
108
- # @return [Thinreports::Core::Shape::List::SectionInterface]
109
- def insert_row(row)
110
- row.internal.move_top_to(current_page_state.height)
125
+ # @param [Symbol] section_name
126
+ # @return [Thinreports::Core::Shape::List::SectionInterface]
127
+ def init_section(section_name)
128
+ List::SectionInterface.new(current_page,
129
+ format.sections[section_name],
130
+ section_name)
131
+ end
111
132
 
112
- current_page_state.rows << row
113
- current_page_state.height += row.height
114
- row
115
- end
133
+ # @param [Symbol] section_name
134
+ # @return [Boolean]
135
+ def overflow_with?(section_name = :detail)
136
+ max_height = page_max_height
116
137
 
117
- # @param [Thinreports::Core::Shape::List::SectionInterface] section
118
- # @param values (see Thinreports::Core::Shape::Manager::Target#values)
119
- # @yield [section,]
120
- # @yieldparam [Thinreports::Core::Shape::List::SectionInterface] section
121
- # @return [Thinreports::Core::Shape::List::SectionInterface]
122
- def build_section(section, values = {}, &block)
123
- section.values(values)
124
- call_block_in(section, &block)
125
- end
138
+ max_height += format.section_height(:page_footer) if section_name == :footer && format.has_page_footer?
126
139
 
127
- # @param [Symbol] section_name
128
- # @return [Thinreports::Core::Shape::List::SectionInterface]
129
- def init_section(section_name)
130
- List::SectionInterface.new(current_page,
131
- format.sections[section_name],
132
- section_name)
133
- end
140
+ height = format.section_height(section_name)
141
+ (current_page_state.height + height) > max_height
142
+ end
134
143
 
135
- # @param [Symbol] section_name
136
- # @return [Boolean]
137
- def overflow_with?(section_name = :detail)
138
- max_height = page_max_height
144
+ # @return [Numeric]
145
+ def page_max_height
146
+ @page_max_height ||= begin
147
+ h = format.height
148
+ h -= format.section_height(:page_footer)
149
+ h -= format.section_height(:footer) unless auto_page_break?
150
+ h
151
+ end
152
+ end
139
153
 
140
- if section_name == :footer && format.has_page_footer?
141
- max_height += format.section_height(:page_footer)
142
- end
154
+ # @return [Boolean]
155
+ def auto_page_break?
156
+ format.auto_page_break?
157
+ end
143
158
 
144
- height = format.section_height(section_name)
145
- (current_page_state.height + height) > max_height
146
- end
159
+ # @param [Hash] options
160
+ # @option options [Boolean] :ignore_page_footer (false)
161
+ # When the switch of the page is generated by #finalize, it is used.
162
+ def finalize_page(options = {})
163
+ return if current_page_state.finalized?
147
164
 
148
- # @return [Numeric]
149
- def page_max_height
150
- @page_max_height ||= begin
151
- h = format.height
152
- h -= format.section_height(:page_footer)
153
- h -= format.section_height(:footer) unless auto_page_break?
154
- h
155
- end
156
- end
165
+ build_header if format.has_header?
157
166
 
158
- # @return [Boolean]
159
- def auto_page_break?
160
- format.auto_page_break?
161
- end
167
+ finalize_page_footer unless options[:ignore_page_footer]
162
168
 
163
- # @param [Hash] options
164
- # @option options [Boolean] :ignore_page_footer (false)
165
- # When the switch of the page is generated by #finalize, it is used.
166
- def finalize_page(options = {})
167
- return if current_page_state.finalized?
169
+ current_page_state.finalized!
170
+ @page_finalize_handler.call if @page_finalize_handler
168
171
 
169
- build_header if format.has_header?
172
+ @page_count += 1
173
+ current_page_state.no = @page_count
174
+ end
170
175
 
171
- if !options[:ignore_page_footer] && format.has_page_footer?
172
- page_footer = insert_row(init_section(:page_footer))
173
- @page_footer_handler.call(page_footer) if @page_footer_handler
174
- end
176
+ def finalize_page_footer
177
+ return unless format.has_page_footer?
175
178
 
176
- current_page_state.finalized!
177
- @page_finalize_handler.call if @page_finalize_handler
179
+ page_footer = init_section(:page_footer)
180
+ insert_row(page_footer)
178
181
 
179
- @page_count += 1
180
- current_page_state.no = @page_count
181
- end
182
+ @page_footer_handler.call(page_footer) if @page_footer_handler
183
+ end
182
184
 
183
- def finalize
184
- return if finalized?
185
- finalize_page
185
+ def finalize
186
+ return if finalized?
187
+ finalize_page
186
188
 
187
- if format.has_footer?
188
- footer = init_section(:footer)
189
+ if format.has_footer?
190
+ footer = init_section(:footer)
189
191
 
190
- @footer_handler.call(footer) if @footer_handler
192
+ @footer_handler.call(footer) if @footer_handler
191
193
 
192
- if auto_page_break? && overflow_with?(:footer)
193
- change_new_page do |new_list|
194
- new_list.manager.insert_row(footer)
195
- new_list.manager.finalize_page(ignore_page_footer: true)
194
+ if auto_page_break? && overflow_with?(:footer)
195
+ change_new_page do |new_list|
196
+ new_list.manager.insert_row(footer)
197
+ new_list.manager.finalize_page(ignore_page_footer: true)
198
+ end
199
+ else
200
+ insert_row(footer)
201
+ end
196
202
  end
197
- else
198
- insert_row(footer)
203
+ @finalized = true
199
204
  end
200
- end
201
- @finalized = true
202
- end
203
205
 
204
- # @return [Boolean]
205
- def finalized?
206
- @finalized
207
- end
206
+ # @return [Boolean]
207
+ def finalized?
208
+ @finalized
209
+ end
208
210
 
209
- # @return [Thinreports::Report::Base]
210
- def report
211
- current_page_state.parent.report
212
- end
211
+ # @return [Thinreports::Report::Base]
212
+ def report
213
+ current_page_state.parent.report
214
+ end
213
215
 
214
- # @return [Thinreports::Layout::Base]
215
- def layout
216
- current_page_state.parent.layout
217
- end
216
+ # @return [Thinreports::Layout::Base]
217
+ def layout
218
+ current_page_state.parent.layout
219
+ end
218
220
 
219
- # @return [Thinreports::Core::Shape::List::Format]
220
- def format
221
- current_page_state.format
221
+ # @return [Thinreports::Core::Shape::List::Format]
222
+ def format
223
+ current_page_state.format
224
+ end
225
+ end
222
226
  end
223
227
  end
224
-
225
228
  end
226
229
  end
@@ -1,112 +1,110 @@
1
- # coding: utf-8
1
+ # frozen_string_literal: true
2
2
 
3
3
  module Thinreports
4
- module Core::Shape
5
-
6
- class List::Page < Basic::Interface
7
- extend Forwardable
8
-
9
- # @param [Thinreports::Report::Page] parent
10
- # @param [Thinreports::Core::Shape::Basic::Format] format
11
- # @param [Thinreports::Core::Shape::List::PageState] internal (nil)
12
- # @param [Thinreports::Core::Shape::List::Manager] manager (nil)
13
- def initialize(parent, format, internal = nil, manager = nil)
14
- super(parent, format, internal)
15
-
16
- @manager =
17
- if manager
18
- manager.switch_current!(self)
19
- else
20
- List::Manager.new(self)
4
+ module Core
5
+ module Shape
6
+ module List
7
+ class Page < Basic::Interface
8
+ extend Forwardable
9
+
10
+ attr_reader :manager
11
+
12
+ # @param [Thinreports::Report::Page] parent
13
+ # @param [Thinreports::Core::Shape::Basic::Format] format
14
+ # @param [Thinreports::Core::Shape::List::PageState] internal (nil)
15
+ # @param [Thinreports::Core::Shape::List::Manager] manager (nil)
16
+ def initialize(parent, format, internal = nil, manager = nil)
17
+ super(parent, format, internal)
18
+
19
+ @manager =
20
+ if manager
21
+ manager.switch_current!(self)
22
+ else
23
+ List::Manager.new(self)
24
+ end
25
+
26
+ # Set a reference to List::PageState List::Manager
27
+ self.internal.manager = self.manager
21
28
  end
22
29
 
23
- # Set a reference to List::PageState List::Manager
24
- self.internal.manager = self.manager
25
- end
26
-
27
- # @see Thinreports::Core::Shape::List::Manager#build_header
28
- def_delegator :manager, :build_header, :header
29
-
30
- def on_page_finalize(&block)
31
- manager.page_finalize_handler = block
32
- end
30
+ # @see Thinreports::Core::Shape::List::Manager#build_header
31
+ def_delegator :manager, :build_header, :header
33
32
 
34
- # @yield [page_footer]
35
- # @yieldparam [Thinreports::Core::Shape::List::SectionInterface] page_footer
36
- def on_page_footer_insert(&block)
37
- manager.page_footer_handler = block
38
- end
33
+ def on_page_finalize(&block)
34
+ manager.page_finalize_handler = block
35
+ end
39
36
 
40
- # @yield [footer]
41
- # @yieldparam [Thinreports::Core::Shape::List::SectionInterface] footer
42
- # @return [Thinreports::Core::Shape::List::SectionInterface]
43
- def on_footer_insert(&block)
44
- manager.footer_handler = block
45
- end
37
+ # @yield [page_footer]
38
+ # @yieldparam [Thinreports::Core::Shape::List::SectionInterface] page_footer
39
+ def on_page_footer_insert(&block)
40
+ manager.page_footer_handler = block
41
+ end
46
42
 
47
- # @param [Hash] values ({})
48
- # @yield [row,]
49
- # @yieldparam [Thinreports::Core::Shape::List::SectionInterface] row
50
- # @return [Boolean]
51
- def add_row(values = {}, &block)
52
- manager.add_detail(values, &block)
53
- end
43
+ # @yield [footer]
44
+ # @yieldparam [Thinreports::Core::Shape::List::SectionInterface] footer
45
+ # @return [Thinreports::Core::Shape::List::SectionInterface]
46
+ def on_footer_insert(&block)
47
+ manager.footer_handler = block
48
+ end
54
49
 
55
- # If enabled, the auto-page-break of the list will force a page break
56
- # at the time this method is called. Otherwise, this list will be finalized.
57
- def page_break
58
- if manager.auto_page_break?
59
- manager.change_new_page
60
- else
61
- manager.finalize_page
62
- end
63
- end
64
- alias_method :finalize, :page_break
50
+ # @param [Hash] values ({})
51
+ # @yield [row,]
52
+ # @yieldparam [Thinreports::Core::Shape::List::SectionInterface] row
53
+ # @return [Boolean]
54
+ def add_row(values = {}, &block)
55
+ manager.add_detail(values, &block)
56
+ end
65
57
 
66
- # @return [Boolean] Returns true if list has overflowed
67
- # when `list#add_row` is called at the next time.
68
- def overflow?
69
- manager.overflow_with?(:detail)
70
- end
58
+ # If enabled, the auto-page-break of the list will force a page break
59
+ # at the time this method is called. Otherwise, this list will be finalized.
60
+ def page_break
61
+ if manager.auto_page_break?
62
+ manager.change_new_page
63
+ else
64
+ manager.finalize_page
65
+ end
66
+ end
67
+ alias finalize page_break
71
68
 
72
- # @param [Thinreports::Report::Page] new_parent
73
- # @return [Thinreports::Core::Shape::List::Page]
74
- def copy(new_parent)
75
- if manager.auto_page_break?
76
- new_list = self.class.new(new_parent, internal.format,
77
- nil, manager)
78
- else
79
- manager.finalize
80
-
81
- new_list = self.class.new(new_parent, internal.format,
82
- internal.copy(new_parent), manager)
83
- internal.rows.each do |row|
84
- new_list.internal.rows << row.copy(new_list)
69
+ # @return [Boolean] Returns true if list has overflowed
70
+ # when `list#add_row` is called at the next time.
71
+ def overflow?
72
+ manager.overflow_with?(:detail)
85
73
  end
86
- new_list.finalized!
87
- end
88
74
 
89
- if internal.format.has_header?
90
- new_list.internal.header = internal.header.copy(new_list)
91
- end
92
- new_list
93
- end
75
+ # @param [Thinreports::Report::Page] new_parent
76
+ # @return [Thinreports::Core::Shape::List::Page]
77
+ def copy(new_parent)
78
+ if manager.auto_page_break?
79
+ new_list = self.class.new(new_parent, internal.format,
80
+ nil, manager)
81
+ else
82
+ manager.finalize
83
+
84
+ new_list = self.class.new(new_parent, internal.format,
85
+ internal.copy(new_parent), manager)
86
+ internal.rows.each do |row|
87
+ new_list.internal.rows << row.copy(new_list)
88
+ end
89
+ new_list.internal.finalized!
90
+ end
91
+
92
+ new_list.internal.header = internal.header.copy(new_list) if internal.format.has_header?
93
+ new_list
94
+ end
94
95
 
95
- def manager
96
- @manager
97
- end
96
+ private
98
97
 
99
- private
98
+ # @see Thinreports::Core::Shape::Base::Interface#init_internal
99
+ def init_internal(parent, format)
100
+ List::PageState.new(parent, format)
101
+ end
102
+ end
100
103
 
101
- # @see Thinreports::Core::Shape::Base::Interface#init_internal
102
- def init_internal(parent, format)
103
- List::PageState.new(parent, format)
104
+ # Alias to List::Page.
105
+ # @see Thinreports::Core::Shape::List::Page
106
+ List::Interface = List::Page
104
107
  end
105
108
  end
106
-
107
- # Alias to List::Page.
108
- # @see Thinreports::Core::Shape::List::Page
109
- List::Interface = List::Page
110
-
111
109
  end
112
110
  end