Text-Editor-Easy

 view release on metacpan or  search on metacpan

lib/Text/Editor/Easy/Abstract/Key.pm  view on Meta::CPAN

        else {
            if ( $ref_line == $select_ref->{'stop_line'} ) {
                Text::Editor::Easy::Abstract::line_deselect( $self, $ref_line );
            }
            if ( $select_ref->{'mode'} eq '+' ) {
                # Changement possible de sens
                #my $search_line = $line->next;
                my ( $ref_search_line ) = $self->[PARENT]->next_line( $ref_line );
                my $ref_start_line = $select_ref->{'start_line'};
                my $ref_stop_line = $select_ref->{'stop_line'};
                while ( $ref_search_line 
                    and $ref_search_line ne  $ref_start_line
                    and $ref_search_line ne  $ref_stop_line ) {
                            #
                            #
                        ( $ref_search_line ) = $self->[PARENT]->next_line( $ref_search_line );
                }
                if ( $ref_search_line == $ref_start_line ) {
                        # Inversion
                        $select_ref->{'mode'} = '-';
                }
                Text::Editor::Easy::Abstract::line_select( $self, $ref_line, 0, $pos);
            }
            else {
                Text::Editor::Easy::Abstract::line_select( $self, $ref_line, $pos);
            }
        }
        
        $select_ref->{'stop_line'} = $ref_line;
        $select_ref->{'stop_pos'} = $pos;
        $self->[SELECTION] = $select_ref;
}

sub copy {
    my ($self) = @_;

    #Appel au thread manager à faire. Pour l'instant, méthode provisoire et très longue
    my $select_ref = set_start_selection_point($self, '+');
    return if ( ! defined $select_ref->{'stop_line'} );
    my ( $ref_start_line, $start_pos, $ref_stop_line, $stop_pos );
    if ( $select_ref->{'mode'} eq '+' ) {
        $ref_start_line = $select_ref->{'start_line'};
        $start_pos = $select_ref->{'start_pos'};
        $ref_stop_line = $select_ref->{'stop_line'};
        $stop_pos = $select_ref->{'stop_pos'};
    }
    else {
        $ref_start_line = $select_ref->{'stop_line'};
        $start_pos = $select_ref->{'stop_pos'};
        $ref_stop_line = $select_ref->{'start_line'};
        $stop_pos = $select_ref->{'start_pos'};
    }
    my $buffer;
    if ( $ref_stop_line != $ref_start_line ) {
        $buffer = substr ( $self->[PARENT]->line_text( $ref_start_line) , $start_pos );
        $buffer .= "\n";
    }
    else {
        $buffer = substr ( $self->[PARENT]->line_text( $ref_start_line ), $start_pos, $stop_pos - $start_pos );
        print "========Debut buffer\n$buffer\n==========Fin buffer\n";
        Text::Editor::Easy->clipboard_set($buffer);
        return;
    }
    my ( $ref_line ) = $self->[PARENT]->next_line( $ref_start_line );
    while ( defined $ref_line and $ref_line != $ref_stop_line ) {
        $ref_start_line = $ref_line;
        $buffer .= $self->[PARENT]->line_text( $ref_line ) . "\n";
        ( $ref_line ) = $self->[PARENT]->next_line( $ref_line );
    }
    if ( ! defined $ref_line ) { # stop line suppressed ?
        print STDERR "Can't copy : no line after line with reference $ref_start_line\n";
        return;
    }
    $buffer .= substr ( $self->[PARENT]->line_text( $ref_line ), 0, $stop_pos );
    #print "========Debut buffer\n$buffer\n==========Fin buffer\n";
    Text::Editor::Easy->clipboard_set($buffer);
    return $buffer;
    #$buffer = $self->cursor->line->text . "\n";
}

sub delete_selection {
    my ( $self ) = @_;
    
    my $select_ref = $self->[SELECTION];
    
    return if ( ! defined $select_ref );
    
    my ( $ref_start_line, $start_pos, $ref_stop_line, $stop_pos );
    if ( $select_ref->{'mode'} eq '+' ) {
        $ref_start_line = $select_ref->{'start_line'};
        $start_pos = $select_ref->{'start_pos'};
        $ref_stop_line = $select_ref->{'stop_line'};
        $stop_pos = $select_ref->{'stop_pos'};
    }
    else {
        $ref_start_line = $select_ref->{'stop_line'};
        $start_pos = $select_ref->{'stop_pos'};
        $ref_stop_line = $select_ref->{'start_line'};
        $stop_pos = $select_ref->{'start_pos'};
    }
    
    #print "Dans delete_selection : $start_pos|$stop_pos\n";
    if ( $ref_start_line ==  $ref_stop_line ) {
        my ( $text, $ref_cursor_line ) = Text::Editor::Easy::Abstract::cursor_line($self);
        if ( $ref_cursor_line != $ref_stop_line ) {
            # Bizarre !
            print STDERR "Cursor not on start or end of selection : the text won't be suppressed\n";
            Text::Editor::Easy::Abstract::deselect( $self );
            undef $self->[SELECTION];
            return;
        }
        my $new_text = substr ( $text, 0, $start_pos) . substr( $text, $stop_pos);
        #print "Nouveau text de $ref_stop_line : |$new_text| START POS : $start_pos\n";
        Text::Editor::Easy::Abstract::cursor_set( $self, $start_pos, $ref_stop_line );
        Text::Editor::Easy::Abstract::line_set($self, $ref_stop_line, $new_text);
        Text::Editor::Easy::Abstract::line_deselect( $self, $ref_stop_line );
        undef $self->[SELECTION];
        return;
    }
    
    my ( $text, $ref_cursor_line ) = Text::Editor::Easy::Abstract::cursor_line($self);
    if ( $ref_cursor_line != $ref_start_line and $ref_cursor_line != $ref_stop_line ) {
        print STDERR "Cursor not on start or end of selection : the text won't be suppressed\n";
        Text::Editor::Easy::Abstract::deselect( $self );
        undef $self->[SELECTION];
        return;
    }

    my ( $at, $from );
    if ( Text::Editor::Easy::Abstract::line_displayed( $self, $ref_start_line ) ) {
        $at = Text::Editor::Easy::Abstract::line_top_ord ( $self, $ref_start_line );
        $from = 'top';        
    }
    elsif ( Text::Editor::Easy::Abstract::line_displayed( $self, $ref_stop_line ) ) {
        $at = Text::Editor::Easy::Abstract::line_bottom_ord ( $self, $ref_stop_line );
        $from = 'bottom';



( run in 1.431 second using v1.01-cache-2.11-cpan-84e82930d8c )