package JQuery::Splitter ; our $VERSION = '1.00'; use warnings; use strict; sub new { my $this = shift; my $class = ref($this) || $this; my $my ; %{$my->{param}} = @_ ; die "No id defined for Splitter" unless $my->{param}{id} =~ /\S/ ; my $jquery = $my->{param}{addToJQuery} ; my $jqueryDir = $jquery->getJQueryDir ; $my->{fileDir} = "$jqueryDir/plugins/splitter" ; bless $my, $class; $my->add_to_jquery ; return $my ; } sub add_to_jquery { my $my = shift ; my $jquery = $my->{param}{addToJQuery} ; if (defined $jquery) { $jquery->add($my) ; } } sub id { my $my = shift ; return $my->{param}{id} ; } sub packages_needed { my $my = shift ; return ('dimensions/dimensions.js','splitter/splitter.js') ; } sub panel1 { shift->{param}{panel1} } sub panel2 { shift->{param}{panel2} ; } sub panel1CSS { shift->{param}{panel1CSS} } sub panel2CSS { shift->{param}{panel2CSS} ; } sub HTML1 { shift->{param}{HTML1} ; } sub HTML2 { shift->{param}{HTML2} ; } sub splitBackGround { shift->{param}{splitBackGround} ; } sub splitHeight { shift->{param}{splitHeight} ; } sub splitActive { shift->{param}{splitActive} ; } sub splitRepeat { shift->{param}{splitRepeat} ; } sub mainPanelCSS { shift->{param}{mainPanelCSS} ; } sub accessKey { shift->{param}{accessKey} ; } sub browserFill { shift->{param}{browserFill} ; } sub type { shift->{param}{type} } sub panel1Params { shift->{param}{panel1Params} } sub panel2Params { shift->{param}{panel2Params} } sub internalPanel { shift->{param}{internalPanel} } sub setHTML1 { my $my = shift ; $my->{param}{HTML1} = shift ; } sub setHTML2 { my $my = shift ; $my->{param}{HTML2} = shift ; } sub HTML { my $my = shift ; my $id = $my->id ; my $panel1 = $my->panel1 ; my $panel2 = $my->panel2 ; my $HTML1 = $my->HTML1 ; my $HTML2 = $my->HTML2 ; my $html ; if ($my->internalPanel) { $html = qq[
$HTML1
$HTML2
] ; } if (!$my->internalPanel) { $html = qq[
$HTML1
$HTML2
] ; } return $html ; } sub get_css { my $my = shift ; my $id = $my->id ; my $splitBackGround = $my->splitBackGround || 'gray'; my $splitHeight = $my->splitHeight || '6px' ; my $splitActive = $my->splitActive || 'blue' ; my $panel1 = $my->panel1 ; my $panel2 = $my->panel2 ; my $repeat = $my->splitRepeat ; my $repeatX = 'no-repeat' ; my $repeatY = 'no-repeat' ; if ($repeat) { $repeatX = "repeat-x" ; $repeatY = "repeat-y" ; } my $headBodyMargins = '' ; my $scrollBarsHidden =<browserFill) { $headBodyMargins =<internalPanel) { $bars = "$bars1$bars2" ; } $bars =~ s!PLUGINS_DIR!$my->{fileDir}!g ; my @css = ($bars,$my->mainPanelCSS,$my->panel1CSS,$my->panel2CSS); return \@css ; } sub get_jquery_code { my $my = shift ; my $id = $my->id ; my $type = $my->type ; my $accessKey = $my->accessKey ; my $panel1 = $my->panel1 ; my $panel2 = $my->panel2 ; my $panel1Params = $my->panel1Params ; my $panel2Params = $my->panel2Params ; $type = qq[type: "$type"] ; my $minA = $panel1Params->{minA} =~ /\S/ ? qq[minA: $panel1Params->{minA}] : '' ; my $initA = $panel1Params->{initA} =~ /\S/ ? qq[initA: $panel1Params->{initA}] : '' ; my $maxA = $panel1Params->{maxA} =~ /\S/ ? qq[maxA: $panel1Params->{maxA}] : '' ; my $minB = (defined($panel2Params->{minB}) and $panel2Params->{minB} =~ /\S/) ? qq[minB: $panel2Params->{minB}] : '' ; my $initB = (defined $panel2Params->{initB} and $panel2Params->{initB} =~ /\S/) ? qq[initB: $panel2Params->{initB}] : '' ; my $maxB = (defined $panel2Params->{maxB} and $panel2Params->{maxB} =~ /\S/) ? qq[maxB: $panel2Params->{maxB}] : '' ; $accessKey = $my->accessKey =~ /\S/ ? qq[accessKey: "$accessKey"] : '' ; my @items = ($type,$minA,$initA,$maxA,$minB,$initB,$maxB,$accessKey) ; @items = grep { /\S/ } @items ; my $params = join(', ',@items) ; my $function1=<<'EOD'; $("#ID").splitter({PARAMS}); EOD $function1 =~ s/ID/$id/ ; $function1 =~ s/PARAMS/$params/ ; =pod $("#ID").splitter({ type: "v", minA: 100, initA: 150, maxA: 300, accessKey: "|" }) =cut my $function2=<<'EOD'; // Manually set the outer splitter's height to fill the browser window. // This must be re-done any time the browser window is resized. $(window).bind("resize", function(){ var $ms = $("#ID"); var top = $ms.offset().top; // from dimensions.js var wh = $(window).height(); // Account for margin or border on the splitter container var mrg = parseInt($ms.css("marginBottom")) || 0; var brd = parseInt($ms.css("borderBottomWidth")) || 0; $ms.css("height", (wh-top-mrg-brd)+"px"); // IE fires resize for splitter; others don't so do it here if ( !jQuery.browser.msie ) $ms.trigger("resize"); }).trigger("resize"); EOD $function2 =~ s/#ID/#$id/ ; $function2 = '' unless $my->browserFill ; return $function1 . $function2 ; } 1; =head1 NAME JQuery::Splitter - Split into panes =head1 VERSION Version 1.00 =cut =head1 SYNOPSIS JQuery::Splitter is used to split an area into two panes. This can be extended to three or more by nesting use JQuery; use JQuery::Splitter ; my $splitter1 = JQuery::Splitter->new(id => 'MySplitter', addToJQuery => $jquery, browserFill => 1, type => 'v', HTML1 => $leftHTML, HTML2 => $rightHTML) ; =head1 DESCRIPTION This module is a bit more complicated than others, since CSS needs to be set to get good results. For complete information see L my $mainPanelCSS = new JQuery::CSS(hash => {'#MySplitter' => {'min-width' => '500px', 'min-height' => '300px', border => '4px solid #669'}}) ; my $panel1CSS = new JQuery::CSS(hash => { '#LeftPanel' => {background => 'blue', padding => '8px'}}) ; my $panel2CSS = new JQuery::CSS(hash => { '#RightPanel' => {background => 'yellow', padding => '4px'}}) ; my $splitter1 = JQuery::Splitter->new(id => 'MySplitter', addToJQuery => $jquery, browserFill => 1, type => 'v', accessKey => "I", panel1 => 'LeftPanel', panel2 => 'RightPanel', mainPanelCSS => $mainPanelCSS, panel1CSS => $panel1CSS, panel2CSS => $panel2CSS, panel1Params => {minA => 100, initA => 100, maxA => 1000}, splitBackGround => 'pink', splitActive => 'red', splitHeight => '6px', splitRepeat => 1, HTML1 => $leftHTML, HTML2 => $rightHTML) ; Have a look at the splitter examples. =over =item addToJQuery Add the item to JQuery =item browserFill Set this to 1 if you want the panel to fill the whole page =item type Set to h for horizontal split and v for vertical split =item accessKey Allows user access to a splitter bar through the keyboard =item panel1 Give an id to the left/top panel =item panel2 Give an id to the right/bottom panel =item mainPanelCSS Define CSS for the main panel =item panel1CSS Define CSS for the left/top panel =item panel2CSS Define CSS for the right/bottom panel =item panel1Params =over =item minA Minimum size for the panel =item initA Initial size for the panel =item maxA Maximum size for the panel =back =item panel2Params =over =item minB Minimum size for the panel =item initB Initial size for the panel =item maxB Maximum size for the panel =back =item splitBackGround Define the colour for the background of the splitter bar =item splitActive Define the colour for the splitter bar when it is active =item splitHeight Define the size of the splitter bar =item HTML1 Set the HTML for the top/left panel =item HTML2 Set the HTML for the bottom/right panel =item internalPanel If panels are put one inside another, the internal panels must have this flag set. The splitter bars take all their definitions from the outermost panel. That is, they cannot be changed. =back =head1 FUNCTIONS =over =item HTML Get the HTML for the object =item new Instantiate the object =item setHTML1 Set HTML1 for the object =item setHTML2 Set HTML2 for the object =back =head1 AUTHOR Peter Gordon, C<< >> =head1 BUGS Please report any bugs or feature requests to C, or through the web interface at L. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. =head1 SUPPORT You can find documentation for this module with the perldoc command. perldoc JQuery You can also look for information at: =over 4 =item * AnnoCPAN: Annotated CPAN documentation L =item * CPAN Ratings L =item * RT: CPAN's request tracker L =item * Search CPAN L =back =head1 ACKNOWLEDGEMENTS =head1 COPYRIGHT & LICENSE Copyright 2007 Peter Gordon, all rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut 1; # End of JQuery::Taconite