Commit 40a38247 authored by Christian Fibich's avatar Christian Fibich Committed by Stefan Tauner
Browse files

fiji_setup beautification. tried to make it look like Altera's MegaFunction Wizard.

parent d12504b6
......@@ -418,19 +418,19 @@ BEGIN {
description => "Settings concerning internal and external fault injection triggers"
},
reset_to_dut => {
title => "Reset Settings",
subtitle => "Reset from FIC to DUT",
title => "Reset from FIC to DUT",
subtitle => "",
description => "Settings concerning FIJI's ability to reset the DUT"
},
reset_from_dut => {
title => "Reset Settings",
subtitle => "Reset from DUT to FIC",
title => "Reset from DUT to FIC",
subtitle => "",
description => "Settings concerning FIJI's internal (from DUT) reset feature"
},
reset_external => {
title => "Reset Settings",
subtitle => "External Reset",
description => "Settings concerning FIJI's external (via pin)reset feature"
title => "External Reset",
subtitle => "",
description => "Settings concerning FIJI's external (via pin) reset feature"
},
lfsr => {
title => "LFSR Settings",
......
This diff is collapsed.
......@@ -27,11 +27,13 @@ package Tk::FIJISettingsViewer;
use strict;
use warnings;
use utf8;
use Log::Log4perl qw(get_logger);
use Scalar::Util 'blessed';
use Tk;
use Tk::widgets qw(LabFrame Balloon Label Entry Pane Button Dialog DialogBox Checkbutton CompleteEntry NoteBook StatusBar);
use Tk::widgets qw(LabFrame Balloon Label Entry Pane Button Dialog DialogBox Checkbutton CompleteEntry NoteBook StatusBar FIJISettingsCanvas);
use Tk::DynaMouseWheelBind;
......@@ -46,8 +48,11 @@ use Data::Dumper;
Construct Tk::Widget 'FIJISettingsViewer';
my $nb; # notebook holding constants and FIU frame
my $pg_design; # notebook page containing constants
my $pg_fius; # notebook page containing constants
my $pages_design; # notebook page containing constants
my $page_design;
my $settings_canvas;
my $dcc;
my $page_fius; # notebook page containing constants
my $fr_fius; # labled frame surrounding widgets representing design constant
my $widget_background;
......@@ -65,6 +70,8 @@ sub Populate {
my $logger = get_logger();
my($self, $args) = @_;
my $settings = delete $args->{'-settings'};
$self->{'documentation_path'} = delete $args->{'-documentation_path'};
if (!defined($settings) || !blessed($settings) || !$settings->isa("FIJI::Settings")) {
$logger->error("Given settings are not of type FIJI::Settings. No way to report this back from the constructor...");
} else {
......@@ -73,6 +80,11 @@ sub Populate {
$logger->debug("Adding empty fius array to settings reference.");
$self->{'settings'}->{'fius'} = [];
}
# tk:trace for canvas update
$self->traceVariable( $self->{'settings'}->{'design'}, 'w' => [ \&_update_canvas, $self ]);
$self->traceVariable( $self->{'settings'}->{'fius'}, 'w' => [ \&_update_canvas, $self ]);
}
# FIXME: add an option to store a CODE reference that is called when any field is invalid
......@@ -87,6 +99,11 @@ sub Populate {
$self->update();
}
sub bla {
my($index, $value, $op, @args) = @_;
print $index." ".$value." ".$op."\n";
}
sub nets {
my $logger = get_logger();
......@@ -128,9 +145,14 @@ sub settings {
return undef;
}
$self->{'settings'} = $settings;
# tk:trace for canvas update
$self->traceVariable( $self->{'settings'}->{'design'}, 'w' => [ \&_update_canvas, $self ]);
$self->traceVariable( $self->{'settings'}->{'fius'}, 'w' => [ \&_update_canvas, $self ]);
$self->update();
}
return $self->{'settings'}
return $self->{'settings'};
}
sub resources {
......@@ -147,9 +169,9 @@ sub update {
my $self = shift;
my $logger = get_logger();
################
# design panel #
################
#################
# design panels #
#################
# Ugly hack to retrieve the design constants widgets.
# Alternatively to below one could store the respective widgets separately.
......@@ -162,15 +184,13 @@ sub update {
my @design_widgets;
foreach my $c (($pg_design->Subwidget('pane')->children)[0]->children) {
if(ref($c) eq "Tk::LabFrame") {
foreach my $w ($c->Subwidget('frame')->children) {
push @design_widgets, $w;
}
foreach my $f (@{$pages_design}) {
foreach my $c ($f->children) {
push @design_widgets,$c;
}
}
#my @design_widgets = $pg_design->children;
#my @design_widgets = $page_design->children;
my $const_cnt = @design_widgets;
my $net_choices = defined($self->{'nets'}) ? $self->{'nets'} : [];
......@@ -268,83 +288,139 @@ sub update {
####
## Calc resource estimate
my $rh = FIJI::Settings::estimate_resources($self->{'settings'});
${$self->{'resources'}} = "~".$rh->{'regs'}." Registers, ".$rh->{'comb_min'}." - ".$rh->{'comb_max'}." LUTs (tech-dependent)";
$self->{'resources'} = "~".$rh->{'regs'}." Registers, ".$rh->{'comb_min'}." - ".$rh->{'comb_max'}." LUTs (tech-dependent)";
$settings_canvas->configure(-settings_ref=>\($self->{'settings'})) if defined $settings_canvas;
return 1;
}
## @method _populate_widget()
# Creates, aranges and binds all widgets
#
sub _switchtab {
my ($dummy, $nb, $inc) = @_;
my @pages = $nb->pages();
my $current_page = $nb->raised();
my ($index) = grep { $pages[$_] eq $current_page } 0..(@pages-1);
my $next_page = $pages[$index+$inc];
$nb->raise($next_page) if (($inc > 0 && defined $next_page) ||
($inc < 0 && $index > 0));
}
sub _populate_widget {
my $logger = get_logger();
my ($self, $fr) = @_;
# Add and init Buttons to bottom frame for "Wizard-Like" navigation
$nb = $fr->NoteBook()->pack(
-expand => 1,
-fill => 'both'
);
my $pg_design_main = $nb->add("design",
-label=>"Design Constants",
-underline=>0);
# Make the grid containing the fius scrollable (with the help of DynaMouseWheelBind)
$pg_design = $pg_design_main->Scrolled('Pane',-scrollbars=>'');
$pg_design->pack(
'-expand' => 1,
'-fill' => 'both',
'-anchor' => 'nw',
'-side' => 'top',
my $bf = $fr->Frame(-borderwidth=>1,-relief => 'raised',)->pack(
-expand => 1,
-fill => 'both'
);
my $b = $pg_design->Balloon();
my $i = 0;
my $bn = $bf->Button(-text=>"Next >",
-command=>[\&_switchtab, undef, $nb, 1],);
my $bb = $bf->Button(-text=>"< Back",
-command=>[\&_switchtab, undef, $nb, -1],);
# Add and resources field to bottom frame
my $rl = $bf->Label(-textvariable=>\$self->{'resources'});
$bn->pack(-side=>"right");
$bb->pack(-side=>"right");
if(defined $self->{'documentation_path'}) {
$bf->Button(-text=>"Open Documentation",
-command=>sub {
if($^O eq "MSWin32") {
system(1, "start ".$self->{'documentation_path'});
} elsif ($^O eq "linux") {
system("xpdf ".$self->{'documentation_path'}." +".$nb->raised()." &");
} else {
my $d = $bf->Dialog(-title=>"Open Documentation",
-buttons=>["OK"]);
$d->Label(-text=>"No default PDF viewer for OS \"".$^O."\"...")->pack(-side=>"top");
$d->Label(-text=>"Open")->pack(-side=>"left");
my $e = $d->Entry(-textvariable=>\$self->{'documentation_path'})->pack(-side=>"left");
$e->configure(-state=>"readonly");
$d->Label(-text=>"manually")->pack(-side=>"left");
$d->Show();
}
})->pack(-side=>"right");
}
$rl->pack(-side=>"left");
$pages_design = [];
$pg_design->gridColumnconfigure(2, '-weight' => 1);
# create Tk::Balloon instance for tooltips
my $b = $fr->Balloon();
my $dm_ref = DESIGNMAP; # Work around Perl limitation: use constant <hash> and dereferencing does not play well together
my $dg_ref = DISPLAYGROUPS;
my $entry;
my $dgi = 0;
my $gc = 0;
my $net_choices = defined($self->{'nets'}) ? $self->{'nets'} : [];
my $tooltip_hash = {};
my $entry;
$nb->parent->parent->bind('<Left>' => [\&_switchtab, $nb, -1]);
$nb->parent->parent->bind('<Right>'=> [\&_switchtab, $nb, 1]);
# add canvas for Block Diagram
my $sc;
foreach my $displaygroup (sort(keys(%{$dg_ref}))) {
# filter out just the Settings Fields in this Display group
my @keys = map { my $foo = $_; (defined DESIGNMAP->{$foo}->{'group'} && DESIGNMAP->{$foo}->{'group'} eq $displaygroup) ? ($_) : () } keys(%{$dm_ref});
if (@keys == 0) { next };
my $row = 1;
my $i = 0;
my @keys = map { my $foo = $_; (defined DESIGNMAP->{$foo}->{'group'} && DESIGNMAP->{$foo}->{'group'} eq $displaygroup) ? ($_) : () } keys(%{$dm_ref});
if (@keys == 0) { next };
my $title = DISPLAYGROUPS->{$displaygroup}->{'title'};
$title .= ": ".DISPLAYGROUPS->{$displaygroup}->{'subtitle'} if DISPLAYGROUPS->{$displaygroup}->{'subtitle'} ne "";
# make labframe for this display group
my $lf = $pg_design->LabFrame(-label=>$title,-labelside=>"acrosstop");
# add new notebook page
my $page = $nb->add($displaygroup,
-anchor=>"ne",
-label=>DISPLAYGROUPS->{$displaygroup}->{'title'}." \x{25B6}");
# add frame for Block Diagram / Description
my $description_frame = $page->Frame();
$description_frame->Label(-text=>DISPLAYGROUPS->{$displaygroup}->{'description'})->pack(-fill=>"both");
# add frame for configuration widgets
my $config_frame = $page->Frame();
# let description eat up all the remaining space
$lf->Subwidget('frame')->gridColumnconfigure(0,-weight=>1);
# if the tab is changed, delete the existing canvas
# and create a new one in the tab currently shown.
$nb->pageconfigure($displaygroup,-raisecmd => sub {
$settings_canvas->packForget() if defined $settings_canvas;
$settings_canvas->destroy if defined $settings_canvas;
$settings_canvas = $description_frame->FIJISettingsCanvas(-relief=>"solid",-borderwidth=>"1",-settings_ref=>\($self->{'settings'}))->pack(-fill=>"both");
$b->attach($settings_canvas, -balloonposition => 'mouse',
-msg => "Implementation Overview") ;
});
# add tooltip for description label
# let entries eat up all the remaining space
$config_frame->gridColumnconfigure(2,-weight=>1);
# add tooltip the entire notebook page
if (defined DISPLAYGROUPS->{$displaygroup}->{'description'}) {
$b->attach($lf->Subwidget('label'), -balloonposition => 'mouse',
-msg => DISPLAYGROUPS->{$displaygroup}->{'description'});
$b->attach($lf->Subwidget('frame'), -balloonposition => 'mouse',
$b->attach($page, -balloonposition => 'mouse',
-msg => DISPLAYGROUPS->{$displaygroup}->{'description'});
}
# my $label = $pg_design->Label(
# '-text' => DISPLAYGROUPS->{$displaygroup}->{'description'},
# )->pack;
# add matching widgets for all (editable) values in this displaygroup
foreach my $k (sort(@keys)) {
# label
my $label = $lf->Label(
my $label = $config_frame->Label(
'-text' => DESIGNMAP->{$k}->{'description'},
'-justify' => 'left'
);
......@@ -353,7 +429,7 @@ sub _populate_widget {
'-sticky' => 'w'
);
# unit
my $unit = $lf->Label(
my $unit = $config_frame->Label(
'-text' => DESIGNMAP->{$k}->{'unit'},
);
$unit->grid(-row => $row, -column => 1,
......@@ -363,7 +439,7 @@ sub _populate_widget {
# entry
my $type = DESIGNMAP->{$k}->{'type'};
if (defined($type) && $type eq 'net') {
$entry = $lf->CompleteEntry(
$entry = $config_frame->CompleteEntry(
);
$entry->configure(
'-validate' => 'key',
......@@ -374,7 +450,7 @@ sub _populate_widget {
'-sticky' => 'ew'
);
} elsif (defined($type) && $type eq 'toplevel_port') {
$entry = $lf->CompleteEntry(
$entry = $config_frame->CompleteEntry(
);
$entry->configure(
'-validate' => 'key',
......@@ -385,7 +461,7 @@ sub _populate_widget {
'-sticky' => 'ew'
);
} elsif (defined($type) && $type eq 'boolean') {
$entry = $lf->Checkbutton(
$entry = $config_frame->Checkbutton(
'-state' => (DESIGNMAP->{$k}->{'noedit'}) ? "disabled" : "normal",
'-justify' => 'left',
);
......@@ -393,7 +469,7 @@ sub _populate_widget {
'-sticky' => 'w'
);
} elsif (defined($type) && $type eq 'bit') {
$entry = $lf->Optionmenu(
$entry = $config_frame->Optionmenu(
'-options' => DESIGNMAP->{$k}->{'values'},
'-textvariable' => \$self->{'settings'}->{'design'}->{$k},
'-width' => -1,
......@@ -403,13 +479,13 @@ sub _populate_widget {
'-sticky' => 'w'
);
} else {
$entry = $lf->Entry('-state' => (DESIGNMAP->{$k}->{'noedit'}) ? "disabled" : "normal");
$entry = $config_frame->Entry('-state' => (DESIGNMAP->{$k}->{'noedit'}) ? "disabled" : "normal");
$entry->configure(
'-validate' => 'key',
'-validatecommand' => [\&_validate_design_entry, $self, $entry, $k],
);
$entry->grid(-row => $row, -column => 2,
'-sticky' => 'w'
'-sticky' => 'ew'
);
}
if (defined(DESIGNMAP->{$k}->{'depends_on'})) {
......@@ -436,26 +512,58 @@ sub _populate_widget {
},
);
# Widget description is needed for widget-based error messages such as
# "Forbids"
$entry->{'description'} = DESIGNMAP->{$k}->{'description'};
$row++;
}
$dgi += 1 if $gc == 0;
$lf->grid(-row=>$dgi,-column=>$gc, -sticky=>"ewns");
$gc = ($gc + 1) % 2;
$description_frame->pack(-anchor=>"e",-side=>"left");
$config_frame->pack(-side=>"left",-fill=>"both",-expand=>1);
push @{$pages_design}, $config_frame;
}
$widget_background = $entry->cget('-bg');
$widget_background = $entry->cget('-bg');
##############
# fius panel #
##############
$pg_fius = $nb->add('fius',
$page_fius = $nb->add('fius',
-label=>'FIUs',
-underline=>0);
$self->_add_fiu_panel($pg_fius);
# add frame for Block Diagram / Description
my $description_frame = $page_fius->Frame();
$description_frame->Label(-text=>"Settings concerning Fault Injection Units")->pack(-fill=>"both");
# add frame for configuration widgets
my $config_frame = $page_fius->Frame();
$description_frame->pack(-anchor=>"e",-side=>"left");
$config_frame->pack(-side=>"left",-fill=>"both",-expand=>1);
$nb->DynaMouseWheelBind('Tk::Pane');
# if the tab is changed, delete the existing canvas
# and create a new one in the tab currently shown.
$nb->pageconfigure("fius",-raisecmd => sub {
$settings_canvas->packForget() if defined $settings_canvas;
$settings_canvas->destroy if defined $settings_canvas;
$settings_canvas = $description_frame->FIJISettingsCanvas(-relief=>"solid",-borderwidth=>"1",-settings_ref=>\($self->{'settings'}))->pack(-fill=>"both");
$b->attach($settings_canvas, -balloonposition => 'mouse',
-msg => "Implementation Overview") ;
});
$self->_add_fiu_panel($config_frame);
}
# This is the Tk::Trace callback for FIJI::Settings.
# It is needed for updating the Block Diagram whenever the Settings change
sub _update_canvas {
my( $index, $value, $op, $self ) = @_;
$settings_canvas->update() if defined $settings_canvas;
return $value;
}
sub _add_fiu_panel {
my($self, $fr) = @_;
......@@ -506,11 +614,14 @@ sub _fiu_cnt {
sub get_ctrl_dimensions {
my $self=shift;
$self->update;
my $h = 0;
my $g = $nb->geometryinfo();
my $scrolled = $pg_design;
my $h = $pg_design->height() + $scrolled->Subwidget('xscrollbar')->cget('width');
my $w = $pg_design->width() + $scrolled->Subwidget('yscrollbar')->cget('width');
return ($w,$h);
foreach my $page ($nb->pages()) {
my $pagew = $nb->page_widget($page);
$h = $pagew->height() if ($pagew->height() > $h);
}
return ($g->[0],$h);
}
# FIXME broken by notebook i think
......@@ -642,22 +753,8 @@ sub _add_fiu ($$) {
$del_button,
);
# if ($vn && defined $fiu->{'FIU_DRIVER_PATH'} && defined $fiu->{'FIU_DRIVER_TYPE'}) {
# my $vd = $self->_validate_driver($fiu->{'FIU_DRIVER_PATH'},$fiu->{'FIU_DRIVER_TYPE'});
# my $msg = "Driver ".$fiu->{'FIU_DRIVER_TYPE'}.":".$fiu->{'FIU_DRIVER_PATH'}." for ".$fiu->{'FIU_NET_NAME'};
# if(defined $vd && $vd == 0) {
# $msg .= " is invalid. Selecting new driver.";
# _select_driver_dialog($self, \$fiu->{'FIU_NET_NAME'}, $i);
# } elsif (defined $vd && $vd == 1) {
# $msg .= " is valid.";
# } else {
# $msg .= " cannot be validated.";
# }
# $logger->info($msg);
# } elsif( $vn && (!defined $fiu->{'FIU_DRIVER_PATH'} || !defined $fiu->{'FIU_DRIVER_TYPE'})) {
# $logger->info("No driver selected. Selecting new driver.");
# _select_driver_dialog($self, \$fiu->{'FIU_NET_NAME'}, $i);
# }
# update Block Diagram
$settings_canvas->update() if defined $settings_canvas;
}
sub _update_fields {
......@@ -691,7 +788,7 @@ sub _update_fields {
####
## Calc resource estimate
my $rh = FIJI::Settings::estimate_resources($self->{'settings'});
${$self->{'resources'}} = "~".$rh->{'regs'}." Registers, ".$rh->{'comb_min'}." - ".$rh->{'comb_max'}." LUTs (tech-dependent)";
$self->{'resources'} = "~".$rh->{'regs'}." Registers, ".$rh->{'comb_min'}." - ".$rh->{'comb_max'}." LUTs (tech-dependent)";
return $rv;
}
......@@ -925,7 +1022,7 @@ sub _validate_entry {
####
## Calc resource estimate
my $rh = FIJI::Settings::estimate_resources($self->{'settings'});
${$self->{'resources'}} = "~".$rh->{'regs'}." Registers, ".$rh->{'comb_min'}." - ".$rh->{'comb_max'}." LUTs (tech-dependent)";
$self->{'resources'} = "~".$rh->{'regs'}." Registers, ".$rh->{'comb_min'}." - ".$rh->{'comb_max'}." LUTs (tech-dependent)";
return 1; # always allow the new value and show the user what happened.
}
......
; Config::Simple 4.58
; Tue Aug 25 16:55:14 2015
; Mon Aug 31 16:18:03 2015
[FIU0]
FAULT_MODEL=RUNTIME
NET_NAME=i2c_master_top|i2c_master_byte_ctrl|i2c_master_bit_ctrl|N_152_tz
LFSR_MASK=0x0
DRIVER_PATH=i2c_master_bit_ctrl|al_RNIHURE|combout
DRIVER_TYPE=PIN
[FIU1]
LFSR_MASK=0x0
DRIVER_PATH=i2c_master_bit_ctrl|c_state_RNO_0_|combout
NET_NAME=i2c_master_top|i2c_master_byte_ctrl|i2c_master_bit_ctrl|N_152_tz
[FIU2]
DRIVER_PATH=i2c_master_top|byte_controller|cnt_RNIOCS1_combout_0
DRIVER_TYPE=PIN
NET_NAME=i2c_master_top|i2c_master_byte_ctrl|i2c_master_bit_ctrl|c_state_ns_0_0__g0_0_0
NET_NAME=i2c_master_top|cnt_RNIOCS1_combout
LFSR_MASK=0x0
FAULT_MODEL=RUNTIME
[FIU2]
[FIU1]
FAULT_MODEL=RUNTIME
NET_NAME=i2c_master_top|cnt_RNIOCS1_combout
DRIVER_TYPE=PIN
DRIVER_PATH=i2c_master_top|byte_controller|cnt_RNIOCS1_combout_0
DRIVER_PATH=i2c_master_bit_ctrl|c_state_RNO_0_|combout
NET_NAME=i2c_master_top|i2c_master_byte_ctrl|i2c_master_bit_ctrl|c_state_ns_0_0__g0_0_0
LFSR_MASK=0x0
DRIVER_TYPE=PIN
[CONSTS]
TRIGGER_DUT_NAME=i2c_master_top|cnt_RNIOCS1_combout
RESET_DUT_OUT_ACTIVE=0
RESET_EXT_ACTIVE=1
RESET_DUT_OUT_EN=1
TRIGGER_DUT_ACTIVE=1
LFSR_WIDTH=16
RESET_DUT_IN_NAME=wb_rst_i
CLOCK_NET=i2c_master_top|wb_clk_i_c
FAULT_DETECT_1_INVERT=0
CFGS_PER_MSG=2
TIMER_WIDTH=4
RESET_DUT_IN_EN=1
TRIGGER_EXT_ACTIVE=1
TX_OUT_NAME=s_fiji_tx_o
LFSR_POLY=0x2d
RX_IN_NAME=s_fiji_rx_i
BAUDRATE=115200
ID=0xaa4
FREQUENCY=50000000
RESET_DUT_OUT_NAME=i2c_master_top|i2c_master_byte_ctrl|c_state_ns_0_0_0_5__g1
LFSR_WIDTH=32
RESET_EXT_IN_NAME=s_fiji_reset
TRIGGER_EXT_EN=0
RESET_DUT_IN_DURATION=4
FIU_NUM=3
FAULT_DETECT_1_EN=1
RESET_EXT_EN=0
TRIGGER_EXT_IN_NAME=s_fiji_trigger_ext
RESET_DUT_IN_ACTIVE=1
FREQUENCY=50000000
FAULT_DETECT_2_EN=1
TRIGGER_DUT_ACTIVE=1
ID=0xaa4
RESET_EXT_ACTIVE=0
TRIGGER_DUT_EN=0
RESET_EXT_EN=1
FIU_CFG_BITS=3
RESET_DUT_IN_ACTIVE=1
FAULT_DETECT_2_INVERT=1
TRIGGER_DUT_EN=1
FAULT_DETECT_1_NAME=i2c_master_top|i2c_master_byte_ctrl|N_11_i
TRIGGER_EXT_ACTIVE=1
TRIGGER_EXT_EN=0
RESET_DUT_OUT_EN=1
RESET_DUT_IN_EN=0
RESET_DUT_IN_DURATION=4
RESET_DUT_OUT_NAME=i2c_master_top|i2c_master_byte_ctrl|c_state_ns_0_0_0_5__g1
TRIGGER_DUT_NAME=i2c_master_top|cnt_RNIOCS1_combout
TX_OUT_NAME=s_fiji_tx_o
LFSR_SEED=0xcafe
BAUDRATE=115200
FAULT_DETECT_2_NAME=i2c_master_top|i2c_master_byte_ctrl|N_70
LFSR_POLY=0x2d
FAULT_DETECT_1_NAME=i2c_master_top|i2c_master_byte_ctrl|N_11_i
TRIGGER_EXT_IN_NAME=s_fiji_trigger_ext
RX_IN_NAME=s_fiji_rx_i
FAULT_DETECT_2_INVERT=1
CFGS_PER_MSG=2
FAULT_DETECT_1_INVERT=0
CLOCK_NET=i2c_master_top|wb_clk_i_c
TIMER_WIDTH=4
RESET_DUT_IN_NAME=wb_rst_i
FIU_NUM=3
RESET_DUT_OUT_ACTIVE=0
......@@ -86,17 +86,17 @@ sub main {
$self->{'ctrl'} = _ctrl_frame($self, $mw);
$self->{'resources'} = "...";
# $self->{'resources'} = "...";
$self->{'StatusBar'} = $mw->StatusBar();
$self->{'StatusBar'} ->addLabel(
-relief => 'flat',
-textvariable => \$self->{'resources'},
);
# $self->{'StatusBar'} = $mw->StatusBar();
# $self->{'StatusBar'} ->addLabel(
# -relief => 'flat',
# -textvariable => \$self->{'resources'},
# );
$self->{'FIJISettingsViewer'} = $mw->FIJISettingsViewer(
-settings => $self->{'settings'},