/usr/local/CPAN/new.spirit/NewSpirit/Prefs.pm
# $Id: Prefs.pm,v 1.5 2001/03/12 11:15:19 joern Exp $
package NewSpirit::Prefs;
@ISA = qw( NewSpirit::Widget );
$VERSION = "0.01";
use strict;
use NewSpirit::LKFile;
use NewSpirit::Widget;
use Carp;
my %WIDGET_TYPE_LEN = (
'c' => 7,
'f' => 40,
'i' => 10,
'b' => 1,
'fr' => 20
);
sub new {
my $type = shift;
my ($q) = @_;
my $self = {
q => $q,
data => {},
widget_fields => [],
filename => undef
};
return bless $self, $type;
}
sub read {
my $self = shift;
my ($username) = @_;
my $user_conf_file = "$CFG::user_conf_dir/$username.conf";
my $default_conf_file = $CFG::default_user_conf_file;
# first read default config file to build the structure
my $lkfile = new NewSpirit::LKFile ($default_conf_file);
my $data = $lkfile->read;
$lkfile = undef;
$$data =~ m/^(.*?#--do-not-remove-this--\n)(.*?)(#--do-not-remove-this--\n.*)$/s;
my $header = $1;
my $footer = $3;
$data = $2;
my %data;
my %widget_definition;
my @widget_order;
my $nr = 0;
while ( $data =~ m/(.*)/mg ) {
my $line = $1;
next if $line eq '';
if ( $line =~ m,^#!/\s+(.*), ) {
++$nr;
$widget_definition{"title$nr"} = {
description => $1,
type => 'title'
};
push @widget_order, "title$nr";
} elsif ( $line =~ m/^#!-/ ) {
++$nr;
$widget_definition{"space$nr"} = {
type => 'space'
};
push @widget_order, "space$nr";
} elsif ( $line =~ m/\$(\w+)\s*=\s*"?(.*?)"?;\s*#!([^\s]+)\s*(.*)/ ) {
my $len = $WIDGET_TYPE_LEN{$3};
$widget_definition{$1} = {
description => $4,
type => "text $len"
};
push @widget_order, $1;
$data{$1} = $2;
}
}
# now read user config file to get user specific values,
# if the user files exists
if ( -f $user_conf_file ) {
$lkfile = new NewSpirit::LKFile ($user_conf_file);
$data = $lkfile->read;
$lkfile = undef;
$$data =~ m/^(.*?#--do-not-remove-this--\n)(.*?)(#--do-not-remove-this--\n.*)$/s;
$data = $2;
while ( $data =~ m/(.*)/mg ) {
my $line = $1;
next if $line eq '';
if ( $line =~ m/\$(\w+)\s*=\s*"?(.*?)"?;\s*#!([^\s]+)\s*(.*)/ ) {
$data{$1} = $2;
}
}
}
$self->{widget_definition} = \%widget_definition;
$self->{widget_order} = \@widget_order;
$self->{data} = \%data;
# NewSpirit::dump (\%widget_definition, \@widget_order, \%data);
1;
}
sub save {
my $self = shift;
my ($username) = @_;
my $user_conf_file = "$CFG::user_conf_dir/$username.conf";
my $default_conf_file = $CFG::default_user_conf_file;
my $q = $self->{q};
# read default config file as a template for the
# user configuration file
my $lkfile = new NewSpirit::LKFile ($default_conf_file);
my $data = $lkfile->read;
$lkfile = undef;
# parse configuration template
$$data =~ m/^(.*?#--do-not-remove-this--\n)(.*?)(#--do-not-remove-this--\n.*)$/s;
my $header = $1;
my $footer = $3;
$data = $2;
my $new_data = '';
# build new configuration file body.
# scan configuration template and replace values with
# the new values taken from the CGI query object
while ( $data =~ m/(.*)/mg ) {
my $line = $1;
$new_data .= "\n", next if $line eq '';
if ( $line =~ m/\$(\w+)(\s*)=(\s*)("?)(.*?)("?);(\s*)#!([^\s]+)\s*(.*)/ ) {
$new_data .= "\$$1$2=$3$4".$q->param($1)."$6;$7#!$8 $9";
} else {
$new_data .= "$line";
}
}
$data = $header.$new_data.$footer;
my $lkfile = new NewSpirit::LKFile ($user_conf_file);
$lkfile->write (\$data) ;
$lkfile = undef;
1;
}
# CGI Stuff
sub event_edit {
my $self = shift;
my ($message) = @_;
$message ||= ' ';
my $q = $self->{q};
my $username = $q->param('username');
my $ticket = $q->param('ticket');
$self->read ($username);
NewSpirit::std_header (
page_title => "Edit Preferences"
);
print <<__HTML;
<form name="usr" action="$CFG::admin_url" method="POST">
<input type="HIDDEN" name=ticket value="$ticket">
<input type="HIDDEN" name=e value="pref_save">
__HTML
my $buttons = <<__HTML;
<table $CFG::TABLE_OPTS width="100%">
<tr><td>
$CFG::FONT<FONT COLOR="green">
<b>$message</b>
</FONT></FONT>
</td><td align="right">
$CFG::FONT
<INPUT TYPE=BUTTON VALUE=" Save "
onClick="this.form.submit()">
</FONT>
</td></tr>
</table>
__HTML
$self->input_widget_factory (
names_lref => $self->{widget_order},
info_href => $self->{widget_definition},
data_href => $self->{data},
buttons => $buttons
);
print "</form>\n";
$self->back_to_main;
NewSpirit::end_page();
}
sub event_save {
my $self = shift;
my $q = $self->{q};
my $username = $q->param('username');
$self->save ($username);
NewSpirit::read_user_config($username);
$self->event_edit ('User preferences saved');
}
sub back_to_main {
my $self = shift;
my $ticket = $self->{q}->param('ticket');
print <<__HTML;
<p>
$CFG::FONT
<a href="$CFG::admin_url?ticket=$ticket&e=menu"><b>[ Go Back ]</b></a>
</font>
__HTML
}
1;