#! perl package main; use strict; our $cfg; our $dbh; package EB::Wx::Shell::MainFrame; use EekBoek; use base qw(Wx::Frame); use base qw(EB::Wx::Shell::Window); use strict; use utf8; use Encode; use File::Spec; use File::Basename; # begin wxGlade: ::dependencies use Wx::Locale gettext => '_T'; # end wxGlade use EB; use EB::Wx::Shell::HtmlViewer; use EB::Wx::Shell::EditDialog; use EB::Wx::Shell::PreferencesDialog; use Wx qw[ wxADJUST_MINSIZE wxALL wxBITMAP_TYPE_ANY wxBLUE wxDEFAULT_FRAME_STYLE wxDefaultPosition wxDefaultSize wxEXPAND wxFD_FILE_MUST_EXIST wxGREEN wxHORIZONTAL wxHOURGLASS_CURSOR wxHSCROLL wxICON_ERROR wxICON_INFORMATION wxICON_WARNING wxID_ABOUT wxID_APPLY wxID_CLEAR wxID_EXIT wxID_HELP wxID_OK wxID_OPEN wxID_PREFERENCES wxLEFT wxMODERN wxNORMAL wxNullCursor wxOK wxRED wxRIGHT wxST_SIZEGRIP wxSYS_DEFAULT_GUI_FONT wxTE_MULTILINE wxTE_PROCESS_ENTER wxTE_PROCESS_TAB wxTE_READONLY wxVERTICAL ]; my $prefctl; ################ Locale ################ # Variable expansion. See GNU gettext for details. sub __expand($%) { my ($t, %args) = @_; my $re = join('|', map { quotemeta($_) } keys(%args)); #### WHOAH!!!!! # $1 seems to be stuck to the EekBoek initial message. #### WHOAH!!!!! $t =~ s/(\{)($re)\}/defined($args{$2}) ? $args{$2} : "{$2}"/ge; $t; } # Translation w/ variables. sub __x($@) { my ($t, %vars) = @_; __expand(_T($t), %vars); } # Translation w/ singular/plural handling. sub __n($$$) { my ($sing, $plur, $n) = @_; _T($n == 1 ? $sing : $plur); } # Translation w/ singular/plural handling and variables. sub __nx($$$@) { my ($sing, $plur, $n, %vars) = @_; __expand(__n($sing, $plur, $n), %vars); } # Make __xn a synonym for __nx. *__xn = \&__nx; ################ Locale ################ 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; use constant MENU_INPUTEDIT => Wx::NewId(); use constant MENU_INPUTEXEC => Wx::NewId(); use constant MENU_REP_TRIAL => Wx::NewId(); use constant MENU_REP_BAL_ACT => Wx::NewId(); use constant MENU_REP_BAL_MGP => Wx::NewId(); use constant MENU_REP_BAL_GRP => Wx::NewId(); use constant MENU_REP_BAL_GAC => Wx::NewId(); use constant MENU_REP_RES_ACT => Wx::NewId(); use constant MENU_REP_RES_MGP => Wx::NewId(); use constant MENU_REP_RES_GRP => Wx::NewId(); use constant MENU_REP_RES_GAC => Wx::NewId(); use constant MENU_REP_JNL => Wx::NewId(); use constant MENU_REP_UN => Wx::NewId(); use constant MENU_REP_AP => Wx::NewId(); use constant MENU_REP_AR => Wx::NewId(); use constant MENU_REP_VAT => Wx::NewId(); use constant MENU_HELP_SUPPORT => Wx::NewId(); # ###WARNING: Re-generating will loose # $self->__set_menubar(); # insert before $self->{s_input_staticbox} = ... # begin wxGlade: EB::Wx::Shell::MainFrame::new $style = wxDEFAULT_FRAME_STYLE unless defined $style; $self = $self->SUPER::new( $parent, $id, $title, $pos, $size, $style, $name ); $self->{p_dummy} = Wx::Panel->new($self, -1, wxDefaultPosition, wxDefaultSize, ); $self->__set_menubar(); $self->{s_input_staticbox} = Wx::StaticBox->new($self->{p_dummy}, -1, _T("Invoer") ); $self->{statusbar} = $self->CreateStatusBar(1, wxST_SIZEGRIP); $self->{t_output} = Wx::TextCtrl->new($self->{p_dummy}, -1, "", wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY|wxHSCROLL); $self->{b_edit} = Wx::BitmapButton->new($self->{p_dummy}, -1, (Wx::Bitmap->new("edit.png", wxBITMAP_TYPE_ANY))); $self->{t_input} = Wx::TextCtrl->new($self->{p_dummy}, -1, "", wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER|wxTE_PROCESS_TAB); $self->{b_send} = Wx::BitmapButton->new($self->{p_dummy}, -1, (Wx::Bitmap->new("button_ok.png", wxBITMAP_TYPE_ANY))); $self->__set_properties(); $self->__do_layout(); Wx::Event::EVT_BUTTON($self, $self->{b_edit}->GetId, \&OnEdit); Wx::Event::EVT_TEXT_ENTER($self, $self->{t_input}->GetId, \&OnTextEnter); Wx::Event::EVT_BUTTON($self, $self->{b_send}->GetId, \&OnSend); # end wxGlade Wx::Event::EVT_MENU($self, wxID_OPEN, \&OnOpen); Wx::Event::EVT_MENU($self, wxID_PREFERENCES, \&OnPrefs); Wx::Event::EVT_MENU($self, wxID_EXIT, \&OnQuit); Wx::Event::EVT_MENU($self, wxID_CLEAR, \&OnClear); Wx::Event::EVT_MENU($self, MENU_INPUTEDIT, \&OnEdit); Wx::Event::EVT_MENU($self, MENU_INPUTEXEC, \&OnSend); Wx::Event::EVT_MENU($self, MENU_REP_TRIAL, \&OnTrial); my $i = -1; for ( MENU_REP_BAL_ACT, MENU_REP_BAL_MGP, MENU_REP_BAL_GRP, MENU_REP_BAL_GAC,) { my $sub = $i++; Wx::Event::EVT_MENU($self, $_, sub { push(@_, $sub); &OnMenuBal }); } $i = -1; for ( MENU_REP_RES_ACT, MENU_REP_RES_MGP, MENU_REP_RES_GRP, MENU_REP_RES_GAC,) { my $sub = $i++; Wx::Event::EVT_MENU($self, $_, sub { push(@_, $sub); &OnMenuRes }); } Wx::Event::EVT_MENU($self, MENU_REP_JNL, \&OnJournal); Wx::Event::EVT_MENU($self, MENU_REP_UN, \&OnMenuUns); Wx::Event::EVT_MENU($self, MENU_REP_AP, \&OnMenuAP); Wx::Event::EVT_MENU($self, MENU_REP_AR, \&OnMenuAR); Wx::Event::EVT_MENU($self, MENU_REP_VAT, \&OnMenuVAT); Wx::Event::EVT_MENU($self, wxID_HELP, \&OnHelp); Wx::Event::EVT_MENU($self, MENU_HELP_SUPPORT, \&OnSupport); Wx::Event::EVT_MENU($self, wxID_ABOUT, \&OnAbout); #### End of MenuBar Wx::Event::EVT_CLOSE($self, \&OnQuit); Wx::Event::EVT_CHAR($self->{t_input}, sub { $self->OnChar(@_) }); # Wx::Event::EVT_IDLE($self, \&OnIdle); $prefctl ||= { repwin => 0, errorpopup => 1, warnpopup => 1, infopopup => 0, histlines => 200, }; $self->SetSize(801, 551); $self->sizepos_restore("main"); return $self; } sub __set_menubar { my $self = shift; # Unfortunately, due to an error in wxGlade sub-menu # generation we need to do it ourselves. All... $self->{menubar} = Wx::MenuBar->new(); my $wxglade_tmp_menu; $wxglade_tmp_menu = Wx::Menu->new(); $wxglade_tmp_menu->Append(wxID_OPEN, _T("&Open\tCtrl-O"), ""); $wxglade_tmp_menu->AppendSeparator(); $wxglade_tmp_menu->Append(wxID_PREFERENCES, _T("Voorkeuren..."), ""); $wxglade_tmp_menu->AppendSeparator(); $wxglade_tmp_menu->Append(wxID_EXIT, _T("Afsluiten\tCtrl-Q"), ""); $self->{menubar}->Append($wxglade_tmp_menu, _T("&Bestand")); $wxglade_tmp_menu = Wx::Menu->new(); $wxglade_tmp_menu->Append(MENU_INPUTEDIT, _T("&Edit invoerregel\tCtrl+Enter"), ""); $wxglade_tmp_menu->Append(MENU_INPUTEXEC, _T("&Uitvoeren invoerregel\tEnter"), ""); $wxglade_tmp_menu->AppendSeparator(); $wxglade_tmp_menu->Append(wxID_CLEAR, _T("Uitvoer schoonmaken"), ""); $self->{menubar}->Append($wxglade_tmp_menu, _T("B&ewerken")); $self->{Reports} = Wx::Menu->new(); $self->{Reports}->Append(MENU_REP_TRIAL, _T("Proef- en Saldibalans"), ""); $self->{Reports_bal} = Wx::Menu->new(); $self->{Reports_bal}->Append(MENU_REP_BAL_ACT, _T("Op grootboekrekening"), ""); $self->{Reports_bal}->AppendSeparator(); $self->{Reports_bal}->Append(MENU_REP_BAL_MGP, _T("Op hoofdverdichting"), ""); $self->{Reports_bal}->Append(MENU_REP_BAL_GRP, _T("Op verdichting"), ""); $self->{Reports_bal}->Append(MENU_REP_BAL_GAC, _T("Gedetailleerd"), ""); $self->{Reports}->Append(Wx::NewId(), _T("Balans"), $self->{Reports_bal}, ""); $self->{Reports_res} = Wx::Menu->new(); $self->{Reports_res}->Append(MENU_REP_RES_ACT, _T("Op grootboekrekening"), ""); $self->{Reports_res}->AppendSeparator(); $self->{Reports_res}->Append(MENU_REP_RES_MGP, _T("Op hoofdverdichting"), ""); $self->{Reports_res}->Append(MENU_REP_RES_GRP, _T("Op verdichting"), ""); $self->{Reports_res}->Append(MENU_REP_RES_GAC, _T("Gedetailleerd"), ""); $self->{Reports}->Append(Wx::NewId(), _T("Verlies/Winst"), $self->{Reports_res}, ""); $self->{Reports}->AppendSeparator(); $self->{Reports}->Append(MENU_REP_JNL, _T("Journaal"), ""); $self->{Reports}->AppendSeparator(); $self->{Reports}->Append(MENU_REP_UN, _T("Openstaande posten"), ""); $self->{Reports}->AppendSeparator(); $self->{Reports}->Append(MENU_REP_AP, _T("Crediteuren"), ""); $self->{Reports}->Append(MENU_REP_AR, _T("Debiteuren"), ""); $self->{Reports}->AppendSeparator(); $self->{Reports}->Append(MENU_REP_VAT, _T("BTW Aangifte"), ""); $self->{menubar}->Append($self->{Reports}, _T("&Rapporten")); $wxglade_tmp_menu = Wx::Menu->new(); $wxglade_tmp_menu->Append(wxID_HELP, _T("&Hulp..."), ""); $wxglade_tmp_menu->AppendSeparator(); $wxglade_tmp_menu->Append(MENU_HELP_SUPPORT, _T("Ondersteuning..."), ""); $wxglade_tmp_menu->AppendSeparator(); $wxglade_tmp_menu->Append(wxID_ABOUT, _T("Over..."), ""); $self->{menubar}->Append($wxglade_tmp_menu, _T("&Hulp")); $self->SetMenuBar($self->{menubar}); } sub __set_properties { my $self = shift; # begin wxGlade: EB::Wx::Shell::MainFrame::__set_properties $self->SetTitle(_T("EekBoek")); $self->SetSize(Wx::Size->new(800, 550)); $self->{statusbar}->SetStatusWidths(-1); my( @statusbar_fields ) = ( "" ); if( @statusbar_fields ) { $self->{statusbar}->SetStatusText($statusbar_fields[$_], $_) for 0 .. $#statusbar_fields ; } $self->{b_edit}->SetSize($self->{b_edit}->GetBestSize()); $self->{t_input}->SetFocus(); $self->{b_send}->SetSize($self->{b_send}->GetBestSize()); # end wxGlade my $f = Wx::SystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); $self->{t_output}->SetFont(Wx::Font->new($f->GetPointSize, wxMODERN, wxNORMAL, wxNORMAL, 0, "")); } sub __do_layout { my $self = shift; # begin wxGlade: EB::Wx::Shell::MainFrame::__do_layout $self->{sz_dummy} = Wx::BoxSizer->new(wxHORIZONTAL); $self->{s_main} = Wx::BoxSizer->new(wxVERTICAL); $self->{s_layout} = Wx::BoxSizer->new(wxVERTICAL); $self->{s_input}= Wx::StaticBoxSizer->new($self->{s_input_staticbox}, wxHORIZONTAL); $self->{s_output} = Wx::BoxSizer->new(wxHORIZONTAL); $self->{s_output}->Add($self->{t_output}, 1, wxEXPAND|wxADJUST_MINSIZE, 0); $self->{s_layout}->Add($self->{s_output}, 1, wxEXPAND, 0); $self->{s_input}->Add($self->{b_edit}, 0, wxRIGHT|wxADJUST_MINSIZE, 5); $self->{s_input}->Add($self->{t_input}, 1, wxEXPAND|wxADJUST_MINSIZE, 0); $self->{s_input}->Add($self->{b_send}, 0, wxLEFT|wxADJUST_MINSIZE, 5); $self->{s_layout}->Add($self->{s_input}, 0, wxEXPAND, 0); $self->{s_main}->Add($self->{s_layout}, 1, wxALL|wxEXPAND, 5); $self->{p_dummy}->SetSizer($self->{s_main}); $self->{sz_dummy}->Add($self->{p_dummy}, 1, wxEXPAND, 0); $self->SetSizer($self->{sz_dummy}); $self->Layout(); $self->SetSize(Wx::Size->new(800, 550)); # end wxGlade } sub RunCommand { my ($self, $cmd) = @_; unless ( defined $self->{_shell} ) { unless ( $self->{_ebcfg} && -s $self->{_ebcfg} ) { my $md = Wx::MessageDialog->new ($self, _T("Selecteer eerst een geldige eekboek.conf"), _T("Geen configuratie"), wxOK|wxICON_INFORMATION, wxDefaultPosition); $md->ShowModal; $md->Destroy; $self->OnOpen; return; } my $cfg = EB->app_init( { app => $EekBoek::PACKAGE, config => $self->{_ebcfg} } ); $self->{statusbar}->SetStatusText($EB::imsg, 0); $cfg->connect_db; require EB::Shell; $self->{_shell} = EB::Shell->new; } $cmd = "database" unless defined $cmd; $self->{t_output}->AppendText("eb> "); $self->ShowText($cmd, wxBLUE); $self->_cmd($cmd); } use Text::ParseWords qw(shellwords); sub _cmd { my ( $self, $cmd ) = @_; my ( @cmd ) = shellwords($cmd); # If there's a quoting mistake, parseline returns nothing. if ( $cmd =~ /\S/ && $cmd[0] !~ /\S/ ) { $self->process_stderr("?"._T("Fout in de invoerregel. Controleer de \" en ' tekens.")."\n"); return -1; } my ( $cmd, @args ) = @cmd; if (! length($cmd)) { return -1; } if ( $cmd =~ /^(balans|result|proefensaldibalans|journaal|openstaand|(?:deb|cred)iteuren|grootboek|btwaangifte)(?:\s|$)/ ) { unshift( @args, "--gen-wxhtml" ); } if ( $cmd =~ /^\s*(help|\?)/i ) { $self->OnHelp; return 1; } if ( $cmd =~ /^\s*(exit|quit|logout)/i ) { $self->OnQuit; return 1; } my $meth = "do_".lc($cmd); unless ( $self->{_shell}->can($meth) ) { $self->process_stderr("?"._T("Onbekende opdracht. \"help\" geeft een lijst van mogelijke opdrachten.")."\n"); return -1; } my ( $out, $t, @msg ); eval { # Intercept warn and die. local $SIG{__WARN__} = sub { push( @msg, join("\n", @_) ); }; local $SIG{__DIE__} = sub { push( @msg, "?".join("\n", @_) ); }; # Intercept STDOUT. open( my $oldout, ">&STDOUT" ); close( STDOUT ); open( STDOUT, '>', \$out ) or die("STDOUT capture fail"); # Call API command. $t = $self->{_shell}->$meth(@args); # Restore STDOUT. close(STDOUT); open ( STDOUT, ">&", $oldout ); }; if ($@) { my $err = $@; chomp $err; $self->process_stderr("?$err\n"); } else { # Process output. $out .= "\n" unless !$out || $out =~ /\n$/; if ( $t =~ /^[%!?]/ ) { $self->process_stderr($t); } else { $out .= $t; } $self->process_stderr($_) for @msg; $self->process_stdout($_) for split(/\n/, $out); } return 1; } sub ShowText { my ($self, $text, $colour) = @_; if ( $colour ) { my $t = Wx::TextAttr->new; $t->SetTextColour($colour); my $x0 = $self->{t_output}->GetLastPosition; $self->{t_output}->AppendText($text."\n"); $self->{t_output}->SetStyle($x0, $self->{t_output}->GetLastPosition, $t); } else { $self->{t_output}->AppendText($text."\n"); } } my $capturing; sub process_stdout { my ($self, $text) = @_; my $out = decode("utf-8", $text); # warn("app: $out\n"); if ( $capturing || $out eq "" ) { $capturing .= $out . "\n"; if ( $out eq "" ) { $self->SetCursor(wxHOURGLASS_CURSOR); } elsif ( $out eq "" ) { $self->SetCursor(wxNullCursor); my ($title) = ($capturing =~ m{(.+?)}); #warn("captured $title: ", length($capturing), " characters\n"); my $panel = $self->{prefs_repwin} ? "d_htmlpanel" : "d_htmlpanel_$title"; $self->{$panel} ||= EB::Wx::Shell::HtmlViewer->new ($self, -1, $title); $self->{$panel}->Show(0); $self->{$panel}->html->SetPage($capturing); $self->{$panel}->htmltext = $capturing; $self->{$panel}->SetTitle($title); $self->{$panel}->Show(1); $capturing = ""; } } else { $self->{t_output}->AppendText($out."\n"); } } sub process_stderr { my ($self, $text) = @_; my $out = decode("utf-8", $text); # warn("err: $out\n"); $self->ProcessMessages($out); } sub ProcessMessages { my ($self, $err) = @_; return unless $err; my @err = split(/\n+/, $err); while ( @err ) { $err = shift(@err); my @i; if ( $err =~ /^\?+(.*)/ ) { $self->ShowText($err, wxRED); next unless $self->{prefs_errorpopup}; @i = ($1, _T("Fout"), wxOK|wxICON_ERROR); } elsif ( $err =~ /^\!+(.*)/ ) { $self->ShowText($err, Wx::Colour->new("magenta")); next unless $self->{prefs_warnpopup}; @i = ($1, _T("Waarschuwing"), wxOK|wxICON_WARNING); } else { $self->ShowText($err, wxGREEN); next unless $self->{prefs_infopopup}; @i = ($err, _T("Mededeling"), wxOK|wxICON_INFORMATION); } my $md = Wx::MessageDialog->new($self, @i, wxDefaultPosition); $md->ShowModal; $md->Destroy; } } sub OnTextEnter { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnTextEnter my $cmd = $self->{t_input}->GetValue; return unless $cmd; push(@{$self->{_cmd}}, $cmd) unless $cmd eq $self->{_cmd}->[-1]; $self->{_cmdptr} = $#{$self->{_cmd}} + 1; $self->{t_input}->SetValue(""); $cmd =~ s/ *\t */ /g; $self->RunCommand($cmd); $self->{t_input}->SetFocus(); # end wxGlade } sub OnSend { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnSend &OnTextEnter; # end wxGlade } sub OnEdit { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnEdit my $d = $self->{d_editdialog} ||= EB::Wx::Shell::EditDialog->new; my $t = $self->{t_input}->GetValue; $t =~ s/\t/\n/g; $d->{t_input}->SetValue($t); $d->{t_input}->SetInsertionPoint( $self->{t_input}->GetInsertionPoint ); $d->{t_input}->SetFocus; my $ret = $d->ShowModal; $d->Show(0); return unless $ret == wxID_APPLY; $t = $d->{t_input}->GetValue; $t =~ s/\n/\t/g; $self->{t_input}->SetValue($t); &OnTextEnter; # end wxGlade } sub OnOpen { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnOpen my $fd = Wx::FileDialog->new ($self, _T("Kies"), "", "", ".eekboek.conf;eekboek.conf", 0|wxFD_FILE_MUST_EXIST, wxDefaultPosition); my $ret = $fd->ShowModal; if ( $ret == wxID_OK ) { if ( $self->{_shell} ) { EB::DB->disconnect; undef $self->{_shell}; } $self->{_ebcfg} = $fd->GetPath; chdir(dirname($fd->GetPath)); $self->RunCommand(undef); } $fd->Destroy; # end wxGlade } sub OnQuit { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnQuit $self->SaveHistory; $self->sizepos_save; $self->SavePreferences; foreach ( grep( /^d_htmlpanel/, keys(%$self) ) ) { $self->{$_}->OnClose; } foreach ( grep( /^d_.*dialog/, keys(%$self) ) ) { $self->{$_}->Destroy; } $self->Destroy; # end wxGlade } sub PutOnHistory { my ($self, $cmd) = @_; return if $cmd eq ""; $cmd =~ s/\s+--gen-wxhtml//; return if @{$self->{_cmd}} && $cmd eq $self->{_cmd}->[-1]; return if exists $self->{_cmd}->[$self->{_cmdptr}] && $cmd eq $self->{_cmd}->[$self->{_cmdptr}]; push(@{$self->{_cmd}}, $cmd); } use Wx qw(:keycode); sub OnChar { my ($self, $ctl, $event) = @_; # Get key code and char, if ordinary. my $k = $event->GetKeyCode; my $c = ($k < WXK_START) ? pack("C", $k) : ""; if ( $k == WXK_UP && $self->{_cmdptr} > 0 ) { $self->PutOnHistory($ctl->GetValue); $ctl->SetValue($self->{_cmd}->[--$self->{_cmdptr}]); $ctl->SetInsertionPointEnd; } elsif ( $k == WXK_DOWN && $self->{_cmdptr} < $#{$self->{_cmd}} ) { $self->PutOnHistory($ctl->GetValue); $ctl->SetValue($self->{_cmd}->[++$self->{_cmdptr}]); $ctl->SetInsertionPointEnd; } elsif ( $k == WXK_RETURN && $event->ControlDown ) { $self->OnEdit($event); } elsif ( $k == WXK_TAB || $k == WXK_RETURN || $k >= WXK_START || $event->HasModifiers ) { # Common controls. $event->Skip; return; } else { $event->Skip; } } sub OnHelp { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnHelp require EB::Wx::Help; my $h = EB::Wx::Help->new; $h->show_html_help; # end wxGlade } sub OnAbout { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnAbout my $year = 1900 + (localtime(time))[5]; my $md = Wx::MessageDialog->new ($self, __x("{pkg} {app} versie {ver}", pkg => $EekBoek::PACKAGE, app => "WxShell", ver => $EekBoek::VERSION)."\n". "Copyright 2007-$year Squirrel Consultancy\n\n". __x("Geschreven door {author}", author => "Johan Vromans")."\n". "\n". "http://www.squirrel.nl\n". __x("Voor ondersteuning: {url}", url => "http://www.eekboek.nl/support.html")."\n". "\n". __x("GUI ontwerp met {wxglade}", wxglade => "wxGlade, http://wxglade.sourceforge.net")."\n\n". __x("{pkg} versie {ver}", pkg => "Perl", ver => sprintf("%vd",$^V))."\n". __x("{pkg} versie {ver}", pkg => "WxPerl", ver => $Wx::VERSION)."\n". __x("{pkg} versie {ver}", pkg => "wxWidgets", ver => Wx::wxVERSION)."\n". ( $Cava::Packager::PACKAGED ? __x("{pkg} versie {ver}", pkg => "CAVA Packager", ver => $Cava::Packager::VERSION)."\n" : () ), __x("Over {pkg} {app}", pkg => $EekBoek::PACKAGE, app => "WxShell"), wxOK|wxICON_INFORMATION, wxDefaultPosition); $md->ShowModal; $md->Destroy; # end wxGlade } sub OnSupport { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnSupport my $title = _T("Ondersteuning"); my $md = EB::Wx::Shell::HtmlViewer->new($self, -1, $title); $md->info_only; $md->html->SetPage(_T(<Voor het uitwisselen van ervaringen, vragen om ondersteuning e.d. kunt u zich abonneren op de mailing list voor gebruikers op SourceForge.

