$VERSION
=
"0.17"
;
my
$mswin
= 0;
$mswin
= 1
if
$Config
{
'osname'
} eq
'MSWin32'
;
sub
new {
my
$class
=
shift
;
my
$self
=
$class
->SUPER::new(
@_
);
$self
->Require(
qw[ConfigFolder Daemons]
);
$self
->{CMOPTIONS} = {};
$self
->{DEFERRED} = {};
$self
->{DOCS} = {};
$self
->{FORCECLOSE} = 0;
$self
->{HISTORY} = [];
$self
->{HISTORYDISABLED} = 0;
$self
->{INTERFACE} =
undef
;
$self
->{MONITOR} = {};
$self
->{SELECTDISABLED} = 0;
$self
->{SELECTED} =
undef
;
$self
->{SILENTMODE} = 0;
my
$args
=
$self
->GetArgsRef;
my
$cmo
=
delete
$args
->{
'-contentmanageroptions'
};
$cmo
= []
unless
defined
$cmo
;
my
@preconfig
= ();
for
(
@$cmo
) {
push
@preconfig
,
$_
=> [
'PASSIVE'
,
undef
,
undef
,
''
];
}
$self
->addPreConfig(
@preconfig
,
-contentmanagerclass
=> [
'PASSIVE'
,
undef
,
undef
,
'Wx::Perl::FrameWorks::BaseClasses::ContentManager'
],
-contentmanageroptions
=> [
'PASSIVE'
,
undef
,
undef
,
$cmo
],
-diskmonitorinterval
=> [
'PASSIVE'
,
undef
,
undef
, 100],
-maxhistory
=> [
'PASSIVE'
,
undef
,
undef
, 12],
-filetypes
=> [
'PASSIVE'
,
undef
,
undef
,
"All files|*"
],
-historymenupath
=> [
'PASSIVE'
,
undef
,
undef
,
'File::Open recent'
],
-maxtablength
=> [
'PASSIVE'
,
undef
,
undef
, 16],
-modifiedmonitorinterval
=> [
'PASSIVE'
,
undef
,
undef
, 25],
-readonly
=> [
'PASSIVE'
,
undef
,
undef
, 0],
);
$self
->cmdConfig(
deferred_open
=> [
'deferredOpen'
,
$self
],
doc_close
=> [
'CmdDocClose'
,
$self
],
doc_new
=> [
'CmdDocNew'
,
$self
],
doc_open
=> [
'CmdDocOpen'
,
$self
],
doc_rename
=> [
'docRename'
,
$self
],
doc_save
=> [
'CmdDocSave'
,
$self
],
doc_save_as
=> [
'CmdDocSaveAs'
,
$self
],
$self
->CommandDocSaveAll,
doc_select
=> [
'docSelect'
,
$self
],
set_title
=> [
'setTitle'
,
$self
],
pop_hist_menu
=> [
'CmdPopulateHistoryMenu'
,
$self
],
pop_hist_tool
=> [
'CmdPopulateHistoryTool'
,
$self
],
);
$self
->addPostConfig(
'DoPostConfig'
,
$self
);
$self
->historyLoad;
return
$self
;
}
sub
CanQuit {
my
$self
=
shift
;
if
(
$self
->docConfirmSaveAll) {
$self
->docForceClose(1);
return
1
}
return
0
}
sub
CmdDocClose {
my
(
$self
,
$name
) =
@_
;
$name
=
$self
->docSelected
unless
defined
$name
;
return
1
unless
defined
$name
;
my
$close
= 1;
my
$fc
=
$self
->docForceClose;
if
(
$self
->docForceClose or
$self
->docConfirmSave(
$name
)) {
my
$geosave
=
$self
->geometry;
$close
=
$self
->docClose(
$name
);
$self
->interfaceRemove(
$name
)
if
$close
;
$self
->geometry(
$geosave
);
}
$self
->
log
(
"Closed '$name'"
)
if
$close
;
$self
->logWarning(
"Failed closing '$name'"
)
unless
$close
;
$close
=
$name
if
$close
;
return
$close
}
sub
CmdDocNew {
my
(
$self
,
$name
) =
@_
;
$name
=
$self
->docUntitled
unless
defined
$name
;
$self
->deferredAssign(
$name
);
$self
->interfaceAdd(
$name
);
$self
->cmdExecute(
'doc_select'
,
$name
);
return
$name
;
}
sub
CmdDocOpen {
my
$self
=
shift
;
my
@files
=
@_
;
unless
(
@files
) {
my
@op
= ();
my
$sel
=
$self
->docSelected;
push
@op
,
-initialdir
=> dirname(
$sel
)
if
defined
$sel
;
@files
=
$self
->docOpenDialog(
@op
);
}
my
@o
= ();
my
$silentmode
=
$self
->silentMode;
$self
->silentMode(1)
if
@files
> 1;
for
(
@files
) {
my
$file
=
$_
;
$file
= File::Spec->rel2abs(
$file
);
next
if
-d
$file
;
if
(
$self
->docExists(
$file
)) {
}
elsif
(
$self
->cmdExecute(
'doc_new'
,
$file
)) {
$self
->historyRemove(
$file
);
$self
->
log
(
"Opened '$file'"
);
push
@o
,
$file
;
}
}
$self
->silentMode(
$silentmode
)
if
@files
> 1;
$self
->cmdExecute(
'doc_select'
,
$o
[0])
if
@o
;
return
@o
}
sub
CmdDocSave {
my
(
$self
,
$name
) =
@_
;
return
1
if
$self
->configGet(
'-readonly'
);
$name
=
$self
->docSelected
unless
defined
$name
;
return
1
unless
defined
$name
;
return
1
unless
$self
->docModified(
$name
);
my
$doc
=
$self
->docGet(
$name
);
if
(
defined
$doc
) {
unless
(
$name
=~ /^Untitled/) {
if
(
$doc
->Save(
$name
)) {
$self
->monitorUpdate(
$name
);
$self
->
log
(
"Saved '$name'"
);
$self
->Interface->indicator(
$name
, 0);
my
$nav
=
$self
->navigator;
$nav
->EntrySaved(
$name
)
if
defined
$nav
;
return
$name
}
else
{
$self
->logWarning(
"Failed saving '$name'"
);
return
0
}
}
else
{
return
$self
->CmdDocSaveAs(
$name
);
}
}
return
0
}
sub
CmdDocSaveAs {
my
(
$self
,
$name
) =
@_
;
return
0
if
$self
->configGet(
'-readonly'
);
$name
=
$self
->docSelected
unless
defined
$name
;
return
0
unless
defined
$name
;
my
$doc
=
$self
->docGet(
$name
);
if
(
defined
$doc
) {
my
@op
= (
-initialdir
=> dirname(
$name
),
-initialfile
=> basename(
$name
),
);
my
(
$file
) =
$self
->pickFileSave(
@op
,);
if
(
defined
$file
) {
$file
= File::Spec->rel2abs(
$file
);
if
(
$doc
->Save(
$file
)) {
$self
->
log
(
"Saved '$file'"
);
$self
->cmdExecute(
'doc_rename'
,
$name
,
$file
);
return
$file
}
else
{
$self
->logWarning(
"Failed saving '$file'"
);
return
''
}
}
}
return
''
}
sub
CmdDocSaveAll {
my
$self
=
shift
;
my
@list
=
$self
->docList;
my
$succes
= 1;
for
(
@list
) {
$succes
=
''
unless
$self
->cmdExecute(
'doc_save'
,
$_
)
}
return
$succes
}
sub
CmdPopulateHistoryMenu {
my
$self
=
shift
;
my
$mnu
=
$self
->extGet(
'MenuBar'
);
if
(
defined
$mnu
) {
my
$path
=
$self
->configGet(
'-historymenupath'
);
my
(
$menu
,
$index
) =
$mnu
->FindMenuEntry(
$path
);
if
(
defined
(
$menu
)) {
my
$submenu
=
$menu
->entrycget(
$index
,
'-menu'
);
$submenu
->
delete
(1,
'last'
);
my
$h
=
$self
->{HISTORY};
for
(
@$h
) {
my
$f
=
$_
;
$submenu
->add(
'command'
,
-label
=>
$f
,
-command
=>
sub
{
$self
->cmdExecute(
'doc_open'
,
$f
) }
);
}
$submenu
->add(
'separator'
);
$submenu
->add(
'command'
,
-label
=>
'Clear list'
,
-command
=>
sub
{
@$h
= () },
);
}
}
}
sub
CmdPopulateHistoryTool {
my
$self
=
shift
;
my
$tb
=
$self
->extGet(
'ToolBar'
);
my
$hist
=
$tb
->GetItem(
'history'
);
for
(
$hist
->children) {
$_
->destroy }
my
$lf
=
$hist
->LabFrame(
-label
=>
'Recent files'
,
-labelside
=>
'acrosstop'
,
)->
pack
(
-fill
=>
'both'
);
my
$f
=
$lf
->Subwidget(
'frame'
);
my
$h
=
$self
->{HISTORY};
for
(
@$h
) {
my
$file
=
$_
;
my
$l
=
$f
->Label(
-anchor
=>
'w'
,
-borderwidth
=> 1,
-text
=>
$file
,
)->
pack
(
-fill
=>
'x'
);
$l
->
bind
(
'<Enter>'
,
sub
{
$l
->configure(
-relief
=>
'raised'
) });
$l
->
bind
(
'<Leave>'
,
sub
{
$l
->configure(
-relief
=>
'flat'
) });
$l
->
bind
(
'<Button-1>'
,
sub
{
$l
->configure(
-relief
=>
'sunken'
) });
$l
->
bind
(
'<ButtonRelease-1>'
,
sub
{
$l
->configure(
-relief
=>
'flat'
);
$self
->update;
$tb
->PopDown;
$self
->cmdExecute(
'doc_open'
,
$file
);
});
}
$f
->Frame(
-borderwidth
=> 1,
-relief
=>
'sunken'
,
-height
=> 2)->
pack
(
-fill
=>
'x'
,
-pady
=> 2);
my
$l
=
$f
->Label(
-anchor
=>
'w'
,
-borderwidth
=> 1,
-text
=>
'Clear list'
,
)->
pack
(
-fill
=>
'x'
);
$l
->
bind
(
'<Enter>'
,
sub
{
$l
->configure(
-relief
=>
'raised'
) });
$l
->
bind
(
'<Leave>'
,
sub
{
$l
->configure(
-relief
=>
'flat'
) });
$l
->
bind
(
'<Button-1>'
,
sub
{
$l
->configure(
-relief
=>
'sunken'
) });
$l
->
bind
(
'<ButtonRelease-1>'
,
sub
{
$l
->configure(
-relief
=>
'flat'
);
$self
->update;
$tb
->PopDown;
@$h
= ();
});
my
$width
= 0;
my
$height
= 0;
for
(
$f
->children) {
my
$w
=
$_
->reqwidth;
my
$h
=
$_
->reqheight;
$width
=
$w
if
$w
>
$width
;
$height
=
$height
+
$h
;
}
$hist
->configure(
-height
=>
$height
+ 32,
-width
=>
$width
+ 12);
}
sub
CommandDocSaveAll {
my
$self
=
shift
;
return
doc_save_all
=> [
'CmdDocSaveAll'
,
$self
],
}
sub
ConfirmSaveDialog {
my
(
$self
,
$name
) =
@_
;
croak
'Name not defined'
unless
defined
$name
;
my
$title
=
'Warning, file modified'
;
my
$text
=
"Closing "
. basename(
$name
) .
".\nDocument has been modified. Save it?"
;
my
$icon
=
'dialog-warning'
;
return
$self
->popDialog(
$title
,
$text
,
$icon
,
qw/Yes No Cancel/
);
}
sub
ContentSpace {
my
(
$self
,
$name
) =
@_
;
croak
'Name not defined'
unless
defined
$name
;
return
$self
->Interface->getPage(
$name
);
}
sub
CreateContentHandler {
my
(
$self
,
$name
) =
@_
;
croak
'Name not defined'
unless
defined
$name
;
my
$page
=
$self
->ContentSpace(
$name
);
my
$cmclass
=
$self
->configGet(
'-contentmanagerclass'
);
my
$h
=
$page
->
$cmclass
(
-extension
=>
$self
)->
pack
(
-expand
=> 1,
-fill
=>
'both'
);
$self
->{DOCS}->{
$name
} =
$h
;
return
$h
;
}
sub
CreateInterface {
my
$self
=
shift
;
$self
->{INTERFACE} =
$self
->WorkSpace->YANoteBook(
-image
=>
$self
->getArt(
'document-multiple'
, 16),
-indicatorimage
=>
$self
->getArt(
'document-save'
, 16),
-selecttabcall
=> [
'cmdExecute'
,
$self
,
'doc_select'
],
-closetabcall
=> [
'cmdExecute'
,
$self
,
'doc_close'
],
)->
pack
(
-expand
=> 1,
-fill
=>
'both'
);
}
sub
deferredAssign {
my
(
$self
,
$name
,
$options
) =
@_
;
croak
'Name not defined'
unless
defined
$name
;
$options
= {}
unless
defined
$options
;
$self
->{DEFERRED}->{
$name
} =
$options
;
}
sub
deferredExists {
my
(
$self
,
$name
) =
@_
;
croak
'Name not defined'
unless
defined
$name
;
return
exists
$self
->{DEFERRED}->{
$name
}
}
sub
deferredList {
my
$self
=
shift
;
my
$d
=
$self
->{DEFERRED};
return
keys
%$d
}
sub
deferredOpen {
my
(
$self
,
$name
) =
@_
;
croak
'Name not defined'
unless
defined
$name
;
my
$doc
=
$self
->CreateContentHandler(
$name
);
my
$flag
= 1;
$flag
=
''
unless
(-e
$name
) and (
$doc
->Load(
$name
));
my
$options
=
$self
->deferredOptions(
$name
);
$self
->
after
(20,
sub
{
for
(
keys
%$options
) {
$doc
->configure(
$_
,
$options
->{
$_
})
}
$self
->monitorAdd(
$name
);
});
$self
->deferredRemove(
$name
);
if
(
$flag
) {
$self
->
log
(
"Loaded $name"
);
}
else
{
$self
->logWarning(
"Failed loading $name"
);
}
$flag
=
$name
if
$flag
;
return
$flag
}
sub
deferredOptions {
my
(
$self
,
$name
,
$options
) =
@_
;
croak
'Name not defined'
unless
defined
$name
;
my
$def
=
$self
->{DEFERRED};
$def
->{
$name
} =
$options
if
defined
$options
;
return
$def
->{
$name
}
}
sub
deferredRemove {
my
(
$self
,
$name
) =
@_
;
croak
'Name not defined'
unless
defined
$name
;
delete
$self
->{DEFERRED}->{
$name
}
}
sub
docClose {
my
(
$self
,
$name
) =
@_
;
croak
'Name not defined'
unless
defined
$name
;
if
(
$self
->deferredExists(
$name
)) {
$self
->historyAdd(
$name
);
$self
->deferredRemove(
$name
);
return
$name
}
my
$doc
=
$self
->docGet(
$name
);
if
(
$doc
->Close) {
$self
->historyAdd(
$name
);
delete
$self
->{DOCS}->{
$name
};
$self
->monitorRemove(
$name
);
if
((
defined
$self
->docSelected) and (
$self
->docSelected eq
$name
)) {
$self
->docSelected(
undef
);
}
$doc
->destroy;
return
$name
}
return
0
}
sub
docConfirmSave {
my
(
$self
,
$name
) =
@_
;
croak
'Name not defined'
unless
defined
$name
;
if
(
$self
->docModified(
$name
)) {
my
$answer
=
$self
->ConfirmSaveDialog(
$name
);
if
(
$answer
eq
'Yes'
) {
return
0
unless
$self
->cmdExecute(
'doc_save'
,
$name
);
}
elsif
(
$answer
eq
'No'
) {
return
1
}
else
{
return
0
}
}
else
{
return
1
}
}
sub
docConfirmSaveAll {
my
$self
=
shift
;
my
$close
= 1;
my
@docs
=
$self
->docList;
for
(
@docs
) {
my
$name
=
$_
;
$close
=
$self
->docConfirmSave(
$name
);
last
if
$close
eq 0;
}
return
$close
;
}
sub
docExists {
my
(
$self
,
$name
) =
@_
;
croak
'Name not defined'
unless
defined
$name
;
return
1
if
exists
$self
->{DOCS}->{
$name
};
return
1
if
$self
->deferredExists(
$name
);
return
0
}
sub
docForceClose {
my
$self
=
shift
;
$self
->{FORCECLOSE} =
shift
if
@_
;
return
$self
->{FORCECLOSE}
}
sub
docFullList {
my
$self
=
shift
;
return
$self
->docList,
$self
->deferredList;
}
sub
docGet {
my
(
$self
,
$name
) =
@_
;
croak
'Name not defined'
unless
defined
$name
;
$self
->cmdExecute(
'deferred_open'
,
$name
)
if
$self
->deferredExists(
$name
);
return
$self
->{DOCS}->{
$name
}
}
sub
docList {
my
$self
=
shift
;
my
$dochash
=
$self
->{DOCS};
return
keys
%$dochash
;
}
sub
docListDisplayed {
my
$self
=
shift
;
my
$interface
=
$self
->extGet(
'CoditMDI'
)->Interface;
my
$disp
=
$interface
->{DISPLAYED};
return
@$disp
}
sub
docListUnDisplayed {
my
$self
=
shift
;
my
$interface
=
$self
->extGet(
'CoditMDI'
)->Interface;
my
$undisp
=
$interface
->{UNDISPLAYED};
return
@$undisp
}
sub
docModified {
my
(
$self
,
$name
) =
@_
;
croak
'Name not defined'
unless
defined
$name
;
return
0
if
$self
->deferredExists(
$name
);
return
$self
->docGet(
$name
)->IsModified;
}
sub
docOpenDialog {
my
$self
=
shift
;
return
$self
->pickFileOpenMulti(
@_
);
}
sub
docRename {
my
(
$self
,
$old
,
$new
) =
@_
;
croak
'Old not defined'
unless
defined
$old
;
croak
'New not defined'
unless
defined
$new
;
unless
(
$old
eq
$new
) {
my
$doc
=
delete
$self
->{DOCS}->{
$old
};
$self
->{DOCS}->{
$new
} =
$doc
;
$self
->interfaceRename(
$old
,
$new
);
$self
->monitorRemove(
$old
);
$self
->monitorAdd(
$new
);
if
(
$self
->docSelected eq
$old
) {
$self
->cmdExecute(
'doc_select'
,
$new
)
}
}
}
sub
docSelect {
my
(
$self
,
$name
) =
@_
;
croak
'Name not defined'
unless
defined
$name
;
return
if
$self
->selectDisabled;
$self
->cmdExecute(
'deferred_open'
,
$name
)
if
$self
->deferredExists(
$name
);
$self
->docSelected(
$name
);
$self
->interfaceSelect(
$name
);
$self
->docGet(
$name
)->doSelect;
$self
->cmdExecute(
'set_title'
,
$name
);
}
sub
docSelected {
my
$self
=
shift
;
$self
->{SELECTED} =
shift
if
@_
;
return
$self
->{SELECTED}
}
sub
docTitle {
my
(
$self
,
$name
) =
@_
;
return
basename(
$name
,
''
);
}
sub
docUntitled {
my
$self
=
shift
;
my
$name
=
'Untitled'
;
if
(
$self
->docExists(
$name
)) {
my
$num
= 2;
while
(
$self
->docExists(
"$name ($num)"
)) {
$num
++ }
$name
=
"$name ($num)"
;
}
return
$name
}
sub
DoPostConfig {
my
$self
=
shift
;
$self
->CreateInterface;
}
sub
historyAdd {
my
(
$self
,
$filename
) =
@_
;
croak
'Name not defined'
unless
defined
$filename
;
return
if
$self
->historyDisabled;
if
(
defined
(
$filename
) and (-e
$filename
)) {
my
$hist
=
$self
->{HISTORY};
unshift
@$hist
,
$filename
;
my
$siz
=
@$hist
;
pop
@$hist
if
(
$siz
>
$self
->configGet(
'-maxhistory'
));
}
}
sub
historyDisabled {
my
$self
=
shift
;
$self
->{HISTORYDISABLED} =
shift
if
@_
;
return
$self
->{HISTORYDISABLED}
}
sub
historyLoad {
my
$self
=
shift
;
my
$folder
=
$self
->configGet(
'-configfolder'
);
if
(-e
"$folder/history"
) {
if
(
open
(OFILE,
"<"
,
"$folder/history"
)) {
my
@history
= ();
while
(<OFILE>) {
my
$line
=
$_
;
chomp
$line
;
push
@history
,
$line
;
}
close
OFILE;
$self
->{HISTORY} = \
@history
;
}
}
}
sub
historyRemove {
my
(
$self
,
$file
) =
@_
;
croak
'Name not defined'
unless
defined
$file
;
return
if
$self
->historyDisabled;
my
$h
=
$self
->{HISTORY};
my
(
$index
) =
grep
{
$h
->[
$_
] eq
$file
} (0 ..
@$h
-1);
splice
@$h
,
$index
, 1
if
defined
$index
;
}
sub
historySave {
my
$self
=
shift
;
my
$hist
=
$self
->{HISTORY};
if
(
@$hist
) {
my
$folder
=
$self
->configGet(
'-configfolder'
);
if
(
open
(OFILE,
">"
,
"$folder/history"
)) {
for
(
@$hist
) {
print
OFILE
"$_\n"
;
}
close
OFILE
}
else
{
warn
"Cannot save document history"
}
}
}
sub
Interface {
return
$_
[0]->{INTERFACE}
}
sub
interfaceAdd {
my
(
$self
,
$name
) =
@_
;
croak
'Name not defined'
unless
defined
$name
;
my
$if
=
$self
->Interface;
if
(
defined
$if
) {
my
@op
= ();
my
$cti
=
$self
->getArt(
'tab-close'
, 16);
push
@op
,
-closeimage
=>
$cti
if
defined
$cti
;
my
$page
=
$if
->addPage(
$name
,
@op
,
-title
=>
$self
->docTitle(
$name
),
-closebutton
=> 1,
);
}
my
$navigator
=
$self
->navigator;
if
(
defined
$navigator
) {
$navigator
->Add(
$name
)
if
defined
$navigator
;
}
}
sub
interfaceCollapse {
my
$self
=
shift
;
my
$t
=
$self
->Subwidget(
'NAVTREE'
);
$t
->collapseAll
if
defined
$t
;
}
sub
interfaceExpand {
my
$self
=
shift
;
my
$t
=
$self
->Subwidget(
'NAVTREE'
);
$t
->expandAll
if
defined
$t
;
}
sub
interfaceGet {
my
$self
=
shift
;
my
$navigator
=
$self
->navigator;
return
$navigator
}
sub
interfaceRemove {
my
(
$self
,
$name
,
$flag
) =
@_
;
croak
'Name not defined'
unless
defined
$name
;
$flag
= 1
unless
defined
$flag
;
my
$if
=
$self
->Interface;
$if
->deletePage(
$name
)
if
(
defined
$if
) and
$flag
;
my
$navigator
=
$self
->interfaceGet;
$navigator
->Delete(
$name
)
if
defined
$navigator
;
}
sub
interfaceRename {
my
(
$self
,
$old
,
$new
) =
@_
;
croak
'Old not defined'
unless
defined
$old
;
croak
'New not defined'
unless
defined
$new
;
my
$if
=
$self
->Interface;
if
(
defined
$if
) {
$if
->renamePage(
$old
,
$new
);
my
$tab
=
$if
->getTab(
$new
);
$tab
->configure(
-name
=>
$new
,
-title
=>
$self
->docTitle(
$new
),
);
}
my
$navigator
=
$self
->interfaceGet;
if
(
defined
$navigator
) {
$navigator
->Delete(
$old
);
$navigator
->Add(
$new
);
}
}
sub
interfaceSelect {
my
(
$self
,
$name
) =
@_
;
croak
'Name not defined'
unless
defined
$name
;
my
$if
=
$self
->Interface;
$if
->selectPage(
$name
)
if
defined
$if
;
my
$navigator
=
$self
->interfaceGet;
$navigator
->SelectEntry(
$name
)
if
defined
$navigator
;
}
sub
interfaceShow {
my
(
$self
,
$name
) =
@_
;
croak
'Name not defined'
unless
defined
$name
;
my
$t
=
$self
->Subwidget(
'NAVTREE'
);
$t
->entryShow(
$name
)
if
defined
$t
;
}
sub
MenuSaveAll {
my
$self
=
shift
;
return
[
'menu_normal'
,
'File::'
,
"Save ~all"
,
'doc_save_all'
,
'document-save'
,
'CTRL+L'
],
}
sub
MenuItems {
my
$self
=
shift
;
my
$readonly
=
$self
->configGet(
'-readonly'
);
my
@items
= (
[
'menu'
,
undef
,
"~File"
],
);
push
@items
,
[
'menu_normal'
,
'File::'
,
"~New"
,
'doc_new'
,
'document-new'
,
'CTRL+N'
],
[
'menu_separator'
,
'File::'
,
'f1'
],
unless
$readonly
;
push
@items
,
[
'menu_normal'
,
'File::'
,
"~Open"
,
'doc_open'
,
'document-open'
,
'CTRL+O'
],
[
'menu'
,
'File::'
,
"Open ~recent"
,
'pop_hist_menu'
, ],
;
push
@items
,
[
'menu_separator'
,
'File::'
,
'f2'
],
[
'menu_normal'
,
'File::'
,
"~Save"
,
'doc_save'
,
'document-save'
,
'CTRL+S'
],
[
'menu_normal'
,
'File::'
,
"S~ave as"
,
'doc_save_as'
,
'document-save-as'
,],
$self
->MenuSaveAll,
unless
$readonly
;
push
@items
,
[
'menu_separator'
,
'File::'
,
'f3'
],
[
'menu_normal'
,
'File::'
,
"~Close"
,
'doc_close'
,
'document-close'
,
'CTRL+SHIFT+O'
],
;
return
@items
}
sub
monitorAdd {
my
(
$self
,
$name
) =
@_
;
croak
'Name not defined'
unless
defined
$name
;
my
$dem
=
$self
->extGet(
'Daemons'
);
my
$di
=
$self
->configGet(
'-diskmonitorinterval'
);
my
$mi
=
$self
->configGet(
'-modifiedmonitorinterval'
);
$dem
->jobAdd(
"$name-disk"
,
$di
,
'monitorDisk'
,
$self
,
$name
);
$dem
->jobAdd(
"$name-modified"
,
$mi
,
'monitorModified'
,
$self
,
$name
);
my
$hash
=
$self
->{MONITOR};
my
$modified
=
$self
->docModified(
$name
);
my
$stamp
;
$stamp
= ctime(
stat
(
$name
)->mtime)
if
-e
$name
;
$hash
->{
$name
} = {
modified
=>
$modified
,
timestamp
=>
$stamp
,
}
}
sub
monitorDisk {
my
(
$self
,
$name
) =
@_
;
croak
'Name not defined'
unless
defined
$name
;
return
unless
-e
$name
;
my
$stamp
=
$self
->{MONITOR}->{
$name
}->{
'timestamp'
};
my
$docstamp
= ctime(
stat
(
$name
)->mtime);
if
(
$stamp
ne
$docstamp
) {
my
$title
=
'Warning, file modified on disk'
;
my
$text
=
"$name\nHas been modified on disk."
;
my
$icon
=
'dialog-warning'
;
my
$answer
=
$self
->popDialog(
$title
,
$text
,
$icon
,
qw/Reload Ignore/
);
if
(
$answer
eq
'Reload'
) {
$self
->docGet(
$name
)->Load(
$name
);
}
$self
->{MONITOR}->{
$name
}->{
'timestamp'
} =
$docstamp
;
}
}
sub
monitorList {
my
$self
=
shift
;
my
$hash
=
$self
->{MONITOR};
return
sort
keys
%$hash
;
}
sub
monitorModified {
my
(
$self
,
$name
) =
@_
;
croak
'Name not defined'
unless
defined
$name
;
my
$mod
=
$self
->{MONITOR}->{
$name
}->{
'modified'
};
my
$docmod
=
$self
->docModified(
$name
);
my
$nav
=
$self
->navigator;
if
(
$mod
ne
$docmod
) {
if
(
$docmod
) {
$self
->Interface->indicator(
$name
, 1);
$nav
->EntryModified(
$name
)
if
defined
$nav
;
}
else
{
$self
->Interface->indicator(
$name
, 0);
$nav
->EntrySaved(
$name
)
if
defined
$nav
;
}
$self
->{MONITOR}->{
$name
}->{
'modified'
} =
$docmod
;
}
}
sub
monitorRemove {
my
(
$self
,
$name
) =
@_
;
croak
'Name not defined'
unless
defined
$name
;
my
$dem
=
$self
->extGet(
'Daemons'
);
$dem
->jobRemove(
"$name-disk"
);
$dem
->jobRemove(
"$name-modified"
);
delete
$self
->{MONITOR}->{
$name
};
}
sub
monitorUpdate {
my
(
$self
,
$name
) =
@_
;
croak
'Name not defined'
unless
defined
$name
;
$self
->{MONITOR}->{
$name
}->{
'timestamp'
} = ctime(
stat
(
$name
)->mtime);
}
sub
navigator {
my
$self
=
shift
;
my
$nav
=
$self
->extGet(
'Selector'
);
return
$nav
}
sub
ReConfigure {
my
$self
=
shift
;
my
@docs
=
$self
->docList;
for
(
@docs
) {
$self
->docGet(
$_
)->ConfigureCM;
}
}
sub
Quit {
my
$self
=
shift
;
my
@docs
=
$self
->docList;
for
(
@docs
) {
$self
->CmdDocClose(
$_
);
}
$self
->historySave;
}
sub
selectDisabled {
my
$self
=
shift
;
$self
->{SELECTDISABLED} =
shift
if
@_
;
return
$self
->{SELECTDISABLED}
}
sub
setTitle {
my
(
$self
,
$name
) =
@_
;
my
$appname
=
$self
->configGet(
'-appname'
);
$self
->configPut(
-title
=>
"$name - $appname"
)
if
defined
$name
;
$self
->configPut(
-title
=>
$appname
)
unless
defined
$name
;
}
sub
silentMode {
my
(
$self
,
$flag
) =
@_
;
unless
(
defined
$flag
) {
return
$self
->{SILENTMODE};
}
$self
->{SILENTMODE} =
$flag
;
my
$if
=
$self
->Interface;
if
(
$flag
) {
$self
->{
'autoupdate'
} =
$if
->autoupdate;
$if
->autoupdate(0);
$self
->{
'historydisabled'
} =
$self
->historyDisabled;
$self
->historyDisabled(1);
$self
->{
'selectdisabled'
} =
$self
->selectDisabled;
$self
->selectDisabled(1);
}
else
{
my
$a
=
$self
->{
'autoupdate'
};
$if
->autoupdate(
$a
)
if
defined
$a
;
delete
$self
->{
'autoupdate'
};
my
$h
=
$self
->{
'historydisabled'
};
$self
->historyDisabled(
$h
)
if
defined
$h
;
delete
$self
->{
'historydisabled'
};
my
$d
=
$self
->{
'selectdisabled'
};
$self
->selectDisabled(
$d
)
if
defined
$d
;
delete
$self
->{
'selectdisabled'
};
}
}
sub
ToolSaveAll {
my
$self
=
shift
;
return
[
'tool_button'
,
'Save all'
,
'doc_save_all'
,
'document-save'
,
'Save all open documents'
],
}
sub
ToolItems {
my
$self
=
shift
;
my
$readonly
=
$self
->configGet(
'-readonly'
);
my
@items
= ();
push
@items
,
[
'tool_button'
,
'New'
,
'doc_new'
,
'document-new'
,
'Create a new document'
],
unless
$readonly
;
push
@items
,
[
'tool_list'
,
'history'
,
'pop_hist_tool'
],
[
'tool_button'
,
'Open'
,
'doc_open'
,
'document-open'
,
'Open a document'
],
[
'tool_list_end'
],
;
push
@items
,
[
'tool_list'
],
[
'tool_button'
,
'Save'
,
'doc_save'
,
'document-save'
,
'Save current document'
],
[
'tool_button'
,
'Save as '
,
'doc_save_as'
,
'document-save-as'
,
'Rename and save current document'
],
$self
->ToolSaveAll,
[
'tool_list_end'
],
unless
$readonly
;
push
@items
,
[
'tool_button'
,
'Close'
,
'doc_close'
,
'document-close'
,
'Close current document'
],
;
return
@items
}
1;