ruber 0.0.8 → 0.0.9

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 (81) hide show
  1. data/CHANGES +21 -0
  2. data/data/share/apps/ruber/ruberui.rc +3 -1
  3. data/lib/ruber/application/application.rb +22 -23
  4. data/lib/ruber/application/plugin.yaml +7 -2
  5. data/lib/ruber/{projects → application}/project_files_list.rb +0 -0
  6. data/lib/ruber/{projects → application}/project_files_widget.rb +0 -0
  7. data/lib/ruber/application/ui/project_files_rule_chooser_widget.rb +74 -0
  8. data/lib/ruber/{projects → application}/ui/project_files_rule_chooser_widget.ui +0 -0
  9. data/lib/ruber/application/ui/project_files_widget.rb +117 -0
  10. data/lib/ruber/{projects → application}/ui/project_files_widget.ui +0 -0
  11. data/lib/ruber/component_manager.rb +14 -9
  12. data/lib/ruber/editor/document.rb +35 -5
  13. data/lib/ruber/kde_sugar.rb +16 -0
  14. data/lib/ruber/main_window/choose_plugins_dlg.rb +7 -4
  15. data/lib/ruber/main_window/main_window.rb +131 -193
  16. data/lib/ruber/main_window/main_window_actions.rb +157 -58
  17. data/lib/ruber/main_window/main_window_internal.rb +145 -54
  18. data/lib/ruber/main_window/open_file_in_project_dlg.rb +4 -4
  19. data/lib/ruber/main_window/plugin.yaml +3 -6
  20. data/lib/ruber/main_window/ui/workspace_settings_widget.rb +2 -2
  21. data/lib/ruber/main_window/workspace.rb +62 -32
  22. data/lib/ruber/output_widget.rb +20 -16
  23. data/lib/ruber/pane.rb +11 -5
  24. data/lib/ruber/project.rb +27 -12
  25. data/lib/ruber/projects/ui/project_files_rule_chooser_widget.rb +2 -2
  26. data/lib/ruber/projects/ui/project_files_widget.rb +2 -2
  27. data/lib/ruber/utils.rb +37 -4
  28. data/lib/ruber/version.rb +1 -1
  29. data/lib/ruber/world/document_factory.rb +121 -0
  30. data/lib/ruber/world/document_list.rb +396 -0
  31. data/lib/ruber/world/environment.rb +470 -0
  32. data/lib/ruber/{main_window → world}/hint_solver.rb +1 -1
  33. data/lib/ruber/world/plugin.yaml +11 -0
  34. data/lib/ruber/world/project_factory.rb +131 -0
  35. data/lib/ruber/world/project_list.rb +265 -0
  36. data/lib/ruber/world/ui/workspace_settings_widget.rb +51 -0
  37. data/lib/ruber/{main_window → world}/ui/workspace_settings_widget.ui +0 -0
  38. data/lib/ruber/world/world.rb +307 -0
  39. data/plugins/auto_end/auto_end.rb +135 -9
  40. data/plugins/autosave/autosave.rb +4 -4
  41. data/plugins/find_in_files/find_in_files.rb +5 -5
  42. data/plugins/find_in_files/find_in_files_widgets.rb +1 -1
  43. data/plugins/project_browser/project_browser.rb +4 -4
  44. data/plugins/rake/rake.rb +4 -4
  45. data/plugins/rake/rake_extension.rb +1 -1
  46. data/plugins/rspec/rspec.rb +4 -4
  47. data/plugins/rspec/ruber_rspec_formatter.rb +2 -2
  48. data/plugins/ruby_development/ruby_development.rb +3 -3
  49. data/plugins/ruby_runner/ruby_runner.rb +2 -2
  50. data/plugins/state/plugin.yaml +6 -8
  51. data/plugins/state/state.rb +201 -391
  52. data/plugins/state/ui/config_widget.rb +5 -5
  53. data/plugins/state/ui/config_widget.ui +3 -3
  54. data/plugins/syntax_checker/syntax_checker.rb +4 -0
  55. data/spec/annotation_model_spec.rb +1 -1
  56. data/spec/auto_end_spec.rb +98 -47
  57. data/spec/component_manager_spec.rb +80 -21
  58. data/spec/document_factory_spec.rb +115 -0
  59. data/spec/document_list_spec.rb +560 -450
  60. data/spec/document_spec.rb +143 -55
  61. data/spec/editor_view_spec.rb +2 -2
  62. data/spec/environment_spec.rb +1900 -0
  63. data/spec/hint_solver_spec.rb +5 -5
  64. data/spec/kde_sugar_spec.rb +16 -0
  65. data/spec/output_widget_spec.rb +177 -51
  66. data/spec/pane_spec.rb +29 -5
  67. data/spec/plugin_spec.rb +1 -1
  68. data/spec/project_factory_spec.rb +104 -0
  69. data/spec/project_list_spec.rb +352 -447
  70. data/spec/project_spec.rb +34 -33
  71. data/spec/qt_sugar_spec.rb +2 -2
  72. data/spec/state_spec.rb +508 -811
  73. data/spec/utils_spec.rb +149 -98
  74. data/spec/workspace_spec.rb +120 -9
  75. data/spec/world_spec.rb +1219 -0
  76. metadata +23 -14
  77. data/lib/ruber/documents/document_list.rb +0 -412
  78. data/lib/ruber/documents/plugin.yaml +0 -4
  79. data/lib/ruber/main_window/view_manager.rb +0 -431
  80. data/lib/ruber/projects/plugin.yaml +0 -11
  81. data/lib/ruber/projects/project_list.rb +0 -314
