| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package Tk::JDialog; |
|
2
|
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
27135
|
use 5.006; |
|
|
1
|
|
|
|
|
4
|
|
|
4
|
1
|
|
|
1
|
|
5
|
use strict; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
21
|
|
|
5
|
1
|
|
|
1
|
|
4
|
use warnings; |
|
|
1
|
|
|
|
|
11
|
|
|
|
1
|
|
|
|
|
104
|
|
|
6
|
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
=head1 NAME |
|
8
|
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
Tk::JDialog - a translation of `tk_dialog' from Tcl/Tk to TkPerl (based on John Stoffel's idea). |
|
10
|
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
=head1 VERSION |
|
12
|
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
Version 1.01 |
|
14
|
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
=cut |
|
16
|
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
our $VERSION = '1.11'; |
|
18
|
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
=head1 SYNOPSIS |
|
21
|
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
use Tk::JDialog; |
|
23
|
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
my $Dialog = $mw->JDialog( -option => value, ... ); |
|
25
|
|
|
|
|
|
|
... |
|
26
|
|
|
|
|
|
|
my $button_label = $Dialog->Show; |
|
27
|
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
=head1 DESCRIPTION |
|
29
|
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
This is an OO implementation of `tk_dialog'. First, create all your Dialog |
|
31
|
|
|
|
|
|
|
objects during program initialization. When it's time to use a dialog, |
|
32
|
|
|
|
|
|
|
invoke the `show' method on a dialog object; the method then displays |
|
33
|
|
|
|
|
|
|
the dialog, waits for a button to be invoked, and returns the text |
|
34
|
|
|
|
|
|
|
label of the selected button. |
|
35
|
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
A Dialog object essentially consists of two subwidgets: a Label widget for |
|
37
|
|
|
|
|
|
|
the bitmap and a Label wigdet for the text of the dialog. If required, you |
|
38
|
|
|
|
|
|
|
can invoke the `configure' method to change any characteristic of these |
|
39
|
|
|
|
|
|
|
subwidgets. |
|
40
|
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
Because a Dialog object is a Toplevel widget all the 'composite' base class |
|
42
|
|
|
|
|
|
|
methods are available to you. |
|
43
|
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
=head1 EXAMPLE |
|
45
|
|
|
|
|
|
|
|
|
46
|
|
|
|
|
|
|
#!/usr/bin/perl |
|
47
|
|
|
|
|
|
|
|
|
48
|
|
|
|
|
|
|
use Tk::JDialog; |
|
49
|
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
my $mw = MainWindow->new; |
|
51
|
|
|
|
|
|
|
my $Dialog = $mw->JDialog( |
|
52
|
|
|
|
|
|
|
-title => 'Choose!', #DISPLAY A WINDOW TITLE |
|
53
|
|
|
|
|
|
|
-text => 'Press Ok to Continue', #DISPLAY A CAPTION |
|
54
|
|
|
|
|
|
|
-bitmap => 'info', #DISPLAY BUILT-IN info BITMAP. |
|
55
|
|
|
|
|
|
|
-default_button => '~Ok', |
|
56
|
|
|
|
|
|
|
-escape_button => '~Cancel', |
|
57
|
|
|
|
|
|
|
-buttons => ['~Ok', '~Cancel', '~Quit'], #DISPLAY 3 BUTTONS |
|
58
|
|
|
|
|
|
|
-images => ['/tmp/ok.xpm', '', ''], #EXAMPLE WITH IMAGE FILE |
|
59
|
|
|
|
|
|
|
); |
|
60
|
|
|
|
|
|
|
my $button_label = $Dialog->Show( ); |
|
61
|
|
|
|
|
|
|
print "..You pressed [$button_label]!\n"; |
|
62
|
|
|
|
|
|
|
exit(0); |
|
63
|
|
|
|
|
|
|
|
|
64
|
|
|
|
|
|
|
=head1 OPTIONS |
|
65
|
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
=over 4 |
|
67
|
|
|
|
|
|
|
|
|
68
|
|
|
|
|
|
|
=item -title |
|
69
|
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
(string) - Title to display in the dialog's decorative window frame. |
|
71
|
|
|
|
|
|
|
Default: ''. |
|
72
|
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
=item -text |
|
74
|
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
(string) - Message to display in the dialog widget. Default: ''. |
|
76
|
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
=item -bitmap |
|
78
|
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
(string) - Bitmap to display in the dialog. |
|
80
|
|
|
|
|
|
|
If non-empty, specifies a bitmap to display in the top portion of |
|
81
|
|
|
|
|
|
|
the Dialog, to the left of the text. If this is an empty string |
|
82
|
|
|
|
|
|
|
then no bitmap is displayed in the Dialog. |
|
83
|
|
|
|
|
|
|
There are several built-in Tk bitmaps: 'error', 'hourglass', 'info', |
|
84
|
|
|
|
|
|
|
'questhead', 'question', 'warning', 'Tk', and 'transparent'. |
|
85
|
|
|
|
|
|
|
You can also use a bitmap file name, ie. '@/path/to/my/bitmap' |
|
86
|
|
|
|
|
|
|
Default: ''. |
|
87
|
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
=item -default_button |
|
89
|
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
(string) - Text label of the button that is to display the |
|
91
|
|
|
|
|
|
|
default border and is to be selected if the user presses [Enter]. |
|
92
|
|
|
|
|
|
|
(''signifies no default button). Default: ''. |
|
93
|
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
=item -escape_button |
|
95
|
|
|
|
|
|
|
|
|
96
|
|
|
|
|
|
|
(string) - Text label of the button that is to be invoked when the |
|
97
|
|
|
|
|
|
|
user presses the key. Default: ''. |
|
98
|
|
|
|
|
|
|
|
|
99
|
|
|
|
|
|
|
=item -button_labels |
|
100
|
|
|
|
|
|
|
|
|
101
|
|
|
|
|
|
|
(Reference) - A reference to a list of one or more strings to |
|
102
|
|
|
|
|
|
|
display in buttons across the bottom of the dialog. These strings |
|
103
|
|
|
|
|
|
|
(labels) are also returned by the Show() method corresponding to |
|
104
|
|
|
|
|
|
|
the button selected. NOTE: A tilde ("~") can be placed before a |
|
105
|
|
|
|
|
|
|
letter in a label string to indicate the > that |
|
106
|
|
|
|
|
|
|
the user can also press to select the button, for example: |
|
107
|
|
|
|
|
|
|
"~Ok" means select this button if the user presses >. |
|
108
|
|
|
|
|
|
|
The tilde is not displayed for the button text. The text is also |
|
109
|
|
|
|
|
|
|
not displayed if an image file is specified in the corresponding |
|
110
|
|
|
|
|
|
|
optional -images array, but is returned if the button is pressed. |
|
111
|
|
|
|
|
|
|
If this option is not given, a single button labeled "OK" is created. |
|
112
|
|
|
|
|
|
|
|
|
113
|
|
|
|
|
|
|
=item -images |
|
114
|
|
|
|
|
|
|
|
|
115
|
|
|
|
|
|
|
(Reference) - Specify the optional path and file id for an image |
|
116
|
|
|
|
|
|
|
for each button to display an image in lieu of the label text |
|
117
|
|
|
|
|
|
|
('' if a corresponding button is to use text). NOTE: button |
|
118
|
|
|
|
|
|
|
will use text if the image file is not found. Also the |
|
119
|
|
|
|
|
|
|
"-button_labels" option MUST ALWAYS be specified anyway to provide |
|
120
|
|
|
|
|
|
|
the required return string. |
|
121
|
|
|
|
|
|
|
|
|
122
|
|
|
|
|
|
|
=item -noballoons |
|
123
|
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
(boolean) - if true (1) then no balloon displaying the "button_labels" |
|
125
|
|
|
|
|
|
|
label text value will be displayed when the mouse hovers over the |
|
126
|
|
|
|
|
|
|
corresponding buttons which display imiages. If false (0), then |
|
127
|
|
|
|
|
|
|
text balloons will be displayed when hovering. Default: 0. |
|
128
|
|
|
|
|
|
|
|
|
129
|
|
|
|
|
|
|
=back |
|
130
|
|
|
|
|
|
|
|
|
131
|
|
|
|
|
|
|
=head1 METHODS |
|
132
|
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
=over 4 |
|
134
|
|
|
|
|
|
|
|
|
135
|
|
|
|
|
|
|
=item Show ( [ -global | -nograb ] ) |
|
136
|
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
$answer = $dialog->B( [ -global | -nograb ] ); |
|
138
|
|
|
|
|
|
|
|
|
139
|
|
|
|
|
|
|
This method displays the Dialog box, waits for the user's response, and |
|
140
|
|
|
|
|
|
|
stores the text string of the selected Button in $answer. This allows |
|
141
|
|
|
|
|
|
|
the programmer to determine which button the user selected. |
|
142
|
|
|
|
|
|
|
|
|
143
|
|
|
|
|
|
|
NOTE: Execution goes into a wait-loop here until the the user makes a |
|
144
|
|
|
|
|
|
|
selection! |
|
145
|
|
|
|
|
|
|
|
|
146
|
|
|
|
|
|
|
If -global is specified a global (rather than local) grab is |
|
147
|
|
|
|
|
|
|
performed (No other window or widget can be minipulated via the keyboard |
|
148
|
|
|
|
|
|
|
or mouse until a button is selected) making the dialog "modal". |
|
149
|
|
|
|
|
|
|
Default: "-nograb" (the dialog is "non-modal" while awaiting input). |
|
150
|
|
|
|
|
|
|
|
|
151
|
|
|
|
|
|
|
The actual Dialog is shown using the Popup method. Any other |
|
152
|
|
|
|
|
|
|
options supplied to Show are passed to Popup, and can be used to |
|
153
|
|
|
|
|
|
|
position the Dialog on the screen. Please read L for |
|
154
|
|
|
|
|
|
|
details. |
|
155
|
|
|
|
|
|
|
|
|
156
|
|
|
|
|
|
|
=item Populate ( -option => value, ... ) |
|
157
|
|
|
|
|
|
|
|
|
158
|
|
|
|
|
|
|
(Constructor) - my $Dialog = $mw->JDialog( -option => value, ... ); |
|
159
|
|
|
|
|
|
|
|
|
160
|
|
|
|
|
|
|
=back |
|
161
|
|
|
|
|
|
|
|
|
162
|
|
|
|
|
|
|
=head1 ADVERTISED WIDGETS |
|
163
|
|
|
|
|
|
|
|
|
164
|
|
|
|
|
|
|
Tk::JDialog inherits all the Tk::Dialog exposed widgets and methods plus |
|
165
|
|
|
|
|
|
|
the following two subwidgets: |
|
166
|
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
=over 4 |
|
168
|
|
|
|
|
|
|
|
|
169
|
|
|
|
|
|
|
=item message |
|
170
|
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
The dialog's Label widget containing the message text. |
|
172
|
|
|
|
|
|
|
|
|
173
|
|
|
|
|
|
|
=item bitmap |
|
174
|
|
|
|
|
|
|
|
|
175
|
|
|
|
|
|
|
The dialog's Label widget containing the bitmap image. |
|
176
|
|
|
|
|
|
|
|
|
177
|
|
|
|
|
|
|
=back |
|
178
|
|
|
|
|
|
|
|
|
179
|
|
|
|
|
|
|
=head1 AUTHOR |
|
180
|
|
|
|
|
|
|
|
|
181
|
|
|
|
|
|
|
Jim Turner, C<< >> |
|
182
|
|
|
|
|
|
|
|
|
183
|
|
|
|
|
|
|
=head1 BUGS |
|
184
|
|
|
|
|
|
|
|
|
185
|
|
|
|
|
|
|
Please report any bugs or feature requests to C, or through |
|
186
|
|
|
|
|
|
|
the web interface at L. I will be notified, |
|
187
|
|
|
|
|
|
|
and then you'll automatically be notified of progress on your bug as I make changes. |
|
188
|
|
|
|
|
|
|
|
|
189
|
|
|
|
|
|
|
=head1 SUPPORT |
|
190
|
|
|
|
|
|
|
|
|
191
|
|
|
|
|
|
|
You can find documentation for this module with the perldoc command. |
|
192
|
|
|
|
|
|
|
|
|
193
|
|
|
|
|
|
|
perldoc Tk::JDialog |
|
194
|
|
|
|
|
|
|
|
|
195
|
|
|
|
|
|
|
|
|
196
|
|
|
|
|
|
|
You can also look for information at: |
|
197
|
|
|
|
|
|
|
|
|
198
|
|
|
|
|
|
|
=over 4 |
|
199
|
|
|
|
|
|
|
|
|
200
|
|
|
|
|
|
|
=item * RT: CPAN's request tracker (report bugs here) |
|
201
|
|
|
|
|
|
|
|
|
202
|
|
|
|
|
|
|
L |
|
203
|
|
|
|
|
|
|
|
|
204
|
|
|
|
|
|
|
=item * AnnoCPAN: Annotated CPAN documentation |
|
205
|
|
|
|
|
|
|
|
|
206
|
|
|
|
|
|
|
L |
|
207
|
|
|
|
|
|
|
|
|
208
|
|
|
|
|
|
|
=item * CPAN Ratings |
|
209
|
|
|
|
|
|
|
|
|
210
|
|
|
|
|
|
|
L |
|
211
|
|
|
|
|
|
|
|
|
212
|
|
|
|
|
|
|
=item * Search CPAN |
|
213
|
|
|
|
|
|
|
|
|
214
|
|
|
|
|
|
|
L |
|
215
|
|
|
|
|
|
|
|
|
216
|
|
|
|
|
|
|
=back |
|
217
|
|
|
|
|
|
|
|
|
218
|
|
|
|
|
|
|
|
|
219
|
|
|
|
|
|
|
=head1 ACKNOWLEDGEMENTS |
|
220
|
|
|
|
|
|
|
|
|
221
|
|
|
|
|
|
|
Tk::JDialog derived from the L wiget from Tcl/Tk to TkPerl (based on |
|
222
|
|
|
|
|
|
|
John Stoffel's idea). It addes the options: -escape_button, images, |
|
223
|
|
|
|
|
|
|
|
|
224
|
|
|
|
|
|
|
=head1 LICENSE AND COPYRIGHT |
|
225
|
|
|
|
|
|
|
|
|
226
|
|
|
|
|
|
|
Copyright 2015 Jim Turner. |
|
227
|
|
|
|
|
|
|
|
|
228
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or |
|
229
|
|
|
|
|
|
|
modify it under the terms of the GNU Lesser General Public |
|
230
|
|
|
|
|
|
|
License as published by the Free Software Foundation; either |
|
231
|
|
|
|
|
|
|
version 2.1 of the License, or (at your option) any later version. |
|
232
|
|
|
|
|
|
|
|
|
233
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful, |
|
234
|
|
|
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
235
|
|
|
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
236
|
|
|
|
|
|
|
Lesser General Public License for more details. |
|
237
|
|
|
|
|
|
|
|
|
238
|
|
|
|
|
|
|
You should have received a copy of the GNU Lesser General Public |
|
239
|
|
|
|
|
|
|
License along with this program; if not, write to the Free |
|
240
|
|
|
|
|
|
|
Software Foundation, Inc., |
|
241
|
|
|
|
|
|
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
242
|
|
|
|
|
|
|
|
|
243
|
|
|
|
|
|
|
=head1 SEE ALSO |
|
244
|
|
|
|
|
|
|
|
|
245
|
|
|
|
|
|
|
L, L, L, L |
|
246
|
|
|
|
|
|
|
|
|
247
|
|
|
|
|
|
|
=cut |
|
248
|
|
|
|
|
|
|
|
|
249
|
|
|
|
|
|
|
# JDialog - a translation of `tk_dialog' from Tcl/Tk to TkPerl (based on |
|
250
|
|
|
|
|
|
|
# John Stoffel's idea). |
|
251
|
|
|
|
|
|
|
# |
|
252
|
|
|
|
|
|
|
# Modified 2/13/97 by Jim Turner of Computer Sciences Corporation to |
|
253
|
|
|
|
|
|
|
# add underline character (alt-key) activation of buttons, fix bug in the |
|
254
|
|
|
|
|
|
|
# bindings for key where default button always activated even if |
|
255
|
|
|
|
|
|
|
# another button had the keyboard focus. Now, the default button starts |
|
256
|
|
|
|
|
|
|
# with the input focus!!! |
|
257
|
|
|
|
|
|
|
# |
|
258
|
|
|
|
|
|
|
# Jim Turner also added the "escape_button" option on 2/14/97 to allow |
|
259
|
|
|
|
|
|
|
# programmer to specify a button to invoke if user presses the key! |
|
260
|
|
|
|
|
|
|
# Jim Turner also added the "images" option on 2/14/97 to allow programmer |
|
261
|
|
|
|
|
|
|
# to specify gifs in leu of text for the buttons. |
|
262
|
|
|
|
|
|
|
# |
|
263
|
|
|
|
|
|
|
# Jim Turner also removed the "wraplength" option on 2/19/97 to allow |
|
264
|
|
|
|
|
|
|
# longer label strings (>3") to not be broken. User can specify -wraplength! |
|
265
|
|
|
|
|
|
|
# Stephen O. Lidie, Lehigh University Computing Center. 94/12/27 |
|
266
|
|
|
|
|
|
|
# lusol@Lehigh.EDU |
|
267
|
|
|
|
|
|
|
# |
|
268
|
|
|
|
|
|
|
# 04/22/97 Jim Turner fixed bug where screen completely locks up if the calling |
|
269
|
|
|
|
|
|
|
# script invokes a Motif app (ie. xv or another Perl/Tk app) shortly after |
|
270
|
|
|
|
|
|
|
# calling this dialog box. Did not seem to adversely effect keyboard focus. |
|
271
|
|
|
|
|
|
|
# fixed by commenting out 1 line of code (&$old_focus); |
|
272
|
|
|
|
|
|
|
# |
|
273
|
|
|
|
|
|
|
# This is an OO implementation of `tk_dialog'. First, create all your Dialog |
|
274
|
|
|
|
|
|
|
# objects during program initialization. When it's time to use a dialog, |
|
275
|
|
|
|
|
|
|
# invoke the `show' method on a dialog object; the method then displays the |
|
276
|
|
|
|
|
|
|
# dialog, waits for a button to be invoked, and returns the text label of the |
|
277
|
|
|
|
|
|
|
# selected button. |
|
278
|
|
|
|
|
|
|
# |
|
279
|
|
|
|
|
|
|
# A Dialog object essentially consists of two subwidgets: a Label widget for |
|
280
|
|
|
|
|
|
|
# the bitmap and a Label wigdet for the text of the dialog. If required, you |
|
281
|
|
|
|
|
|
|
# can invoke the `configure' method to change any characteristic of these |
|
282
|
|
|
|
|
|
|
# subwidgets. |
|
283
|
|
|
|
|
|
|
# |
|
284
|
|
|
|
|
|
|
# Because a Dialog object is a Toplevel widget all the 'composite' base class |
|
285
|
|
|
|
|
|
|
# methods are available to you. |
|
286
|
|
|
|
|
|
|
|
|
287
|
1
|
|
|
1
|
|
4
|
use Carp; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
96
|
|
|
288
|
|
|
|
|
|
|
#use strict qw(vars); |
|
289
|
|
|
|
|
|
|
our $useBalloon; |
|
290
|
1
|
|
|
1
|
|
516
|
use Tk ":eventtypes"; |
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
291
|
|
|
|
|
|
|
use Tk::Balloon; $useBalloon = 1; |
|
292
|
|
|
|
|
|
|
require Tk::Toplevel; |
|
293
|
|
|
|
|
|
|
|
|
294
|
|
|
|
|
|
|
@Tk::JDialog::ISA = qw(Tk::Toplevel); |
|
295
|
|
|
|
|
|
|
|
|
296
|
|
|
|
|
|
|
Tk::Widget->Construct('JDialog'); |
|
297
|
|
|
|
|
|
|
|
|
298
|
|
|
|
|
|
|
sub Populate |
|
299
|
|
|
|
|
|
|
{ |
|
300
|
|
|
|
|
|
|
# Dialog object constructor. Uses `new' method from base class |
|
301
|
|
|
|
|
|
|
# to create object container then creates the dialog toplevel. |
|
302
|
|
|
|
|
|
|
|
|
303
|
|
|
|
|
|
|
my($cw, $args) = @_; |
|
304
|
|
|
|
|
|
|
|
|
305
|
|
|
|
|
|
|
$cw->SUPER::Populate($args); |
|
306
|
|
|
|
|
|
|
|
|
307
|
|
|
|
|
|
|
my ($w_bitmap,$w_but,$pad1,$pad2,$underlinepos,$mychar,$blshow,$i); |
|
308
|
|
|
|
|
|
|
my ($btnopt,$undopt,$balloon); |
|
309
|
|
|
|
|
|
|
|
|
310
|
|
|
|
|
|
|
my $buttons = delete $args->{'-buttons'}; |
|
311
|
|
|
|
|
|
|
my $images = delete $args->{'-images'}; |
|
312
|
|
|
|
|
|
|
$buttons = ['OK'] unless (defined $buttons); |
|
313
|
|
|
|
|
|
|
my $default_button = delete $args->{-default_button}; |
|
314
|
|
|
|
|
|
|
my $escape_button = delete $args->{-escape_button}; |
|
315
|
|
|
|
|
|
|
my $noballoons = delete $args->{-noballoons}; |
|
316
|
|
|
|
|
|
|
$useBalloon = 0 if ($noballoons); |
|
317
|
|
|
|
|
|
|
$default_button = $buttons->[0] unless (defined $default_button); |
|
318
|
|
|
|
|
|
|
|
|
319
|
|
|
|
|
|
|
# Create the Toplevel window and divide it into top and bottom parts. |
|
320
|
|
|
|
|
|
|
|
|
321
|
|
|
|
|
|
|
$cw->{'selected_button'} = ''; |
|
322
|
|
|
|
|
|
|
my (@pl) = (-side => 'top', -fill => 'both'); |
|
323
|
|
|
|
|
|
|
($pad1, $pad2) = |
|
324
|
|
|
|
|
|
|
([-padx => '3m', -pady => '3m'], [-padx => '3m', -pady => '2m']); |
|
325
|
|
|
|
|
|
|
|
|
326
|
|
|
|
|
|
|
$cw->withdraw; |
|
327
|
|
|
|
|
|
|
$cw->iconname('JDialog'); |
|
328
|
|
|
|
|
|
|
$cw->protocol('WM_DELETE_WINDOW' => sub {}); |
|
329
|
|
|
|
|
|
|
#????????????????? $cw->transient($cw->toplevel) unless ($^O =~ /Win/i); |
|
330
|
|
|
|
|
|
|
|
|
331
|
|
|
|
|
|
|
my $w_top = $cw->Frame(Name => 'top',-relief => 'raised', -borderwidth => 1); |
|
332
|
|
|
|
|
|
|
my $w_bot = $cw->Frame(Name => 'bot',-relief => 'raised', -borderwidth => 1); |
|
333
|
|
|
|
|
|
|
$w_top->pack(@pl); |
|
334
|
|
|
|
|
|
|
$w_bot->pack(@pl); |
|
335
|
|
|
|
|
|
|
|
|
336
|
|
|
|
|
|
|
# Fill the top part with the bitmap and message. |
|
337
|
|
|
|
|
|
|
|
|
338
|
|
|
|
|
|
|
@pl = (-side => 'left'); |
|
339
|
|
|
|
|
|
|
|
|
340
|
|
|
|
|
|
|
$w_bitmap = $w_top->Label(Name => 'bitmap'); |
|
341
|
|
|
|
|
|
|
$w_bitmap->pack(@pl, @$pad1); |
|
342
|
|
|
|
|
|
|
my $w_msg = $w_top->Label( |
|
343
|
|
|
|
|
|
|
#-wraplength => '3i', --!!! Removed 2/19 by Jim Turner |
|
344
|
|
|
|
|
|
|
-justify => 'left' |
|
345
|
|
|
|
|
|
|
); |
|
346
|
|
|
|
|
|
|
|
|
347
|
|
|
|
|
|
|
$w_msg->pack(-side => 'right', -expand => 1, -fill => 'both', @$pad1); |
|
348
|
|
|
|
|
|
|
|
|
349
|
|
|
|
|
|
|
# Create a row of buttons at the bottom of the dialog. |
|
350
|
|
|
|
|
|
|
|
|
351
|
|
|
|
|
|
|
my ($w_default_button, $bl) = (undef, ''); |
|
352
|
|
|
|
|
|
|
$cw->{'default_button'} = undef; |
|
353
|
|
|
|
|
|
|
$cw->{'escape_button'} = undef; |
|
354
|
|
|
|
|
|
|
$i = 0; |
|
355
|
|
|
|
|
|
|
foreach $bl (@$buttons) { |
|
356
|
|
|
|
|
|
|
$blshow = $bl; |
|
357
|
|
|
|
|
|
|
$underlinepos = ($blshow =~ s/^(.*)~/$1/) ? length($1): undef; |
|
358
|
|
|
|
|
|
|
if (defined($$images[$i]) && $$images[$i] gt ' ' && -e $$images[$i]) { |
|
359
|
|
|
|
|
|
|
$cw->Photo($blshow, -file => $$images[$i]); |
|
360
|
|
|
|
|
|
|
$btnopt = '-image'; |
|
361
|
|
|
|
|
|
|
} else { |
|
362
|
|
|
|
|
|
|
$btnopt = '-text'; |
|
363
|
|
|
|
|
|
|
} |
|
364
|
|
|
|
|
|
|
if (defined($underlinepos)) { |
|
365
|
|
|
|
|
|
|
$mychar = substr($blshow,$underlinepos,1); |
|
366
|
|
|
|
|
|
|
$w_but = $w_bot->Button( |
|
367
|
|
|
|
|
|
|
$btnopt => $blshow, |
|
368
|
|
|
|
|
|
|
-underline => $underlinepos, |
|
369
|
|
|
|
|
|
|
-command => [ |
|
370
|
|
|
|
|
|
|
sub { |
|
371
|
|
|
|
|
|
|
$_[0]->{'selected_button'} = $_[1]; |
|
372
|
|
|
|
|
|
|
}, $cw, $bl, |
|
373
|
|
|
|
|
|
|
] |
|
374
|
|
|
|
|
|
|
); |
|
375
|
|
|
|
|
|
|
$cw->bind("", [$w_but => "Invoke"]); |
|
376
|
|
|
|
|
|
|
$cw->bind("", [$w_but => "Invoke"]); |
|
377
|
|
|
|
|
|
|
} else { |
|
378
|
|
|
|
|
|
|
$w_but = $w_bot->Button( |
|
379
|
|
|
|
|
|
|
$btnopt => $blshow, |
|
380
|
|
|
|
|
|
|
-command => [ |
|
381
|
|
|
|
|
|
|
sub { |
|
382
|
|
|
|
|
|
|
$_[0]->{'selected_button'} = $_[1]; |
|
383
|
|
|
|
|
|
|
}, $cw, $bl, |
|
384
|
|
|
|
|
|
|
] |
|
385
|
|
|
|
|
|
|
); |
|
386
|
|
|
|
|
|
|
} |
|
387
|
|
|
|
|
|
|
if ($useBalloon && $btnopt eq '-image') { |
|
388
|
|
|
|
|
|
|
|
|
389
|
|
|
|
|
|
|
$balloon = $cw->Balloon(); |
|
390
|
|
|
|
|
|
|
$balloon->attach($w_but, -state => 'balloon', -balloonmsg => $blshow); |
|
391
|
|
|
|
|
|
|
} |
|
392
|
|
|
|
|
|
|
if ($bl eq $default_button) { |
|
393
|
|
|
|
|
|
|
$w_default_button = $w_bot->Frame( |
|
394
|
|
|
|
|
|
|
-relief => 'sunken', |
|
395
|
|
|
|
|
|
|
-borderwidth => 1 |
|
396
|
|
|
|
|
|
|
); |
|
397
|
|
|
|
|
|
|
$w_but->raise($w_default_button); |
|
398
|
|
|
|
|
|
|
$w_default_button->pack(@pl, -expand => 1, @$pad2); |
|
399
|
|
|
|
|
|
|
$w_but->pack(-in => $w_default_button, -padx => '2m', |
|
400
|
|
|
|
|
|
|
-pady => '2m' |
|
401
|
|
|
|
|
|
|
); |
|
402
|
|
|
|
|
|
|
|
|
403
|
|
|
|
|
|
|
$cw->{'default_button'} = $w_but; |
|
404
|
|
|
|
|
|
|
goto JWT_SKIP1; |
|
405
|
|
|
|
|
|
|
$cw->bind( |
|
406
|
|
|
|
|
|
|
'' => [ |
|
407
|
|
|
|
|
|
|
sub { |
|
408
|
|
|
|
|
|
|
$_[1]->flash; |
|
409
|
|
|
|
|
|
|
$_[2]->{'selected_button'} = $_[3]; |
|
410
|
|
|
|
|
|
|
}, $w_but, $cw, $bl, |
|
411
|
|
|
|
|
|
|
] |
|
412
|
|
|
|
|
|
|
); |
|
413
|
|
|
|
|
|
|
JWT_SKIP1: |
|
414
|
|
|
|
|
|
|
} else { |
|
415
|
|
|
|
|
|
|
$w_but->pack(@pl, -expand => 1, @$pad2); |
|
416
|
|
|
|
|
|
|
$cw->{'default_button'} = $w_but unless(defined($cw->{'default_button'})); |
|
417
|
|
|
|
|
|
|
} |
|
418
|
|
|
|
|
|
|
if (defined($escape_button) && $bl eq $escape_button) { |
|
419
|
|
|
|
|
|
|
$cw->{'escape_button'} = $w_but; |
|
420
|
|
|
|
|
|
|
$cw->bind('' => [$w_but => "Invoke"]); |
|
421
|
|
|
|
|
|
|
} |
|
422
|
|
|
|
|
|
|
++$i; |
|
423
|
|
|
|
|
|
|
} # end for all buttons |
|
424
|
|
|
|
|
|
|
|
|
425
|
|
|
|
|
|
|
$cw->Advertise(message => $w_msg); |
|
426
|
|
|
|
|
|
|
$cw->Advertise(bitmap => $w_bitmap ); |
|
427
|
|
|
|
|
|
|
#!!!$cw->{'default_button'} = $w_default_button; |
|
428
|
|
|
|
|
|
|
if ($^O =~ /Win/i) { |
|
429
|
|
|
|
|
|
|
$cw->ConfigSpecs( |
|
430
|
|
|
|
|
|
|
-image => ['bitmap',undef,undef,undef], |
|
431
|
|
|
|
|
|
|
-bitmap => ['bitmap',undef,undef,undef], |
|
432
|
|
|
|
|
|
|
-fg => ['ADVERTISED','foreground','Foreground','black'], |
|
433
|
|
|
|
|
|
|
-foreground => ['ADVERTISED','foreground','Foreground','black'], |
|
434
|
|
|
|
|
|
|
-bg => ['DESCENDANTS','background','Background',undef], |
|
435
|
|
|
|
|
|
|
-background => ['DESCENDANTS','background','Background',undef], |
|
436
|
|
|
|
|
|
|
DEFAULT => ['message',undef,undef,undef] |
|
437
|
|
|
|
|
|
|
); |
|
438
|
|
|
|
|
|
|
} else { |
|
439
|
|
|
|
|
|
|
$cw->ConfigSpecs( |
|
440
|
|
|
|
|
|
|
-image => ['bitmap',undef,undef,undef], |
|
441
|
|
|
|
|
|
|
-bitmap => ['bitmap',undef,undef,undef], |
|
442
|
|
|
|
|
|
|
-fg => ['ADVERTISED','foreground','Foreground','black'], |
|
443
|
|
|
|
|
|
|
-foreground => ['ADVERTISED','foreground','Foreground','black'], |
|
444
|
|
|
|
|
|
|
-bg => ['DESCENDANTS','background','Background',undef], |
|
445
|
|
|
|
|
|
|
-background => ['DESCENDANTS','background','Background',undef], |
|
446
|
|
|
|
|
|
|
# JWT for TNT! -font => ['message','font','Font','-*-Times-Medium-R-Normal-*-180-*-*-*-*-*-*'], |
|
447
|
|
|
|
|
|
|
-font => ['message','font','Font','-adobe-helvetica-bold-r-normal--17-120-100-100-p-92-iso8859-1'], |
|
448
|
|
|
|
|
|
|
DEFAULT => ['message',undef,undef,undef] |
|
449
|
|
|
|
|
|
|
); |
|
450
|
|
|
|
|
|
|
} |
|
451
|
|
|
|
|
|
|
} # end Dialog constructor |
|
452
|
|
|
|
|
|
|
|
|
453
|
|
|
|
|
|
|
sub Show { # Dialog object public method - display the dialog. |
|
454
|
|
|
|
|
|
|
|
|
455
|
|
|
|
|
|
|
my ($cw, $grab_type) = @_; |
|
456
|
|
|
|
|
|
|
|
|
457
|
|
|
|
|
|
|
croak "Dialog: `show' method requires at least 1 argument" |
|
458
|
|
|
|
|
|
|
if scalar @_ < 1 ; |
|
459
|
|
|
|
|
|
|
|
|
460
|
|
|
|
|
|
|
my $old_focus = $cw->focusSave; # don't need (Jim Turner) after fixing BUG! |
|
461
|
|
|
|
|
|
|
my $old_grab = $cw->grabSave; |
|
462
|
|
|
|
|
|
|
|
|
463
|
|
|
|
|
|
|
# Update all geometry information, center the dialog in the display |
|
464
|
|
|
|
|
|
|
# and deiconify it |
|
465
|
|
|
|
|
|
|
|
|
466
|
|
|
|
|
|
|
$cw->Popup(); |
|
467
|
|
|
|
|
|
|
|
|
468
|
|
|
|
|
|
|
# set a grab and claim the focus. |
|
469
|
|
|
|
|
|
|
if (defined $cw->{'default_button'}) { |
|
470
|
|
|
|
|
|
|
$cw->{'default_button'}->focus; |
|
471
|
|
|
|
|
|
|
} else { |
|
472
|
|
|
|
|
|
|
$cw->focus; |
|
473
|
|
|
|
|
|
|
} |
|
474
|
|
|
|
|
|
|
unless (!defined($ENV{DESKTOP_SESSION}) || $ENV{DESKTOP_SESSION} =~ /kde/o) { |
|
475
|
|
|
|
|
|
|
if ($ENV{DESKTOP_SESSION} =~ /AfterStep version 2.2.1[2-9]/io) { #JWT:ADDED 20140606 B/C TO GET AFTERSTEP TO GIVE "TRANSIENT" WINDOWS THE FOCUS?! |
|
476
|
|
|
|
|
|
|
Tk::Event::DoOneEvent(ALL_EVENTS); |
|
477
|
|
|
|
|
|
|
select(undef, undef, undef, 0.25); #FANCY QUICK-NAP FUNCTION! |
|
478
|
|
|
|
|
|
|
} |
|
479
|
|
|
|
|
|
|
if (defined $grab_type && length $grab_type) { |
|
480
|
|
|
|
|
|
|
$cw->grab($grab_type) if ($grab_type !~ /no/io); #JWT: ADDED 20010517 TO ALLOW NON-GRABBING! |
|
481
|
|
|
|
|
|
|
} else { |
|
482
|
|
|
|
|
|
|
$cw->grab; |
|
483
|
|
|
|
|
|
|
} |
|
484
|
|
|
|
|
|
|
} |
|
485
|
|
|
|
|
|
|
############## $cw->waitVisibility; #SEEMS TO HANG ON NEWER TK'S. |
|
486
|
|
|
|
|
|
|
$cw->update; |
|
487
|
|
|
|
|
|
|
|
|
488
|
|
|
|
|
|
|
# Wait for the user to respond, restore the focus and grab, withdraw |
|
489
|
|
|
|
|
|
|
# the dialog and return the label of the selected button. |
|
490
|
|
|
|
|
|
|
|
|
491
|
|
|
|
|
|
|
$cw->waitVariable(\$cw->{'selected_button'}); |
|
492
|
|
|
|
|
|
|
$cw->grabRelease; |
|
493
|
|
|
|
|
|
|
$cw->withdraw; |
|
494
|
|
|
|
|
|
|
&$old_focus if (defined($ENV{DESKTOP_SESSION}) && $ENV{DESKTOP_SESSION} =~ /AfterStep version 2.2.1[2-9]/io); #FIXED BUG CAUSING COMPLETE SCREEN LOCKUP IF ANOTHER |
|
495
|
|
|
|
|
|
|
#MOTIF APP (WINDOW) IS POPPED UP SHORTLY AFTERWARDS! |
|
496
|
|
|
|
|
|
|
&$old_grab; |
|
497
|
|
|
|
|
|
|
return $cw->{'selected_button'}; |
|
498
|
|
|
|
|
|
|
|
|
499
|
|
|
|
|
|
|
} # end Dialog show method |
|
500
|
|
|
|
|
|
|
|
|
501
|
|
|
|
|
|
|
1; # End of Tk::JDialog |