home *** CD-ROM | disk | FTP | other *** search
- # Learn how to write your own widget demonstration!
-
- use vars qw/$TOP/;
-
- sub TEMPLATE {
- my($demo) = @ARG;
- my $demo_widget = $MW->WidgetDemo(
- -name => $demo,
- -text => 'Learn how to write a widget demonstration!',
- -geometry_manager => 'grid',
- -title => 'WidgetDemo Example',
- -iconname => 'WidgetDemo',
- );
- $TOP = $demo_widget->Top; # get geometry master
- $TOP->Label(-text => 'Click "See Code".')->grid;
- }
- __END__
-
- The template code above specifies how user contributed widget demonstrations
- must be written.
-
- All demonstrations must be a unique subroutine, in a directory of your
- choosing, stored in a file with the same name as the subroutine suffixed with
- ".pl". So file TEMPLATE.pl contains subroutine TEMPLATE().
-
- widget looks in the directory specified on the command line to load user
- contributed demonstrations. If no directory name is specified when widget is
- invoked and the environment variable WIDTRIB is defined then demonstrations
- are loaded from the WIDTRIB directory. If WIDTRIB is undefined then widget
- defaults to the released user contributed directory.
-
- The first line of the file is the DDD (Demonstration Description Data), which
- briefly describes the purpose of the demonstration. The widget program reads
- this line and uses it when building its interface.
-
- For consistency your demonstration should use the WidgetDemo widget. This is
- a toplevel widget with three frames. The top frame contains descriptive
- demonstration text. The bottom frame contains the "Dismiss" and "See Code"
- buttons. The middle frame is the demonstration container, which can be
- managed by either the pack or grid geometry manager.
-
- When widget calls your subroutine it's passed one argument, the demonstration
- name. Since your subroutine can "see" all of widget's global variables, you
- use $MW (the main window reference) to create the WidgetDemo toplevel; be
- sure to pass at least the -name and -text parameters. -geometry_manager
- defaults to "pack". Invoke the Top() method to fetch the containing frame
- for your demonstration, and treat it as if it were the MainWindow - the
- top-most window of your widget hierarchy.
-
- Other consideration:
-
- . widget global variables are all uppercase, like $MW - be careful not
- to stomp on them!
-
- . If your demonstration has a Quit button change it to ring the bell
- and use the builtin Dismiss instead.
-
- . Remove a MainLoop() call, if present.
-
- . Be sure $TOP is declared in a "use vars" statement and not as a
- lexical my() in the subroutine (see below).
-
- . If you're wrapping an existing main program in a subroutine be very
- alert for closure bugs. Lexicals inside a subroutine become closed
- so you may run into initialization problems on the second and
- subsequent invokations of the demonstration. The npuz and plop
- demonstrations show how to work around this. Essentially, remove
- all "global" my() variables and place them within a "use vars".
- This practice is prone to subtle bugs and is not recommended!
-