#! /usr/bin/perl
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' if 0; # not running under some shell
BEGIN { $main::DEFA = "/usr/share/dbman"; }

require 5.003;
use strict qw/subs vars/;
use vars qw/$VERSION $VERNAME $ORIG_0 $DEFAULT_DIR $mylib $DEBUG $RESOURCE $DEFA
		%Message $taglist $langframe %langvar $main $last_sel/;

BEGIN {
	$DEBUG = 0;
	$VERSION = '0.0.9';
        $VERNAME = "dbMan Language Editor $VERSION";  
	use FindBin;
	$ORIG_0 = $FindBin::RealScript;  $0 = "dbman-le";
	$DEFAULT_DIR = $DEFA;
        if ($ORIG_0 !~ /\//) { $ORIG_0 = './' . $ORIG_0; }
        $mylib = $ORIG_0;  $mylib =~ s/\/[^\/]*$//;
        unshift @INC,".";
        unshift @INC,$DEFAULT_DIR;
        unshift @INC,$mylib;
        unshift @INC,$ENV{DBMAN_LIB} if $ENV{DBMAN_LIB};
}

for (@INC) {
	if (-f "$_/dbManLang.pm") { $RESOURCE = "$_/dbManLang.pm";  last; }
}

unless ($RESOURCE) { 
	print STDERR "Can't find dbManLang.pm resource module.\n";  exit;
}

print "Resource file $RESOURCE...\n";
require $RESOURCE;  dbManLang::le_import();

my %AllTags = ();
for my $lang (sort keys %Message) { 
	print "Loading resource strings for language $lang...\n"; 
	for my $tag (keys %{$Message{$lang}}) { ++$AllTags{$tag}; }
}

###########################################################################

sub click {
	return unless defined $taglist->curselection();
	if ($last_sel) {
		for (keys %langvar) {
			$Message{$_}->{$last_sel} = $langvar{$_};
		}
	}
	my $tag = $taglist->get($taglist->curselection());
	for (keys %langvar) {
		$langvar{$_} = (exists $Message{$_}->{$tag})?
				$Message{$_}->{$tag}:'';
	}
	$last_sel = $tag;
}

sub resettag {
	return unless $last_sel;
	for (keys %langvar) {
		$langvar{$_} = (exists $Message{$_}->{$last_sel})?
				$Message{$_}->{$last_sel}:'';
	}
}

sub newl {
	my $l = '';
	my $dialog = $main->DialogBox(-title => 'New language',
		-buttons => [ 'Create','Cancel' ]);

	my $label_1 = $dialog->Label(-justify => 'left',
		-text => 'ISO code for language:');
	my $entry_1 = $dialog->Entry(-textvariable => \$l);

	$label_1->grid(-column => 2,-row => 1,-sticky => 'w');
	$entry_1->grid(-column => 3,-row => 1,-sticky => 'ew');
	$dialog->gridRowconfigure(1, -weight  => 0, -minsize  => 30);
	$dialog->gridRowconfigure(7, -weight  => 0, -minsize  => 17);
	$dialog->gridColumnconfigure(1, -weight => 0, -minsize => 10);
	$dialog->gridColumnconfigure(2, -weight => 0, -minsize => 100);
	$dialog->gridColumnconfigure(3, -weight => 0, -minsize => 100);
	$dialog->gridColumnconfigure(4, -weight => 0, -minsize => 13);

        if ($dialog->Show eq 'Create') {
		if (exists $Message{$l}) {
			$main->messageBox(-icon => 'error', -type => 'OK',
                        -title => 'Error', -message => "$l already exist.");
		} else {
			$Message{$l} = {};
			$langframe->Label(-text => $l)->pack(-fill => 'x');
			$langvar{$l} = '';
			$langframe->Entry(-textvariable => \$langvar{$l})
				->pack(-fill => 'x');
		}
	}
}

sub newt {
	my $t = '';
	my $dialog = $main->DialogBox(-title => 'New tag',
		-buttons => [ 'Create','Cancel' ]);

	my $label_1 = $dialog->Label(-justify => 'left',
		-text => 'Tag name:');
	my $entry_1 = $dialog->Entry(-textvariable => \$t);

	$label_1->grid(-column => 2,-row => 1,-sticky => 'w');
	$entry_1->grid(-column => 3,-row => 1,-sticky => 'ew');
	$dialog->gridRowconfigure(1, -weight  => 0, -minsize  => 30);
	$dialog->gridRowconfigure(7, -weight  => 0, -minsize  => 17);
	$dialog->gridColumnconfigure(1, -weight => 0, -minsize => 10);
	$dialog->gridColumnconfigure(2, -weight => 0, -minsize => 70);
	$dialog->gridColumnconfigure(3, -weight => 0, -minsize => 300);
	$dialog->gridColumnconfigure(4, -weight => 0, -minsize => 13);

        if ($dialog->Show eq 'Create') {
		if (exists $AllTags{$t}) {
			$main->messageBox(-icon => 'error', -type => 'OK',
                        -title => 'Error', -message => "$t already exist.");
		} else {
			++$AllTags{$t};
			$taglist->insert('end',$t); 
		}
	}
}

sub save {
	my $f = '';
	my $dialog = $main->DialogBox(-title => 'Save',
		-buttons => [ 'Save','Cancel' ]);

	my $label_1 = $dialog->Label(-justify => 'left',
		-text => 'Filename:');
	my $entry_1 = $dialog->Entry(-textvariable => \$f);

	$label_1->grid(-column => 2,-row => 1,-sticky => 'w');
	$entry_1->grid(-column => 3,-row => 1,-sticky => 'ew');
	$dialog->gridRowconfigure(1, -weight  => 0, -minsize  => 30);
	$dialog->gridRowconfigure(7, -weight  => 0, -minsize  => 17);
	$dialog->gridColumnconfigure(1, -weight => 0, -minsize => 10);
	$dialog->gridColumnconfigure(2, -weight => 0, -minsize => 70);
	$dialog->gridColumnconfigure(3, -weight => 0, -minsize => 300);
	$dialog->gridColumnconfigure(4, -weight => 0, -minsize => 13);

        if ($dialog->Show eq 'Save') {
		if (-f $f) {
			$main->messageBox(-icon => 'error', -type => 'OK',
                        -title => 'Error', -message => "$f already exist.");
		} else {
			saveto($f);
		}
	}
}

sub saveto {
	my $filename = shift;
	if (open F,">$filename") {
		if (open FS,$RESOURCE) {
			while (<FS>) {
				chomp;
				last if /^##LE_START$/;
				print F "$_\n";
			}
			while (<FS>) {
				chomp;
				last if /^##LE_STOP$/;
			}
			print F "##LE_START\nmy %Message = (\n\n";
			for my $lang (sort keys %Message) {
				print F "'$lang' => {\n\n";	
				for my $tag (sort keys %{$Message{$lang}}) {
					my $hl = "'";  my $hr = "'";
					my $t = $Message{$lang}->{$tag};
					if ($t =~ /'/) {
						if ($t =~ /"/) {
							$hl = 'q\\';  $hr = '\\';
						} else {
							$hl = '"';  $hr = '"';
						}
					}
					print F "$tag => $hl$t$hr,\n";
				}
				print F "},\n\n";
			}
			print F ");\n##LE_STOP\n";
			print F while <FS>;
			close FS;
		} else {
			$main->messageBox(-icon => 'error', -type => 'OK',
			-title => 'Error', 
			-message => "Can't open original resource file.");
		}
		close F;
	} else {
		$main->messageBox(-icon => 'error', -type => 'OK',
			-title => 'Error', -message => "Can't create $filename.");
	}
}

###########################################################################

print "Starting Tk...\n";
use Tk;

$main = new MainWindow;  $main->title('dbMan language editor');
my $frame1 = $main->Frame()->pack(-side => 'top', -expand => 'y', -fill => 'both');
$taglist = $frame1->Scrolled('Listbox',-scrollbars=>'e', -setgrid => 1, 
	-selectmode => 'single')->pack(-fill => 'both', -side => 'left');
$taglist->bind('<1>',\&click);
$langframe = $frame1->Frame()->pack(-fill => 'both', -expand => 'y', -side => 'right');
my $frame2 = $main->Frame()->pack(-side => 'bottom', -fill => 'y');
$frame2->Button(-text => 'New language', -command => \&newl)->pack(-side => 'left');
$frame2->Button(-text => 'New tag', -command => \&newt)->pack(-side => 'left');
$frame2->Button(-text => 'Reset current tag', -command => \&resettag)->pack(-side => 'left');
$frame2->Button(-text => 'Save', -command => \&save)->pack(-side => 'left');
$frame2->Button(-text => 'Quit', -command => \&exit)->pack(-side => 'left');

$last_sel = undef;

for (sort keys %AllTags) { $taglist->insert('end',$_); }
for (sort keys %Message) { 
	$langframe->Label(-text => $_)->pack(-fill => 'x');
	$langvar{$_} = '';
	$langframe->Entry(-textvariable => \$langvar{$_})->pack(-fill => 'x');
}

Tk::MainLoop();

