ruber 0.0.8 → 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. data/CHANGES +21 -0
  2. data/data/share/apps/ruber/ruberui.rc +3 -1
  3. data/lib/ruber/application/application.rb +22 -23
  4. data/lib/ruber/application/plugin.yaml +7 -2
  5. data/lib/ruber/{projects → application}/project_files_list.rb +0 -0
  6. data/lib/ruber/{projects → application}/project_files_widget.rb +0 -0
  7. data/lib/ruber/application/ui/project_files_rule_chooser_widget.rb +74 -0
  8. data/lib/ruber/{projects → application}/ui/project_files_rule_chooser_widget.ui +0 -0
  9. data/lib/ruber/application/ui/project_files_widget.rb +117 -0
  10. data/lib/ruber/{projects → application}/ui/project_files_widget.ui +0 -0
  11. data/lib/ruber/component_manager.rb +14 -9
  12. data/lib/ruber/editor/document.rb +35 -5
  13. data/lib/ruber/kde_sugar.rb +16 -0
  14. data/lib/ruber/main_window/choose_plugins_dlg.rb +7 -4
  15. data/lib/ruber/main_window/main_window.rb +131 -193
  16. data/lib/ruber/main_window/main_window_actions.rb +157 -58
  17. data/lib/ruber/main_window/main_window_internal.rb +145 -54
  18. data/lib/ruber/main_window/open_file_in_project_dlg.rb +4 -4
  19. data/lib/ruber/main_window/plugin.yaml +3 -6
  20. data/lib/ruber/main_window/ui/workspace_settings_widget.rb +2 -2
  21. data/lib/ruber/main_window/workspace.rb +62 -32
  22. data/lib/ruber/output_widget.rb +20 -16
  23. data/lib/ruber/pane.rb +11 -5
  24. data/lib/ruber/project.rb +27 -12
  25. data/lib/ruber/projects/ui/project_files_rule_chooser_widget.rb +2 -2
  26. data/lib/ruber/projects/ui/project_files_widget.rb +2 -2
  27. data/lib/ruber/utils.rb +37 -4
  28. data/lib/ruber/version.rb +1 -1
  29. data/lib/ruber/world/document_factory.rb +121 -0
  30. data/lib/ruber/world/document_list.rb +396 -0
  31. data/lib/ruber/world/environment.rb +470 -0
  32. data/lib/ruber/{main_window → world}/hint_solver.rb +1 -1
  33. data/lib/ruber/world/plugin.yaml +11 -0
  34. data/lib/ruber/world/project_factory.rb +131 -0
  35. data/lib/ruber/world/project_list.rb +265 -0
  36. data/lib/ruber/world/ui/workspace_settings_widget.rb +51 -0
  37. data/lib/ruber/{main_window → world}/ui/workspace_settings_widget.ui +0 -0
  38. data/lib/ruber/world/world.rb +307 -0
  39. data/plugins/auto_end/auto_end.rb +135 -9
  40. data/plugins/autosave/autosave.rb +4 -4
  41. data/plugins/find_in_files/find_in_files.rb +5 -5
  42. data/plugins/find_in_files/find_in_files_widgets.rb +1 -1
  43. data/plugins/project_browser/project_browser.rb +4 -4
  44. data/plugins/rake/rake.rb +4 -4
  45. data/plugins/rake/rake_extension.rb +1 -1
  46. data/plugins/rspec/rspec.rb +4 -4
  47. data/plugins/rspec/ruber_rspec_formatter.rb +2 -2
  48. data/plugins/ruby_development/ruby_development.rb +3 -3
  49. data/plugins/ruby_runner/ruby_runner.rb +2 -2
  50. data/plugins/state/plugin.yaml +6 -8
  51. data/plugins/state/state.rb +201 -391
  52. data/plugins/state/ui/config_widget.rb +5 -5
  53. data/plugins/state/ui/config_widget.ui +3 -3
  54. data/plugins/syntax_checker/syntax_checker.rb +4 -0
  55. data/spec/annotation_model_spec.rb +1 -1
  56. data/spec/auto_end_spec.rb +98 -47
  57. data/spec/component_manager_spec.rb +80 -21
  58. data/spec/document_factory_spec.rb +115 -0
  59. data/spec/document_list_spec.rb +560 -450
  60. data/spec/document_spec.rb +143 -55
  61. data/spec/editor_view_spec.rb +2 -2
  62. data/spec/environment_spec.rb +1900 -0
  63. data/spec/hint_solver_spec.rb +5 -5
  64. data/spec/kde_sugar_spec.rb +16 -0
  65. data/spec/output_widget_spec.rb +177 -51
  66. data/spec/pane_spec.rb +29 -5
  67. data/spec/plugin_spec.rb +1 -1
  68. data/spec/project_factory_spec.rb +104 -0
  69. data/spec/project_list_spec.rb +352 -447
  70. data/spec/project_spec.rb +34 -33
  71. data/spec/qt_sugar_spec.rb +2 -2
  72. data/spec/state_spec.rb +508 -811
  73. data/spec/utils_spec.rb +149 -98
  74. data/spec/workspace_spec.rb +120 -9
  75. data/spec/world_spec.rb +1219 -0
  76. metadata +23 -14
  77. data/lib/ruber/documents/document_list.rb +0 -412
  78. data/lib/ruber/documents/plugin.yaml +0 -4
  79. data/lib/ruber/main_window/view_manager.rb +0 -431
  80. data/lib/ruber/projects/plugin.yaml +0 -11
  81. data/lib/ruber/projects/project_list.rb +0 -314