@@ -47,7 +47,7 @@ It creates and activates a new, empty file
47
47
  @return [EditorView] the editor used to display the new file
48
48
  =end
49
49
  def new_file
50
- display_doc Ruber[:docs].new_document
50
+ display_doc Ruber[:world].new_document
51
51
  end
52
52
 
53
53
  =begin rdoc
@@ -64,11 +64,15 @@ user will become active
64
64
  @return [Array<EditorView>] a list of the editors used for the files
65
65
  =end
66
66
  def open_file
67
- dir = KDE::Url.from_path(Ruber.current_project.project_directory) rescue KDE::Url.new
67
+ dir = KDE::Url.from_path(@active_environment.project.project_directory) rescue KDE::Url.new
68
68
  filenames = KDE::FileDialog.get_open_urls(dir, OPEN_DLG_FILTERS.join("\n") , self)
69
- editors = []
70
- without_activating do
71
- filenames.each{|f| editors << gui_open_file(f)}
69
+ # editors = []
70
+ # without_activating do
71
+ editors = filenames.map{|f| gui_open_file(f, false)}
72
+ # end
73
+ unless editors.empty?
74
+ @active_environment.activate_editor editors[0]
75
+ editors[-1].set_focus
72
76
  end
73
77
  editors
74
78
  end
@@ -97,6 +101,11 @@ save it, discard changes or not close the view.
97
101
  def close_current_editor
98
102
  close_editor active_editor if active_editor
99
103
  end
104
+
105
+ def close_current_tab
106
+ @active_environment.close_tab @active_environment.tab_widget.current_index
107
+ end
108
+ slots :close_current_tab
100
109
 
101
110
  =begin rdoc
102
111
  Slot connected to the Close Current Tab action
@@ -109,19 +118,19 @@ is asked what to do. If the user cancels the dialog, nothing is done.
109
118
  @return [Boolean] *true* if the tab was closed successfully (or the tab widget was
110
119
  empty) and *false* if the user canceled the save dialog
111
120
  =end
112
- def close_tab idx = nil
113
- tab = idx ? @tabs.widget(idx) : @tabs.current_widget
114
- return true unless tab
115
- docs = tab.map(&:document).select{|d| d.views.size == 1}.uniq
116
- return false unless save_documents docs
117
- views = tab.to_a
118
- without_activating do
119
- views.each{|v| close_editor v, false}
120
- end
121
- true
122
- end
123
- slots :close_tab
124
- slots 'close_tab(int)'
121
+ # def close_tab idx = nil
122
+ # tab = idx ? @tabs.widget(idx) : @tabs.current_widget
123
+ # return true unless tab
124
+ # docs = tab.map(&:document).select{|d| d.views.size == 1}.uniq
125
+ # return false unless save_documents docs
126
+ # views = tab.to_a
127
+ # without_activating do
128
+ # views.each{|v| close_editor v, false}
129
+ # end
130
+ # true
131
+ # end
132
+ # slots :close_tab
133
+ # slots 'close_tab(int)'
125
134
 
126
135
  =begin rdoc
127
136
  Slot connected to the 'Close All Other' action
@@ -135,15 +144,13 @@ don't close the views. In the latter case, nothing will be done
135
144
  otherwise
136
145
  =end
137
146
  def close_other_views
