arcadia 0.1.2.1 → 0.1.3

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.
data/README CHANGED
@@ -1,10 +1,9 @@
1
1
  Arcadia Ruby Ide
2
- version 0.1.2.1
2
+ version 0.1.3
3
3
 
4
4
  by Antonio Galeone
5
- on May 14, 2007
5
+ on Jul 2, 2007
6
6
 
7
- "Thank you for consider this project"
8
7
 
9
8
  About
10
9
  =====
@@ -13,6 +12,7 @@ written in Ruby using the classic tcl/tk GUI toolkit.
13
12
 
14
13
  Some of Arcadia ruby ide project features include:
15
14
  -Editor with source browsing, syntax highlighting, code completion
15
+ -Debugging support
16
16
  -Contextual ruby documentation
17
17
  -Supporting RAD gui building
18
18
  -Generation of widget-wrapper-independent ruby code
@@ -21,7 +21,7 @@ Some of Arcadia ruby ide project features include:
21
21
 
22
22
  This release
23
23
  ============
24
- -[fixed] 10726 - test arcadia on cygwin and config files updated
24
+ -added ruby-debug integration
25
25
 
26
26
  How to install
27
27
  ==============
@@ -33,7 +33,7 @@ There are two way:
33
33
 
34
34
  How to run
35
35
  ==========
36
- exec on comman line "ruby arcadia.rb"
36
+ exec on command line "ruby arcadia.rb"
37
37
 
38
38
 
39
39
  Short User guide
@@ -53,7 +53,7 @@ The toolbar button are in order:
53
53
  (relatively to editor extension)
54
54
  -run current, run last
55
55
  (for execute the raised file in the editor or the last file executed)
56
- -debug current, debug last, stop debug
56
+ -debug current, debug last, quit debug panel
57
57
  (for the debug extension that is in very unstable state)
58
58
  -quit (to exit from arcadia)
59
59
 
@@ -77,7 +77,7 @@ F3 => find/ find next
77
77
  F1 => contextual ruby documentation (called from editor or from code completion item, if
78
78
  no corrispondation is founded a doc tree is build in left side)
79
79
 
80
- Double-Click on line number set or unset a debug breckpoint
80
+ Double-Click on line number set or unset a debug breakpoint
81
81
 
82
82
  < File history >
83
83
  The last used files are organizing in tree so you can reopen them or there
@@ -100,9 +100,9 @@ It is for modify the widget property at runtime
100
100
 
101
101
  < Debug >
102
102
  It is created when a debug session init.
103
- The debug button are: Step Next, Step Into, Step Over, Resume.
103
+ The debug button are: Step Next, Step Into, Step Over, Resume and quit.
104
104
  The debug frame show the local, instance and global variables for each
105
- step. (you must have patience!)
105
+ step.
106
106
 
107
107
  <Configuration>
108
108
  Same Arcadia properties are locally configurabled by editing the file arcadia.conf
