Tk

 view release on metacpan or  search on metacpan

pod/mega.pod  view on Meta::CPAN


## Author: Achim Bohnet <ach@mpe.mpg.de>
##
## Copyright (c) 1997-1998 Achim Bohnet. All rights reserved.
## You can redistribute this document and/or modify it under the
## same terms as Perl itself.
##
## Update for Tk804.025, Steve Lidie, 2004/01/11.

=head1 NAME

Tk::mega - Perl/Tk support for writing widgets in pure Perl

=for category Derived Widgets

=head1 SYNOPSIS

Define the widget's new class name:

S<    >B<package Tk::>I<MyNewWidget>;

For composite widget classes:

S<    >B<use base qw/ Tk::container />; # where B<container> is I<Frame> or I<Toplevel>

For derived widget classes:

S<    >B<use base qw/ Tk::Derived Tk::DerivedWidget /;>

Install the new widget in Tk's namespace and establish class and instance
constructors.

S<    >B<Construct Tk::>I<Widget> I<'MyNewWidget'>;

S<    >B<sub ClassInit> { I<my ($self, $args) = @_; ...> }

S<    >B<sub Populate> { I<my ($self, $args) = @_; ...> }

=head1 DESCRIPTION

The goal of the mega-widget support of Perl/Tk is to make it
easy to write mega-widgets that obey the same protocol and
interface that the Tk core widgets support.
I<For mega-widget sample code please run the B<widget> demonstration program and go to the section B<Sample Perl Mega-Widgets>.>

There are two kinds of mega-widgets:

=over 4

=item * Composite Widgets

A composite widget is composed with one or more existing widgets.
The composite widget looks to the user like a simple single widget.
A well known example is the file selection box.

=item * Derived Widgets

A derived widget adds/modifies/removes properties and methods
from a single widget (this widget may itself be a mega-widget).

=back

=head1 MEGA-WIDGET SUPPORT

=head2 Advertise

Give a subwidget a symbolic name.

Usage:

S<    >I<$self>-E<gt>B<Advertise>(B<name>=E<gt>I<$widget>);

Gives a subwidget I<$widget> of the mega-widget I<$self> the
name B<name>.  One can retrieve the reference of an advertised subwidget
with the L<Subwidget|"Subwidget"> method.

B<Comment:> Mega-Widget Writers: Please make sure to document the
advertised widgets that are intended for I<public> use.
If there are none, document this fact, e.g.:

	=head1 ADVERTISED WIDGETS

	None.

=head2 Callback

Invoke a callback specified with an option.

pod/mega.pod  view on Meta::CPAN


B<ClassInit> is called once for I<each> L<MainWindow|Tk::MainWindow>
just before the first widget instance of a class is created in
the widget tree of B<MainWindow>.

B<ClassInit> is often used to define bindings and/or other
resources shared by all instances, e.g., images.

Examples:

 $mw->bind($class,"<Tab>", sub { my $w = shift; $w->Insert("\t"); $w->focus; $w->break});
 $mw->bind($class,"<Return>", ['Insert',"\n"]);
 $mw->bind($class,"<Delete>",'Delete');

Notice that I<$class> is the class name (e.g. B<Tk::MyText>) and I<$mw> is the mainwindow.

Don't forget to call I<$class>-E<gt>B<SUPER::ClassInit($mw)> in
B<ClassInit>.

=head2 Component

Convenience function to create subwidgets.

Usage:

    $cw->Component('Whatever', 'AdvertisedName',
        -delegate => ['method1', 'method2', ...],
        ... more widget options ...,
    );

B<Component> does several things for you with one call:

=over 4

o Creates the widget

o Advertises it with a given name (overridden by 'Name' option)

o Delegates a set of methods to this widget (optional)

=back

Example:

    $cw->Component('Button', 'quitButton', -command => sub{$mw->'destroy'});

=head2 ConfigSpecs

Defines options and their treatment