138
- to_close = @tabs.inject([]) do |res, pn|
147
+ to_close = @active_environment.tab_widget.inject([]) do |res, pn|
139
148
  res += pn.each_view.to_a
140
149
  res
141
150
  end
142
151
  to_close.delete active_editor
143
152
  if save_documents to_close.map{|v| v.document}.uniq
144
- without_activating do
145
- to_close.each{|v| close_editor v, false}
146
- end
153
+ to_close.each{|v| close_editor v, false}
147
154
  true
148
155
  else false
149
156
  end
@@ -165,13 +172,11 @@ without asking the user.
165
172
  otherwise
166
173
  =end
167
174
  def close_all_views ask = true
168
- docs = Ruber[:documents].select{|d| d.has_view?}
175
+ views = @active_environment.views
176
+ docs = views.map(&:document).uniq
169
177
  return false if ask and !save_documents docs
170
- without_activating do
171
- @tabs.to_a.each do |w|
172
- w.to_a.each{|v| close_editor v, false}
173
- end
174
- end
178
+ @active_environment.activate_editor nil
179
+ views.to_a.each{|v| close_editor v, false}
175
180
  true
176
181
  end
177
182
 
@@ -187,6 +192,7 @@ given URL
187
192
  def open_recent_project url
188
193
  prj = safe_open_project url.path
189
194
  return unless prj
195
+ Ruber[:world].active_project = prj
190
196
  action_collection.action('project-open_recent').add_url url, url.file_name
191
197
  prj
192
198
  end
@@ -205,6 +211,8 @@ It opens the project chosen by the user using an open dialog
205
211
  KDE::i18n('Open project')
206
212
  return unless filename
207
213
  prj = safe_open_project filename
214
+ return unless prj
215
+ Ruber[:world].active_project = prj
208
216
  url = KDE::Url.new prj.project_file
209
217
  action_collection.action('project-open_recent').add_url url, url.file_name
210
218
  prj
@@ -218,7 +226,7 @@ project couldn't be saved
218
226
  @return [nil]
219
227
  =end
220
228
  def close_current_project
221
- unless Ruber[:projects].current_project.close
229
+ unless @active_environment.project.close
222
230
  KDE::MessageBox.sorry self, "The project couldn't be saved"
223
231
  end
224
232
  nil
@@ -232,10 +240,11 @@ It opens the file chosen by the user in a quick open file dialog
232
240
  @return [EditorView,nil] the editor where the document has been displayed
233
241
  =end
234
242
  def open_file_in_project
235
- dlg = OpenFileInProjectDlg.new self
243
+ dlg = OpenFileInProjectDlg.new @active_environment.project, self
236
244
  if dlg.exec == Qt::Dialog::Accepted
237
- editor = display_doc dlg.chosen_file
238
- action_collection.action( 'file_open_recent').add_url( KDE::Url.new(dlg.chosen_file) )
245
+ editor = @active_environment.display_document dlg.chosen_file
246
+ editor.set_focus
247
+ action_collection.action('file_open_recent').add_url( KDE::Url.new(dlg.chosen_file) )
239
248
  editor
240
249
  end
241
250
  end
@@ -286,7 +295,7 @@ if there's no active project
286
295
  @return [nil]
287
296
  =end
288
297
  def configure_project
289
- prj = Ruber.current_project
298
+ prj = @active_environment.project
290
299
  raise "No project is selected" unless prj
291
300
  prj.dialog.exec
292
301
  nil
@@ -306,12 +315,12 @@ it's closed
306
315
  dlg = NewProjectDialog.new self
307
316
  return if dlg.exec == Qt::Dialog::Rejected
308
317
  dir = File.dirname dlg.project_file
309
- FileUtils.mkdir dir
310
- prj = Ruber[:projects].new_project dlg.project_file, dlg.project_name
318
+ FileUtils.mkdir dir unless File.directory? dir
319
+ prj = Ruber[:world].new_project dlg.project_file, dlg.project_name
311
320
  prj.save
312
321
  action_collection.action('project-open_recent').add_url KDE::Url.new(dlg.project_file)
313
- Ruber[:projects].close_current_project if Ruber[:projects].current
314
- Ruber[:projects].current_project = prj
322
+ # Ruber[:projects].close_current_project if Ruber[:projects].current
323
+ Ruber[:world].active_project = prj
315
324
  nil
316
325
  end
317
326
 
@@ -324,9 +333,10 @@ one, it returns to the first
324
333
  @return [EditorView,nil] the active editor
325
334
  =end
326
335
  def next_document
