cheri 0.0.9 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  #--
2
- # Copyright (C) 2007,2008 William N Dortch <bill.dortch@gmail.com>
2
+ # Copyright (C) 2007,2008,2009 William N Dortch <bill.dortch@gmail.com>
3
3
  #
4
4
  # Permission is hereby granted, free of charge, to any person obtaining
5
5
  # a copy of this software and associated documentation files (the
@@ -33,77 +33,28 @@ class ConnectionDialog
33
33
  swing[:auto=>true]
34
34
  @main = main
35
35
  @main_frame = main.main_frame
36
- @dialog = dialog @main_frame, 'New Connection', true do |d|
37
- box_layout(d, :Y_AXIS)
36
+ @dialog = dialog @main_frame, 'New Connection', true do |dlg|
37
+ grid_table_layout dlg
38
+ empty_border 4,4,4,4
38
39
  size 240,180
39
40
  default_close_operation :HIDE_ON_CLOSE
40
- y_glue
41
-
42
- x_box do
43
- y_box do
44
- label 'Host:'
45
- y_spacer 4
46
- label 'Port:'
47
- y_spacer 4
48
- label 'Display name:'
41
+ grid_row do
42
+ grid_table :i=>[0,8] do
43
+ compound_border etched_border(:LOWERED), empty_border(7,7,7,7)
44
+ defaults :i=>[4,1], :a=>:w
45
+ grid_row {label 'Host:'; @con_host = text_field('localhost') {columns 10}}
46
+ grid_row {label 'Port:'; @con_port = text_field {columns 10}}
47
+ grid_row {label 'Display name:'; @con_name = text_field {columns 10}}
49
48
  end
50
- x_spacer 10
51
- y_box do
52
- @con_host = text_field do
53
- columns 10
54
- maximum_size dimension(100,24)
55
- text 'localhost'
56
- end
57
- y_spacer 4
58
- @con_port = text_field do
59
- columns 10
60
- maximum_size dimension(100,24)
61
- end
62
- y_spacer 4
63
- @con_name = text_field do
64
- #align :RIGHT
65
- columns 10
66
- maximum_size dimension(100,24)
67
- end
68
- end
69
49
  end
70
- y_spacer 16
71
- x_box do
72
- x_glue
73
- button 'Connect' do
74
- on_click do
75
- host = @con_host.text
76
- host.strip! if host
77
- port = @con_port.text
78
- port.strip! if port
79
- name = @con_name.text
80
- if name
81
- name.strip!
82
- name = nil if name.empty?
83
- end
84
- if !port || port.empty?
85
- JOptionPane.show_message_dialog(@main_frame,"Please enter a port number",
86
- 'Connection Error', JOptionPane::ERROR_MESSAGE)
87
- elsif !(port = Integer(port) rescue nil)
88
- JOptionPane.show_message_dialog(@main_frame,"Invalid port: #{@con_port.text}",
89
- 'Connection Error', JOptionPane::ERROR_MESSAGE)
90
- else
91
- @dialog.visible = false
92
- reset_fields
93
- @main.new_connection(port,name,host)
94
- end
95
- end
96
- end
97
- x_spacer 10
98
- button 'Cancel' do
99
- on_click do
100
- @dialog.visible = false
101
- reset_fields
50
+ grid_row do
51
+ grid_table :wy=>0.1, :a=>:s do
52
+ grid_row :i=>4 do
53
+ button('Connect') {on_click{do_connect}}
54
+ button('Cancel') {on_click{@dialog.visible = false; reset_fields}}
102
55
  end
103
56
  end
104
- x_glue
105
57
  end
106
- y_glue
107
58
  end
108
59
  reset_fields
109
60
  @main.center(@main_frame,@dialog)
@@ -116,6 +67,25 @@ class ConnectionDialog
116
67
  end
117
68
  private :reset_fields
118
69
 
