visualruby 1.0.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. checksums.yaml +7 -0
  2. data/bin/editor/VR_Document.rb +219 -0
  3. data/bin/editor/VR_TabSearch.rb +50 -0
  4. data/bin/editor/VR_Tabs.rb +99 -0
  5. data/bin/editor/VR_TextShell.rb +83 -0
  6. data/bin/editor/VR_TextViewCommon.rb +65 -0
  7. data/bin/editor/glade/VR_Document.glade +160 -0
  8. data/bin/main/GemTree.rb +23 -0
  9. data/bin/main/NewProjectGUI.rb +28 -0
  10. data/bin/main/ProjectChooserGUI.rb +41 -0
  11. data/bin/main/ProjectChooserView.rb +39 -0
  12. data/bin/main/RubygemsAPI.rb +93 -0
  13. data/bin/main/Splash.rb +22 -0
  14. data/bin/main/VR_ENV.rb +61 -0
  15. data/bin/main/VR_ENV_GLOBAL.rb +64 -0
  16. data/bin/main/VR_File_Tree.rb +120 -0
  17. data/bin/main/VR_Local_Gem_Tree.rb +80 -0
  18. data/bin/main/VR_Main.rb +313 -0
  19. data/bin/main/VR_Remote_Gem_Tree.rb +70 -0
  20. data/bin/main/glade/NewProjectGUI.glade +141 -0
  21. data/bin/main/glade/ProjectChooserGUI.glade +140 -0
  22. data/bin/main/glade/RubygemsAPI.glade +130 -0
  23. data/bin/main/glade/Splash.glade +18 -0
  24. data/bin/main/glade/VR_ENV.glade +168 -0
  25. data/bin/main/glade/VR_ENV_GLOBAL.glade +268 -0
  26. data/bin/main/glade/VR_File_Tree.glade +65 -0
  27. data/bin/main/glade/VR_Local_Gem_Tree.glade +45 -0
  28. data/bin/main/glade/VR_Main.glade +707 -0
  29. data/bin/main/glade/VR_Remote_Gem_Tree.glade +76 -0
  30. data/bin/tools/VR_Tools.rb +120 -0
  31. data/img/close.png +0 -0
  32. data/img/folder.png +0 -0
  33. data/img/glade.png +0 -0
  34. data/img/gtk-edit.png +0 -0
  35. data/img/obj.png +0 -0
  36. data/img/png.png +0 -0
  37. data/img/rb.png +0 -0
  38. data/img/ruby.png +0 -0
  39. data/img/splash.png +0 -0
  40. data/img/unknown.png +0 -0
  41. data/skeleton/document/New.glade +13 -0
  42. data/skeleton/document/NewWindow.rb +15 -0
  43. data/skeleton/project/bin/MyClass.rb +15 -0
  44. data/skeleton/project/bin/glade/MyClass.glade +45 -0
  45. data/skeleton/project/main.rb +14 -0
  46. data/visualruby_examples/active_record/.vr_settings.yaml +47 -0
  47. data/visualruby_examples/active_record/active_record.rb +52 -0
  48. data/visualruby_examples/active_record/bin/ChoosePerson.rb +17 -0
  49. data/visualruby_examples/active_record/bin/Person.rb +13 -0
  50. data/visualruby_examples/active_record/bin/glade/ChoosePerson.glade +61 -0
  51. data/visualruby_examples/active_record/bin/glade/Person.glade +148 -0
  52. data/visualruby_examples/active_record/db/development.sqlite3 +0 -0
  53. data/visualruby_examples/active_record2/.vr_settings.yaml +48 -0
  54. data/visualruby_examples/active_record2/active_record2.rb +142 -0
  55. data/visualruby_examples/active_record2/bin/CompanyGUI.rb +54 -0
  56. data/visualruby_examples/active_record2/bin/Employee.rb +20 -0
  57. data/visualruby_examples/active_record2/bin/Employer.rb +11 -0
  58. data/visualruby_examples/active_record2/bin/Paycheck.rb +11 -0
  59. data/visualruby_examples/active_record2/bin/glade/CompanyGUI.glade +167 -0
  60. data/visualruby_examples/active_record2/bin/glade/Employee.glade +123 -0
  61. data/visualruby_examples/active_record2/bin/glade/Employer.glade +147 -0
  62. data/visualruby_examples/active_record2/bin/glade/Paycheck.glade +145 -0
  63. data/visualruby_examples/active_record2/db/development.sqlite3 +0 -0
  64. data/visualruby_examples/all_widgets/.vr_settings.yaml +20 -0
  65. data/visualruby_examples/all_widgets/all_widgets.rb +13 -0
  66. data/visualruby_examples/all_widgets/bin/AllWidgets.rb +43 -0
  67. data/visualruby_examples/all_widgets/bin/glade/AllWidgets.glade +166 -0
  68. data/visualruby_examples/all_widgets/bin/splash.png +0 -0
  69. data/visualruby_examples/calculator/.vr_settings.yaml +21 -0
  70. data/visualruby_examples/calculator/bin/Calculator.rb +63 -0
  71. data/visualruby_examples/calculator/bin/glade/Calculator.glade +243 -0
  72. data/visualruby_examples/calculator/main.rb +13 -0
  73. data/visualruby_examples/child_window/.vr_settings.yaml +46 -0
  74. data/visualruby_examples/child_window/bin/ChildWindowDemo.rb +41 -0
  75. data/visualruby_examples/child_window/bin/MyChildClass.rb +42 -0
  76. data/visualruby_examples/child_window/bin/glade/ChildWindowDemo.glade +101 -0
  77. data/visualruby_examples/child_window/bin/glade/MyChildClass.glade +58 -0
  78. data/visualruby_examples/child_window/main.rb +13 -0
  79. data/visualruby_examples/drag_drop/.vr_settings.yaml +19 -0
  80. data/visualruby_examples/drag_drop/bin/DragDropDemo.rb +45 -0
  81. data/visualruby_examples/drag_drop/bin/glade/DragDropDemo.glade +143 -0
  82. data/visualruby_examples/drag_drop/img/folder.png +0 -0
  83. data/visualruby_examples/drag_drop/img/glade.png +0 -0
  84. data/visualruby_examples/drag_drop/img/gtk-edit.png +0 -0
  85. data/visualruby_examples/drag_drop/img/obj.png +0 -0
  86. data/visualruby_examples/drag_drop/img/png.png +0 -0
  87. data/visualruby_examples/drag_drop/img/rb.png +0 -0
  88. data/visualruby_examples/drag_drop/img/ruby.png +0 -0
  89. data/visualruby_examples/drag_drop/img/unknown.png +0 -0
  90. data/visualruby_examples/drag_drop/main.rb +14 -0
  91. data/visualruby_examples/listview/.vr_settings.yaml +46 -0
  92. data/visualruby_examples/listview/bin/SongListView.rb +89 -0
  93. data/visualruby_examples/listview/bin/SongListViewGUI.rb +67 -0
  94. data/visualruby_examples/listview/bin/audio-x-generic.png +0 -0
  95. data/visualruby_examples/listview/bin/glade/SongListViewGUI.glade +220 -0
  96. data/visualruby_examples/listview/main.rb +19 -0
  97. data/visualruby_examples/listview_objects/.vr_settings.yaml +46 -0
  98. data/visualruby_examples/listview_objects/bin/DataObject.rb +32 -0
  99. data/visualruby_examples/listview_objects/bin/DataObjectGUI.rb +41 -0
  100. data/visualruby_examples/listview_objects/bin/ListViewObjects.rb +34 -0
  101. data/visualruby_examples/listview_objects/bin/ListViewObjectsGUI.rb +18 -0
  102. data/visualruby_examples/listview_objects/bin/glade/DataObject.glade +198 -0
  103. data/visualruby_examples/listview_objects/bin/glade/ListViewObjectsGUI.glade +102 -0
  104. data/visualruby_examples/listview_objects/main.rb +13 -0
  105. data/visualruby_examples/simple_ruby_gui/.vr_settings.yaml +45 -0
  106. data/visualruby_examples/simple_ruby_gui/bin/DataObjectGUI.rb +20 -0
  107. data/visualruby_examples/simple_ruby_gui/bin/glade/DataObjectGUI.glade +163 -0
  108. data/visualruby_examples/simple_ruby_gui/simple_ruby_gui +16 -0
  109. data/visualruby_examples/treeview/.vr_settings.yaml +18 -0
  110. data/visualruby_examples/treeview/bin/MyClass.rb +28 -0
  111. data/visualruby_examples/treeview/bin/glade/MyClass.glade +48 -0
  112. data/visualruby_examples/treeview/main.rb +14 -0
  113. data/vr +40 -0
  114. metadata +202 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e3fdd5836b0c063c6fc9bfb295b933f841130cde