327
- idx = @tabs.current_index
328
- new_idx = idx + 1 < @tabs.count ? idx + 1 : 0
329
- @tabs.current_index = new_idx
336
+ tabs = @active_environment.tab_widget
337
+ idx = tabs.current_index
338
+ new_idx = idx + 1 < tabs.count ? idx + 1 : 0
339
+ tabs.current_index = new_idx
330
340
  active_editor
331
341
  end
332
342
 
@@ -339,9 +349,10 @@ one, it jumps to the last
339
349
  @return [EditorView,nil] the active editor
340
350
  =end
341
351
  def previous_document
342
- idx = @tabs.current_index
343
- new_idx = idx > 0 ? idx - 1 : @tabs.count - 1
344
- @tabs.current_index = new_idx
352
+ tabs = @active_environment.tab_widget
353
+ idx = tabs.current_index
354
+ new_idx = idx > 0 ? idx - 1 : tabs.count - 1
355
+ tabs.current_index = new_idx
345
356
  nil
346
357
  end
347
358
 
@@ -430,7 +441,7 @@ Displays the configuration dialog for the current document, if it exists
430
441
  @return [nil]
431
442
  =end
432
443
  def configure_document
433
- current_document.own_project.dialog.exec
444
+ active_document.own_project.dialog.exec
434
445
  nil
435
446
  end
436
447
 
@@ -458,8 +469,10 @@ It splits the active view horizontally, so that a new copy of the view is create
458
469
  @return [EditorView] the newly created editor
459
470
  =end
460
471
  def split_horizontally
461
- ed = active_editor
462
- display_document ed.document, :existing => :never, :new => ed, :split => :horizontal
472
+ ed = @active_environment.active_editor
473
+ @active_environment.display_document ed.document, :existing => :never,
474
+ :new => ed, :split => :horizontal
475
+ ed.set_focus
463
476
  end
464
477
  slots :split_horizontally
465
478
 
@@ -472,8 +485,10 @@ It splits the active view vertically, so that a new copy of the view is created.
472
485
  @return [EditorView] the newly created editor
473
486
  =end
474
487
  def split_vertically
475
- ed = active_editor
476
- new_ed = display_document ed.document, :existing => :never, :new => ed, :split => :vertical
488
+ ed = @active_environment.active_editor
489
+ @active_environment.display_document ed.document, :existing => :never,
490
+ :new => ed, :split => :vertical
491
+ ed.set_focus
477
492
  end
478
493
  slots :split_vertically
479
494
 
@@ -488,8 +503,8 @@ associated to it and gives focus to it.
488
503
  =end
489
504
  def switch_to_new_document
490
505
  old = active_editor
491
- ed = replace_editor old, Ruber[:documents].new_document
492
- focus_on_editor ed if ed
506
+ ed = replace_editor old, Ruber[:world].new_document
507
+ ed.set_focus if ed
493
508
  end
494
509
  slots :switch_to_new_document
495
510
 
@@ -503,12 +518,13 @@ the active editor with a new one associated with the document and gives focus to
503
518
  @return [EditorView] the newly created editor
504
519
  =end
505
520
  def switch_to_file
506
- dir = KDE::Url.from_path(Ruber.current_project.project_directory) rescue KDE::Url.new
521
+ dir = KDE::Url.from_path(@active_environment.project.project_directory) rescue KDE::Url.new
507
522
  filename = KDE::FileDialog.get_open_url(dir, OPEN_DLG_FILTERS.join("\n") , self)
508
523
  return unless filename.valid?
509
524
  Ruber::Application.process_events
510
525
  ed = replace_editor active_editor, filename
511
- focus_on_editor ed if ed
526
+ ed.set_focus if ed
527
+ ed
512
528
  end
513
529
  slots :switch_to_file
514
530
 
@@ -520,7 +536,7 @@ action list so that it contains an action for each of the open documents
520
536
  =end
521
537
  def update_switch_to_list
522
538
  unplug_action_list "window-switch_to_open_document_list"
523
- @switch_to_actions = Ruber[:documents].map do |doc|
539
+ @switch_to_actions = Ruber[:world].documents.map do |doc|
524
540
  a = action_collection.add_action "switch_to_#{doc.document_name}", self, SLOT(:switch_to_document)
525
541
  a.text = KDE.i18n("Switch to %s") % [doc.document_name]
526
542
  a.object_name = doc.document_name
@@ -531,6 +547,88 @@ action list so that it contains an action for each of the open documents
531
547
  end
532
548
  slots :update_switch_to_list
