The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Kephra::Dialog::Exit;
our $VERSION = '0.07';

use strict;
use warnings;


sub save_on_exit {

	# checking settings if i should save or quit without question
	my $save = Kephra::API::settings()->{file}{save}{b4_quit};
	if    ($save eq '0') {                         return}
	elsif ($save eq '1') {&Kephra::File::save_all; return}

	# count unsaved dacuments?
	my $unsaved_docs = 0;
	for ( @{ Kephra::Document::Data::all_nr() } ) {
		$unsaved_docs++ if Kephra::Document::Data::get_attribute('modified', $_)
	}

	# if so...
	if ($unsaved_docs) {
		my $d18n = Kephra::Config::Localisation::strings()->{dialog};
		my $dialog = $Kephra::app{dialog}{exit} = Wx::Dialog->new(
			Kephra::App::Window::_ref(), -1,
			$d18n->{file}{quit_unsaved}, [-1,-1], [-1,-1],
			&Wx::wxNO_FULL_REPAINT_ON_RESIZE | &Wx::wxCAPTION | &Wx::wxSTAY_ON_TOP,
		);

		# starting dialog layout
		my $v_sizer      = Wx::BoxSizer->new(&Wx::wxVERTICAL);
		my $h_sizer      = Wx::BoxSizer->new(&Wx::wxHORIZONTAL);
		my $button_sizer = Wx::GridSizer->new( 1, 4, 0, 25 );
		my ( @temp_sizer, @check_boxes );
		my ( $border,     $b_border, $max_width ) = ( 10, 20, 0 );
		my ( $x_size,     $y_size );
		my ( $file_name,  $check_label );
		my $align_lc = &Wx::wxLEFT | &Wx::wxALIGN_CENTER_VERTICAL;
		my $l10n = Kephra::Config::Localisation::strings()->{dialog}{general};

		# generating checkbox list of unsaved files
		for ( @{ Kephra::Document::Data::all_nr() } ) {
			if ( Kephra::Document::Data::get_attribute('modified', $_) ) {
				$file_name = 
					Kephra::Document::Data::get_file_path($_) || 
					Kephra::Config::Localisation::strings()->{app}{general}{untitled};
				$check_label = 1 + $_ . ' ' . $file_name;
				$check_boxes[$_] = Wx::CheckBox->new($dialog, -1, $check_label);
				$check_boxes[$_]->SetValue(1);
				$temp_sizer[$_] = Wx::BoxSizer->new(&Wx::wxVERTICAL);
				$temp_sizer[$_]->Add($check_boxes[$_], 0, $align_lc, $border );
				$v_sizer->Add( $temp_sizer[$_], 0, &Wx::wxTOP, $border );
				$temp_sizer[$_]->Fit($dialog);
				( $x_size, $y_size ) = $dialog->GetSizeWH;
				$max_width = $x_size if $x_size > $max_width;
			}
		}

		# seperator, label, buttons
		my $base_line = Wx::StaticLine->new( $dialog, -1, [-1,-1],[2000,2], &Wx::wxLI_HORIZONTAL);
		my $save_label = Wx::StaticText->new($dialog, -1, $l10n->{save} . ' : ');
		$dialog->{save_all} = Wx::Button->new($dialog, -1, $l10n->{all} );
		$dialog->{save_sel} = Wx::Button->new($dialog, -1, $l10n->{selected} );
		$dialog->{save_none}= Wx::Button->new($dialog, -1, $l10n->{none} );
		$dialog->{cancel}   = Wx::Button->new($dialog, -1, $l10n->{cancel} );

		# events
		Wx::Event::EVT_BUTTON( $dialog, $dialog->{save_all}, sub 
			{ &quit_dialog; &Kephra::File::save_all} );
		Wx::Event::EVT_BUTTON( $dialog, $dialog->{save_sel}, sub 
			{&quit_dialog; save_selected(\@check_boxes)} );
		Wx::Event::EVT_BUTTON( $dialog, $dialog->{save_none},sub {quit_dialog()} );
		Wx::Event::EVT_BUTTON( $dialog, $dialog->{cancel},   sub
			{ &quit_dialog; $dialog->{cancel} = 1; } );
		Wx::Event::EVT_CLOSE( $dialog,                      sub {quit_dialog()});

		# assembling the fix bottom of dialog layout
		$h_sizer->Add( $save_label, 0, $align_lc, $border );
		$h_sizer->Add( $dialog->{save_all}, 0, $align_lc, $border + $b_border );
		$h_sizer->Add( $dialog->{save_sel}, 0, $align_lc, $b_border );
		$h_sizer->Add( $dialog->{save_none}, 0, $align_lc, $b_border );
		$h_sizer->Add( $dialog->{cancel}, 0, $align_lc, $b_border );

		$v_sizer->Add( $base_line, 0, &Wx::wxTOP | &Wx::wxCENTER, $border );
		$v_sizer->Add( $h_sizer, 0, &Wx::wxTOP, $border );

		# figuring dialog size
		$dialog->SetSizer($v_sizer);
		$v_sizer->Fit($dialog);
		( $x_size, $y_size ) = $dialog->GetSizeWH;
		$h_sizer->Fit($dialog);
		( $x_size, ) = $dialog->GetSizeWH;
		$max_width = $x_size if ( $x_size > $max_width );
		$dialog->SetSize( $max_width + $b_border, $y_size + $border );

		# go
		$dialog->SetAutoLayout(1);
		$dialog->CenterOnScreen;
		$dialog->ShowModal;
		return 'cancel' if $dialog->{cancel} == 1;
	}
}

# internal subs
################
sub save_selected {
	my @check_boxes = @{ shift; };
	for ( 0 .. $#check_boxes ) {
		Kephra::File::_save_nr($_)
			if ref $check_boxes[$_] ne '' and $check_boxes[$_]->GetValue;
	}
}

sub quit_dialog {
	my ( $win, $event ) = @_;
	$Kephra::app{dialog}{exit}->Destroy;
}

1;