#!/usr/bin/perl -w -- 
# generated by wxGlade 0.4.1cvs on Fri Jan 26 18:24:52 2007
# To get wxPerl visit http://wxPerl.sourceforge.net/

use Wx 0.15 qw[:allclasses];
use strict;

package MainFrame;

use Wx qw[:everything];
use base qw(Wx::Frame);
use strict;

sub new {
	my( $self, $parent, $id, $title, $pos, $size, $style, $name ) = @_;
	$parent = undef              unless defined $parent;
	$id     = -1                 unless defined $id;
	$title  = ""                 unless defined $title;
	$pos    = wxDefaultPosition  unless defined $pos;
	$size   = wxDefaultSize      unless defined $size;
	$name   = ""                 unless defined $name;

# begin wxGlade: MainFrame::new

	$style = wxDEFAULT_FRAME_STYLE 
		unless defined $style;

	$self = $self->SUPER::new( $parent, $id, $title, $pos, $size, $style, $name );
	$self->{sizer_passwd_staticbox} = Wx::StaticBox->new($self, -1, "Password" );
	$self->{sizer_note_staticbox} = Wx::StaticBox->new($self, -1, "Note" );
	$self->{sizer_account_staticbox} = Wx::StaticBox->new($self, -1, "Account" );
	

	# Menu Bar

	$self->{menubar} = Wx::MenuBar->new();
	$self->SetMenuBar($self->{menubar});
	my $wxglade_tmp_menu;
	$wxglade_tmp_menu = Wx::Menu->new();
	$wxglade_tmp_menu->Append(wxID_OPEN, "&Open\tCtrl-O", "Select a file");
	$wxglade_tmp_menu->AppendSeparator();
	$wxglade_tmp_menu->Append(wxID_EXIT, "&Quit\tCtrl-Q", "Exit program");
	$self->{menubar}->Append($wxglade_tmp_menu, "&File");
	$wxglade_tmp_menu = Wx::Menu->new();
	$wxglade_tmp_menu->Append(Wx::NewId(), "All", "Display all categories", 1);
	$self->{menubar}->Append($wxglade_tmp_menu, "Categories");
	
# Menu Bar end

	$self->{statusbar} = $self->CreateStatusBar(1, wxST_SIZEGRIP);
	$self->{list_box_topic} = Wx::ListBox->new($self, -1, wxDefaultPosition, wxDefaultSize, [], wxLB_SINGLE|wxLB_ALWAYS_SB);
	$self->{button_fetch} = Wx::Button->new($self, -1, "Fetch");
	$self->{text_ctrl_account} = Wx::TextCtrl->new($self, -1, "", wxDefaultPosition, wxDefaultSize, wxTE_READONLY);
	$self->{text_ctrl_passwd} = Wx::TextCtrl->new($self, -1, "", wxDefaultPosition, wxDefaultSize, wxTE_READONLY);
	$self->{text_ctrl_note} = Wx::TextCtrl->new($self, -1, "", wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY);

	$self->__set_properties();
	$self->__do_layout();

	Wx::Event::EVT_MENU($self, wxID_OPEN, \&OnOpen);
	Wx::Event::EVT_MENU($self, wxID_EXIT, \&OnQuit);
	Wx::Event::EVT_LISTBOX_DCLICK($self, $self->{list_box_topic}->GetId, \&OnTopicActivate);
	Wx::Event::EVT_LISTBOX($self, $self->{list_box_topic}->GetId, \&OnTopicSelect);
	Wx::Event::EVT_BUTTON($self, $self->{button_fetch}->GetId, \&OnFetch);

# end wxGlade
	return $self;

}


