redcar 0.5.5dev → 0.5.6dev

Sign up to get free protection for your applications and to get access to all the features.
@@ -11,14 +11,14 @@ require File.dirname(__FILE__) + '/../vendor/java-mateview'
11
11
  module Redcar
12
12
  class EditViewSWT
13
13
  include Redcar::Observable
14
-
14
+
15
15
  def self.start
16
16
  if gui = Redcar.gui
17
17
  gui.register_controllers(Redcar::EditTab => EditViewSWT::Tab)
18
18
  end
19
19
  load_textmate_assets
20
20
  end
21
-
21
+
22
22
  def self.load_textmate_assets
23
23
  s = Time.now
24
24
  load_textmate_assets_from_dir(Redcar.root + "/plugins/textmate/vendor/redcar-bundles")
@@ -29,12 +29,12 @@ module Redcar
29
29
  puts "took #{Time.now - s}s to load textmate assets"
30
30
  EditView.themes.unshift(*JavaMateView::ThemeManager.themes.to_a.map {|th| th.name })
31
31
  end
32
-
32
+
33
33
  def self.load_textmate_assets_from_dir(dir)
34
34
  JavaMateView::Bundle.load_bundles(dir)
35
35
  JavaMateView::ThemeManager.load_themes(dir)
36
36
  end
37
-
37
+
38
38
  attr_reader :mate_text, :widget, :model
39
39
 
40
40
  def initialize(model, parent, options={})
@@ -58,61 +58,61 @@ module Redcar
58
58
  @model.set_grammar(new_grammar)
59
59
  end
60
60
  end
61
-
61
+
62
62
  def create_mate_text
63
63
  @mate_text = JavaMateView::MateText.new(@parent, !!@options[:single_line])
64
64
  @mate_text.set_font(EditView.font, EditView.font_size)
65
-
65
+
66
66
  @model.controller = self
67
67
  end
68
-
68
+
69
69
  def create_undo_manager
70
70
  @undo_manager = JFace::Text::TextViewerUndoManager.new(100)
71
71
  @undo_manager.connect(@mate_text.viewer)
72
72
  end
73
-
73
+
74
74
  def undo
75
75
  @undo_manager.undo
76
76
  EditView.undo_sensitivity.recompute
77
77
  EditView.redo_sensitivity.recompute
78
78
  end
79
-
79
+
80
80
  def undoable?
81
81
  @undo_manager.undoable
82
82
  end
83
-
83
+
84
84
  def redo
85
85
  @undo_manager.redo
86
86
  EditView.undo_sensitivity.recompute
87
87
  EditView.redo_sensitivity.recompute
88
88
  end
89
-
89
+
90
90
  def redoable?
91
91
  @undo_manager.redoable
92
92
  end
93
-
93
+
94
94
  def reset_undo
95
95
  @undo_manager.reset
96
96
  end
97
-
97
+
98
98
  def compound
99
99
  begin_compound
100
100
  yield
101
101
  end_compound
102
102
  end
103
-
103
+
104
104
  def begin_compound
105
105
  @undo_manager.begin_compound_change
106
106
  end
107
-
107
+
108
108
  def end_compound
109
109
  @undo_manager.end_compound_change
110
110
  end
111
-
111
+
112
112
  def create_document
113
113
  @document = EditViewSWT::Document.new(@model.document, @mate_text.mate_document)
114
114
  @model.document.controller = @document
