ruber 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
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