package Kephra::Document;
our $VERSION = '0.53';
use strict;
use warnings;
sub _file_config { Kephra::File::_config() }
sub _new_if_allowed {
# new(empty), add(open) restore(open session)
my $mode = shift;
my $ep = Kephra::App::EditPanel::_ref();
my $file = Kephra::Document::Data::get_file_path();
my $old_doc_nr= Kephra::Document::Data::current_nr();
my $new_doc_nr= Kephra::Document::Data::get_value('buffer');
my $config = _file_config()->{open};
# check settings
# in single doc mode close previous doc first
if ( $config->{single_doc} == 1 ) {
Kephra::File::close_current();
return 0;
}
unless ( $mode eq 'new' ) {
if ($ep->GetText eq '' and $ep->GetModify == 0 and (not $file or not -e $file)){
return $old_doc_nr
if ($config->{into_empty_doc} == 1)
or ($config->{into_only_empty_doc} == 1 and $new_doc_nr == 1 );
}
}
# still there? good, now we make a new document
Kephra::Document::Data::create_slot($new_doc_nr);
Kephra::App::TabBar::add_edit_tab($new_doc_nr);
Kephra::App::EditPanel::apply_settings_here
( Kephra::Document::Data::_ep($new_doc_nr) );
Kephra::Document::Data::inc_value('buffer');
return $new_doc_nr;
}
sub _load_file_in_buffer {
my $file = shift;
my $doc_nr = shift || Kephra::Document::Data::current_nr();
my $ep = Kephra::Document::Data::_ep($doc_nr);
return unless -r $file and Kephra::App::EditPanel::is( $ep );
$ep->ClearAll();
# retrieve if utf is set
Kephra::Document::Data::set_file_path($file, $doc_nr);
if (Kephra::File::IO::open_buffer($doc_nr) ){
Kephra::File::_remember_save_moment($doc_nr);
$ep->EmptyUndoBuffer;
$ep->SetSavePoint;
Kephra::Document::Data::inc_value('loaded');
}
}
#
sub new { # make document empty and reset all document properties to default
my $old_nr = Kephra::Document::Data::current_nr();
my $doc_nr = _new_if_allowed('new');
Kephra::Document::Data::set_previous_nr( $old_nr );
Kephra::Document::Data::set_current_nr( $doc_nr );
Kephra::App::TabBar::raise_tab_by_doc_nr($doc_nr);
&reset($doc_nr);
Kephra::EventTable::trigger('document.new');
}
sub reset { # restore once opened file from its settings
my $doc_nr = Kephra::Document::Data::validate_doc_nr(shift);
$doc_nr = Kephra::Document::Data::current_nr() unless defined $doc_nr;
my $ep = Kephra::Document::Data::_ep( $doc_nr );
Kephra::Document::Property::set_readonly(0, $doc_nr);
$ep->ClearAll;
$ep->EmptyUndoBuffer;
$ep->SetSavePoint;
Kephra::Document::Data::set_attributes_to_default($doc_nr, '');
Kephra::Document::Data::evaluate_attributes($doc_nr);
Kephra::App::Window::refresh_title();
Kephra::App::TabBar::refresh_label($doc_nr);
Kephra::App::StatusBar::refresh_all_cells();
Kephra::Edit::Marker::delete_doc($doc_nr);
Kephra::App::EditPanel::Margin::autosize_line_number($ep, $doc_nr);
}
sub restore { # add newly opened file from known settings
my %file_settings = %{ shift; };
my $file = $file_settings{file_path};
my $config = _file_config();
if ( -e $file ) {
# open only text files and empty files
return if $config->{open}{only_text} == 1 and -B $file;
# check if file is already open and goto this already opened
return if $config->{open}{each_once} == 1
and Kephra::Document::Data::file_already_open($file);
my $doc_nr = _new_if_allowed('restore');
$file_settings{ep_ref} = Kephra::Document::Data::_ep($doc_nr);
Kephra::Document::Data::set_all_attributes(\%file_settings, $doc_nr);
_load_file_in_buffer($file, $doc_nr);
Kephra::Document::Data::set_current_nr($doc_nr);
Kephra::Document::Data::set_file_path($file, $doc_nr);
Kephra::Document::Data::evaluate_attributes($doc_nr);
Kephra::App::TabBar::raise_tab_by_doc_nr($doc_nr);
return $doc_nr;
}
return -1;
}
sub add { # create a new document if settings allow it
my $file = shift;
my $config = _file_config();
my $old_nr = Kephra::Document::Data::current_nr();
if ( defined $file and -e $file ) {
$file = Kephra::Config::standartize_path_slashes( $file );
# open only text files and empty files
# return if -B $file and $config->{open}{only_text} == 1;
# check if file is already open and goto this already opened
my $other_nr = Kephra::Document::Data::nr_from_file_path($file);
return Kephra::Document::Change::to_nr( $other_nr )
if $config->{open}{each_once} == 1 and $other_nr > -1;
# save constantly changing settings
Kephra::Document::Data::update_attributes();
# create new edit panel
my $doc_nr = _new_if_allowed('add') || 0;
# return because settings didn't allow new doc
return if $doc_nr > 0 and $doc_nr == $old_nr;
Kephra::Document::Data::set_current_nr($doc_nr);
Kephra::Document::Data::set_previous_nr($old_nr);
# load default settings for doc attributes
Kephra::Document::Data::set_attributes_to_default($doc_nr, $file);
_load_file_in_buffer($file, $doc_nr);
Kephra::Document::Property::convert_EOL(), Kephra::File::_save_nr($doc_nr)
unless Kephra::Document::Data::get_attribute{'EOL',$doc_nr} eq 'auto';
Kephra::Document::Data::evaluate_attributes($doc_nr);
Kephra::App::Window::refresh_title();
Kephra::App::TabBar::raise_tab_by_doc_nr($doc_nr);
Kephra::App::EditPanel::Margin::autosize_line_number();
Kephra::EventTable::trigger('document.new');
Kephra::EventTable::trigger('document.list');
}
}
# document wide coverter
sub convert_indent2tabs { _edit( \&Kephra::Edit::Convert::indent2tabs )}
sub convert_indent2spaces { _edit( \&Kephra::Edit::Convert::indent2spaces)}
sub convert_spaces2tabs { _edit( \&Kephra::Edit::Convert::spaces2tabs )}
sub convert_tabs2spaces { _edit( \&Kephra::Edit::Convert::tabs2spaces )}
sub del_trailing_spaces { _edit( \&Kephra::Edit::Format::del_trailing_spaces)}
sub save_state {
}
sub restore_styte {
}
#
sub _edit {
my $coderef = shift;
return unless ref $coderef eq 'CODE';
Kephra::Edit::_save_positions();
Kephra::Edit::Select::all();
&$coderef();
Kephra::Edit::_restore_positions();
1;
}
sub do_with_all {
my $code = shift;
return unless ref $code eq 'CODE';
my $nr = Kephra::Document::Data::current_nr();
my $attr = Kephra::Document::Data::_attributes();
Kephra::Document::Data::update_attributes();
for ( @{ Kephra::Document::Data::all_nr() } ) {
Kephra::Document::Data::set_current_nr($_);
&$code( $attr->[$_] );
}
Kephra::Document::Data::set_current_nr($nr);
Kephra::Document::Data::evaluate_attributes($nr);
}
1;
=head1 NAME
Kephra::Document - general doc functions
=head1 DESCRIPTION
=cut