manqod 1.1532.0 → 1.1556.0

Sign up to get free protection for your applications and to get access to all the features.
data/bin/manqod CHANGED
@@ -109,6 +109,7 @@ erequire "PrintEditor/ItemInfo/ItemTextAlignment.rb"
109
109
 
110
110
  erequire 'ListHolder/ListButtonHolder/FilterButton'
111
111
  erequire 'ListHolder/ListButtonHolder/ArchiveButton'
112
+ erequire 'ListHolder/ListButtonHolder/LegendsButton'
112
113
  erequire 'ListHolder/ListButtonHolder/OrderingButton'
113
114
  erequire 'ListHolder/ListButtonHolder/SumPanelButton'
114
115
  erequire 'ListHolder/ListButtonHolder/ButtonGroup'
@@ -16,3 +16,34 @@ class Fixnum
16
16
  ret
17
17
  end
18
18
  end
19
+
20
+ class Time
21
+ def wday_non_gb
22
+ wday==0 ? 6 : wday-1
23
+ end
24
+ def strftime_w(str)
25
+ s=str.clone
26
+ s.sub!("%W",(strftime("%W").to_i+1).to_s) if str.include?("%W")
27
+ strftime(s)
28
+ end
29
+ def round(res='d')
30
+ #res can be H=hour,d=day,W=week
31
+ #Time.gm(0,0,res=="H" ? hour : 0,day,month,year)#,yday - (res=="W" ? wday_non_gb : 0),false)
32
+ m=month
33
+ y=year
34
+ if res=="W"
35
+ if day <= wday_non_gb
36
+ t=Time.at(self-7*24*60*60)
37
+ d=t.day
38
+ m=t.month
39
+ y=t.year
40
+ else
41
+ d=day - wday_non_gb
42
+ end
43
+ else
44
+ d=day
45
+ end
46
+ Time.mktime(y, m, d, res=="H" ? hour : 0)
47
+ end
48
+
49
+ end
@@ -29,7 +29,6 @@ class Nick
29
29
  end
30
30
  def ingroup_id?(group_id)
31
31
  @mygroups=ManqodDB.instance.manqod_db.mygroups(@nick).clone if @mygroups.nil?
32
- ecode(@mygroups.inspect)
33
32
  @mygroups.has_key?(group_id.to_i)
34
33
  end
35
34
  end
@@ -97,7 +97,7 @@ class MyInputHolder
97
97
  end
98
98
 
99
99
  #Button in info mode is editable
100
- item["editable"]="false" if item['gtktype']!='gtk_button' if caller.runmode == 'info'
100
+ item['editable']=(item['gtktype']=='gtk_button').to_s if caller.runmode == 'info'
101
101
  @widget.set_border_width(1)
102
102
 
103
103
  @widget.add(@eventbox=Gtk::EventBox.new)
@@ -225,6 +225,7 @@ class MyInputHolder
225
225
  item['querysql']="#{item['querysql']} #{(gtk_attribute("tree_key").nil? ? "order by":",")} #{s[2..s.length]}" if s.length>0
226
226
  edebug("generated query:#{querySQL}","sql")
227
227
  end
228
+ item['querysql']=add_where(item['querysql'],"#{guess_base(item['querysql'])}.id = '" + "#" +"{default}'") if caller.runmode == 'info' && item['querysql'].length>0
228
229
  self
229
230
  end
230
231
 
@@ -314,7 +315,7 @@ class MyInputHolder
314
315
  end
315
316
 
316
317
  def editable
317
- item['editable'].to_s=='true'
318
+ editable?
318
319
  end
319
320
 
320
321
  def editable?
@@ -96,7 +96,7 @@ class MyRendererButton < Gtk::Button
96
96
  s="#{s}#{@pc.query_result[key]}" if @pc.query_result.has_key?(key)
97
97
  }
98
98
  set_label(s)
99
- set_image(Gtk::Image.new((text=="-1" || text=="0" ? Gtk::Stock::ADD : Gtk::Stock::EDIT ),Gtk::IconSize.from_name(get_conf(0,0,"button-size"))))
99
+ set_image(Gtk::Image.new((parentM.runmode=='info' ? Gtk::Stock::INFO : (text=="-1" || text=="0" ? Gtk::Stock::ADD : Gtk::Stock::EDIT )),Gtk::IconSize.from_name(get_conf(0,0,"button-size"))))
100
100
  notify_changes
