POE-XUL
view release on metacpan or search on metacpan
lib/POE/XUL/ChangeManager.pm view on Meta::CPAN
push @rows, $first;
}
else {
push @rows, $treeitem;
}
}
DEBUG and
xdebug "Found ", 0+@rows, " rows";
for( my $r = 0 ; $r<=$#rows ; $r++ ) {
my $prop = $rows[$r]->properties;
if( $r == $rowN ) {
$prop =~ s/\s*selected\s*//g;
if( $prop ) { $prop .= ' selected' }
else { $prop = 'seelected' }
DEBUG and xdebug "Row $r properties=$prop";
$rows[$r]->properties( $prop );
$event->bubble_to( $tree );
$event->__source_id( $rows[$r]->id );
}
elsif( $prop =~ s/\s*selected\s*//g ) {
DEBUG and xdebug "Row $r properties=$prop";
$rows[$r]->properties( $prop||'' );
}
}
return;
}
##############################################################
sub Prepend
{
my( $self, $cmd ) = @_;
push @{ $self->{prepend} }, $cmd;
return 0+@{ $self->{prepend} };
}
##############################################################
sub flush_to_prepend
{
my( $self ) = @_;
my $out = $self->flush;
return unless @$out;
push @{ $self->{prepend} }, @$out;
return 0+@{ $self->{prepend} };
}
##############################################################
sub timeslice
{
my( $self ) = @_;
$self->Prepend( [ 'timeslice' ] );
}
##############################################################
sub popup_window
{
my( $self, $name, $features ) = @_;
$name ||= $WIN_NAME++;
$features ||= {};
croak "Features must be a hashref" unless 'HASH' eq ref $features;
$self->Prepend( [ 'popup_window', $name, $features ] );
return $name;
}
##############################################################
sub close_window
{
my( $self, $name ) = @_;
$self->Prepend( [ 'close_window', $name ] );
}
##############################################################
# Send some instructions to Runner.js. Or other control of the CM
sub instruction
{
my( $self, $inst ) = @_;
my( $op, @param );
if( ref $inst ) {
( $op, @param ) = @$inst;
}
else {
$op = $inst;
}
if( $op eq 'flush' ) { # flush changes to output buffer
return $self->flush_to_prepend;
}
elsif( $op eq 'empty' ) { # empty all changes
return $self->flush;
}
elsif( $op eq 'timeslice' ) { # give up a timeslice
return $self->timeslice;
}
elsif( $op eq 'popup_window' ) {
return $self->popup_window( @param );
}
elsif( $op eq 'close_window' ) {
return $self->close_window( @param );
}
else {
die "Unknown instruction: $op";
}
}
1;
__END__
=head1 NAME
POE::XUL::ChangeManager - Keep POE::XUL in sync with the browser DOM
=head1 SYNOPSIS
Not used directly. See L<POE::XUL> and L<POE::XUL::Event>.
=head1 DESCRIPTION
The ChangeManager is responsible for tracking and sending all changes to a
L<POE::XUL::Node> to its corresponding DOM element. It also handles any
side-effects of a DOM event that was sent from the browser.
There is only one ChangeManager per application. The application never
accesses the ChangeManager directly, but rather by manipulating
L<POE::XUL::Node>.
Because there may be multiple application instances within a given process,
the link between L<POE::XUL::Node> and the ChangeManager is handled by
L<POE::XUL::Event>. Changes to a node B<must> happen within
L<POE::XUL::Event/wrap>. This is done for you in the initial POE event. It
B<must> be done explicitly if you chain the initial POE event to furthur POE
events.
=head1 METHODS
There is only one method that will be useful for application writers:
=head2 instruction
pxInstructions( @instructions );
$CM->instruction( $inst );
$CM->instruction( [ $inst, @params ] );
Send instructions to the javascript client library. Instructions are a HACK
to quickly work around XUL and/or POE::XUL::Node limitations.
C<$inst> may be simply an instruction name, or an arrayref, the first
element of which is the instruction name.
Current instructions are:
=over 4
=item empty
Empties all pending changes, returns the arrayref of those changes.
=item flush
All currently known commands are put into the output buffer. Combined with
C<timeslice>, it allows some control over the order in which commands are
executed.
=item timeslice
Tells the javascript client library to give up a C<timeslice>. The idea is
to give the browser time to I<render> any new XBL. Because it is impossible
to find out when all XBL has finished rendering, the C<timeslice> is handled
by pausing for 5 milliseconds.
To be very useful, you should preceed this with a L</flush>.
=item popup_window
pxInstruction( [ popup_window => $id, $features ] );
PLEASE USE L<POE::XUL::Window/open> INSTEAD.
Tell the client library to create a new window. The new window's name will
be C<$id>. The new window will be created with the features defined in
C<$features>:
C<width>,
C<height>,
C<location>,
C<menubar>,
C<toolbar>,
C<status>,
C<scrollbars>.
The following features are always C<yes>:
C<resizable>,
C<dependent>.
See L<http://developer.mozilla.org/en/docs/DOM:window.open> for an explanation
of what they mean.
Once the window is opened, it will load C</popup.xul?app=$APP&SID=$SID> (where
C<$APP> is the current application and C<$SID> is the session ID of the
current application instance). C<popup.xul> will then send a C<connect>
event. See L<POE::XUL/connect>.
=item close_window
pxInstruction( [ close_window => $id ] );
PLEASE USE L<POE::XUL::Window/close> INSTEAD.
Closes the window C<$id>. This will provoke a C<disconnect> event.
See L<POE::XUL/disconnect>.
=back
=head1 AUTHOR
Philip Gwyn E<lt>gwyn-at-cpan.orgE<gt>
=head1 CREDITS
Based on XUL::Node by Ran Eilam.
=head1 COPYRIGHT AND LICENSE
Copyright 2007-2010 by Philip Gwyn. All rights reserved;
Copyright 2003-2004 Ran Eilam. All rights reserved.
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.
=head1 SEE ALSO
perl(1), L<POE::XUL>, L<POE::XUL::Event>.
=cut
( run in 2.378 seconds using v1.01-cache-2.11-cpan-364913b4093 )