115
- h1 = @model.document.add_listener(:before => :new_mirror,
115
+ h1 = @model.document.add_listener(:before => :new_mirror,
116
116
  &method(:update_grammar))
117
117
  h2 = @model.add_listener(:grammar_changed, &method(:model_grammar_changed))
118
118
  h3 = @model.add_listener(:focussed, &method(:focus))
@@ -147,21 +147,32 @@ module Redcar
147
147
  @mate_text.set_margin_column(-1)
148
148
  end
149
149
  end
150
+ @mate_text.getTextWidget.addMouseListener(MouseListener.new(self))
150
151
  @mate_text.getTextWidget.addFocusListener(FocusListener.new(self))
151
152
  @mate_text.getTextWidget.addVerifyListener(VerifyListener.new(@model.document, self))
152
153
  @mate_text.getTextWidget.addModifyListener(ModifyListener.new(@model.document, self))
153
154
  @mate_text.get_control.add_verify_key_listener(VerifyKeyListener.new(self))
154
155
  @mate_text.get_control.add_key_listener(KeyListener.new(self))
155
- @handlers << [@model.document, h1] << [@model, h2] << [@model, h3] << [@model, h4] <<
156
+ @handlers << [@model.document, h1] << [@model, h2] << [@model, h3] << [@model, h4] <<
156
157
  [@model, h5] << [@model, h6] << [@model, h7] << [@model, h8] <<
157
158
  [@model, h9] << [@model, h10] << [@model, h11]
158
159
  end
159
-
160
+
161
+ def right_click(mouse_event)
162
+ if @model.document.controller and @model.document.controller.respond_to?(:right_click)
163
+ location = ApplicationSWT.display.get_cursor_location
164
+ #offset = @mate_text.parser.styledText.get_offset_at_location(location)
165
+ Redcar.safely("right click on edit view") do
166
+ @model.document.controller.right_click(@model)
167
+ end
168
+ end
169
+ end
170
+
160
171
  class VerifyKeyListener
161
172
  def initialize(edit_view_swt)
162
173
  @edit_view_swt = edit_view_swt
163
174
  end
164
-
175
+
165
176
  def verify_key(key_event)
166
177
  if @edit_view_swt.model.document.block_selection_mode?
167
178
  @edit_view_swt.begin_compound
@@ -181,88 +192,88 @@ module Redcar
181
192
  end
182
193
  end
183
194
  end
184
-
195
+
185
196
  class KeyListener
186
197
  def initialize(edit_view_swt)
187
198
  @edit_view_swt = edit_view_swt
188
199
  end
189
-
200
+
190
201
  def key_pressed(_)
191
202
  @was_in_block_selection = @edit_view_swt.model.document.block_selection_mode?
192
203
  end
193
-
204
+
194
205
  def key_released(_)
195
206
  if @was_in_block_selection
196
207
  @edit_view_swt.end_compound
197
208
  end
198
209
  end
199
210
  end
200
-
211
+
201
212
  def delay_parsing
202
213
  mate_text.delay_parsing { yield }
203
214
  end
204
-
215
+
205
216
  def swt_focus_gained
206
217
  EditView.focussed_edit_view = @model
207
218
  @model.focus
208
219
  end
209
-
220
+
210
221
  def swt_focus_lost
211
222
  EditView.focussed_edit_view = nil
212
223
  end
213
-
224
+
214
225
  def focus
215
226
  @mate_text.get_control.set_focus
216
227
  end
217
-
228
+
218
229
  def is_current?
219
230
  EditView.current == @mate_text.get_control
220
231
  end
221
-
232
+
222
233
  def has_focus?
223
234
  focus_control = ApplicationSWT.display.get_focus_control
224
235
  focus_control == @mate_text.get_control
225
236
  end
226
-
237
+
227
238
  def exists?
228
239
  @mate_text.get_control and !@mate_text.get_control.disposed
229
240
  end
230
-
241
+
231
242
  def attach_listeners
232
243
  # h = @document.add_listener(:set_text, &method(:reparse))
233
244
  # @handlers << [@document, h]
234
245
  @mate_text.get_text_widget.add_word_movement_listener(WordMoveListener.new(self))
235
246
  end
236
-
247
+
237
248
  def reparse
238
249
  @mate_text.parser.parse_range(0, @mate_text.parser.styledText.get_line_count-1)
239
250
  end
240
-
251
+
241
252
  def cursor_offset=(offset)
242
253
  @mate_text.get_text_widget.set_caret_offset(offset)
243
254
  end
244
-
255
+
245
256
  def cursor_offset
246
257
  @mate_text.get_text_widget.get_caret_offset
247
258
  end
248
-
259
+
249
260
  def scroll_to_line(line_index)
250
261
  @mate_text.parser.parserScheduler.last_visible_line_changed(line_index + 100)
251
262
  @mate_text.viewer.set_top_index(line_index)
252
263
  end
253
-
264
+
254
265
  def model_grammar_changed(name)
255
266
  @mate_text.set_grammar_by_name(name)
256
267
  end
257
-
268
+
258
269
  def smallest_visible_line
259
270
  @mate_text.viewer.get_top_index
260
271
  end
261
-
272
+
262
273
  def biggest_visible_line
263
274
  @mate_text.viewer.get_bottom_index
264
275
  end
265
-
276
+
266
277
  def ensure_visible(offset)
267
278
  line = @document.line_at_offset(offset)
268
279
  line_start_offset = @document.offset_at_line(line)
@@ -275,7 +286,7 @@ module Redcar
275
286
  @mate_text.viewer.reveal_range(offset, 1)
276
287
  end
277
288
  end
278
-
289
+
279
290
  def update_grammar(new_mirror)
280
291
  title = new_mirror.title
281
292
  contents = new_mirror.read
@@ -287,25 +298,41 @@ module Redcar
287
298
  grammar_name ||= "Plain Text"
288
299
  @model.set_grammar(grammar_name)
289
300
  end
290
-
301
+
291
302
  STRIP_KEYS = {
292
303
  :cut => 120|Swt::SWT::MOD1,
293
304
  :copy => 99|Swt::SWT::MOD1,
294
305
  :paste => 118|Swt::SWT::MOD1
295
306
  }
296
-
307
+
297
308
  def remove_control_keybindings
298
309
  styled_text = @mate_text.get_text_widget
299
310
  STRIP_KEYS.each do |_, key|
300
311
  styled_text.set_key_binding(key, Swt::SWT::NULL)
301
312
  end
302
313
  end
303
-
314
+
304
315
  def dispose
305
316
  @handlers.each {|obj, h| obj.remove_listener(h) }
306
317
  @handlers.clear
307
318
  end
308
-
319
+
320
+ class MouseListener
321
+ def initialize(obj)
322
+ @obj = obj
323
+ end
324
+
325
+ def mouse_double_click(_); end
326
+ def mouse_up(_)
327
+ end
328
+
329
+ def mouse_down(e)
330
+ if e.button == 3
331
+ @obj.right_click(e)
332
+ end
333
+ end
334
+ end
335
+
309
336
  class FocusListener
310
337
  def initialize(obj)
311
338
  @obj = obj
@@ -319,22 +346,22 @@ module Redcar
319
346
  @obj.swt_focus_lost
320
347
  end
321
348
  end
322
-
349
+
323
350
  class VerifyListener
324
351
  def initialize(document, obj)
325
352
  @document, @obj = document, obj
326
353
  end
327
-
354
+
328
355
  def verify_text(e)
329
356
  @document.verify_text(e.start, e.end, e.text)
330
357
  end
331
358
  end
332
-
359
+
333
360
  class ModifyListener
334
361
  def initialize(document, obj)
335
362
  @document, @obj = document, obj
336
363
  end
337
-
364
+
338
365
  def modify_text(e)
339
366
  @document.modify_text
340
367
  end
@@ -4,56 +4,71 @@ module Redcar
4
4
  class Document
5
5
  include Redcar::Observable
6
6
  attr_reader :jface_document
7
-
7
+
8
8
  def initialize(model, swt_mate_document)
9
9
  @model = model
10
10
  @swt_mate_document = swt_mate_document
11
11
  @jface_document = swt_mate_document.mateText.get_document
12
12
  end
13
-
13
+
14
+ def right_click(edit_view)
15
+ menu = Menu.new
16
+ Redcar.plugin_manager.objects_implementing(:edit_view_context_menus).each do |object|
17
+ case object.method(:edit_view_context_menus).arity
18
+ when 0
19
+ menu.merge(object.edit_view_context_menus)
20
+ when 1
21
+ menu.merge(object.edit_view_context_menus(edit_view))
22
+ else
23
+ puts("Invalid edit_view_context_menus hook detected in "+object.class.name)
24
+ end
25
+ end
26
+ Application::Dialog.popup_menu(menu, :pointer)
27
+ end
28
+
14
29
  def attach_modification_listeners
15
30
  jface_document.add_document_listener(DocumentListener.new(@model))
16
31
  styledText.add_selection_listener(SelectionListener.new(@model))
17
32
  styledText.add_caret_listener(CaretListener.new(@model))
18
33
  end
19
-
34
+
20
35
  def single_line?
21
36
  @swt_mate_document.mateText.isSingleLine
22
37
  end
23
-
38
+
24
39
  def to_s
25
40
  jface_document.get
26
41
  end
27
-
42
+
28
43
  def length
29
44
  jface_document.length
30
45
  end
31
-
46
+
32
47
  def line_count
33
48
  jface_document.get_number_of_lines
34
49
  end
35
-
50
+
36
51
  def get_line_delimiter
37
52
  styledText.get_line_delimiter
38
53
  end
39
-
54
+
40
55
  def line_at_offset(offset)
41
56
  jface_document.get_line_of_offset(offset)
42
57
  end
43
-
58
+
44
59
  def offset_at_line(line_ix)
45
60
  jface_document.get_line_offset(line_ix)
46
61
  end
47
-
62
+
48
63
  def get_line(line_ix)
49
64
  line_info = jface_document.get_line_information(line_ix)
50
65
  jface_document.get(line_info.offset, line_info.length)
51
66
  end
52
-
67
+
53
68
  def get_range(start, length)
54
69
  jface_document.get(start, length)
55
70
  end
56
-
71
+
57
72
  def replace(offset, length, text)
58
73
  @model.verify_text(offset, offset+length, text)
59
74
  jface_document.replace(offset, length, text)
@@ -62,46 +77,46 @@ module Redcar
62
77
  #end
63
78
  @model.modify_text
64
79
  end
65
-
80
+
66
81
  def text=(text)
67
82
  @model.verify_text(0, length, text)
68
83
  jface_document.set(text)
69
84
  @model.modify_text
70
85
  notify_listeners(:set_text)
71
86
  end
72
-
87
+
73
88
  def cursor_offset
74
89
  styledText.get_caret_offset
75
90
  end
76
-
91
+
77
92
  def selection_offset
78
93
  range = styledText.get_selection_range
79
94
  range.x == cursor_offset ? range.x + range.y : range.x
80
95
  end
81
-
96
+
82
97
  def cursor_offset=(offset)
83
98
  styledText.set_caret_offset(offset)
84
99
  end
85
-
100
+
86
101
  def selection_range
87
102
  range = styledText.get_selection_range
88
103
  range.x...(range.x + range.y)
89
104
  end
90
-
105
+
91
106
  def selection_ranges
92
107
  ranges = styledText.get_selection_ranges
93
108
  ranges.to_a.each_slice(2).map do |from, length|
94
109
  from...(from + length)
95
110
  end
96
111
  end
97
-
112
+
98
113
  def set_selection_range(cursor_offset, selection_offset)
99
114
  if block_selection_mode?
100
115
  start_offset, end_offset = *[cursor_offset, selection_offset].sort
101
116
  start_location = styledText.getLocationAtOffset(start_offset)
102
117
  end_location = styledText.getLocationAtOffset(end_offset)
103
118
  styledText.set_block_selection_bounds(
104
- start_location.x,
119
+ start_location.x,
105
120
  start_location.y,
106
121
  end_location.x - start_location.x,
107
122
  end_location.y - start_location.y + styledText.get_line_height
@@ -111,7 +126,7 @@ module Redcar
111
126
  end
112
127
  @model.selection_range_changed(cursor_offset, selection_offset)
113
128
  end
114
-
129
+
115
130
  @markStruct ||= Struct.new(:location, :category) # save away the parent class
116
131
  class Mark < @markStruct
117
132
  def get_offset; location.get_offset; end
@@ -119,7 +134,7 @@ module Redcar
119
134
  def get_line_offset; location.get_line_offset; end
120
135
  def inspect; "<Mark #{get_line}:#{get_line_offset} (#{get_offset})>"; end
121
136
  end
122
-
137
+
123
138
  def create_mark(offset, gravity)
124
139
  line = line_at_offset(offset)
125
140
  line_offset = offset - offset_at_line(line)
@@ -133,37 +148,37 @@ module Redcar
133
148
  @swt_mate_document.add_text_location(category, location)
134
149
  Mark.new(location, category)
135
150
  end
136
-
151
+
137
152
  def delete_mark(mark)
138
153
  @swt_mate_document.remove_text_location(mark.category, mark.location)
139
154
  end
140
-
155
+
141
156
  def block_selection_mode?
142
157
  styledText.get_block_selection
143
158
  end
144
-
159
+
145
160
  def block_selection_mode=(bool)
146
161
  styledText.set_block_selection(bool)
147
162
  end
148
-
163
+
149
164
  def styledText
150
165
  @swt_mate_document.mateText.getControl
151
166
  end
152
-
167
+
153
168
  def scope_at(line, line_offset)
154
169
  @swt_mate_document.mateText.scope_at(line, line_offset)
155
170
  end
156
-
171
+
157
172
  class CaretListener
158
173
  def initialize(model)
159
174
  @model = model
160
175
  end
161
-
176
+
162
177
  def caret_moved(event)
163
178
  @model.cursor_moved(event.caretOffset)
164
179
  end
165
180
  end
166
-
181
+
167
182
  class SelectionListener
168
183
  def initialize(model)
169
184
  @model = model
@@ -172,21 +187,21 @@ module Redcar
172
187
  def widget_default_selected(e)
173
188
  @model.selection_range_changed(e.x, e.y)
174
189
  end
175
-
190
+
176
191
  def widget_selected(e)
177
192
  @model.selection_range_changed(e.x, e.y)
178
- end
193
+ end
179
194
  end
180
-
195
+
181
196
  class DocumentListener
182
197
  def initialize(model)
183
198
  @model = model
184
199
  end
185
-
200
+
186
201
  def document_about_to_be_changed(e)
187
202
  @model.about_to_be_changed(e.offset, e.length, e.text)
188
203
  end
189
-
204
+
190
205
  def document_changed(e)
191
206
  @model.changed(e.offset, e.length, e.text)
192
207
  end