use
5.10.1;
use
subs
qw/menu_struct/
;
Construct Tk::Widget
'ConfigModelNodeViewer'
;
my
@fbe1
=
qw/-fill both -expand 1/
;
my
@fxe1
=
qw/-fill x -expand 1/
;
my
@fx
=
qw/-fill x /
;
sub
ClassInit {
my
(
$cw
,
$args
) =
@_
;
}
sub
Populate {
my
(
$cw
,
$args
) =
@_
;
my
$node
=
$cw
->{node} =
delete
$args
->{-item}
||
die
"NodeViewer: no -item, got "
,
keys
%$args
;
my
$path
=
delete
$args
->{-path};
my
$cme_font
=
delete
$args
->{-font};
$cw
->add_header(
View
=>
$node
)->
pack
(
@fx
);
my
$inst
=
$node
->instance;
my
$elt_frame
=
$cw
->Frame(
qw/-relief flat/
)->
pack
(
@fbe1
);
$elt_frame
->Label(
-text
=>
$node
->composite_name_short .
' node elements'
)->
pack
();
my
$hl
=
$elt_frame
->Scrolled(
'HList'
,
-scrollbars
=>
'osow'
,
-columns
=> 3,
-header
=> 1,
-height
=> 8,
)->
pack
(
@fbe1
);
$hl
->headerCreate( 0,
-text
=>
'name'
);
$hl
->headerCreate( 1,
-text
=>
'type'
);
$hl
->headerCreate( 2,
-text
=>
'value'
);
$cw
->{hlist} =
$hl
;
$cw
->reload;
$cw
->add_annotation(
$node
)->
pack
(
@fx
);
if
(
$node
->parent ) {
$cw
->add_summary(
$node
)->
pack
(
@fx
);
$cw
->add_description(
$node
)->
pack
(
@fbe1
);
}
else
{
$cw
->add_help(
class
=>
$node
->get_help )->
pack
(
@fx
);
}
$cw
->add_info_button()->
pack
(
@fxe1
,
-side
=>
'left'
);
$cw
->add_editor_button(
$path
)->
pack
(
@fxe1
,
-side
=>
'right'
);
$cw
->ConfigSpecs(
-font
=> [[
'SELF'
,
'DESCENDANTS'
],
'font'
,
'Font'
,
$cme_font
],);
$cw
->SUPER::Populate(
$args
);
}
sub
reload {
my
$cw
=
shift
;
my
$node
=
$cw
->{node};
my
$hl
=
$cw
->{hlist};
my
%old_elt
= %{
$cw
->{elt_path} || {} };
foreach
my
$elt_name
(
$node
->get_element_name() ) {
my
$hl_name
=
$elt_name
;
$hl_name
=~ s/\./__/g;
my
$type
=
$node
->element_type(
$elt_name
);
unless
(
delete
$old_elt
{
$hl_name
} ) {
$hl
->add(
$hl_name
);
$cw
->{elt_path}{
$hl_name
} = 1;
$hl
->itemCreate(
$hl_name
, 0,
-text
=>
$elt_name
);
$hl
->itemCreate(
$hl_name
, 1,
-text
=>
$type
);
$hl
->itemCreate(
$hl_name
, 2,
-itemtype
=>
'imagetext'
,
-text
=>
''
,
-showimage
=> 0,
-image
=>
$Config::Model::TkUI::warn_img
);
}
if
(
$type
eq
'leaf'
) {
my
$v
=
eval
{
$node
->fetch_element_value(
$elt_name
) };
if
($@) {
$hl
->itemConfigure(
$hl_name
, 2,
-showtext
=> 0,
-showimage
=> 1,
);
}
elsif
(
defined
$v
) {
substr
(
$v
, 15 ) =
'...'
if
length
(
$v
) > 15;
$hl
->itemConfigure(
$hl_name
, 2,
-showtext
=> 1,
-showimage
=> 0,
-text
=>
$v
);
}
}
}
map
{
$hl
->
delete
(
entry
=>
$_
); }
keys
%old_elt
;
}
sub
cme_object {
my
$cw
=
shift
;
return
$cw
->{node};
}
1;