cvsuser 06/02/27 09:33:41
Modified: App-Widget/lib/App/Widget HierSelector.pm TabbedSelector.pm
Log:
fix up multi-level tab selector
Revision Changes Path
1.2 +53 -8 p5ee/App-Widget/lib/App/Widget/HierSelector.pm
Index: HierSelector.pm
===================================================================
RCS file: /cvs/public/p5ee/App-Widget/lib/App/Widget/HierSelector.pm,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- HierSelector.pm 9 Aug 2005 19:26:19 -0000 1.1
+++ HierSelector.pm 27 Feb 2006 17:33:41 -0000 1.2
@@ -166,37 +166,82 @@
$self->open_exclusively($self->{selected});
}
+# i.e. $self->open_exclusively("2.2");
+# this should "open" 2 and close 1,3,4,5,...
+# this should "open" 2.2 and close 2.1,2.3,2.4,...
+# if "2.2.1" exists, it should set the first open to the "selected"
+# else it should set itself "2.2" as the "selected"
sub open_exclusively {
my ($self, $opennodenumber) = @_;
my ($nodebase, $nodeidx, $nodenumber);
my $node = $self->get("node");
+ # set after get to ensure a deep data structure is stored in the session
$self->set("node", $node);
- $nodebase = $opennodenumber;
- if ($nodebase =~ /(.*)\.[^\.]+$/) {
- $nodebase = $1 . ".";
+ $nodebase = $opennodenumber; # i.e. "2.2.3", "2.2" or "2"
+ if ($nodebase =~ /(.*)\.[^\.]+$/) { # all but the last number
+ $nodebase = $1 . "."; # i.e. "2.2.", "2."
}
else {
- $nodebase = "";
+ $nodebase = ""; # if top level, $nodebase is blank ""
}
$nodeidx = 1;
while (1) {
$nodenumber = "$nodebase$nodeidx";
last if (!defined $node->{$nodenumber});
- $node->{$nodenumber}{open} = 0;
+ $node->{$nodenumber}{open} = 0; # close all others at this level
$nodeidx++;
}
if (defined $node->{$opennodenumber}) {
- $node->{$opennodenumber}{open} = 1;
+ $node->{$opennodenumber}{open} = 1; # open this one
}
+ # Hmmm. I don't think I should be selecting anything here... just
opening/closing.
if (!defined $node->{"$opennodenumber.1"}) {
$self->set("selected", $opennodenumber);
}
}
+# i.e. $self->select_first_open_leaf("2.2");
+# this should scan 2.2.1 through 2.2.n for the first open
+# this should "open" 2.2 and close 2.1,2.3,2.4,...
+# if "2.2.1" exists, it should set the first open to the "selected"
+# else it should set itself "2.2" as the "selected"
+sub select_first_open_leaf {
+ my ($self, $selected_nodenumber) = @_;
+
+ my $node = $self->{node};
+ my $nodebase = $selected_nodenumber;
+ my $nodeidx = 1;
+ my ($nodenumber);
+ my $found = 0;
+
+ while (!$found) {
+ $nodenumber = "$nodebase.$nodeidx";
+ if (!defined $node->{$nodenumber}) {
+ if ($nodeidx == 1) { # there are no leaves. $nodebase must be a
leaf.
+ $self->{selected} = $nodebase;
+ $found = 1;
+ }
+ else { # no "open" leaves on this branch
+ $node->{"$nodebase.1"}{open} = 1;
+ $self->{selected} = "$nodebase.1";
+ $found = 1;
+ }
+ }
+ elsif ($node->{$nodenumber}{open}) {
+ $nodebase = $nodenumber;
+ $nodeidx = 1;
+ }
+ else {
+ $nodeidx++;
+ }
+ }
+ #$self->{debug} .= "select_first_open_leaf($selected_nodenumber):
[$nodenumber]<br>";
+}
+
######################################################################
# METHODS
######################################################################
1.2 +18 -9 p5ee/App-Widget/lib/App/Widget/TabbedSelector.pm
Index: TabbedSelector.pm
===================================================================
RCS file: /cvs/public/p5ee/App-Widget/lib/App/Widget/TabbedSelector.pm,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- TabbedSelector.pm 9 Aug 2005 19:26:19 -0000 1.1
+++ TabbedSelector.pm 27 Feb 2006 17:33:41 -0000 1.2
@@ -52,6 +52,13 @@
return($success);
}
+sub open_exclusively {
+ my ($self, $opennodenumber) = @_;
+ #$self->{debug} .= "open_exclusively($opennodenumber)<br>";
+ $self->SUPER::open_exclusively($opennodenumber);
+ $self->select_first_open_leaf($opennodenumber);
+}
+
######################################################################
# OUTPUT METHODS
######################################################################
@@ -66,11 +73,13 @@
my ($bgcolor, $width, $fontface, $fontsize, $fontcolor, $fontbegin,
$fontend);
my ($html_url_dir, $xgif);
- $bgcolor = $self->get("bgcolor", "#888888");
- $width = $self->get("width", "100%");
- $fontface = $self->get("fontface", "verdana,geneva,arial,sans-serif");
- $fontsize = $self->get("fontsize", "-2");
- $fontcolor = $self->get("fontcolor", "#ffffff");
+ $bgcolor = $self->{bgcolor} || "#cccccc";
+ $width = $self->{width} || "100%";
+ $fontface = $self->{fontface} || "verdana,geneva,arial,sans-serif";
+ $fontsize = $self->{fontsize} || "-2";
+ $fontcolor = $self->{fontcolor} || "#ffffff";
+
+ $bgcolor = " bgcolor=\"$bgcolor\"";
#$fontbegin = "<font face=\"$fontface\" size=\"$fontsize\"
color=\"$fontcolor\">";
#$fontend = "</font>";
@@ -84,7 +93,7 @@
$html_url_dir = $context->get_option("html_url_dir");
$xgif = "$html_url_dir/images/Widget/dot_clear.gif";
- $html = "";
+ $html = $self->{debug} || "";
$nodelevel = 0;
$nodebase = "";
@@ -132,7 +141,7 @@
}
$nodebase .= "$nodeidx[$nodelevel].";
$html .= "</td>\n";
- $html .= " <td height=16 width=\"99%\"><img src=transp.gif
height=16 width=1></td>\n";
+ $html .= " <td height=16 width=\"99%\"$bgcolor><img
src=transp.gif height=16 width=1></td>\n";
$html .= " <td height=\"16\" width=\"99%\"></td>\n";
$html .= " </tr>\n";
$html .= " <tr>\n";