edc2a4e5d2719478ad72ae81b42d42c9cc743a1f
[p5sagit/Excel-Template.git] / lib / Excel / Template / Element / Cell.pm
1 package Excel::Template::Element::Cell;
2
3 use strict;
4
5 BEGIN {
6     use vars qw(@ISA);
7     @ISA = qw(Excel::Template::Element);
8
9     use Excel::Template::Element;
10 }
11
12 sub new
13 {
14     my $class = shift;
15     my $self = $class->SUPER::new(@_);
16
17     $self->{TXTOBJ} = Excel::Template::Factory->_create('TEXTOBJECT');
18
19     return $self;
20 }
21
22 sub _get_text
23 {
24     my $self = shift;
25     my ($context) = @_;
26
27     my $txt = $context->get($self, 'TEXT');
28     if (defined $txt)
29     {
30         my $txt_obj = Excel::Template::Factory->_create('TEXTOBJECT');
31         push @{$txt_obj->{STACK}}, $txt;
32         $txt = $txt_obj->resolve($context);
33     }
34     else
35     {
36         $txt = $self->{TXTOBJ}->resolve($context)
37     }
38
39     return $txt;
40 }
41
42 my %legal_types = (
43     'blank'     => 'write_blank',
44     'formula'   => 'write_formula',
45     'number'    => 'write_number',
46     'string'    => 'write_string',
47     'url'       => 'write_url',
48     'date_time' => 'write_date_time',
49 );
50
51 sub render
52 {
53     my $self = shift;
54     my ($context, $method) = @_;
55
56     unless ( $method )
57     {
58         my $type = $context->get( $self, 'TYPE' );
59         if ( defined $type )
60         {
61             my $type = lc $type;
62
63             if ( exists $legal_types{ $type } )
64             {
65                 $method = $legal_types{ $type };
66             }
67             else
68             {
69                 warn "'$type' is not a legal cell type.\n"
70                     if $^W;
71             }
72         }
73     }
74
75     $method ||= 'write';
76
77     my ($row, $col) = map { $context->get($self, $_) } qw(ROW COL);
78
79     my $ref = $context->get( $self, 'REF' );
80     if (defined $ref && length $ref)
81     {
82         $context->add_reference( uc( $ref ), $row, $col );
83     }
84
85     # Apply the cell width to the current column
86     if (my $width = $context->get($self, 'WIDTH'))
87     {
88         $width =~ s/[^\d.]//g;
89         $width *= 1;
90         if ($width > 0)
91         {
92             $context->active_worksheet->set_column($col, $col, $width);
93         }
94     }
95
96     $context->active_worksheet->$method(
97         $row, $col,
98         $self->_get_text($context),
99         $context->active_format,
100     );
101
102     my $comment = $context->get($self, 'COMMENT');
103     if (defined $comment && length $comment){
104          $context->active_worksheet->write_comment($row, $col,$comment);
105     }
106
107     return 1;
108 }
109
110 sub deltas
111 {
112     return {
113         COL => +1,
114     };
115 }
116
117 1;
118 __END__
119
120 =head1 NAME
121
122 Excel::Template::Element::Cell - Excel::Template::Element::Cell
123
124 =head1 PURPOSE
125
126 To actually write stuff to the worksheet
127
128 =head1 NODE NAME
129
130 CELL
131
132 =head1 INHERITANCE
133
134 L<ELEMENT|Excel::Template::Element>
135
136 =head1 ATTRIBUTES
137
138 =over 4
139
140 =item * TEXT
141
142 This is the text to write to the cell. This can either be text or a parameter with a dollar-sign in front of the parameter name.
143
144 =item * COL
145
146 Optionally, you can specify which column you want this cell to be in. It can be either a number (zero-based) or an offset. See L<Excel::Template> for more info on offset-based numbering.
147
148 =item * REF
149
150 Adds the current cell to the a list of cells that can be backreferenced.  This is useful when the current cell needs to be referenced by a formula. See L<BACKREF|Excel::Tepmlate::Element::Backref> and L<RANGE|Excel::Tepmlate::Container::Range>.
151
152 =item * WIDTH
153
154 Sets the width of the column the cell is in. The last setting for a given column
155 will win out.
156
157 =item * TYPE
158
159 This allows you to specify what write_*() method will be used. The default is to call write() and let L<Spreadsheet::WriteExcel> make the right call. However, you may wish to override it. L<Excel::Template> will not do any form of validation on what you provide. You are assumed to know what you're doing.
160
161 The legal types (taken from L<Spreadsheet::WriteExcel>) are:
162
163 =over 4
164
165 =item * blank
166
167 =item * formula
168
169 =item * number
170
171 =item * string
172
173 =item * url
174
175 =item * date_time
176
177 =back
178
179 other write_* methods as defined defined L<Spreadsheet::WriteExcel> would be integrated by request
180
181 =back
182
183 =head1 CHILDREN
184
185 L<FORMULA|Excel::Template::Element::Formula>
186
187 =head1 EFFECTS
188
189 This will consume one column in the current row.
190
191 =head1 DEPENDENCIES
192
193 None
194
195 =head1 USAGE
196
197   <cell text="Some Text Here"/>
198   <cell>Some other text here</cell>
199
200   <cell text="$Param2"/>
201   <cell>Some <var name="Param"> text here</cell>
202
203 In the above example, four cells are written out. The first two have text hard-coded. The second two have variables. The third and fourth items have another thing that should be noted. If you have text where you want a variable in the middle, you have to use the latter form. Variables within parameters are the entire parameter's value.
204
205 Please see L<Spreadsheet::WriteExcel> for what constitutes a legal formula.
206
207 =head1 AUTHOR
208
209 Rob Kinyon (rob.kinyon@gmail.com)
210
211 =head1 SEE ALSO
212
213 L<ROW|Excel::Template::Container::Row>, L<VAR|Excel::Template::Element::Var>, L<FORMULA|Excel::Template::Element::Formula>
214
215 =cut