ruber 0.0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (166) hide show
  1. data/COPYING +339 -0
  2. data/INSTALL +137 -0
  3. data/LICENSE +8 -0
  4. data/bin/ruber +65 -0
  5. data/data/share/apps/ruber/core_components.yaml +31 -0
  6. data/data/share/apps/ruber/ruberui.rc +109 -0
  7. data/data/share/icons/ruber.png +0 -0
  8. data/data/share/pixmaps/ruby.png +0 -0
  9. data/icons/ruber-16.png +0 -0
  10. data/icons/ruber-32.png +0 -0
  11. data/icons/ruber-48.png +0 -0
  12. data/icons/ruber-8.png +0 -0
  13. data/lib/ruber/application/application.rb +288 -0
  14. data/lib/ruber/application/plugin.yaml +11 -0
  15. data/lib/ruber/component_manager.rb +899 -0
  16. data/lib/ruber/config/config.rb +82 -0
  17. data/lib/ruber/config/plugin.yaml +3 -0
  18. data/lib/ruber/document_project.rb +209 -0
  19. data/lib/ruber/documents/document_list.rb +416 -0
  20. data/lib/ruber/documents/plugin.yaml +4 -0
  21. data/lib/ruber/editor/document.rb +506 -0
  22. data/lib/ruber/editor/editor_view.rb +167 -0
  23. data/lib/ruber/editor/ktexteditor_wrapper.rb +202 -0
  24. data/lib/ruber/exception_widgets.rb +245 -0
  25. data/lib/ruber/external_program_plugin.rb +397 -0
  26. data/lib/ruber/filtered_output_widget.rb +342 -0
  27. data/lib/ruber/gui_states_handler.rb +231 -0
  28. data/lib/ruber/kde_config_option_backend.rb +167 -0
  29. data/lib/ruber/kde_sugar.rb +249 -0
  30. data/lib/ruber/main_window/choose_plugins_dlg.rb +353 -0
  31. data/lib/ruber/main_window/main_window.rb +524 -0
  32. data/lib/ruber/main_window/main_window_actions.rb +537 -0
  33. data/lib/ruber/main_window/main_window_internal.rb +239 -0
  34. data/lib/ruber/main_window/open_file_in_project_dlg.rb +212 -0
  35. data/lib/ruber/main_window/output_color_widget.rb +35 -0
  36. data/lib/ruber/main_window/plugin.yaml +58 -0
  37. data/lib/ruber/main_window/save_modified_files_dlg.rb +89 -0
  38. data/lib/ruber/main_window/status_bar.rb +156 -0
  39. data/lib/ruber/main_window/ui/choose_plugins_widget.rb +90 -0
  40. data/lib/ruber/main_window/ui/choose_plugins_widget.ui +77 -0
  41. data/lib/ruber/main_window/ui/main_window_settings_widget.rb +108 -0
  42. data/lib/ruber/main_window/ui/main_window_settings_widget.ui +89 -0
  43. data/lib/ruber/main_window/ui/new_project_widget.rb +119 -0
  44. data/lib/ruber/main_window/ui/new_project_widget.ui +178 -0
  45. data/lib/ruber/main_window/ui/open_file_in_project_dlg.rb +109 -0
  46. data/lib/ruber/main_window/ui/open_file_in_project_dlg.ui +168 -0
  47. data/lib/ruber/main_window/ui/output_color_widget.rb +241 -0
  48. data/lib/ruber/main_window/ui/output_color_widget.ui +204 -0
  49. data/lib/ruber/main_window/workspace.rb +442 -0
  50. data/lib/ruber/output_widget.rb +1093 -0
  51. data/lib/ruber/plugin.rb +264 -0
  52. data/lib/ruber/plugin_like.rb +589 -0
  53. data/lib/ruber/plugin_specification.rb +106 -0
  54. data/lib/ruber/plugin_specification_reader.rb +451 -0
  55. data/lib/ruber/project.rb +493 -0
  56. data/lib/ruber/project_backend.rb +105 -0
  57. data/lib/ruber/projects/plugin.yaml +11 -0
  58. data/lib/ruber/projects/project_files_list.rb +314 -0
  59. data/lib/ruber/projects/project_files_widget.rb +301 -0
  60. data/lib/ruber/projects/project_list.rb +314 -0
  61. data/lib/ruber/projects/ui/project_files_rule_chooser_widget.rb +74 -0
  62. data/lib/ruber/projects/ui/project_files_rule_chooser_widget.ui +61 -0
  63. data/lib/ruber/projects/ui/project_files_widget.rb +117 -0
  64. data/lib/ruber/projects/ui/project_files_widget.ui +123 -0
  65. data/lib/ruber/qt_sugar.rb +673 -0
  66. data/lib/ruber/settings_container.rb +515 -0
  67. data/lib/ruber/settings_dialog.rb +244 -0
  68. data/lib/ruber/settings_dialog_manager.rb +503 -0
  69. data/lib/ruber/utils.rb +414 -0
  70. data/lib/ruber/yaml_option_backend.rb +159 -0
  71. data/outsider_files +15 -0
  72. data/plugins/autosave/autosave.rb +404 -0
  73. data/plugins/autosave/plugin.yaml +16 -0
  74. data/plugins/autosave/ui/autosave_config_widget.rb +83 -0
  75. data/plugins/autosave/ui/autosave_config_widget.ui +68 -0
  76. data/plugins/command/command.png +0 -0
  77. data/plugins/command/command.rb +74 -0
  78. data/plugins/command/plugin.yaml +11 -0
  79. data/plugins/find_in_files/find_in_files.rb +337 -0
  80. data/plugins/find_in_files/find_in_files_dlg.rb +411 -0
  81. data/plugins/find_in_files/find_in_files_ui.rc +11 -0
  82. data/plugins/find_in_files/find_in_files_widgets.rb +485 -0
  83. data/plugins/find_in_files/plugin.yaml +23 -0
  84. data/plugins/find_in_files/ui/config_widget.rb +58 -0
  85. data/plugins/find_in_files/ui/config_widget.ui +41 -0
  86. data/plugins/find_in_files/ui/find_in_files_widget.rb +260 -0
  87. data/plugins/find_in_files/ui/find_in_files_widget.ui +324 -0
  88. data/plugins/project_browser/plugin.yaml +10 -0
  89. data/plugins/project_browser/project_browser.rb +245 -0
  90. data/plugins/rake/plugin.yaml +39 -0
  91. data/plugins/rake/rake.png +0 -0
  92. data/plugins/rake/rake.rb +567 -0
  93. data/plugins/rake/rake_extension.rb +153 -0
  94. data/plugins/rake/rake_widgets.rb +615 -0
  95. data/plugins/rake/rakeui.rc +27 -0
  96. data/plugins/rake/ui/add_quick_task_widget.rb +71 -0
  97. data/plugins/rake/ui/add_quick_task_widget.ui +59 -0
  98. data/plugins/rake/ui/choose_task_widget.rb +77 -0
  99. data/plugins/rake/ui/choose_task_widget.ui +72 -0
  100. data/plugins/rake/ui/config_widget.rb +127 -0
  101. data/plugins/rake/ui/config_widget.ui +123 -0
  102. data/plugins/rake/ui/project_widget.rb +217 -0
  103. data/plugins/rake/ui/project_widget.ui +246 -0
  104. data/plugins/rspec/plugin.yaml +30 -0
  105. data/plugins/rspec/rspec.png +0 -0
  106. data/plugins/rspec/rspec.rb +945 -0
  107. data/plugins/rspec/rspec.svg +90 -0
  108. data/plugins/rspec/rspecui.rc +20 -0
  109. data/plugins/rspec/ruber_rspec_formatter.rb +312 -0
  110. data/plugins/rspec/ui/rspec_project_widget.rb +170 -0
  111. data/plugins/rspec/ui/rspec_project_widget.ui +193 -0
  112. data/plugins/ruby_development/plugin.yaml +27 -0
  113. data/plugins/ruby_development/ruby_development.png +0 -0
  114. data/plugins/ruby_development/ruby_development.rb +453 -0
  115. data/plugins/ruby_development/ruby_developmentui.rc +19 -0
  116. data/plugins/ruby_development/ui/project_widget.rb +112 -0
  117. data/plugins/ruby_development/ui/project_widget.ui +108 -0
  118. data/plugins/ruby_runner/config_widget.rb +116 -0
  119. data/plugins/ruby_runner/plugin.yaml +26 -0
  120. data/plugins/ruby_runner/project_widget.rb +62 -0
  121. data/plugins/ruby_runner/ruby.png +0 -0
  122. data/plugins/ruby_runner/ruby_interpretersui.rc +26 -0
  123. data/plugins/ruby_runner/ruby_runner.rb +411 -0
  124. data/plugins/ruby_runner/ui/config_widget.rb +92 -0
  125. data/plugins/ruby_runner/ui/config_widget.ui +91 -0
  126. data/plugins/ruby_runner/ui/project_widget.rb +60 -0
  127. data/plugins/ruby_runner/ui/project_widget.ui +48 -0
  128. data/plugins/ruby_runner/ui/ruby_runnner_plugin_option_widget.rb +59 -0
  129. data/plugins/ruby_runner/ui/ruby_runnner_plugin_option_widget.ui +44 -0
  130. data/plugins/state/plugin.yaml +28 -0
  131. data/plugins/state/state.rb +520 -0
  132. data/plugins/state/ui/config_widget.rb +92 -0
  133. data/plugins/state/ui/config_widget.ui +89 -0
  134. data/plugins/syntax_checker/plugin.yaml +18 -0
  135. data/plugins/syntax_checker/syntax_checker.rb +662 -0
  136. data/ruber.desktop +10 -0
  137. data/spec/annotation_model_spec.rb +174 -0
  138. data/spec/common.rb +119 -0
  139. data/spec/component_manager_spec.rb +1259 -0
  140. data/spec/document_list_spec.rb +626 -0
  141. data/spec/document_project_spec.rb +373 -0
  142. data/spec/document_spec.rb +779 -0
  143. data/spec/editor_view_spec.rb +167 -0
  144. data/spec/external_program_plugin_spec.rb +676 -0
  145. data/spec/filtered_output_widget_spec.rb +642 -0
  146. data/spec/gui_states_handler_spec.rb +304 -0
  147. data/spec/kde_config_option_backend_spec.rb +214 -0
  148. data/spec/kde_sugar_spec.rb +101 -0
  149. data/spec/ktexteditor_wrapper_spec.rb +305 -0
  150. data/spec/output_widget_spec.rb +1703 -0
  151. data/spec/plugin_spec.rb +1393 -0
  152. data/spec/plugin_specification_reader_spec.rb +1765 -0
  153. data/spec/plugin_specification_spec.rb +401 -0
  154. data/spec/project_backend_spec.rb +172 -0
  155. data/spec/project_files_list_spec.rb +401 -0
  156. data/spec/project_list_spec.rb +511 -0
  157. data/spec/project_spec.rb +990 -0
  158. data/spec/qt_sugar_spec.rb +328 -0
  159. data/spec/settings_container_spec.rb +617 -0
  160. data/spec/settings_dialog_manager_spec.rb +773 -0
  161. data/spec/settings_dialog_spec.rb +419 -0
  162. data/spec/state_spec.rb +991 -0
  163. data/spec/utils_spec.rb +406 -0
  164. data/spec/workspace_spec.rb +869 -0
  165. data/spec/yaml_option_backend_spec.rb +246 -0
  166. metadata +284 -0