Usage:

    $cw->ConfigSpecs(
        -option => [ where, dbname, dbclass, default],
        ...,
        DEFAULT => [where],
    );

Defines the options of a mega-widget and what actions
are triggered by configure/cget of an option
(see L<Tk::ConfigSpecs> and L<Tk::Derived> for details).

=head2 Construct

Make the new mega-widget known to B<Tk>.

Usage:

S<    >B<Construct> I<baseclass> B<'Name'>;

B<Construct> declares the new widget class so that your mega-widget
works like normal Perl/Tk widgets.

Examples:

S<    >B<Construct Tk::Widget> I<'Whatever'>;
S<    >B<Construct Tk::Menu>   I<'MyItem'>;

First example lets one use I<$widget>-E<gt>B<Whatever> to create
new B<Whatever> widget.

The second example restricts the usage of the B<MyItem> constructor
method to widgets that are derived from B<Menu>:
I<$isamenu>-E<gt>I<MyItem>.

=head2 CreateArgs

Process options before any widget is created:

S<    >B<sub CreateArgs> { I<my ($package, $parent, $args) = @_; ...; return @newargs;> }

I<$package> is the package of the mega-widget (e.g., B<Tk::MyText>,
I<$parent> the parent of the widget to be created and $args the hash
reference to the options specified in the widget constructor call.

Don't forget to call I<$package>-E<gt>B<SUPER::CreateArgs>(I<$parent>, I<$args>) in
B<CreateArgs>.

=head2 Delegates

Redirect a method of the mega-widget to a subwidget of
the composite widget

Usage:

    $cw->Delegates(
        'method1' => $subwidget1,
        'method2' => 'advertived_name',
        ...,
        'Construct' => $subwidget2,
        'DEFAULT'   => $subwidget3,
    );

The B<'Construct'> delegation has a special meaning.  After
'Construct' is delegated all Widget constructors are redirected.
E.g. after

S<    >I<$self>-E<gt>B<Delegates>(B<'Construct'>=E<gt>I<$subframe>);

a I<$self>-E<gt>B<Button> does really a I<$subframe>-E<gt>B<Button>
so the created button is a child of I<$subframe> and not I<$self>.

B<Comment:> Delegates works only with methods that I<$cw> does
not have itself.

=head2 InitObject

I<Note: this method should not, in general, be used, as it has been
superceeded by B<Populate> and specifying B<Tk::Derived> as one of the base
classes.>

Defines construction and interface of derived widgets.

Usage:

    sub InitObject {
	my ($derived, $args) = @_;
	...
    }

where I<$derived> is the widget reference of the already created
baseclass widget and I<$args> is the reference to a hash of
I<-option-value> pairs.

B<InitObject> is almost identical to L<Populate|"Populate"> method.
B<Populate> does some more 'magic' things useful for mega-widgets
with several widgets.

Don't forget to call I<$derived>-E<gt>B<SUPER::InitObject>(I<$args>) in
B<InitObject>.

=head2 OnDestroy

Define a callback invoked when the mega-widget is destroyed.

Usage:

S<    >I<$widget>-E<gt>B<OnDestroy>(I<callback>);

B<OnDestroy> installs a L<callback|Tk::callbacks> that's called
when a widget is going to to be destroyed.  Useful
for special cleanup actions.  It differs from a normal B<destroy>
in that all the widget's data structures are still intact.

B<Comment:> This method could be used with any widgets not just
for mega-widgets.  It's listed here because of its usefulness.

=head2 Populate

Defines construction and interface of the composite
widget.

Usage:

    sub Populate {
	my ($self, $args) = @_;
	...
    }

where I<$self> is the widget reference of the already created baseclass
widget and I<$args> is the
reference to a hash of I<-option-value> pairs.

Most the other support function are normally used inside the B<Populate>
subroutine.

Don't forget to call I<$cw>-E<gt>B<SUPER::Populate>(I<$args>) in
B<Populate>.



( run in 1.374 second using v1.01-cache-2.11-cpan-a1f116cd669 )