@@ -0,0 +1,307 @@
1
+ =begin
2
+ Copyright (C) 2011 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/plugin_like'
22
+ require 'ruber/world/document_factory'
23
+ require 'ruber/world/project_factory'
24
+ require 'ruber/world/environment'
25
+ require 'ruber/world/project_list'
26
+ require 'ruber/world/document_list'
27
+ require_relative 'ui/workspace_settings_widget'
28
+
29
+ module Ruber
30
+
31
+ module World
32
+
33
+ class World < Qt::Object
34
+
35
+ =begin rdoc
36
+ Exception raised from {Ruber::World::World#new_project} when the given file already
37
+ exists
38
+ =end
39
+ class ExistingProjectFileError < StandardError
40
+ end
41
+
42
+ include PluginLike
43
+
44
+ attr_reader :default_environment
45
+
46
+ attr_reader :active_environment
47
+
48
+ attr_reader :active_document
49
+
50
+ signals 'active_environment_changed(QObject*)'
51
+
52
+ signals 'active_environment_changed_2(QObject*, QObject*)'
53
+
54
+ signals 'active_project_changed(QObject*)'
55
+
56
+ signals 'active_project_changed_2(QObject*, QObject*)'
57
+
58
+ signals 'document_created(QObject*)'
59
+
60
+ signals 'project_created(QObject*)'
61
+
62
+ signals 'closing_project(QObject*)'
63
+
64
+ signals 'closing_document(QObject*)'
65
+
66
+ signals 'active_document_changed(QObject*)'
67
+
68
+ signals 'active_editor_changed(QWidget*)'
69
+
70
+
71
+ =begin rdoc
72
+ @param [ComponentManager] manager the component manager (unused)
73
+ @param [PluginSpecification] psf the plugin specification object associated with
74
+ the component
75
+ =end
76
+ def initialize _, psf
77
+ super Ruber[:app]
78
+ @documents = MutableDocumentList.new []
79
+ @projects = MutableProjectList.new []
80
+ @environments = {}
81
+ initialize_plugin psf
82
+ @active_environment = nil
83
+ @active_document = nil
84
+ @document_factory = DocumentFactory.new self
85
+ connect @document_factory, SIGNAL('document_created(QObject*)'), self, SLOT('slot_document_created(QObject*)')
86
+ @project_factory = ProjectFactory.new self
87
+ connect @project_factory, SIGNAL('project_created(QObject*)'), self, SLOT('slot_project_created(QObject*)')
88
+ @default_environment = Environment.new(nil, self)
89
+ add_environment @default_environment, nil
90
+ end
91
+
92
+ def environment prj
93
+ @environments[prj]
94
+ # unless env
95
+ # env = Environment.new(prj)
96
+ # connect env, SIGNAL('closing(QObject*)'), self, SLOT('environment_closing(QObject*)')
97
+ # connect env, SIGNAL('active_editor_changed(QWidget*)'), self, SLOT('slot_active_editor_changed(QWidget*)')
98
+ # @environments[prj] = env
99
+ # end
100
+ end
101
+
102
+ def active_environment= env
103
+ return if @active_environment == env
104
+ old = @active_environment
105
+ old.deactivate if old
106
+ @active_environment = env
107
+ emit active_environment_changed(env)
108
+ emit active_environment_changed_2(env, old)
109
+ @active_environment.activate if @active_environment
110
+ end
111
+
112
+ def environments
113
+ @environments.values
114
+ end
115
+
116
+ def each_environment
117
+ if block_given?
118
+ @environments.each_value{|e| yield e}
119
+ self
120
+ else to_enum(:each_environment)
121
+ end
122
+ end
123
+
124
+ def active_project= prj
125
+ old = @active_environment.project if @active_environment
126
+ return old if old == prj
127
+ old.deactivate if old
128
+ self.active_environment = @environments[prj]
129
+ emit active_project_changed prj
130
+ emit active_project_changed_2 prj, old
131
+ prj.activate if prj
132
+ end
133
+
134
+ def active_project
135
+ @active_environment.project if @active_environment
136
+ end
137
+
138
+ def projects
139
+ ProjectList.new @environments.keys.compact
140
+ end
141
+
142
+ def each_project
143
+ if block_given?
144
+ @environments.each_key{|prj| yield prj if prj}
145
+ self
146
+ else self.to_enum(:each_project)
147
+ end
148
+ end
149
+
150
+ =begin rdoc
151
+ Creates a new document
152
+ @return [Document] the new document. It will be a child of *self*
153
+ =end
154
+ def new_document
155
+ doc = @document_factory.document nil, self
156
+ doc
157
+ end
158
+
159
+ =begin rdoc
160
+ The document associated with the given file or URL
161
+
162
+ If a document for the given file or URL already exists, that document will be
163
+ returned, otherwise a new one will be created.
164
+
165
+ @param [String,KDE::Url] file the absolute name or the URL of the
166
+ file to retrieve the document for
167
+ @return [Document,nil] a document associated with _file_ and having *self* as parent.
168
+ If _file_ represents a local file and that file doesn't exist, *nil* is returned
169
+ =end
170
+ def document file
171
+ @document_factory.document file, self
172
+ end
173
+
174
+ def documents
175
+ DocumentList.new @documents
176
+ end
177
+
178
+ def each_document
179
+ if block_given?
180
+ @documents.each{|doc| yield doc}
181
+ self
182
+ else self.to_enum :each_document
183
+ end
184
+ end
185
+
186
+ =begin rdoc
187
+ Creates a new project
188
+ @param [String] file the absolute path of the project file
189
+ @param [String] name the name of the project
190
+ @return [Project] a new project having _file_ as project file and _name_ as project
191
+ name
192
+ @raise [ExistingProjectFileError] if a file called _file_ already exists (regardless
193
+ of whether it's a valid project file or not)
194
+ =end
195
+ def new_project file, name
196
+ raise ExistingProjectFileError, "#{file} already exists" if File.exist?(file)
197
+ @project_factory.project file, name
198
+ end
199
+
200
+ =begin rdoc
201
+ Retrieves the project associated with a given project file
202
+
203
+ If a project associated with the project file _file_ already exists, that project
204
+ is returned. Otherwise, a new project object is created.
205
+
206
+ @param [String] file the absolute path of the project file. Note that this file
207
+ *must* already exist and be a valid project file
208
+ @return [Project] a project associated with _file_
209
+ @raise [AbstractProject::InvalidProjectFile] if the project file is not a valid
210
+ project file
211
+ =end
212
+ def project file
213
+ @project_factory.project file
214
+ end
215
+
216
+ def close_all what, save_behaviour = :save
217
+ close_docs = (what == :all || what == :documents)
218
+ close_prjs = (what == :all || what == :projects)
219
+ save = save_behaviour == :save
220
+ @projects.dup.each{|prj| prj.close save} if close_prjs
221
+ @documents.dup.each{|doc| doc.close save} if close_docs
222
+ end
223
+
224
+ def save_settings
225
+ @documents.each{|doc| doc.save_settings}
226
+ @projects.each{|prj| prj.save}
227
+ end
228
+
229
+ def query_close
230
+ @documents.each{|doc| return false unless doc.own_project.query_close}
231
+ return false unless Ruber[:main_window].save_documents @documents.to_a
232
+ @projects.each{|prj| return false unless prj.query_close}
233
+ true
234
+ end
235
+
236
+ private
237
+
238
+ def add_environment env, prj
239
+ @environments[prj] = env
240
+ connect env, SIGNAL('closing(QObject*)'), self, SLOT('environment_closing(QObject*)')
241
+ connect env, SIGNAL('active_editor_changed(QWidget*)'), self, SLOT('slot_active_editor_changed(QWidget*)')
242
+ end
243
+
244
+ def environment_closing env
245
+ @environments.delete env.project
246
+ self.active_environment = nil if @active_environment == env
247
+ end
248
+ slots 'environment_closing(QObject*)'
249
+
250
+ def slot_document_created doc
251
+ @documents.add doc
252
+ connect doc, SIGNAL('closing(QObject*)'), self, SLOT('slot_document_closing(QObject*)')
253
+ emit document_created(doc)
254
+ end
255
+ slots 'slot_document_created(QObject*)'
256
+
257
+ def slot_project_created prj
258
+ @projects.add prj
259
+ connect prj, SIGNAL('closing(QObject*)'), self, SLOT('slot_closing_project(QObject*)')
260
+ add_environment prj.extension(:environment), prj
261
+ emit project_created(prj)
262
+ end
263
+ slots 'slot_project_created(QObject*)'
264
+
265
+ def slot_document_closing doc
266
+ emit closing_document(doc)
267
+ @documents.remove doc
268
+ end
269
+ slots 'slot_document_closing(QObject*)'
270
+
271
+ def slot_closing_project prj
272
+ emit closing_project(prj)
273
+ @projects.remove prj
274
+ end
275
+ slots 'slot_closing_project(QObject*)'
276
+
277
+ def load_settings
278
+ tabs_closable = Ruber[:config][:workspace, :close_buttons]
279
+ @environments.each_value{|e| e.tab_widget.tabs_closable = tabs_closable}
280
+ end
281
+ slots :load_settings
282
+
283
+ def slot_active_editor_changed editor
284
+ doc = editor ? editor.document : nil
285
+ if doc != @active_document
286
+ @active_document = doc
287
+ emit active_document_changed(@active_document)
288
+ end
289
+ emit active_editor_changed(editor)
290
+ end
291
+ slots 'slot_active_editor_changed(QWidget*)'
292
+
293
+ end
294
+
295
+ class WorkspaceSettingsWidget < Qt::Widget
296
+
297
+ def initialize parent = nil
298
+ super
299
+ @ui = Ui::WorkspaceSettingsWidgetBase.new
300
+ @ui.setup_ui self
301
+ end
302
+
303
+ end
304
+
305
+ end
306
+
307
+ end
@@ -20,32 +20,113 @@
20
20
 
21
21
  module Ruber
22
22
 
23
+ =begin rdoc
24
+ Plugin which automatically inserts an @end@ keyword after the user presses Enter
25
+ after a line starting a construct which requires it.
26
+
27
+ The algorithm used to find out whether an end should be inserted after the current
28
+ line is very simple: the line is checked against several possible regexps. The @end@
29
+ is inserted if any of the regexps matches.
30
+
31
+ The above algorithm has the limitation of not being able to tell whether the line
32
+ is inside a multiline string or a block comment, and can thus lead to spurious @end@s
33
+ being added.
34
+
35
+ Another problem with the way the plugin works now is that it has no way to know
36
+ whether a given keyword already has its closing @end@. To try to lessen this issue,
37
+ before inserting an @end@, this plugin checks the indentation of the following line,
38
+ comparing it to the indentation of the line where Enter has been pressed. If the
39
+ former is greater than the latter, it assumes that the user is editing an already-existing
40
+ construct and doesn't insert the @end@.
41
+
42
+ @note This plugin does nothing unless the text is inserted in the document while
43
+ one of the views associated with it has focus
44
+ =end
23
45
  module AutoEnd
24
46
 
47
+ =begin rdoc
48
+ Extension object for the Auto End plugin
49
+
50
+ The procedure of inserting an @end@ is split in two parts, performed in separate
51
+ moments:
52
+ # finding out whether the current line needs an end inserted after it. This is
53
+ done in response to the {Document#text_inserted} signal
54
+ # inserting the text. This is done in response to the {Document#text_changed} signal
55
+
56
+ The reason for this two-step behaviour is that {Document#text_inserted} is emitted
57
+ multiple times in case of a Paste operation. Thus, inserting the @end@ keywords
58
+ in it would cause them to be added in the middle of the pasted text, which is
59
+ wrong. What we do instead is to analyze each line in response to {Document#text_inserted},
60
+ storing the line position and the text to insert if appropriate, overwriting any
61
+ other information so that only the last position is recorded. When all text has
62
+ been processed, the document emits the {Document#text_changed} signal and, in response
63
+ to this we insert the end keyword (if appropriate).
64
+ =end
25
65
  class Extension < Qt::Object
26
66
 
27
67
  include Ruber::Extension
28
68
 
69
+ =begin rdoc
70
+ Contains the information about the next insertion to do
71
+
72
+ @attr [Integer] line_number the number of the line where the insertion should be done
73
+ @attr [String] lines the text to insert
74
+ @attr [Array(Integer,Integer)] final_position the position to move after the insertion
75
+ The first element is the line number, relative to the insertion line (for example,
76
+ a value of 1 means to move the cursor to the line after the insertion line, while
77
+ a value of -1 means to move it to the line before). The second element is the
78
+ column number. If negative, it's counted from the end of the line
79
+ =end
29
80
  Insertion = Struct.new :line_number, :lines, :final_position
30
81
 
82
+ =begin rdoc
83
+ The regexp fragment which matches an identifier. In theory, this should
84
+ just be @\w+@. However, from ruby 1.9.2, @\w@ only matches ASCII characters, while
85
+ identifiers can also contain unicode characters. To allow for this, the @\p{Word}@
86
+ character class is used from ruby 1.9.2 onward, while @\w@ is used for previous
87
+ versions
88
+ =end
31
89
  IDENTIFIER_PATTERN = RUBY_VERSION >= '1.9.2' ? '\p{Word}+' : '\w+'
32
90
 
91
+ =begin rdoc
92
+ The regexp fragment which matches a multiple identifier (that is, an identifier
93
+ maybe followed by several other identifiers separated by @::@)
94
+ =end
33
95
  MULTI_ID_PATTERN = "#{IDENTIFIER_PATTERN}(?:::#{IDENTIFIER_PATTERN})*"
34
96
 
97
+ =begin rdoc
98
+ The patterns used to find out whether an @end@ keyword should be inserted after
99
+ a line.
100
+
101
+ Each entry is itself an array with three elements:
102
+ * the regexp to match agains the line
103
+ * the text to insert if the regexp match
104
+ * an array with two elements, representing the position where the cursor should be
105
+ moved to after the insertion, as described in {Insertion#final_position}
106
+ =end
35
107
  PATTERNS = [
36
108
  [/^\s*if\s/, "\nend", [0, -1]],
37
109
  [/=\s*if\s/, "\nend", [0, -1]],
110
+ [/^\s*unless\s/, "\nend", [0, -1]],
111
+ [/=\s*unless\s/, "\nend", [0, -1]],
38
112
  [/\bdo\s*$/, "\nend", [0, -1]],
39
113
  [/\bdo\s+\|/, "\nend", [0, -1]],
40
114
  [/^\s*def\s/, "\nend", [0, -1]],
41
115
  [/^class\s+#{IDENTIFIER_PATTERN}\s*$/, "\nend", [0, -1]],
42
116
  [/^class\s+#{MULTI_ID_PATTERN}\s*<{1,2}\s*#{MULTI_ID_PATTERN}\s*$/, "\nend", [0, -1]],
43
117
  [/^\s*module\s+#{MULTI_ID_PATTERN}\s*$/, "\nend", [0,-1]],
44
- [/^=begin(\s|$)/, "\n=end", [0, -1]],
118
+ [/^\s*while\s/, "\nend", [0,-1]],
119
+ [/^\s*until\s/, "\nend", [0,-1]],
120
+ # [/^=begin(\s|$)/, "\n=end", [0, -1]],
45
121
  [/^\s*begin\s/, "\nend", [0, -1]],
46
- [/=\s*begin\s/, "\nend", [0, -1]],
122
+ [/(^=\s+|.=\s*)begin\s/, "\nend", [0, -1]],
123
+ [/^\s*for\s+#{IDENTIFIER_PATTERN}\s+in.+$/, "\nend", [0,-1]],
124
+ [/=\s*for\s+#{IDENTIFIER_PATTERN}\s+in.+$/, "\nend", [0,-1]]
47
125
  ]
48
126
 
127
+ =begin rdoc
128
+ @param [DocumentProject] prj the project associated with the document
129
+ =end
49
130
  def initialize prj
50
131
  super
51
132
  @doc = prj.document
@@ -53,6 +134,20 @@ module Ruber
53
134
  connect_slots
54
135
  end
55
136
 
137
+ private
138
+ =begin rdoc
139
+ Slot called when some text is inserted
140
+
141
+ If one of the recognized patterns match the current line, memorizes an {Insertion}
142
+ object pointing to the current line and using the parameters associated with the
143
+ matching pattern.
144
+
145
+ If the inserted text doesn't end in a newline, nothing is done.
146
+
147
+ If the current line doesn't match any pattern, the currently memorized insertion
148
+ position (if any) is forgotten
149
+ @param [KTextEditor::Range] the range corresponding to the inserted text
150
+ =end
56
151
  def text_inserted range
57
152
  text = @doc.text range
58
153
  return unless text.end_with? "\n"
@@ -66,9 +161,20 @@ module Ruber
66
161
  @insertion = Insertion.new range.end.line, pattern[1], pattern[2]
67
162
  end
68
163
  end
164
+ nil
69
165
  end
70
166
  slots 'text_inserted(KTextEditor::Range)'
71
167
 
168
+ =begin rdoc
169
+ Slot called in response to the {Document#text_changed} signal
170
+
171
+ If there's an insertion position memorized, inserts the corresponding text after
172
+ the current line, then moves the cursor to the position stored with the insertion
173
+ object.
174
+
175
+ The current insertion is forgotten.
176
+ @return [nil]
177
+ =end
72
178
  def text_changed
73
179
  if @insertion
74
180
  insert_text KTextEditor::Cursor.new(@insertion.line_number, 0),
@@ -78,22 +184,46 @@ module Ruber
78
184
  end
79
185
  slots :text_changed
80
186
 
187
+ =begin rdoc
188
+ Override of {Extension#remove_from_project}
189
+ @return [nil]
190
+ =end
81
191
  def remove_from_project
82
192
  disconnect_slots
83
193
  end
84
194
 
85
- private
86
-
195
+ =begin rdoc
196
+ Makes connections to the document's signals
197
+ @return [nil]
198
+ =end
87
199
  def connect_slots
88
200
  connect @doc, SIGNAL('text_inserted(KTextEditor::Range, QObject*)'), self, SLOT('text_inserted(KTextEditor::Range)')
89
201
  connect @doc, SIGNAL('text_changed(QObject*)'), self, SLOT(:text_changed)
202
+ nil
90
203
  end
91
204
 
205
+ =begin rdoc
206
+ Disconnects connections to the document's signals
207
+ @return [nil]
208
+ =end
92
209
  def disconnect_slots
93
210
  disconnect @doc, SIGNAL('text_inserted(KTextEditor::Range, QObject*)'), self, SLOT('text_inserted(KTextEditor::Range)')
94
211
  disconnect @doc, SIGNAL('text_changed(QObject*)'), self, SLOT(:text_changed)
95
212
  end
96
213
 
214
+ =begin rdoc
215
+ Inserts text at the given position and moves the cursor to the specified position
216
+
217
+ To avoid the possibility of infinite recursion, before inserting text {#disconnect_slots}
218
+ is called. After the text has been inserted {#connect_slots} is called.
219
+
220
+ @note nothing is done unless the active view (according to {Document#active_view})
221
+ is associated with the document
222
+ @param [KTextEditor::Cursor] insert_pos the position where the text should be inserted
223
+ @param [String] lines the text to insert
224
+ @param [Array(Integer,Integer)] dest the position to move the cursor to, relative
225
+ to the insertion position, as described in {Insertion#final_position}
226
+ =end
97
227
  def insert_text insert_pos, lines, dest
98
228
  view = @doc.active_view
99
229
  return unless view
@@ -103,7 +233,7 @@ module Ruber
103
233
  @doc.insert_text insert_pos, lines
104
234
  final_pos = KTextEditor::Cursor.new insert_pos.line + lines.size - 1,
105
235
  lines[-1].size
106
- do_indentation view
236
+ view.execute_action 'tools_align'
107
237
  dest_line = insert_pos.line+dest[0]
108
238
  dest_col = dest[1]
109
239
  dest_col += @doc.line_length(dest_line) + 1 if dest_col < 0
@@ -111,10 +241,6 @@ module Ruber
111
241
  connect_slots
112
242
  end
113
243
 
114
- def do_indentation view
115
- view.execute_action 'tools_align'
116
- end
117
-
118
244
  end
119
245
 
120
246
  end