origami 2.0.0 → 2.0.1

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 (80) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -0
  3. data/bin/gui/config.rb +2 -1
  4. data/bin/gui/file.rb +118 -240
  5. data/bin/gui/gtkhex.rb +5 -5
  6. data/bin/gui/hexview.rb +20 -16
  7. data/bin/gui/imgview.rb +1 -1
  8. data/bin/gui/menu.rb +138 -158
  9. data/bin/gui/properties.rb +46 -48
  10. data/bin/gui/signing.rb +183 -214
  11. data/bin/gui/textview.rb +1 -1
  12. data/bin/gui/treeview.rb +13 -7
  13. data/bin/gui/walker.rb +102 -71
  14. data/bin/gui/xrefs.rb +1 -1
  15. data/bin/pdf2ruby +3 -3
  16. data/bin/pdfcop +18 -11
  17. data/bin/pdfextract +14 -5
  18. data/bin/pdfmetadata +3 -3
  19. data/bin/shell/console.rb +8 -8
  20. data/bin/shell/hexdump.rb +4 -4
  21. data/examples/attachments/nested_document.rb +1 -1
  22. data/examples/javascript/hello_world.rb +3 -3
  23. data/lib/origami.rb +0 -1
  24. data/lib/origami/acroform.rb +3 -3
  25. data/lib/origami/array.rb +1 -3
  26. data/lib/origami/boolean.rb +1 -3
  27. data/lib/origami/catalog.rb +3 -9
  28. data/lib/origami/destinations.rb +2 -2
  29. data/lib/origami/dictionary.rb +15 -29
  30. data/lib/origami/encryption.rb +334 -692
  31. data/lib/origami/extensions/fdf.rb +3 -2
  32. data/lib/origami/extensions/ppklite.rb +5 -9
  33. data/lib/origami/filespec.rb +2 -2
  34. data/lib/origami/filters.rb +54 -36
  35. data/lib/origami/filters/ascii.rb +67 -49
  36. data/lib/origami/filters/ccitt.rb +4 -236
  37. data/lib/origami/filters/ccitt/tables.rb +267 -0
  38. data/lib/origami/filters/crypt.rb +1 -1
  39. data/lib/origami/filters/dct.rb +0 -1
  40. data/lib/origami/filters/flate.rb +3 -43
  41. data/lib/origami/filters/lzw.rb +62 -99
  42. data/lib/origami/filters/predictors.rb +135 -105
  43. data/lib/origami/filters/runlength.rb +34 -22
  44. data/lib/origami/graphics.rb +2 -2
  45. data/lib/origami/graphics/colors.rb +89 -63
  46. data/lib/origami/graphics/path.rb +14 -14
  47. data/lib/origami/graphics/patterns.rb +31 -33
  48. data/lib/origami/graphics/render.rb +0 -1
  49. data/lib/origami/graphics/state.rb +9 -9
  50. data/lib/origami/graphics/text.rb +17 -17
  51. data/lib/origami/graphics/xobject.rb +102 -92
  52. data/lib/origami/javascript.rb +91 -68
  53. data/lib/origami/linearization.rb +22 -20
  54. data/lib/origami/metadata.rb +1 -1
  55. data/lib/origami/name.rb +1 -3
  56. data/lib/origami/null.rb +1 -3
  57. data/lib/origami/numeric.rb +3 -13
  58. data/lib/origami/object.rb +100 -72
  59. data/lib/origami/page.rb +24 -28
  60. data/lib/origami/parser.rb +34 -51
  61. data/lib/origami/parsers/fdf.rb +2 -2
  62. data/lib/origami/parsers/pdf.rb +41 -18
  63. data/lib/origami/parsers/pdf/lazy.rb +83 -46
  64. data/lib/origami/parsers/pdf/linear.rb +19 -10
  65. data/lib/origami/parsers/ppklite.rb +1 -1
  66. data/lib/origami/pdf.rb +150 -206
  67. data/lib/origami/reference.rb +4 -6
  68. data/lib/origami/signature.rb +76 -48
  69. data/lib/origami/stream.rb +69 -63
  70. data/lib/origami/string.rb +2 -19
  71. data/lib/origami/trailer.rb +25 -22
  72. data/lib/origami/version.rb +1 -1
  73. data/lib/origami/xfa.rb +6 -4
  74. data/lib/origami/xreftable.rb +29 -29
  75. data/test/test_annotations.rb +16 -38
  76. data/test/test_pdf_attachment.rb +1 -1
  77. data/test/test_pdf_parse.rb +1 -1
  78. data/test/test_xrefs.rb +2 -2
  79. metadata +4 -4
  80. data/lib/origami/export.rb +0 -247
