Author: spadkins
Date: Sat Mar  4 21:14:20 2006
New Revision: 3604

Modified:
   p5ee/trunk/App-Widget/lib/App/Widget/DataTable2.pm

Log:
editing now works: add/cancel/delete/sort

Modified: p5ee/trunk/App-Widget/lib/App/Widget/DataTable2.pm
==============================================================================
--- p5ee/trunk/App-Widget/lib/App/Widget/DataTable2.pm  (original)
+++ p5ee/trunk/App-Widget/lib/App/Widget/DataTable2.pm  Sat Mar  4 21:14:20 2006
@@ -113,7 +113,7 @@
 sub handle_event {
     &App::sub_entry if ($App::trace);
     my ($self, $wname, $event, @args) = @_;
-    my ($name, $context, $colnum, $x, $y, $startrow, $maxrows, $width, 
$direction);
+    my ($name, $context, $column, $x, $y, $startrow, $maxrows, $width, $dir);
 
     #$self->clear_messages();
 
@@ -125,12 +125,16 @@
     if ($wname eq "$name-view") {
         $self->set("mode","view");
         $self->delete("editdata");
+        $self->delete("add_data");
         $handled = 1;
     }
     elsif ($wname eq "$name-edit") {
         $self->set("mode","edit");
         $handled = 1;
     }
+    elsif ($wname eq "$name-refresh") {
+        $handled = 1;
+    }
     elsif ($wname eq "$name-next") {
         $startrow = $self->get("startrow",1,1);
         $maxrows  = $self->get("maxrows",20,1);
@@ -148,56 +152,65 @@
     }
     elsif ($wname eq "$name-save") {
         $self->save();
-        $self->delete("editdata");
         $handled = 1;
     }
     elsif ($wname eq "$name-add") {
-        $self->{context}->add_message("Add Rows: not yet implemented");
+        my $rows_to_add = $self->{rows_to_add} || 1;
+        my $add_data = $self->{add_data} || [];
+        for (my $i = 0; $i < $rows_to_add; $i++) {
+            push(@$add_data, {});
+        }
+        $self->set("add_data", $add_data);
+        $handled = 1;
+    }
+    elsif ($wname eq "$name-cancel_add") {
+        $self->set("add_data", []);
         $handled = 1;
     }
     elsif ($wname eq "$name-delete") {
-        $self->{context}->add_message("Delete Rows: not yet implemented");
+        $self->delete();
+        $handled = 1;
+    }
+    elsif ($wname eq "$name-copy") {
+        $self->copy();
         $handled = 1;
     }
     elsif ($event eq "sort") {
-        ($colnum, $direction) = @args;
+        ($column, $dir) = @args;
 
-        my ($columns, $directions, $order_by, $column, $i);
-        $columns    = $self->get_columns();
-        $column     = $columns->[$colnum];
+        my $columns    = $self->get_columns();
 
-        $order_by = $self->get("order_by") || $self->get("ordercols");   # 
ordercols is deprecated in favor of order_by
+        my $order_by  = $self->{order_by} || $self->{ordercols};    # 
ordercols is deprecated in favor of order_by
+        my $direction = $self->{direction} || $self->{directions};  # 
directions is deprecated in favor of direction
+        $direction ||= {};
         if (defined $order_by) {
-            $directions = $self->get("directions");
-            $directions = [] if (!defined $directions);
-            for ($i = 0; $i <= $#$order_by; $i++) {
+            for (my $i = 0; $i <= $#$order_by; $i++) {
                 if ($order_by->[$i] eq $column) {
                     splice(@$order_by, $i, 1);     # delete the use of $column
-                    splice(@$directions, $i, 1);    # delete the sort direction
                     last;
                 }
             }
             unshift(@$order_by, $column);      # put it at the beginning
-            unshift(@$directions, $direction);
+            $direction->{$column} = $dir;
         }
         else {
-            $order_by = [ $column ];
-            $directions = [ $direction ];
+            $order_by  = [ $column ];
+            $direction = { $column => $dir };
         }
 
         $self->set("order_by",$order_by);
-        $self->set("directions",$directions);
+        $self->set("direction",$direction);
         $handled = 1;
     }
-    elsif ($wname =~ /-sort[0-9]*$/) {
-        ($colnum, $x, $y) = @args;
+    elsif ($wname =~ /-sort_[_a-zA-Z0-9]*$/) {
+        ($column, $x, $y) = @args;
         $context = $self->{context};
-        $width = $context->widget($wname)->get("width");
+        $width = $context->widget($wname)->{width} || 50;
         if ($x <= $width/2) {
-            $handled = $self->handle_event($wname, "sort", $colnum, "UP");
+            $handled = $self->handle_event($wname, "sort", $column, "asc");
         }
         else {
-            $handled = $self->handle_event($wname, "sort", $colnum, "DOWN");
+            $handled = $self->handle_event($wname, "sort", $column, "desc");
         }
     }
     else {
@@ -317,7 +330,7 @@
     }
     else {
         $table = $self->get("table");
-    
+
         $columns = $self->get_columns();
         if (! defined $columns || $#$columns == -1) {
             $columns = $rep->get_column_names($table);
@@ -363,7 +376,7 @@
                         elsif ($paramvalues[$i] eq "/")  { $op = "matches"; }
 
                         $paramvalue = $paramvalues[$i+1];
-       
+
                         if ($op) {
                             $param = "$column.$op";
                             if (!defined $paramvalues{$param}) {
@@ -392,24 +405,22 @@
 
         my $order_by   = $self->get("order_by") || $self->get("ordercols");   
# ordercols is deprecated in favor of order_by
         my $group_by   = $self->get("group_by");
-        my $directions = $self->get("directions");
+        my $direction  = $self->{direction} || $self->{directions} || {};
         $startrow      = $self->get("startrow", 1, 1);
         $maxrows       = $self->get("maxrows", 20, 1);
         $endrow        = ($maxrows != 0) ? ($startrow + $maxrows - 1) : 0;
 
         if ($App::DEBUG && $self->{context}->dbg(1)) {
-            $self->{context}->dbgprint("DataTable2->load(): 
get_rows($table,c=$columns,p=$params,pv=$paramvalues,oc=$order_by,$startrow,$endrow,$directions);");
+            $self->{context}->dbgprint("DataTable2->load(): 
get_rows($table,c=$columns,p=$params,pv=$paramvalues,oc=$order_by,$startrow,$endrow,$direction);");
             $self->{context}->dbgprint("DataTable2->load(): columns=[", 
join(",", @$columns), "]") if (ref($columns) eq "ARRAY");
             $self->{context}->dbgprint("DataTable2->load(): params=[", 
join(",", @$params), "]") if (ref($params) eq "ARRAY");
             $self->{context}->dbgprint("DataTable2->load(): paramvalues=[", 
join(",", %$paramvalues), "]") if (ref($paramvalues) eq "HASH");
             $self->{context}->dbgprint("DataTable2->load(): order_by=[", 
join(",", @$order_by), "]") if (ref($order_by) eq "ARRAY");
-            $self->{context}->dbgprint("DataTable2->load(): directions=[", 
join(",", @$directions), "]") if (ref($directions) eq "ARRAY");
+            $self->{context}->dbgprint("DataTable2->load(): directions={", 
join(",", %$direction), "}") if (ref($direction) eq "HASH");
         }
 
-        #$rows  = $rep->select_rows($table, $columns, $params, \%paramvalues, 
$order_by, $startrow, $endrow, $directions);
-        #$rows  = $rep->select_rows($table, $columns, undef, \%paramvalues, 
$order_by, $startrow, $endrow, $directions);
         $rows  = $rep->get_rows($table, \%paramvalues, $columns,
-            {order_by => $order_by, startrow => $startrow, endrow => $endrow, 
directions => $directions, group_by => $group_by});
+            {order_by => $order_by, startrow => $startrow, endrow => $endrow, 
direction => $direction, group_by => $group_by});
         $error = $rep->error();
         if ($#$rows == -1 && $error) {
             $sql = $rep->{sql};
@@ -418,7 +429,7 @@
     }
 
     my ($keys, $row);
- 
+
     $self->{data} = $rows;
 
     $keycolidx = $self->get("keycolidx");
@@ -436,7 +447,7 @@
     &App::sub_entry if ($App::trace);
     my $self = shift;
     my ($repname, $context, $rep, $table);
-    my ($editdata, $key, $column, @columns, @values);
+    my ($editdata, $add_data, $key, $column, @columns, @values);
 
     $repname = $self->get("repository");
     $context = $self->{context};
@@ -453,21 +464,161 @@
     }
 
     $editdata = $self->get("editdata");
-    if ($editdata) {
+    if ($editdata && $self->{mode} eq "edit") {
         foreach $key (keys %$editdata) {
             @columns = ();
             @values = ();
             foreach $column (keys %{$editdata->{$key}}) {
                 push(@columns, $column);
-                push(@values, $editdata->{$key}{$column});
+
+                if ( $editdata->{$key}{$column} eq '' ) {
+                    push(@values, undef);
+                } else {
+                    push(@values, $editdata->{$key}{$column});
+                }
+            }
+            eval {
+                $rep->set($table, $key, [EMAIL PROTECTED], [EMAIL PROTECTED]);
+            };
+            if ($@) {
+                my $errmsg = $@;
+                $errmsg =~ s/^DBD::[^ ]*[^:]*: *//;
+                $errmsg =~ s! at [^ ]+ line [0-9]+\.?!!;
+                $self->{row_error}{$key} = $errmsg;
+            }
+        }
+    }
+
+    $add_data = $self->{add_data};
+    if ($add_data && $#$add_data > -1) {
+
+        my ($i, $col_vals);
+
+        for ($i = $#$add_data; $i >= 0; $i--) {
+            @columns = ();
+            @values  = ();
+            $col_vals = $add_data->[$i];
+            foreach my $col ( @{$self->{columns}} ) {
+                if ( defined $col_vals->{$col} ) {
+                    push(@columns, $col);
+
+                    if ( $col_vals->{$col} eq '' ) {
+                        push(@values, undef);
+                    } else {
+                        push(@values, $col_vals->{$col});
+                    }
+                }
+            }
+            eval {
+                $rep->insert_row($table, [EMAIL PROTECTED], [EMAIL PROTECTED]);
+            };
+            if ($@) {
+                my $errmsg = $@;
+                $errmsg =~ s/^DBD::[^ ]*[^:]*: *//;
+                $errmsg =~ s! at [^ ]+ line [0-9]+\.?!!;
+                $col_vals->{row_error} = $errmsg;
+            }
+            else {
+                splice(@$add_data, $i, 1);
             }
-            $rep->set($table, $key, [EMAIL PROTECTED], [EMAIL PROTECTED]);
         }
+        $self->set("add_data", $add_data);
+    }
+
+    $rep->commit();
+    &App::sub_exit() if ($App::trace);
+}
+
+sub delete {
+    &App::sub_entry if ($App::trace);
+    my $self = shift;
+
+    my $repname = $self->get("repository");
+    my $context = $self->{context};
+    my $rep = $context->repository($repname);
+    if (! $rep) {
+        $context->add_message("No repository specified");
+        return;
+    }
+    my $table = $self->{table};
+    if (! $table) {
+        $context->add_message("No table specified");
+        return;
+    }
+
+    my $columns = $self->get_columns();
+    my ($keyvals, %params);
+    my $keycolidx = $self->{keycolidx};
+    my $row_selected = $self->{row_selected} || {};
+    foreach my $key (keys %$row_selected) {
+        %params = ();
+        $keyvals = [ split(/,/, $key) ];
+        for (my $i=0; $i <= $#$keycolidx; $i++) {
+            $params{$columns->[$keycolidx->[$i]]} = $keyvals->[$i];
+        }
+        eval {
+            $rep->delete($table, \%params);
+        };
+        if ($@) {
+            my $errmsg = $@;
+            $errmsg =~ s/^DBD::[^ ]*[^:]*: *//;
+            $errmsg =~ s! at [^ ]+ line [0-9]+\.?!!;
+            $self->{row_error}{$key} = $errmsg;
+        }
+        else {
+            delete $row_selected->{$key};
+        }
+        $self->set("row_selected", $row_selected);
     }
+
     $rep->commit();
     &App::sub_exit() if ($App::trace);
 }
 
+sub copy {
+    &App::sub_entry if ($App::trace);
+    my $self = shift;
+
+    my $repname = $self->get("repository");
+    my $context = $self->{context};
+    my $rep = $context->repository($repname);
+    if (! $rep) {
+        $context->add_message("No repository specified");
+        return;
+    }
+    my $table = $self->{table};
+    if (! $table) {
+        $context->add_message("No table specified");
+        return;
+    }
+
+    my $data         = $self->get_data();
+    my $row_selected = $self->{row_selected} || {};
+    my $keycolidx    = $self->{keycolidx};
+    my $columns      = $self->get_columns();
+    my $add_data     = $self->{add_data} || [];
+
+    foreach my $key (keys %$row_selected) {
+        foreach my $val (@$data){
+            for (my $i=0; $i <= $#$keycolidx; $i++) {
+                if ($key eq $val->[$keycolidx->[$i]]) {
+                    foreach my $col ($columns){
+                        my $col_hash;
+                        for (my $ii=0; $ii <= $#$col; $ii++) {
+                            $col_hash->{$col->[$ii]} = $val->[$ii];
+                        }
+                        push(@$add_data, $col_hash);
+                    }
+                }
+            }
+        }
+    }
+
+    $self->set("add_data", $add_data) if ($#$add_data > -1);
+
+    &App::sub_exit() if ($App::trace);
+}
+
 sub substitute {
     &App::sub_entry if ($App::trace);
     my ($self, $text, $values) = @_;
@@ -608,6 +759,28 @@
     my $table_column_defs = $table_def->{column};
     my $view_column_defs = $self->{column} || {};
 
+    if ($mode eq "edit") {
+        if ($rowactions) {
+            $rowactions = [ @$rowactions, "copy", "delete" ];
+        }
+        else {
+            $rowactions = [ "copy", "delete" ];
+        }
+        if ($rowactiondefs) {
+            $rowactiondefs = { %$rowactiondefs };
+        }
+        else {
+            $rowactiondefs = {};
+        }
+        $rowactiondefs->{copy} = {
+            label => "Copy",
+            select => "multi",
+        };
+        $rowactiondefs->{delete} = {
+            label => "Delete",
+            select => "multi",
+        };
+    }
     if (! $self->{keycolidx}) {
         $rowactions            = undef;
         $row_selectable        = 0;  # can't select row(s) if no primary key
@@ -674,28 +847,42 @@
         if ($scrollable) {
             $html .= "<table border=\"0\" cellspacing=\"0\" 
cellpadding=\"5\"><tr><td>\n";
             $html .= "<table border=\"0\" cellspacing=\"0\" 
cellpadding=\"3\"><tr><td valign=\"middle\" nowrap>&nbsp;\n";
-            $html .= $context->widget("$name-view",
+            $html .= $context->widget("$name-refresh",
                          class => "App::Widget::ImageButton",
                          image_script => 'app-button',
                          #volatile => 1,
-                         label => 'View',
+                         label => 'Refresh',
                          height => 17,
-                         width => 50,
+                         width => 60,
                          bevel => 2,
                      )->html();
             $html .= " ";
             if ($editable) {
-                $html .= $context->widget("$name-edit",
-                         class => "App::Widget::ImageButton",
-                         image_script => 'app-button',
-                         #volatile => 1,
-                         label => 'Edit',
-                         height => 17,
-                         width => 50,
-                         bevel => 2,
-                     )->html();
+                if ($mode eq "view") {
+                    $html .= $context->widget("$name-edit",
+                                 class => "App::Widget::ImageButton",
+                                 image_script => 'app-button',
+                                 #volatile => 1,
+                                 label => 'Edit',
+                                 height => 17,
+                                 width => 60,
+                                 bevel => 2,
+                             )->html();
+                }
+                else {
+                    $html .= $context->widget("$name-view",
+                                 class => "App::Widget::ImageButton",
+                                 image_script => 'app-button',
+                                 #volatile => 1,
+                                 label => 'View',
+                                 height => 17,
+                                 width => 60,
+                                 bevel => 2,
+                             )->html();
+                }
                 $html .= " ";
             }
+
             $html .= "    &nbsp;</td><td nowrap";
             $html .= " bgcolor=\"$heading_bgcolor\"" if ($heading_bgcolor);
             $html .= ">$elem_begin&nbsp;\n";
@@ -733,7 +920,7 @@
             $html .= "&nbsp;$elem_end</td></tr></table>\n";
             $html .= "</td></tr></table>\n";
         }
-    
+
         if ($mode eq "edit") {
             $html .= "<table border=\"0\" cellspacing=\"0\" 
cellpadding=\"3\"><tr>\n";
             $html .= "<td>\n";
@@ -743,12 +930,12 @@
                          #volatile => 1,
                          label => 'Save',
                          height => 17,
-                         width => 50,
+                         width => 60,
                          bevel => 2,
                      )->html();
             $html .= "</td>\n";
             $html .= "<td>\n";
-            $html .= $context->widget("$name.add",
+            $html .= $context->widget("$name-add",
                          class => "App::Widget::ImageButton",
                          image_script => 'app-button',
                          #volatile => 1,
@@ -759,11 +946,19 @@
                      )->html();
             $html .= "</td>\n";
             $html .= "<td>\n";
-            $html .= $context->widget("$name-delete",
+            $html .= $context->widget("$name-rows_to_add",
+                         class => "App::Widget::Select",
+                        values => ["1","2","3","4","5","6","7","8","9","10",
+                                   
"11","12","13","14","15","16","17","18","19","20",
+                                  ],
+                     )->html();
+            $html .= "</td>\n";
+            $html .= "<td>\n";
+            $html .= $context->widget("$name-cancel_add",
                          class => "App::Widget::ImageButton",
                          image_script => 'app-button',
                          #volatile => 1,
-                         label => 'Delete Rows',
+                         label => 'Cancel Adds',
                          height => 17,
                          width => 85,
                          bevel => 2,
@@ -783,34 +978,12 @@
             #$html .= "</td>\n";
             $html .= "</tr></table>\n";
         }
-    
+
         $html .= $table_begin;
         if (!$sql) {
-            if ($sortable) {
-                $html .= "<tr>\n";
-                $html .= "  <td>&nbsp;</td>\n" if ($numbered);
-                $html .= "  <td>&nbsp;</td>\n" if ($row_selectable);
-                $html .= "  <td>&nbsp;</td>\n" if ($row_single_selectable);
-                $html .= "  <td>&nbsp;</td>\n" if ($#row_actions > -1);
-
-                for ($col = 0; $col < $numcols; $col++) {
-                    $elem = $context->widget("$name-sort$col",
-                                class => "App::Widget::ImageButton",
-                                image_script => 'app-button',
-                                #volatile => 1,
-                                label => 'Up|Dn',
-                                height => 17,
-                                width => 50,
-                                bevel => 2,
-                                args => $col,
-                            )->html();
-                    $html .= "  <td>$elem</td>\n";
-                }
-                $html .= "</tr>\n";
-            }
             if ($filterable) {
                 my ($w);
-                $html .= "<tr>\n";
+                $html .= "<tr class=\"App-DataTable-tr_filter\">\n";
                 $html .= "  <td>&nbsp;</td>\n" if ($numbered);
                 $html .= "  <td>&nbsp;</td>\n" if ($row_selectable);
                 $html .= "  <td>&nbsp;</td>\n" if ($row_single_selectable);
@@ -832,6 +1005,28 @@
                 }
                 $html .= "</tr>\n";
             }
+            if ($sortable) {
+                $html .= "<tr class=\"App-DataTable-tr_sort\">\n";
+                $html .= "  <td>&nbsp;</td>\n" if ($numbered);
+                $html .= "  <td>&nbsp;</td>\n" if ($row_selectable);
+                $html .= "  <td>&nbsp;</td>\n" if ($row_single_selectable);
+                $html .= "  <td>&nbsp;</td>\n" if ($#row_actions > -1);
+
+                for ($col = 0; $col < $numcols; $col++) {
+                    $elem = $context->widget("$name-sort_$columns->[$col]",
+                                class => "App::Widget::ImageButton",
+                                image_script => 'app-button',
+                                #volatile => 1,
+                                label => 'Up|Dn',
+                                height => 17,
+                                width => 50,
+                                bevel => 2,
+                                args => $columns->[$col],
+                            )->html();
+                    $html .= "  <td>$elem</td>\n";
+                }
+                $html .= "</tr>\n";
+            }
         }
         if ($mode eq "edit" && $column_selectable) {
             $html .= "<tr>\n";
@@ -877,7 +1072,7 @@
     if ($row_selectable) {
         if ($#select_actions > -1) {
             my (%args);
-            $html .= "  <td bgcolor=\"$heading_bgcolor\" valign=\"bottom\">";
+            $html .= "  <td bgcolor=\"$heading_bgcolor\" valign=\"bottom\" 
align=\"center\">";
             foreach $rowaction (@select_actions) {
                 %args = (
                     override => 1,
@@ -894,7 +1089,7 @@
                         $args{$_} = $rowactiondef->{$_};
                     }
                 }
-                $html .= $context->widget("$name-${rowaction}", %args, 
+                $html .= $context->widget("$name-${rowaction}", %args,
                              args => "{${name}" . "{row_selected}}"
                          )->html();
                 $html .= "<br>\n" if ($rowaction ne 
$select_actions[$#select_actions]);
@@ -926,8 +1121,8 @@
                         $args{$_} = $rowactiondef->{$_};
                     }
                 }
-                $html .= $context->widget("$name-${rowaction}", %args, 
-                             args => "{${name}" . "{row_single_selected}}"
+                $html .= $context->widget("$name-${rowaction}", %args,
+                         args => "{${name}" . "{row_single_selected}}"
                          )->html();
                 $html .= "<br>\n" if ($rowaction ne 
$single_select_actions[$#select_actions]);
             }
@@ -949,7 +1144,6 @@
 
     $td_row_attrib = "";
     $td_row_attrib .= " bgcolor=\"$bgcolor\"" if ($bgcolor);
-    #$td_row_attrib .= " align=\"$align\"" if ($align);
     $td_row_attrib .= " valign=\"$valign\"" if ($valign);
     $td_row_attrib .= " nowrap" if ($nowrap);
 
@@ -958,15 +1152,14 @@
     @column_length = ();
 
     if ($mode eq "edit") {
-
         # prepare the style attribute arrays
         push(@edit_style, "font_family", $font_face)  if ($font_face);
-        push(@edit_style, "color",      $font_color) if ($font_color);
+        push(@edit_style, "color",      $font_color)  if ($font_color);
 
         # This seems to cause <input> elements to take on the font size
         # currently active for text that surrounds them
         # i.e. <font size="-2"><input type="text" style="font-size: 
100%;"></font>
-        push(@edit_style, "font_size",   "100%")     if ($font_size);
+        push(@edit_style, "font_size",   "100%")      if ($font_size);
 
         # border_style",
         # border_width",
@@ -981,7 +1174,7 @@
             if (defined $columns && defined $columns->[$col]) {
                 $column = $columns->[$col];
             }
-    
+
             if (($column ne "" && $self->{column_selected}{$column}) ||
                 ($self->{row_selected} && %{$self->{row_selected}})) {
                 for ($row = 0; $row <= $#$data; $row++) {
@@ -992,31 +1185,89 @@
                 }
             }
         }
+
+        my $add_data = $self->{add_data};
+        if ($add_data && $#$add_data > -1) {
+            my ($errmsg, $row);
+
+            for (my $i = 0; $i <= $#$add_data; $i++) {
+                $row = $add_data->[$i];
+                my ($format, $scale_factor, $edit_widget_args, $edit_widget);
+                $html .= "<tr class=\"App-DataTable-tr_add\">\n";
+                $html .= "  <td bgcolor=\"$heading_bgcolor\" 
align=\"right\">Add</td>\n" if ($numbered);
+                if ($row_selectable) {
+                    $errmsg = "<br />$row->{row_error}" || "&nbsp;";
+                    $html .= "  <td bgcolor=\"#ffaaaa\" 
class=\"App-DataTable-td_select\">$errmsg</td>\n";
+                }
+                if ($row_single_selectable) {
+                    $html .= "  <td 
bgcolor=\"$heading_bgcolor\">&nbsp;</td>\n";
+                }
+                $html .= "  <td bgcolor=\"$heading_bgcolor\">&nbsp;</td>\n" if 
($#row_actions > -1);
+
+                my $key = $i;
+
+                for ($col = 0; $col < $numcols; $col++) {
+
+                    if (defined $columns && defined $columns->[$col]) {
+                        $column = $columns->[$col];
+                        $format       = $view_column_defs->{$column}{format}   
    || $table_column_defs->{$column}{format};
+                        $scale_factor = 
$view_column_defs->{$column}{scale_factor} || 
$table_column_defs->{$column}{scale_factor};
+                        $align        = $view_column_defs->{$column}{align}    
    ||
+                                        $table_column_defs->{$column}{align}   
    ||
+                                        ($table_column_defs->{$column}{quoted} 
? "left" : "right");
+                    }
+
+                    $html .= "  <td>";
+
+                    $edit_widget_args = $self->{edit_widget}{$column} ||
+                        {
+                                 class => "App::Widget::TextField",
+                                 size => $column_length[$col]+2,   # add 2 
just to give some visual space
+                                 maxlength => 255,
+                                 padding => 0,
+                                 @edit_style,
+                        }
+                    ;
+                    $edit_widget_args->{size} = $column_length[$col]+2 if 
($edit_widget_args->{auto_size});
+
+                    if ( ! defined $edit_widget_args->{readonly} ) {
+                        $edit_widget = 
$context->widget("$name\{add_data}[$key]{$column}", %$edit_widget_args,
+                                                        style_class => 
"App-DataTable-add");
+                        $html .= $edit_widget->html();
+                    } else {
+                        $html .= "&nbsp;";
+                    }
+                    $html .= "</td>\n";
+                }
+                $html .= "</tr>\n";
+            }
+        }
     }
 
-    my ($format, $scale_factor);
+    my ($format, $scale_factor, $edit_widget_args, $edit_widget);
     for ($row = 0; $row <= $#$data; $row++) {
         $numrow = $startrow + $row;
 
-        $html .= "<tr>\n";
-
         $key = "";
         if (defined $keys && defined $keys->[$row]) {
             $key = join(",", @{$keys->[$row]});   # need to HTML-escape these!
         }
 
+        $html .= $self->{row_selected}{$key} ? "<tr 
class=\"App-DataTable-tr_selected\">" : "<tr>\n";
+
         $html .= "  <td bgcolor=\"$heading_bgcolor\" 
align=\"right\">$elem_begin$numrow$elem_end</td>\n" if ($numbered);
 
         if ($row_selectable) {
-            $html .= "  <td bgcolor=\"#ffaaaa\" valign=\"middle\" 
align=\"center\">\n";
+            $html .= "  <td bgcolor=\"#ffaaaa\" valign=\"middle\" 
align=\"center\" class=\"App-DataTable-td_select\">\n";
             $html .= $context->widget("$name\{row_selected}{$key}",
                          class => "App::Widget::Checkbox",
                      )->html();
+            $html .= "<br />$self->{row_error}{$key}" if 
($self->{row_error}{$key});
             $html .= "  </td>\n";
         }
 
         if ($row_single_selectable) {
-            $html .= "  <td bgcolor=\"#ffaaaa\" valign=\"middle\" 
align=\"center\">\n";
+            $html .= "  <td bgcolor=\"#ffaaaa\" valign=\"middle\" 
align=\"center\" class=\"App-DataTable-td_single_select\">\n";
             $html .= $context->widget("$name\{row_single_selected}",
                          class => "App::Widget::RadioButton",
                          override => 1,
@@ -1060,7 +1311,9 @@
                 $column = $columns->[$col];
                 $format       = $view_column_defs->{$column}{format}       || 
$table_column_defs->{$column}{format};
                 $scale_factor = $view_column_defs->{$column}{scale_factor} || 
$table_column_defs->{$column}{scale_factor};
-                $align        = $view_column_defs->{$column}{align}        || 
$table_column_defs->{$column}{align};
+                $align        = $view_column_defs->{$column}{align}        ||
+                                $table_column_defs->{$column}{align}       ||
+                                ($table_column_defs->{$column}{quoted} ? 
"left" : "right");
             }
 
             $elem_selected = 0;
@@ -1075,7 +1328,7 @@
             if ($elem_selected) {
                 if (!defined $elem || $elem eq "") {
                     $elem = "";
-                    $td_col_attrib = " align=\"left\"";
+                    $td_col_attrib = $align ? " align=\"$align\"" : " 
align=\"left\"";
                 }
                 else {
                     $elem = $elem * $scale_factor if ($scale_factor);
@@ -1094,16 +1347,24 @@
                     $self->{editdata}{$key}{$column} = $elem
                 }
                 $html .= "  <td $td_row_attrib$td_col_attrib>${elem_begin}";
-                $html .= $context->widget("$name\{editdata}{$key}{$column}",
+                $edit_widget_args = $self->{edit_widget}{$column} ||
+                    {
                              class => "App::Widget::TextField",
                              size => $column_length[$col]+2,   # add 2 just to 
give some visual space
-                             maxlength => 99,
-                             background_color => "#ffaaaa",
-                             border_style => "solid",
-                             border_width => "1px",
+                             maxlength => 255,
                              padding => 0,
                              @edit_style,
-                         )->html();
+                    }
+                ;
+                $edit_widget_args->{size} = $column_length[$col]+2 if 
($edit_widget_args->{auto_size});
+
+                if ( ! defined $edit_widget_args->{readonly} ) {
+                    $edit_widget = 
$context->widget("$name\{editdata}{$key}{$column}", %$edit_widget_args,
+                                                    style_class => 
"App-DataTable-edit");
+                    $html .= $edit_widget->html();
+                } else {
+                    $html .= $elem;
+                }
                 $html .= "$elem_end</td>\n";
             }
             else {

Reply via email to