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.
@@ -1,993 +1,993 @@
1
- #
2
- # a-utils.rb - Arcadia Ruby ide
3
- # by Antonio Galeone <antonio-galeone@rubyforge.org>
4
- #
5
-
6
- require 'lib/tk/al-tk'
7
-
8
- class AGTkSplittedFrames < TkFrame
9
- def initialize(parent=nil, length=10, keys=nil)
10
- super(parent, keys)
11
- @parent = parent
12
- @slen = 5
13
- relief 'groove'
14
- end
15
-
16
- def maximize(_frame)
17
- p = TkWinfo.parent(@parent)
18
- if p.kind_of?(AGTkSplittedFrames)
19
- p.maximize(@parent)
20
- end
21
- end
22
-
23
- def minimize(_frame)
24
- p = TkWinfo.parent(@parent)
25
- if p.kind_of?(AGTkSplittedFrames)
26
- p.minimize(@parent)
27
- end
28
- end
29
-
30
- end
31
-
32
-
33
- class AGTkVSplittedFrames < AGTkSplittedFrames
34
- attr_reader :left_frame, :right_frame
35
- def initialize(parent=nil, width=10, keys=nil)
36
- super(parent, width, keys)
37
-
38
- self.pack(:expand=>true, :fill=>:both)
39
- @left_frame = TkFrame.new(self){
40
- relief 'flat'
41
- }
42
- x = width
43
- @left_frame.place(
44
- 'relx' => 0,
45
- 'x' => 0,
46
- 'y' => '0',
47
- 'relheight' => '1',
48
- 'rely' => 0,
49
- 'bordermode' => 'inside',
50
- 'width' => x
51
- )
52
- @left_frame_obj = AGTkObjPlace.new(@left_frame, 'x', nil, false)
53
- @left_frame_obj.width = x
54
- @left_frame_obj.height = 0
55
- @left_frame_obj.relwidth = 0
56
- @left_frame_obj.relheight = 1
57
-
58
- @splitter_frame = TkFrame.new(self){
59
- relief 'raised'
60
- border 1
61
- }
62
-
63
- @splitter_frame.place(
64
- 'relx' => 0,
65
- 'x' => x,
66
- 'y' => '0',
67
- 'relheight' => '1',
68
- 'rely' => 0,
69
- 'bordermode' => 'inside',
70
- 'width' => @slen
71
- )
72
- @splitter_frame.bind_append(
73
- "ButtonRelease-1",
74
- proc{do_resize}
75
- )
76
- _self = self
77
- @b_left = TkButton.new{
78
- image TkPhotoImage.new('dat'=>LEFT_SIDE_GIF)
79
- }
80
-
81
- @b_right = TkButton.new{
82
- image TkPhotoImage.new('dat'=>RIGHT_SIDE_GIF)
83
- }
84
- @proc_unplace = proc{
85
- @b_left.unplace
86
- @b_right.unplace
87
- }
88
- @splitter_frame.bind_append(
89
- "B1-Motion",
90
- proc{@splitter_frame.raise;@proc_unplace.call}
91
- )
92
- @@last_b_left = nil
93
- @@last_b_right = nil
94
- @b_left.bind_append('ButtonPress-1',proc{_self.hide_left;@proc_unplace.call})
95
- @b_right.bind_append('ButtonPress-1',proc{_self.hide_right;@proc_unplace.call})
96
- @proc_place = proc{|x,y|
97
- if !TkWinfo.mapped?(@b_left)
98
- _x = TkWinfo.pointerx(self) - 10
99
- _y = TkWinfo.pointery(self) - 20
100
- if @@last_b_left != nil
101
- @@last_b_left.unplace
102
- @@last_b_right.unplace
103
- end
104
- @b_left.place('x'=>_x,'y'=>_y,'border'=>'outside')
105
- @b_right.place('x'=>_x,'y'=>_y+25,'border'=>'outside')
106
- @b_left.raise
107
- @b_right.raise
108
- @@last_b_left = @b_left
109
- @@last_b_right = @b_right
110
- if @thread_unplace
111
- @thread_unplace.kill
112
- end
113
- @thread_unplace= Thread.new {
114
- sleep(5)
115
- @proc_unplace.call
116
- kill
117
- }
118
- end
119
- }
120
-
121
- @splitter_frame.bind_append(
122
- 'ButtonPress-1',
123
- proc{|x,y|
124
- @thread_place= Thread.new {
125
- @proc_place.call(x,y)
126
- }
127
- }, "%x %y")
128
-
129
- @splitter_frame.bind_append(
130
- "Enter",
131
- proc{
132
- @color_save = @splitter_frame.background
133
- @splitter_frame.background('#9aa6a7')}
134
- )
135
- @splitter_frame.bind_append(
136
- "Leave",
137
- proc{
138
- @splitter_frame.background(@color_save)
139
- }
140
- )
141
- @splitter_frame_obj = AGTkObjPlace.new(@splitter_frame, 'x')
142
- @splitter_frame_obj.width = @slen
143
- @splitter_frame_obj.height = 0
144
- @splitter_frame_obj.relwidth = 0
145
- @splitter_frame_obj.relheight = 1
146
- x = x + @slen
147
- @right_frame = TkFrame.new(self){
148
- relief 'flat'
149
- }
150
- @right_frame.place(
151
- 'relwidth' => 1,
152
- 'relx' => 0,
153
- 'x' => x,
154
- 'y' => 0,
155
- 'width' => -x,
156
- 'relheight' => 1,
157
- 'rely' => 0,
158
- 'bordermode' => 'inside'
159
- )
160
- @right_frame_obj = AGTkObjPlace.new(@right_frame, 'x', nil, false)
161
- @right_frame_obj.width = -x
162
- @right_frame_obj.height = 0
163
- @right_frame_obj.relwidth = 1
164
- @right_frame_obj.relheight = 1
165
- @state = 'middle'
166
- yield(self) if block_given?
167
- end
168
-
169
- def get_main_x
170
- if TkWinfo.manager(@parent)=='place'
171
- return TkPlace.info(@parent)['x'] / 2
172
- else
173
- return 20
174
- end
175
- end
176
-
177
- def do_resize
178
- _x = @splitter_frame_obj.x0
179
- _w = @splitter_frame_obj.w
180
- @left_frame_obj.width = _x
181
- @left_frame_obj.go(_x,0)
182
- @right_frame_obj.width = - _x - _w
183
- @right_frame_obj.amove(_x + _w,0)
184
- end
185
-
186
- def hide_left
187
- if (@state=='left')
188
- _w = @last
189
- @state = 'middle'
190
- @left_frame_obj.width = _w
191
- @left_frame_obj.go(_w,0)
192
- else
193
- _w = 0
194
- @state = 'right'
195
- @last = @left_frame_obj.w
196
- end
197
- @left_frame_obj.amove(0,0)
198
- @splitter_frame_obj.amove(_w,0)
199
- @right_frame_obj.width = - _w - @slen
200
- @right_frame_obj.amove(_w + @slen,0)
201
- end
202
-
203
- def hide_right
204
- if (@state=='right')
205
- _w = @last
206
- @state = 'middle'
207
- else
208
- _w = @right_frame_obj.w + @left_frame_obj.w #+ @slen
209
- @state = 'left'
210
- @last = @left_frame_obj.w
211
- end
212
- @right_frame_obj.width = - _w - @slen
213
- @right_frame_obj.amove(_w + @slen,0)
214
- @splitter_frame_obj.amove(_w,0)
215
- @left_frame_obj.width = _w
216
- @left_frame_obj.go(_w,0)
217
- end
218
-
219
- def maximize(_frame)
220
- super(_frame)
221
- case _frame
222
- when left_frame
223
- hide_right
224
- when right_frame
225
- hide_left
226
- end
227
- Tk.update
228
- end
229
-
230
- def minimize(_frame)
231
- super(_frame)
232
- case _frame
233
- when left_frame
234
- hide_left
235
- when right_frame
236
- hide_right
237
- end
238
- Tk.update
239
- end
240
-
241
- def hide(_name)
242
- end
243
-
244
- def show(_name)
245
- end
246
-
247
- end
248
-
249
- class AGTkOSplittedFrames < AGTkSplittedFrames
250
- attr_reader :top_frame, :bottom_frame
251
- def initialize(parent=nil, height=10, perc=false,keys=nil)
252
- super(parent, height, keys)
253
- self.place(
254
- 'relwidth' => 1,
255
- 'relx' => 0,
256
- 'x' => 0,
257
- 'y' => 0,
258
- 'relheight' => 1,
259
- 'rely' => 0,
260
- 'bordermode' => 'inside'
261
- )
262
- @top_frame = TkFrame.new(self){
263
- relief 'flat'
264
- }
265
- if perc
266
- p_height = TkWinfo.screenheight(self)
267
- y = (p_height/100*height).to_i
268
- else
269
- y = height
270
- end
271
- @top_frame.place(
272
- 'relwidth' => '1',
273
- 'bordermode' => 'inside',
274
- 'height' => y
275
- )
276
- @top_frame_obj = AGTkObjPlace.new(@top_frame, 'y', nil, false)
277
- @top_frame_obj.width = 0
278
- @top_frame_obj.height = y
279
- @top_frame_obj.relwidth = 1
280
- @top_frame_obj.relheight = 0
281
- @splitter_frame = TkFrame.new(self){
282
- relief 'groove'
283
- border 1
284
- }
285
- @splitter_frame.place(
286
- 'relx' => 0,
287
- 'x' => 0,
288
- 'y' => y,
289
- 'relwidth' => '1',
290
- 'rely' => 0,
291
- 'bordermode' => 'inside',
292
- 'height' => @slen
293
- )
294
- @splitter_frame.bind_append(
295
- "B1-Motion",
296
- proc{@splitter_frame.raise}
297
- )
298
- @splitter_frame.bind_append(
299
- "ButtonRelease-1",
300
- proc{do_resize}
301
- )
302
- @splitter_frame_obj = AGTkObjPlace.new(@splitter_frame, 'y')
303
- @splitter_frame_obj.width = 0
304
- @splitter_frame_obj.height = @slen
305
- @splitter_frame_obj.relwidth = 1
306
- @splitter_frame_obj.relheight = 0
307
- y = y + @slen
308
- @bottom_frame = TkFrame.new(self){
309
- relief 'flat'
310
- }
311
- @bottom_frame.place(
312
- 'relwidth' => 1,
313
- 'relx' => 0,
314
- 'x' => 0,
315
- 'y' => y,
316
- 'height' => -y,
317
- 'relheight' => 1,
318
- 'rely' => 0,
319
- 'bordermode' => 'inside'
320
- )
321
- @bottom_frame_obj = AGTkObjPlace.new(@bottom_frame, 'y', nil, false)
322
- @bottom_frame_obj.width = 0
323
- @bottom_frame_obj.height = -y
324
- @bottom_frame_obj.relwidth = 1
325
- @bottom_frame_obj.relheight = 1
326
- _xbutton = TkButton.new(@splitter_frame){
327
- background '#4966d7'
328
- overrelief 'raised'
329
- relief 'flat'
330
- }
331
- _xbutton.place(
332
- 'x' => 0,
333
- 'y' => 0,
334
- 'relheight' => 1,
335
- 'bordermode' => 'outside',
336
- 'width' => 20
337
- )
338
- _xbutton.bind_append(
339
- "ButtonPress-1",
340
- proc{hide_top}
341
- )
342
- _ybutton = TkButton.new(@splitter_frame){
343
- background '#118124'
344
- overrelief 'raised'
345
- relief 'flat'
346
- }
347
- _ybutton.place(
348
- 'x' => 21,
349
- 'y' => 0,
350
- 'bordermode' => 'outside',
351
- 'width' => 20,
352
- 'relheight' => 1
353
- )
354
- _ybutton.bind_append(
355
- "ButtonPress-1",
356
- proc{hide_bottom}
357
- )
358
- @state = 'middle'
359
- yield(self) if block_given?
360
- end
361
-
362
- def hide_top
363
- if (@state=='top')
364
- _h = @last
365
- @state = 'middle'
366
- @top_frame_obj.height = _h
367
- @top_frame_obj.go(0,_h)
368
- elsif (@state=='bottom')
369
- return
370
- else
371
- _h = 0
372
- @state = 'bottom'
373
- @last = @top_frame_obj.h
374
- end
375
- @top_frame_obj.amove(0,0)
376
- @splitter_frame_obj.amove(0, _h)
377
- @bottom_frame_obj.height = - _h - @slen
378
- @bottom_frame_obj.amove(0,_h + @slen)
379
- end
380
-
381
- def hide_bottom
382
- if (@state=='bottom')
383
- _h = @last
384
- @state = 'middle'
385
- elsif (@state == 'top')
386
- return
387
- else
388
- _h = @bottom_frame_obj.h + @top_frame_obj.h #+ @slen
389
- @state = 'top'
390
- @last = @top_frame_obj.h #+ @slen
391
- end
392
- @bottom_frame_obj.height = - _h - @slen
393
- @bottom_frame_obj.amove(0,_h + @slen)
394
- @splitter_frame_obj.amove(0,_h)
395
- @top_frame_obj.height = _h
396
- @top_frame_obj.go(0,_h)
397
- end
398
-
399
-
400
- def maximize(_frame)
401
- super(_frame)
402
- case _frame
403
- when top_frame
404
- hide_bottom
405
- when bottom_frame
406
- hide_top
407
- end
408
- Tk.update
409
- end
410
-
411
- def minimize(_frame)
412
- super(_frame)
413
- case _frame
414
- when top_frame
415
- hide_top
416
- when bottom_frame
417
- hide_bottom
418
- end
419
- Tk.update
420
- end
421
-
422
-
423
- def get_main_y
424
- return 40
425
- end
426
-
427
- def do_resize
428
- _y = @splitter_frame_obj.y0
429
- _h = @splitter_frame_obj.h
430
- @top_frame_obj.height = _y
431
- @top_frame_obj.go(0,_y)
432
- @bottom_frame_obj.height = -_y-_h
433
- @bottom_frame_obj.amove(0,_y + _h)
434
- #end
435
- end
436
-
437
- def hide(_name)
438
- end
439
-
440
- def show(_name)
441
- end
442
-
443
- end
444
-
445
- class TkBaseTitledFrame < TkFrame
446
- attr_reader :frame
447
- attr_reader :top
448
-
449
- def initialize(parent=nil, *args)
450
- super(parent, *args)
451
- @parent = parent
452
- @title_height = 18
453
- @top = TkFrame.new(self){
454
- background '#303b50'
455
- #foreground 'white'
456
- #anchor 'w'
457
- }.place('x'=>0, 'y'=>0,'height'=>@title_height, 'relwidth'=>1)
458
- #.pack('fill'=> 'x','ipady'=> @title_height, 'side'=>'top')
459
-
460
-
461
- @frame = create_frame
462
-
463
-
464
-
465
- @button_frame=TkFrame.new(@top){
466
- #background '#303b50'
467
- }.pack('side'=> 'right','anchor'=> 'w')
468
-
469
- self.head_buttons
470
- end
471
-
472
- def create_frame
473
- return TkFrame.new(self).place('x'=>0, 'y'=>@title_height,'height'=>-@title_height,'relheight'=>1, 'relwidth'=>1)
474
- #pack('fill'=>'both','expand'=> 1, 'anchor'=>'center')
475
- #
476
- end
477
-
478
- def add_button(_label,_proc=nil,_image=nil, _side= 'right')
479
- TkButton.new(@button_frame){
480
- text _label if _label
481
- image TkPhotoImage.new('dat' => _image) if _image
482
- relief 'flat'
483
- font 'helvetica 8 bold'
484
- #borderwidth 0
485
- #background '#303b50'
486
- #background '#8080ff'
487
- pack('side'=> _side,'anchor'=> 'e')
488
- bind('1',_proc) if _proc
489
- }
490
- end
491
-
492
- def head_buttons
493
- @bmaxmin = add_button('[ ]',proc{resize}, W_MAX_GIF)
494
- end
495
-
496
- end
497
-
498
-
499
-
500
- class TkTitledFrame < TkBaseTitledFrame
501
- attr_reader :frame
502
- attr_reader :top
503
-
504
- def initialize(parent=nil, title='...', img=nil , keys=nil)
505
- super(parent, keys)
506
- @state = 'normal'
507
- @title_label =TkLabel.new(@top){
508
- text title+' :: '
509
- anchor 'w'
510
- font $arcadia['conf']['all.frame.title.font']
511
- background '#303b50'
512
- foreground '#e8e651'
513
- compound 'left'
514
- image TkAllPhotoImage.new('file' => img) if img
515
- pack('side'=> 'left','anchor'=> 'e')
516
- }
517
- @top_label =TkLabel.new(@top){
518
- anchor 'w'
519
- font $arcadia['conf']['all.frame.title.font.italic']
520
- background '#303b50'
521
- foreground '#FFFFFF'
522
- compound 'left'
523
- pack('side'=> 'left','anchor'=> 'e')
524
- }
525
-
526
- @ap = Array.new
527
- @apx = Array.new
528
- @apy = Array.new
529
- @apw = Array.new
530
- @aph = Array.new
531
- end
532
-
533
- def top_text(_text)
534
- @top_label.text(_text)
535
- end
536
-
537
- def title(_text)
538
- @title_label.text(_text+'::')
539
- end
540
-
541
-
542
- def add_sep(_width=0,_background =@top.background)
543
- TkLabel.new(@top){||
544
- text ''
545
- background _background
546
- pack('side'=> 'right','anchor'=> 'e', 'ipadx'=>_width)
547
- }
548
- end
549
-
550
-
551
- def head_buttons
552
- @bmaxmin = add_button('[ ]',proc{resize}, W_MAX_GIF)
553
- #@bmaxmin = add_button('[ ]',proc{resize}, EXPAND_GIF)
554
- end
555
-
556
- def resize
557
- p = TkWinfo.parent(@parent)
558
- if @state == 'normal'
559
- if p.kind_of?(AGTkSplittedFrames)
560
- p.maximize(@parent)
561
- @bmaxmin.image(TkPhotoImage.new('dat' => W_NORM_GIF))
562
- end
563
- @state = 'maximize'
564
- else
565
- if p.kind_of?(AGTkSplittedFrames)
566
- p.minimize(@parent)
567
- @bmaxmin.image(TkPhotoImage.new('dat' =>W_MAX_GIF))
568
- end
569
- @state = 'normal'
570
- end
571
- self.raise
572
- end
573
-
574
- def maximize
575
- if @state == 'normal'
576
- p = TkWinfo.parent(self)
577
- while (p != nil) && (TkWinfo.manager(p)=='place')
578
- Tk.messageBox('message'=>p.to_s)
579
- @ap << p
580
- @apx << TkPlace.info(p)['x']
581
- @apy << TkPlace.info(p)['y']
582
- @apw << TkPlace.info(p)['width']
583
- @aph << TkPlace.info(p)['height']
584
- p.place('x'=>0, 'y'=>0,'relheight'=>1, 'relwidth'=>1)
585
- p.raise
586
- p = TkWinfo.parent(p)
587
- end
588
- @state = 'maximize'
589
- self.raise
590
- else
591
- @ap.each_index{|i|
592
- @ap[i].place('x'=>@apx[i], 'y'=>@apy[i],'width'=>@apw[i], 'height'=>@aph[i],'relheight'=>1, 'relwidth'=>1)
593
- @ap[i].raise
594
- }
595
- self.raise
596
- @ap.clear
597
- @apx.clear
598
- @apy.clear
599
- @state = 'normal'
600
- end
601
- end
602
- end
603
-
604
- class TkTitledScrollFrame < TkTitledFrame
605
-
606
- def create_frame
607
- return Tk::ScrollFrame.new(self,:scrollbarwidth=>10, :width=>300, :height=>200).place('x'=>0, 'y'=>@title_height,'height'=>-@title_height,'relheight'=>1, 'relwidth'=>1)
608
- end
609
-
610
- end
611
-
612
-
613
-
614
- class Application
615
- ApplicationParams = Struct.new( "ApplicationParams",
616
- :name,
617
- :version,
618
- :config_file,
619
- :persistent_file
620
- )
621
-
622
- def initialize(_ap=ApplicationParams.new)
623
- @@instance = self
624
- eval('$'+_ap.name+'=self')
625
- publish('applicationParams', _ap)
626
- publish(_ap.name,self)
627
- @first_run = false
628
- init_config
629
- yield(self) if block_given?
630
- end
631
-
632
- def Application.instance
633
- @@instance
634
- end
635
-
636
- def init_config
637
- self['applicationParams'].persistent_file = File.join(local_dir, self['applicationParams'].name+'.pers')
638
- if !File.exists?(self['applicationParams'].persistent_file)
639
- File.new(self['applicationParams'].persistent_file, File::CREAT).close
640
- end
641
- publish('conf', config_file2hash(self['applicationParams'].config_file)) if self['applicationParams'].config_file
642
- publish('pers', config_file2hash(self['applicationParams'].persistent_file)) if self['applicationParams'].persistent_file
643
- end
644
-
645
- def prepare
646
- end
647
-
648
- def publish(_name, _obj)
649
- @objs = Hash.new if !defined?(@objs)
650
- @objs[_name] = _obj
651
- end
652
-
653
- # this method load arcadia.conf from local directory for personalizations
654
- def load_local_config(_create_if_not_exist=true)
655
- local_file_config = File.join(local_dir,File.basename(self['applicationParams'].config_file))
656
- if FileTest.exist?(local_file_config)
657
- self['conf'].update(self.config_file2hash(local_file_config))
658
- elsif _create_if_not_exist
659
- if FileTest.writable?(local_dir)
660
- f = File.new(local_file_config, "w")
661
- begin
662
- if f
663
- p = self['conf']
664
- if p
665
- p.keys.sort.each{|key|
666
- f.syswrite('#'+key+'='+self['conf'][key]+"\n")
667
- }
668
- end
669
- end
670
- ensure
671
- f.close unless f.nil?
672
- end
673
- else
674
- msg = "Locad dir "+'"'+local_dir+'"'+" must be writable!"
675
- Tk.messageBox('icon' => 'error', 'type' => 'ok',
676
- 'title' => '(Arcadia)',
677
- 'message' => msg)
678
- exit
679
-
680
- end
681
- end
682
- end
683
-
684
- def local_dir
685
- _local_dir = File.join(ENV["HOME"],'.'+self['applicationParams'].name) if ENV["HOME"]
686
- if _local_dir && !File.exist?(_local_dir)
687
- if FileTest.exist?(ENV["HOME"])
688
- Dir.mkdir(_local_dir)
689
- @first_run = true
690
- else
691
- msg = "Locad dir "+'"'+ENV["HOME"]+'"'+" must be writable!"
692
- Tk.messageBox('icon' => 'error', 'type' => 'ok',
693
- 'title' => '(Arcadia)',
694
- 'message' => msg)
695
- exit
696
- end
697
- end
698
- return _local_dir
699
- end
700
-
701
- def load_config(_config_file)
702
- if _config_file && FileTest::exist?(_config_file)
703
- f = File::open(_config_file,'r')
704
- begin
705
- _lines = f.readlines
706
- _lines.each{|_line|
707
- _strip_line = _line.strip
708
- if (_strip_line.length > 0)&&(_strip_line[0,1]!='#')
709
- var_plat = _line.split('::')
710
- if var_plat.length > 1
711
- if (RUBY_PLATFORM.include?(var_plat[0]))
712
- #if (var_plat[0] == RUBY_PLATFORM)
713
- _line = var_plat[1]
714
- else
715
- _line = ''
716
- end
717
- end
718
- var = _line.split('=')
719
- if var.length > 1
720
- self['conf'][var[0].strip]=var[1].strip
721
- end
722
- end
723
- }
724
- ensure
725
- f.close unless f.nil?
726
- end
727
- end
728
- end
729
-
730
- def config_file2hash(_config_file)
731
- r_hash = Hash.new
732
- if _config_file && FileTest::exist?(_config_file)
733
- f = File::open(_config_file,'r')
734
- begin
735
- _lines = f.readlines
736
- _lines.each{|_line|
737
- _strip_line = _line.strip
738
- if (_strip_line.length > 0)&&(_strip_line[0,1]!='#')
739
- var_plat = _line.split('::')
740
- if var_plat.length > 1
741
- if (RUBY_PLATFORM.include?(var_plat[0]))
742
- #if (var_plat[0] == RUBY_PLATFORM)
743
- _line = var_plat[1]
744
- else
745
- _line = ''
746
- end
747
- end
748
- var = _line.split('=')
749
- if var.length > 1
750
- r_hash[var[0].strip]=var[1].strip
751
- end
752
- end
753
- }
754
- ensure
755
- f.close unless f.nil?
756
- end
757
- return r_hash
758
- end
759
- end
760
-
761
-
762
- def load_persist(_persist_file)
763
- if _persist_file && !FileTest::exist?(_persist_file)
764
- Dir.mkdir(File.dirname(_persist_file)) unless File.exists?(File.dirname(_persist_file))
765
- File.new(_persist_file, File::CREAT)
766
- end
767
-
768
- if _persist_file && FileTest::exist?(_persist_file)
769
- f = File::open(_persist_file,'r')
770
- begin
771
- _lines = f.readlines
772
- _lines.each{|_line|
773
- _strip_line = _line.strip
774
- if (_strip_line.length > 0)&&(_strip_line[0,1]!='#')
775
- var = _line.split('=')
776
- if var.length > 1
777
- self['pers'][var[0].strip]=var[1].strip
778
- end
779
- end
780
- }
781
- ensure
782
- f.close unless f.nil?
783
- end
784
- end
785
- end
786
-
787
- def write_persist
788
- if FileTest::exist?(self['applicationParams'].persistent_file)
789
- f = File.new(self['applicationParams'].persistent_file, "w")
790
- begin
791
- if f
792
- p = self['pers']
793
- if p
794
- p.each{|key,value|
795
- f.syswrite(key+'='+value+"\n")
796
- }
797
- end
798
- end
799
- ensure
800
- f.close unless f.nil?
801
- end
802
- end
803
- end
804
-
805
- def create(_name, _class)
806
- register(_name,_class.new)
807
- end
808
-
809
- def objects(_name)
810
- return @objs[_name]
811
- end
812
-
813
- def [](_name)
814
- if @objs[_name]
815
- return @objs[_name]
816
- else
817
- raise RuntimeError, "resurce '"+_name+"' unavabled ", caller
818
- end
819
- end
820
-
821
- def run
822
- end
823
- end
824
-
825
- class TkApplication < Application
826
- def run
827
- Tk.mainloop
828
- end
829
- end
830
-
831
- module TkMovable
832
- def start_moving(_moving_obj=self, _moved_obj=self)
833
- @x0 = 0
834
- @y0 = 0
835
- @moving_obj = _moving_obj
836
- @moved_obj = _moved_obj
837
- @moving_obj.bind_append("B1-Motion", proc{|x, y| moving_do_move_obj(x,y)},"%x %y")
838
- @moving_obj.bind_append("ButtonPress-1", proc{|e| moving_do_press(e.x, e.y)})
839
- end
840
-
841
- def stop_moving
842
- @moving_obj.bind_remove("B1-Motion")
843
- @moving_obj.bind_remove("ButtonPress-1")
844
- end
845
-
846
- def moving_do_press(_x, _y)
847
- @x0 = _x
848
- @y0 = _y
849
- end
850
-
851
- def moving_do_move_obj(_x, _y)
852
- _x = TkPlace.info(@moved_obj)['x'] + _x - @x0
853
- _y = TkPlace.info(@moved_obj)['y'] + _y - @y0
854
- @moved_obj.place('x'=>_x, 'y'=>_y)
855
- end
856
-
857
- end
858
-
859
- module TkResizabled
860
- MIN_WIDTH = 50
861
- MIN_HEIGHT = 50
862
- def start_resizing(_moving_obj=self, _moved_obj=self)
863
- @x0 = 0
864
- @y0 = 0
865
- @moving_obj = _moving_obj
866
- @moved_obj = _moved_obj
867
- @moving_obj.bind_append("B1-Motion", proc{|x, y| resizing_do_move_obj(x,y)},"%x %y")
868
- @moving_obj.bind_append("ButtonPress-1", proc{|e| resizing_do_press(e.x, e.y)})
869
- end
870
-
871
- def stop_resizing
872
- @moving_obj.bind_remove("B1-Motion")
873
- @moving_obj.bind_remove("ButtonPress-1")
874
- end
875
-
876
- def resizing_do_press(_x, _y)
877
- @x0 = _x
878
- @y0 = _y
879
- end
880
-
881
- def resizing_do_move_obj(_x, _y)
882
- _width0 = TkPlace.info(@moved_obj)['width']
883
- _height0 = TkPlace.info(@moved_obj)['height']
884
- _width = _width0 + _x - @x0
885
- _height = _height0 + _y -@y0
886
- _width = MIN_WIDTH if _width < MIN_WIDTH
887
- _height = MIN_HEIGHT if _height < MIN_HEIGHT
888
- @moved_obj.place('width'=>_width, 'height'=>_height)
889
- end
890
-
891
- end
892
-
893
-
894
- class TkFloatTitledFrame < TkBaseTitledFrame
895
- include TkMovable
896
- include TkResizabled
897
- def initialize(parent=nil, *args)
898
- super(parent)
899
- frame.place('height'=>-32)
900
- borderwidth 2
901
- relief 'groove'
902
-
903
- @top_label = TkLabel.new(@top){
904
- background '#303b50'
905
- foreground 'white'
906
- anchor 'w'
907
- }.pack('fill'=>'x', 'side'=>'top')
908
- #.place('x'=>0, 'y'=>0,'relheight'=>1, 'relwidth'=>1 ,'width'=>-20)
909
-
910
- @resizing_label=TkLabel.new(self){
911
- #background '#303b50'
912
- text '-'
913
- image TkPhotoImage.new('dat'=>EXPAND_LIGHT_GIF)
914
- }.pack('side'=> 'right','anchor'=> 's')
915
-
916
-
917
- start_moving(@top_label, self)
918
- start_resizing(@resizing_label, self)
919
- end
920
-
921
- def title(_text)
922
- @top_label.text(_text)
923
- end
924
-
925
-
926
- def on_close=(_proc)
927
- add_button('X', _proc, TAB_CLOSE_GIF)
928
- end
929
-
930
- def hide
931
- @manager = TkWinfo.manager(self)
932
- if @manager == 'place'
933
- @x_place = TkPlace.info(self)['x']
934
- @y_place = TkPlace.info(self)['y']
935
- @width_place = TkPlace.info(self)['width']
936
- @height_place = TkPlace.info(self)['height']
937
- self.unplace
938
- end
939
- end
940
-
941
- def show
942
- if @manager == 'place'
943
- self.place('x'=>@x_place, 'y'=>@y_place, 'width'=>@width_place, 'height'=>@height_place)
944
- end
945
- end
946
-
947
- def head_buttons
948
- end
949
-
950
- end
951
-
952
- class TkProgressframe < TkFloatTitledFrame
953
- def initialize(parent=nil, _max=100, *args)
954
- super(parent)
955
- @max = _max
956
- @progress = TkVariable.new
957
- @progress.value = -1
958
- Tk::BWidget::ProgressBar.new(self, :width=>150, :height=>10,
959
- :background=>'red',
960
- :foreground=>'blue',
961
- :variable=>@progress,
962
- :borderwidth=>0,
963
- :relief=>'flat',
964
- :maximum=>_max).place('width' => '150','x' => 25,'y' => 30,'height' => 15)
965
-
966
- @buttons_frame = TkFrame.new(self).pack('fill'=>'x', 'side'=>'bottom')
967
-
968
- @b_cancel = TkButton.new(@buttons_frame){|_b_go|
969
- default 'disabled'
970
- text 'Cancel'
971
- overrelief 'raised'
972
- justify 'center'
973
- pack('side'=>'top','ipadx'=>5, 'padx'=>5)
974
- }
975
-
976
- place('x'=>100,'y'=>100,'height'=> 120,'width'=> 200)
977
- end
978
-
979
- def quit
980
- #self.destroy
981
- end
982
-
983
- def progress(_incr=1)
984
- @progress.numeric += _incr
985
- end
986
-
987
- def on_cancel=(_proc)
988
- @b_cancel.bind_append('1', _proc)
989
- end
990
-
991
-
992
- end
993
-
1
+ #
2
+ # a-utils.rb - Arcadia Ruby ide
3
+ # by Antonio Galeone <antonio-galeone@rubyforge.org>
4
+ #
5
+
6
+ require 'lib/tk/al-tk'
7
+
8
+ class AGTkSplittedFrames < TkFrame
9
+ def initialize(parent=nil, length=10, keys=nil)
10
+ super(parent, keys)
11
+ @parent = parent
12
+ @slen = 5
13
+ relief 'groove'
14
+ end
15
+
16
+ def maximize(_frame)
17
+ p = TkWinfo.parent(@parent)
18
+ if p.kind_of?(AGTkSplittedFrames)
19
+ p.maximize(@parent)
20
+ end
21
+ end
22
+
23
+ def minimize(_frame)
24
+ p = TkWinfo.parent(@parent)
25
+ if p.kind_of?(AGTkSplittedFrames)
26
+ p.minimize(@parent)
27
+ end
28
+ end
29
+
30
+ end
31
+
32
+
33
+ class AGTkVSplittedFrames < AGTkSplittedFrames
34
+ attr_reader :left_frame, :right_frame
35
+ def initialize(parent=nil, width=10, keys=nil)
36
+ super(parent, width, keys)
37
+
38
+ self.pack(:expand=>true, :fill=>:both)
39
+ @left_frame = TkFrame.new(self){
40
+ relief 'flat'
41
+ }
42
+ x = width
43
+ @left_frame.place(
44
+ 'relx' => 0,
45
+ 'x' => 0,
46
+ 'y' => '0',
47
+ 'relheight' => '1',
48
+ 'rely' => 0,
49
+ 'bordermode' => 'inside',
50
+ 'width' => x
51
+ )
52
+ @left_frame_obj = AGTkObjPlace.new(@left_frame, 'x', nil, false)
53
+ @left_frame_obj.width = x
54
+ @left_frame_obj.height = 0
55
+ @left_frame_obj.relwidth = 0
56
+ @left_frame_obj.relheight = 1
57
+
58
+ @splitter_frame = TkFrame.new(self){
59
+ relief 'raised'
60
+ border 1
61
+ }
62
+
63
+ @splitter_frame.place(
64
+ 'relx' => 0,
65
+ 'x' => x,
66
+ 'y' => '0',
67
+ 'relheight' => '1',
68
+ 'rely' => 0,
69
+ 'bordermode' => 'inside',
70
+ 'width' => @slen
71
+ )
72
+ @splitter_frame.bind_append(
73
+ "ButtonRelease-1",
74
+ proc{do_resize}
75
+ )
76
+ _self = self
77
+ @b_left = TkButton.new{
78
+ image TkPhotoImage.new('dat'=>LEFT_SIDE_GIF)
79
+ }
80
+
81
+ @b_right = TkButton.new{
82
+ image TkPhotoImage.new('dat'=>RIGHT_SIDE_GIF)
83
+ }
84
+ @proc_unplace = proc{
85
+ @b_left.unplace
86
+ @b_right.unplace
87
+ }
88
+ @splitter_frame.bind_append(
89
+ "B1-Motion",
90
+ proc{@splitter_frame.raise;@proc_unplace.call}
91
+ )
92
+ @@last_b_left = nil
93
+ @@last_b_right = nil
94
+ @b_left.bind_append('ButtonPress-1',proc{_self.hide_left;@proc_unplace.call})
95
+ @b_right.bind_append('ButtonPress-1',proc{_self.hide_right;@proc_unplace.call})
96
+ @proc_place = proc{|x,y|
97
+ if !TkWinfo.mapped?(@b_left)
98
+ _x = TkWinfo.pointerx(self) - 10
99
+ _y = TkWinfo.pointery(self) - 20
100
+ if @@last_b_left != nil
101
+ @@last_b_left.unplace
102
+ @@last_b_right.unplace
103
+ end
104
+ @b_left.place('x'=>_x,'y'=>_y,'border'=>'outside')
105
+ @b_right.place('x'=>_x,'y'=>_y+25,'border'=>'outside')
106
+ @b_left.raise
107
+ @b_right.raise
108
+ @@last_b_left = @b_left
109
+ @@last_b_right = @b_right
110
+ if @thread_unplace
111
+ @thread_unplace.kill
112
+ end
113
+ @thread_unplace= Thread.new {
114
+ sleep(5)
115
+ @proc_unplace.call
116
+ kill
117
+ }
118
+ end
119
+ }
120
+
121
+ @splitter_frame.bind_append(
122
+ 'ButtonPress-1',
123
+ proc{|x,y|
124
+ @thread_place= Thread.new {
125
+ @proc_place.call(x,y)
126
+ }
127
+ }, "%x %y")
128
+
129
+ @splitter_frame.bind_append(
130
+ "Enter",
131
+ proc{
132
+ @color_save = @splitter_frame.background
133
+ @splitter_frame.background('#9aa6a7')}
134
+ )
135
+ @splitter_frame.bind_append(
136
+ "Leave",
137
+ proc{
138
+ @splitter_frame.background(@color_save)
139
+ }
140
+ )
141
+ @splitter_frame_obj = AGTkObjPlace.new(@splitter_frame, 'x')
142
+ @splitter_frame_obj.width = @slen
143
+ @splitter_frame_obj.height = 0
144
+ @splitter_frame_obj.relwidth = 0
145
+ @splitter_frame_obj.relheight = 1
146
+ x = x + @slen
147
+ @right_frame = TkFrame.new(self){
148
+ relief 'flat'
149
+ }
150
+ @right_frame.place(
151
+ 'relwidth' => 1,
152
+ 'relx' => 0,
153
+ 'x' => x,
154
+ 'y' => 0,
155
+ 'width' => -x,
156
+ 'relheight' => 1,
157
+ 'rely' => 0,
158
+ 'bordermode' => 'inside'
159
+ )
160
+ @right_frame_obj = AGTkObjPlace.new(@right_frame, 'x', nil, false)
161
+ @right_frame_obj.width = -x
162
+ @right_frame_obj.height = 0
163
+ @right_frame_obj.relwidth = 1
164
+ @right_frame_obj.relheight = 1
165
+ @state = 'middle'
166
+ yield(self) if block_given?
167
+ end
168
+
169
+ def get_main_x
170
+ if TkWinfo.manager(@parent)=='place'
171
+ return TkPlace.info(@parent)['x'] / 2
172
+ else
173
+ return 20
174
+ end
175
+ end
176
+
177
+ def do_resize
178
+ _x = @splitter_frame_obj.x0
179
+ _w = @splitter_frame_obj.w
180
+ @left_frame_obj.width = _x
181
+ @left_frame_obj.go(_x,0)
182
+ @right_frame_obj.width = - _x - _w
183
+ @right_frame_obj.amove(_x + _w,0)
184
+ end
185
+
186
+ def hide_left
187
+ if (@state=='left')
188
+ _w = @last
189
+ @state = 'middle'
190
+ @left_frame_obj.width = _w
191
+ @left_frame_obj.go(_w,0)
192
+ else
193
+ _w = 0
194
+ @state = 'right'
195
+ @last = @left_frame_obj.w
196
+ end
197
+ @left_frame_obj.amove(0,0)
198
+ @splitter_frame_obj.amove(_w,0)
199
+ @right_frame_obj.width = - _w - @slen
200
+ @right_frame_obj.amove(_w + @slen,0)
201
+ end
202
+
203
+ def hide_right
204
+ if (@state=='right')
205
+ _w = @last
206
+ @state = 'middle'
207
+ else
208
+ _w = @right_frame_obj.w + @left_frame_obj.w #+ @slen
209
+ @state = 'left'
210
+ @last = @left_frame_obj.w
211
+ end
212
+ @right_frame_obj.width = - _w - @slen
213
+ @right_frame_obj.amove(_w + @slen,0)
214
+ @splitter_frame_obj.amove(_w,0)
215
+ @left_frame_obj.width = _w
216
+ @left_frame_obj.go(_w,0)
217
+ end
218
+
219
+ def maximize(_frame)
220
+ super(_frame)
221
+ case _frame
222
+ when left_frame
223
+ hide_right
224
+ when right_frame
225
+ hide_left
226
+ end
227
+ Tk.update
228
+ end
229
+
230
+ def minimize(_frame)
231
+ super(_frame)
232
+ case _frame
233
+ when left_frame
234
+ hide_left
235
+ when right_frame
236
+ hide_right
237
+ end
238
+ Tk.update
239
+ end
240
+
241
+ def hide(_name)
242
+ end
243
+
244
+ def show(_name)
245
+ end
246
+
247
+ end
248
+
249
+ class AGTkOSplittedFrames < AGTkSplittedFrames
250
+ attr_reader :top_frame, :bottom_frame
251
+ def initialize(parent=nil, height=10, perc=false,keys=nil)
252
+ super(parent, height, keys)
253
+ self.place(
254
+ 'relwidth' => 1,
255
+ 'relx' => 0,
256
+ 'x' => 0,
257
+ 'y' => 0,
258
+ 'relheight' => 1,
259
+ 'rely' => 0,
260
+ 'bordermode' => 'inside'
261
+ )
262
+ @top_frame = TkFrame.new(self){
263
+ relief 'flat'
264
+ }
265
+ if perc
266
+ p_height = TkWinfo.screenheight(self)
267
+ y = (p_height/100*height).to_i
268
+ else
269
+ y = height
270
+ end
271
+ @top_frame.place(
272
+ 'relwidth' => '1',
273
+ 'bordermode' => 'inside',
274
+ 'height' => y
275
+ )
276
+ @top_frame_obj = AGTkObjPlace.new(@top_frame, 'y', nil, false)
277
+ @top_frame_obj.width = 0
278
+ @top_frame_obj.height = y
279
+ @top_frame_obj.relwidth = 1
280
+ @top_frame_obj.relheight = 0
281
+ @splitter_frame = TkFrame.new(self){
282
+ relief 'groove'
283
+ border 1
284
+ }
285
+ @splitter_frame.place(
286
+ 'relx' => 0,
287
+ 'x' => 0,
288
+ 'y' => y,
289
+ 'relwidth' => '1',
290
+ 'rely' => 0,
291
+ 'bordermode' => 'inside',
292
+ 'height' => @slen
293
+ )
294
+ @splitter_frame.bind_append(
295
+ "B1-Motion",
296
+ proc{@splitter_frame.raise}
297
+ )
298
+ @splitter_frame.bind_append(
299
+ "ButtonRelease-1",
300
+ proc{do_resize}
301
+ )
302
+ @splitter_frame_obj = AGTkObjPlace.new(@splitter_frame, 'y')
303
+ @splitter_frame_obj.width = 0
304
+ @splitter_frame_obj.height = @slen
305
+ @splitter_frame_obj.relwidth = 1
306
+ @splitter_frame_obj.relheight = 0
307
+ y = y + @slen
308
+ @bottom_frame = TkFrame.new(self){
309
+ relief 'flat'
310
+ }
311
+ @bottom_frame.place(
312
+ 'relwidth' => 1,
313
+ 'relx' => 0,
314
+ 'x' => 0,
315
+ 'y' => y,
316
+ 'height' => -y,
317
+ 'relheight' => 1,
318
+ 'rely' => 0,
319
+ 'bordermode' => 'inside'
320
+ )
321
+ @bottom_frame_obj = AGTkObjPlace.new(@bottom_frame, 'y', nil, false)
322
+ @bottom_frame_obj.width = 0
323
+ @bottom_frame_obj.height = -y
324
+ @bottom_frame_obj.relwidth = 1
325
+ @bottom_frame_obj.relheight = 1
326
+ _xbutton = TkButton.new(@splitter_frame){
327
+ background '#4966d7'
328
+ overrelief 'raised'
329
+ relief 'flat'
330
+ }
331
+ _xbutton.place(
332
+ 'x' => 0,
333
+ 'y' => 0,
334
+ 'relheight' => 1,
335
+ 'bordermode' => 'outside',
336
+ 'width' => 20
337
+ )
338
+ _xbutton.bind_append(
339
+ "ButtonPress-1",
340
+ proc{hide_top}
341
+ )
342
+ _ybutton = TkButton.new(@splitter_frame){
343
+ background '#118124'
344
+ overrelief 'raised'
345
+ relief 'flat'
346
+ }
347
+ _ybutton.place(
348
+ 'x' => 21,
349
+ 'y' => 0,
350
+ 'bordermode' => 'outside',
351
+ 'width' => 20,
352
+ 'relheight' => 1
353
+ )
354
+ _ybutton.bind_append(
355
+ "ButtonPress-1",
356
+ proc{hide_bottom}
357
+ )
358
+ @state = 'middle'
359
+ yield(self) if block_given?
360
+ end
361
+
362
+ def hide_top
363
+ if (@state=='top')
364
+ _h = @last
365
+ @state = 'middle'
366
+ @top_frame_obj.height = _h
367
+ @top_frame_obj.go(0,_h)
368
+ elsif (@state=='bottom')
369
+ return
370
+ else
371
+ _h = 0
372
+ @state = 'bottom'
373
+ @last = @top_frame_obj.h
374
+ end
375
+ @top_frame_obj.amove(0,0)
376
+ @splitter_frame_obj.amove(0, _h)
377
+ @bottom_frame_obj.height = - _h - @slen
378
+ @bottom_frame_obj.amove(0,_h + @slen)
379
+ end
380
+
381
+ def hide_bottom
382
+ if (@state=='bottom')
383
+ _h = @last
384
+ @state = 'middle'
385
+ elsif (@state == 'top')
386
+ return
387
+ else
388
+ _h = @bottom_frame_obj.h + @top_frame_obj.h #+ @slen
389
+ @state = 'top'
390
+ @last = @top_frame_obj.h #+ @slen
391
+ end
392
+ @bottom_frame_obj.height = - _h - @slen
393
+ @bottom_frame_obj.amove(0,_h + @slen)
394
+ @splitter_frame_obj.amove(0,_h)
395
+ @top_frame_obj.height = _h
396
+ @top_frame_obj.go(0,_h)
397
+ end
398
+
399
+
400
+ def maximize(_frame)
401
+ super(_frame)
402
+ case _frame
403
+ when top_frame
404
+ hide_bottom
405
+ when bottom_frame
406
+ hide_top
407
+ end
408
+ Tk.update
409
+ end
410
+
411
+ def minimize(_frame)
412
+ super(_frame)
413
+ case _frame
414
+ when top_frame
415
+ hide_top
416
+ when bottom_frame
417
+ hide_bottom
418
+ end
419
+ Tk.update
420
+ end
421
+
422
+
423
+ def get_main_y
424
+ return 40
425
+ end
426
+
427
+ def do_resize
428
+ _y = @splitter_frame_obj.y0
429
+ _h = @splitter_frame_obj.h
430
+ @top_frame_obj.height = _y
431
+ @top_frame_obj.go(0,_y)
432
+ @bottom_frame_obj.height = -_y-_h
433
+ @bottom_frame_obj.amove(0,_y + _h)
434
+ #end
435
+ end
436
+
437
+ def hide(_name)
438
+ end
439
+
440
+ def show(_name)
441
+ end
442
+
443
+ end
444
+
445
+ class TkBaseTitledFrame < TkFrame
446
+ attr_reader :frame
447
+ attr_reader :top
448
+
449
+ def initialize(parent=nil, *args)
450
+ super(parent, *args)
451
+ @parent = parent
452
+ @title_height = 18
453
+ @top = TkFrame.new(self){
454
+ background '#303b50'
455
+ #foreground 'white'
456
+ #anchor 'w'
457
+ }.place('x'=>0, 'y'=>0,'height'=>@title_height, 'relwidth'=>1)
458
+ #.pack('fill'=> 'x','ipady'=> @title_height, 'side'=>'top')
459
+
460
+
461
+ @frame = create_frame
462
+
463
+
464
+
465
+ @button_frame=TkFrame.new(@top){
466
+ #background '#303b50'
467
+ }.pack('side'=> 'right','anchor'=> 'w')
468
+
469
+ self.head_buttons
470
+ end
471
+
472
+ def create_frame
473
+ return TkFrame.new(self).place('x'=>0, 'y'=>@title_height,'height'=>-@title_height,'relheight'=>1, 'relwidth'=>1)
474
+ #pack('fill'=>'both','expand'=> 1, 'anchor'=>'center')
475
+ #
476
+ end
477
+
478
+ def add_button(_label,_proc=nil,_image=nil, _side= 'right')
479
+ TkButton.new(@button_frame){
480
+ text _label if _label
481
+ image TkPhotoImage.new('dat' => _image) if _image
482
+ relief 'flat'
483
+ font 'helvetica 8 bold'
484
+ #borderwidth 0
485
+ #background '#303b50'
486
+ #background '#8080ff'
487
+ pack('side'=> _side,'anchor'=> 'e')
488
+ bind('1',_proc) if _proc
489
+ }
490
+ end
491
+
492
+ def head_buttons
493
+ @bmaxmin = add_button('[ ]',proc{resize}, W_MAX_GIF)
494
+ end
495
+
496
+ end
497
+
498
+
499
+
500
+ class TkTitledFrame < TkBaseTitledFrame
501
+ attr_reader :frame
502
+ attr_reader :top
503
+
504
+ def initialize(parent=nil, title='...', img=nil , keys=nil)
505
+ super(parent, keys)
506
+ @state = 'normal'
507
+ @title_label =TkLabel.new(@top){
508
+ text title+' :: '
509
+ anchor 'w'
510
+ font $arcadia['conf']['all.frame.title.font']
511
+ background '#303b50'
512
+ foreground '#e8e651'
513
+ compound 'left'
514
+ image TkAllPhotoImage.new('file' => img) if img
515
+ pack('side'=> 'left','anchor'=> 'e')
516
+ }
517
+ @top_label =TkLabel.new(@top){
518
+ anchor 'w'
519
+ font $arcadia['conf']['all.frame.title.font.italic']
520
+ background '#303b50'
521
+ foreground '#FFFFFF'
522
+ compound 'left'
523
+ pack('side'=> 'left','anchor'=> 'e')
524
+ }
525
+
526
+ @ap = Array.new
527
+ @apx = Array.new
528
+ @apy = Array.new
529
+ @apw = Array.new
530
+ @aph = Array.new
531
+ end
532
+
533
+ def top_text(_text)
534
+ @top_label.text(_text)
535
+ end
536
+
537
+ def title(_text)
538
+ @title_label.text(_text+'::')
539
+ end
540
+
541
+
542
+ def add_sep(_width=0,_background =@top.background)
543
+ TkLabel.new(@top){||
544
+ text ''
545
+ background _background
546
+ pack('side'=> 'right','anchor'=> 'e', 'ipadx'=>_width)
547
+ }
548
+ end
549
+
550
+
551
+ def head_buttons
552
+ @bmaxmin = add_button('[ ]',proc{resize}, W_MAX_GIF)
553
+ #@bmaxmin = add_button('[ ]',proc{resize}, EXPAND_GIF)
554
+ end
555
+
556
+ def resize
557
+ p = TkWinfo.parent(@parent)
558
+ if @state == 'normal'
559
+ if p.kind_of?(AGTkSplittedFrames)
560
+ p.maximize(@parent)
561
+ @bmaxmin.image(TkPhotoImage.new('dat' => W_NORM_GIF))
562
+ end
563
+ @state = 'maximize'
564
+ else
565
+ if p.kind_of?(AGTkSplittedFrames)
566
+ p.minimize(@parent)
567
+ @bmaxmin.image(TkPhotoImage.new('dat' =>W_MAX_GIF))
568
+ end
569
+ @state = 'normal'
570
+ end
571
+ self.raise
572
+ end
573
+
574
+ def maximize
575
+ if @state == 'normal'
576
+ p = TkWinfo.parent(self)
577
+ while (p != nil) && (TkWinfo.manager(p)=='place')
578
+ Tk.messageBox('message'=>p.to_s)
579
+ @ap << p
580
+ @apx << TkPlace.info(p)['x']
581
+ @apy << TkPlace.info(p)['y']
582
+ @apw << TkPlace.info(p)['width']
583
+ @aph << TkPlace.info(p)['height']
584
+ p.place('x'=>0, 'y'=>0,'relheight'=>1, 'relwidth'=>1)
585
+ p.raise
586
+ p = TkWinfo.parent(p)
587
+ end
588
+ @state = 'maximize'
589
+ self.raise
590
+ else
591
+ @ap.each_index{|i|
592
+ @ap[i].place('x'=>@apx[i], 'y'=>@apy[i],'width'=>@apw[i], 'height'=>@aph[i],'relheight'=>1, 'relwidth'=>1)
593
+ @ap[i].raise
594
+ }
595
+ self.raise
596
+ @ap.clear
597
+ @apx.clear
598
+ @apy.clear
599
+ @state = 'normal'
600
+ end
601
+ end
602
+ end
603
+
604
+ class TkTitledScrollFrame < TkTitledFrame
605
+
606
+ def create_frame
607
+ return Tk::ScrollFrame.new(self,:scrollbarwidth=>10, :width=>300, :height=>200).place('x'=>0, 'y'=>@title_height,'height'=>-@title_height,'relheight'=>1, 'relwidth'=>1)
608
+ end
609
+
610
+ end
611
+
612
+
613
+
614
+ class Application
615
+ ApplicationParams = Struct.new( "ApplicationParams",
616
+ :name,
617
+ :version,
618
+ :config_file,
619
+ :persistent_file
620
+ )
621
+
622
+ def initialize(_ap=ApplicationParams.new)
623
+ @@instance = self
624
+ eval('$'+_ap.name+'=self')
625
+ publish('applicationParams', _ap)
626
+ publish(_ap.name,self)
627
+ @first_run = false
628
+ init_config
629
+ yield(self) if block_given?
630
+ end
631
+
632
+ def Application.instance
633
+ @@instance
634
+ end
635
+
636
+ def init_config
637
+ self['applicationParams'].persistent_file = File.join(local_dir, self['applicationParams'].name+'.pers')
638
+ if !File.exists?(self['applicationParams'].persistent_file)
639
+ File.new(self['applicationParams'].persistent_file, File::CREAT).close
640
+ end
641
+ publish('conf', config_file2hash(self['applicationParams'].config_file)) if self['applicationParams'].config_file
642
+ publish('pers', config_file2hash(self['applicationParams'].persistent_file)) if self['applicationParams'].persistent_file
643
+ end
644
+
645
+ def prepare
646
+ end
647
+
648
+ def publish(_name, _obj)
649
+ @objs = Hash.new if !defined?(@objs)
650
+ @objs[_name] = _obj
651
+ end
652
+
653
+ # this method load arcadia.conf from local directory for personalizations
654
+ def load_local_config(_create_if_not_exist=true)
655
+ local_file_config = File.join(local_dir,File.basename(self['applicationParams'].config_file))
656
+ if FileTest.exist?(local_file_config)
657
+ self['conf'].update(self.config_file2hash(local_file_config))
658
+ elsif _create_if_not_exist
659
+ if FileTest.writable?(local_dir)
660
+ f = File.new(local_file_config, "w")
661
+ begin
662
+ if f
663
+ p = self['conf']
664
+ if p
665
+ p.keys.sort.each{|key|
666
+ f.syswrite('#'+key+'='+self['conf'][key]+"\n")
667
+ }
668
+ end
669
+ end
670
+ ensure
671
+ f.close unless f.nil?
672
+ end
673
+ else
674
+ msg = "Locad dir "+'"'+local_dir+'"'+" must be writable!"
675
+ Tk.messageBox('icon' => 'error', 'type' => 'ok',
676
+ 'title' => '(Arcadia)',
677
+ 'message' => msg)
678
+ exit
679
+
680
+ end
681
+ end
682
+ end
683
+
684
+ def local_dir
685
+ _local_dir = File.join(ENV["HOME"],'.'+self['applicationParams'].name) if ENV["HOME"]
686
+ if _local_dir && !File.exist?(_local_dir)
687
+ if FileTest.exist?(ENV["HOME"])
688
+ Dir.mkdir(_local_dir)
689
+ @first_run = true
690
+ else
691
+ msg = "Locad dir "+'"'+ENV["HOME"]+'"'+" must be writable!"
692
+ Tk.messageBox('icon' => 'error', 'type' => 'ok',
693
+ 'title' => '(Arcadia)',
694
+ 'message' => msg)
695
+ exit
696
+ end
697
+ end
698
+ return _local_dir
699
+ end
700
+
701
+ def load_config(_config_file)
702
+ if _config_file && FileTest::exist?(_config_file)
703
+ f = File::open(_config_file,'r')
704
+ begin
705
+ _lines = f.readlines
706
+ _lines.each{|_line|
707
+ _strip_line = _line.strip
708
+ if (_strip_line.length > 0)&&(_strip_line[0,1]!='#')
709
+ var_plat = _line.split('::')
710
+ if var_plat.length > 1
711
+ if (RUBY_PLATFORM.include?(var_plat[0]))
712
+ #if (var_plat[0] == RUBY_PLATFORM)
713
+ _line = var_plat[1]
714
+ else
715
+ _line = ''
716
+ end
717
+ end
718
+ var = _line.split('=')
719
+ if var.length > 1
720
+ self['conf'][var[0].strip]=var[1].strip
721
+ end
722
+ end
723
+ }
724
+ ensure
725
+ f.close unless f.nil?
726
+ end
727
+ end
728
+ end
729
+
730
+ def config_file2hash(_config_file)
731
+ r_hash = Hash.new
732
+ if _config_file && FileTest::exist?(_config_file)
733
+ f = File::open(_config_file,'r')
734
+ begin
735
+ _lines = f.readlines
736
+ _lines.each{|_line|
737
+ _strip_line = _line.strip
738
+ if (_strip_line.length > 0)&&(_strip_line[0,1]!='#')
739
+ var_plat = _line.split('::')
740
+ if var_plat.length > 1
741
+ if (RUBY_PLATFORM.include?(var_plat[0]))
742
+ #if (var_plat[0] == RUBY_PLATFORM)
743
+ _line = var_plat[1]
744
+ else
745
+ _line = ''
746
+ end
747
+ end
748
+ var = _line.split('=')
749
+ if var.length > 1
750
+ r_hash[var[0].strip]=var[1].strip
751
+ end
752
+ end
753
+ }
754
+ ensure
755
+ f.close unless f.nil?
756
+ end
757
+ return r_hash
758
+ end
759
+ end
760
+
761
+
762
+ def load_persist(_persist_file)
763
+ if _persist_file && !FileTest::exist?(_persist_file)
764
+ Dir.mkdir(File.dirname(_persist_file)) unless File.exists?(File.dirname(_persist_file))
765
+ File.new(_persist_file, File::CREAT)
766
+ end
767
+
768
+ if _persist_file && FileTest::exist?(_persist_file)
769
+ f = File::open(_persist_file,'r')
770
+ begin
771
+ _lines = f.readlines
772
+ _lines.each{|_line|
773
+ _strip_line = _line.strip
774
+ if (_strip_line.length > 0)&&(_strip_line[0,1]!='#')
775
+ var = _line.split('=')
776
+ if var.length > 1
777
+ self['pers'][var[0].strip]=var[1].strip
778
+ end
779
+ end
780
+ }
781
+ ensure
782
+ f.close unless f.nil?
783
+ end
784
+ end
785
+ end
786
+
787
+ def write_persist
788
+ if FileTest::exist?(self['applicationParams'].persistent_file)
789
+ f = File.new(self['applicationParams'].persistent_file, "w")
790
+ begin
791
+ if f
792
+ p = self['pers']
793
+ if p
794
+ p.each{|key,value|
795
+ f.syswrite(key+'='+value+"\n")
796
+ }
797
+ end
798
+ end
799
+ ensure
800
+ f.close unless f.nil?
801
+ end
802
+ end
803
+ end
804
+
805
+ def create(_name, _class)
806
+ register(_name,_class.new)
807
+ end
808
+
809
+ def objects(_name)
810
+ return @objs[_name]
811
+ end
812
+
813
+ def [](_name)
814
+ if @objs[_name]
815
+ return @objs[_name]
816
+ else
817
+ raise RuntimeError, "resurce '"+_name+"' unavabled ", caller
818
+ end
819
+ end
820
+
821
+ def run
822
+ end
823
+ end
824
+
825
+ class TkApplication < Application
826
+ def run
827
+ Tk.mainloop
828
+ end
829
+ end
830
+
831
+ module TkMovable
832
+ def start_moving(_moving_obj=self, _moved_obj=self)
833
+ @x0 = 0
834
+ @y0 = 0
835
+ @moving_obj = _moving_obj
836
+ @moved_obj = _moved_obj
837
+ @moving_obj.bind_append("B1-Motion", proc{|x, y| moving_do_move_obj(x,y)},"%x %y")
838
+ @moving_obj.bind_append("ButtonPress-1", proc{|e| moving_do_press(e.x, e.y)})
839
+ end
840
+
841
+ def stop_moving
842
+ @moving_obj.bind_remove("B1-Motion")
843
+ @moving_obj.bind_remove("ButtonPress-1")
844
+ end
845
+
846
+ def moving_do_press(_x, _y)
847
+ @x0 = _x
848
+ @y0 = _y
849
+ end
850
+
851
+ def moving_do_move_obj(_x, _y)
852
+ _x = TkPlace.info(@moved_obj)['x'] + _x - @x0
853
+ _y = TkPlace.info(@moved_obj)['y'] + _y - @y0
854
+ @moved_obj.place('x'=>_x, 'y'=>_y)
855
+ end
856
+
857
+ end
858
+
859
+ module TkResizabled
860
+ MIN_WIDTH = 50
861
+ MIN_HEIGHT = 50
862
+ def start_resizing(_moving_obj=self, _moved_obj=self)
863
+ @x0 = 0
864
+ @y0 = 0
865
+ @moving_obj = _moving_obj
866
+ @moved_obj = _moved_obj
867
+ @moving_obj.bind_append("B1-Motion", proc{|x, y| resizing_do_move_obj(x,y)},"%x %y")
868
+ @moving_obj.bind_append("ButtonPress-1", proc{|e| resizing_do_press(e.x, e.y)})
869
+ end
870
+
871
+ def stop_resizing
872
+ @moving_obj.bind_remove("B1-Motion")
873
+ @moving_obj.bind_remove("ButtonPress-1")
874
+ end
875
+
876
+ def resizing_do_press(_x, _y)
877
+ @x0 = _x
878
+ @y0 = _y
879
+ end
880
+
881
+ def resizing_do_move_obj(_x, _y)
882
+ _width0 = TkPlace.info(@moved_obj)['width']
883
+ _height0 = TkPlace.info(@moved_obj)['height']
884
+ _width = _width0 + _x - @x0
885
+ _height = _height0 + _y -@y0
886
+ _width = MIN_WIDTH if _width < MIN_WIDTH
887
+ _height = MIN_HEIGHT if _height < MIN_HEIGHT
888
+ @moved_obj.place('width'=>_width, 'height'=>_height)
889
+ end
890
+
891
+ end
892
+
893
+
894
+ class TkFloatTitledFrame < TkBaseTitledFrame
895
+ include TkMovable
896
+ include TkResizabled
897
+ def initialize(parent=nil, *args)
898
+ super(parent)
899
+ frame.place('height'=>-32)
900
+ borderwidth 2
901
+ relief 'groove'
902
+
903
+ @top_label = TkLabel.new(@top){
904
+ background '#303b50'
905
+ foreground 'white'
906
+ anchor 'w'
907
+ }.pack('fill'=>'x', 'side'=>'top')
908
+ #.place('x'=>0, 'y'=>0,'relheight'=>1, 'relwidth'=>1 ,'width'=>-20)
909
+
910
+ @resizing_label=TkLabel.new(self){
911
+ #background '#303b50'
912
+ text '-'
913
+ image TkPhotoImage.new('dat'=>EXPAND_LIGHT_GIF)
914
+ }.pack('side'=> 'right','anchor'=> 's')
915
+
916
+
917
+ start_moving(@top_label, self)
918
+ start_resizing(@resizing_label, self)
919
+ end
920
+
921
+ def title(_text)
922
+ @top_label.text(_text)
923
+ end
924
+
925
+
926
+ def on_close=(_proc)
927
+ add_button('X', _proc, TAB_CLOSE_GIF)
928
+ end
929
+
930
+ def hide
931
+ @manager = TkWinfo.manager(self)
932
+ if @manager == 'place'
933
+ @x_place = TkPlace.info(self)['x']
934
+ @y_place = TkPlace.info(self)['y']
935
+ @width_place = TkPlace.info(self)['width']
936
+ @height_place = TkPlace.info(self)['height']
937
+ self.unplace
938
+ end
939
+ end
940
+
941
+ def show
942
+ if @manager == 'place'
943
+ self.place('x'=>@x_place, 'y'=>@y_place, 'width'=>@width_place, 'height'=>@height_place)
944
+ end
945
+ end
946
+
947
+ def head_buttons
948
+ end
949
+
950
+ end
951
+
952
+ class TkProgressframe < TkFloatTitledFrame
953
+ def initialize(parent=nil, _max=100, *args)
954
+ super(parent)
955
+ @max = _max
956
+ @progress = TkVariable.new
957
+ @progress.value = -1
958
+ Tk::BWidget::ProgressBar.new(self, :width=>150, :height=>10,
959
+ :background=>'red',
960
+ :foreground=>'blue',
961
+ :variable=>@progress,
962
+ :borderwidth=>0,
963
+ :relief=>'flat',
964
+ :maximum=>_max).place('width' => '150','x' => 25,'y' => 30,'height' => 15)
965
+
966
+ @buttons_frame = TkFrame.new(self).pack('fill'=>'x', 'side'=>'bottom')
967
+
968
+ @b_cancel = TkButton.new(@buttons_frame){|_b_go|
969
+ default 'disabled'
970
+ text 'Cancel'
971
+ overrelief 'raised'
972
+ justify 'center'
973
+ pack('side'=>'top','ipadx'=>5, 'padx'=>5)
974
+ }
975
+
976
+ place('x'=>100,'y'=>100,'height'=> 120,'width'=> 200)
977
+ end
978
+
979
+ def quit
980
+ #self.destroy
981
+ end
982
+
983
+ def progress(_incr=1)
984
+ @progress.numeric += _incr
985
+ end
986
+
987
+ def on_cancel=(_proc)
988
+ @b_cancel.bind_append('1', _proc)
989
+ end
990
+
991
+
992
+ end
993
+