De EekBoek gebruikers houden zelf een wiki bij met tips en andere wetenswaardigheden.

EekBoek kan gratis worden gedownload en gebruikt. Mocht u echter aanvullende wensen hebben op het gebied van ondersteuning dan kan dat ook. Squirrel Consultancy is gaarne bereid u betaalde ondersteuning te bieden, bijvoorbeeld bij het installeren van EekBoek, het opzetten van administraties, en het overzetten van uw bestaande administraties naar EekBoek. Ook kunnen specifieke uitbreidingen of aanpassingen naar uw wens worden gerealiseerd.

Voor meer informatie: info\@squirrel.nl.

EOD $md->SetTitle($title); $md->ShowModal; $md->Destroy; # end wxGlade } sub OnClear { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnClear $self->{t_output}->SetValue(""); # end wxGlade } sub OnPrefs { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnPrefs $self->{d_prefs} ||= EB::Wx::Shell::PreferencesDialog->new($self, -1, "Preferences"); for ( keys( %$prefctl ) ) { if ( exists $self->{d_prefs}->{"cx_$_"} ) { $self->{d_prefs}->{"cx_$_"}->SetValue( $self->{"prefs_$_"} ); } elsif ( exists $self->{d_prefs}->{"spin_$_"} ) { $self->{d_prefs}->{"spin_$_"}->SetValue( $self->{"prefs_$_"} ); } } my $ret = $self->{d_prefs}->ShowModal; if ( $ret == wxID_OK ) { for ( keys( %$prefctl ) ) { if ( exists $self->{d_prefs}->{"cx_$_"} ) { $self->{"prefs_$_"} = $self->{d_prefs}->{"cx_$_"}->GetValue; } elsif ( exists $self->{d_prefs}->{"spin_$_"} ) { $self->{"prefs_$_"} = $self->{d_prefs}->{"spin_$_"}->GetValue; } } } # end wxGlade } sub FillHistory { my ($self, $histfile) = @_; $self->{_histfile} = $histfile; $self->{_cmd} = []; $self->{_cmdptr} = 0; if ( -s $histfile ) { my $fh; return unless open($fh, "<:encoding(utf-8)", $histfile); my $prev = ''; while ( <$fh> ) { chomp; next if $_ eq $prev; $self->PutOnHistory($_); $prev = $_; } close($fh); } $self->{_cmdinit} = $self->{_cmdptr} = $#{$self->{_cmd}} + 1; } sub GetPreferences { my ( $self ) = @_; my $conf = Wx::ConfigBase::Get; for ( keys( %$prefctl ) ) { $self->{"prefs_$_"} = $conf->ReadInt( "preferences/$_", $prefctl->{$_} ); } } sub SaveHistory { my $self = shift; my $fh; my $histfile = $self->{_histfile}; $self->{_cmdinit} = $self->{_cmdptr} - $self->{prefs_histlines}; $self->{_cmdinit} = 0 if $self->{_cmdinit} < 0; return unless open($fh, ">:encoding(utf-8)", $histfile); while ( $self->{_cmdinit} < $self->{_cmdptr} ) { print { $fh } ($self->{_cmd}->[$self->{_cmdinit}], "\n"); $self->{_cmdinit}++; } close($fh); } sub SavePreferences { my ( $self ) = @_; my $conf = Wx::ConfigBase::Get; for ( keys( %$prefctl ) ) { $conf->WriteInt( "preferences/$_", $self->{"prefs_$_"} ); } } sub OnMenuBal { my ($self, $event, $sub) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnMenuBal if ( defined $sub && $sub >= 0 ) { $self->_cmd("balans --verdicht --detail=$sub --gen-wxhtml\n"); } else { $self->_cmd("balans --gen-wxhtml\n"); } # end wxGlade } sub OnMenuRes { my ($self, $event, $sub) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnMenuRes if ( defined $sub && $sub >= 0 ) { $self->_cmd("result --verdicht --detail=$sub --gen-wxhtml\n"); } else { $self->_cmd("result --gen-wxhtml\n"); } # end wxGlade } sub OnMenuAP { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnMenuAP $self->_cmd("crediteuren --gen-wxhtml\n"); # end wxGlade } sub OnMenuAR { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnMenuAR $self->_cmd("debiteuren --gen-wxhtml\n"); # end wxGlade } sub OnMenuVAT { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnMenuAR $self->_cmd("btwaangifte --gen-wxhtml\n"); # end wxGlade } sub OnMenuUns { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnMenuUns $self->_cmd("openstaand --gen-wxhtml\n"); # end wxGlade } sub OnTrial { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnTrial $self->_cmd("proefensaldibalans --gen-wxhtml\n"); # end wxGlade } sub OnJournal { my ($self, $event) = @_; # wxGlade: EB::Wx::Shell::MainFrame::OnJournal $self->_cmd("journaal --gen-wxhtml\n"); # end wxGlade } #### Callbacks from HTML links sub _HTMLCallBack { my ($self, $command, $args) = @_; my $cmd = $command; $cmd .= " " . delete($args->{select}); while ( my($k,$v) = each( %$args ) ) { $cmd .= " --$k=$v"; } $cmd .= " --gen-wxhtml"; $self->_cmd($cmd."\n"); } sub ShowRJnl { shift->_HTMLCallBack( "journaal", @_ ) } sub ShowRGbk { shift->_HTMLCallBack( "grootboek", @_ ) } sub ShowRCrd { shift->_HTMLCallBack( "crediteuren", @_ ) } sub ShowRDeb { shift->_HTMLCallBack( "debiteuren", @_ ) } # end of class EB::Wx::Shell::MainFrame 1;