533
549
 
550
+ =begin rdoc
551
+ Updates the Active Project menu
552
+
553
+ @param [Project,nil] project if not *nil*, a project to exclude from the menu. This
554
+ is meant to be used when a project is closed, since the project list notifies
555
+ that a project is being closed _before_ removing it from the list
556
+ @return [nil]
557
+ =end
558
+ def update_active_project_menu project = nil
559
+ activate_action = action_collection.action 'project-active_project'
560
+ old_actions = activate_action.actions
561
+ activate_action.remove_all_actions
562
+ activate_action.add_action old_actions.delete_at(0)
563
+ old_actions.each{|a| a.delete_later}
564
+ Ruber[:world].projects.sort_by{|pr| pr.project_name}.each do |prj|
565
+ next if prj == project
566
+ name = "projects-activate_project-project_file_#{prj.project_file}"
567
+ a = activate_action.add_action prj.project_name
568
+ a.object_name = name
569
+ end
570
+ nil
571
+ end
572
+ slots :update_active_project_menu
573
+ slots 'update_active_project_menu(QObject*)'
574
+
575
+ =begin rdoc
576
+ Checks the entry in the Active Project action which corresponds to the current
577
+ project
578
+
579
+ If there's no current project, the action which deactivates all projects is selected.
580
+
581
+ If the action corresponding to the current project is already selected, nothing is
582
+ done.
583
+ @return [nil]
584
+ =end
585
+ def select_active_project_entry
586
+ active_project_action = action_collection.action 'project-active_project'
587
+ to_select = action_for_project Ruber[:world].active_project
588
+ unless to_select == active_project_action.current_action
589
+ active_project_action.current_action = to_select
590
+ end
591
+ nil
592
+ end
593
+
594
+ =begin rdoc
595
+ The action in the Active Project action list associated with a project
596
+
597
+ @param [Project,nil] prj the project. If *nil*, the action which deactivates
598
+ all projects is returned
599
+ @return [KDE::Action] the action associated with the given project
600
+ =end
601
+ def action_for_project prj
602
+ active_project_action = action_collection.action 'project-active_project'
603
+ if prj
604
+ file = prj.project_file
605
+ active_project_action.actions.find do |a|
606
+ a.object_name == "projects-activate_project-project_file_#{file}"
607
+ end
608
+ else active_project_action.action 0
609
+ end
610
+ end
611
+
612
+ =begin rdoc
613
+ Slot connected with the active project action
614
+
615
+ It makes the project corresponding to the selected action active. If the selected
616
+ action is the None action, then all projects will be deactivated.
617
+
618
+ If the project associated with the action is already the current project, nothing
619
+ will be done
620
+ @param [Qt::Action] act the selected action
621
+ @return [Project,nil] the new current project
622
+ =end
623
+ def change_active_project act
624
+ #object_name returns nil instead of an empty string if not set
625
+ match = (act.object_name || '').match(/projects-activate_project-project_file_(.*)$/)
626
+ prj = match ? Ruber[:world].projects[match[1]] : nil
627
+ Ruber[:world].active_project = prj
628
+ prj
629
+ end
630
+ slots 'change_active_project(QAction*)'
631
+
534
632
  =begin rdoc
535
633
  Slot associated with the actions in the Switch to Document submenu
536
634
 
@@ -543,9 +641,9 @@ editor with it, giving focus to it. The document to use is determined from the
543
641
  @return [EditorView] the newly created editor
544
642
  =end
545
643
  def switch_to_document
546
- doc = Ruber[:documents].document_with_name sender.object_name
644
+ doc = Ruber[:world].documents.document_with_name sender.object_name
547
645
  ed = replace_editor active_editor, doc
548
- focus_on_editor ed if ed
646
+ ed.set_focus if ed
549
647
  end
550
648
  slots :switch_to_document
551
649
 
@@ -562,7 +660,7 @@ for it, replaces the active editor with it and gives focus to it.
562
660
  =end
563
661
  def switch_to_recent_file url
564
662
  ed = replace_editor active_editor, url
565
- focus_on_editor ed if ed
663
+ ed.set_focus if ed
566
664
  end
567
665
  slots 'switch_to_recent_file(KUrl)'
568
666
 
@@ -582,8 +680,9 @@ one view, nothing is done.
582
680
  direction = action_name.match('next') ? :next : :previous
583
681
  orientation = action_name.match(/horizontal/) ? Qt::Horizontal : Qt::Vertical
584
682
  pane = find_next_pane active_editor.parent, orientation, direction