data/arcadia.rb CHANGED
@@ -1,770 +1,770 @@
1
- #
2
- # arcadia.rb - Arcadia Ruby ide
3
- # by Antonio Galeone <antonio-galeone@rubyforge.org>
4
- #
5
-
6
- Dir.chdir(File.dirname(__FILE__))
7
- if FileTest.exist?('conf/arcadia.init.rb')
8
- require 'conf/arcadia.init'
9
- end
10
- require "conf/arcadia.res"
11
- require 'tkextlib/bwidget'
12
- require "base/a-utils"
13
- require "base/a-ext"
14
- require "base/a-contracts"
15
- require "observer"
16
-
17
- class Arcadia < TkApplication
18
- include Observable
19
- attr_reader :layout
20
- attr_reader :libs
21
- #attr_reader :main_contract
22
- def initialize
23
- super(
24
- ApplicationParams.new(
25
- 'arcadia',
26
- '0.1.2.1',
27
- 'conf/arcadia.conf',
28
- 'conf/arcadia.pers'
29
- )
30
- )
31
- self.load_local_config(false)
32
- ObjectSpace.define_finalizer($arcadia, self.class.method(:finalize).to_proc)
33
- publish('action.on_exit', proc{do_exit})
34
- _title = "Arcadia Ruby ide :: [Platform = "+RUBY_PLATFORM+'] [Ruby version = ' + RUBY_VERSION+']'
35
- @root = TkRoot.new{
36
- title _title
37
- withdraw
38
- protocol( "WM_DELETE_WINDOW", $arcadia['action.on_exit'])
39
- }
40
- @on_event = Hash.new
41
- @main_menu = TkMenubar.new.pack('fill'=>'x')
42
- @mf_root = Tk::BWidget::MainFrame.new(@root){
43
- menu @main_menu
44
- }.pack(
45
- 'anchor'=> 'center',
46
- 'fill'=> 'both',
47
- 'expand'=> 1
48
- )
49
-
50
- #.place('x'=>0,'y'=>0,'relwidth'=>1,'relheight'=>1)
51
- @mf_root.show_statusbar('none')
52
- @toolbar = @mf_root.add_toolbar
53
- @is_toolbar_show=self['conf']['toolbar_show']=='yes'
54
- @mf_root.show_toolbar(0,@is_toolbar_show)
55
- @splash = ArcadiaAboutSplash.new('... initialize')
56
- @splash.set_progress(50)
57
- @splash.deiconify
58
- Tk.update
59
- sleep(1)
60
- @splash.next_step('..prepare')
61
- prepare
62
- @splash.last_step('..load finish')
63
- geometry = (TkWinfo.screenwidth(@root)-4).to_s+'x'+
64
- (TkWinfo.screenheight(@root)-20).to_s+'+0+0'
65
- @root.deiconify
66
- @root.raise
67
- @root.focus(true)
68
- @root.geometry(geometry)
69
- Tk.update_idletasks
70
- sleep(1)
71
- @splash.destroy
72
- if @first_run
73
- EditorContract.instance.open_file(self, 'file'=>'README')
74
- end
75
- end
76
-
77
- def show_hide_toolbar
78
- if @is_toolbar_show
79
- @mf_root.show_toolbar(0,false)
80
- @is_toolbar_show = false
81
- else
82
- @mf_root.show_toolbar(0,true)
83
- Tk.update
84
- @is_toolbar_show = true
85
- end
86
-
87
- end
88
-
89
-
90
- def Arcadia.finalize(id)
91
- puts "\nArcadia #{id} dying at #{Time.new}"
92
- end
93
-
94
- def load_libs
95
- @libs = ArcadiaLibs.new(self)
96
- libs = self['conf']['libraries'].split(',')
97
- libs.each{|lib|
98
- if lib
99
- @splash.next_step('... loading library '+lib)
100
- begin
101
- require self['conf']['libraries.'+lib+'.source']
102
- @libs.add_lib(
103
- ArcadiaLibs::ArcadiaLibParams.new(
104
- self['conf']['libraries.'+lib+'.name'],
105
- self['conf']['libraries.'+lib+'.source'],
106
- self['conf']['libraries.'+lib+'.require'],
107
- eval(self['conf']['libraries.'+lib+'.collection.class']))
108
- )
109
- rescue Exception
110
- msg = "Loading lib "+'"'+lib+'"'+" ("+$!.class.to_s+") "+" : "+$! + " at : "+$@.to_s
111
- if Tk.messageBox('icon' => 'error', 'type' => 'okcancel',
112
- 'title' => '(Arcadia) Libs', 'parent' => @root,
113
- 'message' => msg) == 'cancel'
114
- raise
115
- exit
116
- else
117
- Tk.update
118
- end
119
- end
120
- end
121
- }
122
- end
123
-
124
- def load_toolbar_buttons
125
- suf = 'toolbar_buttons'
126
- @buttons = Hash.new
127
- toolbar_buttons = self['conf'][suf].split(',')
128
- toolbar_buttons.each{|groups|
129
- if groups
130
- suf1 = suf+'.'+groups
131
- @splash.next_step('... loading '+suf1)
132
- begin
133
- buttons = self['conf'][suf1].split(',')
134
- buttons.each{|button|
135
- suf2 = suf1+'.'+button
136
- name = self['conf'][suf2+'.name']
137
- text = self['conf'][suf2+'.text']
138
- image = self['conf'][suf2+'.image']
139
- font = self['conf'][suf2+'.font']
140
- background = self['conf'][suf2+'.background']
141
- foreground = self['conf'][suf2+'.foreground']
142
- hint = self['conf'][suf2+'.hint']
143
- action = self['conf'][suf2+'.action']
144
- actions = action.split('->') if action
145
- if actions && actions.length>1
146
- _command = proc{
147
- action_obj = $arcadia[actions[0]]
148
- 1.upto(actions.length-2) do |x|
149
- action_obj = action_obj.send(actions[x])
150
- end
151
- action_obj.send(actions[actions.length-1])
152
- }
153
- elsif action
154
- _command = proc{$arcadia[action].call}
155
- end
156
- @buttons[name] = Tk::BWidget::Button.new(@toolbar){
157
- image TkPhotoImage.new('data' => eval(image)) if image
158
- borderwidth 1
159
- font font if font
160
- background background if background
161
- foreground foreground if foreground
162
- command _command if action
163
- relief 'flat'
164
- helptext hint if hint
165
- text text if text
166
- pack('side' =>'left', :padx=>2, :pady=>2)
167
- }
168
- }
169
- rescue Exception
170
- msg = 'Loading '+groups+'" -> '+buttons.to_s+ '" (' + $!.class.to_s + ") : " + $!.to_s + " at : "+$@.to_s
171
- if Tk.messageBox('icon' => 'error', 'type' => 'okcancel',
172
- 'title' => '(Arcadia) Toolbar', 'parent' => @root,
173
- 'message' => msg) == 'cancel'
174
- raise
175
- exit
176
- else
177
- Tk.update
178
- end
179
- end
180
- end
181
- Tk::BWidget::Separator.new(@toolbar, :orient=>'vertical').pack('side' =>'left', :padx=>2, :pady=>2, :fill=>'y',:anchor=> 'w')
182
- }
183
- end
184
-
185
- def ext_active?(_name)
186
- return (self['conf'][_name+'.active'] != nil && self['conf'][_name+'.active']=='yes')||
187
- (self['conf'][_name+'.active'] == nil)
188
- end
189
-
190
- def load_exts_conf
191
- @exts = Array.new
192
- dirs = Array.new
193
- files = Dir['ext/*'].concat(Dir[ENV["HOME"]+'/.arcadia/ext/*'])
194
- files.each{|f|
195
- dirs << f if File.stat(f).directory? && FileTest.exist?(f+'/'+File.basename(f)+'.conf')
196
- }
197
- dirs.each{|ext_dir|
198
- conf_hash = self.config_file2hash(ext_dir+'/'+File.basename(ext_dir)+'.conf')
199
- conf_hash2 = Hash.new
200
- name = conf_hash['name']
201
- conf_hash.each{|key, value|
202
- var_plat = key.split(':')
203
- if var_plat.length > 1
204
- new_key = var_plat[0] + ':' + name + '.' + var_plat[1]
205
- else
206
- new_key = name+'.'+key
207
- end
208
- conf_hash2[new_key]= value
209
- }
210
- @exts << name
211
- self['conf'].update(conf_hash2)
212
- }
213
- end
214
-
215
- def load_exts
216
-
217
- # create extensions
218
- @exts.each{|extension|
219
- if extension && ext_active?(extension)
220
- @splash.next_step('... creating '+extension)
221
- ext_create(extension)
222
- end
223
- }
224
-
225
- # before_build extensions
226
- @exts.each{|extension|
227
- if extension && ext_active?(extension)
228
- @splash.next_step('... before building '+extension)
229
- ext_method(extension, :before_build)
230
- MainContract.instance.extension_before_build(self, 'obj'=>self[extension])
231
- end
232
- }
233
-
234
- # build extensions
235
- @exts.each{|extension|
236
- if extension && ext_active?(extension)
237
- @splash.next_step('... building '+extension)
238
- ext_method(extension, :build)
239
- MainContract.instance.extension_build(self, 'obj'=>self[extension])
240
- end
241
- }
242
-
243
- # after build extensions
244
- @exts.each{|extension|
245
- if extension && ext_active?(extension)
246
- @splash.next_step('... after building '+extension)
247
- ext_method(extension, :after_build)
248
- MainContract.instance.extension_after_build(self, 'obj'=>self[extension])
249
- end
250
- }
251
-
252
- end
253
-
254
- def ext_create(_extension)
255
- begin
256
- source = self['conf'][_extension+'.require']
257
- class_name = self['conf'][_extension+'.class']
258
- if source.strip.length > 0
259
- #p source
260
- eval('require ' + "'" + source + "'")
261
- end
262
- if class_name.strip.length > 0
263
- publish(_extension, eval(class_name).new(self, _extension))
264
- end
265
- rescue Exception
266
- raise
267
- msg = "Loading "+'"'+extension+'"'+" ("+$!.class.to_s+") "+" : "+$! + " at : "+$@.to_s
268
- ans = Tk.messageBox('icon' => 'error', 'type' => 'abortretryignore',
269
- 'title' => '(Arcadia) Extensions', 'parent' => @root,
270
- 'message' => msg)
271
- if ans == 'abort'
272
- raise
273
- exit
274
- elsif ans == 'retry'
275
- retry
276
- else
277
- Tk.update
278
- end
279
- end
280
- end
281
-
282
- def ext_method(_extension, _method)
283
- begin
284
- self[_extension].send(_method)
285
- rescue Exception
286
- msg = _method.to_s+' "'+_extension.to_s+'"'+" ("+$!.class.to_s+") "+" : "+$! + "\n at : "+$@.to_s
287
- ans = Tk.messageBox('icon' => 'warning', 'type' => 'abortretryignore',
288
- 'title' => '(Arcadia) Extensions', 'parent' => @root,
289
- 'message' => msg)
290
- if ans == 'abort'
291
- raise
292
- exit
293
- elsif ans == 'retry'
294
- retry
295
- else
296
- Tk.update
297
- end
298
- end
299
- end
300
-
301
-
302
- def prepare
303
- super
304
- @splash.next_step('...initialize')
305
- @layout = ArcadiaLayout.new(self, @mf_root.get_frame)
306
-
307
- @layout.add_cols(0,0,225)
308
- @layout.add_rows(0,0,180)
309
- # @layout.add_rows(0,1,500)
310
- @layout.add_rows_perc(0,1,70)
311
-
312
-
313
- @layout.add_headers
314
- @splash.next_step
315
- self.load_libs
316
- @splash.next_step
317
- @splash.next_step('... load extensions')
318
- self.load_exts_conf
319
- self.load_local_config
320
- self.load_exts
321
- publish('buffers.code.in_memory',Hash.new)
322
- publish('action.load_code_from_buffers', proc{TkBuffersChoise.new})
323
- publish('output.action.run_last', proc{$arcadia['output'].run_last})
324
- publish('main.action.open_file', proc{self['editor'].open_file(Tk.getOpenFile)})
325
- @splash.next_step('... load obj controller')
326
- @splash.next_step('... load editor')
327
- publish('main.action.new_file',proc{$arcadia['editor'].open_buffer()})
328
- publish('main.action.edit_cut',proc{$arcadia['editor'].raised.text.text_cut()})
329
- publish('main.action.edit_copy',proc{$arcadia['editor'].raised.text.text_copy()})
330
- publish('main.action.edit_paste',proc{$arcadia['editor'].raised.text.text_paste()})
331
- @splash.next_step('... load actions')
332
- publish('action.test.keys', proc{KetTest.new})
333
- publish('action.get.font', proc{Tk::BWidget::SelectFont::Dialog.new.create})
334
- @splash.next_step
335
- publish('action.show_about', proc{ArcadiaAboutSplash.new.deiconify})
336
- # publish('main.menu', @main_menu)
337
- publish('main.menu', AMainMenu.new(@main_menu))
338
- @splash.next_step
339
- publish('objic.action.raise_active_obj',
340
- proc{
341
- InspectorContract.instance.raise_active_toplevel(self)
342
- }
343
- )
344
- load_toolbar_buttons
345
- end
346
-
347
- def do_exit
348
- q1 = (Tk.messageBox('icon' => 'question', 'type' => 'yesno',
349
- 'title' => '(Arcadia) Exit', 'parent' => @root,
350
- 'message' => "Do you want exit?")=='yes')
351
- if q1 && can_exit?
352
- do_finalize
353
- @root.destroy
354
- end
355
- end
356
-
357
- def can_exit?
358
- _can_exit = true
359
- @exts.each{|extension|
360
- if ext_active?(extension) && !self[extension].can_exit_query
361
- _can_exit = false
362
- break
363
- end
364
- }
365
- return _can_exit
366
- end
367
-
368
- def do_finalize
369
- @exts.each{|extension|
370
- self[extension].finalize if ext_active?(extension)
371
- }
372
- self.write_persist
373
- end
374
- end
375
-
376
-
377
- class AMainMenu < TkMenubar
378
-
379
- def initialize(menu)
380
- # create main menu
381
- @menu = menu
382
- build
383
- menu.foreground('grey40')
384
- menu.activeforeground('red')
385
- menu.relief('groove')
386
- menu.borderwidth(0)
387
- menu.font($arcadia['conf']['main.mainmenu.font'])
388
- end
389
-
390
- def build
391
- menu_spec_file = [
392
- ['File', 0],
393
- ['Open', $arcadia['main.action.open_file'], 0],
394
- ['New', $arcadia['main.action.new_file'], 0],
395
- ['Save', proc{EditorContract.instance.save_file_raised(self)},0],
396
- ['Save as ...', proc{EditorContract.instance.save_as_file_raised(self)},0],
397
- '---',
398
- ['Quit', $arcadia['action.on_exit'], 0]]
399
- menu_spec_edit = [['Edit', 0],
400
- ['Cut', $arcadia['main.action.edit_cut'], 2],
401
- ['Copy', $arcadia['main.action.edit_copy'], 0],
402
- ['Paste', $arcadia['main.action.edit_paste'], 0]]
403
- menu_spec_search = [['Search', 0],
404
- ['Find ...', proc{EditorContract.instance.show_search_dialog(self)}, 2],
405
- ['Go to line ...', proc{EditorContract.instance.show_goto_line_dialog(self)}, 2]]
406
- menu_spec_view = [['View', 0],['Show/Hide Toolbar', proc{$arcadia.show_hide_toolbar}, 2]]
407
- menu_spec_tools = [['Utils', 0],
408
- ['Keys-test', $arcadia['action.test.keys'], 2],
409
- ['Load code from buffer', $arcadia['action.load_code_from_buffers'], 2]
410
- ]
411
- menu_spec_help = [['Help', 0],
412
- ['About', $arcadia['action.show_about'], 2],]
413
- @menu.add_menu(menu_spec_file)
414
- @menu.add_menu(menu_spec_edit)
415
- @menu.add_menu(menu_spec_search)
416
- @menu.add_menu(menu_spec_view)
417
- @menu.add_menu(menu_spec_tools)
418
- @menu.add_menu(menu_spec_help)
419
- end
420
-
421
- end
422
-
423
-
424
- class ArcadiaAboutSplash < TkToplevel
425
- attr :progress
426
-
427
- def initialize(_txt=nil)
428
- #_bgcolor = '#B83333'
429
- _bgcolor = '#000000'
430
- super()
431
- relief 'flat'
432
- background _bgcolor
433
- highlightbackground _bgcolor
434
- highlightthickness 6
435
- borderwidth 1
436
- withdraw
437
- overrideredirect(true)
438
-
439
- @tkLabel3 = TkLabel.new(self){
440
- image TkPhotoImage.new('format'=>'GIF','data' =>A_LOGO_GIF)
441
- background _bgcolor
442
- place('x'=> 20,'y' => 20)
443
- }
444
- @tkLabel1 = TkLabel.new(self){
445
- text 'Arcadia'
446
- background _bgcolor
447
- foreground '#ffffff'
448
- font Arcadia.instance['conf']['splash.title.font']
449
- justify 'left'
450
- place('width' => '190','x' => 120,'y' => 10,'height' => 25)
451
- }
452
- @tkLabelRuby = TkLabel.new(self){
453
- image TkPhotoImage.new('data' =>RUBY_DOCUMENT_GIF)
454
- background _bgcolor
455
- place('x'=> 150,'y' => 40)
456
- }
457
- @tkLabel2 = TkLabel.new(self){
458
- text 'Ruby ide'
459
- background _bgcolor
460
- foreground '#ffffff'
461
- font Arcadia.instance['conf']['splash.subtitle.font']
462
- justify 'left'
463
- place('width' => '90','x' => 170,'y' => 40,'height' => 19)
464
- }
465
- @tkLabelVersion = TkLabel.new(self){
466
- text 'version: '+$arcadia['applicationParams'].version
467
- background _bgcolor
468
- foreground '#ffffff'
469
- font Arcadia.instance['conf']['splash.version.font']
470
- justify 'left'
471
- place('width' => '100','x' => 150,'y' => 60,'height' => 19)
472
- }
473
- @tkLabelStep = TkLabel.new(self){
474
- text _txt
475
- background _bgcolor
476
- foreground 'yellow'
477
- font Arcadia.instance['conf']['splash.banner.font']
478
- justify 'left'
479
- anchor 'w'
480
- place('width'=>-5,'relwidth' => 1,'x' => 5,'y' => 175,'height' => 19)
481
- }
482
- @tkLabel21 = TkLabel.new(self){
483
- text 'by Antonio Galeone - 2007'
484
- background _bgcolor
485
- foreground '#ffffff'
486
- font Arcadia.instance['conf']['splash.credits.font']
487
- justify 'left'
488
- place('width' => '190','x' => 130,'y' => 146,'height' => 19)
489
- }
490
- @progress = TkVariable.new
491
- reset
492
- _width = 340
493
- _height = 210
494
- #_width = 0;_height = 0
495
- _x = TkWinfo.screenwidth(self)/2 - _width / 2
496
- _y = TkWinfo.screenheight(self)/2 - _height / 2
497
- geometry = _width.to_s+'x'+_height.to_s+'+'+_x.to_s+'+'+_y.to_s
498
- Tk.tk_call('wm', 'geometry', self, geometry )
499
- bind("Double-Button-1", proc{self.destroy})
500
- end
501
-
502
- def set_progress(_max=10)
503
- @max = _max
504
- Tk::BWidget::ProgressBar.new(self, :width=>150, :height=>10,
505
- :background=>'black',
506
- :foreground=>'yellow',
507
- :variable=>@progress,
508
- :borderwidth=>0,
509
- :relief=>'flat',
510
- :maximum=>_max).place('width' => '150','x' => 145,'y' => 95,'height' => 15)
511
- end
512
-
513
- def reset
514
- @progress.value = -1
515
- end
516
-
517
- def next_step(_txt = nil)
518
- @progress.numeric += 1
519
- labelStep(_txt) if _txt
520
- end
521
-
522
- def labelStep(_txt)
523
- @tkLabelStep.text = _txt
524
- Tk.update
525
- end
526
-
527
- def last_step(_txt = nil)
528
- @progress.numeric = @max
529
- labelStep(_txt) if _txt
530
- end
531
-
532
- end
533
-
534
- class TkBuffersChoiseView < TkToplevel
535
-
536
- def initialize
537
- super
538
- Tk.tk_call('wm', 'title', self, '...hello' )
539
- Tk.tk_call('wm', 'geometry', self, '150x217+339+198' )
540
- @lb = TkListbox.new(self){
541
- background '#fedbd7'
542
- relief 'groove'
543
- place('relwidth' => '1','relx' => 0,'x' => '0','y' => '0','relheight' => '1','rely' => 0,'height' => '0','bordermode' => 'inside','width' => '0')
544
- }
545
- end
546
-
547
- end
548
-
549
- class TkBuffersChoise < TkBuffersChoiseView
550
-
551
- def initialize
552
- super
553
- @lb.value= $arcadia['buffers.code.in_memory'].keys
554
- @lb.bind("Double-ButtonPress-1",proc{
555
- _sel = @lb.get('active')
556
- Revparsel.new($arcadia['buffers.code.in_memory'][_sel])
557
- @lb.delete('active')
558
- $arcadia['buffers.code.in_memory'].delete(_sel)
559
- destroy
560
- })
561
- raise
562
- end
563
-
564
- end
565
-
566
- class ArcadiaLayout
567
- include Observable
568
- ArcadiaPanelInfo = Struct.new( "ArcadiaPanelInfo",
569
- :name,
570
- :title,
571
- :frame
572
- )
573
-
574
- def initialize(_arcadia, _frame, _autotab=true)
575
- @arcadia = _arcadia
576
- @frames = Array.new
577
- @frames[0] = Array.new
578
- @frames[0][0] = _frame
579
- @domains = Array.new
580
- @domains[0] = Array.new
581
- @domains[0][0] = '_domain_root_'
582
- @panels = Hash.new
583
- @panels['_domain_root_']= Hash.new
584
- @panels['_domain_root_']['root']= _frame
585
- @panels['_domain_root_']['sons'] = Hash.new
586
- @autotab = _autotab
587
- @headed = false
588
- ArcadiaContractListener.new(self, MainContract, :do_main_event)
589
- end
590
- def root
591
- @panels['_domain_root_']['root']
592
- end
593
- def do_main_event(_event)
594
- case _event.signature
595
- when MainContract::RAISE_EXTENSION
596
- p = @panels[_event.context.domain]
597
- if p && p['notebook'] != nil && _event.channel == '0'
598
- p['notebook'].raise(_event.context.extension)
599
- end
600
- end
601
- end
602
-
603
- def _prepare_rows(_row,_col, _height, _perc=false, _top_name=nil, _bottom_name=nil)
604
- if (@frames[_row][_col] != nil)
605
- _h = AGTkOSplittedFrames.new(@frames[_row][_col],_height, _perc)
606
- if @frames[_row + 1] == nil
607
- @frames[_row + 1] = Array.new
608
- @domains[_row + 1] = Array.new
609
- end
610
- @frames[_row][_col] = _h.top_frame
611
- @frames[_row + 1][_col] = _h.bottom_frame
612
-
613
- _top_name = _row.to_s+'.'+_col.to_s if _top_name == nil
614
- @panels[_top_name] = Hash.new
615
- @panels[_top_name]['root'] = @frames[_row][_col]
616
- @panels[_top_name]['sons'] = Hash.new
617
- @domains[_row][_col] = _top_name
618
-
619
- _bottom_name = (_row+1).to_s+'.'+_col.to_s if _bottom_name == nil
620
- @panels[_bottom_name] = Hash.new
621
- @panels[_bottom_name]['root'] = @frames[_row + 1][_col]
622
- @panels[_bottom_name]['sons'] = Hash.new
623
- @domains[_row + 1][_col] = _bottom_name
624
- end
625
- end
626
- private :_prepare_rows
627
-
628
- def add_rows(_row,_col, _height, _top_name=nil, _bottom_name=nil)
629
- _prepare_rows(_row,_col, _height, false, _top_name, _bottom_name)
630
- end
631
-
632
- def add_rows_perc(_row,_col, _height, _top_name=nil, _bottom_name=nil)
633
- _prepare_rows(_row,_col, _height, true, _top_name, _bottom_name)
634
- end
635
-
636
-
637
- def add_cols(_row,_col, _width, _left_name=nil, _right_name=nil)
638
- if (@frames[_row][_col] != nil)
639
- _w = AGTkVSplittedFrames.new(@frames[_row][_col],_width)
640
- @frames[_row][_col] = _w.left_frame
641
- @frames[_row][_col + 1] = _w.right_frame
642
-
643
- _left_name = _row.to_s+'.'+_col.to_s if _left_name == nil
644
- @panels[_left_name] = Hash.new
645
- @panels[_left_name]['root'] = @frames[_row][_col]
646
- @panels[_left_name]['sons'] = Hash.new
647
- @domains[_row][_col] = _left_name
648
-
649
- _right_name = _row.to_s+'.'+(_col+1).to_s if _right_name == nil
650
- @panels[_right_name] = Hash.new
651
- @panels[_right_name]['root'] = @frames[_row][_col + 1]
652
- @panels[_right_name]['sons'] = Hash.new
653
- @domains[_row][_col + 1] = _right_name
654
- end
655
- end
656
-
657
- def add_headers
658
- @domains.each{|row|
659
- row.each{|domain|
660
- @panels[domain]['root']= TkTitledFrame.new(@panels[domain]['root'], '...').place('x'=>0, 'y'=>0,'relheight'=>1, 'relwidth'=>1) if @panels[domain]
661
- }
662
- }
663
- @headed = true
664
- end
665
-
666
- def headed?
667
- @headed
668
- end
669
-
670
- def autotab?
671
- @autotab
672
- end
673
-
674
- def registed?(_domain_name, _name)
675
- @panels[_domain_name]['sons'][_name] != nil
676
- end
677
-
678
- def register_panel(_domain_name, _name, _title)
679
- p = @panels[_domain_name]
680
- if p!=nil
681
- num = p['sons'].length
682
- if @headed
683
- p['root'].title(_title)
684
- root_frame = p['root'].frame
685
- else
686
- root_frame = p['root']
687
- end
688
- if (num == 0 && @autotab)
689
- api = ArcadiaPanelInfo.new(_name,_title,nil)
690
- api.frame = TkFrame.new(root_frame).place('x'=>0, 'y'=>0, 'relwidth'=>1, 'relheight'=>1)
691
- p['sons'][_name] = api
692
- return api.frame
693
- else
694
- if num == 1 && @autotab && p['notebook'] == nil
695
- p['notebook'] = Tk::BWidget::NoteBook.new(root_frame){
696
- tabbevelsize 0
697
- internalborderwidth 0
698
- pack('fill'=>'both', :padx=>0, :pady=>0, :expand => 'yes')
699
- }
700
- api = p['sons'].values[0]
701
- api_tab_frame = p['notebook'].insert('end',
702
- api.name,
703
- 'text'=>api.title,
704
- 'raisecmd'=>proc{
705
- p['root'].title(api.title)
706
- p['root'].top_text('')
707
- changed
708
- notify_observers('RAISE', api.name)
709
- }
710
- )
711
- api.frame.place('in'=>api_tab_frame, 'x'=>0, 'y'=>0, 'relwidth'=>1, 'relheight'=>1)
712
- api.frame.raise
713
- elsif (num==0 && !@autotab)
714
- p['notebook'] = Tk::BWidget::NoteBook.new(root_frame){
715
- tabbevelsize 0
716
- internalborderwidth 0
717
- pack('fill'=>'both', :padx=>0, :pady=>0, :expand => 'yes')
718
- }
719
- end
720
- _panel = p['notebook'].insert('end',_name ,
721
- 'text'=>_title,
722
- #'background'=>_tab_bg,
723
- 'raisecmd'=>proc{
724
- p['root'].title(_title)
725
- changed
726
- notify_observers('RAISE', _name)
727
- }
728
- )
729
-
730
- # if _tab_bg
731
- # _panel = p['notebook'].insert('end',_name , 'text'=>_title, 'background'=>_tab_bg)
732
- # else
733
- # _panel = p['notebook'].insert('end',_name , 'text'=>_title)
734
- # end
735
- p['sons'][_name] = ArcadiaPanelInfo.new(_name,_title,_panel)
736
- p['notebook'].raise(_name)
737
- return _panel
738
- end
739
- end
740
- end
741
-
742
- def unregister_panel(_domain_name, _name)
743
- @panels[_domain_name]['sons'].delete(_name)
744
- @panels[_domain_name]['notebook'].delete(_name)
745
- new_raise_key = @panels[_domain_name]['sons'].keys[@panels[_domain_name]['sons'].length-1]
746
- @panels[_domain_name]['notebook'].raise(new_raise_key)
747
- end
748
-
749
- def raise_panel(_domain_name, _name)
750
- @panels[_domain_name]['notebook'].raise(_name) if @panels[_domain_name] && @panels[_domain_name]['notebook']
751
- end
752
-
753
- def [](_row, _col)
754
- @frames[_row][_col]
755
- end
756
-
757
- def frame(_domain_name, _name)
758
- @panels[_domain_name]['sons'][_name].frame
759
- end
760
-
761
- def domain(_domain_name)
762
- @panels[_domain_name]
763
- end
764
-
765
- def domain_root_frame(_domain_name)
766
- @panels[_domain_name]['root'].frame
767
- end
768
- end
769
-
770
- Arcadia.new.run
1
+ #
2
+ # arcadia.rb - Arcadia Ruby ide
3
+ # by Antonio Galeone <antonio-galeone@rubyforge.org>
4
+ #
5
+
6
+ Dir.chdir(File.dirname(__FILE__))
7
+ if FileTest.exist?('conf/arcadia.init.rb')
8
+ require 'conf/arcadia.init'
9
+ end
10
+ require "conf/arcadia.res"
11
+ require 'tkextlib/bwidget'
12
+ require "base/a-utils"
13
+ require "base/a-ext"
14
+ require "base/a-contracts"
15
+ require "observer"
16
+
17
+ class Arcadia < TkApplication
18
+ include Observable
19
+ attr_reader :layout
20
+ attr_reader :libs
21
+ #attr_reader :main_contract
22
+ def initialize
23
+ super(
24
+ ApplicationParams.new(
25
+ 'arcadia',
26
+ '0.1.3',
27
+ 'conf/arcadia.conf',
28
+ 'conf/arcadia.pers'
29
+ )
30
+ )
31
+ self.load_local_config(false)
32
+ ObjectSpace.define_finalizer($arcadia, self.class.method(:finalize).to_proc)
33
+ publish('action.on_exit', proc{do_exit})
34
+ _title = "Arcadia Ruby ide :: [Platform = "+RUBY_PLATFORM+'] [Ruby version = ' + RUBY_VERSION+']'
35
+ @root = TkRoot.new{
36
+ title _title
37
+ withdraw
38
+ protocol( "WM_DELETE_WINDOW", $arcadia['action.on_exit'])
39
+ }
40
+ @on_event = Hash.new
41
+ @main_menu = TkMenubar.new.pack('fill'=>'x')
42
+ @mf_root = Tk::BWidget::MainFrame.new(@root){
43
+ menu @main_menu
44
+ }.pack(
45
+ 'anchor'=> 'center',
46
+ 'fill'=> 'both',
47
+ 'expand'=> 1
48
+ )
49
+
50
+ #.place('x'=>0,'y'=>0,'relwidth'=>1,'relheight'=>1)
51
+ @mf_root.show_statusbar('none')
52
+ @toolbar = @mf_root.add_toolbar
53
+ @is_toolbar_show=self['conf']['toolbar_show']=='yes'
54
+ @mf_root.show_toolbar(0,@is_toolbar_show)
55
+ @splash = ArcadiaAboutSplash.new('... initialize')
56
+ @splash.set_progress(50)
57
+ @splash.deiconify
58
+ Tk.update
59
+ sleep(1)
60
+ @splash.next_step('..prepare')
61
+ prepare
62
+ @splash.last_step('..load finish')
63
+ geometry = (TkWinfo.screenwidth(@root)-4).to_s+'x'+
64
+ (TkWinfo.screenheight(@root)-20).to_s+'+0+0'
65
+ @root.deiconify
66
+ @root.raise
67
+ @root.focus(true)
68
+ @root.geometry(geometry)
69
+ Tk.update_idletasks
70
+ sleep(1)
71
+ @splash.destroy
72
+ if @first_run
73
+ EditorContract.instance.open_file(self, 'file'=>'README')
74
+ end
75
+ end
76
+
77
+ def show_hide_toolbar
78
+ if @is_toolbar_show
79
+ @mf_root.show_toolbar(0,false)
80
+ @is_toolbar_show = false
81
+ else
82
+ @mf_root.show_toolbar(0,true)
83
+ Tk.update
84
+ @is_toolbar_show = true
85
+ end
86
+
87
+ end
88
+
89
+
90
+ def Arcadia.finalize(id)
91
+ puts "\nArcadia #{id} dying at #{Time.new}"
92
+ end
93
+
94
+ def load_libs
95
+ @libs = ArcadiaLibs.new(self)
96
+ libs = self['conf']['libraries'].split(',')
97
+ libs.each{|lib|
98
+ if lib
99
+ @splash.next_step('... loading library '+lib)
100
+ begin
101
+ require self['conf']['libraries.'+lib+'.source']
102
+ @libs.add_lib(
103
+ ArcadiaLibs::ArcadiaLibParams.new(
104
+ self['conf']['libraries.'+lib+'.name'],
105
+ self['conf']['libraries.'+lib+'.source'],
106
+ self['conf']['libraries.'+lib+'.require'],
107
+ eval(self['conf']['libraries.'+lib+'.collection.class']))
108
+ )
109
+ rescue Exception
110
+ msg = "Loading lib "+'"'+lib+'"'+" ("+$!.class.to_s+") "+" : "+$! + " at : "+$@.to_s
111
+ if Tk.messageBox('icon' => 'error', 'type' => 'okcancel',
112
+ 'title' => '(Arcadia) Libs', 'parent' => @root,
113
+ 'message' => msg) == 'cancel'
114
+ raise
115
+ exit
116
+ else
117
+ Tk.update
118
+ end
119
+ end
120
+ end
121
+ }
122
+ end
123
+
124
+ def load_toolbar_buttons
125
+ suf = 'toolbar_buttons'
126
+ @buttons = Hash.new
127
+ toolbar_buttons = self['conf'][suf].split(',')
128
+ toolbar_buttons.each{|groups|
129
+ if groups
130
+ suf1 = suf+'.'+groups
131
+ @splash.next_step('... loading '+suf1)
132
+ begin
133
+ buttons = self['conf'][suf1].split(',')
134
+ buttons.each{|button|
135
+ suf2 = suf1+'.'+button
136
+ name = self['conf'][suf2+'.name']
137
+ text = self['conf'][suf2+'.text']
138
+ image = self['conf'][suf2+'.image']
139
+ font = self['conf'][suf2+'.font']
140
+ background = self['conf'][suf2+'.background']
141
+ foreground = self['conf'][suf2+'.foreground']
142
+ hint = self['conf'][suf2+'.hint']
143
+ action = self['conf'][suf2+'.action']
144
+ actions = action.split('->') if action
145
+ if actions && actions.length>1
146
+ _command = proc{
147
+ action_obj = $arcadia[actions[0]]
148
+ 1.upto(actions.length-2) do |x|
149
+ action_obj = action_obj.send(actions[x])
150
+ end
151
+ action_obj.send(actions[actions.length-1])
152
+ }
153
+ elsif action
154
+ _command = proc{$arcadia[action].call}
155
+ end
156
+ @buttons[name] = Tk::BWidget::Button.new(@toolbar){
157
+ image TkPhotoImage.new('data' => eval(image)) if image
158
+ borderwidth 1
159
+ font font if font
160
+ background background if background
161
+ foreground foreground if foreground
162
+ command _command if action
163
+ relief 'flat'
164
+ helptext hint if hint
165
+ text text if text
166
+ pack('side' =>'left', :padx=>2, :pady=>2)
167
+ }
168
+ }
169
+ rescue Exception
170
+ msg = 'Loading '+groups+'" -> '+buttons.to_s+ '" (' + $!.class.to_s + ") : " + $!.to_s + " at : "+$@.to_s
171
+ if Tk.messageBox('icon' => 'error', 'type' => 'okcancel',
172
+ 'title' => '(Arcadia) Toolbar', 'parent' => @root,
173
+ 'message' => msg) == 'cancel'
174
+ raise
175
+ exit
176
+ else
177
+ Tk.update
178
+ end
179
+ end
180
+ end
181
+ Tk::BWidget::Separator.new(@toolbar, :orient=>'vertical').pack('side' =>'left', :padx=>2, :pady=>2, :fill=>'y',:anchor=> 'w')
182
+ }
183
+ end
184
+
185
+ def ext_active?(_name)
186
+ return (self['conf'][_name+'.active'] != nil && self['conf'][_name+'.active']=='yes')||
187
+ (self['conf'][_name+'.active'] == nil)
188
+ end
189
+
190
+ def load_exts_conf
191
+ @exts = Array.new
192
+ dirs = Array.new
193
+ files = Dir['ext/*'].concat(Dir[ENV["HOME"]+'/.arcadia/ext/*'])
194
+ files.each{|f|
195
+ dirs << f if File.stat(f).directory? && FileTest.exist?(f+'/'+File.basename(f)+'.conf')
196
+ }
197
+ dirs.each{|ext_dir|
198
+ conf_hash = self.config_file2hash(ext_dir+'/'+File.basename(ext_dir)+'.conf')
199
+ conf_hash2 = Hash.new
200
+ name = conf_hash['name']
201
+ conf_hash.each{|key, value|
202
+ var_plat = key.split(':')
203
+ if var_plat.length > 1
204
+ new_key = var_plat[0] + ':' + name + '.' + var_plat[1]
205
+ else
206
+ new_key = name+'.'+key
207
+ end
208
+ conf_hash2[new_key]= value
209
+ }
210
+ @exts << name
211
+ self['conf'].update(conf_hash2)
212
+ }
213
+ end
214
+
215
+ def load_exts
216
+
217
+ # create extensions
218
+ @exts.each{|extension|
219
+ if extension && ext_active?(extension)
220
+ @splash.next_step('... creating '+extension)
221
+ ext_create(extension)
222
+ end
223
+ }
224
+
225
+ # before_build extensions
226
+ @exts.each{|extension|
227
+ if extension && ext_active?(extension)
228
+ @splash.next_step('... before building '+extension)
229
+ ext_method(extension, :before_build)
230
+ MainContract.instance.extension_before_build(self, 'obj'=>self[extension])
231
+ end
232
+ }
233
+
234
+ # build extensions
235
+ @exts.each{|extension|
236
+ if extension && ext_active?(extension)
237
+ @splash.next_step('... building '+extension)
238
+ ext_method(extension, :build)
239
+ MainContract.instance.extension_build(self, 'obj'=>self[extension])
240
+ end
241
+ }
242
+
243
+ # after build extensions
244
+ @exts.each{|extension|
245
+ if extension && ext_active?(extension)
246
+ @splash.next_step('... after building '+extension)
247
+ ext_method(extension, :after_build)
248
+ MainContract.instance.extension_after_build(self, 'obj'=>self[extension])
249
+ end
250
+ }
251
+
252
+ end
253
+
254
+ def ext_create(_extension)
255
+ begin
256
+ source = self['conf'][_extension+'.require']
257
+ class_name = self['conf'][_extension+'.class']
258
+ if source.strip.length > 0
259
+ #p source
260
+ eval('require ' + "'" + source + "'")
261
+ end
262
+ if class_name.strip.length > 0
263
+ publish(_extension, eval(class_name).new(self, _extension))
264
+ end
265
+ rescue Exception
266
+ raise
267
+ msg = "Loading "+'"'+extension+'"'+" ("+$!.class.to_s+") "+" : "+$! + " at : "+$@.to_s
268
+ ans = Tk.messageBox('icon' => 'error', 'type' => 'abortretryignore',
269
+ 'title' => '(Arcadia) Extensions', 'parent' => @root,
270
+ 'message' => msg)
271
+ if ans == 'abort'
272
+ raise
273
+ exit
274
+ elsif ans == 'retry'
275
+ retry
276
+ else
277
+ Tk.update
278
+ end
279
+ end
280
+ end
281
+
282
+ def ext_method(_extension, _method)
283
+ begin
284
+ self[_extension].send(_method)
285
+ rescue Exception
286
+ msg = _method.to_s+' "'+_extension.to_s+'"'+" ("+$!.class.to_s+") "+" : "+$! + "\n at : "+$@.to_s
287
+ ans = Tk.messageBox('icon' => 'warning', 'type' => 'abortretryignore',
288
+ 'title' => '(Arcadia) Extensions', 'parent' => @root,
289
+ 'message' => msg)
290
+ if ans == 'abort'
291
+ raise
292
+ exit
293
+ elsif ans == 'retry'
294
+ retry
295
+ else
296
+ Tk.update
297
+ end
298
+ end
299
+ end
300
+
301
+
302
+ def prepare
303
+ super
304
+ @splash.next_step('...initialize')
305
+ @layout = ArcadiaLayout.new(self, @mf_root.get_frame)
306
+
307
+ @layout.add_cols(0,0,225)
308
+ @layout.add_rows(0,0,180)
309
+ # @layout.add_rows(0,1,500)
310
+ @layout.add_rows_perc(0,1,70)
311
+
312
+
313
+ @layout.add_headers
314
+ @splash.next_step
315
+ self.load_libs
316
+ @splash.next_step
317
+ @splash.next_step('... load extensions')
318
+ self.load_exts_conf
319
+ self.load_local_config
320
+ self.load_exts
321
+ publish('buffers.code.in_memory',Hash.new)
322
+ publish('action.load_code_from_buffers', proc{TkBuffersChoise.new})
323
+ publish('output.action.run_last', proc{$arcadia['output'].run_last})
324
+ publish('main.action.open_file', proc{self['editor'].open_file(Tk.getOpenFile)})
325
+ @splash.next_step('... load obj controller')
326
+ @splash.next_step('... load editor')
327
+ publish('main.action.new_file',proc{$arcadia['editor'].open_buffer()})
328
+ publish('main.action.edit_cut',proc{$arcadia['editor'].raised.text.text_cut()})
329
+ publish('main.action.edit_copy',proc{$arcadia['editor'].raised.text.text_copy()})
330
+ publish('main.action.edit_paste',proc{$arcadia['editor'].raised.text.text_paste()})
331
+ @splash.next_step('... load actions')
332
+ publish('action.test.keys', proc{KetTest.new})
333
+ publish('action.get.font', proc{Tk::BWidget::SelectFont::Dialog.new.create})
334
+ @splash.next_step
335
+ publish('action.show_about', proc{ArcadiaAboutSplash.new.deiconify})
336
+ # publish('main.menu', @main_menu)
337
+ publish('main.menu', AMainMenu.new(@main_menu))
338
+ @splash.next_step
339
+ publish('objic.action.raise_active_obj',
340
+ proc{
341
+ InspectorContract.instance.raise_active_toplevel(self)
342
+ }
343
+ )
344
+ load_toolbar_buttons
345
+ end
346
+
347
+ def do_exit
348
+ q1 = (Tk.messageBox('icon' => 'question', 'type' => 'yesno',
349
+ 'title' => '(Arcadia) Exit', 'parent' => @root,
350
+ 'message' => "Do you want exit?")=='yes')
351
+ if q1 && can_exit?
352
+ do_finalize
353
+ @root.destroy
354
+ end
355
+ end
356
+
357
+ def can_exit?
358
+ _can_exit = true
359
+ @exts.each{|extension|
360
+ if ext_active?(extension) && !self[extension].can_exit_query
361
+ _can_exit = false
362
+ break
363
+ end
364
+ }
365
+ return _can_exit
366
+ end
367
+
368
+ def do_finalize
369
+ @exts.each{|extension|
370
+ self[extension].finalize if ext_active?(extension)
371
+ }
372
+ self.write_persist
373
+ end
374
+ end
375
+
376
+
377
+ class AMainMenu < TkMenubar
378
+
379
+ def initialize(menu)
380
+ # create main menu
381
+ @menu = menu
382
+ build
383
+ menu.foreground('grey40')
384
+ menu.activeforeground('red')
385
+ menu.relief('groove')
386
+ menu.borderwidth(0)
387
+ menu.font($arcadia['conf']['main.mainmenu.font'])
388
+ end
389
+
390
+ def build
391
+ menu_spec_file = [
392
+ ['File', 0],
393
+ ['Open', $arcadia['main.action.open_file'], 0],
394
+ ['New', $arcadia['main.action.new_file'], 0],
395
+ ['Save', proc{EditorContract.instance.save_file_raised(self)},0],
396
+ ['Save as ...', proc{EditorContract.instance.save_as_file_raised(self)},0],
397
+ '---',
398
+ ['Quit', $arcadia['action.on_exit'], 0]]
399
+ menu_spec_edit = [['Edit', 0],
400
+ ['Cut', $arcadia['main.action.edit_cut'], 2],
401
+ ['Copy', $arcadia['main.action.edit_copy'], 0],
402
+ ['Paste', $arcadia['main.action.edit_paste'], 0]]
403
+ menu_spec_search = [['Search', 0],
404
+ ['Find ...', proc{EditorContract.instance.show_search_dialog(self)}, 2],
405
+ ['Go to line ...', proc{EditorContract.instance.show_goto_line_dialog(self)}, 2]]
406
+ menu_spec_view = [['View', 0],['Show/Hide Toolbar', proc{$arcadia.show_hide_toolbar}, 2]]
407
+ menu_spec_tools = [['Tools', 0],
408
+ ['Build ruby doc tree', proc{EditorContract.instance.build_doc_tree(self)}, 2],
409
+ ['Keys-test', $arcadia['action.test.keys'], 2]
410
+ ]
411
+ menu_spec_help = [['Help', 0],
412
+ ['About', $arcadia['action.show_about'], 2],]
413
+ @menu.add_menu(menu_spec_file)
414
+ @menu.add_menu(menu_spec_edit)
415
+ @menu.add_menu(menu_spec_search)
416
+ @menu.add_menu(menu_spec_view)
417
+ @menu.add_menu(menu_spec_tools)
418
+ @menu.add_menu(menu_spec_help)
419
+ end
420
+
421
+ end
422
+
423
+
424
+ class ArcadiaAboutSplash < TkToplevel
425
+ attr :progress
426
+
427
+ def initialize(_txt=nil)
428
+ #_bgcolor = '#B83333'
429
+ _bgcolor = '#000000'
430
+ super()
431
+ relief 'flat'
432
+ background _bgcolor
433
+ highlightbackground _bgcolor
434
+ highlightthickness 6
435
+ borderwidth 1
436
+ withdraw
437
+ overrideredirect(true)
438
+
439
+ @tkLabel3 = TkLabel.new(self){
440
+ image TkPhotoImage.new('format'=>'GIF','data' =>A_LOGO_GIF)
441
+ background _bgcolor
442
+ place('x'=> 20,'y' => 20)
443
+ }
444
+ @tkLabel1 = TkLabel.new(self){
445
+ text 'Arcadia'
446
+ background _bgcolor
447
+ foreground '#ffffff'
448
+ font Arcadia.instance['conf']['splash.title.font']
449
+ justify 'left'
450
+ place('width' => '190','x' => 120,'y' => 10,'height' => 25)
451
+ }
452
+ @tkLabelRuby = TkLabel.new(self){
453
+ image TkPhotoImage.new('data' =>RUBY_DOCUMENT_GIF)
454
+ background _bgcolor
455
+ place('x'=> 150,'y' => 40)
456
+ }
457
+ @tkLabel2 = TkLabel.new(self){
458
+ text 'Ruby ide'
459
+ background _bgcolor
460
+ foreground '#ffffff'
461
+ font Arcadia.instance['conf']['splash.subtitle.font']
462
+ justify 'left'
463
+ place('width' => '90','x' => 170,'y' => 40,'height' => 19)
464
+ }
465
+ @tkLabelVersion = TkLabel.new(self){
466
+ text 'version: '+$arcadia['applicationParams'].version
467
+ background _bgcolor
468
+ foreground '#ffffff'
469
+ font Arcadia.instance['conf']['splash.version.font']
470
+ justify 'left'
471
+ place('width' => '100','x' => 150,'y' => 60,'height' => 19)
472
+ }
473
+ @tkLabelStep = TkLabel.new(self){
474
+ text _txt
475
+ background _bgcolor
476
+ foreground 'yellow'
477
+ font Arcadia.instance['conf']['splash.banner.font']
478
+ justify 'left'
479
+ anchor 'w'
480
+ place('width'=>-5,'relwidth' => 1,'x' => 5,'y' => 175,'height' => 19)
481
+ }
482
+ @tkLabel21 = TkLabel.new(self){
483
+ text 'by Antonio Galeone - 2007'
484
+ background _bgcolor
485
+ foreground '#ffffff'
486
+ font Arcadia.instance['conf']['splash.credits.font']
487
+ justify 'left'
488
+ place('width' => '190','x' => 130,'y' => 146,'height' => 19)
489
+ }
490
+ @progress = TkVariable.new
491
+ reset
492
+ _width = 340
493
+ _height = 210
494
+ #_width = 0;_height = 0
495
+ _x = TkWinfo.screenwidth(self)/2 - _width / 2
496
+ _y = TkWinfo.screenheight(self)/2 - _height / 2
497
+ geometry = _width.to_s+'x'+_height.to_s+'+'+_x.to_s+'+'+_y.to_s
498
+ Tk.tk_call('wm', 'geometry', self, geometry )
499
+ bind("Double-Button-1", proc{self.destroy})
500
+ end
501
+
502
+ def set_progress(_max=10)
503
+ @max = _max
504
+ Tk::BWidget::ProgressBar.new(self, :width=>150, :height=>10,
505
+ :background=>'black',
506
+ :foreground=>'yellow',
507
+ :variable=>@progress,
508
+ :borderwidth=>0,
509
+ :relief=>'flat',
510
+ :maximum=>_max).place('width' => '150','x' => 145,'y' => 95,'height' => 15)
511
+ end
512
+
513
+ def reset
514
+ @progress.value = -1
515
+ end
516
+
517
+ def next_step(_txt = nil)
518
+ @progress.numeric += 1
519
+ labelStep(_txt) if _txt
520
+ end
521
+
522
+ def labelStep(_txt)
523
+ @tkLabelStep.text = _txt
524
+ Tk.update
525
+ end
526
+
527
+ def last_step(_txt = nil)
528
+ @progress.numeric = @max
529
+ labelStep(_txt) if _txt
530
+ end
531
+
532
+ end
533
+
534
+ class TkBuffersChoiseView < TkToplevel
535
+
536
+ def initialize
537
+ super
538
+ Tk.tk_call('wm', 'title', self, '...hello' )
539
+ Tk.tk_call('wm', 'geometry', self, '150x217+339+198' )
540
+ @lb = TkListbox.new(self){
541
+ background '#fedbd7'
542
+ relief 'groove'
543
+ place('relwidth' => '1','relx' => 0,'x' => '0','y' => '0','relheight' => '1','rely' => 0,'height' => '0','bordermode' => 'inside','width' => '0')
544
+ }
545
+ end
546
+
547
+ end
548
+
549
+ class TkBuffersChoise < TkBuffersChoiseView
550
+
551
+ def initialize
552
+ super
553
+ @lb.value= $arcadia['buffers.code.in_memory'].keys
554
+ @lb.bind("Double-ButtonPress-1",proc{
555
+ _sel = @lb.get('active')
556
+ Revparsel.new($arcadia['buffers.code.in_memory'][_sel])
557
+ @lb.delete('active')
558
+ $arcadia['buffers.code.in_memory'].delete(_sel)
559
+ destroy
560
+ })
561
+ raise
562
+ end
563
+
564
+ end
565
+
566
+ class ArcadiaLayout
567
+ include Observable
568
+ ArcadiaPanelInfo = Struct.new( "ArcadiaPanelInfo",
569
+ :name,
570
+ :title,
571
+ :frame
572
+ )
573
+
574
+ def initialize(_arcadia, _frame, _autotab=true)
575
+ @arcadia = _arcadia
576
+ @frames = Array.new
577
+ @frames[0] = Array.new
578
+ @frames[0][0] = _frame
579
+ @domains = Array.new
580
+ @domains[0] = Array.new
581
+ @domains[0][0] = '_domain_root_'
582
+ @panels = Hash.new
583
+ @panels['_domain_root_']= Hash.new
584
+ @panels['_domain_root_']['root']= _frame
585
+ @panels['_domain_root_']['sons'] = Hash.new
586
+ @autotab = _autotab
587
+ @headed = false
588
+ ArcadiaContractListener.new(self, MainContract, :do_main_event)
589
+ end
590
+ def root
591
+ @panels['_domain_root_']['root']
592
+ end
593
+ def do_main_event(_event)
594
+ case _event.signature
595
+ when MainContract::RAISE_EXTENSION
596
+ p = @panels[_event.context.domain]
597
+ if p && p['notebook'] != nil && _event.channel == '0'
598
+ p['notebook'].raise(_event.context.extension)
599
+ end
600
+ end
601
+ end
602
+
603
+ def _prepare_rows(_row,_col, _height, _perc=false, _top_name=nil, _bottom_name=nil)
604
+ if (@frames[_row][_col] != nil)
605
+ _h = AGTkOSplittedFrames.new(@frames[_row][_col],_height, _perc)
606
+ if @frames[_row + 1] == nil
607
+ @frames[_row + 1] = Array.new
608
+ @domains[_row + 1] = Array.new
609
+ end
610
+ @frames[_row][_col] = _h.top_frame
611
+ @frames[_row + 1][_col] = _h.bottom_frame
612
+
613
+ _top_name = _row.to_s+'.'+_col.to_s if _top_name == nil
614
+ @panels[_top_name] = Hash.new
615
+ @panels[_top_name]['root'] = @frames[_row][_col]
616
+ @panels[_top_name]['sons'] = Hash.new
617
+ @domains[_row][_col] = _top_name
618
+
619
+ _bottom_name = (_row+1).to_s+'.'+_col.to_s if _bottom_name == nil
620
+ @panels[_bottom_name] = Hash.new
621
+ @panels[_bottom_name]['root'] = @frames[_row + 1][_col]
622
+ @panels[_bottom_name]['sons'] = Hash.new
623
+ @domains[_row + 1][_col] = _bottom_name
624
+ end
625
+ end
626
+ private :_prepare_rows
627
+
628
+ def add_rows(_row,_col, _height, _top_name=nil, _bottom_name=nil)
629
+ _prepare_rows(_row,_col, _height, false, _top_name, _bottom_name)
630
+ end
631
+
632
+ def add_rows_perc(_row,_col, _height, _top_name=nil, _bottom_name=nil)
633
+ _prepare_rows(_row,_col, _height, true, _top_name, _bottom_name)
634
+ end
635
+
636
+
637
+ def add_cols(_row,_col, _width, _left_name=nil, _right_name=nil)
638
+ if (@frames[_row][_col] != nil)
639
+ _w = AGTkVSplittedFrames.new(@frames[_row][_col],_width)
640
+ @frames[_row][_col] = _w.left_frame
641
+ @frames[_row][_col + 1] = _w.right_frame
642
+
643
+ _left_name = _row.to_s+'.'+_col.to_s if _left_name == nil
644
+ @panels[_left_name] = Hash.new
645
+ @panels[_left_name]['root'] = @frames[_row][_col]
646
+ @panels[_left_name]['sons'] = Hash.new
647
+ @domains[_row][_col] = _left_name
648
+
649
+ _right_name = _row.to_s+'.'+(_col+1).to_s if _right_name == nil
650
+ @panels[_right_name] = Hash.new
651
+ @panels[_right_name]['root'] = @frames[_row][_col + 1]
652
+ @panels[_right_name]['sons'] = Hash.new
653
+ @domains[_row][_col + 1] = _right_name
654
+ end
655
+ end
656
+
657
+ def add_headers
658
+ @domains.each{|row|
659
+ row.each{|domain|
660
+ @panels[domain]['root']= TkTitledFrame.new(@panels[domain]['root'], '...').place('x'=>0, 'y'=>0,'relheight'=>1, 'relwidth'=>1) if @panels[domain]
661
+ }
662
+ }
663
+ @headed = true
664
+ end
665
+
666
+ def headed?
667
+ @headed
668
+ end
669
+
670
+ def autotab?
671
+ @autotab
672
+ end
673
+
674
+ def registed?(_domain_name, _name)
675
+ @panels[_domain_name]['sons'][_name] != nil
676
+ end
677
+
678
+ def register_panel(_domain_name, _name, _title)
679
+ p = @panels[_domain_name]
680
+ if p!=nil
681
+ num = p['sons'].length
682
+ if @headed
683
+ p['root'].title(_title)
684
+ root_frame = p['root'].frame
685
+ else
686
+ root_frame = p['root']
687
+ end
688
+ if (num == 0 && @autotab)
689
+ api = ArcadiaPanelInfo.new(_name,_title,nil)
690
+ api.frame = TkFrame.new(root_frame).place('x'=>0, 'y'=>0, 'relwidth'=>1, 'relheight'=>1)
691
+ p['sons'][_name] = api
692
+ return api.frame
693
+ else
694
+ if num == 1 && @autotab && p['notebook'] == nil
695
+ p['notebook'] = Tk::BWidget::NoteBook.new(root_frame){
696
+ tabbevelsize 0
697
+ internalborderwidth 0
698
+ pack('fill'=>'both', :padx=>0, :pady=>0, :expand => 'yes')
699
+ }
700
+ api = p['sons'].values[0]
701
+ api_tab_frame = p['notebook'].insert('end',
702
+ api.name,
703
+ 'text'=>api.title,
704
+ 'raisecmd'=>proc{
705
+ p['root'].title(api.title)
706
+ p['root'].top_text('')
707
+ changed
708
+ notify_observers('RAISE', api.name)
709
+ }
710
+ )
711
+ api.frame.place('in'=>api_tab_frame, 'x'=>0, 'y'=>0, 'relwidth'=>1, 'relheight'=>1)
712
+ api.frame.raise
713
+ elsif (num==0 && !@autotab)
714
+ p['notebook'] = Tk::BWidget::NoteBook.new(root_frame){
715
+ tabbevelsize 0
716
+ internalborderwidth 0
717
+ pack('fill'=>'both', :padx=>0, :pady=>0, :expand => 'yes')
718
+ }
719
+ end
720
+ _panel = p['notebook'].insert('end',_name ,
721
+ 'text'=>_title,
722
+ #'background'=>_tab_bg,
723
+ 'raisecmd'=>proc{
724
+ p['root'].title(_title)
725
+ changed
726
+ notify_observers('RAISE', _name)
727
+ }
728
+ )
729
+
730
+ # if _tab_bg
731
+ # _panel = p['notebook'].insert('end',_name , 'text'=>_title, 'background'=>_tab_bg)
732
+ # else
733
+ # _panel = p['notebook'].insert('end',_name , 'text'=>_title)
734
+ # end
735
+ p['sons'][_name] = ArcadiaPanelInfo.new(_name,_title,_panel)
736
+ p['notebook'].raise(_name)
737
+ return _panel
738
+ end
739
+ end
740
+ end
741
+
742
+ def unregister_panel(_domain_name, _name)
743
+ @panels[_domain_name]['sons'].delete(_name)
744
+ @panels[_domain_name]['notebook'].delete(_name)
745
+ new_raise_key = @panels[_domain_name]['sons'].keys[@panels[_domain_name]['sons'].length-1]
746
+ @panels[_domain_name]['notebook'].raise(new_raise_key)
747
+ end
748
+
749
+ def raise_panel(_domain_name, _name)
750
+ @panels[_domain_name]['notebook'].raise(_name) if @panels[_domain_name] && @panels[_domain_name]['notebook']
751
+ end
752
+
753
+ def [](_row, _col)
754
+ @frames[_row][_col]
755
+ end
756
+
757
+ def frame(_domain_name, _name)
758
+ @panels[_domain_name]['sons'][_name].frame
759
+ end
760
+
761
+ def domain(_domain_name)
762
+ @panels[_domain_name]
763
+ end
764
+
765
+ def domain_root_frame(_domain_name)
766
+ @panels[_domain_name]['root'].frame
767
+ end
768
+ end
769
+
770
+ Arcadia.new.run