#!/usr/local/bin/perl -w

eval 'exec /usr/local/bin/perl -w -S $0 ${1+"$@"}'
    if 0; # not running under some shell
# -*- perl -*-

#
# $Id: tkxmlview,v 1.7 2001/04/29 09:11:19 eserte Exp $
# Author: Slaven Rezic
#
# Copyright (C) 2000 Slaven Rezic. All rights reserved.
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
#
# Mail: eserte@cs.tu-berlin.de
# WWW:  http://user.cs.tu-berlin.de/~eserte/
#

use Tk;
use Tk::XMLViewer;
use Getopt::Long;

my $indent;
my $mainbg;

$top = new MainWindow;

GetOptions("indent=i" => \$indent,
	   "mainbg=s" => \$mainbg,
	  );

my $file = shift;
$xmlviewer = $top->Scrolled("XMLViewer", -scrollbars => "osw"
			   )->pack(-expand => 1, -fill => "both");
$xmlviewer->configure(-background => $mainbg) if defined $mainbg;
$xmlviewer->SetIndent($indent) if defined $indent;
$xmlviewer->XMLMenu;
if ($xmlviewer->can("menu")) {
    my $textmenu = $xmlviewer->menu;
    if ($textmenu) {
	my $filemenu = $textmenu->entrycget(0, -menu);
	$filemenu->command(-label => 'Open',
			   -command => sub { openxml(); viewxml() });
	$filemenu->command(-label => 'Re-Open',
			   -command => sub {
			       if ($xmlviewer->SourceType eq 'file'){
				   viewxml();
			       }
			   });

	my $editmenu = $textmenu->entrycget(1, -menu);
	$editmenu->separator;
	$editmenu->command
	    (-label => 'Edit file...',
	     -command => sub {
		 require Tk::TextEdit;
		 package Tk::TextEdit;
		 sub Save {
		     my $self = shift;
		     my $r = $self->SUPER::Save(@_);
		     main::viewxml();
		     $r;
		 }

		 package main;
		 my $top_editor = $top->Toplevel;
		 $top_editor->title("Edit $file");
		 my $editor = $top_editor->Scrolled
		     ('TextEdit',
		      -scrollbars => "osoe",
		      -wrap => "none",
		     )->pack;
		 # XXX workaround bug in 3.004
		 $editor->SetGUICallbacks([]);
		 $editor->FileName($file);
		 $editor->Load;
	     });

	my $helpmenu = $textmenu->cascade(-tearoff => 0,
					  -label => 'Help');
	$helpmenu->command(-label => 'About',
			   -command => sub {
			       $top->messageBox
				   (-title   => 'About tkxmlview',
				    -message => "An XML viewer for Perl/Tk\n" .
				                "(c) 2000 by Slaven Rezic",
				    -type    => 'OK');
			   });
	$helpmenu->command(-label => 'Tk::XMLViewer POD',
			   -command => sub {
			       require Tk::Pod;
			       $top->Pod(-file => 'Tk/XMLViewer',
					 -title => 'Tk::XMLViewer POD');
			   });
    }
}
if (!defined $file) {
    openxml();
}
viewxml();
MainLoop;

sub openxml {
    my $dir;
    if(defined $file && (index($file, "/") >= 0) ) {
	$dir = substr($file, 0, rindex($file, "/"));
    }
    $file = $top->getOpenFile(-filetypes => [['XML Files', '*.xml'],
					     ['All Files', '*']],
			      (defined $dir ? (-initialdir => $dir) : ()),
			     );
}

sub viewxml {
    if (defined $file) {
	my $fname;
	if(length $file > 40) {
	    if(rindex($file, "/") >= 0 ) {
		$fname = substr($file, rindex($file, "/")+1);
	    } else {
		$fname = $file;
	    }
	    if (length $fname > 40) {
		$fname = substr($fname, -38);
	    }
	    $fname = "... " .$fname;
	} else {
	    $fname = $file;
	}
	$top->title("XMLView: ".$fname);
	$xmlviewer->delete("1.0", "end");
	$xmlviewer->insertXML(-file => $file);
    }
}

__END__
