App-Codit
view release on metacpan or search on metacpan
lib/App/Codit/Ext/CoditMDI.pm view on Meta::CPAN
If a selection exists it will do this for the selection, otherwise it
will scan the whole document.
=item B<doc_get_sel>
Returns the begin and end index of the current selection.
=item B<doc_get_text> I<$begin>, I<$end>
Returns the text in the current selected document from index $begin to index $end.
=item B<doc_remove_trailing>
Removes spaces at the end of each line.
If a selection exists it will do this for the selection, otherwise it
will scan the whole document.
=item B<doc_replace>
Pops up the search and replace bar in the currently selected document.
=item B<doc_wrap>
Sets and returns the wrap option of the currently selected document.
=item B<edit_delete>, I<$begin>, I<$end>
Deletes text in the currently selected document. It takes two indices as parameters.
=item B<edit_insert>, I<$index>, I<$text>
Inserts text in the currently selected document. It takes an index and a string as parameters.
=item B<edit_replace>, I<$begin>, I<$end>, I<$text>
Replaces text in the currently selected document. It takes two indices and a text as parameters.
=item B<key_released>, I<$doc>, I<$key>
Dummy command only meant for hooking on by plugins. Called every time a visible character
key was pressed.
=item B<modified>, I<$doc>, I<$index>
Called every time you make an edit, it gets a document name and an index as parameters.
It checks if there are any macros that should be restarted.
Many plugins hook on to this command.
=back
=head1 METHODS
=over 4
=cut
sub new {
my $class = shift;
my $self = $class->SUPER::new(@_);
# $self->Require('Navigator');
$self->{MACROS} = {};
$self->{SHOWSPACES} = 0;
$self->{FIXINDENTSPACES} = 3;
my $nav = $self->Subwidget('NAVTREE');
$self->configInit(
-doc_autoindent => ['docAutoIndent', $self],
-doc_autobrackets => ['docAutoBrackets', $self],
-doc_autocomplete=> ['docAutoComplete', $self],
-doc_show_spaces => ['docShowSpaces', $self],
-doc_view_folds => ['docViewFolds', $self],
-doc_view_numbers => ['docViewNumbers', $self],
-doc_view_status => ['docViewStatus', $self],
-doc_wrap => ['docWrap', $self],
);
$self->cmdConfig(
bookmark_add => ['bookmarkAdd', $self],
bookmark_clear => ['bookmarkClear', $self],
bookmark_fill => ['bookmarkFill', $self],
bookmark_next => ['bookmarkNext', $self],
bookmark_prev => ['bookmarkPrev', $self],
bookmark_remove => ['bookmarkRemove', $self],
doc_autoindent => ['docAutoIndent', $self],
doc_case_lower => ['docCaseLower', $self],
doc_case_upper => ['docCaseUpper', $self],
doc_delete => ['docDelete', $self],
doc_delete_dialog => ['docDeleteDialog', $self],
doc_find => ['docPopFindReplace', $self, 1],
doc_fix_indent => ['docFixIndent', $self],
doc_get_sel => ['docGetSel', $self],
doc_get_text => ['docGetText', $self],
doc_remove_trailing => ['docRemoveTrailing', $self],
doc_replace => ['docPopFindReplace', $self, 0],
doc_wrap => ['docWrap', $self],
edit_delete => ['editDelete', $self],
edit_insert => ['editInsert', $self],
edit_replace => ['editReplace', $self],
key_released => ['keyReleased', $self],
modified => ['contentModified', $self],
nav_collapse => ['navCollapse', $self],
nav_expand => ['navExpand', $self],
);
return $self;
}
sub _mcr { return $_[0]->{MACROS} }
sub bookmarkAdd {
my $self = shift;
my $doc = $self->docSelected;
if (defined $doc) {
my $w = $self->docGet($doc)->CWidg;
$w->bookmarkNew
}
}
sub bookmarkClear {
my $self = shift;
my $doc = $self->docSelected;
if (defined $doc) {
my $w = $self->docGet($doc)->CWidg;
$w->bookmarkRemoveAll;
}
}
sub bookmarkFill {
my $self = shift;
my $mnu = $self->extGet('MenuBar');
my ($menu, $index) = $mnu->FindMenuEntry('Bookmarks');
my $submenu = $menu->entrycget($index, '-menu');
my $i = $submenu->index('end');
if ($i > 7) {
$submenu->delete(8, 'last');
}
my $doc = $self->docSelected;
if (defined $doc) {
my $w = $self->docGet($doc)->CWidg;
my @list = $w->bookmarkList;
for (@list) {
$submenu->add('command',
-label => "$_ - " . $w->bookmarkText($_),
-command => ['bookmarkGo', $w, $_],
);
}
}
}
sub bookmarkNext {
my $self = shift;
my $doc = $self->docSelected;
if (defined $doc) {
my $w = $self->docGet($doc)->CWidg;
$w->bookmarkNext
}
}
sub bookmarkPrev {
my $self = shift;
my $doc = $self->docSelected;
if (defined $doc) {
my $w = $self->docGet($doc)->CWidg;
$w->bookmarkPrev
}
}
sub bookmarkRemove {
my $self = shift;
my $doc = $self->docSelected;
if (defined $doc) {
my $w = $self->docGet($doc)->CWidg;
$w->bookmarkRemove
}
}
sub CmdDocClose {
my ($self, $name) = @_;
$name = $self->docSelected unless defined $name;
$self->macroRemoveAll($name);
my $result = $self->SUPER::CmdDocClose($name);
if ($result) {
$self->after(100, sub {
my @list = $self->docFullList;
$self->cmdExecute('doc_new') unless @list;
});
}
return $result
}
sub CmdDocNew {
my $self = shift;
my $result = $self->SUPER::CmdDocNew(@_);
$self->disposeUntitled if $result;
return $result
}
#sub CmdDocOpen {
# my $self = shift;
# my $result = $self->SUPER::CmdDocOpen(@_);
# $self->disposeUntitled if $result;
# return $result
#}
sub contentModified {
my $self = shift;
my ($doc, $index) = @_;
if ($self->docShowSpaces) {
my $macro = $self->macroGet($doc, 'space');
if (defined $macro) {
my $line = $macro->widg->linenumber($index);
$macro->line($line);
$macro->start;
}
}
return @_;
}
sub ContextMenu {
my $self = shift;
return $self->extGet('MenuBar')->menuContext($self->GetAppWindow,
[ 'menu_normal', undef, '~Copy', '<Control-c>', 'edit-copy', '*CTRL+C'],
[ 'menu_normal', undef, 'C~ut', '<Control-x>', 'edit-cut', '*CTRL+X'],
[ 'menu_normal', undef, '~Paste', '<Control-v>', 'edit-paste', '*CTRL+V'],
[ 'menu_separator', undef, 'c1'],
[ 'menu_normal', undef, '~Select all', '<Control-a>', 'edit-select-all', '*CTRL+A'],
[ 'menu_separator', undef, 'c2'],
[ 'menu_normal', undef, 'Co~mment', '<Control-g>', undef, '*CTRL+G'],
[ 'menu_normal', undef, '~Uncomment', '<Control-G>', undef, '*CTRL+SHIFT+G'],
[ 'menu_separator', undef, 'c3' ],
[ 'menu_normal', undef, '~Indent', '<Control-j>', 'format-indent-more','*CTRL+J'],
[ 'menu_normal', undef, 'Unin~dent', '<Control-J>', 'format-indent-less','*CTRL+SHIFT+J'],
[ 'menu_separator', undef, 'c4' ],
[ 'menu_check', undef, 'A~uto indent', undef, '-doc_autoindent', undef, 0, 1],
[ 'menu_radio_s', undef, '~Wrap', [qw/char word none/], 'text-wrap', '-doc_wrap'],
)
}
sub CreateContentHandler {
my ($self, $name, $parent) = @_;
my $h = $self->SUPER::CreateContentHandler($name, $parent);
$h->Name($name);
return $h;
}
sub CreateInterface {
my $self = shift;
my $w = $self->WorkSpace;
$w->gridColumnconfigure(0, -weight => 1);
$w->gridRowconfigure(0, -weight => 1);
$self->{INTERFACE} = $w->YANoteBook(
-image => $self->getArt('document-multiple', 16),
-indicatorimage => $self->getArt('document-save', 16),
-selecttabcall => ['cmdExecute', $self, 'doc_select'],
-closetabcall => ['cmdExecute', $self, 'doc_close'],
)->grid(-row => 0, -column => 0, -sticky => 'nsew');
}
sub deferredOpen {
my ($self, $name) = @_;
croak 'Name not defined' unless defined $name;
my $options = $self->deferredOptions($name);
my $bookmarks = delete $options->{'bookmarks'};
$self->SUPER::deferredOpen($name);
$self->after(100, sub {
if (defined $bookmarks) {
my $w = $self->docGet($name)->CWidg;
while ($bookmarks =~ s/^(\d+)\s//) {
$w->bookmarkNew($1);
}
}
});
}
sub disposeUntitled {
my $self = shift;
my @list = $self->docListDisplayed;
my $untitled = $list[0];
if ((@list eq 2) and ($untitled =~ /^Untitled/)){
return if -e $untitled;
return if $self->docModified($untitled);
$self->cmdExecute('doc_close', $untitled);
}
}
sub docAutoIndent {
my $self = shift;
return $self->docOption('-contentautoindent', @_);
}
sub docAutoBrackets {
my $self = shift;
return $self->docOption('-contentautobrackets', @_);
}
sub docAutoComplete {
my $self = shift;
return $self->docOption('-contentautocomplete', @_);
}
sub docCase {
my ($self, $upper) = @_;
$upper = 1 unless defined $upper;
my $widg = $self->docWidget;
return unless defined $widg;
$widg->caseChange($upper);
}
sub docCaseLower { $_[0]->docCase(0) }
sub docCaseUpper { $_[0]->docCase(1) }
sub docDelete {
my ($self, $name) = @_;
my $r = 1;
$name = $self->docSelected unless defined $name;
if (defined $name) {
$r = $self->cmdExecute('doc_close', $name) if $self->docExists($name);
unlink $name if $r;
}
return $name if $r;
return ''
}
lib/App/Codit/Ext/CoditMDI.pm view on Meta::CPAN
);
return $self->cmdExecute('doc_delete', $name) if $answer eq 'Yes';
}
return ''
}
sub docFixIndent {
my ($self, $name) = @_;
$name = $self->docSelected unless defined $name;
my $widg = $self->docGet($name)->CWidg;
$widg->fixIndent
}
sub docGetSel {
my $self = shift;
my $doc = $self->docSelected;
return unless defined $doc;
return $self->docGet($doc)->tagRanges('sel');
}
sub docGetText {
my $self = shift;
my $doc = $self->docSelected;
return unless defined $doc;
return $self->docGet($doc)->get(@_);
}
sub docOption {
my $self = shift;
my $item = shift;
croak 'Option is not defined' unless defined $item;
return if $self->configMode;
my $sel = $self->docSelected;
return unless defined $sel;
my $doc = $self->docGet($sel);
if (@_) {
$doc->configure($item, shift);
}
return $doc->cget($item);
}
sub docPopFindReplace {
my ($self, $flag) = @_;
my $sel = $self->docSelected;
return unless defined $sel;
my $doc = $self->docGet($sel);
$doc->CWidg->FindAndOrReplace($flag);
}
sub docRemoveTrailing {
my ($self, $name) = @_;
$name = $self->docSelected unless defined $name;
my $widg = $self->docGet($name)->CWidg;
$widg->removeTrailingSpaces;
}
sub docSelect {
my ($self, $name) = @_;
return if $self->selectDisabled;
$self->SUPER::docSelect($name);
}
sub docShowSpaces {
my $self = shift;
return $self->docOption('-contentshowspaces', @_);
}
sub docSelectFirst {
my $self = shift;
my $sel = $self->docSelected;
unless (defined $sel) {
my @list = $self->docFullList;
$self->cmdExecute('doc_select', $list[0]) if @list;
}
}
sub docViewFolds {
my $self = shift;
return $self->docOption('-showfolds', @_);
}
sub docViewNumbers {
my $self = shift;
return $self->docOption('-shownumbers', @_);
}
sub docViewStatus {
my $self = shift;
return $self->docOption('-showstatus', @_);
}
=item B<docWidget>
Returns a reference to the Tk::CodeText widget
of the current selected document. Returns undef
if no document is selected.
=cut
sub docWidget {
my $self = shift;
my $name = $self->docSelected;
return undef unless defined $name;
my $doc = $self->docGet($name);
return undef unless defined $doc;
return $doc->CWidg;
}
sub docWrap {
my $self = shift;
return $self->docOption('-contentwrap', @_);
}
=item B<editDelete>I<($begin, $end)>
Deletes text in the currently selected document. It takes two indices as parameters.
=cut
sub editDelete {
lib/App/Codit/Ext/CoditMDI.pm view on Meta::CPAN
sub macroList {
my ($self, $doc) = @_;
my $mcr = $self->_mcr;
return unless exists $mcr->{$doc};
my $l = $mcr->{$doc};
return @$l;
}
=item B<macroRemove>I<($doc, $name)>
Removes macro $name for $doc from the stack.
=cut
sub macroRemove {
my ($self, $doc, $name) = @_;
if (defined $self->macroGet($doc, $name)) {
my $mcr = $self->_mcr;
my $l = $mcr->{$doc};
my @list = @$l;
my $count = 0;
for (@list) {
if ($_->name eq $name) {
$_->stop;
last;
} else {
$count ++;
}
}
splice @list, $count, 1;
if (@list) {
$mcr->{$doc} = \@list;
} else {
delete $mcr->{$doc}
}
return
}
warn "macro $name for $doc does not exist"
}
=item B<macroRemoveAll>I<($doc)>
Removes all macros for $doc from the stack.
=cut
sub macroRemoveAll {
my ($self, $doc) = @_;
my @list = $self->macroList($doc);
for (@list) {
$self->macroRemove($doc, $_->name);
}
}
sub MenuItems {
my $self = shift;
#creating the context menu for the navigator tree
$self->after(1000, ['navContextMenu', $self]);
my @items = $self->SUPER::MenuItems;
return (@items,
[ 'menu', undef, '~Edit'],
[ 'menu_normal', 'Edit::', '~Copy', '<Control-c>', 'edit-copy', '*CTRL+C'],
[ 'menu_normal', 'Edit::', 'C~ut', '<Control-x>', 'edit-cut', '*CTRL+X'],
[ 'menu_normal', 'Edit::', '~Paste', '<Control-v>', 'edit-paste', '*CTRL+V'],
[ 'menu_separator', 'Edit::', 'e1' ],
[ 'menu_normal', 'Edit::', 'U~ndo', '<Control-z>', 'edit-undo', '*CTRL+Z'],
[ 'menu_normal', 'Edit::', '"~Redo', '<Control-Z>', 'edit-redo', '*CTRL+SHIFT+Z'],
[ 'menu_separator', 'Edit::', 'e2'],
[ 'menu_normal', 'Edit::', 'Co~mment', '<Control-g>', undef, '*CTRL+G'],
[ 'menu_normal', 'Edit::', '~Uncomment', '<Control-G>', undef, '*CTRL+SHIFT+G'],
[ 'menu_separator', 'Edit::', 'e3' ],
[ 'menu_normal', 'Edit::', '~Indent', '<Control-j>', 'format-indent-more','*CTRL+J'],
[ 'menu_normal', 'Edit::', 'Unin~dent', '<Control-J>', 'format-indent-less','*CTRL+SHIFT+J'],
[ 'menu_separator', 'Edit::', 'e4' ],
[ 'menu_normal', 'Edit::', 'U~pper case', 'doc_case_upper', 'format-text-uppercase','*CTRL+I'],
[ 'menu_normal', 'Edit::', '~Lower case', 'doc_case_lower', 'format-text-lowercase','*CTL+SHIFT+I'],
[ 'menu_separator', 'Edit::', 'e5' ],
[ 'menu_normal', 'Edit::', '~Select all', '<Control-a>', 'edit-select-all','*CTRL+A'],
[ 'menu', undef, '~Bookmarks', 'bookmark_fill'],
[ 'menu_normal', 'Bookmarks::', '~Add bookmark', 'bookmark_add', 'bookmark_new', 'CTRL+B',],
[ 'menu_normal', 'Bookmarks::', '~Remove bookmark', 'bookmark_remove', 'bookmark_remove', 'CTRL+SHIFT+B',],
[ 'menu_normal', 'Bookmarks::', '~Clear bookmarks', 'bookmark_clear', undef],
[ 'menu_separator', 'Bookmarks::', 'b1' ],
[ 'menu_normal', 'Bookmarks::', '~Previous bookmark', 'bookmark_prev', 'bookmark_previous'],
[ 'menu_normal', 'Bookmarks::', '~Next bookmark', 'bookmark_next', 'bookmark_next'],
[ 'menu_separator', 'Bookmarks::', 'b2' ],
[ 'menu_separator', 'View::', 'v1' ],
[ 'menu_check', 'View::', 'Show ~folds', undef, '-doc_view_folds', undef, 0, 1],
[ 'menu_check', 'View::', 'Show ~line numbers', undef, '-doc_view_numbers', undef, 0, 1],
[ 'menu_check', 'View::', 'Show ~document status',undef, '-doc_view_status', undef, 0, 1],
[ 'menu_separator', 'View::', 'v2' ],
[ 'menu_check', 'View::', 'Show ~spaces and tabs','show-spaces', '-doc_show_spaces', undef, 0, 1],
[ 'menu', undef, '~Tools'],
[ 'menu_normal', 'Tools::', '~Find', 'doc_find', 'edit-find', '*CTRL+F',],
[ 'menu_normal', 'Tools::', '~Replace', 'doc_replace', 'edit-find-replace','*CTRL+R',],
[ 'menu_separator', 'Tools::', 't1' ],
[ 'menu_check', 'Tools::', 'A~uto indent', undef, '-doc_autoindent', undef, 0, 1],
[ 'menu_check', 'Tools::', 'A~uto brackets', undef, '-doc_autobrackets', undef, 0, 1],
[ 'menu_check', 'Tools::', 'A~uto complete', undef, '-doc_autocomplete', undef, 0, 1],
[ 'menu_radio_s', 'Tools::', '~Wrap', [qw/char word none/], undef, '-doc_wrap'],
[ 'menu_separator', 'Tools::', 't1' ],
[ 'menu_normal', 'Tools::', 'R~emove trailing spaces', 'doc_remove_trailing',],
[ 'menu_normal', 'Tools::', 'F~ix indentation', 'doc_fix_indent',],
);
}
sub navCollapse {
my $self = shift;
my $tree = $self->Subwidget('NAVTREE');
$tree->collapseAll;
}
sub navContextMenu {
my $self = shift;
my $nav = $self->Subwidget('NAVTREE');
my @items = @navcontextmenu;
#checking if Git is loaded;
my $git = $self->extGet('Plugins')->plugGet('Git');
push @items, [ 'menu_normal', 'c1', '~Add to project', 'git_add', 'git-icon',] if defined $git;
my $stack = $self->extGet('MenuBar')->menuStack(@items);
$nav->configure('-contextmenu', $stack);
}
sub navExpand {
my $self = shift;
my $tree = $self->Subwidget('NAVTREE');
$tree->expandAll;
}
sub SettingsPage {
my $self = shift;
my ($first) = $self->docList;
my $doc = $self->docGet($first);
return () unless defined $doc;
my $themefile = $doc->cget('-highlight_themefile');
my $historyfile = $self->extGet('ConfigFolder')->ConfigFolder . '/color_history';
my @opt = (
-applycall => sub {
my $themefile = shift;
my @list = $self->docList;
for (@list) {
my $d = $self->docGet($_);
$d->configure(-highlight_themefile => $themefile);
$d->configureTags;
}
},
-defaultbackground => $doc->cget('-contentbackground'),
-defaultforeground => $doc->cget('-contentforeground'),
-defaultfont => $doc->CWidg->Subwidget('XText')->cget('-font'),
-historyfile => $historyfile,
-extension => $self,
-themefile => $themefile,
);
return (
'Highlighting' => ['CoditTagsEditor', @opt]
)
}
sub ToolItems {
my $self = shift;
my @items = $self->SUPER::ToolItems;
return (@items,
# type label cmd icon help
[ 'tool_separator' ],
[ 'tool_button', 'Copy', '<Control-c>', 'edit-copy', 'Copy selected text to clipboard'],
[ 'tool_button', 'Cut', '<Control-x>', 'edit-cut', 'Move selected text to clipboard'],
[ 'tool_button', 'Paste', '<Control-v>', 'edit-paste', 'Paste clipboard content into document'],
[ 'tool_separator' ],
[ 'tool_button', 'Undo', '<Control-z>', 'edit-undo', 'Undo last action'],
[ 'tool_button', 'Redo', '<Control-Z>', 'edit-redo', 'Cancel undo'],
);
}
=back
=head1 LICENSE
Same as Perl.
=head1 AUTHOR
Hans Jeuken (hanje at cpan dot org)
=head1 BUGS
Unknown. If you find any, please report them here L<https://github.com/haje61/App-Codit/issues>.
=head1 SEE ALSO
=over 4
=item L<App::Codit::Macro>
=item L<Tk::AppWindow::Ext::MDI>
=back
=cut
1;
( run in 0.446 second using v1.01-cache-2.11-cpan-99c4e6809bf )