70
+ def do_connect
71
+ host = @con_host.text.strip
72
+ port = @con_port.text.strip
73
+ name = @con_name.text.strip
74
+ name = nil if name.empty?
75
+ if port.empty?
76
+ JOptionPane.show_message_dialog(@main_frame,"Please enter a port number",
77
+ 'Connection Error', JOptionPane::ERROR_MESSAGE)
78
+ elsif !(port = Integer(port) rescue nil)
79
+ JOptionPane.show_message_dialog(@main_frame,"Invalid port: #{@con_port.text}",
80
+ 'Connection Error', JOptionPane::ERROR_MESSAGE)
81
+ else
82
+ @dialog.visible = false
83
+ reset_fields
84
+ @main.new_connection(port,name,host)
85
+ end
86
+ end
87
+ private :do_connect
88
+
119
89
  def value
120
90
  @dialog
121
91
  end
@@ -136,153 +106,88 @@ class SearchDialog
136
106
  swing[:auto=>true]
137
107
  @main = main
138
108
  @main_frame = main.main_frame
139
- @dialog = dialog @main_frame, 'Search ObjectSpace', true do |d|
140
- box_layout d, :Y_AXIS
141
- size 400,300
109
+ @dialog = dialog @main_frame, 'Search ObjectSpace', true do |dlg|
110
+ grid_table_layout dlg, :a=>:nw, :wx=>0.1, :wy=>0.1, :f=>:h
111
+ empty_border 4,4,4,4
112
+ size 400,350
142
113
  default_close_operation :HIDE_ON_CLOSE
143
- y_glue
144
- x_panel do
145
- x_spacer 4
146
- label 'Instance:'
147
- x_spacer 10
148
- @instance_list = combo_box instance_list do
149
- editable false
150
- end
151
- x_spacer 4
152
- end
153
- y_glue
154
- x_panel do
155
- compound_border(
156
- titled_border('Find specific object') { etched_border :LOWERED },
157
- empty_border(4,8,4,8)
158
- )
159
- y_box do
160
- label 'Object id:'
161
- end
162
- x_spacer 10
163
- y_box do
164
- y_glue
165
- @object_id = text_field do
166
- columns 16
167
- fixed_size 100,24
168
- end
169
- y_glue
170
- end
171
- x_glue
172
- y_box do
173
- y_glue
174
- button 'Find' do
175
- on_click do
176
- id = nil_if_empty(@object_id.text)
177
- id = Integer(id) rescue nil if id
178
- if !id
179
- JOptionPane.show_message_dialog(@dialog,"Please enter a valid id",
180
- 'Search Error', JOptionPane::ERROR_MESSAGE)
181
- else
182
- @dialog.visible = false
183
- @object_id.text = ''
184
- @main.new_find(@instances[@instance_list.selected_index],id)
185
- end
186
- end
187
- end
188
- y_glue
189
- end
190
- end
191
-
192
- y_glue
114
+ grid_row{grid_table{
115
+ defaults :a=>:w, :i=>[4,2]
116
+ compound_border titled_border('Select instance') {etched_border :LOWERED}, empty_border(2,2,2,2)
117
+ grid_row {label 'Instance:'; @instance_list = combo_box(instance_list,:f=>:h,:wx=>0.1) {editable false}}
118
+ }}
119
+ grid_row{grid_table{
120
+ defaults :a=>:w,:i=>[4,2]
121
+ compound_border titled_border('Find specific object') {etched_border :LOWERED}, empty_border(2,2,2,2)
122
+ grid_row {
123
+ label 'Object id:'
124
+ @object_id = text_field(:wx=>0.1) {columns 16}
125
+ button('Find') {on_click {find_by_id}}
126
+ }
127
+ }}
128
+ grid_row{grid_table{
129
+ defaults :a=>:w,:i=>[4,2]
130
+ compound_border titled_border('Search for instances by type and optional variable/value') {etched_border :LOWERED},
131
+ empty_border(2,2,2,2)
132
+ grid_row {
133
+ label 'Class or Module:', :w=>2
134
+ @clazz = text_field(:wx=>0.1,:f=>:h) {columns 16}
135
+ button('Find', :h=>3,:a=>:c) {on_click {find_by_type}}
136
+ }
137
+ grid_row {label 'Variable name:'; label '@',:i=>0,:a=>:e; @name1 = text_field(:wx=>0.1,:f=>:h) {columns 16}}
138
+ grid_row {label 'Search string or /regexp/:',:w=>2; @value1 = text_field(:wx=>0.1,:f=>:h) {columns 16}}
139
+ grid_row {@gc = check_box 'GC target instance before search', :a=>:c, :w=>4}
140
+ }}
141
+ grid_row {button('Cancel', :a=>:c, :wx=>0.1, :f=>:none) {on_click {@dialog.visible = false; reset_fields}}}
142
+ end
143
+ @main.center(@main_frame,@dialog)
144
+ end
193
145
 