sub __set_properties {
	my $self = shift;

# begin wxGlade: MainFrame::__set_properties

	$self->SetTitle("GNU KeyRing");
	$self->SetSize(Wx::Size->new(450, 300));
	$self->{statusbar}->SetStatusWidths(-1);
	
	my( @statusbar_fields ) = (
		""
	);

	if( @statusbar_fields ) {
		$self->{statusbar}->SetStatusText($statusbar_fields[$_], $_) 	
		for 0 .. $#statusbar_fields ;
	}
	$self->{list_box_topic}->SetSelection(0);
	$self->{button_fetch}->Enable(0);

# end wxGlade

	my $m = $self->{menubar}->FindMenuItem("Categories", "All");
	$self->{menubar}->Check($m, 1);
	$self->{menubar}->Enable($m, 0);
}

sub __do_layout {
	my $self = shift;

# begin wxGlade: MainFrame::__do_layout

	$self->{outer_sizer} = Wx::BoxSizer->new(wxHORIZONTAL);
	$self->{info_sizer} = Wx::BoxSizer->new(wxVERTICAL);
	$self->{sizer_note}= Wx::StaticBoxSizer->new($self->{sizer_note_staticbox}, wxHORIZONTAL);
	$self->{sizer_passwd}= Wx::StaticBoxSizer->new($self->{sizer_passwd_staticbox}, wxHORIZONTAL);
	$self->{sizer_account}= Wx::StaticBoxSizer->new($self->{sizer_account_staticbox}, wxHORIZONTAL);
	$self->{sizer_list_box} = Wx::BoxSizer->new(wxVERTICAL);
	$self->{sizer_list_box}->Add($self->{list_box_topic}, 1, wxEXPAND|wxFIXED_MINSIZE, 0);
	$self->{sizer_list_box}->Add(1, 3, 0, wxADJUST_MINSIZE, 0);
	$self->{sizer_list_box}->Add($self->{button_fetch}, 0, wxEXPAND|wxADJUST_MINSIZE, 0);
	$self->{outer_sizer}->Add($self->{sizer_list_box}, 1, wxLEFT|wxTOP|wxBOTTOM|wxEXPAND, 5);
	$self->{sizer_account}->Add($self->{text_ctrl_account}, 1, wxADJUST_MINSIZE, 0);
	$self->{info_sizer}->Add($self->{sizer_account}, 0, wxEXPAND, 0);
	$self->{sizer_passwd}->Add($self->{text_ctrl_passwd}, 1, wxEXPAND|wxADJUST_MINSIZE, 0);
	$self->{info_sizer}->Add($self->{sizer_passwd}, 0, wxEXPAND, 0);
	$self->{sizer_note}->Add($self->{text_ctrl_note}, 1, wxEXPAND|wxADJUST_MINSIZE, 0);
	$self->{info_sizer}->Add($self->{sizer_note}, 1, wxEXPAND, 0);
	$self->{outer_sizer}->Add($self->{info_sizer}, 1, wxALL|wxEXPAND, 5);
	$self->SetAutoLayout(1);
	$self->SetSizer($self->{outer_sizer});
	$self->Layout();

# end wxGlade
}

sub OnFetch {
	my ($self, $event) = @_;
# wxGlade: MainFrame::OnFetch <event_handler>

	my $topic = ($self->{list_box_topic}->GetSelections)[0];
	unless ( defined($topic) ) {
	    $self->{button_fetch}->Enable(0);
	    return;
	}
	$topic = $self->{_keyringnames}->[$topic];
	my $d_passwd = Wx::TextEntryDialog->new
	  ($self,
	   "Enter password for $topic",
	   "Enter KeyRing password",
	   "",
	   wxOK|wxCANCEL|wxTE_PASSWORD,
	   wxDefaultPosition);

	while ( 1 ) {
	    if ( !$self->{_keyringdecoder} ) {
		my $ret = $d_passwd->ShowModal;
		if ( $ret != wxID_OK ) {
		    $d_passwd->Destroy;
		    return;
		}
		$ret = $d_passwd->GetValue;
		$self->{_keyringdecoder} = $self->{_keyringdb}->getDecoder($ret);
	    }
	    if ( !$self->{_keyringdecoder} ) {
		my $md = Wx::MessageDialog->new
		  ($self, "Incorrect password",
		   "Password error",
		   wxOK|wxICON_ERROR,
		   wxDefaultPosition);
		$md->ShowModal;
		$md->Destroy;
		next;
	    }
	    $d_passwd->Destroy;

	    my $rec = $self->{_keyringdb}->getRecordByName($topic);
	    if ( !$rec ) {
		my $md = Wx::MessageDialog->new
		  ($self, "Topic \"$topic\" not found",
		   "Database error",
		   wxOK|wxICON_ERROR,
		   wxDefaultPosition);
		$md->ShowModal;
		$md->Destroy;
		next;
	    }

	    my ($name,$acc,$pass,$note) = $self->{_keyringdecoder}->decode($rec);
	    $self->{text_ctrl_account}->SetValue($acc);
	    $self->{text_ctrl_passwd}->SetValue($pass);
	    $note =~ s/\n+$//;
	    $self->{text_ctrl_note}->SetValue($note);
	    return;
	}
# end wxGlade
}



