ruber 0.0.1.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 (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