194
- y_panel do
195
- compound_border(
196
- titled_border('Search for instances by type and optional variable/value') { etched_border :LOWERED },
197
- empty_border(4,8,4,8)
198
- )
199
- x_panel do
200
- y_box do
201
- y_glue
202
- label 'Class or Module:'
203
- y_glue
204
- label 'Variable name:'
205
- y_glue
206
- label 'Search string or /regexp/:'
207
- y_glue
208
- end
209
- x_spacer 6
210
- y_box do
211
- y_glue
212
- label '@'
213
- y_glue
214
- end
215
- y_box do
216
- y_glue
217
- @clazz = text_field do
218
- columns 20
219
- fixed_size 200,24
220
- end
221
- y_glue
222
- @name1 = text_field do
223
- columns 20
224
- fixed_size 200,24
225
- end
226
- y_glue
227
- @value1 = text_field do
228
- columns 20
229
- fixed_size 200,24
230
- end
231
- y_glue
232
- end
233
- x_glue
234
- y_box do
235
- button 'Find' do
236
- on_click do
237
- clazz = nil_if_empty(@clazz.text)
238
- name = nil_if_empty(@name1.text)
239
- value = @value1.text
240
- value = nil if value.empty?
241
- if !clazz
242
- JOptionPane.show_message_dialog(@dialog,"Please enter a Class or Module name",
243
- 'Search Error', JOptionPane::ERROR_MESSAGE)
244
- elsif clazz !~ /^([A-Z])((\w|::[A-Z])*)$/
245
- JOptionPane.show_message_dialog(@dialog,"Invalid Class or Module name, please re-enter",
246
- 'Search Error', JOptionPane::ERROR_MESSAGE)
247
- elsif name && name !~ /^([A-Za-z_])(\w*)$/
248
- JOptionPane.show_message_dialog(@dialog,"Invalid variable name, please re-enter",
249
- 'Search Error', JOptionPane::ERROR_MESSAGE)
250
- else
251
- if value && value.strip.length != value.length
252
- rsp = JOptionPane.show_confirm_dialog(@main_frame,
253
- "Value contains leading/trailing whitespace -- continue?")
254
- else
255
- rsp = nil
256
- end
257
- unless rsp && rsp != JOptionPane::YES_OPTION
258
- @dialog.visible = false
259
- gc = @gc.selected
260
- reset_fields
261
- @main.new_search(@instances[@instance_list.selected_index],clazz,name,value,gc)
262
- end
263
- end
264
- end
265
- end
266
- end
267
- end
268
- x_panel do
269
- @gc = check_box 'GC target instance before search'
270
- end
146
+ def find_by_id
147
+ id = nil_if_empty(@object_id.text)
148
+ id = Integer(id) rescue nil if id
149
+ if !id
150
+ JOptionPane.show_message_dialog(@dialog,"Please enter a valid id",
151
+ 'Search Error', JOptionPane::ERROR_MESSAGE)
152
+ else
153
+ @dialog.visible = false
154
+ @object_id.text = ''
155
+ @main.new_find(@instances[@instance_list.selected_index],id)
156
+ end
157
+ end
158
+
159
+ def find_by_type
160
+ clazz = nil_if_empty(@clazz.text)
161
+ name = nil_if_empty(@name1.text)
162
+ value = @value1.text
163
+ value = nil if value.empty?
164
+ instance = @instances[@instance_list.selected_index]
165
+ if !clazz
166
+ JOptionPane.show_message_dialog(@dialog,"Please enter a Class or Module name",
167
+ 'Search Error', JOptionPane::ERROR_MESSAGE)
168
+ elsif clazz !~ /^([A-Z])((\w|::[A-Z])*)$/
169
+ JOptionPane.show_message_dialog(@dialog,"Invalid Class or Module name, please re-enter",
170
+ 'Search Error', JOptionPane::ERROR_MESSAGE)
171
+ elsif name && name !~ /^([A-Za-z_])(\w*)$/
172
+ JOptionPane.show_message_dialog(@dialog,"Invalid variable name, please re-enter",
173
+ 'Search Error', JOptionPane::ERROR_MESSAGE)
174
+ elsif !instance.proxy.object_space? && clazz != 'Class'
175
+ JOptionPane.show_message_dialog(@dialog,"Only class 'Class' supported when ObjectSpace disabled",
176
+ 'Search Error', JOptionPane::ERROR_MESSAGE)
177
+ else
178
+ if value && value.strip.length != value.length
179
+ rsp = JOptionPane.show_confirm_dialog(@main_frame,
180
+ "Value contains leading/trailing whitespace -- continue?")
181
+ else
182
+ rsp = nil
183
+ end
184
+ unless rsp && rsp != JOptionPane::YES_OPTION
185
+ @dialog.visible = false
186
+ gc = @gc.selected
187
+ reset_fields
188
+ @main.new_search(instance,clazz,name,value,gc)
271
189
  end