@@ -52,29 +52,33 @@ module PDFWalker
52
52
  def load(object)
53
53
  return if @current_obj.equal?(object)
54
54
 
55
- begin
56
- self.clear
55
+ self.clear
57
56
 
58
- case object
59
- when Origami::Stream
60
- begin
61
- @view.set_data(object.data)
62
- rescue Origami::Filter::Error
63
- @view.set_data($!.input_data) if $!.input_data
57
+ case object
58
+ when Origami::Stream
59
+ load_stream(object)
60
+ when Origami::String
61
+ load_string(object)
62
+ end
64
63
 
65
- @parent.error("#{$!.class}: #{$!.message}") unless object.filters == [ :DCTDecode ]
66
- end
64
+ @current_obj = object
65
+ end
67
66
 
68
- when Origami::String
69
- @view.set_data(object.value)
70
- end
67
+ private
71
68
 
72
- @current_obj = object
69
+ def load_stream(object)
70
+ begin
71
+ @view.set_data(object.data)
72
+ rescue Origami::Filter::Error
73
+ @view.set_data($!.input_data) if $!.input_data
73
74
 
74
- rescue
75
- @parent.error("An error occured while loading this object.\n#{$!} (#{$!.class})")
75
+ @parent.error("#{$!.class}: #{$!.message}") unless object.filters == [ :DCTDecode ]
76
76
  end
77
77
  end
78
+
79
+ def load_string(object)
80
+ @view.set_data(object.value)
81
+ end
78
82
  end
79
83
  end
80
84
  end
@@ -31,7 +31,7 @@ module PDFWalker
31
31
  set_resizable false
32
32
 
33
33
  add_events(Gdk::Event::KEY_RELEASE_MASK)