585
- view = pane ? pane.view : @tabs.current_widget.views[direction == :next ? 0 : -1]
586
- focus_on_editor view
683
+ tabs = @active_environment.tab_widget
684
+ view = pane ? pane.view : tabs.current_widget.views[direction == :next ? 0 : -1]
685
+ view.set_focus
587
686
  end
588
687
  slots :move_among_views
589
688
 
@@ -15,7 +15,7 @@
15
15
  You should have received a copy of the GNU General Public License
16
16
  along with this program; if not, write to the
17
17
  Free Software Foundation, Inc.,
18
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
+ 59 Temple Place - Suite g, Boston, MA 02111-1307, USA.
19
19
  =end
20
20
 
21
21
  require 'facets/enumerable/sum'
@@ -23,7 +23,7 @@ require 'facets/enumerable/sum'
23
23
  module Ruber
24
24
 
25
25
  class MainWindow < KParts::MainWindow
26
-
26
+
27
27
  =begin rdoc
28
28
  A list of strings to be used to create the filter for open file dialogs
29
29
  =end
@@ -43,13 +43,12 @@ A list of strings to be used to create the filter for open file dialogs
43
43
  =begin rdoc
44
44
  Override of @KParts::MainWindow#queryClose@
45
45
 
46
- It calls which calls the {ComponentManager#query_close query_close} method of the
47
- component manager.
48
- @return [Boolean] what the {ComponentManager#query_close query_close} method of
49
- the component manager returns
46
+ It calls the {Application#ask_to_quit ask_to_quit} method of the application.
47
+ @return [Boolean] what {Application#ask_to_quit} returns
50
48
  =end
51
49
  def queryClose
52
- Ruber[:components].query_close
50
+ res = Ruber[:app].ask_to_quit
51
+ res
53
52
  end
54
53
 
55
54
  =begin rdoc
@@ -59,7 +58,25 @@ It calls the {Application#quit_ruber quit_ruber} method of the application
59
58
  @return [TrueClass] *true*
60
59
  =end
61
60
  def queryExit
62
- Ruber[:app].quit_ruber
61
+ #There's a C++-side crash in any view is open after this method when closing
62
+ #a session. As I have no clue as why this happens, for the time being, as
63
+ #a workaround, we close all the documents.
64
+
65
+ #For some reason, this method is called twice when closing a session
66
+ #but only when Ruber is launched from the global installation (that is, typing
67
+ #ruber in the shell), and not when testing from xsm. This causes a number of
68
+ #problems, the most evident is the save_settings method being called twice,
69
+ #one of the times after all documents have been closed. This obviously breaks
70
+ #the state plugin. To avoid the issue, we use an instance variable to keep
71
+ #trace of whether the method has already been called or not. Ruber[:app].quit_ruber
72
+ #is only called the first time, while the documents are only closed the
73
+ #second time
74
+ if @query_exit_called
75
+ Ruber[:world].close_all :documents, :discard
76
+ else
77
+ Ruber[:app].quit_ruber
78
+ @query_exit_called = true
79
+ end
63
80
  true
64
81
  end
65
82
 
@@ -95,20 +112,28 @@ It adds the document to the part manager and makes several signal-slot connectio
95
112
  @return [nil]
96
113
  =end
97
114
  def document_created doc
98
- @view_manager.part_manager.add_part doc.send(:internal)
99
115
  connect doc, SIGNAL('modified_changed(bool, QObject*)'), self, SLOT('document_modified_changed(bool)')
100
- connect doc, SIGNAL('modified_on_disk(QObject*, bool, KTextEditor::ModificationInterface::ModifiedOnDiskReason)'), self, SLOT('update_document_icon(QObject*)')
101
116
  connect doc, SIGNAL('document_url_changed(QObject*)'), self, SLOT(:document_url_changed)
102
117
  connect doc, SIGNAL(:completed), self, SLOT(:document_url_changed)
103
- connect doc, SIGNAL('closing(QObject*)'), self, SLOT('remove_document_from_part_manager(QObject*)')
104
118
  update_switch_to_list
105
119
  end
106
120
  slots 'document_created(QObject*)'
107
121
 
108
- def remove_document_from_part_manager doc
109
- @view_manager.part_manager.remove_part doc.send(:internal)
122
+ def slot_active_environment_changed(new, old)
123
+ if old
124
+ old.disconnect SIGNAL('active_editor_changed(QWidget*)'), self, SLOT('slot_active_editor_changed(QWidget*)')
125
+ end
126
+ @active_environment = new
127
+ if new
128
+ connect new, SIGNAL('active_editor_changed(QWidget*)'), self, SLOT('slot_active_editor_changed(QWidget*)')
129
+ @workspace.main_widget = new.tab_widget
130
+ change_state 'active_project_exists', !new.project.nil?
131
+ select_active_project_entry
132
+ change_title
133
+ else Ruber[:world].active_environment = Ruber[:world].default_environment
134
+ end
110
135
  end
111
- slots 'remove_document_from_part_manager(QObject*)'
136
+ slots 'slot_active_environment_changed(QObject*, QObject*)'
112
137
 
113
138
  =begin rdoc
114
139
  Slot called whenever the active editor changes
@@ -128,6 +153,19 @@ and updates the title and the statusbar
128
153
  nil
129
154
  end
130
155
  slots 'slot_active_editor_changed(QWidget*)'
156
+
157
+ def slot_project_created prj
158
+ @workspace.add_widget prj.environment.tab_widget
159
+ update_active_project_menu
160
+ end
161
+ slots 'slot_project_created(QObject*)'
162
+
163
+ def slot_project_closing prj
164
+ @workspace.remove_widget prj.environment.tab_widget
165
+ update_active_project_menu prj
166
+ end
167
+ slots 'slot_project_closing(QObject*)'
168
+
131
169
 
132
170
  =begin rdoc
133
171
  Changes the icon in the tab corresponding to a document so that it reflects its
@@ -136,18 +174,19 @@ current status
136
174
  @param [Document] doc the document to update the icon for
137
175
  @return [nil]
138
176
  =end
139
- def update_document_icon doc
140
- views = doc.views
141
- views.each do |v|
142
- tab = @view_manager.tab v
143
- next unless tab
144
- if v.is_ancestor_of tab.focus_widget
145
- idx = @tabs.index_of tab
146
- @tabs.set_tab_icon idx, doc.icon
147
- end
148
- end
149
- nil
150
- end
177
+ # def update_document_icon doc
178
+ # views = doc.views
179
+ # views.each do |v|
180
+ # tab = @active_environment.tab v
181
+ # next unless tab
182
+ # tab_widget = @active_environment.tab_widget
183
+ # if v.is_ancestor_of tab.focus_widget
184
+ # idx = tab_widget.index_of tab
185
+ # @tab_widget.set_tab_icon idx, doc.icon
186
+ # end
187
+ # end
188
+ # nil
189
+ # end
151
190
 
152
191
  =begin rdoc
153
192
  Opens a file in an editor, gives focus to it and adds it to the list of recent
@@ -163,10 +202,10 @@ See {#editor_for!} for the values which can be included in _hints_
163
202
  @return [EditorView,nil] the editor displaying the file or *nil* if the file
164
203
  couldn't be opened
165
204
  =end
166
- def gui_open_file file, hints = DEFAULT_HINTS
167
- editor = editor_for! file, hints
205
+ def gui_open_file file, give_focus = true, hints = DEFAULT_HINTS
206
+ editor = @active_environment.editor_for! file, hints
168
207
  return unless editor
169
- focus_on_editor editor
208
+ editor.set_focus if give_focus
170
209
  url = KDE::Url.new file
171
210
  action_collection.action('file_open_recent').add_url url, url.file_name
172
211
  action_collection.action('window-switch_to_recent_file').add_url url, url.file_name
@@ -183,12 +222,12 @@ modified status
183
222
  =end
184
223
  def change_title
185
224
  title = ''
186
- prj = Ruber[:projects].current_project
225
+ prj = @active_environment.project
187
226
  if prj
188
227
  title << (prj.project_name ? prj.project_name :
189
228
  File.basename(prj.project_file, '.ruprj'))
190
229
  end
191
- doc = current_document
230
+ doc = active_document
192
231
  if doc and doc.path.empty?
193
232
  title << ' - ' << doc.document_name
194
233
  elsif doc
@@ -214,7 +253,7 @@ Nothing is done if the document isn't associated with a view
214
253
  def document_modified_changed mod
215
254
  doc = self.sender
216
255
  change_title
217
- update_document_icon doc
256
+ # update_document_icon doc
218
257
  nil
219
258
  end
220
259
 
@@ -230,17 +269,17 @@ Nothing is done if the document isn't associated with a view
230
269
  =end
231
270
  def document_url_changed
232
271
  doc = self.sender
233
- return unless doc.has_view?
234
- change_title
235
- doc.views.each do |v|
236
- v.parent.label = @view_manager.label_for_editor v
237
- tab = @view_manager.tab v
238
- if @view_manager.focus_editor? v, tab
239
- idx = @tabs.index_of tab
240
- @tabs.set_tab_text idx, doc.document_name
241
- end
242
- end
243
- update_document_icon doc
272
+ # return unless doc.has_view?
273
+ # change_title
274
+ # doc.views.each do |v|
275
+ # v.parent.label = @view_manager.label_for_editor v
276
+ # tab = @view_manager.tab v
277
+ # if @view_manager.focus_editor? v, tab
278
+ # idx = @tabs.index_of tab
279
+ # @tabs.set_tab_text idx, doc.document_name
280
+ # end
281
+ # end
282
+ # update_document_icon doc
244
283
  unless doc.path.empty?
245
284
  action_collection.action('file_open_recent').add_url KDE::Url.new(doc.path)
246
285
  end
@@ -273,20 +312,72 @@ Gives the UI states their initial values
273
312
  end
274
313
 
275
314
  =begin rdoc
276
- Closes the documents associated with the given project
315
+ Closes the views associated with the given project
277
316
 
278
- If any document is modified, the user has the possiblity of choosing whether to
279
- save them, discard the changes or not to close the documents
317
+ If any of the views is the only one associated with its document, the document
318
+ itself will be closed. In this case, if the document is modified, the user has
319
+ the possiblity of choosing whether to save them, discard the changes or not to
320
+ close the documents.
280
321
  @param [Project] prj the project whose documents should be closed
281
- @return [Boolean] *true* if the documents were correctly closed and *false* otherwise
322
+ @return [Boolean] *true* if the documents were closed and *false* if the user chose
323
+ to abort
282
324
  =end
283
- def close_project_files prj
284
- to_close = Ruber[:documents].documents_with_file.select do |d|
285
- prj.project_files.file_in_project? d.url.url
286
- end
287
- save_documents to_close
288
- without_activating{to_close.each{|d| d.close}}
289
- end
325
+ # def close_project_files prj
326
+ # views_to_close = prj.extension(:environment).views
327
+ # to_save = views_to_close.map do |v|
328
+ # v.document.views(:all).count == 1 ? v.document : nil
329
+ # end
330
+ # return false unless save_documents to_save.compact
331
+ # without_activating{views_to_close.each{|v| close_editor v, false}}
332
+ # end
333
+
334
+ =begin rdoc
335
+ Creates a new view manager
336
+
337
+ A new tab widget for the view manager is created if none is given.
338
+
339
+ After creating the view manager, it makes all the necessary signal-slot connections
340
+ with it and with the associated tab widget, if a new one is created.
341
+ @param [KDE::TabWidget,nil] tabs the tab widget to use for the view manager. If
342
+ *nil*, a new widget will be created
343
+ @return [ViewManager] the new view manager
344
+ =end
345
+ # def create_view_manager tabs = nil
346
+ # mw = self
347
+ # tabs ||= KDE::TabWidget.new do
348
+ # self.document_mode = true
349
+ # self.tabs_closable = Ruber[:config][:workspace, :close_buttons]
350
+ # connect self, SIGNAL('tabCloseRequested(int)'), mw, SLOT('close_tab(int)')
351
+ # end
352
+ # manager = ViewManager.new tabs, self
353
+ # connect manager, SIGNAL('active_editor_changed(QWidget*)'), self, SLOT('slot_active_editor_changed(QWidget*)')
354
+ # manager
355
+ # end
356
+
357
+ =begin rdoc
358
+ Activates a view manager
359
+
360
+ Activating a view manager means, besides other things, that its tab widget becomes
361
+ the main widget of the workspace (becoming visible if it was hidden) and that the
362
+ tab widget of the previously active view manager is hidden
363
+ @param [ViewManager] the view manager to activate
364
+ @return [ViewManager,nil] the previously active view manager, or *nil* if there
365
+ wasn't a view manager active
366
+ =end
367
+ # def switch_to_view_manager manager
368
+ # old = @view_manager
369
+ # if old
370
+ # old.deactivate
371
+ # old.tabs.hide
372
+ # end
373
+ # @view_manager = manager
374
+ # @tabs = manager.tabs
375
+ # @workspace.main_widget = @tabs
376
+ # @tabs.show
377
+ # @view_manager.activate
378
+ # active_editor.set_focus if active_editor
379
+ # old
380
+ # end
290
381
 
291
382
  end
292
383