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
@@ -0,0 +1,537 @@
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 'ruber/main_window/save_modified_files_dlg'
22
+ require 'ruber/main_window/open_file_in_project_dlg'
23
+ require_relative 'ui/main_window_settings_widget'
24
+ require 'ruber/main_window/choose_plugins_dlg'
25
+ require 'ruber/main_window/ui/new_project_widget'
26
+
27
+
28
+ module Ruber
29
+
30
+ class MainWindow < KParts::MainWindow
31
+
32
+ slots 'open_recent_project(KUrl)', :close_current_project, :open_file,
33
+ :open_project, :open_file_in_project, :preferences, :choose_plugins,
34
+ :new_project, :configure_project, 'open_recent_file(KUrl)',
35
+ :close_current, :close_other_views, :save_all, :new_file, :activate_editor,
36
+ :close_all_views, 'activate_editor(int)', :close_current_editor, :focus_on_editor,
37
+ 'add_about_plugin_action(QObject*)', 'remove_about_plugin_action(QObject*)',
38
+ :display_about_plugin_dlg, :configure_document, :toggle_tool_widget
39
+
40
+ private
41
+
42
+ =begin rdoc
43
+ Slot connected to the 'New File' action
44
+
45
+ It creates and activates a new, empty file
46
+
47
+ @return [nil]
48
+ =end
49
+ def new_file
50
+ display_doc Ruber[:docs].new_document
51
+ nil
52
+ end
53
+
54
+ =begin rdoc
55
+ Slot connected to the 'Open File' action.
56
+
57
+ It opens in an editor and activates a document associated with a file chosen by the
58
+ user with an OpenFile dialog (the document is created if needed). It also adds
59
+ the file to the list of recently opened files.
60
+
61
+ @return [nil]
62
+ =end
63
+ def open_file
64
+ dir = KDE::Url.from_path(Ruber.current_project.project_directory) rescue KDE::Url.new
65
+ filenames = KDE::FileDialog.get_open_urls(dir, OPEN_DLG_FILTERS.join("\n") , self)
66
+ without_activating do
67
+ filenames.each{|f| gui_open_file f}
68
+ end
69
+ nil
70
+ end
71
+
72
+ =begin rdoc
73
+ Slot connected to the 'Open Recent File' action
74
+
75
+ It opens the file associated with the specified URL in an editor and gives it focus
76
+
77
+ @param [KDE::Url] the url of the file to open
78
+ @return [nil]
79
+ =end
80
+ def open_recent_file url
81
+ gui_open_file url.path
82
+ nil
83
+ end
84
+
85
+ =begin rdoc
86
+ Slot connected to the 'Close Current' action
87
+
88
+ It closes the current editor, if any. If the documents is modified,
89
+ it allows the user to choose what to do via a dialog. If the user chooses to abort
90
+ closing, nothing is done
91
+
92
+ @return [nil]
93
+ =end
94
+ def close_current_editor
95
+ close_editor active_editor if active_editor
96
+ nil
97
+ end
98
+
99
+ =begin rdoc
100
+ Slot connected to the 'Close All Other' action
101
+
102
+ It closes all the editors except the current one. If some documents are modified,
103
+ it allows the user to choose what to do via a dialog. If the user chooses to abort
104
+ closing, nothing is done.
105
+
106
+ @return [nil]
107
+ =end
108
+ def close_other_views
109
+ to_close = @views.select{|w| w != @views.current_widget}.map{|w| w.document}
110
+ if save_documents to_close
111
+ without_activating do
112
+ to_close.dup.each{|d| d.close_view d.view, false}
113
+ end
114
+ end
115
+ nil
116
+ end
117
+
118
+ =begin rdoc
119
+ Slot connected with the 'Close All' action
120
+
121
+ It closes all the editors. If some documents are modified,
122
+ it allows the user to choose what to do via a dialog. If the user chooses to abort
123
+ closing, nothing is done.
124
+
125
+ @return [nil]
126
+ =end
127
+ def close_all_views ask = true
128
+ return if ask and !save_documents @views.map{|v| v.document}
129
+ without_activating do
130
+ @views.to_a.each do |w|
131
+ close_editor w, false
132
+ end
133
+ end
134
+ nil
135
+ end
136
+
137
+ =begin rdoc
138
+ Slot connected to the 'Open Recent Projet' action
139
+
140
+ It opens a project and activates a project
141
+
142
+ @param [KDE::Url] the url of the project file to open
143
+ @return [nil]
144
+ =end
145
+ def open_recent_project url
146
+ return unless safe_open_project url.path
147
+ action_collection.action('project-open_recent').add_url url, url.file_name
148
+ nil
149
+ end
150
+
151
+ =begin rdoc
152
+ Slot connected to the 'Open Project' action
153
+
154
+ It opens the project chosen by the user using an open dialog
155
+
156
+ @return [nil]
157
+ =end
158
+ def open_project
159
+ filename = KDE::FileDialog.get_open_file_name KDE::Url.from_path(
160
+ ENV['HOME'] ), '*.ruprj|Ruber project files (*.ruprj)', self,
161
+ KDE::i18n('Open project')
162
+ return unless filename
163
+ prj = safe_open_project filename
164
+ url = KDE::Url.new prj.project_file
165
+ action_collection.action('project-open_recent').add_url url, url.file_name
166
+ nil
167
+ end
168
+
169
+ =begin rdoc
170
+ Slot connectedto the 'Close Current Project' action
171
+ =end
172
+ def close_current_project
173
+ unless Ruber[:projects].current_project.close
174
+ KDE::MessageBox.sorry self, "The project couldn't be saved"
175
+ end
176
+ end
177
+
178
+ =begin rdoc
179
+ Slot connected to the 'Quick Open File' action
180
+
181
+ It opens the file chosen by the user in a quick open file dialog
182
+
183
+ @retrun [nil]
184
+ =end
185
+ def open_file_in_project
186
+ dlg = OpenFileInProjectDlg.new self
187
+ if dlg.exec == Qt::Dialog::Accepted
188
+ display_doc dlg.chosen_file
189
+ action_collection.action( 'file_open_recent').add_url( KDE::Url.new(dlg.chosen_file) )
190
+ end
191
+ nil
192
+ end
193
+
194
+ =begin rdoc
195
+ Slot connected to the 'Configure Ruber' action
196
+
197
+ It displays the configuration dialog
198
+
199
+ @return [nil]
200
+ =end
201
+ def preferences
202
+ Ruber[:config].dialog.exec
203
+ nil
204
+ end
205
+
206
+ =begin rdoc
207
+ Slot connected with the 'Choose Plugins' action
208
+
209
+ It displays the choose plugins dialog then (unless the user canceled the dialog)
210
+ unloads all plugins and reloads them.
211
+
212
+ If there's a problem while reloading the plugins, the application is closed after
213
+ informing the user
214
+
215
+ @return [nil]
216
+ =end
217
+ def choose_plugins
218
+ dlg = ChoosePluginsDlg.new self
219
+ return if dlg.exec == Qt::Dialog::Rejected
220
+ loaded = []
221
+ Ruber[:components].plugins.each do |pl|
222
+ pl.save_settings
223
+ loaded << pl.plugin_name
224
+ end
225
+ loaded.each{|pl| Ruber[:components].unload_plugin pl}
226
+ res = Ruber[:app].safe_load_plugins dlg.plugins.keys.map(&:to_s)
227
+ close unless res
228
+ nil
229
+ end
230
+
231
+ =begin rdoc
232
+ Slot connected with the 'Configure Project' action
233
+
234
+ It displays the configure project dialog for the current project. It does nothing
235
+ if there's no active project
236
+
237
+ @return [nil]
238
+ =end
239
+ def configure_project
240
+ prj = Ruber.current_project
241
+ raise "No project is selected" unless prj
242
+ prj.dialog.exec
243
+ nil
244
+ end
245
+
246
+ =begin rdoc
247
+ Slot connected with the 'New Project' action
248
+
249
+ It displays the new project dialog. Unless the user cancels the dialog, it creates
250
+ the project directory and creates and saves a new project with the parameters chosen
251
+ by the user. The new project is then activated. If there was another active project,
252
+ it's closed
253
+
254
+ @return [nil]
255
+ =end
256
+ def new_project
257
+ dlg = NewProjectDialog.new self
258
+ return if dlg.exec == Qt::Dialog::Rejected
259
+ dir = File.dirname dlg.project_file
260
+ FileUtils.mkdir dir
261
+ prj = Ruber[:projects].new_project dlg.project_file, dlg.project_name
262
+ prj.save
263
+ action_collection.action('project-open_recent').add_url KDE::Url.new(dlg.project_file)
264
+ Ruber[:projects].close_current_project if Ruber[:projects].current
265
+ Ruber[:projects].current_project = prj
266
+ nil
267
+ end
268
+
269
+ =begin rdoc
270
+ Slot connected with the 'Next Document' action
271
+
272
+ Makes the editor to the right of the current one active. If there's no editor to
273
+ the right, the first editor becomes active
274
+
275
+ @return [nil]
276
+ =end
277
+ def next_document
278
+ idx = @views.current_index
279
+ new_idx = idx + 1 < @views.count ? idx + 1 : 0
280
+ activate_editor new_idx
281
+ nil
282
+ end
283
+
284
+ =begin rdoc
285
+ Slot connected with the 'Previous Document' action
286
+
287
+ Makes the editor to the left of the current one active. If there's no editor to
288
+ the left, the last editor becomes active
289
+
290
+ @return [nil]
291
+ =end
292
+ def previous_document
293
+ idx = @views.current_index
294
+ new_idx = idx > 0 ? idx - 1 : @views.count - 1
295
+ activate_editor new_idx
296
+ nil
297
+ end
298
+
299
+ =begin rdoc
300
+ Slot connected to the 'Ruber User Manual' action
301
+
302
+ Opens the user's browser and points it to the user manual
303
+
304
+ @return [nil]
305
+ =end
306
+ def show_user_manual
307
+ KDE::Run.run_url KDE::Url.new('http://stcrocco.github.com/ruber/user_manual'), 'text/html', self
308
+ nil
309
+ end
310
+ slots :show_user_manual
311
+
312
+ =begin rdoc
313
+ Slot connected to the actions in the "about_plugins_list" action list.
314
+
315
+ Displays a dialog with the about data regarding a plugin. The plugin to use is
316
+ determined from the triggered action
317
+
318
+ @return [nil]
319
+ =end
320
+ def display_about_plugin_dlg
321
+ name = sender.object_name.to_sym
322
+ data = Ruber[name].about_data
323
+ dlg = KDE::AboutApplicationDialog.new data, self
324
+ dlg.exec
325
+ nil
326
+ end
327
+
328
+ =begin rdoc
329
+ Creates an About entry for a component in the "about plugins list" of the Help menu
330
+
331
+ *Notes:*
332
+ # this method doesn't check whether the action already exists for the given
333
+ plugin. Since it's usually called in response to the {ComponentManager#component_loaded component_loaded}
334
+ signal of the component manager, there shouldn't be problems with this
335
+ # this method does nothing for core components
336
+
337
+ @param [Plugin] comp the plugin object of the plugin to create the action for
338
+ @return [nil]
339
+ =end
340
+ def add_about_plugin_action comp
341
+ name = comp.plugin_name
342
+ return unless comp.is_a? Plugin
343
+ unplug_action_list 'about_plugins_list'
344
+ a = action_collection.add_action "__about_#{name}", self, SLOT(:display_about_plugin_dlg)
345
+ a.object_name = name.to_s
346
+ a.text = comp.plugin_description.about.human_name
347
+ unless comp.plugin_description.about.icon.empty?
348
+ a.icon = KDE::Icon.new(comp.plugin_description.about.icon)
349
+ end
350
+ @about_plugin_actions << a
351
+ plug_action_list 'about_plugins_list', @about_plugin_actions
352
+ nil
353
+ end
354
+
355
+ =begin rdoc
356
+ Removes the About entry for the given menu from the "about plugins list" of the Help menu
357
+
358
+ *Notes:*
359
+ # this method doesn't check whether the action for the given
360
+ plugin actually exists. Since it's usually called in response to the {ComponentManager#unloading_component unloading_component}
361
+ signal of the component manager, there shouldn't be problems with this
362
+ # this method does nothing for core components
363
+
364
+ @param [Plugin] comp the plugin object of the plugin to remove the action for
365
+ @return [nil]
366
+ =end
367
+ def remove_about_plugin_action comp
368
+ name = comp.plugin_name.to_s
369
+ return unless comp.is_a? Plugin
370
+ unplug_action_list 'about_plugins_list'
371
+ a = @about_plugin_actions.find{|i| i.object_name == comp.plugin_name.to_s}
372
+ @about_plugin_actions.delete a
373
+ plug_action_list 'about_plugins_list', @about_plugin_actions
374
+ a.delete_later
375
+ end
376
+
377
+ =begin rdoc
378
+ Slot associated with the Configure Document action
379
+
380
+ Displays the configuration dialog for the current document, if it exists
381
+
382
+ @return [nil]
383
+ =end
384
+ def configure_document
385
+ current_document.own_project.dialog.exec
386
+ nil
387
+ end
388
+
389
+ =begin rdoc
390
+ Slot associated with the Toggle * Tool Widget
391
+
392
+ It identifies the tool widget to toggle basing on the name of the triggered action
393
+
394
+ @return [nil]
395
+ =end
396
+ def toggle_tool_widget
397
+ side = sender.object_name.match(/(left|right|bottom)/)[1].to_sym
398
+ w = @workspace.current_widget(side)
399
+ return unless w
400
+ @workspace.toggle_tool w
401
+ nil
402
+ end
403
+
404
+ end
405
+
406
+ =begin rdoc
407
+ Class containing the settings associated with the main window
408
+ =end
409
+ class MainWindowSettingsWidget < Qt::Widget
410
+
411
+ =begin rdoc
412
+ @param [Qt::Widget,nil] parent the parent widget
413
+ =end
414
+ def initialize parent = nil
415
+ super
416
+ @ui = Ui::MainWindowSettingsWidget.new
417
+ @ui.setupUi self
418
+ @ui._general__default_script_directory.mode = KDE::File::Directory
419
+ @ui._general__default_project_directory.mode = KDE::File::Directory
420
+ end
421
+
422
+ =begin rdoc
423
+ Override of @Qt::Widget#sizeHint@
424
+
425
+ @return [Qt::Size] the suggested size for the widget
426
+ =end
427
+ def sizeHint
428
+ Qt::Size.new(380,150)
429
+ end
430
+
431
+ end
432
+
433
+ =begin rdoc
434
+ Dialog where the user enters the parameters to create a new project
435
+ =end
436
+ class NewProjectDialog < KDE::Dialog
437
+
438
+ =begin rdoc
439
+ Main widget for the {NewProjectDialog}
440
+ =end
441
+ class NewProjectWidget < Qt::Widget
442
+
443
+ =begin rdoc
444
+ Signal emitted when the user changes the data in the widget
445
+
446
+ @param [Boolean] complete whether or not the user has filled all the necessary
447
+ fields with correct data
448
+ =end
449
+ signals 'complete_status_changed(bool)'
450
+
451
+ slots 'data_changed()'
452
+
453
+ =begin rdoc
454
+ @param [Qt::Widget,nil] parent the parent widget
455
+ =end
456
+ def initialize parent = nil
457
+ super
458
+ @ui = Ui::NewProjectWidget.new
459
+ @ui.setupUi self
460
+ @ui.container_dir.url = KDE::Url.new Ruber[:config][:general, :default_project_directory]
461
+ @ui.container_dir.mode = KDE::File::Directory | KDE::File::LocalOnly|
462
+ KDE::File::ExistingOnly
463
+ connect @ui.project_name, SIGNAL('textChanged(QString)'), self, SLOT('data_changed()')
464
+ connect @ui.container_dir, SIGNAL('textChanged(QString)'), self, SLOT('data_changed()')
465
+ @ui.project_name.set_focus
466
+ self.focus_proxy = @ui.project_name
467
+ end
468
+
469
+ =begin rdoc
470
+ @return [String] the name chosen by the user for the project
471
+ =end
472
+ def project_name
473
+ @ui.project_name.text
474
+ end
475
+
476
+ =begin rdoc
477
+ @return [String] the path of the project file
478
+ =end
479
+ def project_file
480
+ @ui.final_location.text
481
+ end
482
+
483
+ private
484
+
485
+ =begin rdoc
486
+ Slot called whenever the user changes data in the widget
487
+
488
+ It updates the Final location widget, displays the Invalid final location message
489
+ if the project directory already exists and emit the {#complete_status_changed}
490
+ signal
491
+
492
+ @return [nil]
493
+ =end
494
+ def data_changed
495
+ name = @ui.project_name.text
496
+ container = @ui.container_dir.url.path || ''
497
+ file = name.gsub(/\W/,'_')
498
+ @ui.final_location.text = File.join container, file, "#{file}.ruprj"
499
+ valid_container = File.exist?(container)
500
+ valid = (valid_container and !(name.empty? or container.empty? or
501
+ File.exist? File.join(container, file)))
502
+ @ui.invalid_project.text = valid ? '' : 'Invalid final location'
503
+ emit complete_status_changed(valid)
504
+ nil
505
+ end
506
+
507
+ end
508
+
509
+ =begin rdoc
510
+ @param [Qt::Widget,nil] parent the parent widget
511
+ =end
512
+ def initialize parent = Ruber[:main_window]
513
+ super
514
+ self.caption = 'New Project'
515
+ self.main_widget = NewProjectWidget.new self
516
+ enableButtonOk false
517
+ self.main_widget.set_focus
518
+ connect main_widget, SIGNAL('complete_status_changed(bool)'), self, SLOT('enableButtonOk(bool)')
519
+ end
520
+
521
+ =begin rdoc
522
+ @return [String] the path of the project file
523
+ =end
524
+ def project_file
525
+ main_widget.project_file
526
+ end
527
+
528
+ =begin rdoc
529
+ @return [String] the name chosen by the user for the project
530
+ =end
531
+ def project_name
532
+ main_widget.project_name
533
+ end
534
+
535
+ end
536
+
537
+ end