ruber 0.0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +339 -0
- data/INSTALL +137 -0
- data/LICENSE +8 -0
- data/bin/ruber +65 -0
- data/data/share/apps/ruber/core_components.yaml +31 -0
- data/data/share/apps/ruber/ruberui.rc +109 -0
- data/data/share/icons/ruber.png +0 -0
- data/data/share/pixmaps/ruby.png +0 -0
- data/icons/ruber-16.png +0 -0
- data/icons/ruber-32.png +0 -0
- data/icons/ruber-48.png +0 -0
- data/icons/ruber-8.png +0 -0
- data/lib/ruber/application/application.rb +288 -0
- data/lib/ruber/application/plugin.yaml +11 -0
- data/lib/ruber/component_manager.rb +899 -0
- data/lib/ruber/config/config.rb +82 -0
- data/lib/ruber/config/plugin.yaml +3 -0
- data/lib/ruber/document_project.rb +209 -0
- data/lib/ruber/documents/document_list.rb +416 -0
- data/lib/ruber/documents/plugin.yaml +4 -0
- data/lib/ruber/editor/document.rb +506 -0
- data/lib/ruber/editor/editor_view.rb +167 -0
- data/lib/ruber/editor/ktexteditor_wrapper.rb +202 -0
- data/lib/ruber/exception_widgets.rb +245 -0
- data/lib/ruber/external_program_plugin.rb +397 -0
- data/lib/ruber/filtered_output_widget.rb +342 -0
- data/lib/ruber/gui_states_handler.rb +231 -0
- data/lib/ruber/kde_config_option_backend.rb +167 -0
- data/lib/ruber/kde_sugar.rb +249 -0
- data/lib/ruber/main_window/choose_plugins_dlg.rb +353 -0
- data/lib/ruber/main_window/main_window.rb +524 -0
- data/lib/ruber/main_window/main_window_actions.rb +537 -0
- data/lib/ruber/main_window/main_window_internal.rb +239 -0
- data/lib/ruber/main_window/open_file_in_project_dlg.rb +212 -0
- data/lib/ruber/main_window/output_color_widget.rb +35 -0
- data/lib/ruber/main_window/plugin.yaml +58 -0
- data/lib/ruber/main_window/save_modified_files_dlg.rb +89 -0
- data/lib/ruber/main_window/status_bar.rb +156 -0
- data/lib/ruber/main_window/ui/choose_plugins_widget.rb +90 -0
- data/lib/ruber/main_window/ui/choose_plugins_widget.ui +77 -0
- data/lib/ruber/main_window/ui/main_window_settings_widget.rb +108 -0
- data/lib/ruber/main_window/ui/main_window_settings_widget.ui +89 -0
- data/lib/ruber/main_window/ui/new_project_widget.rb +119 -0
- data/lib/ruber/main_window/ui/new_project_widget.ui +178 -0
- data/lib/ruber/main_window/ui/open_file_in_project_dlg.rb +109 -0
- data/lib/ruber/main_window/ui/open_file_in_project_dlg.ui +168 -0
- data/lib/ruber/main_window/ui/output_color_widget.rb +241 -0
- data/lib/ruber/main_window/ui/output_color_widget.ui +204 -0
- data/lib/ruber/main_window/workspace.rb +442 -0
- data/lib/ruber/output_widget.rb +1093 -0
- data/lib/ruber/plugin.rb +264 -0
- data/lib/ruber/plugin_like.rb +589 -0
- data/lib/ruber/plugin_specification.rb +106 -0
- data/lib/ruber/plugin_specification_reader.rb +451 -0
- data/lib/ruber/project.rb +493 -0
- data/lib/ruber/project_backend.rb +105 -0
- data/lib/ruber/projects/plugin.yaml +11 -0
- data/lib/ruber/projects/project_files_list.rb +314 -0
- data/lib/ruber/projects/project_files_widget.rb +301 -0
- data/lib/ruber/projects/project_list.rb +314 -0
- data/lib/ruber/projects/ui/project_files_rule_chooser_widget.rb +74 -0
- data/lib/ruber/projects/ui/project_files_rule_chooser_widget.ui +61 -0
- data/lib/ruber/projects/ui/project_files_widget.rb +117 -0
- data/lib/ruber/projects/ui/project_files_widget.ui +123 -0
- data/lib/ruber/qt_sugar.rb +673 -0
- data/lib/ruber/settings_container.rb +515 -0
- data/lib/ruber/settings_dialog.rb +244 -0
- data/lib/ruber/settings_dialog_manager.rb +503 -0
- data/lib/ruber/utils.rb +414 -0
- data/lib/ruber/yaml_option_backend.rb +159 -0
- data/outsider_files +15 -0
- data/plugins/autosave/autosave.rb +404 -0
- data/plugins/autosave/plugin.yaml +16 -0
- data/plugins/autosave/ui/autosave_config_widget.rb +83 -0
- data/plugins/autosave/ui/autosave_config_widget.ui +68 -0
- data/plugins/command/command.png +0 -0
- data/plugins/command/command.rb +74 -0
- data/plugins/command/plugin.yaml +11 -0
- data/plugins/find_in_files/find_in_files.rb +337 -0
- data/plugins/find_in_files/find_in_files_dlg.rb +411 -0
- data/plugins/find_in_files/find_in_files_ui.rc +11 -0
- data/plugins/find_in_files/find_in_files_widgets.rb +485 -0
- data/plugins/find_in_files/plugin.yaml +23 -0
- data/plugins/find_in_files/ui/config_widget.rb +58 -0
- data/plugins/find_in_files/ui/config_widget.ui +41 -0
- data/plugins/find_in_files/ui/find_in_files_widget.rb +260 -0
- data/plugins/find_in_files/ui/find_in_files_widget.ui +324 -0
- data/plugins/project_browser/plugin.yaml +10 -0
- data/plugins/project_browser/project_browser.rb +245 -0
- data/plugins/rake/plugin.yaml +39 -0
- data/plugins/rake/rake.png +0 -0
- data/plugins/rake/rake.rb +567 -0
- data/plugins/rake/rake_extension.rb +153 -0
- data/plugins/rake/rake_widgets.rb +615 -0
- data/plugins/rake/rakeui.rc +27 -0
- data/plugins/rake/ui/add_quick_task_widget.rb +71 -0
- data/plugins/rake/ui/add_quick_task_widget.ui +59 -0
- data/plugins/rake/ui/choose_task_widget.rb +77 -0
- data/plugins/rake/ui/choose_task_widget.ui +72 -0
- data/plugins/rake/ui/config_widget.rb +127 -0
- data/plugins/rake/ui/config_widget.ui +123 -0
- data/plugins/rake/ui/project_widget.rb +217 -0
- data/plugins/rake/ui/project_widget.ui +246 -0
- data/plugins/rspec/plugin.yaml +30 -0
- data/plugins/rspec/rspec.png +0 -0
- data/plugins/rspec/rspec.rb +945 -0
- data/plugins/rspec/rspec.svg +90 -0
- data/plugins/rspec/rspecui.rc +20 -0
- data/plugins/rspec/ruber_rspec_formatter.rb +312 -0
- data/plugins/rspec/ui/rspec_project_widget.rb +170 -0
- data/plugins/rspec/ui/rspec_project_widget.ui +193 -0
- data/plugins/ruby_development/plugin.yaml +27 -0
- data/plugins/ruby_development/ruby_development.png +0 -0
- data/plugins/ruby_development/ruby_development.rb +453 -0
- data/plugins/ruby_development/ruby_developmentui.rc +19 -0
- data/plugins/ruby_development/ui/project_widget.rb +112 -0
- data/plugins/ruby_development/ui/project_widget.ui +108 -0
- data/plugins/ruby_runner/config_widget.rb +116 -0
- data/plugins/ruby_runner/plugin.yaml +26 -0
- data/plugins/ruby_runner/project_widget.rb +62 -0
- data/plugins/ruby_runner/ruby.png +0 -0
- data/plugins/ruby_runner/ruby_interpretersui.rc +26 -0
- data/plugins/ruby_runner/ruby_runner.rb +411 -0
- data/plugins/ruby_runner/ui/config_widget.rb +92 -0
- data/plugins/ruby_runner/ui/config_widget.ui +91 -0
- data/plugins/ruby_runner/ui/project_widget.rb +60 -0
- data/plugins/ruby_runner/ui/project_widget.ui +48 -0
- data/plugins/ruby_runner/ui/ruby_runnner_plugin_option_widget.rb +59 -0
- data/plugins/ruby_runner/ui/ruby_runnner_plugin_option_widget.ui +44 -0
- data/plugins/state/plugin.yaml +28 -0
- data/plugins/state/state.rb +520 -0
- data/plugins/state/ui/config_widget.rb +92 -0
- data/plugins/state/ui/config_widget.ui +89 -0
- data/plugins/syntax_checker/plugin.yaml +18 -0
- data/plugins/syntax_checker/syntax_checker.rb +662 -0
- data/ruber.desktop +10 -0
- data/spec/annotation_model_spec.rb +174 -0
- data/spec/common.rb +119 -0
- data/spec/component_manager_spec.rb +1259 -0
- data/spec/document_list_spec.rb +626 -0
- data/spec/document_project_spec.rb +373 -0
- data/spec/document_spec.rb +779 -0
- data/spec/editor_view_spec.rb +167 -0
- data/spec/external_program_plugin_spec.rb +676 -0
- data/spec/filtered_output_widget_spec.rb +642 -0
- data/spec/gui_states_handler_spec.rb +304 -0
- data/spec/kde_config_option_backend_spec.rb +214 -0
- data/spec/kde_sugar_spec.rb +101 -0
- data/spec/ktexteditor_wrapper_spec.rb +305 -0
- data/spec/output_widget_spec.rb +1703 -0
- data/spec/plugin_spec.rb +1393 -0
- data/spec/plugin_specification_reader_spec.rb +1765 -0
- data/spec/plugin_specification_spec.rb +401 -0
- data/spec/project_backend_spec.rb +172 -0
- data/spec/project_files_list_spec.rb +401 -0
- data/spec/project_list_spec.rb +511 -0
- data/spec/project_spec.rb +990 -0
- data/spec/qt_sugar_spec.rb +328 -0
- data/spec/settings_container_spec.rb +617 -0
- data/spec/settings_dialog_manager_spec.rb +773 -0
- data/spec/settings_dialog_spec.rb +419 -0
- data/spec/state_spec.rb +991 -0
- data/spec/utils_spec.rb +406 -0
- data/spec/workspace_spec.rb +869 -0
- data/spec/yaml_option_backend_spec.rb +246 -0
- metadata +284 -0
@@ -0,0 +1,10 @@
|
|
1
|
+
name: project_browser
|
2
|
+
version: 0.0.1
|
3
|
+
about:
|
4
|
+
authors: [Stefano Crocco, stefano.crocco@alice.it]
|
5
|
+
license: gpl
|
6
|
+
description: A tool widget displaying the contents of the project directory
|
7
|
+
bug_address: http://github.com/stcrocco/ruber/issues
|
8
|
+
icon: project-development.png
|
9
|
+
require: project_browser.rb
|
10
|
+
tool_widgets: {class: Ruber::ProjectBrowser::ToolWidget, caption: Project browser, position: left, name: project_browser}
|
@@ -0,0 +1,245 @@
|
|
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
|
+
module Ruber
|
22
|
+
|
23
|
+
=begin rdoc
|
24
|
+
Plugin providing a tool widget which displays the files in the project directory
|
25
|
+
|
26
|
+
The tool widget consists of a tree view displaying the contents of the project directory,
|
27
|
+
which is automatically updated whenever the current project changes. The view
|
28
|
+
provides a menu which allows the user to choose whether to show only the files
|
29
|
+
belonging to the project or all files in the directory.
|
30
|
+
|
31
|
+
The view is updated whenever the contents of the project directory change or whenever
|
32
|
+
the @general/project_files@ project option changes.
|
33
|
+
=end
|
34
|
+
module ProjectBrowser
|
35
|
+
|
36
|
+
=begin rdoc
|
37
|
+
The tool widget displaying the project directory
|
38
|
+
=end
|
39
|
+
class ToolWidget < Qt::Widget
|
40
|
+
|
41
|
+
=begin rdoc
|
42
|
+
Filter used by the tree view to hide non-project files. It also allow to turn off
|
43
|
+
filtering, which is used when the user choose to display all files.
|
44
|
+
|
45
|
+
@todo currently, directories containing only non-project files are still shown. This
|
46
|
+
is because of how the filtering is done: filtering the parent object is done before
|
47
|
+
filtering child objects, so there's no direct way to remove empty items. See whether
|
48
|
+
something can be done about it
|
49
|
+
=end
|
50
|
+
class FilterModel < KDE::DirSortFilterProxyModel
|
51
|
+
|
52
|
+
=begin rdoc
|
53
|
+
@param [Qt::Object] parent the parent object
|
54
|
+
=end
|
55
|
+
def initialize parent = nil
|
56
|
+
super
|
57
|
+
@project = Ruber[:projects].current
|
58
|
+
@do_filtering = true
|
59
|
+
self.dynamic_sort_filter = true
|
60
|
+
end
|
61
|
+
|
62
|
+
=begin rdoc
|
63
|
+
Override of @KDE::DirSortFilterProxyModel#filterAcceptsRow@ which rejects all files
|
64
|
+
not belonging to the project, unless filtering has been turned off.
|
65
|
+
|
66
|
+
@param [Integer] row the number of the row to be filtered (in the source model)
|
67
|
+
@param [Qt::ModelIndex] parent the parent of the row to be filtered (in the source model)
|
68
|
+
@return [Boolean] always *true* if filtering has been turned off or no project has
|
69
|
+
been set, otherwise *true*
|
70
|
+
if row corresponds to a directory or to a file belonging to the project and *false*
|
71
|
+
otherwise
|
72
|
+
=end
|
73
|
+
def filterAcceptsRow row, parent
|
74
|
+
return true if @project.nil? or !@do_filtering
|
75
|
+
it = source_model.item_for_index source_model.index(row,0,parent)
|
76
|
+
return true if it.dir?
|
77
|
+
@project.project_files.file_in_project? it.local_path
|
78
|
+
end
|
79
|
+
|
80
|
+
=begin rdoc
|
81
|
+
Changes the project to use for filtering and invalidates the filter
|
82
|
+
@param [Ruber::Project,nil] prj the project to use for filtering (if *nil*, all
|
83
|
+
items will be accepted)
|
84
|
+
@return [nil]
|
85
|
+
=end
|
86
|
+
def project= prj
|
87
|
+
@project = prj
|
88
|
+
invalidate_filter
|
89
|
+
end
|
90
|
+
|
91
|
+
=begin rdoc
|
92
|
+
Tells whether to exclude files not belonging to the project or to accept all items
|
93
|
+
@param [Boolean] val whether or not to accept all files
|
94
|
+
@return [Boolean] _val_
|
95
|
+
=end
|
96
|
+
def do_filtering= val
|
97
|
+
@do_filtering = val
|
98
|
+
invalidate_filter
|
99
|
+
end
|
100
|
+
|
101
|
+
=begin rdoc
|
102
|
+
Override of @KDE::DirSortFilterProxyModel#filterAcceptsRow@ which works as the
|
103
|
+
parent method but is public
|
104
|
+
@return [nil]
|
105
|
+
=end
|
106
|
+
def invalidate_filter
|
107
|
+
super
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
=begin rdoc
|
113
|
+
The view used by the plugin
|
114
|
+
|
115
|
+
The only scope of this class is to provide the context menu
|
116
|
+
=end
|
117
|
+
class View < Qt::TreeView
|
118
|
+
|
119
|
+
=begin rdoc
|
120
|
+
Signal emitted whenever the user toggles the "Show only project files" action
|
121
|
+
@param [Boolean] *true* if the user checked the action and *false* if he unchecked
|
122
|
+
it
|
123
|
+
=end
|
124
|
+
signals 'only_project_files_triggered(bool)'
|
125
|
+
|
126
|
+
=begin rdoc
|
127
|
+
@param [Qt::Widget,nil] parent the parent widget
|
128
|
+
=end
|
129
|
+
def initialize parent = nil
|
130
|
+
super
|
131
|
+
@menu = Qt::Menu.new self
|
132
|
+
@toggle_filter_action = KDE::ToggleAction.new 'Show only project files', @menu
|
133
|
+
@toggle_filter_action.checked = true
|
134
|
+
@menu.add_action @toggle_filter_action
|
135
|
+
connect @toggle_filter_action, SIGNAL('toggled(bool)'), self, SIGNAL('only_project_files_triggered(bool)')
|
136
|
+
end
|
137
|
+
|
138
|
+
=begin rdoc
|
139
|
+
Override of @Qt::AbstractScrollArea#contextMenuEvent@ which displays a menu containing
|
140
|
+
the action
|
141
|
+
@param [Qt::ContextMenuEvent] e the event object
|
142
|
+
=end
|
143
|
+
def contextMenuEvent e
|
144
|
+
@menu.popup e.global_pos
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
|
149
|
+
=begin rdoc
|
150
|
+
Creates a new instance
|
151
|
+
|
152
|
+
The view of the new instance displays the contents of the directory of the current
|
153
|
+
project, if any
|
154
|
+
@param [Qt::Widget,nil] parent the parent widget
|
155
|
+
=end
|
156
|
+
def initialize parent = nil
|
157
|
+
super
|
158
|
+
connect Ruber[:projects], SIGNAL('current_project_changed(QObject*)'), self, SLOT('current_project_changed(QObject*)')
|
159
|
+
self.layout = Qt::VBoxLayout.new self
|
160
|
+
@view = View.new self
|
161
|
+
@model = KDE::DirModel.new @view
|
162
|
+
@model.dir_lister.open_url KDE::Url.new('/')
|
163
|
+
@filter = FilterModel.new @view
|
164
|
+
@filter.source_model = @model
|
165
|
+
@view.model = @filter
|
166
|
+
@view.edit_triggers = Qt::AbstractItemView::NoEditTriggers
|
167
|
+
1.upto(@model.column_count-1){|i| @view.hide_column i}
|
168
|
+
@view.header_hidden = true
|
169
|
+
layout.add_widget @view
|
170
|
+
@project = nil
|
171
|
+
current_project_changed Ruber[:projects].current
|
172
|
+
@view.connect(SIGNAL('only_project_files_triggered(bool)')){|val| @filter.do_filtering = val}
|
173
|
+
connect @view, SIGNAL('activated(QModelIndex)'), self, SLOT('open_file_in_editor(QModelIndex)')
|
174
|
+
end
|
175
|
+
|
176
|
+
private
|
177
|
+
|
178
|
+
=begin rdoc
|
179
|
+
Slot called whenever the current project changes
|
180
|
+
|
181
|
+
This method updates the view so that it displays the contents of the project directory
|
182
|
+
(or disables the view if there's no open project) and sets up the needed connections
|
183
|
+
with the project
|
184
|
+
|
185
|
+
@param [Ruber::Project,nil] prj the current project
|
186
|
+
@return [nil]
|
187
|
+
=end
|
188
|
+
def current_project_changed prj
|
189
|
+
@project.disconnect SIGNAL('option_changed(QString,QString)'), self if @project
|
190
|
+
if prj
|
191
|
+
@project = prj
|
192
|
+
connect @project, SIGNAL('option_changed(QString, QString)'), self, SLOT('project_option_changed(QString, QString)')
|
193
|
+
@model.dir_lister.open_url KDE::Url.new(prj.project_directory)
|
194
|
+
@view.enabled = true
|
195
|
+
else @view.enabled = false
|
196
|
+
end
|
197
|
+
@filter.project = prj
|
198
|
+
nil
|
199
|
+
end
|
200
|
+
slots 'current_project_changed(QObject*)'
|
201
|
+
|
202
|
+
=begin rdoc
|
203
|
+
Slot called whenever a setting of the current project changes
|
204
|
+
|
205
|
+
It is needed to re-applicate the filter after the @general/project_files@ project
|
206
|
+
setting has changed
|
207
|
+
@param [String] group the group the changed setting belongs to
|
208
|
+
@param [String] the name of the changed setting
|
209
|
+
@return [nil]
|
210
|
+
=end
|
211
|
+
def project_option_changed group, name
|
212
|
+
@filter.invalidate_filter if group == 'general' and name == 'project_files'
|
213
|
+
nil
|
214
|
+
end
|
215
|
+
slots 'project_option_changed(QString, QString)'
|
216
|
+
|
217
|
+
=begin rdoc
|
218
|
+
Slot called whenever the user activates an item in the view
|
219
|
+
|
220
|
+
If the item corresponds to a file, it will be opened in an editor, otherwise nothing
|
221
|
+
will be done. The tool widget will be closed unless the Meta key is pressed
|
222
|
+
@param [Qt::ModelIndex] idx the activated index (referred to the filter model)
|
223
|
+
@return [nil]
|
224
|
+
=end
|
225
|
+
def open_file_in_editor idx
|
226
|
+
#Currently, only the name column is supported. However, in the future,
|
227
|
+
#other columns can be supported
|
228
|
+
unless idx.column == KDE::DirModel::Name
|
229
|
+
idx = @filter.index(KDE::DirModel::Name, idx.row, idx.parent)
|
230
|
+
end
|
231
|
+
item = @model.item_for_index @filter.map_to_source(idx)
|
232
|
+
return if item.dir?
|
233
|
+
file = item.local_path
|
234
|
+
modifiers = Ruber[:app].keyboard_modifiers
|
235
|
+
Ruber[:main_window].display_document file
|
236
|
+
Ruber[:main_window].hide_tool self if (Qt::MetaModifier & modifiers) == 0
|
237
|
+
nil
|
238
|
+
end
|
239
|
+
slots 'open_file_in_editor(QModelIndex)'
|
240
|
+
|
241
|
+
end
|
242
|
+
|
243
|
+
end
|
244
|
+
|
245
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
name: rake
|
2
|
+
version: 0.0.1
|
3
|
+
about:
|
4
|
+
authors: [Stefano Crocco, stefano.crocco@alice.it]
|
5
|
+
license: :gpl
|
6
|
+
description: A Ruber interface to rake
|
7
|
+
bug_address: http://github.com/stcrocco/ruber/issues
|
8
|
+
icon: rake.png
|
9
|
+
deps: ruby_runner
|
10
|
+
require: [rake, rake_extension]
|
11
|
+
class: Ruber::Rake::Plugin
|
12
|
+
ui_file: rakeui.rc
|
13
|
+
actions:
|
14
|
+
rake-run: {text: Run Rake &Task..., shortcut: 'Alt+Shift+K, T', slot: choose_and_run_task(), states: [rake_running, rake_has_target]}
|
15
|
+
rake-run_default: {text: Run Default Rake Task, shortcut: 'Alt+Shift+K, D', slot: run_default_task(), states: [rake_running, rake_has_target]}
|
16
|
+
rake-refresh: {text: Refresh Tasks, slot: refresh_tasks(), state: rake_has_target}
|
17
|
+
rake-stop: {text: Stop, shortcut: Esc, icon: process-stop, slot: stop_process(), state: rake_running}
|
18
|
+
config_options:
|
19
|
+
rake:
|
20
|
+
quick_tasks: {default: {}}
|
21
|
+
rake: {default: `which rake`.strip, relative_path: false}
|
22
|
+
sync_stdout: {default: true}
|
23
|
+
config_widgets:
|
24
|
+
- {class: Ruber::Rake::ConfigWidget, pixmap: rake.png, caption: Rake}
|
25
|
+
project_options:
|
26
|
+
rake:
|
27
|
+
rake: {default: `which rake`.strip, scope: all, type: user}
|
28
|
+
rakefile: {default: ~, relative_path: true}
|
29
|
+
options: {default: [], scope: all}
|
30
|
+
environment: {default: [], scope: all}
|
31
|
+
tasks: {type: user, default: {}, scope: all, file_extension: [Rakefile, rakefile, Rakefile.rb, rakefile.rb]}
|
32
|
+
sync_stdout: {default: 'Ruber[:config][:rake, :sync_stdout]', scope: all}
|
33
|
+
timeout: {default: 30, scope: all}
|
34
|
+
tool_widgets:
|
35
|
+
- {class: Ruber::FilteredOutputWidget, caption: Rake, pixmap: rake.png}
|
36
|
+
extensions:
|
37
|
+
rake: {class: Ruber::Rake::ProjectExtension, scope: all, file_extension: [Rakefile, rakefile, Rakefile.rb, rakefile.rb]}
|
38
|
+
project_widgets:
|
39
|
+
- {class: Ruber::Rake::ProjectWidget, pixmap: rake.png, caption: Rake, scope: all, file_extension: [Rakefile, rakefile, Rakefile.rb, rakefile.rb]}
|
Binary file
|
@@ -0,0 +1,567 @@
|
|
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 'timeout'
|
22
|
+
|
23
|
+
require 'ruby_runner/ruby_runner'
|
24
|
+
|
25
|
+
require 'rake/rake_widgets'
|
26
|
+
|
27
|
+
module Ruber
|
28
|
+
|
29
|
+
=begin rdoc
|
30
|
+
Plugin which allows to run rake tasks from within Ruber, displaying the output
|
31
|
+
in a tool widget.
|
32
|
+
|
33
|
+
It provides a dialog which lists all the tasks defined in the rakefile (which can
|
34
|
+
be either chosen by the user or left to rake to find), a menu containing the tasks
|
35
|
+
defined in the current rakefile and a menu containing globally defined tasks. To
|
36
|
+
both project tasks and globally defined tasks can be assigned a shortcut.
|
37
|
+
|
38
|
+
*Note:* the list of project tasks, both in the menu and in the dialog, is computed
|
39
|
+
automatically only once, the first time it's needed. If the rakefile is later changed,
|
40
|
+
the user must manually ask to refresh the list using either the appropriate entry
|
41
|
+
in the menu, the button in the dialog or in the project configuration widget.
|
42
|
+
|
43
|
+
*Note:* this plugin only works for projects, not for single documents (the reason
|
44
|
+
being that if you have more than one file working together, you should create a
|
45
|
+
project).
|
46
|
+
|
47
|
+
@api feature rake
|
48
|
+
@plugin
|
49
|
+
=end
|
50
|
+
module Rake
|
51
|
+
|
52
|
+
=begin rdoc
|
53
|
+
Plugin object for the Rake plugin.
|
54
|
+
|
55
|
+
This plugin relies in a project extension to keep a list of project tasks.
|
56
|
+
|
57
|
+
@api_method #tasks
|
58
|
+
@api_method #run_rake
|
59
|
+
=end
|
60
|
+
class Plugin < RubyRunner::RubyRunnerPlugin
|
61
|
+
|
62
|
+
=begin rdoc
|
63
|
+
Base class for all the exception used by this plugin
|
64
|
+
=end
|
65
|
+
class Error < StandardError
|
66
|
+
end
|
67
|
+
|
68
|
+
=begin rdoc
|
69
|
+
Exception raised when the rake program exits with an error
|
70
|
+
=end
|
71
|
+
class RakeError < Error
|
72
|
+
|
73
|
+
=begin rdoc
|
74
|
+
@return [String] the error message produced by rake
|
75
|
+
=end
|
76
|
+
attr_reader :rake_error
|
77
|
+
|
78
|
+
=begin rdoc
|
79
|
+
@return [<String>] the backtrace produced by rake
|
80
|
+
=end
|
81
|
+
attr_reader :rake_backtrace
|
82
|
+
|
83
|
+
=begin rdoc
|
84
|
+
@param [String] error the error message produced by rake
|
85
|
+
@param <String> backtrace an array containing the rake backtrace
|
86
|
+
=end
|
87
|
+
def initialize error, backtrace
|
88
|
+
super "Rake aborted saying: #{error}"
|
89
|
+
@rake_error = error
|
90
|
+
@rake_backtrace = backtrace
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
=begin rdoc
|
95
|
+
Exception raised if rake exits because it can't find a rakefile
|
96
|
+
=end
|
97
|
+
class RakefileNotFound < Error
|
98
|
+
end
|
99
|
+
|
100
|
+
=begin rdoc
|
101
|
+
Exception raised if rake doesn't exit after a given amount of time
|
102
|
+
=end
|
103
|
+
class Timeout < Error
|
104
|
+
|
105
|
+
=begin rdoc
|
106
|
+
@return [Integer] the number of seconds waited before raising the exception
|
107
|
+
=end
|
108
|
+
attr_reader :time
|
109
|
+
|
110
|
+
=begin rdoc
|
111
|
+
@param [Integer] seconds the the number of seconds waited before raising the exception
|
112
|
+
=end
|
113
|
+
def initialize seconds
|
114
|
+
super "Rake failed to finish within the allowed time (#{seconds} seconds)"
|
115
|
+
@time = seconds
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
|
121
|
+
slots :choose_and_run_task, :run_default_task, :refresh_tasks, :run_quick_task,
|
122
|
+
:set_current_target, :fill_project_menu, :run_project_task
|
123
|
+
|
124
|
+
=begin rdoc
|
125
|
+
Signal emitted when the rake program started with {#run_rake} has exited
|
126
|
+
=end
|
127
|
+
signals :rake_finished
|
128
|
+
|
129
|
+
=begin rdoc
|
130
|
+
@param [Ruber::PluginSpecification] psf
|
131
|
+
=end
|
132
|
+
def initialize psf
|
133
|
+
@quick_tasks_actions = []
|
134
|
+
@project_tasks_actions = []
|
135
|
+
@current_target = nil
|
136
|
+
super psf, :rake, :scope => [:global, :document]
|
137
|
+
setup_handlers
|
138
|
+
Ruber[:main_window].change_state 'rake_running', false
|
139
|
+
Ruber[:autosave].register_plugin self, true
|
140
|
+
@output_widget = @widget
|
141
|
+
self.connect(SIGNAL(:rake_finished)) do
|
142
|
+
Ruber[:main_window].change_state 'rake_running', false
|
143
|
+
end
|
144
|
+
self.connect(SIGNAL(:process_failed_to_start)){Ruber[:main_window].change_state 'rake_running', false}
|
145
|
+
connect Ruber[:projects], SIGNAL('current_project_changed(QObject*)'), self, SLOT(:set_current_target)
|
146
|
+
connect Ruber[:main_window], SIGNAL('current_document_changed(QObject*)'), self, SLOT(:set_current_target)
|
147
|
+
connect self, SIGNAL('process_finished(int, QString)'), self, SIGNAL(:rake_finished)
|
148
|
+
connect self, SIGNAL('extension_added(QString, QObject*)'), self, SLOT(:set_current_target)
|
149
|
+
connect self, SIGNAL('extension_removed(QString, QObject*)'), self, SLOT(:set_current_target)
|
150
|
+
Ruber[:components].connect(SIGNAL('feature_loaded(QString, QObject*)')) do |f, o|
|
151
|
+
o.register_plugin self, true if f == 'autosave'
|
152
|
+
end
|
153
|
+
fill_quick_tasks_menu
|
154
|
+
set_current_target
|
155
|
+
end
|
156
|
+
|
157
|
+
=begin rdoc
|
158
|
+
Loads the settings
|
159
|
+
|
160
|
+
While loading the settings, it also builds the Quick Tasks menu
|
161
|
+
|
162
|
+
@return [nil]
|
163
|
+
=end
|
164
|
+
def load_settings
|
165
|
+
cfg = Ruber[:config][:rake]
|
166
|
+
#This method is called from Plugin#initialize before the gui is created
|
167
|
+
fill_quick_tasks_menu if @gui
|
168
|
+
nil
|
169
|
+
end
|
170
|
+
slots :load_settings
|
171
|
+
|
172
|
+
=begin rdoc
|
173
|
+
The rake tasks availlable, according to the given options.
|
174
|
+
|
175
|
+
To obtain the task list, this method calls <tt>rake -T</tt> synchronously (this
|
176
|
+
means that the method won't return until rake has finished). To avoid freezing
|
177
|
+
Ruber should rake go into an endless loop, this method will give up after a given
|
178
|
+
time (default: 30 seconds).
|
179
|
+
|
180
|
+
For this method to work, the output from <tt>rake -T</tt> should be a series of lines
|
181
|
+
of the form
|
182
|
+
|
183
|
+
<tt>rake task_name # Description</tt>
|
184
|
+
|
185
|
+
However, rake accepts a number of options which may (at least potentially) change
|
186
|
+
this output. If any of these is included in the @:options@ entry of _opts_, it'll
|
187
|
+
be removed (see {#filter_options_to_find_tasks} for a list of the problematic options)
|
188
|
+
|
189
|
+
@param [String] ruby the path of the ruby interpreter to use
|
190
|
+
@param [String] dir the directory rake should be run from
|
191
|
+
@param [Hash] opts a hash containing options to pass to rake and ruby
|
192
|
+
|
193
|
+
@option opts [String] :rake (Ruber[:config][:rake, :rake]) the path to
|
194
|
+
rake.
|
195
|
+
@option opts [<String>] :options ([]) the options to pass to rake
|
196
|
+
@option opts [<String>] :env ([]) the environment to pass to rake. Each entry
|
197
|
+
must be of the form <tt>VARIABLE=VALUE</tt>
|
198
|
+
@option opts [<String>] :ruby_options ([]) the arguments to pass to ruby
|
199
|
+
@option opts [String] :rakefile (nil) the rakefile to use. If *nil*, the -f option
|
200
|
+
won't be passed to rake, which will choose the rakefile by itself
|
201
|
+
@option opts [Integer] :timeout (30) the number of seconds before giving up if
|
202
|
+
rake hasn't finished
|
203
|
+
@raise {RakeError} if rake reports an error while executing the rakefile
|
204
|
+
@raise {RakefileNotFound} if rake can't find the rakefile
|
205
|
+
@raise {Timeout} if <tt>rake -T</tt> doesn't exit after a suitable time
|
206
|
+
|
207
|
+
@return [Hash] a hash with task names as keys and task descriptions as values
|
208
|
+
=end
|
209
|
+
def tasks ruby, dir, opts
|
210
|
+
rake = opts[:rake]
|
211
|
+
default_opts = {:options => [], :env => [], :ruby_options => []}
|
212
|
+
options = default_opts.merge opts
|
213
|
+
options = filter_options_to_find_tasks options[:options]
|
214
|
+
args = [rake, '-T'] + options
|
215
|
+
args << '-f' << opts[:rakefile] if opts[:rakefile]
|
216
|
+
env = opts[:env].join ' '
|
217
|
+
cmd = [ruby] + opts[:ruby_options] + args
|
218
|
+
timeout = opts[:timeout] || 30
|
219
|
+
begin
|
220
|
+
out, err = ::Timeout.timeout(timeout) do
|
221
|
+
_in, out, err = Open3.popen3 env + cmd.join(' ')
|
222
|
+
[out.read, err.read]
|
223
|
+
end
|
224
|
+
rescue ::Timeout::Error
|
225
|
+
['', 'timeout']
|
226
|
+
end
|
227
|
+
if err.sub!(/^\s*rake aborted!\s*\n/i, '')
|
228
|
+
if err=~ /no rakefile found/i then raise RakefileNotFound, err
|
229
|
+
elsif err == 'timeout'
|
230
|
+
raise Timeout.new(timeout)
|
231
|
+
else
|
232
|
+
lines = err.split_lines
|
233
|
+
err = lines.shift
|
234
|
+
lines.delete_at(-1) if lines[-1] =~ /^\s*\(See full trace/
|
235
|
+
raise RakeError.new err, lines
|
236
|
+
end
|
237
|
+
end
|
238
|
+
out = out.split_lines.map do |l|
|
239
|
+
if l.match(/^\s*rake\s*(.*)\s#\s+(.*)/) then [$1.strip, $2]
|
240
|
+
else nil
|
241
|
+
end
|
242
|
+
end
|
243
|
+
out.compact!
|
244
|
+
out.to_h
|
245
|
+
end
|
246
|
+
|
247
|
+
=begin rdoc
|
248
|
+
Runs rake, displaying the output in the associated output widget, according to
|
249
|
+
the given options.
|
250
|
+
|
251
|
+
@param [String] ruby the path of the ruby interpreter to use to run rake
|
252
|
+
@param [String] dir the directory rake should be run from
|
253
|
+
@param [Hash] data a hash containing the options to pass to rake or ruby
|
254
|
+
@option data [Array<String>] :ruby_options ([]) The arguments to pass to ruby itself
|
255
|
+
@option data [String] :rake (Ruber[:config][:rake, :rake]) The path to the rake program to use
|
256
|
+
@option data [Array<String>] :options ([]) The options to pass to rake
|
257
|
+
@option data [String] :rakefile (nil) The rakefile to use (use the default rakefile
|
258
|
+
if *nil*)
|
259
|
+
@option data [Array<String>] :env ([]) The environment variables to set before calling
|
260
|
+
rake. The system environment will be used if this is empty
|
261
|
+
@option data [String] :task (nil) The task to execute. The default task will be
|
262
|
+
executed if this is missing
|
263
|
+
|
264
|
+
@return [nil]
|
265
|
+
=end
|
266
|
+
def run_rake ruby, dir, data
|
267
|
+
rake = data[:rake]
|
268
|
+
args = Array(data[:ruby_options]) + [rake] + Array(data[:options])
|
269
|
+
args += ['-f', data[:rakefile]] if data[:rakefile]
|
270
|
+
args << data[:task] if data[:task]
|
271
|
+
env = Array(data[:env])
|
272
|
+
process.environment = process.system_environment + env
|
273
|
+
cmd = env + [ruby] + args
|
274
|
+
@widget.clear_output
|
275
|
+
@widget.working_directory = dir
|
276
|
+
Ruber[:main_window].activate_tool @widget
|
277
|
+
Ruber[:main_window].change_state 'rake_running', true
|
278
|
+
run_process ruby, dir, args
|
279
|
+
nil
|
280
|
+
end
|
281
|
+
|
282
|
+
=begin rdoc
|
283
|
+
Displays a message box telling why rake failed to retrieve tasks
|
284
|
+
|
285
|
+
This method is meant to be called in a @rescue@ clause for {RakeError}
|
286
|
+
exceptions from methods which call {#tasks}. According to the type of exception
|
287
|
+
raised, the appropriate text will be displayed in the message box.
|
288
|
+
|
289
|
+
@param [RakeError] ex the exception describing the error
|
290
|
+
|
291
|
+
@return [self]
|
292
|
+
=end
|
293
|
+
def display_task_retrival_error_dialog ex
|
294
|
+
msg = case ex
|
295
|
+
when RakeError
|
296
|
+
# The <i></i> tag is needed because (according to the QMessageBox documentation),
|
297
|
+
# for the text to be interpreted as rich text, an html tag must be present
|
298
|
+
# before the first newline.
|
299
|
+
"Rake aborted with the following error message:<i></i>\n<pre>#{e.rake_error}\n#{e.rake_backtrace.join "\n"}</pre>"
|
300
|
+
when RakefileNotFound then "No rakefile was found"
|
301
|
+
when Timeout then e.message
|
302
|
+
end
|
303
|
+
KDE::MessageBox.sorry Ruber[:main_window], msg
|
304
|
+
self
|
305
|
+
end
|
306
|
+
|
307
|
+
private
|
308
|
+
|
309
|
+
=begin rdoc
|
310
|
+
Creates and registers the gui state handlers for the actions provided by the plugin.
|
311
|
+
|
312
|
+
@return [nil]
|
313
|
+
=end
|
314
|
+
def setup_handlers
|
315
|
+
@quick_tasks_handler_prc = Proc.new do |sts|
|
316
|
+
!sts['rake_running'] and sts['rake_has_target']
|
317
|
+
end
|
318
|
+
register_action_handler 'rake-run', &@quick_tasks_handler_prc
|
319
|
+
register_action_handler 'rake-run_default', &@quick_tasks_handler_prc
|
320
|
+
nil
|
321
|
+
end
|
322
|
+
|
323
|
+
=begin rdoc
|
324
|
+
Fills the Quick Tasks menu
|
325
|
+
|
326
|
+
It removes the @rake-quick_tasks_list@ action list from the menu, then
|
327
|
+
creates the actions according to the current content of the rake/quick_tasks
|
328
|
+
option and fills the menu again.
|
329
|
+
|
330
|
+
If the rake/quick_tasks option is empty, a single, disabled action with text
|
331
|
+
@(Empty)@ is inserted.
|
332
|
+
|
333
|
+
@return nil
|
334
|
+
=end
|
335
|
+
def fill_quick_tasks_menu
|
336
|
+
mw = Ruber[:main_window]
|
337
|
+
@quick_tasks_actions.each do |a|
|
338
|
+
mw.remove_action_handler_for a if a.object_name != 'rake-quick_task_empty_action'
|
339
|
+
a.dispose
|
340
|
+
end
|
341
|
+
@gui.unplug_action_list "rake-quick_tasks_list"
|
342
|
+
coll = @gui.action_collection
|
343
|
+
@quick_tasks_actions = Ruber[:config][:rake, :quick_tasks].sort.map do |k, v|
|
344
|
+
a = coll.add_action "rake-quick_task-#{k}", self, SLOT(:run_quick_task)
|
345
|
+
a.text = k
|
346
|
+
a.shortcut = KDE::Shortcut.new(v)
|
347
|
+
mw.register_action_handler a, %w[rake_running active_project_exists current_document], :extra_id => self, &@quick_tasks_handler_prc
|
348
|
+
a
|
349
|
+
end
|
350
|
+
if @quick_tasks_actions.empty?
|
351
|
+
a = coll.add_action 'rake-quick_task_empty_action'
|
352
|
+
a.text = '(Empty)'
|
353
|
+
a.enabled = false
|
354
|
+
a.object_name = 'rake-quick_task_empty_action'
|
355
|
+
@quick_tasks_actions << a
|
356
|
+
end
|
357
|
+
@gui.plug_action_list "rake-quick_tasks_list", @quick_tasks_actions
|
358
|
+
nil
|
359
|
+
end
|
360
|
+
|
361
|
+
=begin rdoc
|
362
|
+
Slot associated with the @rake-run@ action
|
363
|
+
|
364
|
+
It displays a dialog where the user can choose a taks for the current target,
|
365
|
+
then executes it. If the user cancels the dialog, nothing else happens
|
366
|
+
|
367
|
+
@return [nil]
|
368
|
+
=end
|
369
|
+
def choose_and_run_task
|
370
|
+
task = choose_task_for @current_target
|
371
|
+
return unless task
|
372
|
+
@current_target.extension(:rake).run_rake task
|
373
|
+
end
|
374
|
+
|
375
|
+
=begin rdoc
|
376
|
+
Displays a dialog where the user can choose the task to run according to the settings
|
377
|
+
of the given project.
|
378
|
+
|
379
|
+
@param [AbstractProject] prj the project to read the settings from
|
380
|
+
|
381
|
+
@return [String, nil] the name of the chosen task or *nil* if the user closed the
|
382
|
+
dialog with the Cancel button
|
383
|
+
=end
|
384
|
+
def choose_task_for prj
|
385
|
+
dlg = ChooseTaskDlg.new prj
|
386
|
+
return if dlg.exec == Qt::Dialog::Rejected
|
387
|
+
dlg.task
|
388
|
+
end
|
389
|
+
|
390
|
+
=begin rdoc
|
391
|
+
Slot associated with the @rake-run_default@ action.
|
392
|
+
|
393
|
+
Runs the default task for the current target
|
394
|
+
@return [nil]
|
395
|
+
=end
|
396
|
+
def run_default_task
|
397
|
+
@current_target.extension(:rake).run_rake nil
|
398
|
+
nil
|
399
|
+
end
|
400
|
+
|
401
|
+
=begin rdoc
|
402
|
+
Slot associated with the various quick tasks actions defined by the user
|
403
|
+
|
404
|
+
Runs the rake task whose name is equal to the name of the action which called
|
405
|
+
this slot
|
406
|
+
|
407
|
+
@return [nil]
|
408
|
+
=end
|
409
|
+
def run_quick_task
|
410
|
+
task = sender.text.gsub('&', '')
|
411
|
+
@current_target.extension(:rake).run_rake task
|
412
|
+
end
|
413
|
+
|
414
|
+
=begin rdoc
|
415
|
+
Slot associated with the various project tasks actions defined by the user for the
|
416
|
+
current target
|
417
|
+
|
418
|
+
Runs the rake task whose name is equal to the name of the action which called
|
419
|
+
this slot
|
420
|
+
|
421
|
+
@return [nil]
|
422
|
+
=end
|
423
|
+
def run_project_task
|
424
|
+
task = sender.text.gsub('&', '')
|
425
|
+
@current_target.extension(:rake).run_rake task
|
426
|
+
end
|
427
|
+
|
428
|
+
|
429
|
+
=begin rdoc
|
430
|
+
The project to run rake for when one of the rake menu entries is chosen
|
431
|
+
|
432
|
+
@return [DocumentProject] the {DocumentProject} associated with the current
|
433
|
+
document if the latter is a rakefile and doesn't belong to the current project
|
434
|
+
@return [Project] the current project, if the current file belongs to it or if
|
435
|
+
it isn't a rakefile
|
436
|
+
@return [nil] if there's no open document or if the current document isn't a rakefile
|
437
|
+
and there's no open project
|
438
|
+
=end
|
439
|
+
def find_current_target
|
440
|
+
target = Ruber[:main_window].current_document.project rescue nil
|
441
|
+
if target.nil? or !target.has_extension? :rake
|
442
|
+
prj = Ruber[:projects].current
|
443
|
+
target = if prj and prj.has_extension? :rake then prj
|
444
|
+
else nil
|
445
|
+
end
|
446
|
+
end
|
447
|
+
target
|
448
|
+
end
|
449
|
+
|
450
|
+
|
451
|
+
=begin rdoc
|
452
|
+
Given a list of rake options, creates a list containing only those which are safe
|
453
|
+
to use from {tasks}.
|
454
|
+
|
455
|
+
The options which will be removed are: -D, -n, -P, -q, --rules, -s,
|
456
|
+
-t, v, -V, -h, -e, -p and -E, because in a way or another have the capability
|
457
|
+
to change the rake output from what <tt>tasks_for</tt> expects.
|
458
|
+
|
459
|
+
<b>Note:</b> this method creates a new array; it doesn't modify _opts_.
|
460
|
+
|
461
|
+
@param [Array <String>] opts a list of options to be passed to rake
|
462
|
+
|
463
|
+
@return [Array<String>] an array containing only the safe options from _opts_
|
464
|
+
=end
|
465
|
+
def filter_options_to_find_tasks opts
|
466
|
+
flags_to_delete = %w[-D --describe -n --dry-run -P --prereqs -q --quiet --rules -s --silent -t --trace -v --verbose -V --version -h -H --help]
|
467
|
+
opts = opts.dup
|
468
|
+
opts.delete '-D'
|
469
|
+
opts.delete '--describe'
|
470
|
+
opts.delete '-n'
|
471
|
+
%w[-e --execute -p --execute-print -E --execute-continue].each do |o|
|
472
|
+
idxs = opts.each_index.find_all{|i| opts[i] == o}
|
473
|
+
idxs.reverse_each do |i|
|
474
|
+
opts.delete_at i + 1
|
475
|
+
opts.delete_at i
|
476
|
+
end
|
477
|
+
end
|
478
|
+
opts
|
479
|
+
end
|
480
|
+
|
481
|
+
=begin rdoc
|
482
|
+
Changes the current target.
|
483
|
+
|
484
|
+
It uses {#find_current_target} to find out the new current target, then, if it
|
485
|
+
is different from the old one, makes the necessary connections and disconnections
|
486
|
+
and refills the project menu
|
487
|
+
|
488
|
+
@return [nil]
|
489
|
+
=end
|
490
|
+
def set_current_target
|
491
|
+
target = find_current_target
|
492
|
+
return if target == @current_target
|
493
|
+
# If the project is being closed, the extension may have been removed
|
494
|
+
if @current_target and @current_target.extension(:rake)
|
495
|
+
@current_target.extension(:rake).disconnect SIGNAL(:tasks_updated)
|
496
|
+
end
|
497
|
+
@current_target = target
|
498
|
+
fill_project_menu
|
499
|
+
if @current_target
|
500
|
+
connect @current_target.extension(:rake), SIGNAL(:tasks_updated), self, SLOT(:fill_project_menu)
|
501
|
+
end
|
502
|
+
Ruber[:main_window].set_state 'rake_has_target', !@current_target.nil?
|
503
|
+
nil
|
504
|
+
end
|
505
|
+
|
506
|
+
=begin rdoc
|
507
|
+
Fills the Project Tasks menu, according to the current target
|
508
|
+
|
509
|
+
It clears the menu, then inserts in the menu one action for each entry in the
|
510
|
+
current target's rake/tasks option. If that option is empty, or if there's no
|
511
|
+
current target, then a single, disabled entry with text '(Empty)' is inserted in
|
512
|
+
the menu
|
513
|
+
|
514
|
+
@return [nil]
|
515
|
+
=end
|
516
|
+
def fill_project_menu
|
517
|
+
@gui.unplug_action_list 'rake-project_tasks_list'
|
518
|
+
mw = Ruber[:main_window]
|
519
|
+
@project_tasks_actions.each do |a|
|
520
|
+
mw.remove_action_handler_for a
|
521
|
+
a.dispose
|
522
|
+
end
|
523
|
+
@project_tasks_actions.clear
|
524
|
+
coll = @gui.action_collection
|
525
|
+
if @current_target
|
526
|
+
tasks = @current_target[:rake, :tasks]
|
527
|
+
tasks.each_pair do |t, x|
|
528
|
+
desc, short = *x
|
529
|
+
a = coll.add_action "rake-project_task-#{t}", self, SLOT(:run_project_task)
|
530
|
+
a.text = t
|
531
|
+
a.shortcut = KDE::Shortcut.new short if short
|
532
|
+
a.help_text = desc
|
533
|
+
Ruber[:main_window].register_action_handler a,
|
534
|
+
%w[rake_running active_project_exists], :extra_id => self,
|
535
|
+
&@quick_tasks_handler_prc
|
536
|
+
@project_tasks_actions << a
|
537
|
+
end
|
538
|
+
end
|
539
|
+
if @project_tasks_actions.empty?
|
540
|
+
a = coll.add_action 'rake-project_tasks_empty'
|
541
|
+
a.text = "(Empty)"
|
542
|
+
a.enabled = false
|
543
|
+
@project_tasks_actions << a
|
544
|
+
end
|
545
|
+
@gui.plug_action_list 'rake-project_tasks_list', @project_tasks_actions
|
546
|
+
nil
|
547
|
+
end
|
548
|
+
|
549
|
+
=begin rdoc
|
550
|
+
Updates the tasks
|
551
|
+
|
552
|
+
@return [nil]
|
553
|
+
=end
|
554
|
+
def refresh_tasks
|
555
|
+
Ruber[:app].with_override_cursor do
|
556
|
+
begin @current_target.extension(:rake).update_tasks
|
557
|
+
rescue Error => ex
|
558
|
+
display_task_retrival_error_dialog ex
|
559
|
+
end
|
560
|
+
end
|
561
|
+
end
|
562
|
+
|
563
|
+
end
|
564
|
+
|
565
|
+
end
|
566
|
+
|
567
|
+
end
|