101
101
  end
102
102
  edebug("#{text} updated","gtk_button","info")
@@ -80,10 +80,10 @@ class MyFileChooserButton < Gtk::FileChooserWidget
80
80
  ftp=Net::FTP.new(@ftp[0],@ftp[1],@ftp[2])
81
81
  @ftp[3].each("/"){|s|
82
82
  begin
83
- ecode("changing ftp dir: #{s}")
83
+ einfo("changing ftp dir: #{s}","form")
84
84
  ftp.chdir(s)
85
85
  rescue =>err
86
- ecode("creating ftp dir: #{s}")
86
+ einfo("creating ftp dir: #{s}","form")
87
87
  ftp.mkdir(s)
88
88
  retry
89
89
  end
@@ -105,11 +105,11 @@ class MyFileChooserButton < Gtk::FileChooserWidget
105
105
  set_conf(0,item['id'],"path",current_folder)
106
106
  ftp=Net::FTP.new(@ftp[0],@ftp[1],@ftp[2])
107
107
  @ftp[3].each("/"){|s|
108
- ecode("changing ftp dir: #{s}")
108
+ einfo("changing ftp dir: #{s}","form")
109
109
  ftp.chdir(s)
110
110
  } if @ftp[3]
111
111
  perc=0
112
- ecode(item["initial"])
112
+ einfo(item["initial"],"form")
113
113
  ftp.getbinaryfile(item["initial"],filename,ftp.size(item["initial"])/100){
114
114
  progress.set_fraction(perc/100.0)
115
115
  Gtk.show_thread_changes
@@ -121,7 +121,7 @@ class QBuilder < Gtk::HPaned
121
121
  }
122
122
  begin
123
123
  i=model.append
124
- row.each{|k,v| i[headers.index(k)]=v}
124
+ row.each{|k,v| i[headers.key(k)]=v}
125
125
  end while (row=res.fetch_hash(true))
126
126
  sview.set_model(model)
127
127
  w.vbox.add(Gtk::ScrolledWindow.new.add(sview).set_policy(Gtk::POLICY_AUTOMATIC,Gtk::POLICY_AUTOMATIC)).set_size_request(600,400)
@@ -189,7 +189,7 @@ class QBuilder < Gtk::HPaned
189
189
  when "QBuilder"
190
190
  #we update ourself
191
191
  else
192
- edebug("notifier: #{new_value.class.name}","relation-builder",WARNING)
192
+ ewarn("notifier: #{new_value.class.name}","relation-builder")
193
193
  end
194
194
  @qobjects.each{|qobject| qobject.update}
195
195
  test_query if @autotest.active?
@@ -109,7 +109,7 @@ class QObject < Gtk::HBox
109
109
  ret=rel.rfield1 if rel.rfield1.table.table_id.to_i == @q.base_object.obj_id.to_i
110
110
  ret=rel.rfield2 if rel.rfield2.table.table_id.to_i == @q.base_object.obj_id.to_i
111
111
  unless ret
112
- @q.rb.relations.each{|r|
112
+ @q.rb.relations.each_pair{|rel_id,r|
113
113
  unless been_there.include?(r.relation_id)
114
114
  if r.rfield1.table.table_id == rel.rfield1.table.table_id or r.rfield2.table.table_id == rel.rfield1.table.table_id
115
115
  if other_dir=find_base_dir(r,been_there)
@@ -172,7 +172,7 @@ class QObject < Gtk::HBox
172
172
  @link=case @obj_type
173
173
  when "b" then @q.rb.table_by_id(@obj_id)
174
174
  when "f" then if table=@q.rb.table_by_id(@obj_id) then table.fields[@field]; end
175
- when "r" then @q.rb.relation_by_id(@obj_id)
175
+ when "r" then @q.rb.relations[@obj_id]
176
176
  else
177
177
  edebug("unknown type: #{@obj_type}","relation-builder",WARNING)
178
178
  nil
data/lib/Gtk.rb CHANGED
@@ -69,6 +69,28 @@ module Gtk
69
69
  self
70
70
  end
71
71
  end
72
+
73
+ class TreeIter
74
+ def next_with_children
75
+ ret=nil
76
+ if self.has_child?
77
+ ret=self.first_child
78
+ else
79
+ if clone.next!
80
+ self.next!
81
+ ret=self
82
+ else
83
+ if par=self.parent
84
+ if par.clone.next!
85
+ par.next!
86
+ ret=par
87
+ end
88
+ end
89
+ end
90
+ end
91
+ ret
92
+ end
93
+ end
72
94
 
73
95
  def self.is_windows?
74
96
  RUBY_PLATFORM.downcase.include?("mswin") || RUBY_PLATFORM.downcase.include?("mingw")
@@ -103,7 +103,7 @@ module Mylist
103
103
  end
104
104
  attr_accessor :list, :list_scroller, :list_panel, :list_id
105
105
  attr_accessor :notebook, :child_placement
106
- attr_reader :caller, :parentM, :widget, :info
106
+ attr_reader :caller, :parentM, :widget, :info, :gantt
107
107
  attr_accessor :buttonholder, :placeholder_button
108
108
 
109
109
  def embedd?
@@ -55,6 +55,11 @@ class MyEditableList < Gtk::TreeView
55
55
  }
56
56
  @tmp=Hash.new
57
57
  @is_embedded=nil
58
+ @keep_expanded=false
59
+
60
+ signal_connect("row-collapsed"){|me, iter, path|
61
+ me.expand_all if @keep_expanded
62
+ }
58
63
  end
59
64
  attr_accessor :caller, :selected, :list_id, :list_model, :parentM, :headertypes, :headers, :info, :title, :tip, :pop, :tmp, :is_embedded
60
65
 
@@ -157,6 +162,7 @@ class MyEditableList < Gtk::TreeView
157
162
  set_cursor_id(id_to_scroll,scroll)
158
163
  changed
159
164
  notify_observers(self)
165
+ expand_all if @keep_expanded
160
166
  get_cursor_id
161
167
  end
162
168
 
@@ -168,13 +174,12 @@ class MyEditableList < Gtk::TreeView
168
174
  case get_conf(0,0,"list-tooltip")
169
175
  when "filters" then
170
176
  t="filters:"
171
- @caller.list_filter_panel.list_filter.columns.each_key{|key|
172
- h=@caller.list_filter_panel.list_filter.columns[key].header
173
- fl=get_conf(get_id,h['id'],"filter")
174
- case h['type']
177
+ @caller.list_panel.list_filter.columns.each_value{|frenderer|
178
+ fl=get_conf(get_id,frenderer.header['id'],"filter")
179
+ case frenderer.header['type']
175
180
  when 'gtk_combo', 'gtk_const_combo' then fl = (fl=="-1" or fl=="") ? "" : "=#{fl}"
176
181
  end
177
- t+="\n#{h['header']}: #{fl}" if !fl.nil? and fl.length>0
182
+ t+="\n#{frenderer.header['header']}: #{fl}" if !fl.nil? and fl.length>0
178
183
  }
179
184
  t="#{t}\nnone" if t=="filters:"
180
185
  @tip.set_tip(self,t,'extra hint')
@@ -187,6 +192,7 @@ class MyEditableList < Gtk::TreeView
187
192
  edebug(" can't update","list","error")
188
193
  return
189
194
  end
195
+ @keep_expanded=(gtk_attribute("keep_expanded") || "false") == "true"
190
196
  set_model(nil)
191
197
  @list_model.create_skeleton
192
198
  set_info("initializing")
@@ -283,6 +289,25 @@ class MyEditableList < Gtk::TreeView
283
289
  next_col
284
290
  end
285
291
 
292
+ def column_by_id(column_id)
293
+ ret=nil
294
+ columns.each{|col|
295
+ if col.header['id'].to_i == column_id.to_i
296
+ ret=col
297
+ break
298
+ end
299
+ }
300
+ ret
301
+ end
302
+
303
+ def columns_height
304
+ colh=0
305
+ columns.each{|col|
306
+ colh=col.header_widget.allocation.height if col.header_widget.allocation.height > colh
307
+ }
308
+ colh
309
+ end
310
+
286
311
  def wipe
287
312
  save_config
288
313
  set_model(nil)
@@ -34,8 +34,10 @@ class MyColumn < Gtk::TreeViewColumn
34
34
  end
35
35
 
36
36
  super(header['header'],@renderer,attributes)
37
- set_widget(header_widget=Gtk::Label.new(header['header']).set_visible(true))
37
+ set_widget(@header_widget=Gtk::Label.new(header['header']).set_visible(true))
38
38
  header_widget.set_angle(gtk_attribute("header_angle").to_f) if gtk_attribute("header_angle")
39
+ @list.tip.set_tip(header_widget,header['header'],'extra hint')
40
+ @list.tip.enable
39
41
  #set color
40
42
  # header_widget.modify_fg(Gtk::STATE_NORMAL,Gdk::Color.new(0,35000, 0))
41
43
  # header_widget.modify_fg(Gtk::STATE_PRELIGHT,Gdk::Color.new(0,35000, 0))
@@ -122,7 +124,7 @@ class MyColumn < Gtk::TreeViewColumn
122
124
  =end
123
125
  end
124
126
  attr_accessor :list
125
- attr_accessor :header
127
+ attr_accessor :header, :header_widget
126
128
  attr_accessor :renderer
127
129
  attr_reader :decimals_attribute, :duration_format, :timestamp_format
128
130
 
@@ -39,6 +39,7 @@ class ListModel
39
39
  attr_reader :column_of_gantt_start, :column_of_gantt_duration, :column_of_gantt_successors, :column_of_gantt_group, :column_of_gantt_group_color, :column_of_gantt_partial, :column_of_gantt_percentage
40
40
  attr_reader :show_archive, :archive_key
41
41
  attr_reader :headers, :headertypes
42
+ attr_reader :foreground_legend, :background_legend
42
43
 
43
44
 
44
45
  def drbmodel
@@ -57,7 +58,7 @@ class ListModel
57
58
  def resubscribe
58
59
  begin
59
60
  @remote_model=manqod_db.moditem(get_id)
60
- drbmodel.subscribe(self)
61
+ drbmodel.subscribe(ManqodRPC.instance.to_s,self)
61
62
  rescue =>err
62
63
  retry if warn("can't reconnect to server",err.to_s,"list",ERROR,false,true)
63
64
  end
@@ -72,7 +73,7 @@ class ListModel
72
73
 
73
74
  def wipe
74
75
  begin
75
- drbmodel.unsubscribe(self) if @remote_model && @remote_model.alive?
76
+ drbmodel.unsubscribe(ManqodRPC.instance.to_s) if @remote_model && @remote_model.alive?
76
77
  rescue =>err
77
78
  eerror("unsubscribing: #{err}","main")
78
79
  end
@@ -174,7 +175,7 @@ class ListModel
174
175
  # list.progress.pulse(list.get_id)
175
176
  # @thread=Thread.new{
176
177
  begin
177
- drbmodel.unsubscribe(self) unless @remote_model.nil?
178
+ drbmodel.unsubscribe(ManqodRPC.instance.to_s) unless @remote_model.nil?
178
179
  rescue => err
179
180
  ewarn("server model is gone")
180
181
  end
@@ -215,7 +216,7 @@ class ListModel
215
216
  @column_of_fetch_filter=moditem_attributes[:column_of_fetch_filter]
216
217
  @archive_key=moditem_attributes[:archive_key]
217
218
 
218
- drbmodel.subscribe(self)
219
+ drbmodel.subscribe(ManqodRPC.instance.to_s,self)
219
220
 
220
221
 
221
222
  @parentM=list.parentM.get_model if list.parentM
@@ -287,6 +288,9 @@ class ListModel
287
288
  if gantt_percentage=list.gtk_attribute('gantt_percentage')
288
289
  @column_of_gantt_percentage=headers[gantt_percentage]
289
290
  end
291
+
292
+ @foreground_legend=cache.get("#{get_id}foreground")
293
+ @background_legend=cache.get("#{get_id}background")
290
294
 
291
295
  list.set_info("created")
292
296
  # }
@@ -356,7 +360,7 @@ class ListModel
356
360
  edebug("refiltering #{one}")
357
361
  if one.nil?
358
362
  list.set_model(nil)
359
- list.progress.zero(list.object_id,@rowcount,@moditem["display"])
363
+ list.progress.zero(list.object_id,@rows_loaded,@moditem["display"])
360
364
  @thread=Thread.new{
361
365
  r=0
362
366
  @data.each{|model, path, iter|
@@ -382,7 +386,7 @@ class ListModel
382
386
 
383
387
  @filtered_rowcount=0
384
388
  @data.each{|model, path, iter| @filtered_rowcount+=1 if iter[column_of_visible]}
385
- list.set_info("#{@filtered_rowcount}/#{@rowcount}")
389
+ list.set_info("#{@filtered_rowcount}/#{@rows_loaded}")
386
390
  self
387
391
  end
388
392
 
@@ -8,21 +8,22 @@ class ListPrintOperation < Gtk::PrintOperation
8
8
 
9
9
  def initialize(list)
10
10
  @list=list
11
- @print_sums=list.gtk_attribute("print_sums") || "true" =="true"
11
+ @print_sums=(list.gtk_attribute("print_sums") || "true") =="true"
12
12
  @sum_font=list.gtk_attribute("sum_font") || "verdana bold 6"
13
13
  @cell_font=list.gtk_attribute("cell_font") || "verdana 6"
14
14
  @columns_header_font=list.gtk_attribute("columns_header_font") || "verdana bold 6"
15
15
  @header_font=list.gtk_attribute("header_font") || "verdana bold 10"
16
16
  @footer_font=list.gtk_attribute("footer_font") || "verdana 6"
17
17
  @date_font=list.gtk_attribute("date_font") || "verdana 5"
18
- @print_date=list.gtk_attribute("print_date") || "true" == "true"
18
+ @print_date=(list.gtk_attribute("print_date") || "true") == "true"
19
19
  @row_spacing=(list.gtk_attribute("row_spacing") || 1.0).to_f
20
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"
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
+ @print_title=(list.gtk_attribute("print_title") || "true") == "true"
25
+ @draw_header_cell_borders=(list.gtk_attribute("draw_header_cell_borders") || "true") == "true"
26
+ @fill_header_background=(list.gtk_attribute("fill_header_background") || "true") == "true"
26
27
  @row_underline=(list.gtk_attribute("row_underline") || 0.0).to_f
27
28
 
28
29
  if @print_with_child=list.gtk_attribute("print_with_child")
@@ -30,7 +31,7 @@ class ListPrintOperation < Gtk::PrintOperation
30
31
  @child_model=Gtk::TreeModelSort.new(@child_list.list_model.data)
31
32
  @child_model.set_sort_column_id(@child_list.list_model.sorter.sort_column_id[0],@child_list.list_model.sorter.sort_column_id[1]) unless @child_list.list_model.sorter.sort_column_id.nil?
32
33
  end
33
- @print_sub_sums=list.gtk_attribute("print_sub_sums") || "true" == "true"
34
+ @print_sub_sums=(list.gtk_attribute("print_sub_sums") || "true") == "true"
34
35
  @child_indent=(list.gtk_attribute("child_indent") || 100).to_f
35
36
  @child_cell_font=list.gtk_attribute("child_cell_font") || "verdana 5"
36
37
  @child_sum_font=list.gtk_attribute("child_sum_font") || "verdana bold 5"
@@ -40,6 +41,9 @@ class ListPrintOperation < Gtk::PrintOperation
40
41
  @footer_line_width=(list.gtk_attribute("footer_line_width") || 1.0).to_f
41
42
  @cell_line_width=(list.gtk_attribute("cell_line_width") || 0.3).to_f
42
43
  @sum_line_width=(list.gtk_attribute("sum_line_width") || 0.6).to_f
44
+
45
+ @print_with_gantt=(list.gtk_attribute("print_with_gantt") || "false") == "true"
46
+ @gantt_cell_font=list.gtk_attribute("gantt_cell_font") || "verdana 5"
43
47
 
44
48
  @line_width=1
45
49
 
@@ -66,8 +70,9 @@ class ListPrintOperation < Gtk::PrintOperation
66
70
  col_cnt+=1
67
71
  end
68
72
  } #summ the width of all columns
73
+ columns_width_sum+=list.holder.widget.allocation.width - list.allocation.width if @print_with_gantt
69
74
  coef=(width-col_cnt*@column_spacing)/columns_width_sum
70
- edebug("colums width sum: #{columns_width_sum}","printing","info")
75
+ einfo("colums width sum: #{columns_width_sum}","printing")
71
76
 
72
77
  #@column_width will store the column positions on the context
73
78
  @column_width=Hash.new
@@ -80,6 +85,10 @@ class ListPrintOperation < Gtk::PrintOperation
80
85
  col_cur_pos+=@column_width[col.data]+@column_spacing
81
86
  end
82
87
  }
88
+ if @print_with_gantt
89
+ @column_pos[:gantt]=col_cur_pos
90
+ @column_width[:gantt]=(list.holder.widget.allocation.width - list.allocation.width).to_f*coef
91
+ end
83
92
  if child_list
84
93
  columns_width_sum=@child_indent.to_f
85
94
  col_cnt=0
@@ -90,7 +99,7 @@ class ListPrintOperation < Gtk::PrintOperation
90
99
  end
91
100
  } #summ the width of all columns
92
101
  coef=(width-col_cnt*@column_spacing)/columns_width_sum
93
- edebug("child colums width sum: #{columns_width_sum}","printing","info")
102
+ einfo("child colums width sum: #{columns_width_sum}","printing")
94
103
 
95
104
  #@column_width will store the column positions on the context
96
105
  col_cur_pos=@child_indent.to_f*coef
@@ -109,11 +118,11 @@ class ListPrintOperation < Gtk::PrintOperation
109
118
  @header=HeaderLayout.new(cr,self)
110
119
  @current_height=@current_height+@header.height
111
120
  @columns_header=ColumnsHeaderLayout.new(self,cr,list.columns,@columns_header_font)
112
- @columns_header.y=@current_height
121
+ @columns_header.set_y(@current_height)
113
122
  @current_height=@current_height+@columns_header.height+@row_spacing
114
123
  if child_list
115
124
  @child_columns_header=ColumnsHeaderLayout.new(self,cr,child_list.columns,@child_columns_header_font) if child_list
116
- @child_columns_header.y=@current_height
125
+ @child_columns_header.set_y(@current_height)
117
126
  @current_height=@current_height+@child_columns_header.height+@row_spacing
118
127
  end
119
128
  @headers_height=@current_height
@@ -211,7 +220,7 @@ class ListPrintOperation < Gtk::PrintOperation
211
220
  if @piter.nil?
212
221
  break if past_last=!@piter=list.model.iter_first
213
222
  else
214
- break if past_last=!@piter.next!
223
+ break if past_last=!@piter.next_with_children
215
224
  end
216
225
  @sums.each_key{|key| @sums[key]=@sums[key]+@piter[key].to_f}
217
226
  il=IterLayout.new(cr,@piter,list.columns, self,cell_font)
@@ -237,10 +246,10 @@ class ListPrintOperation < Gtk::PrintOperation
237
246
  il=IterLayout.new(cr,@piter,list.columns, self,cell_font)
238
247
  if lay_it(il)
239
248
  #do not print it twice
240
- past_last=!@piter.next!
249
+ past_last=!@piter.next_with_children
241
250
  break
242
251
  end
243
- break if past_last=!@piter.next!
252
+ break if past_last=!@piter=@piter.next_with_children
244
253
  edebug("piter: #{@piter[list.list_model.column_of_id]} #{@past_last}","printing","debug")
245
254
  end
246
255
  end
@@ -299,7 +308,7 @@ class ListPrintOperation < Gtk::PrintOperation
299
308
  attr_accessor :fill_header_background, :header_line_width
300
309
  attr_accessor :row_spacing
301
310
  attr_accessor :column_spacing
302
- attr_reader :cell_line_width, :sum_line_width, :row_underline
311
+ attr_reader :cell_line_width, :sum_line_width, :row_underline, :print_title, :print_with_gantt, :gantt_cell_font
303
312
  def lay_it(il)
304
313
  if @current_height + il.row_height > @footer.y
305
314
  #page full
@@ -309,8 +318,8 @@ class ListPrintOperation < Gtk::PrintOperation
309
318
  @current_height=@headers_height
310
319
  @page_n=@page_n+1
311
320
  end
312
- il.page=@page_n
313
- il.y=@current_height
321
+ il.set_page(@page_n)
322
+ il.set_y(@current_height)
314
323
  @current_height=@current_height+il.row_height+@row_spacing
315
324
  @iter_layouts.push(il)
316
325
  edebug(il.inspect,"printing")