4
+ data.tar.gz: 0815d5f397c03c87f9247b42a29159ec444e7bcf
5
+ SHA512:
6
+ metadata.gz: d0a1de91c075ab198f8fdfc8b76535d2be3fb42093d24c5586dcfab7d4e9612b4adc6dc56c00fbbe7d28a7eeff72d4c9481d46482a62c2865ffb487736bd7827
7
+ data.tar.gz: 92d81ed542f22aefa6e0bebe966699ff5882949610b932678c1a0f3378c46f051222241cfaee796a3488f34cd3fe2e638e81edf29542b7c5ad04b59f6b553d15
@@ -0,0 +1,219 @@
1
+
2
+ class VR_Document < Gtk::SourceView
3
+
4
+ include GladeGUI
5
+ include VR_TextViewCommon
6
+
7
+
8
+ attr_accessor :full_path_file
9
+
10
+ def initialize(full_path_file, title_label, main)
11
+ @main = main
12
+ super()
13
+ @title = title_label #reference to label on tab
14
+ reload_from_disk(full_path_file)
15
+ signal_connect("visibility_notify_event") { scroll_to_cursor() }
16
+ hilight_current_line = true
17
+ show_right_margin = true
18
+ right_margin_position = 80
19
+ auto_indent = true
20
+ lang = Gtk::SourceLanguageManager.new.get_language(get_language(full_path_file)) # 'ruby') if [".rb", "", ".gemspec"].include? File.extname(full_path_file)
21
+ buffer.language = lang
22
+ buffer.highlight_syntax = true
23
+ # buffer.highlight_matching_brackets = true
24
+ wrap_mode = Gtk::TextTag::WRAP_WORD
25
+ buffer.create_tag("hilight", { "background" => "#FFF0A0" })
26
+ buffer.create_tag("hilight_red",{ "background" => "#FFC0C0" })
27
+ buffer.signal_connect("changed") { remove_tag("hilight") }
28
+ self.show_line_numbers = true
29
+ load_glade(__FILE__) #for save dialogs
30
+ update_style()
31
+ end
32
+
33
+ def get_language(fn)
34
+ case File.extname(full_path_file)
35
+ when ".rb", "", ".gemspec" ; return "ruby"
36
+ when ".erb", ".html" ; return "html"
37
+ else ; return ""
38
+ end
39
+ end
40
+
41
+ def update_style()
42
+ modify_font(Pango::FontDescription.new($VR_ENV_GLOBAL.font_name))
43
+ tab_array = Pango::TabArray.new(1, true)
44
+ tab_array.set_tab(0, Pango::TAB_LEFT, $VR_ENV_GLOBAL.tab_spaces * 8)
45
+ set_tabs(tab_array)
46
+ end
47
+
48
+ def reload_from_disk(fn = @full_path_file)
49
+ @full_path_file = fn
50
+ @title.label = File.basename(@full_path_file)
51
+ buffer.text = File.open(@full_path_file, "r").read if File.file?(@full_path_file.to_s) #protect against nil to_s
52
+ buffer.modified = false
53
+ @modified_time = mod_time()
54
+ end
55
+
56
+ def modified_time_matches()
57
+ return true if @modified_time == mod_time()
58
+ d = @builder["dialogModifiedTime"]
59
+ @builder["labelModified"].markup = "<big><big><b>WARNING!</b></big></big>\n\nThe file: <b>#{@full_path_file}</b>\n has been modified since you loaded it:\n\nYou loaded: #{@modified_time}\nOn disk: #{mod_time().to_s}\n\nDo you wnat to keep this version?\n"
60
+ resp = d.run
61
+ d.hide
62
+ if resp == 2 # Keep Current Version
63
+ write_to_disk()
64
+ return true
65
+ elsif resp == 1 # Reload From Disk
66
+ reload_from_disk()
67
+ end
68
+ return false #abort!
69
+ end
70
+
71
+ def try_to_save(ask = true)
72
+ return false if not modified_time_matches()
73
+ return true if empty?
74
+ if (@title.label == "Untitled")
75
+ return save_changes?
76
+ elsif (buffer.modified? and ask)
77
+ return save_changes?
78
+ elsif buffer.modified?
79
+ write_to_disk()
80
+ return true
81
+ else
82
+ return true
83
+ end
84
+ end
85
+
86
+ def write_to_disk(fn = @full_path_file)
87
+ # modify_base(Gtk::STATE_NORMAL, Gdk::Color.parse("#FFFFFF"))
88
+ @full_path_file = fn
89
+ File.open(fn, "w") { |f| f.puts(buffer.text) }
90
+ buffer.modified = false
91
+ @modified_time = mod_time()
92
+ @title.label = File.basename(fn)
93
+ return true
94
+ end
95
+
96
+ def save_changes?
97
+ d = @builder["dialogSave"]
98
+ @builder["labelSave"].markup = "Save changes to: <b>#{File.basename(@full_path_file)}</b>?"
99
+ resp = d.run
100
+ d.hide
101
+ if resp == 2 # Save Changes
102
+ return @title.label == "Untitled" ? save_as() : write_to_disk()
103
+ elsif resp == 1 # Discard Changes
104
+ reload_from_disk()
105
+ return true #continue without saving
106
+ else
107
+ return false #abort!
108
+ end
109
+ end
110
+
111
+ #todo update file tree, parent window?
112
+ def save_as() # returns false or complete file name.
113
+ dialog = Gtk::FileChooserDialog.new("Save File As...",
114
+ @builder['window1'],
115
+ Gtk::FileChooser::ACTION_SAVE,
116
+ nil,
117
+ [Gtk::Stock::CANCEL, Gtk::Dialog::RESPONSE_CANCEL],
118
+ [Gtk::Stock::SAVE, Gtk::Dialog::RESPONSE_ACCEPT])
119
+ dialog.current_folder = File.dirname(@full_path_file)
120
+ dialog.current_name = VR_Document.get_class_title(buffer.text)
121
+ resp = dialog.run
122
+ dialog.hide
123
+ if resp == Gtk::Dialog::RESPONSE_ACCEPT
124
+ write_to_disk(dialog.filename)
125
+ @main.file_tree.insert(dialog.filename)
126
+ return true
127
+ end
128
+ return false
129
+ end
130
+
131
+ def jump_to_line(line_num, search_str="")
132
+ hilight_line(line_num)
133
+ iter = buffer.get_iter_at_line(line_num)
134
+ mark = buffer.create_mark("error", iter, true)
135
+ scroll_to_mark(mark, 0.0, true, 0.0, 0.5)
136
+ buffer.place_cursor(iter)
137
+ scroll_to_cursor
138
+ select_text(line_num, search_str)
139
+ end
140
+
141
+ def hilight_line(line)
142
+ remove_tag("hilight")
143
+ apply_tag_to_line(line, "hilight", nil)
144
+ end
145
+
146
+ def indent(spaces)
147
+ s,e = get_selected_lines()
148
+ (s..e).each do |i|
149
+ iter = buffer.get_iter_at_line(i)
150
+ buffer.insert(iter, " " * spaces)
151
+ end
152
+ end
153
+
154
+ def unindent(spaces)
155
+ s,e = get_selected_lines()
156
+ (s..e).each do |i|
157
+ iter, iter_end = get_line_iters(i)
158
+ if iter_end.offset >= iter.offset + 2
159
+ iter_end.offset = iter.offset + 2
160
+ t = buffer.get_text(iter, iter_end)
161
+ buffer.delete(iter, iter_end)
162
+ buffer.insert(iter,t.lstrip)
163
+ end
164
+ end
165
+ end
166
+
167
+ def comment()
168
+ s,e = get_selected_lines()
169
+ (s..e).each do |i|
170
+ iter, iter_end = get_line_iters(i)
171
+ iter_end.offset = iter.offset+1
172
+ chr = buffer.get_text(iter, iter_end)
173
+ buffer.insert(iter, "#")
174
+ end
175
+ end
176
+
177
+ def un_comment()
178
+ s,e = get_selected_lines()
179
+ (s..e).each do |i|
180
+ iter, iter_end = get_line_iters(i)
181
+ next if iter_end.offset <= iter.offset + 1
182
+ iter_end.offset = iter.offset+1
183
+ chr = buffer.get_text(iter, iter_end)
184
+ buffer.delete(iter, iter_end) if chr == "#"
185
+ end
186
+ end
187
+
188
+ def get_selected_lines()
189
+ s,e = buffer.selection_bounds
190
+ return s.line, e.line
191
+ end
192
+
193
+ def replace(str)
194
+ return unless buffer.has_selection?
195
+ s,e = buffer.selection_bounds
196
+ buffer.delete(s,e)
197
+ buffer.insert_at_cursor(str)
198
+ end
199
+
200
+ def selected_text()
201
+ s,e = buffer.selection_bounds
202
+ buffer.get_text(s, e)
203
+ end
204
+
205
+ def empty?()
206
+ return buffer.text.strip == ''
207
+ end
208
+
209
+ def self.get_class_title(source_code)
210
+ cn = /^\s*class\s+(\b\w+\b)/.match(source_code)
211
+ cn == nil ? "Untitled" : cn[1] + ".rb"
212
+ end
213
+
214
+ def mod_time()
215
+ return File.file?(@full_path_file) ? File.stat(@full_path_file).mtime : nil
216
+ end
217
+
218
+ end
219
+
@@ -0,0 +1,50 @@
1
+
2
+ module VR_TabSearch #grh
3
+
4
+ def find_in_tabs(str)
5
+ out = "Search Results for: " + str + "\n"
6
+ out += scan_for_text(str, @docs[self.page].buffer.text, @docs[self.page].full_path_file)
7
+ (0..self.n_pages-1).each do |i|
8
+ if i != self.page
9
+ out += scan_for_text(str, @docs[i].buffer.text, @docs[i].full_path_file)
10
+ end
11
+ end
12
+ return out
13
+ end
14
+
15
+ def find_in_all(str)
16
+ out = "Search Res ults for: " + str + "\n"
17
+ Find.find(Dir.pwd) do |path|
18
+ Find.prune if path =~ /\/glade$/ or path =~ /\/doc$/ #or File.directory?(path)
19
+ if (File.extname(path) == ".rb" or File.extname(path) == ".erb") and not File.directory?(path)
20
+ txt = File.open(path, "r").read
21
+ out += scan_for_text(str, txt, path)
22
+ end
23
+ end
24
+ return out
25
+ end
26
+
27
+ def replace(str_replacement)
28
+ @docs[self.page].replace(str_replacement)
29
+ end
30
+
31
+ def scan_for_text(str, txt, path)
32
+ i = 1
33
+ out = ''
34
+ txt.each_line do |line|
35
+ match = line.scan(str)
36
+ out += path + ':' + i.to_s + ": Found: "+ str + "\n" if match.size > 0
37
+ i += 1
38
+ end
39
+ return out
40
+ end
41
+
42
+ def jump_to(line)
43
+ return if line.nil?
44
+ if not switch_to(line[:path]) #full path file
45
+ load_tab(line[:path])
46
+ end
47
+ @docs[self.page].jump_to_line(line[:line] - 1, line[:search_str])
48
+ end
49
+
50
+ end
@@ -0,0 +1,99 @@
1
+
2
+ class VR_Tabs < Gtk::Notebook
3
+
4
+ attr_reader :docs
5
+
6
+ include VR_TabSearch
7
+
8
+ def initialize(main)
9
+ @docs = Array.new
10
+ @main = main
11
+ @pix_close = Gdk::Pixbuf.new(File.dirname(__FILE__) + '/../../img/close.png')
12
+ super()
13
+ end
14
+
15
+ def update_style_all()
16
+ @docs.each { |doc| doc.update_style() }
17
+ end
18
+
19
+ #todo update file_tree!
20
+ def try_to_save_all(ask = true)
21
+ @docs.each do |doc|
22
+ return false unless doc.try_to_save(ask)
23
+ end
24
+ end
25
+
26
+ #todo update file_tree!
27
+ def try_to_close_all(ask = true)
28
+ return false unless try_to_save_all(ask)
29
+ (n_pages).times { destroy_tab() }
30
+ end
31
+
32
+
33
+ def switch_to(path)
34
+ i = @docs.index{ |d| d.full_path_file == path }
35
+ return false if i.nil?
36
+ self.page = i if i != self.page
37
+ return true
38
+ end
39
+
40
+ def set_contents(text)
41
+ if @docs[self.page].buffer.text == ""
42
+ @docs[self.page].buffer.text = text
43
+ @docs[self.page].buffer.modified = false
44
+ end
45
+ end
46
+
47
+ def load_tab(full_path_file = Dir.pwd + "/Untitled")
48
+ return if switch_to(full_path_file)
49
+ tab = Gtk::HBox.new
50
+ box = Gtk::EventBox.new
51
+ img = Gtk::Image.new(@pix_close)
52
+ box.add(img)
53
+ title = Gtk::Label.new(File.basename(full_path_file))
54
+ tab.pack_start(title, true, true, 2)
55
+ tab.pack_start(box)
56
+ tab.show_all
57
+ text = VR_Document.new(full_path_file, title, @main)
58
+ child = Gtk::ScrolledWindow.new
59
+ child.add(text)
60
+ box.signal_connect("button_release_event") {remove_id(text.object_id)}
61
+ #remove blank tab
62
+ if @docs.size == 1 and @docs[0].buffer.text.strip == ""
63
+ @docs[0] = text
64
+ self.remove_page(0)
65
+ end
66
+ append_page(child, tab)
67
+ @main.builder['window1'].show_all
68
+ self.page = self.n_pages-1
69
+ @docs[self.page] = text
70
+ end
71
+
72
+ #used when little 'x' image is clicked to close.
73
+ def remove_id(object_id)
74
+ i = @docs.index { |doc| doc.object_id == object_id }
75
+ destroy_tab(i) if @docs[i].try_to_save()
76
+ # remove_tab(i) #if not i.nil?
77
+ end
78
+
79
+ #if its there, destroys it
80
+ def destroy_file_tab(file_name)
81
+ destroy_tab() if switch_to(file_name)
82
+ end
83
+
84
+ def destroy_tab(tab = self.page)
85
+ @docs.delete_at(tab)
86
+ self.remove_page(tab)
87
+ load_tab() if @docs.empty?
88
+ end
89
+
90
+ def get_open_fn()
91
+ @docs.inject([]) { |ar, doc| ar << doc.full_path_file }
92
+ end
93
+
94
+ def open_file_names(ar)
95
+ ar.each { |fn| load_tab(fn) if File.file?(fn) and fn.include? Dir.pwd}
96
+ load_tab() if @docs.empty?
97
+ end
98
+
99
+ end
@@ -0,0 +1,83 @@
1
+
2
+ class VR_TextShell < Gtk::TextView
3
+
4
+ include VR_TextViewCommon
5
+
6
+ def initialize(tabs)
7
+ super()
8
+ @tabs = tabs
9
+ @current_line = 0
10
+ @lines = [] #needed
11
+ self.editable = false
12
+ buffer.create_tag("blue", { "foreground" => "#0000A0", "underline" => Pango::UNDERLINE_SINGLE })
13
+ buffer.create_tag("hilight", { "background" => "#FFF0A0" } )
14
+ signal_connect("button_release_event") { jump_to(line_at_cursor() +1) } #buffer's lines start at 1
15
+ signal_connect("key_release_event") { jump_to(line_at_cursor() +1) } #buffer's lines start at 1
16
+ # self.buffer.signal_connect("changed") { buffer__changed() }
17
+ end
18
+
19
+ # @buffer.signal_connect("changed") {
20
+ # eob_mark =
21
+ #@output.buffer.create_mark(nil,@output.buffer.start_iter.forward_to_end,false)
22
+ # @output.scroll_mark_onscreen(eob_mark)
23
+ # }
24
+
25
+ def buffer__move_cursor
26
+ remove_tag("hilight")
27
+ # place_cursor_onscreen
28
+ line = line_at_cursor()
29
+ apply_tag_to_line(line, "hilight")
30
+ end
31
+
32
+ # def buffer__changed
33
+ # iter = buffer.end_iter
34
+ # scroll_to_iter(iter, 0.0, false, 0, 0)
35
+ # self.queue_draw
36
+ ## self.hide
37
+ #
38
+ ## self.show
39
+ #
40
+ # end
41
+
42
+ def hilight_links(text, jump_to_first)
43
+ self.buffer.text = text
44
+ first_valid_line = load_lines()
45
+ (0..@lines.size - 1).each do |i|
46
+ next if @lines[i].nil?
47
+ apply_tag_to_line(i, "blue", @lines[i][:file_name] + ":" + @lines[i][:line].to_s)
48
+ end
49
+ @current_line = 0
50
+ @tabs.jump_to(first_valid_line) if jump_to_first and first_valid_line
51
+ end
52
+
53
+
54
+
55
+ def load_lines()
56
+ @lines = []
57
+ first = nil
58
+ reg = /^.*(#{Dir.pwd}[\w+|\/]*)\/([\w|\.]+):(\d+):/
59
+ reg_str = /Found:\s(.+)$/
60
+ self.buffer.text. each_line do |l|
61
+ m = reg.match(l)
62
+ if m.nil?
63
+ @lines << nil
64
+ else
65
+ m2 = reg_str.match(l)
66
+ search_str = (m2.nil?) ? "" : m2[1]
67
+ @lines << { :path => m[1] + "/" + m[2], :file_name => m[2], :line => m[3].to_i, :search_str => search_str }
68
+ first ||= @lines.last
69
+ end
70
+ end
71
+ return first
72
+ end
73
+
74
+ def jump_to(line_no = @current_line+1)
75
+ return false if line_no > @lines.size - 1
76
+ @current_line = line_no
77
+ remove_tag("hilight")
78
+ apply_tag_to_line(@current_line, "hilight", nil)
79
+ @tabs.jump_to(@lines[@current_line])
80
+ return false #must return false for button_up event
81
+ end
82
+
83
+ end
@@ -0,0 +1,65 @@
1
+
2
+
3
+ module VR_TextViewCommon
4
+
5
+ def get_line_text(line)
6
+ return nil if line > buffer.line_count - 1
7
+ iter, iter_end = get_line_iters(line)
8
+ return buffer.get_text(iter, iter_end)
9
+ end
10
+
11
+ def get_line_iters(line, search_str = nil)
12
+ s = buffer.get_iter_at_line(line)
13
+ e = get_end_iter(s)
14
+ if !search_str.nil?
15
+ s, e = s.forward_search(search_str, Gtk::TextIter::SEARCH_TEXT_ONLY, e)
16
+ end
17
+ return s, e
18
+ end
19
+
20
+ def select_text(line, search_str = nil)
21
+ s, e = get_line_iters(line, search_str)
22
+ buffer.move_mark("insert",s)
23
+ buffer.move_mark("selection_bound", e)
24
+ end
25
+
26
+
27
+ # def get_text_scan_iters(line_num, search_str)
28
+ # st, en = get_line_iters(line_num)
29
+ # s, e = st.forward_search(search_str, Gtk::TextIter::SEARCH_TEXT_ONLY, en)
30
+ # end
31
+
32
+ def apply_tag_to_line(line, tag, search_str = nil)
33
+ s, e = get_line_iters(line, search_str)
34
+ buffer.apply_tag(tag, s, e)
35
+ end
36
+
37
+
38
+
39
+ def get_end_iter(iter)
40
+ if iter.line == buffer.line_count - 1 # last line
41
+ return buffer.end_iter
42
+ end
43
+ return buffer.get_iter_at_line(iter.line+1)
44
+ end
45
+
46
+ def remove_tag(tag)
47
+ s, e = buffer.bounds
48
+ buffer.remove_tag(tag, s, e)
49
+ end
50
+
51
+
52
+ def line_at_cursor()
53
+ cursor_pos = buffer.cursor_position
54
+ iter = buffer.get_iter_at_offset(cursor_pos)
55
+ return iter.line-1
56
+ end
57
+
58
+ def scroll_to_cursor()
59
+ os = buffer.cursor_position
60
+ return if os > buffer.char_count - 1 or os == 0
61
+ iter = buffer.get_iter_at_offset(os)
62
+ scroll_to_iter(iter, 0.0, true, 1.0, 0.5)
63
+ end
64
+
65
+ end
@@ -0,0 +1,160 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <interface>
3
+ <requires lib="gtk+" version="2.16"/>
4
+ <!-- interface-naming-policy project-wide -->
5
+ <object class="GtkDialog" id="dialogSave">
6
+ <property name="border_width">5</property>
7
+ <property name="title" translatable="yes">Save Changes?</property>
8
+ <property name="modal">True</property>
9
+ <property name="type_hint">normal</property>
10
+ <child internal-child="vbox">
11
+ <object class="GtkVBox" id="dialog-vbox1">
12
+ <property name="visible">True</property>
13
+ <property name="spacing">2</property>
14
+ <child>
15
+ <object class="GtkLabel" id="labelSave">
16
+ <property name="visible">True</property>
17
+ <property name="label" translatable="yes">label</property>
18
+ </object>
19
+ <packing>
20
+ <property name="padding">20</property>
21
+ <property name="position">1</property>
22
+ </packing>
23
+ </child>
24
+ <child internal-child="action_area">
25
+ <object class="GtkHButtonBox" id="dialog-action_area1">
26
+ <property name="visible">True</property>
27
+ <property name="layout_style">end</property>
28
+ <child>
29
+ <object class="GtkButton" id="button1">
30
+ <property name="label" translatable="yes">Save Changes</property>
31
+ <property name="visible">True</property>
32
+ <property name="can_focus">True</property>
33
+ <property name="receives_default">True</property>
34
+ </object>
35
+ <packing>
36
+ <property name="expand">False</property>
37
+ <property name="fill">False</property>
38
+ <property name="position">0</property>
39
+ </packing>
40
+ </child>
41
+ <child>
42
+ <object class="GtkButton" id="button2">
43
+ <property name="label" translatable="yes">Discard Changes</property>
44
+ <property name="visible">True</property>
45
+ <property name="can_focus">True</property>
46
+ <property name="receives_default">True</property>
47
+ <property name="xalign">0.52999997138977051</property>
48
+ </object>
49
+ <packing>
50
+ <property name="expand">False</property>
51
+ <property name="fill">False</property>
52
+ <property name="position">1</property>
53
+ </packing>
54
+ </child>
55
+ <child>
56
+ <object class="GtkButton" id="button3">
57
+ <property name="label" translatable="yes">Cancel</property>
58
+ <property name="visible">True</property>
59
+ <property name="can_focus">True</property>
60
+ <property name="receives_default">True</property>
61
+ </object>
62
+ <packing>
63
+ <property name="expand">False</property>
64
+ <property name="fill">False</property>
65
+ <property name="position">2</property>
66
+ </packing>
67
+ </child>
68
+ </object>
69
+ <packing>
70
+ <property name="expand">False</property>
71
+ <property name="pack_type">end</property>
72
+ <property name="position">0</property>
73
+ </packing>
74
+ </child>
75
+ </object>
76
+ </child>
77
+ <action-widgets>
78
+ <action-widget response="2">button1</action-widget>
79
+ <action-widget response="1">button2</action-widget>
80
+ <action-widget response="0">button3</action-widget>
81
+ </action-widgets>
82
+ </object>
83
+ <object class="GtkDialog" id="dialogModifiedTime">
84
+ <property name="border_width">5</property>
85
+ <property name="title" translatable="yes">WARNING! File Altered!</property>
86
+ <property name="type_hint">normal</property>
87
+ <child internal-child="vbox">
88
+ <object class="GtkVBox" id="dialog-vbox2">
89
+ <property name="visible">True</property>
90
+ <property name="spacing">2</property>
91
+ <child>
92
+ <object class="GtkLabel" id="labelModified">
93
+ <property name="visible">True</property>
94
+ <property name="label" translatable="yes">label</property>
95
+ <property name="use_markup">True</property>
96
+ </object>
97
+ <packing>
98
+ <property name="padding">10</property>
99
+ <property name="position">1</property>
100
+ </packing>
101
+ </child>
102
+ <child internal-child="action_area">
103
+ <object class="GtkHButtonBox" id="dialog-action_area2">
104
+ <property name="visible">True</property>
105
+ <property name="layout_style">end</property>
106
+ <child>
107
+ <object class="GtkButton" id="button4">
108
+ <property name="label" translatable="yes">Keep Current Version</property>
109
+ <property name="visible">True</property>
110
+ <property name="can_focus">True</property>
111
+ <property name="receives_default">True</property>
112
+ </object>
113
+ <packing>
114
+ <property name="expand">False</property>
115
+ <property name="fill">False</property>
116
+ <property name="position">0</property>
117
+ </packing>
118
+ </child>
119
+ <child>
120
+ <object class="GtkButton" id="button5">
121
+ <property name="label" translatable="yes">Reload From Disk</property>
122
+ <property name="visible">True</property>
123
+ <property name="can_focus">True</property>
124
+ <property name="receives_default">True</property>
125
+ </object>
126
+ <packing>
127
+ <property name="expand">False</property>
128
+ <property name="fill">False</property>
129
+ <property name="position">1</property>
130
+ </packing>
131
+ </child>
132
+ <child>
133
+ <object class="GtkButton" id="button6">
134
+ <property name="label" translatable="yes">Cancel</property>
135
+ <property name="visible">True</property>
136
+ <property name="can_focus">True</property>
137
+ <property name="receives_default">True</property>
138
+ </object>
139
+ <packing>
140
+ <property name="expand">False</property>
141
+ <property name="fill">False</property>
142
+ <property name="position">2</property>
143
+ </packing>
144
+ </child>
145
+ </object>
146
+ <packing>
147
+ <property name="expand">False</property>
148
+ <property name="pack_type">end</property>
149
+ <property name="position">0</property>
150
+ </packing>
151
+ </child>
152
+ </object>
153
+ </child>
154
+ <action-widgets>
155
+ <action-widget response="2">button4</action-widget>
156
+ <action-widget response="1">button5</action-widget>
157
+ <action-widget response="0">button6</action-widget>
158
+ </action-widgets>
159
+ </object>
160
+ </interface>