jota 0.9.0 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/INSTALL +64 -97
- data/LICENSE +1 -1
- data/bin/jota +0 -1
- data/lib/app_error.rb +0 -2
- data/lib/clip.rb +18 -19
- data/lib/clip_array.rb +41 -36
- data/lib/gui.rb +72 -69
- data/lib/helper.rb +43 -5
- data/lib/immediate.rb +0 -3
- data/lib/jota.rb +3 -6
- data/lib/jota_curses.rb +27 -29
- data/lib/mbox_storage-tmail.rb +258 -0
- data/lib/preferences.rb +7 -9
- data/lib/test.rb +37 -0
- data/lib/version.rb +4 -8
- data/tests/test_all.rb +1 -1
- data/tests/test_clip.rb +1 -1
- data/tests/test_clip_array.rb +1 -1
- metadata +36 -56
- data/bin/jota.bat +0 -7
data/lib/gui.rb
CHANGED
@@ -1,8 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
# $Id: gui.rb 300 2011-04-18 08:38:44Z dz $
|
4
|
-
|
5
|
-
|
6
3
|
# rdoc: see http://en.wikibooks.org/wiki/Ruby_Programming/RubyDoc
|
7
4
|
|
8
5
|
# = Class Gui - Realize the GTK+ related functions of Jota
|
@@ -34,6 +31,7 @@ require 'clip'
|
|
34
31
|
require 'clip_array'
|
35
32
|
require 'helper'
|
36
33
|
require 'preferences'
|
34
|
+
require 'objspace'
|
37
35
|
|
38
36
|
class Gui
|
39
37
|
|
@@ -42,8 +40,8 @@ require 'gtk2'
|
|
42
40
|
attr :glade
|
43
41
|
|
44
42
|
def Gui.gtk_version
|
45
|
-
return "GTK+ %d.%d.%d" % [ Gtk::MAJOR_VERSION,
|
46
|
-
Gtk::MINOR_VERSION,
|
43
|
+
return "GTK+ %d.%d.%d" % [ Gtk::MAJOR_VERSION,
|
44
|
+
Gtk::MINOR_VERSION,
|
47
45
|
Gtk::MICRO_VERSION ]
|
48
46
|
# TODO http://ruby-gnome2.sourceforge.jp/hiki.cgi?Gtk#MICRO_VERSION
|
49
47
|
end
|
@@ -55,7 +53,7 @@ def initialize
|
|
55
53
|
@clip_widget = nil
|
56
54
|
@next_autosave = Time.now
|
57
55
|
@changed = false
|
58
|
-
end
|
56
|
+
end
|
59
57
|
|
60
58
|
def open(filename)
|
61
59
|
begin
|
@@ -67,7 +65,7 @@ def open(filename)
|
|
67
65
|
set_autosave
|
68
66
|
@changed = false
|
69
67
|
return @data
|
70
|
-
end
|
68
|
+
end
|
71
69
|
|
72
70
|
def close
|
73
71
|
update
|
@@ -75,7 +73,7 @@ def close
|
|
75
73
|
if @data
|
76
74
|
@data.close
|
77
75
|
end
|
78
|
-
end
|
76
|
+
end
|
79
77
|
|
80
78
|
def clip_array
|
81
79
|
return @data
|
@@ -113,15 +111,15 @@ def create_gui(width=nil, height=nil)
|
|
113
111
|
@top_window.add_accel_group(@accel_group)
|
114
112
|
@glade["main_menu"].accel_group=(@accel_group)
|
115
113
|
|
116
|
-
@glade["menu_new"].add_accelerator('activate', @accel_group,
|
114
|
+
@glade["menu_new"].add_accelerator('activate', @accel_group,
|
117
115
|
Gdk::Keyval::GDK_N, Gdk::Window::CONTROL_MASK, Gtk::ACCEL_VISIBLE)
|
118
|
-
@glade["menu_open"].add_accelerator('activate', @accel_group,
|
116
|
+
@glade["menu_open"].add_accelerator('activate', @accel_group,
|
119
117
|
Gdk::Keyval::GDK_O, Gdk::Window::CONTROL_MASK, Gtk::ACCEL_VISIBLE)
|
120
|
-
@glade["menu_save"].add_accelerator('activate', @accel_group,
|
118
|
+
@glade["menu_save"].add_accelerator('activate', @accel_group,
|
121
119
|
Gdk::Keyval::GDK_S, Gdk::Window::CONTROL_MASK, Gtk::ACCEL_VISIBLE)
|
122
|
-
@glade["menu_close"].add_accelerator('activate', @accel_group,
|
120
|
+
@glade["menu_close"].add_accelerator('activate', @accel_group,
|
123
121
|
Gdk::Keyval::GDK_W, Gdk::Window::CONTROL_MASK, Gtk::ACCEL_VISIBLE)
|
124
|
-
@glade["menu_quit"].add_accelerator('activate', @accel_group,
|
122
|
+
@glade["menu_quit"].add_accelerator('activate', @accel_group,
|
125
123
|
Gdk::Keyval::GDK_Q, Gdk::Window::CONTROL_MASK, Gtk::ACCEL_VISIBLE)
|
126
124
|
|
127
125
|
# Update buttons and stuff
|
@@ -135,7 +133,12 @@ def create_gui(width=nil, height=nil)
|
|
135
133
|
autosave
|
136
134
|
true
|
137
135
|
end
|
138
|
-
|
136
|
+
|
137
|
+
# Log memory consumption
|
138
|
+
Gtk.timeout_add(86400*1000) do # once a day
|
139
|
+
print_verbose "ObjectSpace.memsize_of_all #{ObjectSpace.memsize_of_all}"
|
140
|
+
end
|
141
|
+
end
|
139
142
|
|
140
143
|
|
141
144
|
#
|
@@ -144,16 +147,16 @@ end
|
|
144
147
|
|
145
148
|
def on_top_destroy(widget)
|
146
149
|
quit_app
|
147
|
-
end
|
150
|
+
end
|
148
151
|
|
149
152
|
def on_top_delete(widget, arg0)
|
150
153
|
quit_app
|
151
154
|
return true
|
152
|
-
end
|
155
|
+
end
|
153
156
|
|
154
157
|
def on_dialog_delete(widget, arg0)
|
155
158
|
return true
|
156
|
-
end
|
159
|
+
end
|
157
160
|
|
158
161
|
|
159
162
|
#
|
@@ -163,13 +166,13 @@ end
|
|
163
166
|
def on_main_menu_pressed(widget)
|
164
167
|
update
|
165
168
|
set_goto_menu
|
166
|
-
|
169
|
+
|
167
170
|
@glade["main_menu"].popup(
|
168
171
|
nil,
|
169
172
|
nil,
|
170
173
|
Gtk.current_event.button,
|
171
174
|
Gtk.current_event_time)
|
172
|
-
end
|
175
|
+
end
|
173
176
|
|
174
177
|
def on_edit_menu_pressed(widget)
|
175
178
|
@glade["edit_text_menu"].popup(
|
@@ -177,7 +180,7 @@ def on_edit_menu_pressed(widget)
|
|
177
180
|
nil,
|
178
181
|
Gtk.current_event.button,
|
179
182
|
Gtk.current_event_time)
|
180
|
-
end
|
183
|
+
end
|
181
184
|
|
182
185
|
def on_delete_clicked(widget)
|
183
186
|
if pref("confirm_delete") then
|
@@ -201,7 +204,7 @@ def on_delete_clicked(widget)
|
|
201
204
|
update
|
202
205
|
|
203
206
|
if pref("deletesave_enable") and not @data.current.empty? then
|
204
|
-
deletefile = expand_filename(pref("deletesave_file"),
|
207
|
+
deletefile = expand_filename(pref("deletesave_file"),
|
205
208
|
@data.dirname, @data.filename)
|
206
209
|
begin
|
207
210
|
@data.append(deletefile)
|
@@ -213,26 +216,26 @@ def on_delete_clicked(widget)
|
|
213
216
|
@data.delete
|
214
217
|
@changed = true
|
215
218
|
show
|
216
|
-
end
|
219
|
+
end
|
217
220
|
|
218
221
|
def on_new_clicked(widget)
|
219
222
|
update
|
220
223
|
@data.new
|
221
224
|
@changed = true
|
222
225
|
show
|
223
|
-
end
|
226
|
+
end
|
224
227
|
|
225
228
|
def on_next_clicked(widget)
|
226
229
|
update
|
227
230
|
@data.next
|
228
231
|
show
|
229
|
-
end
|
232
|
+
end
|
230
233
|
|
231
234
|
def on_prev_clicked(widget)
|
232
235
|
update
|
233
236
|
@data.prev
|
234
237
|
show
|
235
|
-
end
|
238
|
+
end
|
236
239
|
|
237
240
|
|
238
241
|
|
@@ -243,12 +246,12 @@ end
|
|
243
246
|
|
244
247
|
def on_menu_quit_activate(widget)
|
245
248
|
quit_app
|
246
|
-
end
|
249
|
+
end
|
247
250
|
|
248
251
|
def on_menu_save_activate(widget)
|
249
252
|
update
|
250
253
|
@data.save
|
251
|
-
end
|
254
|
+
end
|
252
255
|
|
253
256
|
def on_menu_new_activate(widget)
|
254
257
|
filename = file_chooser_dialog :save
|
@@ -271,7 +274,7 @@ def on_menu_new_activate(widget)
|
|
271
274
|
show
|
272
275
|
set_autosave
|
273
276
|
set_style
|
274
|
-
end
|
277
|
+
end
|
275
278
|
|
276
279
|
def on_menu_open_activate(widget)
|
277
280
|
filename = file_chooser_dialog :open
|
@@ -288,13 +291,13 @@ def on_menu_open_activate(widget)
|
|
288
291
|
update
|
289
292
|
@data.close
|
290
293
|
end
|
291
|
-
|
294
|
+
|
292
295
|
@data = ca
|
293
296
|
|
294
297
|
show
|
295
298
|
set_autosave
|
296
299
|
set_style
|
297
|
-
end
|
300
|
+
end
|
298
301
|
|
299
302
|
def on_menu_close_activate(widget)
|
300
303
|
if @data.nil? then
|
@@ -305,7 +308,7 @@ def on_menu_close_activate(widget)
|
|
305
308
|
@data.close
|
306
309
|
@data = nil
|
307
310
|
show
|
308
|
-
end
|
311
|
+
end
|
309
312
|
|
310
313
|
def on_menu_preferences_activate(widget)
|
311
314
|
old_autosave_seconds = pref("autosave_seconds")
|
@@ -322,7 +325,7 @@ def on_menu_preferences_activate(widget)
|
|
322
325
|
@glade["entry_sample"].text = "Sample Text"
|
323
326
|
|
324
327
|
@glade["pref_autosave_enable"].active = pref("autosave_enable")
|
325
|
-
@glade["pref_autosave_minutes"].text =
|
328
|
+
@glade["pref_autosave_minutes"].text =
|
326
329
|
"%d" % (pref("autosave_seconds").to_i/60.0)
|
327
330
|
|
328
331
|
@glade["pref_deletesave_enable"].active = pref("deletesave_enable")
|
@@ -339,7 +342,7 @@ def on_menu_preferences_activate(widget)
|
|
339
342
|
|
340
343
|
set_pref("autosave_enable", @glade["pref_autosave_enable"].active?)
|
341
344
|
set_pref("autosave_seconds", 60 * @glade["pref_autosave_minutes"].text.to_i)
|
342
|
-
|
345
|
+
|
343
346
|
set_pref("deletesave_enable", @glade["pref_deletesave_enable"].active?)
|
344
347
|
set_pref("deletesave_file", @glade["pref_deletesave_file"].text)
|
345
348
|
|
@@ -356,18 +359,18 @@ def on_menu_preferences_activate(widget)
|
|
356
359
|
dialog.signal_connect("close") do
|
357
360
|
dialog.hide
|
358
361
|
end
|
359
|
-
end
|
362
|
+
end
|
360
363
|
|
361
364
|
def on_menu_about_activate(widget)
|
362
365
|
dialog = @glade["about_dialog"]
|
363
366
|
dialog.show
|
364
|
-
dialog.signal_connect("close") do
|
367
|
+
dialog.signal_connect("close") do
|
365
368
|
dialog.hide
|
366
369
|
end
|
367
370
|
dialog.signal_connect("destroy") do # XXX tut's nicht!?
|
368
371
|
dialog.hide
|
369
372
|
end
|
370
|
-
dialog.signal_connect("response") do
|
373
|
+
dialog.signal_connect("response") do
|
371
374
|
dialog.hide
|
372
375
|
end
|
373
376
|
end
|
@@ -396,7 +399,7 @@ def on_edit_text_wrap_activate(widget)
|
|
396
399
|
else
|
397
400
|
@clip_widget.wrap_mode = Gtk::TextTag::WRAP_NONE
|
398
401
|
end
|
399
|
-
end
|
402
|
+
end
|
400
403
|
|
401
404
|
|
402
405
|
#
|
@@ -420,17 +423,17 @@ def on_font(widget)
|
|
420
423
|
end
|
421
424
|
|
422
425
|
dialog.show
|
423
|
-
end
|
426
|
+
end
|
424
427
|
|
425
428
|
def on_bgcolor(widget)
|
426
429
|
color_helper :dialog_text => "Select Background Color",
|
427
430
|
:pref_variable => "background"
|
428
|
-
end
|
431
|
+
end
|
429
432
|
|
430
433
|
def on_fgcolor(widget)
|
431
434
|
color_helper :dialog_text => "Select Foreground Color",
|
432
435
|
:pref_variable => "foreground"
|
433
|
-
end
|
436
|
+
end
|
434
437
|
|
435
438
|
# XXX
|
436
439
|
def on_clip_button_press_event(widget,event)
|
@@ -454,7 +457,7 @@ def error_msgbox(message)
|
|
454
457
|
Gtk::Dialog::MODAL,
|
455
458
|
Gtk::MessageDialog::ERROR,
|
456
459
|
Gtk::MessageDialog::BUTTONS_OK,
|
457
|
-
message);
|
460
|
+
message.to_s);
|
458
461
|
msgbox.title = "Error"
|
459
462
|
|
460
463
|
msgbox.run do | response |
|
@@ -465,7 +468,7 @@ def error_msgbox(message)
|
|
465
468
|
end
|
466
469
|
end
|
467
470
|
msgbox.destroy
|
468
|
-
end
|
471
|
+
end
|
469
472
|
|
470
473
|
def set_goto_menu
|
471
474
|
return if @data.nil?
|
@@ -481,7 +484,7 @@ def set_goto_menu
|
|
481
484
|
|
482
485
|
# Using markup in a MenuItems is not implemented before
|
483
486
|
# GTK+ 2.16. Ruby GTK is 2.12 at the moment (2009-07).
|
484
|
-
|
487
|
+
|
485
488
|
#la = Gtk::Label.new
|
486
489
|
if i == @data.current_index then
|
487
490
|
#title.gsub!(/</,"<")
|
@@ -496,7 +499,7 @@ def set_goto_menu
|
|
496
499
|
|
497
500
|
#mi = Gtk::MenuItem.new
|
498
501
|
#mi.label = la
|
499
|
-
mi = Gtk::MenuItem.new("%s%2d: %s" %
|
502
|
+
mi = Gtk::MenuItem.new("%s%2d: %s" %
|
500
503
|
[marker, i+1, title])
|
501
504
|
mi.signal_connect("activate") do
|
502
505
|
on_menu_goto(i)
|
@@ -512,7 +515,7 @@ end
|
|
512
515
|
def color_helper (hash)
|
513
516
|
dialog_text = hash[:dialog_text]
|
514
517
|
pref_variable = hash[:pref_variable]
|
515
|
-
|
518
|
+
|
516
519
|
dialog = Gtk::ColorSelectionDialog.new(dialog_text)
|
517
520
|
|
518
521
|
dialog.colorsel.current_color = array_to_color(pref(pref_variable))
|
@@ -533,7 +536,7 @@ def color_helper (hash)
|
|
533
536
|
end
|
534
537
|
|
535
538
|
dialog.show
|
536
|
-
end
|
539
|
+
end
|
537
540
|
|
538
541
|
|
539
542
|
def pref(key)
|
@@ -542,13 +545,13 @@ def pref(key)
|
|
542
545
|
else
|
543
546
|
@data.pref[key]
|
544
547
|
end
|
545
|
-
end
|
548
|
+
end
|
546
549
|
|
547
550
|
def set_pref(key,value)
|
548
551
|
if @data
|
549
552
|
@data.pref[key] = value
|
550
553
|
end
|
551
|
-
end
|
554
|
+
end
|
552
555
|
|
553
556
|
def set_title
|
554
557
|
if @data then
|
@@ -581,12 +584,12 @@ def set_buttons
|
|
581
584
|
else
|
582
585
|
@glade["but_delete"].sensitive = true
|
583
586
|
@glade["but_new"].sensitive = true
|
584
|
-
@glade["but_next"].sensitive =
|
587
|
+
@glade["but_next"].sensitive =
|
585
588
|
(@data.current_index != @data.length-1)
|
586
589
|
@glade["but_prev"].sensitive = (@data.current_index != 0)
|
587
590
|
@glade["but_edit"].sensitive = true
|
588
591
|
|
589
|
-
@glade["label_index"].text =
|
592
|
+
@glade["label_index"].text =
|
590
593
|
"%d of %d" % [@data.current_index+1, @data.length]
|
591
594
|
|
592
595
|
status = ""
|
@@ -606,15 +609,15 @@ def set_buttons
|
|
606
609
|
@glade["menu_goto"].sensitive = true
|
607
610
|
end
|
608
611
|
|
609
|
-
|
610
|
-
end
|
612
|
+
@glade["clip"].grab_focus
|
613
|
+
end
|
611
614
|
|
612
615
|
def set_wrap_mode
|
613
616
|
return if @data.nil?
|
614
617
|
|
615
618
|
# Gtk::ToggleButton#active= emits an activate signal
|
616
619
|
# and thus calls on_edit_text_wrap_activate
|
617
|
-
|
620
|
+
|
618
621
|
if @data.current.wrap then
|
619
622
|
@glade["edit_text_wrap"].active = true
|
620
623
|
else
|
@@ -631,7 +634,7 @@ def set_style
|
|
631
634
|
@clip_widget.modify_base(Gtk::STATE_NORMAL,
|
632
635
|
array_to_color(pref("background")))
|
633
636
|
@clip_widget.modify_font(Pango::FontDescription.new(pref("font")))
|
634
|
-
end
|
637
|
+
end
|
635
638
|
|
636
639
|
|
637
640
|
#
|
@@ -644,7 +647,7 @@ def set_style_sample(fg_gdk_color, bg_gdk_color, font)
|
|
644
647
|
sample.modify_text(Gtk::STATE_NORMAL, fg_gdk_color) if fg_gdk_color
|
645
648
|
sample.modify_base(Gtk::STATE_NORMAL, bg_gdk_color) if bg_gdk_color
|
646
649
|
sample.modify_font(Pango::FontDescription.new(font)) if font
|
647
|
-
end
|
650
|
+
end
|
648
651
|
|
649
652
|
def quit_app
|
650
653
|
if pref("confirm_quit") then
|
@@ -672,7 +675,7 @@ def quit_app
|
|
672
675
|
end
|
673
676
|
|
674
677
|
Gtk.main_quit
|
675
|
-
end
|
678
|
+
end
|
676
679
|
|
677
680
|
def set_about_dialog
|
678
681
|
dlg = @glade["about_dialog"]
|
@@ -689,7 +692,7 @@ def set_about_dialog
|
|
689
692
|
dlg.website="#{Version::AUTHOR_WEBSITE}"
|
690
693
|
dlg.license="#{Version::LICENSE}"
|
691
694
|
dlg.authors=["#{Version::AUTHOR} <#{Version::AUTHOR_EMAIL}>"]
|
692
|
-
end
|
695
|
+
end
|
693
696
|
|
694
697
|
def clip_to_widget(textview, clip_array)
|
695
698
|
print_debug "clip_to_widget"
|
@@ -702,7 +705,7 @@ def clip_to_widget(textview, clip_array)
|
|
702
705
|
clip = clip_array.current
|
703
706
|
|
704
707
|
textview.buffer.text = clip.text
|
705
|
-
|
708
|
+
|
706
709
|
if clip.pos then
|
707
710
|
#mark = textview.buffer.get_insert
|
708
711
|
# isn't implemented in Ruby ... grrrr
|
@@ -717,8 +720,8 @@ def clip_to_widget(textview, clip_array)
|
|
717
720
|
textview.editable = true
|
718
721
|
end
|
719
722
|
|
720
|
-
|
721
|
-
end
|
723
|
+
@glade["clip"].grab_focus
|
724
|
+
end
|
722
725
|
|
723
726
|
def widget_to_clip(textview, clip_array)
|
724
727
|
print_debug "widget_to_clip"
|
@@ -732,21 +735,21 @@ def widget_to_clip(textview, clip_array)
|
|
732
735
|
clip_array.current.wrap = true
|
733
736
|
end
|
734
737
|
end
|
735
|
-
end
|
738
|
+
end
|
736
739
|
|
737
740
|
def set_autosave
|
738
741
|
if pref("autosave_enable") then
|
739
742
|
@next_autosave = Time.now + pref("autosave_seconds")
|
740
743
|
end
|
741
|
-
end
|
744
|
+
end
|
742
745
|
|
743
746
|
def array_to_color(arr)
|
744
747
|
return Gdk::Color.new(arr[0],arr[1],arr[2])
|
745
|
-
end
|
748
|
+
end
|
746
749
|
|
747
750
|
def color_to_array(gdk_color)
|
748
751
|
return [gdk_color.red, gdk_color.green, gdk_color.blue]
|
749
|
-
end
|
752
|
+
end
|
750
753
|
|
751
754
|
def file_chooser_dialog(mode)
|
752
755
|
case mode
|
@@ -794,7 +797,7 @@ def file_chooser_dialog(mode)
|
|
794
797
|
dialog.destroy
|
795
798
|
|
796
799
|
return filename
|
797
|
-
end
|
800
|
+
end
|
798
801
|
|
799
802
|
def show
|
800
803
|
clip_to_widget(@clip_widget,@data)
|
@@ -802,7 +805,7 @@ def show
|
|
802
805
|
set_wrap_mode
|
803
806
|
set_title
|
804
807
|
end
|
805
|
-
|
808
|
+
|
806
809
|
def update
|
807
810
|
widget_to_clip(@clip_widget, @data) if @data
|
808
811
|
set_buttons
|
@@ -810,10 +813,10 @@ def update
|
|
810
813
|
end
|
811
814
|
|
812
815
|
def autosave
|
813
|
-
# do autosave if enabled
|
814
|
-
if @data &&
|
816
|
+
# do autosave if enabled
|
817
|
+
if @data &&
|
815
818
|
@changed &&
|
816
|
-
pref("autosave_enable") &&
|
819
|
+
pref("autosave_enable") &&
|
817
820
|
Time.now >= @next_autosave then
|
818
821
|
print_verbose "autosaving at #{Time.now}"
|
819
822
|
@data.save
|