#!/usr/bin/perl # $RedRiver: palmkeyring-tk,v 1.1 2006/01/31 23:03:39 andrew Exp $ ######################################################################## # palmkeyring-tk *** A GUI for 'Keyring for PalmOS' written in perl # # 2006.01.31 #*#*# andrew fresh ######################################################################## use strict; use warnings; use Tk 8.0; use Tk::widgets qw/ Dialog BrowseEntry ROText ProgressBar /; use lib 'lib'; use Palm::Keyring; my $File = "Keys-Gtkr.PDB"; my $Keyring = _do_open($File); my $NAME = 'Palm Keyring'; my $lock_when = 0; my $unlocked = time; # Change this to 0 when I get more stuff filled out my $lock_timeout = 30; my $MW = MainWindow->new(); $MW->optionAdd('*BorderWidth' => 1); my $pane = $MW->Panedwindow( Name => 'main', -showhandle => 1, -orient => 'horizontal' )->pack(-fill => 'both', -expand => 1); my $lists_frame = $pane->Frame(Name => 'lists') ->pack(-side=>'top',-anchor=>'nw',-fill=>'x'); my $right_frame = $pane->Frame(Name => 'right',-relief=>'sunken') ->pack(-side=>'top',-anchor=>'ne',-fill=>'both',-expand=>1); my $account_frame = $right_frame->Frame(Name => 'account') ->pack(-side=>'top',-anchor=>'nw',-fill=>'both',-expand=>1); my $lock_frame = $right_frame->Frame(Name => 'lock',-relief=>'raised') ->pack(-side=>'bottom',-fill=>'x'); $pane->add('.main.lists'); $pane->add('.main.right'); # Lists my $category_list = $lists_frame->BrowseEntry()->pack(-side=>'top',-fill=>'x'); $category_list->insert(-1, 'All'); my $accounts_list = $lists_frame->Scrolled('Listbox', -scrollbars => 'e') ->pack(-side=>'top',-fill=>'both',-expand=>1); # Account my %account_entry; foreach my $label (qw/Category Name Account Password/) { $account_entry{$label} = $account_frame->LabEntry(-state=>'readonly', -labelWidth => 10, -labelPack => [-side => 'left', -anchor => 'w'], -label=>$label . ': ', -text => 'my' . $label) ->pack(-side=>'top',-anchor=>'nw',-fill=>'x'); } $account_entry{'Details'} = $account_frame->ROText(-wrap => 'word',-height=>5,-width=>30) ->pack(-side=>'top',-anchor=>'nw',-fill=>'both',-expand=>1); $account_entry{'Details'}->insert('1.0',"This is a test\nThis is only a test"); # Lock my $lock_button = $lock_frame->Button(-text => 'Lock', -command => \&Lock) ->pack(-side=>'left'); my $lock_progress = $lock_frame->ProgressBar( -variable=>\$lock_when, -blocks => $lock_timeout, -from => $lock_timeout, -to => 0, -gap => 0, )->pack(-side=>'right',-fill=>'x',-expand=>1,-padx=>5); $lock_progress->repeat(500,\&Lock_Timeout); my $menubar = build_menubar($MW); _populate_lists($Keyring, $category_list, $accounts_list); my $VERSION = 0.01; MainLoop; sub build_menubar { # Create the menubar and File and Quit menubuttons. Note # that the cascade's menu widget is automatically created. my $menubar = $MW->Menu; $MW->configure(-menu => $menubar); my $file = $menubar->cascade(-label => '~File', -tearoff => 0); my $help = $menubar->cascade(-label => '~Help', -tearoff => 0); # Create the menuitems for each menu. First, the File menu item. $file->command(-label => "Open", -command => \&Open); $file->command(-label => "Close", -command => \&Close); $file->command(-label => "Quit", -command => \&exit); # Finally, the Help menuitems. $help->command(-label => 'Version'); $help->separator; $help->command(-label => 'About'); my $ver_dialog = $MW->Dialog(-title => $NAME . ' Version', -text => "$NAME\n\nVersion $VERSION", -buttons => ['OK'], -bitmap => 'info'); my $about_dialog = $MW->Dialog(-title => 'About ' . $NAME, -text => 'About ' . $NAME . "\n" . '© Copyright 2006 Andrew Fresh ', -buttons => ['OK']); my $menu = $help->cget('-menu'); $menu->entryconfigure('Version', -command => [$ver_dialog => 'Show']); $menu->entryconfigure('About', -command => [$about_dialog => 'Show']); $menubar; # return the menubar } sub Lock { $unlocked = time; } sub Lock_Timeout { #return unless $unlocked; my $diff = time - $unlocked; if ($diff > $lock_timeout) { print "Timed out!"; Tk::exit(); } else { $lock_when = $diff; } } sub Open { } sub Close { } sub _do_open { my $file = shift; my $pdb = Palm::Keyring->new; $pdb->Load($file) || die "Couldn't load '$file'"; return $pdb; } sub _do_close { } sub _do_lock { } sub _populate_lists { my $pdb = shift; my $cat = shift; my $acct = shift; foreach my $category (@{ $pdb->{'appinfo'}->{'categories'} }) { next unless $category->{'name'}; $cat->insert( $category->{'id'}, $category->{'name'}); } foreach my $account (@{ $pdb->{'records'} }) { next unless $account->{'plaintext'}->{'name'}; $acct->insert('end', $account->{'plaintext'}->{'name'}); } }