Revert "Embed Safe 2.07 into Vend::Safe to avoid various problems with recent version...
[interchange.git] / code / UI_Tag / tabbed_display.coretag
1 # Copyright 2002-2007 Interchange Development Group and others
2
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version.  See the LICENSE file for details.
7
8 # $Id: tabbed_display.coretag,v 1.6 2007-03-30 23:40:54 pajamian Exp $
9
10 UserTag tabbed-display PosNumber     0
11 UserTag tabbed-display addAttr 
12 UserTag tabbed-display hasEndTag 
13 UserTag tabbed-display Interpolate 
14 UserTag tabbed-display NoReparse 
15 UserTag tabbed-display Version       $Revision: 1.6 $
16 UserTag tabbed-display Documentation <<EOD
17 =head1 NAME
18
19 tabbed-display -- DHTML tabbed display
20
21 =head1 SYNOPSIS
22
23     [tabbed-display OPTIONS]
24         [tabbed-panel The title of one]
25         The contents of one
26         [/tabbed-panel]
27         [tabbed-panel The contents of two]
28         The contents of two
29         [/tabbed-panel]
30     [/tabbed-display]
31
32 =head1 DESCRIPTION
33
34 The [tabbed-display] ITL tag breaks text into a tabbed DHTML display.
35 There are many options which can change the size of the display,
36 colors, and styles.
37
38 NOTE: All sizes are in pixels to allow size calculation.
39
40 =head2 OPTIONS
41
42 =over 4
43
44 =item tab_bgcolor_template
45
46 Default #xxxxxx. A template where each "x" will be broken into
47 descending-brightness colors. The default value will cause
48 the selected tab to have a color of #eeeeee, the first unselected
49 tab will have #dddddd, the next #cccccc, etc. To create a yellow
50 series, use #ffffxx.
51
52 =item tab_height
53
54 Sets the height of the title tab. Default 30.
55
56 =item tab_width
57
58 Sets the width of the title tab. Default is 100.
59
60 =item panel_height
61
62 Sets the height of the panel display. Default 600.
63
64 =item panel_width
65
66 Sets the width of the panel display. Default is 800.
67
68 =item panel_id
69
70 To account for multiple tabbed displays in a page, the second
71 one should have a unique ID assigned to it. Default is "mvpan".
72
73 =item tab_horiz_offset
74
75 The amount that the tab will be offset from tabs in multi-row
76 displays to allow view of all tabs.  Default 10.
77
78 =item tab_vert_offset
79
80 The amount that the tab will be offset from tabs in multi-row
81 displays to allow view of all tabs.  Default 8.
82
83 =item tab_style
84
85 The style items which will be set for the title tab portion.
86 Default:
87
88     text-align:center;
89     font-family: sans-serif;
90     line-height:150%;
91     border:2px;
92     border-color:#999999;
93     border-style:outset;
94     border-bottom-style:none;
95
96
97 =item panel_style
98
99 The style items which will be set for the panel portion.  Default:
100
101     font-family: sans-serif;
102     font-size: smaller;
103     border: 2px;
104     border-color:#999999;
105     border-style:outset;
106
107 =item panel_prepend
108
109 A string which will be prepended to every panel content.
110 A typical value might be "<table>", which allows table rows to
111 be sent as content. This is the value used in Interchange's
112 table editor.
113
114
115 =item panel_append
116
117 A string which will be appended to every panel content.
118 A typical value might be "</table>", which allows table rows to
119 be sent as content. This is the value used in Interchange's
120 table editor.
121
122 =item contents
123
124 If you have an array set with the value of each panel's content,
125 you can send it as an array reference in the contents option.
126 This option will also accept a null-separated string as might
127 be found in a form input.
128
129 If there are contents in an array, the body text of the tag
130 is ignored.
131
132 =item titles
133
134 If you have an array set with the value of each tab's title,
135 you can send it as an array reference in the C<titles> option.
136 This option will also accept a null-separated string as might
137 be found in a form input.
138
139 If the title for a panel is set in the array, the title found in the
140 body text of the tag is ignored.
141
142 =back
143
144 =head2 Use in embedded Perl
145
146 The tabbed_display tag can be used in embedded Perl as well.
147
148     my @titles = ( 'Title 1', 'Title 2' );
149     my @contents = ( 'Content of panel 1: foo', 'Content of 2' );
150
151     return $Tag->tabbed_display({
152         titles => \@titles,
153         contents => \@contents,
154         panel_width => 600,
155         panel_height => 400,
156         tab_bgcolor_template => '#ffffxx',
157     });
158
159 =cut
160 EOD
161 UserTag tabbed-display Routine       <<EOR
162 sub {
163         my $opt = shift;
164         my $body = shift;
165 #::logDebug("opt is $opt, body is $body");
166         my $tit; my $cont;
167
168         if($opt->{titles}) {
169                 if(ref($opt->{titles}) eq 'ARRAY') {
170                         $tit = delete $opt->{titles};
171                 }
172                 elsif($opt->{titles} =~ /\0/) {
173                         $tit = [ split /\0/, delete $opt->{titles} ];
174                 }
175                 elsif($opt->{titles} =~ /\n/) {
176                         $tit = [ split /\n/, delete $opt->{titles} ];
177                 }
178                 else {
179                         $tit = [ map { $::Scratch->{$_} } split /[\s,]+/, delete $opt->{titles}];
180                 }
181         }
182
183         if($opt->{contents}) {
184                 if(ref($opt->{contents}) eq 'ARRAY') {
185                         $cont = delete $opt->{contents};
186                 }
187                 elsif($opt->{contents} =~ /\0/) {
188                         $cont = [ split /\0/, delete $opt->{contents} ];
189                 }
190         }
191
192         $tit ||= [];
193         if(! $cont) {
194                 $cont = [];
195                 while($body =~ s{
196                                                         \[tabbed[-_]panel (.*?) \]
197                                                                         (.*?)
198                                                         \[/tabbed[-_]panel\]}
199                                                 {}xis
200                                         )
201                 {
202                         push @$cont, $2;
203                         my $t = $1;
204                         if($t and $t =~ /\S/) {
205                                 $tit->[$#$cont] ||= $t;
206                         }
207                 }
208         }
209         return Vend::Table::Editor::tabbed_display($tit, $cont, $opt);
210 }
211 EOR