

    # Field Movement
    if ($Op eq 'NewField') {
	require Digest::MD5;

	my $mod = ($Type eq 'Data') ? '' : "/$Type";
	require "RG/Field$mod.pm"; $mod =~ s|/|::|;
	$table = $_init_table->($Part);
	$table->add_field("RG::Field$mod"->new({
	    NAME => $Type . Digest::MD5::md5_hex(
		Digest::MD5::md5_hex(time(). {}. rand(). $$)
	    ),
	}));
	$FID = (() = $table->fields) - 1;
	$direction = 'new';
    }
    elsif ($Op eq 'Leftward') {
	$table = $_init_table->($Part);
	$table->move($FID, 'left');
	$FID--;
	$direction = -1;
    }
    elsif ($Op eq 'Rightward') {
	$table = $_init_table->($Part);
	$table->move($FID, 'right');
	$FID++;
	$direction = 1;
    }
    elsif ($Op eq 'DeleteField') {
	$table = $_init_table->($Part);
	$table->del_field($FID);
	$direction = 'delete';
    }
    # TABLE post-change handler
    if (defined $direction) {
	if ($Part->type eq 'TABLE') {
	    my ($thead) = grep { $_->type eq 'THEAD' } $Part->children;
	    ($thead) = $thead->children;
	    my ($tbody) = grep { $_->type eq 'TBODY' } $Part->children;
	    ($tbody) = $tbody->children;

	    if (ref($direction)) {
		$thead->children->[$FID]{text}[0] = $direction->{descr};
		$tbody->children->[$FID]{text}[0] = $direction->{name};
	    }
	    elsif ($direction eq 'new') {
		my $th = $thead->add('TH');
		$th->text(''); $th->this($thead->this);
		my $td = $tbody->add('TD');
		$td->text(''); $td->this($tbody->this);
	    }
	    elsif ($direction eq 'delete') {
		splice(@{$thead->children}, $FID, 1);
		splice(@{$tbody->children}, $FID, 1);
	    }
	    else {
		@{$thead->children}[$FID, $FID + $direction]
		    = @{$thead->children}[$FID + $direction, $FID];
		@{$tbody->children}[$FID, $FID + $direction]
		    = @{$tbody->children}[$FID + $direction, $FID];
	    }
	}

	$session{changed} = 1;
    }
    # Cleanup
    if ($table) {
	$Part->this->{src} = $Part->this->{table} =
	    bless( \( $table->serialize(0) ), '_Fake::SRC' );
	$session{changed} = 1;
    }