272
- y_glue
273
- x_box do
274
- x_glue
275
- button 'Cancel' do
276
- on_click do
277
- @dialog.visible = false
278
- end
279
- end
280
- x_glue
281
- end
282
- y_glue
283
190
  end
284
-
285
- @main.center(@main_frame,@dialog)
286
191
  end
287
192
 
288
193
  def nil_if_empty(val)
@@ -317,7 +222,11 @@ class SearchDialog
317
222
 
318
223
  def instance_list
319
224
  @instances = @main.instance_list
320
- arr = Array.new(@instances.length) {|i| @instances[i].name}
225
+ arr = Array.new(@instances.length) {|i|
226
+ instance = @instances[i]
227
+ pfx = instance.proxy.object_space? ? 'en' : 'dis'
228
+ "#{instance.name} [#{pfx}abled]"
229
+ }
321
230
  arr.to_java
322
231
  end
323
232
 
@@ -356,7 +265,7 @@ class AboutDialog
356
265
  body(:bgolor=>:white) { div(:align=>:center) {
357
266
  h3 font(:color=>:blue) {"Cheri::JRuby::Explorer version #{Cheri::VERSION::STRING}"}
358
267
  p 'Written by Bill Dortch ', esc('<cheri.project@gmail.com>'), br,
359
- 'Copyright &copy; 2007 William N Dortch'
268
+ 'Copyright &copy; 2007-2009 William N Dortch'
360
269
  p
361
270
  table(:width=>'97%') {
362
271
  tr{td(:align=>:left) {
@@ -61,12 +61,14 @@ end
61
61
 
62
62
  class Main
63
63
  include Cheri::Swing
64
- System = ::Java::JavaLang::System
65
- Thread = ::Java::JavaLang::Thread
66
- JComponent = ::Java::JavaxSwing::JComponent
67
- WeakHashMap = ::Java::JavaUtil::WeakHashMap
68
- JOptionPane = ::Java::JavaxSwing::JOptionPane
69
- Math = ::Java::JavaLang::Math
64
+
65
+ import java.lang.Math
66
+ import java.lang.System
67
+ import java.lang.Thread
68
+ import java.util.WeakHashMap
69
+ import javax.swing.JComponent
70
+ import javax.swing.JOptionPane
71
+
70
72
  FindIcon = CJava.get_icon('Find24.gif')
71
73
  FindAgainIcon = CJava.get_icon('FindAgain24.gif')
72
74
  SearchIcon = CJava.get_icon('Search24.gif')
@@ -82,6 +84,7 @@ class Main
82
84
  jver = ENV_JAVA['java.version']
83
85
  Java5 = String === jver && jver >= '1.5'
84
86
  Java6 = String === jver && jver >= '1.6'
87
+ MAIN_TITLE = "Cheri::JRuby::Explorer v#{Cheri::VERSION::STRING} (JRuby v#{JRUBY_VERSION})"
85
88
 
86
89
  # Maps viewer types into tab slots. Uncategorized viewers
87
90
  # will be opened in tabs slots based on their primary type.
@@ -141,7 +144,8 @@ class Main
141
144
  end
142
145
 
143
146
  def main_frame(&block)
144
- @main_frame ||= frame 'Cheri::JRuby::Explorer' do |frame|
147
+
148
+ @main_frame ||= frame MAIN_TITLE do |frame|
145
149
  size 800,600
146
150
  box_layout frame, :Y_AXIS
147
151
  #content_pane do box_layout frame, :Y_AXIS; end
@@ -807,29 +811,29 @@ class Main
807
811
  end
808
812
  end
809
813
 
810
- # def new_find(instance,id,new_tab=nil)
811
- # if rec = instance.proxy.object(id)
812
- # ntv = case rec.clazz
813
- # when 'Class' : NodeTypeValue.new(Class,rec.value,rec)
814
- # when 'Module' : NodeTypeValue.new(Module,rec.value,rec)
815
- # else NodeTypeValue.new(:object,rec.clazz,rec)
816
- # end
817
- # if (clazz = viewer(ntv.type,ntv.subtype))
818
- # vwr = clazz.new(ntv,self,instance,ntv.value)
819
- # view = vwr.view
820
- # set_view_viewer(view,vwr)
821
- # tabs = main_tab_pane
822
- # add_view_tab(tabs,view,vwr)
823
- # @main_tabs[instance.__id__][vwr.__id__] = vwr
824
- # tabs.set_selected_component(view)
825
- # else
826
- # JOptionPane.show_message_dialog(@main_frame,"Unable to display object #{id} (no viewer)")
827
- # end
828
- # else
829
- # JOptionPane.show_message_dialog(@main_frame,"Unable to retrieve object #{id} (garbage-collected?)")
830
- # end
831
- # end
832
- #
814
+ def new_find(instance,id,new_tab=nil)
815
+ if rec = instance.proxy.object(id)
816
+ ntv = case rec.clazz
817
+ when 'Class' : NodeTypeValue.new(Class,rec.value,rec)
818
+ when 'Module' : NodeTypeValue.new(Module,rec.value,rec)
819
+ else NodeTypeValue.new(:object,rec.clazz,rec)
820
+ end
821
+ if (clazz = viewer(ntv.type,ntv.subtype))
822
+ vwr = clazz.new(ntv,self,instance,ntv.value)
823
+ view = vwr.view
824
+ set_view_viewer(view,vwr)
825
+ tabs = main_tab_pane
826
+ add_view_tab(tabs,view,vwr)
827
+ @main_tabs[instance.__id__][vwr.__id__] = vwr
828
+ tabs.set_selected_component(view)
829
+ else
830
+ JOptionPane.show_message_dialog(@main_frame,"Unable to display object #{id} (no viewer)")
831
+ end
832
+ else
833
+ JOptionPane.show_message_dialog(@main_frame,"Unable to retrieve object #{id} (garbage-collected?)")
834
+ end
835
+ end
836
+
833
837
  def show_linked_object(curvwr,id,new_tab=nil)
834
838
  instance = curvwr.instance
835
839
  unless rec = instance.proxy.object(id)