foxguib 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data/changelog.txt +128 -0
- data/doc/www/index.html +173 -0
- data/doc/www/upload.rb +9 -0
- data/examples/event_handler.rb +67 -0
- data/examples/event_handlers.rbin +0 -0
- data/examples/guib_testdialog.rb +31 -0
- data/examples/testdialog.rb +29 -0
- data/exe/foxguib +1 -0
- data/foxGUIb-debug.rb +37 -0
- data/foxGUIb.rb +88 -0
- data/foxGUIb_win32.rbw +1 -0
- data/foxguib.gemspec +26 -0
- data/license.txt +49 -0
- data/readme.txt +1 -0
- data/release_notes.txt +68 -0
- data/src/assert.rb +8 -0
- data/src/cfgman.rb +27 -0
- data/src/code-gen/code-generator.rb +171 -0
- data/src/code-gen/property-generators.rb +65 -0
- data/src/code-gen/widget-generator.rb +22 -0
- data/src/convert.rb +60 -0
- data/src/direct_widget_manipulation.rb +343 -0
- data/src/docman.rb +260 -0
- data/src/document.rb +405 -0
- data/src/event_categories.yaml +85 -0
- data/src/event_listener.rb +57 -0
- data/src/events.yaml +77 -0
- data/src/events_docu.yaml +228 -0
- data/src/get_events.rb +64 -0
- data/src/gui/ArrowButton.tga +0 -0
- data/src/gui/BoxMinus.tga +0 -0
- data/src/gui/BoxPlus.tga +0 -0
- data/src/gui/Button.tga +0 -0
- data/src/gui/CheckButton.tga +0 -0
- data/src/gui/ComboBox.tga +0 -0
- data/src/gui/Dial.tga +0 -0
- data/src/gui/GroupBox.tga +0 -0
- data/src/gui/HorizontalFrame.tga +0 -0
- data/src/gui/HorizontalSeparator.tga +0 -0
- data/src/gui/Label.tga +0 -0
- data/src/gui/MDIChild.tga +0 -0
- data/src/gui/MDIClient.tga +0 -0
- data/src/gui/Matrix.tga +0 -0
- data/src/gui/MenuCaption.tga +0 -0
- data/src/gui/MenuCascade.tga +0 -0
- data/src/gui/MenuCheck.tga +0 -0
- data/src/gui/MenuCommand.tga +0 -0
- data/src/gui/MenuPane.tga +0 -0
- data/src/gui/MenuRadio.tga +0 -0
- data/src/gui/MenuSeparator.tga +0 -0
- data/src/gui/MenuTitle.tga +0 -0
- data/src/gui/Menubar.tga +0 -0
- data/src/gui/Packer.tga +0 -0
- data/src/gui/ProgressBar.tga +0 -0
- data/src/gui/RadioButton.tga +0 -0
- data/src/gui/RadioMutex.tga +0 -0
- data/src/gui/ScrollWindow.tga +0 -0
- data/src/gui/Scrollbar.tga +0 -0
- data/src/gui/Shutter.tga +0 -0
- data/src/gui/ShutterItem.tga +0 -0
- data/src/gui/Slider.tga +0 -0
- data/src/gui/Spinner.tga +0 -0
- data/src/gui/Splitter.tga +0 -0
- data/src/gui/StatusBar.tga +0 -0
- data/src/gui/Statusline.tga +0 -0
- data/src/gui/Switcher.tga +0 -0
- data/src/gui/TabBar.tga +0 -0
- data/src/gui/TabBook.tga +0 -0
- data/src/gui/TabItem.tga +0 -0
- data/src/gui/Text.tga +0 -0
- data/src/gui/TextField.tga +0 -0
- data/src/gui/ToggleButton.tga +0 -0
- data/src/gui/Toolbar.tga +0 -0
- data/src/gui/VerticalFrame.tga +0 -0
- data/src/gui/VerticalSeparator.tga +0 -0
- data/src/gui/_guib_event_editor.rb +185 -0
- data/src/gui/_guib_event_editor.rbin +0 -0
- data/src/gui/_guib_genruby.rb +414 -0
- data/src/gui/_guib_genruby.rbin +0 -0
- data/src/gui/_guib_mainwin.rb +574 -0
- data/src/gui/_guib_mainwin.rbin +0 -0
- data/src/gui/event_editor.rb +180 -0
- data/src/gui/genruby.rb +155 -0
- data/src/gui/guib__console.rb +265 -0
- data/src/gui/mainwin.rb +71 -0
- data/src/gui/ruby_console.rb +263 -0
- data/src/gui/svg/Matrix.svg +87 -0
- data/src/gui/svg/MenuCheck.svg +135 -0
- data/src/gui/svg/MenuRadio.svg +130 -0
- data/src/gui/svg/RadioMutex.svg +119 -0
- data/src/gui/textview.rb +101 -0
- data/src/gui/textview.rbin +0 -0
- data/src/minitest.rb +60 -0
- data/src/prop-lists.rb +323 -0
- data/src/prop-types.rb +606 -0
- data/src/properties.rb +119 -0
- data/src/propman.rb +88 -0
- data/src/relink_mechanisms.rb +95 -0
- data/src/serialize.rb +167 -0
- data/src/state_machine.rb +73 -0
- data/src/version.rb +6 -0
- data/src/widget-lists.rb +118 -0
- data/src/widget-selector.rb +85 -0
- data/src/widgettree-controls.rb +183 -0
- data.tar.gz.sig +0 -0
- metadata +236 -0
- metadata.gz.sig +0 -0
@@ -0,0 +1,343 @@
|
|
1
|
+
# Copyright (c) 2004-2006 by Henon (meinrad dot recheis at gmail dot com)
|
2
|
+
|
3
|
+
require "libGUIb16"
|
4
|
+
require "fox16"
|
5
|
+
require "state_machine"
|
6
|
+
require "event_listener"
|
7
|
+
require "relink_mechanisms"
|
8
|
+
|
9
|
+
module DirectWidgetManipulation
|
10
|
+
include Fox
|
11
|
+
|
12
|
+
KEY_MODS = {
|
13
|
+
"SHIFT" => 1,
|
14
|
+
"CAPSLOCK" => 2,
|
15
|
+
"CTRL" => 4,
|
16
|
+
"ALT" => 8,
|
17
|
+
"NUM" => 16,
|
18
|
+
"ROLL" => 224
|
19
|
+
}
|
20
|
+
KEY_CODES = {
|
21
|
+
"CURSOR_UP" => 65362,
|
22
|
+
"CURSOR_LEFT" => 65361,
|
23
|
+
"CURSOR_DOWN" => 65364,
|
24
|
+
"CURSOR_RIGHT" => 65363
|
25
|
+
}
|
26
|
+
KEY_CODES.each { |k, v| eval "#{k}=#{v}" }
|
27
|
+
KEY_MODS.each { |k, v| eval "#{k}=#{v}" }
|
28
|
+
|
29
|
+
__sends__ "event_MOTION", "event_LEAVE", "event_ENTER", "event_LEFTBUTTONPRESS", "event_LEFTBUTTONRELEASE"
|
30
|
+
__sends__ "event_KEYPRESS", "event_KEYRELEASE"
|
31
|
+
attr_accessor :do_hover, :do_relink, :do_select
|
32
|
+
$hovered_widgets = []
|
33
|
+
$selected_widgets = []
|
34
|
+
SELECT_COLOR = Fox::FXRGB(255, 0, 0)
|
35
|
+
CURSOR_COLOR = Fox::FXRGB(255, 0, 0)
|
36
|
+
HOVER_COLOR = Fox::FXRGB(100, 120, 255)
|
37
|
+
FRAMESTYLE_METHODS = {
|
38
|
+
"hiliteColor" => SELECT_COLOR,
|
39
|
+
"shadowColor" => SELECT_COLOR,
|
40
|
+
"borderColor" => SELECT_COLOR,
|
41
|
+
"frameStyle" => FRAME_LINE | FRAME_THICK
|
42
|
+
}
|
43
|
+
HOVER_METHODS = {
|
44
|
+
"backColor" => HOVER_COLOR
|
45
|
+
}
|
46
|
+
|
47
|
+
def setup_drag_statemachine
|
48
|
+
@do_hover = true
|
49
|
+
@do_relink = true
|
50
|
+
@do_select = true
|
51
|
+
@drag_SM = StateMachine.new
|
52
|
+
states = [
|
53
|
+
idle = State.new("IDLE"),
|
54
|
+
lmbdown = State.new("LMBDOWN"),
|
55
|
+
dragging = State.new("DRAGGING")
|
56
|
+
]
|
57
|
+
@drag_SM.add_states(*states)
|
58
|
+
action = proc {|o, n| # puts "#{o}-->#{n}"
|
59
|
+
}
|
60
|
+
@drag_SM.state_transition(idle, lmbdown,
|
61
|
+
proc { |o, n| o.input["event_name"] == SEL_LEFTBUTTONPRESS },
|
62
|
+
action)
|
63
|
+
@drag_SM.state_transition(lmbdown, idle,
|
64
|
+
proc { |o, n| o.input["event_name"] == SEL_LEFTBUTTONRELEASE },
|
65
|
+
proc { |o, n| # puts "#{o}-->#{n}"
|
66
|
+
extended_select
|
67
|
+
})
|
68
|
+
@drag_SM.state_transition(lmbdown, dragging,
|
69
|
+
proc { |o, n| o.input["event_name"] == SEL_MOTION },
|
70
|
+
a = proc { |o, n| n[:last_time] = Time.now })
|
71
|
+
@drag_SM.state_transition(dragging, dragging,
|
72
|
+
proc { |o, n|
|
73
|
+
t = o[:last_time]
|
74
|
+
o.input["event_name"] == SEL_MOTION and (Time.now.to_f - t.to_f) > 0.1
|
75
|
+
},
|
76
|
+
proc { |o, n|
|
77
|
+
n[:last_time] = Time.now
|
78
|
+
break unless @do_relink
|
79
|
+
e = o.input["event"]
|
80
|
+
dest = shell.get_widget_at(translateCoordinatesTo(shell, e.win_x, e.win_y))
|
81
|
+
# p dest
|
82
|
+
dest.hover if RelinkMechanisms.mouse_relink_test(self, dest) and dest.respond_to? :hover
|
83
|
+
})
|
84
|
+
@drag_SM.state_transition(dragging, idle,
|
85
|
+
proc { |o, n| o.input["event_name"] == SEL_LEFTBUTTONRELEASE },
|
86
|
+
proc { |o, n|
|
87
|
+
n[:last_time] = Time.now
|
88
|
+
break unless @do_relink
|
89
|
+
e = o.input["event"]
|
90
|
+
dest = shell.get_widget_at(translateCoordinatesTo(shell, e.win_x, e.win_y))
|
91
|
+
# p dest
|
92
|
+
RelinkMechanisms.mouse_relink(self, dest)
|
93
|
+
})
|
94
|
+
@drag_SM.start
|
95
|
+
end
|
96
|
+
|
97
|
+
def hover(*args)
|
98
|
+
return if !@do_hover or @hovered
|
99
|
+
@hovered = true
|
100
|
+
$hovered_widgets.each { |w| w.unhover }
|
101
|
+
$hovered_widgets << self
|
102
|
+
HOVER_METHODS.each { |method, value|
|
103
|
+
eval "@_#{method}=self.#{method}" if respond_to? method
|
104
|
+
eval "self.#{method}=#{value}" if respond_to? method + "="
|
105
|
+
}
|
106
|
+
end
|
107
|
+
|
108
|
+
def unhover(*args)
|
109
|
+
return if !@do_hover or !@hovered or @drag_SM.state.to_s == "DRAGGING"
|
110
|
+
@hovered = false
|
111
|
+
$hovered_widgets.delete self
|
112
|
+
HOVER_METHODS.each { |method, value|
|
113
|
+
eval "self.#{method}=@_#{method}" if respond_to? method + "="
|
114
|
+
}
|
115
|
+
end
|
116
|
+
|
117
|
+
def deselect_all
|
118
|
+
$selected_widgets.dup.each { |w| w.deselect }
|
119
|
+
end
|
120
|
+
|
121
|
+
def extended_select
|
122
|
+
deselect_all unless $CTRL
|
123
|
+
@selected ? deselect(recursive: true) : select(recursive: true)
|
124
|
+
end
|
125
|
+
|
126
|
+
def select(params = {})
|
127
|
+
return if !@do_select or @selected
|
128
|
+
$selected_widgets << self
|
129
|
+
@selected = true
|
130
|
+
FRAMESTYLE_METHODS.each { |method, value|
|
131
|
+
eval "@_#{method}=self.#{method}" if respond_to? method
|
132
|
+
eval "self.#{method}=#{value}" if respond_to? method + "="
|
133
|
+
}
|
134
|
+
if $SHIFT and params[:recursive]
|
135
|
+
children.each { |w| w.select(params) if w.respond_to? :select }
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def deselect(params = {})
|
140
|
+
return if !@do_select or !@selected
|
141
|
+
$selected_widgets.delete self
|
142
|
+
@selected = false
|
143
|
+
FRAMESTYLE_METHODS.each { |method, value|
|
144
|
+
eval "self.#{method}=@_#{method}" if respond_to? method + "="
|
145
|
+
}
|
146
|
+
if $SHIFT and params[:recursive]
|
147
|
+
children.each { |w| w.deselect(params) if w.respond_to? :deselect }
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def edit_mode
|
152
|
+
multiplex_mouse_events!
|
153
|
+
observe_keymods!
|
154
|
+
self.enabled = true
|
155
|
+
setup_drag_statemachine
|
156
|
+
@em_leave = on_event_LEAVE { |sender, selector, event| unhover }
|
157
|
+
@em_motion = on_event_MOTION { |sender, selector, event|
|
158
|
+
hover
|
159
|
+
@drag_SM.input "event_name" => SEL_MOTION, "event" => event
|
160
|
+
}
|
161
|
+
@em_lbpress = on_event_LEFTBUTTONPRESS { |sender, selector, event|
|
162
|
+
@drag_SM.input "event_name" => SEL_LEFTBUTTONPRESS, "event" => event
|
163
|
+
}
|
164
|
+
@em_lbrelease = on_event_LEFTBUTTONRELEASE { |sender, selector, event|
|
165
|
+
@drag_SM.input "event_name" => SEL_LEFTBUTTONRELEASE, "event" => event
|
166
|
+
}
|
167
|
+
multiplex_keyboard_events!
|
168
|
+
@em_keypress = on_event_KEYPRESS { |sender, selector, event|
|
169
|
+
RelinkMechanisms.keyboard_relink($selected_widgets[0], event)
|
170
|
+
}
|
171
|
+
end
|
172
|
+
|
173
|
+
def disable_edit_mode
|
174
|
+
del_event_LEAVE @em_leave
|
175
|
+
del_event_MOTION @em_motion
|
176
|
+
del_event_LEFTBUTTONRELEASE @em_lbrelease
|
177
|
+
del_event_LEFTBUTTONPRESS @em_lbpress
|
178
|
+
del_event_KEYPRESS @em_keypress
|
179
|
+
$hovered_widgets.each { |w| w.unhover }
|
180
|
+
deselect_all
|
181
|
+
@drag_SM = nil
|
182
|
+
end
|
183
|
+
|
184
|
+
def insert_mode
|
185
|
+
self.enabled = true
|
186
|
+
multiplex_mouse_events!
|
187
|
+
observe_keymods!
|
188
|
+
@im_keypress = on_event_KEYPRESS { |sender, selector, event|
|
189
|
+
$insert_cursor.children[0].backColor = CURSOR_COLOR
|
190
|
+
RelinkMechanisms.keyboard_relink($insert_cursor, event)
|
191
|
+
update_cursor
|
192
|
+
}
|
193
|
+
@im_lbpress = on_event_LEFTBUTTONPRESS { |sender, selector, event|
|
194
|
+
$insert_cursor.children[0].backColor = CURSOR_COLOR
|
195
|
+
RelinkMechanisms.mouse_relink $insert_cursor, self
|
196
|
+
update_cursor
|
197
|
+
}
|
198
|
+
unless $insert_cursor
|
199
|
+
$insert_cursor = Fox::FXPacker.new(shell)
|
200
|
+
inside = Fox::FXFrame.new($insert_cursor)
|
201
|
+
$insert_cursor.create if $fxapp.created?
|
202
|
+
$insert_cursor.pad(2, 2, 2, 2)
|
203
|
+
inside.pad(1, 1, 1, 1)
|
204
|
+
inside.frameStyle = $insert_cursor.frameStyle = 0
|
205
|
+
timeout = proc { |sender, sel, data|
|
206
|
+
inside.backColor = if inside.backColor == CURSOR_COLOR
|
207
|
+
$insert_cursor.backColor
|
208
|
+
else
|
209
|
+
CURSOR_COLOR
|
210
|
+
end
|
211
|
+
$cursor_timer = $fxapp.addTimeout(500, &timeout)
|
212
|
+
}
|
213
|
+
$cursor_timer = $fxapp.addTimeout(500, &timeout)
|
214
|
+
update_cursor
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
def disable_insert_mode
|
219
|
+
del_event_LEFTBUTTONPRESS @im_lbpress
|
220
|
+
del_event_KEYPRESS @im_keypress
|
221
|
+
if $cursor_timer
|
222
|
+
$fxapp.removeTimeout($cursor_timer)
|
223
|
+
$cursor_timer = nil
|
224
|
+
end
|
225
|
+
if $insert_cursor
|
226
|
+
p = $insert_cursor.parent
|
227
|
+
$insert_cursor.destroy
|
228
|
+
p.recalc
|
229
|
+
end
|
230
|
+
$insert_cursor = nil
|
231
|
+
end
|
232
|
+
|
233
|
+
def update_cursor
|
234
|
+
$insert_cursor.children[0].layoutHints = $insert_cursor.layoutHints = $insert_cursor.parent.is_a? Fox::FXHorizontalFrame ?
|
235
|
+
LAYOUT_FILL_Y
|
236
|
+
:
|
237
|
+
LAYOUT_FILL_X
|
238
|
+
|
239
|
+
$insert_cursor.backColor = $insert_cursor.parent.backColor
|
240
|
+
end
|
241
|
+
# ~ def deactivate_mode
|
242
|
+
# ~ # maybe there is a better way to "unconnect"?
|
243
|
+
# ~ connect(SEL_MOTION){0}
|
244
|
+
# ~ connect(SEL_ENTER){0}
|
245
|
+
# ~ connect(SEL_LEAVE){0}
|
246
|
+
# ~ connect(SEL_LEFTBUTTONPRESS){0}
|
247
|
+
# ~ connect(SEL_LEFTBUTTONRELEASE){0}
|
248
|
+
# ~ connect(SEL_KEYPRESS){0}
|
249
|
+
# ~ connect(SEL_KEYRELEASE){0}
|
250
|
+
# ~ end
|
251
|
+
end
|
252
|
+
|
253
|
+
class Fox::FXWindow
|
254
|
+
include DirectWidgetManipulation
|
255
|
+
def get_widget_at pos
|
256
|
+
# puts "-\t#{self.class}"
|
257
|
+
child = getChildAt(*pos)
|
258
|
+
if child.nil?
|
259
|
+
self
|
260
|
+
elsif child.composite?
|
261
|
+
child.get_widget_at(translateCoordinatesTo(child, pos[0], pos[1]))
|
262
|
+
else
|
263
|
+
child
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
def multiplex_mouse_events!
|
268
|
+
connect(SEL_LEAVE) { |sender, selector, event|
|
269
|
+
event_LEAVE(sender, selector, event)
|
270
|
+
0
|
271
|
+
}
|
272
|
+
connect(SEL_MOTION) { |sender, selector, event|
|
273
|
+
event_MOTION(sender, selector, event)
|
274
|
+
0
|
275
|
+
}
|
276
|
+
connect(SEL_LEFTBUTTONPRESS) { |sender, selector, event|
|
277
|
+
event_LEFTBUTTONPRESS(sender, selector, event)
|
278
|
+
0
|
279
|
+
}
|
280
|
+
connect(SEL_LEFTBUTTONRELEASE) { |sender, selector, event|
|
281
|
+
event_LEFTBUTTONRELEASE(sender, selector, event)
|
282
|
+
0
|
283
|
+
}
|
284
|
+
end
|
285
|
+
|
286
|
+
def multiplex_keyboard_events!
|
287
|
+
connect(SEL_KEYPRESS) { |sender, selector, event|
|
288
|
+
event_KEYPRESS(sender, selector, event)
|
289
|
+
1
|
290
|
+
}
|
291
|
+
connect(SEL_KEYRELEASE) { |sender, selector, event|
|
292
|
+
event_KEYRELEASE(sender, selector, event)
|
293
|
+
1
|
294
|
+
}
|
295
|
+
end
|
296
|
+
|
297
|
+
# listen to keyboard modifiers such as CTRL, SHIFT, etc.
|
298
|
+
# and set flags: $CTRL, $SHIFT, etc
|
299
|
+
def observe_keymods!
|
300
|
+
multiplex_keyboard_events!
|
301
|
+
on_event_KEYPRESS { |sender, selector, event|
|
302
|
+
# puts event.state
|
303
|
+
KEY_MODS.each { |mod, value|
|
304
|
+
eval("$#{mod}=true if !$#{mod}") if event.state & value == value
|
305
|
+
}
|
306
|
+
# p [$CTRL, $SHIFT, $ALT]
|
307
|
+
}
|
308
|
+
on_event_KEYRELEASE { |sender, selector, event|
|
309
|
+
KEY_MODS.each { |mod, value|
|
310
|
+
eval("$#{mod}=nil if $#{mod}") if event.state & value == 0
|
311
|
+
}
|
312
|
+
}
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
if __FILE__ == $0
|
317
|
+
$stdout.sync = true
|
318
|
+
include Fox
|
319
|
+
#==================================
|
320
|
+
app = FX::App.new "", ""
|
321
|
+
mw = FX::MainWindow.new app
|
322
|
+
mw.pad(10, 10, 10, 10)
|
323
|
+
lb = FX::Label.new mw
|
324
|
+
hf = FX::HorizontalFrame.new mw, FRAME_LINE
|
325
|
+
btn = FX::Button.new hf
|
326
|
+
hf = FX::GroupBox.new hf
|
327
|
+
btn = FX::Button.new hf
|
328
|
+
mw.recursive { |w|
|
329
|
+
w.edit_mode
|
330
|
+
}
|
331
|
+
btn.connect(SEL_COMMAND) {
|
332
|
+
mw.recursive { |w|
|
333
|
+
w.disable_edit_mode
|
334
|
+
w.insert_mode
|
335
|
+
}
|
336
|
+
}
|
337
|
+
btn.text = "click to change to insert mode"
|
338
|
+
mw.show
|
339
|
+
mw.observe_keymods!
|
340
|
+
app.create
|
341
|
+
app.run
|
342
|
+
#==================================
|
343
|
+
end
|
data/src/docman.rb
ADDED
@@ -0,0 +1,260 @@
|
|
1
|
+
# Copyright (c) 2004-2006 by Henon (meinrad dot recheis at gmail dot com)
|
2
|
+
require "singleton"
|
3
|
+
require "document"
|
4
|
+
require "genruby"
|
5
|
+
class DocMan
|
6
|
+
include Singleton
|
7
|
+
def initialize
|
8
|
+
@docs = []
|
9
|
+
@doc_hash = {}
|
10
|
+
@parent = MAINWIN.topwin
|
11
|
+
# @new_project_dlg.topwin.hide
|
12
|
+
@genruby_dlg = GenRubyDialog.new @parent
|
13
|
+
create_docman
|
14
|
+
update
|
15
|
+
end
|
16
|
+
attr_reader :current, :docs, :doc_hash
|
17
|
+
def ask_save
|
18
|
+
# TODO
|
19
|
+
end
|
20
|
+
|
21
|
+
def genruby
|
22
|
+
# puts "genruby_dlg"
|
23
|
+
@genruby_dlg.show
|
24
|
+
end
|
25
|
+
|
26
|
+
def set_wdir
|
27
|
+
dirdlg = FXDirDialog.new @parent, "select the working directory"
|
28
|
+
if dirdlg.execute == 1
|
29
|
+
wdir = dirdlg.directory.tr("\\", "/")
|
30
|
+
Dir.chdir wdir
|
31
|
+
puts "changed working dir to: " + wdir
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def add_widget classname, where = "after"
|
36
|
+
@current.add_widget(classname, where) if @current
|
37
|
+
end
|
38
|
+
|
39
|
+
def create doctype
|
40
|
+
# ~ @current.dlg.hide if @current
|
41
|
+
# @current.topwin.hide if @current
|
42
|
+
doc = Document.new doctype
|
43
|
+
@docs << doc
|
44
|
+
doc.name = "unnamed_" + doctype + ".rbin"
|
45
|
+
tab = create_tab(doc)
|
46
|
+
switch_documents(nil, nil, tab.index)
|
47
|
+
update
|
48
|
+
doc.topwin.resize(500, 400)
|
49
|
+
end
|
50
|
+
|
51
|
+
def close_all
|
52
|
+
# TODO: ask save
|
53
|
+
@docs.each { |doc|
|
54
|
+
close(doc, true, false)
|
55
|
+
}
|
56
|
+
end
|
57
|
+
|
58
|
+
def close(doc = @current, save = true, update_gui = true)
|
59
|
+
return unless doc
|
60
|
+
# TODO: ask save if @current.dirty and save==true
|
61
|
+
doc.doclist_item.hide
|
62
|
+
@tabbar.recalc
|
63
|
+
@tabbar.forceRefresh
|
64
|
+
doc.doclist_item.destroy # tabitem removed
|
65
|
+
doc.topwin.destroy # dialog removed
|
66
|
+
MAINWIN.Switcher.children[doc.switcherIndex].destroy # treelist removed
|
67
|
+
@docs.delete doc # document removed
|
68
|
+
if update_gui
|
69
|
+
@current = @docs[@docs.size - 1]
|
70
|
+
switch
|
71
|
+
update
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def switch
|
76
|
+
if @current
|
77
|
+
MAINWIN.Switcher.current = @current.switcherIndex
|
78
|
+
else
|
79
|
+
# MAINWIN.Switcher.current=0
|
80
|
+
# ???
|
81
|
+
end
|
82
|
+
return unless @current and @current.marked
|
83
|
+
# @genruby_dlg.topwin.hide
|
84
|
+
@genruby_dlg.show if @genruby_dlg.topwin.shown? # update genruby dlg
|
85
|
+
@current.marked.update_properties
|
86
|
+
EventEditor.instance.set_widget(@current.marked)
|
87
|
+
end
|
88
|
+
|
89
|
+
def switch_documents(*args)
|
90
|
+
index = args[2]
|
91
|
+
if index.is_a? Integer
|
92
|
+
tabitem = @tabbar.children[index]
|
93
|
+
e = @doc_hash[tabitem]
|
94
|
+
@current.topwin.hide if @current
|
95
|
+
e.topwin.show(0)
|
96
|
+
@current = e
|
97
|
+
# event_document_switched @current
|
98
|
+
end
|
99
|
+
switch
|
100
|
+
end
|
101
|
+
|
102
|
+
def load(filename=nil)
|
103
|
+
filename ||= SuperFileDialog.new(@parent, "", "load foxGUIb document").start
|
104
|
+
if filename
|
105
|
+
# ~ @current.dlg.hide if @current
|
106
|
+
# @current.topwin.hide if @current
|
107
|
+
doc = Document.new nil
|
108
|
+
doc.load filename
|
109
|
+
@docs << doc
|
110
|
+
# ~ @list.appendItem filename
|
111
|
+
# ~ @current.doclist_item=@list.numItems-1
|
112
|
+
tab = create_tab(doc)
|
113
|
+
switch_documents nil, nil, tab.index
|
114
|
+
end
|
115
|
+
update
|
116
|
+
end
|
117
|
+
|
118
|
+
def save
|
119
|
+
return unless @current
|
120
|
+
@current.save @current.name
|
121
|
+
end
|
122
|
+
|
123
|
+
def save_as
|
124
|
+
return unless @current
|
125
|
+
filename = SuperFileDialog.new(@parent, @current.name, "save foxGUIb document").start
|
126
|
+
return unless filename
|
127
|
+
@current.save filename
|
128
|
+
@current.doclist_item.text = filename
|
129
|
+
@current.name = filename
|
130
|
+
end
|
131
|
+
|
132
|
+
def save_all
|
133
|
+
@docs.each { |doc|
|
134
|
+
doc.save doc.name
|
135
|
+
}
|
136
|
+
end
|
137
|
+
|
138
|
+
def emergency_save
|
139
|
+
@docs.each { |doc|
|
140
|
+
doc.save doc.name + "_failsave.rbin"
|
141
|
+
}
|
142
|
+
end
|
143
|
+
|
144
|
+
def generate opts, classname, unittest
|
145
|
+
if opts == "ruby.class"
|
146
|
+
dlg = RubyFileDialog.new @parent, @current.name, "save generated ruby code"
|
147
|
+
filename = dlg.start
|
148
|
+
return unless filename
|
149
|
+
$fxapp.beginWaitCursor {
|
150
|
+
s = @current.generate_code opts, @current.fxtree.currentItem, classname, unittest
|
151
|
+
f = File.new(filename, "w")
|
152
|
+
f.puts s
|
153
|
+
f.close
|
154
|
+
}
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
def generate_code opts, item, classname = nil, unittest = true
|
159
|
+
return unless @current
|
160
|
+
# rd,wr=IO.pipe
|
161
|
+
@current.generate_code opts, item, classname, unittest
|
162
|
+
# wr.flush
|
163
|
+
# wr.close
|
164
|
+
# rd.read
|
165
|
+
end
|
166
|
+
|
167
|
+
def set_dirty e
|
168
|
+
item = e.doclist_item
|
169
|
+
return unless item
|
170
|
+
item.text += " *"
|
171
|
+
end
|
172
|
+
|
173
|
+
def create_docman
|
174
|
+
@tabbar = MAINWIN.project_TabBar
|
175
|
+
@tabbar.connect SEL_COMMAND, method(:switch_documents)
|
176
|
+
end
|
177
|
+
|
178
|
+
def update
|
179
|
+
MAINWIN.genruby.enabled = (!@docs.empty?)
|
180
|
+
MAINWIN.save_dialog.enabled = (!@docs.empty?)
|
181
|
+
MAINWIN.save_dialog_as.enabled = (!@docs.empty?)
|
182
|
+
MAINWIN.close_dialog.enabled = (!@docs.empty?)
|
183
|
+
MAINWIN.viewDialog.enabled = (!@docs.empty?)
|
184
|
+
# MAINWIN.hideDialog.enabled=(not @docs.empty?)
|
185
|
+
if @docs.empty? and PropMan.created?
|
186
|
+
PropMan.instance.reset_props
|
187
|
+
end
|
188
|
+
if @current
|
189
|
+
@tabbar.setCurrent(@tabbar.children.index(@current.doclist_item))
|
190
|
+
end
|
191
|
+
@current.topwin.shown = true if @current
|
192
|
+
end
|
193
|
+
|
194
|
+
def create_tab doc
|
195
|
+
tab = @tabbar.create_tab(doc.name)
|
196
|
+
tab.backColor = STD_BACK_COLOR
|
197
|
+
tab.frameStyle = FRAME_LINE
|
198
|
+
tab.hiliteColor = FXRGB(0, 0, 0)
|
199
|
+
tab.create
|
200
|
+
doc.doclist_item = tab # todo: eliminate doclist_item!
|
201
|
+
@doc_hash[tab] = doc
|
202
|
+
tab
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
class SuperFileDialog
|
207
|
+
def initialize p, filename = "", title = "no title"
|
208
|
+
@dialog = FXFileDialog.new(p, title)
|
209
|
+
@dialog.directory = Dir.getwd
|
210
|
+
generate_patterns
|
211
|
+
@dialog.patternList = @patterns
|
212
|
+
@dialog.currentPattern = @currentPattern
|
213
|
+
@dialog.filename = filename.to_s
|
214
|
+
end
|
215
|
+
|
216
|
+
def generate_patterns
|
217
|
+
@patterns = ["All Files (*)",
|
218
|
+
"Fox-GUIb Documents (*.pp,*.rbin)",
|
219
|
+
"PrettyPrint Documents (*.pp)",
|
220
|
+
"Binary Documents (*.rbin)"]
|
221
|
+
@currentPattern = 1
|
222
|
+
end
|
223
|
+
|
224
|
+
def start
|
225
|
+
if @dialog.execute != 0
|
226
|
+
return rel_path(Dir.getwd, @dialog.filename)
|
227
|
+
end
|
228
|
+
nil
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
class RubyFileDialog < SuperFileDialog
|
233
|
+
def generate_patterns
|
234
|
+
@patterns = ["All Files (*)",
|
235
|
+
"Ruby Source Files (*.rb,*.rbw)"]
|
236
|
+
@currentPattern = 1
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
class IconDialog < SuperFileDialog
|
241
|
+
def generate_patterns
|
242
|
+
@patterns = ["All Files (*)",
|
243
|
+
"Images (*.gif,*.bmp,*.xpm,*.pcx,*.ico,*.png,*.jpg,*.tif,*.tga)",
|
244
|
+
"GIF Image (*.gif)",
|
245
|
+
"BMP Image (*.bmp)",
|
246
|
+
"XPM Image (*.xpm)",
|
247
|
+
"PCX Image (*.pcx)",
|
248
|
+
"ICO Image (*.ico)",
|
249
|
+
"PNG Image (*.png)",
|
250
|
+
"JPEG Image (*.jpg)",
|
251
|
+
"TIFF Image (*.tif)",
|
252
|
+
"TARGA Image (*.tga)"]
|
253
|
+
@currentPattern = 1
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
if __FILE__ == $0
|
258
|
+
puts rel_path("F:/hilo/djdk/df", "F:/hilo/djdk/df\\fgdfg")
|
259
|
+
puts rel_path("F:/hilo/djdk/df", "F:/hilo/asdf")
|
260
|
+
end
|