sub OnQuit {
	my ($self, $event) = @_;
# wxGlade: MainFrame::OnQuit <event_handler>

	$self->Destroy;

# end wxGlade
}


sub OnTopicSelect {
	my ($self, $event) = @_;
# wxGlade: MainFrame::OnTopicSelect <event_handler>

	$self->{button_fetch}->Enable(1);
	$self->{text_ctrl_account}->SetValue("");
	$self->{text_ctrl_passwd}->SetValue("");
	$self->{text_ctrl_note}->SetValue("");

# end wxGlade
}


sub OnTopicActivate {
	my ($self, $event) = @_;
# wxGlade: MainFrame::OnTopicActivate <event_handler>

	$self->OnFetch($event);

# end wxGlade
}

sub LoadKeyRing {
    my ($self, $file) = @_;
    eval {
	$self->{_keyringdb} = ::loadKeyRing($file);
    };
    if ( $@ ) {
	my $msg = $@;
	$msg =~ s/\n.*//;
	my $md = Wx::MessageDialog->new
	  ($self, $msg,
	   "Database error",
	   wxOK|wxICON_ERROR,
	   wxDefaultPosition);
	$md->ShowModal;
	$md->Destroy;
	return;
    }
    $self->{_keyringfile} = $file;
    undef($self->{_keyringdecoder});
    $self->{_keyringnames} = [sort { lc($a) cmp lc($b) } @{$self->{_keyringdb}->getNames}];
    $self->{list_box_topic}->Set($self->{_keyringnames});
    $self->{statusbar}->SetStatusText("File: $file ".
				      ($self->{_keyringdb}->getRecords)." entries.",
				      0);
}

sub OnOpen {
	my ($self, $event) = @_;
# wxGlade: MainFrame::OnOpen <event_handler>

	my $fd = Wx::FileDialog->new
	  ($self,
	   "Choose KeyRing",
	   "", "",
	   "*.pdb",
	   0|wxFD_FILE_MUST_EXIST,
	   wxDefaultPosition);
	my $ret = $fd->ShowModal;
	if ( $ret == wxID_OK ) {
	    $self->LoadKeyRing($fd->GetPath);
	}
	$fd->Destroy;
# end wxGlade
}

# end of class MainFrame

1;

package main;

use Palm::KeyRing;

sub loadKeyRing {
    my $file = shift;
    Palm::KeyRing->new($file);
}

unless ( caller )  {
    my $keyringfile;
    if ( @ARGV && @ARGV != 1 ) {
	die("Usage: $0 [ KeyRing ]\n");
    }
    $keyringfile = shift if @ARGV;
    no warnings 'redefine';
    local *Wx::App::OnInit = sub{1};
    use warnings 'redefine';
    my $app = Wx::App->new();
    Wx::InitAllImageHandlers();
    my $frame = MainFrame->new();
    $app->SetTopWindow($frame);
    $frame->Show(1);
    $frame->LoadKeyRing($keyringfile) if $keyringfile;
    $app->MainLoop();
}