data/LICENSE ADDED
@@ -0,0 +1,8 @@
1
+ h1. License
2
+
3
+ Ruber is released under the GPL version 2 (see the COPYING file)
4
+
5
+ The icons in the @icons@ directory have been produced modifying an
6
+ "image published on Wikimedia Commons":http://commons.wikimedia.org/wiki/File:Ruby_gem.JPG
7
+ and are released under the "Creative Commons Attribution 3.0 Unported":http://creativecommons.org/licenses/by/3.0/deed.en
8
+ license. The author of the original image is Michelle Jo
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ =begin rdoc
4
+ Helper module to resolve the conflict between +Enumerable#count+ and the +count+
5
+ methods a lot of Qt/KDE classes provide.
6
+
7
+ It is essentially like +Enumerable+, but defines a <tt>count_items</tt> method
8
+ rather than a +count+ method. Qt/KDE classes can then mix-in this module instead
9
+ of +Enumerable+. The same effect could have been obtained by modifying +Enumerable+,
10
+ but that could have interferred with other libraries
11
+ =end
12
+ module QtEnumerable
13
+
14
+ include Enumerable
15
+
16
+ begin
17
+ alias :count_items :count
18
+ undef_method :count
19
+ rescue NoMethodError
20
+ end
21
+
22
+ end
23
+
24
+ require 'korundum4'
25
+ require 'kio'
26
+ require 'facets/kernel/require_relative'
27
+
28
+ require 'ruber/qt_sugar'
29
+ require 'ruber/kde_sugar'
30
+ require 'ruber/utils'
31
+ require 'ruber/exception_widgets'
32
+ require 'ruber/component_manager.rb'
33
+
34
+ data = KDE::AboutData.new "ruber", "", KDE::ki18n("Ruber"), "0.0.1.1",
35
+ KDE.ki18n('A Ruby IDE written in Ruby'), KDE::AboutData::License_GPL
36
+ data.add_author KDE.ki18n('Stefano Crocco'), KDE::LocalizedString.new,
37
+ Qt::ByteArray.new('stefano.crocco@alice.it')
38
+ data.bug_address = Qt::ByteArray.new "http://github.com/stcrocco/ruber/issues"
39
+ data.homepage = Qt::ByteArray.new 'http://stcrocco.github.com/ruber'
40
+
41
+ KDE::CmdLineArgs.init ARGV, data
42
+ opts = KDE::CmdLineOptions.new
43
+ opts.add("config-file <FILE>", KDE.ki18n("Use FILE instead of the default "\
44
+ "config file"), "")
45
+ opts.add("file <FILE>", KDE.ki18n("Open the file FILE. This option may be"\
46
+ " repeated more than one times and is "\
47
+ "mostly useful to open files ending in "\
48
+ ".krprj as files instead of as projects"))
49
+ opts.add("+[FILES]", KDE.ki18n("Open FILES. Files with extension .krprj will "\
50
+ "be opened as projects. Only the more recent "\
51
+ "project will be used"))
52
+ KDE::CmdLineArgs.add_cmd_line_options opts
53
+
54
+
55
+ manager = Ruber::ComponentManager.new
56
+ manager.load_component 'application'
57
+ begin Ruber[:app].exec
58
+ rescue SystemExit, SignalException
59
+ raise
60
+ rescue Exception => ex
61
+ dlg = Ruber::ExceptionDialog.new ex, nil, false
62
+ dlg.exec
63
+ Qt::Internal.application_terminated = true
64
+ raise
65
+ end
@@ -0,0 +1,31 @@
1
+ :main_window:
2
+ :config_options:
3
+ General:
4
+ :default_script_directory: {:type: path, default: 'ENV["HOME"]'}
5
+ :default_project_directory: {:type: path, default: 'ENV["HOME"]'}
6
+ :output_font: {:default: 'Qt::Font.new("Courier",10)'}
7
+ auto_annotations: {type: bool, default: 'true'}
8
+ wrap_output: {type: bool, default: 'true'}
9
+ MainWindow:
10
+ :widget_size: {:key: Central widget size, :default: "Qt::Size.new"}
11
+ :window_size: {:key: Size, :default: 'Qt::Size.new(400,500)'}
12
+ :h_splitter: {:key: Horizontal splitter, :type: string list, :default: "['20', '60', '20']"}
13
+ :v_splitter: {:key: Vertical splitter, :type: string list, :default: "['80', '20']"}
14
+ :config_widgets:
15
+ - {:caption: General, :pixmap: configure, :class: KRuby::MainWindowSettingsWidget}
16
+ :application:
17
+ :config_options:
18
+ General:
19
+ :plugin_dirs: {:type: string list, :default: '[KRuby::Application::DEFAULT_PLUGIN_PATH]'}
20
+ :plugins: {:type: string list, :default: 'KRuby::Application::DEFAULT_PLUGINS'}
21
+ :auto_load_project: {:type: bool, :default: false }
22
+ :config_widgets:
23
+ - {:caption: General, :pixmap: configure, :code: "w=Qt::CheckBox.new('&Open last project at startup');w.object_name='kcfg_general_auto_load_project';w"}
24
+ :project_list:
25
+ project_options:
26
+ project_files: {default: '{:include => [], :exclude => [], :extensions => []}'}
27
+ project_widgets:
28
+ - {class: KRuby::ProjectFilesWidget, caption: 'General'}
29
+ project_extensions:
30
+ project_files_lister: {class: ProjectFilesLister}
31
+ project_session_manager: {class: KRuby::ProjectSessionManager}
@@ -0,0 +1,109 @@
1
+ <!DOCTYPE kpartgui SYSTEM 'kpartgui.dtd'>
2
+ <kpartgui version="10" name="ruber" >
3
+ <MenuBar>
4
+ <Menu name="file" >
5
+ <text>&amp;File</text>
6
+ <Action name="file_new" />
7
+ <DefineGroup name="new_merge" />
8
+ <Separator/>
9
+ <Action name="file_open" />
10
+ <Action name="file_open_recent" />
11
+ <DefineGroup name="open_merge" />
12
+ <Separator/>
13
+ <DefineGroup name="save_merge" />
14
+ <Action name="file-save_all" />
15
+ <Separator/>
16
+ <DefineGroup name="revert_merge" />
17
+ <DefineGroup name="print_merge" />
18
+ <DefineGroup name="export_merge" />
19
+ <Separator/>
20
+ <Action name="file_close" />
21
+ <Action name="file-close_all" />
22
+ <Action name="file-close_other" />
23
+ <Separator/>
24
+ <Action name="file_quit" />
25
+ </Menu>
26
+ <Menu name="edit" >
27
+ <text>&amp;Edit</text>
28
+ <DefineGroup name="edit_undo_merge" />
29
+ <Separator group="edit_undo_merge" />
30
+ <DefineGroup name="edit_paste_merge" />
31
+ <Separator/>
32
+ <DefineGroup name="edit_select_merge" />
33
+ <Separator/>
34
+ <DefineGroup name="edit_find_merge" />
35
+ <Separator/>
36
+ <DefineGroup name="edit_find_plugins" />
37
+ <Separator/>
38
+ </Menu>
39
+ <Menu name="documents" >
40
+ <text>&amp;Document</text>
41
+ <Action name="go_back" />
42
+ <Action name="go_forward" />
43
+ <Separator/>
44
+ <Action name="configure_document"/>
45
+ </Menu>
46
+ <Menu name="view" >
47
+ <text>&amp;View</text>
48
+ <Action name="view-activate_editor" />
49
+ <Menu name="tool_widgets">
50
+ <text>&amp;Tool Widgets</text>
51
+ <Action name="view-toggle_left_tool_widget"/>
52
+ <Action name="view-toggle_right_tool_widget"/>
53
+ <Action name="view-toggle_bottom_tool_widget"/>
54
+ </Menu>
55
+ <Separator/>
56
+ <DefineGroup name="view_operations" />
57
+ </Menu>
58
+ <Menu noMerge="1" name="project" >
59
+ <text>&amp;Project</text>
60
+ <Action name="project-new"/>
61
+ <Separator/>
62
+ <Action name="project-open" />
63
+ <Action name="project-open_recent" />
64
+ <Separator/>
65
+ <Action name="project-close"/>
66
+ <Separator/>
67
+ <Action name="project-quick_open_file" />
68
+ <Separator/>
69
+ <Action name="project-configure"/>
70
+ </Menu>
71
+ <Merge/>
72
+ <Menu name="tools" >
73
+ <text>&amp;Tools</text>
74
+ <Action name="tools_external" />
75
+ <Separator/>
76
+ <DefineGroup name="tools_operations" />
77
+ <Action name="scripts" />
78
+ </Menu>
79
+ <Menu name="settings" >
80
+ <text>&amp;Settings</text>
81
+ <Action name="options_configure" />
82
+ <DefineGroup name="configure_merge" />
83
+ <Separator/>
84
+ <DefineGroup name="show_merge" />
85
+ <Action name="options-choose_plugins" />
86
+ <Separator/>
87
+ <Merge name="StandardToolBarMenuHandler"/>
88
+ <Action name="settings_show_statusbar"/>
89
+ <Separator/>
90
+ <Action name="options_configure_keybinding" />
91
+ <Action name="set_configure_toolbars" />
92
+ </Menu>
93
+ <Menu name="help" >
94
+ <text>&amp;Help</text>
95
+ <Action name="help_contents" />
96
+ <Action name="help_user_manual" />
97
+ <Action name="help_whats_this" />
98
+ <Separator/>
99
+ <Action name="help_report_bug" />
100
+ <Separator/>
101
+ <Menu name="about_plugins">
102
+ <text>About &amp;Plugins</text>
103
+ <ActionList name="about_plugins_list"/>
104
+ </Menu>
105
+ <Action name="help_about_app" />
106
+ <Action name="help_about_kde" />
107
+ </Menu>
108
+ </MenuBar>
109
+ </kpartgui>
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,288 @@
1
+ =begin
2
+ Copyright (C) 2010 by Stefano Crocco
3
+ stefano.crocco@alice.it
4
+
5
+ This program is free software; you can redistribute it andor modify
6
+ it under the terms of the GNU General Public License as published by
7
+ the Free Software Foundation; either version 2 of the License, or
8
+ (at your option) any later version.
9
+
10
+ This program is distributed in the hope that it will be useful,
11
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ GNU General Public License for more details.
14
+
15
+ You should have received a copy of the GNU General Public License
16
+ along with this program; if not, write to the
17
+ Free Software Foundation, Inc.,
18
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19
+ =end
20
+
21
+ require 'yaml'
22
+ require 'ostruct'
23
+ require 'find'
24
+ require 'pathname'
25
+ require 'enumerator'
26
+ require 'facets/kernel/__dir__'
27
+ require 'fileutils'
28
+
29
+ require 'ruber/plugin_like'
30
+ require 'ruber/exception_widgets'
31
+
32
+ module Ruber
33
+
34
+ =begin rdoc
35
+ Returns the component providing the feature _feature_
36
+
37
+ <b>Note:</b> this method can only be used _after_ the application has been
38
+ created, otherwise +NoMethodError+ will be raised.
39
+ =end
40
+ def self.[](feature)
41
+ # This instance variable is initialized by the application's constructor
42
+ @components[feature]
43
+ end
44
+
45
+
46
+ class Application < KDE::Application
47
+
48
+ =begin rdoc
49
+ The default path where to look for plugins. It only includes the _plugins_ directory
50
+ in the Ruber installation path
51
+ =end
52
+ DEFAULT_PLUGIN_PATHS = [
53
+ File.join(KDE::Global.dirs.find_dirs( 'data', '')[0], File.join('ruber','plugins')),
54
+ File.expand_path(File.join(RUBER_LIB_DIR, '..', '..', 'plugins'))
55
+ ]
56
+ =begin rdoc
57
+ The default plugins to load. They are: ruby_development, find_in_files, syntax_checker,
58
+ command and state
59
+ =end
60
+ DEFAULT_PLUGINS = %w[ruby_development find_in_files rake command syntax_checker state]
61
+
62
+ include PluginLike
63
+
64
+ slots 'load_settings()', :setup
65
+
66
+ # A hash containing the command line options
67
+ attr_reader :cmd_line_options
68
+
69
+ =begin rdoc
70
+ The status of the application. It can be: +:starting+, +:running+ or +:quitting+
71
+ =end
72
+ attr_reader :status
73
+
74
+ =begin rdoc
75
+ Creates a new application object.
76
+
77
+ Besides creating the application, this method also loads the core components
78
+ and sets up a timer which will cause the application's _setup_ method to be
79
+ called as soon as <tt>Application#exec</tt> is called.
80
+ =end
81
+ def initialize manager, pdf
82
+ super()
83
+ @components = manager
84
+ @components.parent = self
85
+ Ruber.instance_variable_set :@components, @components
86
+ initialize_plugin pdf
87
+ KDE::Global.dirs.addPrefix File.expand_path(File.join( RUBER_DATA_DIR, '..', '..', 'data'))
88
+ icon_path = KDE::Global.dirs.find_resource('icon', 'ruber')
89
+ self.window_icon = Qt::Icon.new icon_path
90
+ KDE::Global.main_component.about_data.program_icon_name = icon_path
91
+ @cmd_line_options = KDE::CmdLineArgs.parsed_args
92
+ @plugin_dirs = []
93
+ load_core_components
94
+ @status = :starting
95
+ Qt::Timer.single_shot(0, self, SLOT(:setup))
96
+ end
97
+
98
+ def quit_ruber
99
+ @status = :quitting
100
+ @components.shutdown
101
+ end
102
+
103
+ =begin rdoc
104
+ Returns *true* if the application is starting and *false* if it has already
105
+ started otherwise. The application is considered to have started after the
106
+ application's +setup+ method has been called and has returned. Before that,
107
+ it is considered to be starting.
108
+
109
+ This method is mostly useful for plugins which need to perform different actions
110
+ depending on whether they're loaded at application startup (in which case
111
+ <tt>starting?</tt> returns *true*) or later (when <tt>starting?</tt> returns
112
+ *false*)
113
+ =end
114
+ def starting?
115
+ @status == :starting
116
+ end
117
+
118
+ def running?
119
+ @status == :running
120
+ end
121
+
122
+ def quitting?
123
+ @status == :quitting
124
+ end
125
+
126
+ =begin rdoc
127
+ It is a wrapper around ComponentManager#load_plugins which allows an easier handling
128
+ of exceptions raised by the loaded plugins.
129
+
130
+ If a block is given, it is passed to ComponentManager#load_plugins, to determine
131
+ what to do if an exception is raised while loading a plugin. If no block is given
132
+ and _silent_ is *false*, then a dialog displaying the error message is shown to
133
+ the user, who has the following options: ignore the plugin which gave the error,
134
+ skip all the remaining plugins, go on ignoring other errors or aborting. If no
135
+ block is given and _silent_ is a true value, then all errors will be ignored.
136
+
137
+ _plugins_ should be an array containing the names of the plugins to load
138
+ (dependencies) will be computed automatically. _dirs_ is an array containing the
139
+ directories where to look for plugins. If *nil*, the values stored in the
140
+ "Plugin directories" entry in the configuration file will be used.
141
+
142
+ <b>Note:</b> this method doesn't attempt to handle exceptions raised while computing
143
+ or sorting dependencies.
144
+ =end
145
+ def safe_load_plugins plugins, silent = false, dirs = nil, &blk
146
+ if blk.nil? and silent then blk = proc{|_pl, _e| :silent}
147
+ elsif blk.nil?
148
+ blk = Proc.new{|pl, e| ComponentLoadingErrorDialog.new(pl.name, e, nil).exec}
149
+ end
150
+ @components.load_plugins plugins, dirs || @plugin_dirs, &blk
151
+ end
152
+
153
+ private
154
+
155
+ =begin rdoc
156
+ Applies the application's configuration settings. It also adds any plugin directory
157
+ to the load path, unless it's already there.
158
+ =end
159
+ def load_settings
160
+ @plugin_dirs = Ruber[:config][:general].plugin_dirs
161
+ new_dirs = @plugin_dirs - $:
162
+ new_dirs.each{|d| $:.unshift d}
163
+ end
164
+
165
+ =begin rdoc
166
+ Loads the plugins in the configuration file and opens the files and/or
167
+ projects listed in the command line. At the end, marks the application
168
+ as _running_.
169
+ =end
170
+ def setup
171
+ # Create $KDEHOME/share/apps/ruber/plugins if it's missing
172
+ begin FileUtils.mkdir DEFAULT_PLUGIN_PATHS[0]
173
+ rescue Errno::EEXIST
174
+ end
175
+ chosen_plugins = Ruber[:config][:general, :plugins].map(&:to_sym)
176
+ needed_plugins = []
177
+ deps_problem_msg = Proc.new do |e|
178
+ <<-EOS
179
+ The following errors have occurred while attempting to resolve the dependencies among plugins you chose:
180
+ #{e.message}
181
+
182
+ Ruber will start with no plugin loaded. Please, use the Choose Plugins menu entry in the Settings menu to solve the issue.
183
+ EOS
184
+ end
185
+ begin
186
+ availlable_plugins = ComponentManager.find_plugins @plugin_dirs, true
187
+ chosen_data = chosen_plugins.map{|i| availlable_plugins[i]}.compact
188
+ found = chosen_data.map{|i| i.name}
189
+ if found.size != chosen_plugins.size
190
+ missing = chosen_plugins - found
191
+ question = <<-EOS
192
+ Ruber couldn't find some plugins it has been configured to automatically load at startup. They are:
193
+ #{missing.join("\n")}
194
+ Do you want to start the application without them or to quit Ruber?
195
+ EOS
196
+ ans = KDE::MessageBox.question_yes_no nil, question, 'Missing plugins',
197
+ KDE::GuiItem.new('Start Ruber'), KDE::GuiItem.new('Quit')
198
+ exit if ans == KDE::MessageBox::No
199
+ chosen_plugins = found
200
+ end
201
+ needed_plugins = ComponentManager.fill_dependencies chosen_data, availlable_plugins.values
202
+ rescue ComponentManager::DependencyError => e
203
+ KDE::MessageBox.sorry nil, deps_problem_msg.call(e)
204
+ end
205
+ plugins = chosen_plugins + needed_plugins
206
+ begin
207
+ res = safe_load_plugins(plugins)
208
+ unless res
209
+ Qt::Internal.application_terminated = true
210
+ exit 1
211
+ end
212
+ rescue ComponentManager::DependencyError => e
213
+ KDE::MessageBox.error nil, deps_problem_msg.call(e)
214
+ end
215
+ if sessionRestored?
216
+ Ruber[:components].restore_session Ruber[:main_window].last_session_data
217
+ end
218
+ @status = :running
219
+ Ruber[:main_window].show
220
+ end
221
+
222
+
223
+ =begin rdoc
224
+ Loads the core components. In order, they are:
225
+ * the configuration manager
226
+ * the document keeper
227
+ * the main window
228
+
229
+ After creating the configuration manager, the <tt>register_with_config</tt>
230
+ method is called
231
+ =end
232
+ def load_core_components
233
+ begin
234
+ current = 'config'
235
+ @components.load_component 'config'
236
+ register_with_config
237
+ %w[documents projects main_window].each do |i|
238
+ current = i
239
+ @components.load_component i
240
+ end
241
+ rescue Exception => e
242
+ ComponentLoadingErrorDialog.new(current, e, nil, true).exec
243
+ Qt::Internal.application_terminated = true
244
+ exit 1
245
+ end
246
+ if sessionRestored? then Ruber[:main_window].restore 1, false
247
+ else
248
+ open_command_line_files
249
+ if Ruber[:projects].projects.empty? and Ruber[:documents].documents.empty?
250
+ Ruber[:main_window].display_doc Ruber[:documents].new_document
251
+ end
252
+ end
253
+ end
254
+
255
+ =begin rdoc
256
+ Registers the configuration options with the configuration manager, calls the
257
+ <tt>load_settings</tt> method and connects to the configuration manager's
258
+ <tt>settings_changed</tt> signal.
259
+
260
+ This tasks are performed by the <tt>PluginLike#initialize_plugin</tt> method,
261
+ but as the config manager didn't exist when that method was called, it is
262
+ necessary to to them here
263
+ =end
264
+ def register_with_config
265
+ config = Ruber[:config]
266
+ @plugin_description.config_options.each_value{|o| config.add_option o}
267
+ load_settings
268
+ connect config, SIGNAL(:settings_changed), self, SLOT(:load_settings)
269
+ end
270
+
271
+ =begin rdoc
272
+ Opens the files and/or project listed on the command line, or creates a single
273
+ empty document if neither files nor projects have been specified.
274
+ =end
275
+ def open_command_line_files
276
+ args = @cmd_line_options.files
277
+ win = Ruber[:main_window]
278
+ projects, files = args.partition{|f| File.extname(f) == '.ruprj'}
279
+ prj = win.safe_open_project projects.last unless projects.empty?
280
+ files += @cmd_line_options.getOptionList('file')
281
+ files.each do |f|
282
+ win.display_document f
283
+ end
284
+ end
285
+
286
+ end
287
+
288
+ end