#!/usr/bin/perl
# Переименование файлов карт для qpegps

use File::Spec::Functions;
use File::Basename;
use File::Path;
use Cwd;
use utf8;
use Encode;

use Tk;
use Tk::MainWindow;
use Tk::DialogBox;

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

sub convertmap ($$$) # Преобразовать
{
    my ($path, $oldext, $newext) = @_;
    my @namelist; # Список имен обрабатываемых файлов
    my ($proj, $fname, $res, $xs, $ys, $lon1, $lat1, $x1, $y1, $lon2, $lat2, $x2, $y2, $tilt, $newtxt);

    if ( -f catfile($path, 'maps.txt') ) {
	open(TXT, catfile($path, 'maps.txt') );
	while (<TXT>) {
	    chomp;
	    s/^\s+//;
	    s/\s/ /g;
	    if ($_ and not m/^\#/) {
		($proj, $fname, $res, $xs, $ys, $lon1, $lat1, $x1, $y1, $lon2, $lat2, $x2, $y2, $tilt) = split(' ', $_);
		$nfname = $fname;
		$nfname =~ s/$oldext$/$newext/i;
		$fn = catfile($path, $fname);
		$nn = catfile($path, $nfname);
		print "$nn\n";
		`convert $fn $nn`;
		`rm -f $fn`;
		$newtxt .= "$proj $nfname $res $xs $ys $lon1 $lat1 $x1 $y1 $lon2 $lat2 $x2 $y2 $tilt\n";
	    } else {$newtxt .= "$_\n"};
	};
	close(TXT);
	open(TXT, ">".catfile($path, 'maps.txt') );
	print TXT $newtxt;
	close(TXT);

	
#	filelist ($path, \@namelist);
#	foreach $file (@namelist) {
#	};
    } else { print("В указанном каталоге нет файла maps.txt.\n") };
};


sub filelist ($$) # Поиск графических файлов карты. 
{ 
    my ($basepath, $namelist) = @_;
    my $name;
    my @lst;
    local (*ROOT);

    opendir ROOT, $basepath or die "Unable to enter directory \"$basepath\""; # Чтение каталога
    @lst = readdir ROOT;
    closedir ROOT;

    foreach $name (@lst) # Просмотр вложенных каталогов и файлов
    {
	if ( no_upwards($name) )
	{
	    $name = catfile ($basepath, $name);
    	    if ( -f $name and $name =~ m/.*(png|jpg|gif)$/i ) # Отбираются файлы с расширением .svg
	    {
		push (@{$namelist}, $name);  
	    }; 
	# Рекурсия здесь не нужна
	#    if ( -d $name ) # Если каталог, то добавить в список рекурсии
	#    {
	#	processdir($name, $namelist, $ext);
	#    }	
	}
    }
} 


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

sub showmessage
{
    my ($message) = @_;
    
    $w1->deiconify;
    $hlpdialog = $w1->DialogBox;
    $hlpdialog->title("qpeGPS map renamer");
    $hlpdialog->Label(-text => $message)->pack( -anchor => 'n', -padx => 10, -pady => 2);
    $hlpdialog->Show();
}

sub allowstart
{
    if ( -f catfile($path, 'maps.txt') ) {
	$gobut->configure( -state => 'active');  
    } else {
	$gobut->configure( -state => 'disabled');
    };
}

# Начало
($path, $oldext, $newext) = @ARGV;
if (not $path) {
    $path = cwd;
    $path = decode("utf8", $path);
    $path = catdir($path);

    $w1 = MainWindow->new;
    $w1->title("qpeGPS map renamer");
    $w1->minsize(390,300);
    $w1->maxsize(390,300);

    $mainlabel = $w1->Label(-wraplength => 360, -justify => 'left', -text => "Эта программа предназначена для изменения формата графических файлов карт в qpegps. Укажите старое и новое расширение имени файла и путь к каталогу карты.")->pack( -anchor => 'w', -padx => 20, -pady => 10);

    $inputlabel = $w1->Label(-wraplength => 360, -justify => 'left', -text => "Путь к обрабатываемым файлам:")->pack( -anchor => 'w', -padx => 20, -pady => 2);
    $pathbox = $w1->Entry( -textvariable => \$path );
    $pathbox->pack( -side => 'top', -fill => 'x', -padx => 20, -pady => 2);
    $pathbox->focus();
    $pathbox->bind("<KeyRelease>", sub {allowstart});

    $oldextlabel = $w1->Label(-wraplength => 360, -justify => 'left', -text => "Старый формат:")->pack( -anchor => 'w', -padx => 20, -pady => 2);
    $oldextbox = $w1->Entry( -textvariable => \$oldext );
    $oldextbox->pack( -side => 'top', -fill => 'x', -padx => 20, -pady => 2);
    $oldextbox->focus();
    $oldextbox->bind("<KeyRelease>", sub {allowstart});

    $newextlabel = $w1->Label(-wraplength => 360, -justify => 'left', -text => "Новый формат:")->pack( -anchor => 'w', -padx => 20, -pady => 2);
    $newextbox = $w1->Entry( -textvariable => \$newext );
    $newextbox->pack( -side => 'top', -fill => 'x', -padx => 20, -pady => 2);
    $newextbox->focus();
    $newextbox->bind("<KeyRelease>", sub {allowstart});

    $gobut = $w1->Button(-width => 10, -text => "Преобразовать", -command => sub {$w1->iconify; convertmap($path, $oldext, $newext); showmessage("Преобразование закончено.");	exit;})->pack( -side => 'right', -padx => 20 , -pady => 5);
    allowstart;

    MainLoop;
} else {
    if ( -f catfile($path, 'maps.txt') and $oldext and $newext) {
	convertmap($path, $oldext, $newext);
	print "Finished\n";
	exit;
    } else { print "Usage: path new_extix [old_extix]\n"};
};