34
- signal_connect('key_release_event') { |w, event|
34
+ signal_connect('key_release_event') { |_, event|
35
35
  destroy if event.keyval == Gdk::Keyval::GDK_Escape
36
36
  }
37
37
  end
@@ -20,32 +20,25 @@
20
20
 
21
21
  module PDFWalker
22
22
 
23
- module Popable
23
+ module PopupMenu
24
24
 
25
25
  @@menus = Hash.new([])
26
- @@menus[:"PDF File"] =
26
+ @@menus['PDF'] =
27
27
  [
28
28
  {
29
29
  Name: Stock::SAVE_AS,
30
30
  Sensitive: true,
31
- Callback: lambda { |widget, viewer, path|
31
+ Callback: lambda { |_widget, viewer, _path|
32
32
  viewer.parent.save
33
33
  }
34
34
  },
35
- {
36
- Name: "Serialize",
37
- Sensitive: true,
38
- Callback: lambda { |widget, viewer, path|
39
- viewer.parent.serialize
40
- }
41
- },
42
35
  {
43
36
  Name: :"---"
44
37
  },
45
38
  {
46
39
  Name: Stock::PROPERTIES,
47
40
  Sensitive: true,
48
- Callback: lambda { |widget, viewer, path|
41
+ Callback: lambda { |_widget, viewer, _path|
49
42
  viewer.parent.display_file_properties
50
43
  }
51
44
  },
@@ -55,29 +48,29 @@ module PDFWalker
55
48
  {
56
49
  Name: Stock::CLOSE,
57
50
  Sensitive: true,
58
- Callback: lambda { |widget, viewer, path|
51
+ Callback: lambda { |_widget, viewer, _path|
59
52
  viewer.parent.close
60
53
  }
61
54
  }
62
55
  ]
63
56
 
64
- @@menus[:Reference] =
57
+ @@menus['Reference'] =
65
58
  [
66
59
  {
67
60
  Name: Stock::JUMP_TO,
68
61
  Sensitive: true,
69
- Callback: lambda { |widget, viewer, path|
62
+ Callback: lambda { |_widget, viewer, path|
70
63
  viewer.row_activated(path, viewer.get_column(viewer.class::TEXTCOL))
71
64
  }
72
65
  }
73
66
  ]
74
67
 
75
- @@menus[:Revision] =
68
+ @@menus['Revision'] =
76
69
  [
77
70
  {
78
71
  Name: "Save to this revision",
79
72
  Sensitive: true,
80
- Callback: lambda { |widget, viewer, path|
73
+ Callback: lambda { |_widget, viewer, path|
81
74
  revstr = viewer.model.get_value(viewer.model.get_iter(path), viewer.class::TEXTCOL)
82
75
  revstr.slice!(0, "Revision ".size)
83
76
 
@@ -102,42 +95,42 @@ module PDFWalker
102
95
  }
103
96
  ]
104
97
 
105
- @@menus[:Stream] =
98
+ @@menus['Stream'] =
106
99
  [
107
100
  {
108
101
  Name: "Dump encoded stream",
109
102
  Sensitive: true,
110
- Callback: lambda { |widget, viewer, path|
111
- stream = viewer.model.get_value(viewer.model.get_iter(path), viewer.class::OBJCOL)
103
+ Callback: lambda { |_widget, viewer, path|
104
+ stream = viewer.object_by_path(path)
112
105
 
113
- viewer.parent.save_data("Save stream to file", stream.encoded_data)
106
+ viewer.parent.save_data("Save encoded stream to file", stream.encoded_data)
114
107
  }
115
108
  },
116
109
  {
117
110
  Name: "Dump decoded stream",
118
111
  Sensitive: true,
119
- Callback: lambda { |widget, viewer, path|
120
- stream = viewer.model.get_value(viewer.model.get_iter(path), viewer.class::OBJCOL)
112
+ Callback: lambda { |_widget, viewer, path|
113
+ stream = viewer.object_by_path(path)
121
114
 
122
- viewer.parent.save_data("Save stream to file", stream.data)
115
+ viewer.parent.save_data("Save decoded stream to file", stream.data)
123
116
  }
124
117
  }
125
118
  ]
126
119
 
127
- @@menus[:String] =
120
+ @@menus['String'] =
128
121
  [
129
122
  {
130
123
  Name: "Dump string",
131
124
  Sensitive: true,
132
- Callback: lambda { |widget, viewer, path|
133
- string = viewer.model.get_value(viewer.model.get_iter(path), viewer.class::OBJCOL)
125
+ Callback: lambda { |_widget, viewer, path|
126
+ string = viewer.object_by_path(path)
134
127
 
135
128
  viewer.parent.save_data("Save string to file", string.value)
136
129
  }
137
130
  }
138
131
  ]
139
132
 
140
- @@menus[:Image] = @@menus[:Stream] +
133
+ @@menus['Image'] = @@menus['Stream'] +
141
134
  [
142
135
  {
143
136
  Name: :"---"
@@ -145,8 +138,8 @@ module PDFWalker
145
138
  {
146
139
  Name: "View image",
147
140
  Sensitive: true,
148
- Callback: lambda { |widget, viewer, path|
149
- stm = viewer.model.get_value(viewer.model.get_iter(path), viewer.class::OBJCOL)
141
+ Callback: lambda { |_widget, viewer, path|
142
+ stm = viewer.object_by_path(path)
150
143
  w,h = stm.Width, stm.Height
151
144
 
152
145
  if stm.ColorSpace.nil?
@@ -183,67 +176,50 @@ module PDFWalker
183
176
  def popup_menu(obj, event, path)
184
177
  menu = Menu.new
185
178
 
186
- type =
187
- if obj.is_a?(Origami::Object)
188
- if obj.is_a?(Origami::Graphics::ImageXObject)
189
- :Image
190
- else
191
- obj.native_type.to_s.split("::").last.to_sym
192
- end
193
- else
194
- case obj
195
- when Origami::PDF
196
- :"PDF File"
197
- when Origami::PDF::Revision, Origami::FDF::Revision, Origami::PPKLite::Revision
198
- :Revision
199
- when ::Array
200
- :Body
201
- when Origami::PDF::Header, Origami::FDF::Header, Origami::PPKLite::Header
202
- :Header
203
- when Origami::Trailer
204
- :Trailer
205
- when Origami::XRef::Section
206
- :XRefSection
207
- when Origami::XRef::Subsection
208
- :XRefSubsection
209
- when Origami::XRef, Origami::XRefToCompressedObj
210
- :XRef
211
- else
212
- :Unknown
213
- end
214
- end
179
+ type = popup_menu_key(obj)
215
180
 
181
+ # Create menu title.
216
182
  title = obj.is_a?(Origami::Object) ? "Object : " : ""
217
183
  title << type.to_s
218
184
  menu.append(MenuItem.new(title).set_sensitive(false).modify_text(Gtk::STATE_INSENSITIVE, Gdk::Color.new(255,0,255)))
219
185
 
220
- if obj.is_a?(Origami::Object)
221
- if obj.indirect?
222
- menu.append(MenuItem.new("Number : #{obj.no}; Generation : #{obj.generation}").set_sensitive(false))
223
- menu.append(MenuItem.new("File offset : #{obj.file_offset}").set_sensitive(false))
186
+ # Object information.
187
+ create_object_menu(menu, obj) if obj.is_a?(Origami::Object)
224
188
 
225
- getxrefs = MenuItem.new("Search references to this object").set_sensitive(true)
226
- getxrefs.signal_connect("activate") do
227
- ref = self.model.get_value(self.model.get_iter(path), self.class::OBJCOL)
228
- self.parent.show_xrefs(ref)
229
- end
189
+ # Type-specific menu.
190
+ create_type_menu(menu, type, path)
230
191
 
231
- menu.append(getxrefs)
232
- elsif not obj.parent.nil?
233
- gotoparent = MenuItem.new("Goto Parent Object").set_sensitive(true)
234
- gotoparent.signal_connect("activate") do
235
- dest = self.model.get_value(self.model.get_iter(path), self.class::OBJCOL).parent
236
- self.goto(dest)
237
- end
192
+ menu.show_all
193
+ menu.popup(nil, nil, event.button, event.time)
194
+ end
195
+
196
+ private
197
+
198
+ def create_object_menu(menu, object)
199
+ if object.indirect?
200
+ menu.append(MenuItem.new("Number : #{object.no}; Generation : #{object.generation}").set_sensitive(false))
201
+ menu.append(MenuItem.new("File offset : #{object.file_offset}").set_sensitive(false))
202
+
203
+ getxrefs = MenuItem.new("Search references to this object").set_sensitive(true)
204
+ getxrefs.signal_connect("activate") do
205
+ self.parent.show_xrefs(object)
206
+ end
207
+ menu.append(getxrefs)
238
208
 
239
- menu.append(gotoparent)
209
+ elsif not object.parent.nil?
210
+ gotoparent = MenuItem.new("Goto Parent Object").set_sensitive(true)
211
+ gotoparent.signal_connect("activate") do
212
+ self.goto(object.parent)
240
213
  end
214
+ menu.append(gotoparent)
241
215
  end
216
+ end
242
217
 
218
+ def create_type_menu(menu, type, path)
243
219
  items = @@menus[type]
244
220
  menu.append(SeparatorMenuItem.new) if not items.empty?
245
221
 
246
- items.each { |item|
222
+ items.each do |item|
247
223
  if item[:Name] == :"---"
248
224
  entry = SeparatorMenuItem.new
249
225
  else
@@ -258,10 +234,34 @@ module PDFWalker
258
234
  end
259
235
 
260
236
  menu.append(entry)
261
- }
237
+ end
238
+ end
262
239
 
263
- menu.show_all
264
- menu.popup(nil, nil, event.button, event.time)
240
+ def popup_menu_key(object)
241
+ if object.is_a?(Origami::Object)
242
+ popup_menu_object_key(object)
243
+ else
244
+ popup_menu_struct_key(object)
245
+ end
246
+ end
247
+
248
+ def popup_menu_object_key(object)
249
+ if object.is_a?(Origami::Graphics::ImageXObject)
250
+ 'Image'
251
+ else
252
+ object.native_type.to_s.split("::").last
253
+ end
254
+ end
255
+
256
+ def popup_menu_struct_key(struct)
257
+ case struct
258
+ when ::Array
259
+ 'Body'
260
+ when Origami::XRef, Origami::XRefToCompressedObject
261
+ 'XRef'
262
+ else
263
+ struct.class.name.split('::').last
264
+ end
265
265
  end
266
266
  end
267
267
 
@@ -279,110 +279,90 @@ module PDFWalker
279
279
 
280
280
  @menu = MenuBar.new
281
281
 
282
- ####################################################
282
+ create_file_menu
283
+ create_document_menu
284
+ create_help_menu
285
+ end
286
+
287
+ def create_file_menu
283
288
  file_ag = Gtk::AccelGroup.new
284
289
  @file_menu = Menu.new.set_accel_group(file_ag).set_accel_path("<PDF Walker>/File")
285
290
  add_accel_group(file_ag)
286
291
 
287
- @file_menu_open = ImageMenuItem.new(Stock::OPEN).set_accel_path("<PDF Walker>/File/Open")
288
- @file_menu_recent = MenuItem.new("Last opened")
289
- @file_menu_deserialize = MenuItem.new("Deserialize")
290
- @file_menu_refresh = ImageMenuItem.new(Stock::REFRESH).set_sensitive(false).set_accel_path("<PDF Walker>/File/Refresh")
291
- @file_menu_close = ImageMenuItem.new(Stock::CLOSE).set_sensitive(false).set_accel_path("<PDF Walker>/File/Close")
292
- @file_menu_saveas = ImageMenuItem.new(Stock::SAVE_AS).set_sensitive(false)
293
- @file_menu_serialize = MenuItem.new("Serialize").set_sensitive(false)
294
- @file_menu_exit = ImageMenuItem.new(Stock::QUIT).set_accel_path("<PDF Walker>/File/Quit")
295
-
296
- @export_menu = Menu.new
297
- @export_pdf_menu = MenuItem.new("As PDF").set_accel_path("<PDF Walker>/File/Save")
298
- @export_graph_menu = MenuItem.new("As GraphViz dot file")
299
- @export_graphml_menu = MenuItem.new("As GraphML file")
300
-
301
- @export_pdf_menu.signal_connect('activate') do save end
302
- @export_graph_menu.signal_connect('activate') do save_dot end
303
- @export_graphml_menu.signal_connect('activate') do save_graphml end
304
-
305
- @export_menu.append(@export_pdf_menu)
306
- @export_menu.append(@export_graph_menu)
307
- @export_menu.append(@export_graphml_menu)
308
-
309
- @file_menu_saveas.set_submenu(@export_menu)
310
-
311
- @file_menu_open.signal_connect('activate') do open end
312
- @file_menu_deserialize.signal_connect('activate') do deserialize end
313
- @file_menu_refresh.signal_connect('activate') do open(@filename) end
314
- @file_menu_close.signal_connect('activate') do close end
315
- @file_menu_serialize.signal_connect('activate') do serialize end
316
- @file_menu_exit.signal_connect('activate') do self.destroy end
292
+ entries = [
293
+ @file_menu_open = ImageMenuItem.new(Stock::OPEN).set_accel_path("<PDF Walker>/File/Open"),
294
+ @file_menu_recent = MenuItem.new("Last opened"),
295
+ @file_menu_refresh = ImageMenuItem.new(Stock::REFRESH).set_sensitive(false).set_accel_path("<PDF Walker>/File/Refresh"),
296
+ @file_menu_close = ImageMenuItem.new(Stock::CLOSE).set_sensitive(false).set_accel_path("<PDF Walker>/File/Close"),
297
+ @file_menu_saveas = ImageMenuItem.new(Stock::SAVE_AS).set_sensitive(false).set_accel_path("<PDF Walker>/File/Save"),
298
+ @file_menu_exit = ImageMenuItem.new(Stock::QUIT).set_accel_path("<PDF Walker>/File/Quit"),
299
+ ]
300
+
301
+ @file_menu_open.signal_connect('activate') { open }
302
+ @file_menu_refresh.signal_connect('activate') { open(@filename) }
303
+ @file_menu_close.signal_connect('activate') { close }
304
+ @file_menu_saveas.signal_connect('activate') { save }
305
+ @file_menu_exit.signal_connect('activate') { self.destroy }
317
306
 
318
307
  update_recent_menu
319
308
 
320
- @file_menu.append(@file_menu_open)
321
- @file_menu.append(@file_menu_recent)
322
- @file_menu.append(@file_menu_deserialize)
323
- @file_menu.append(@file_menu_refresh)
324
- @file_menu.append(@file_menu_close)
325
- @file_menu.append(@file_menu_saveas)
326
- @file_menu.append(@file_menu_serialize)
327
- @file_menu.append(@file_menu_exit)
309
+ entries.each do |entry|
310
+ @file_menu.append(entry)
311
+ end
328
312
 
329
313
  @menu.append(MenuItem.new('_File').set_submenu(@file_menu))
330
- ####################################################
314
+ end
331
315
 
316
+ def create_document_menu
332
317
  doc_ag = Gtk::AccelGroup.new
333
318
  @document_menu = Menu.new.set_accel_group(doc_ag)
334
319
  add_accel_group(doc_ag)
335
320
 
336
- @document_menu_search = ImageMenuItem.new(Stock::FIND).set_sensitive(false).set_accel_path("<PDF Walker>/Document/Search")
337
- @document_menu_gotocatalog = MenuItem.new("Jump to Catalog").set_sensitive(false)
338
- @document_menu_gotodocinfo = MenuItem.new("Jump to Document Info").set_sensitive(false)
339
- @document_menu_gotometadata = MenuItem.new("Jump to Metadata").set_sensitive(false)
340
- @document_menu_gotorev = MenuItem.new("Jump to Revision...").set_sensitive(false)
341
- @document_menu_gotopage = MenuItem.new("Jump to Page...").set_sensitive(false)
342
- @document_menu_gotofield = MenuItem.new("Jump to Field...").set_sensitive(false)
343
- @document_menu_gotoobj = MenuItem.new("Jump to Object...").set_sensitive(false)
344
- @document_menu_properties = ImageMenuItem.new(Stock::PROPERTIES).set_sensitive(false)
345
- @document_menu_sign = MenuItem.new("Sign the document").set_sensitive(false)
346
- @document_menu_ur = MenuItem.new("Enable Usage Rights").set_sensitive(false)
347
-
348
- @document_menu_search.signal_connect('activate') do search end
349
- @document_menu_gotocatalog.signal_connect('activate') do goto_catalog end
350
- @document_menu_gotodocinfo.signal_connect('activate') do goto_docinfo end
351
- @document_menu_gotometadata.signal_connect('activate') do goto_metadata end
352
- @document_menu_gotoobj.signal_connect('activate') do goto_object end
353
- @document_menu_properties.signal_connect('activate') do display_file_properties end
354
- @document_menu_sign.signal_connect('activate') do display_signing_wizard end
355
- @document_menu_ur.signal_connect('activate') do display_usage_rights_wizard end
356
-
357
- @document_menu.append(@document_menu_search)
358
- @document_menu.append(MenuItem.new)
359
- @document_menu.append(@document_menu_gotocatalog)
360
- @document_menu.append(@document_menu_gotodocinfo)
361
- @document_menu.append(@document_menu_gotometadata)
362
- @document_menu.append(@document_menu_gotorev)
363
- @document_menu.append(@document_menu_gotopage)
364
- @document_menu.append(@document_menu_gotofield)
365
- @document_menu.append(@document_menu_gotoobj)
366
- @document_menu.append(MenuItem.new)
367
- @document_menu.append(@document_menu_sign)
368
- @document_menu.append(@document_menu_ur)
369
- @document_menu.append(@document_menu_properties)
321
+ entries = [
322
+ @document_menu_search = ImageMenuItem.new(Stock::FIND).set_sensitive(false).set_accel_path("<PDF Walker>/Document/Search"),
323
+ MenuItem.new,
324
+ @document_menu_gotocatalog = MenuItem.new("Jump to Catalog").set_sensitive(false),
325
+ @document_menu_gotodocinfo = MenuItem.new("Jump to Document Info").set_sensitive(false),
326
+ @document_menu_gotometadata = MenuItem.new("Jump to Metadata").set_sensitive(false),
327
+ @document_menu_gotorev = MenuItem.new("Jump to Revision...").set_sensitive(false),
328
+ @document_menu_gotopage = MenuItem.new("Jump to Page...").set_sensitive(false),
329
+ @document_menu_gotofield = MenuItem.new("Jump to Field...").set_sensitive(false),
330
+ @document_menu_gotoobj = MenuItem.new("Jump to Object...").set_sensitive(false),
331
+ MenuItem.new,
332
+ @document_menu_sign = MenuItem.new("Sign the document").set_sensitive(false),
333
+ @document_menu_ur = MenuItem.new("Enable Usage Rights").set_sensitive(false),
334
+ @document_menu_properties = ImageMenuItem.new(Stock::PROPERTIES).set_sensitive(false),
335
+ ]
336
+
337
+ @document_menu_search.signal_connect('activate') { search }
338
+ @document_menu_gotocatalog.signal_connect('activate') { goto_catalog }
339
+ @document_menu_gotodocinfo.signal_connect('activate') { goto_docinfo }
340
+ @document_menu_gotometadata.signal_connect('activate') { goto_metadata }
341
+ @document_menu_gotoobj.signal_connect('activate') { goto_object }
342
+ @document_menu_properties.signal_connect('activate') { display_file_properties }
343
+ @document_menu_sign.signal_connect('activate') { display_signing_wizard }
344
+ @document_menu_ur.signal_connect('activate') { display_usage_rights_wizard }
345
+
346
+ entries.each do |entry|
347
+ @document_menu.append(entry)
348
+ end
370
349
 
371
350
  @menu.append(MenuItem.new('_Document').set_submenu(@document_menu))
372
- ####################################################
351
+ end
352
+
353
+ def create_help_menu
373
354
  @help_menu = Menu.new
374
- @help_menu_profile = CheckMenuItem.new("Profiling (Debug purposes only)").set_active(@config.profile?)
375
- @help_menu_profile.signal_connect('toggled') do @config.set_profiling(@help_menu_profile.active?) end
376
355
 
356
+ @help_menu_profile = CheckMenuItem.new("Profiling (Debug purposes only)").set_active(@config.profile?)
377
357
  @help_menu_about = ImageMenuItem.new(Stock::ABOUT)
378
358
 
379
- @help_menu_about.signal_connect('activate') do about end
359
+ @help_menu_profile.signal_connect('toggled') do @config.set_profiling(@help_menu_profile.active?) end
360
+ @help_menu_about.signal_connect('activate') { about }
380
361
 
381
362
  @help_menu.append(@help_menu_profile)
382
363
  @help_menu.append(@help_menu_about)
383
364
 
384
365
  @menu.append(MenuItem.new('_Help').set_submenu(@help_menu))
385
- ####################################################
386
366
  end
387
367
 
388
368
  def update_recent_menu