EditTextView.st
author claus
Sat, 11 Dec 1993 02:51:34 +0100
changeset 7 15a9291b9bd0
parent 5 7b4fb1b170e5
child 10 a288b33897a5
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     1
"
5
claus
parents: 3
diff changeset
     2
 COPYRIGHT (c) 1989 by Claus Gittinger
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     4
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    11
"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    12
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    13
TextView subclass:#EditTextView
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:'cursorLine cursorVisibleLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    15
                              cursorCol cursorShown prevCursorState
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    16
                              readOnly modified fixedSize
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    17
                              exceptionBlock
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    18
                              errorMessage
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    19
                              cursorFgColor cursorBgColor
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    20
                              undoAction  
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    21
                              typeOfSelection 
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    22
                              lastString lastReplacement lastAction 
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    23
                              replacing showMatchingParenthesis'
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    24
       classVariableNames:''
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    25
       poolDictionaries:''
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    26
       category:'Views-Text'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    27
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    28
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    29
EditTextView comment:'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    30
5
claus
parents: 3
diff changeset
    31
COPYRIGHT (c) 1989 by Claus Gittinger
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    32
            All Rights Reserved
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    33
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    34
$Header: /cvs/stx/stx/libwidg/EditTextView.st,v 1.4 1993-12-11 01:43:01 claus Exp $
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    35
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    36
written jun-89 by claus
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    37
'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    38
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    39
!EditTextView class methodsFor:'documentation'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    40
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    41
documentation
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    42
"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    43
    a view for editable text - adds editing functionality to TextView
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    44
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    45
    Instance variables:
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    46
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    47
    cursorLine              <Number>        line where cursor sits (1..)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    48
    cursorVisibleLine       <Number>        visible line where cursor sits (1..nLinesShown)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    49
    cursorCol               <Number>        col where cursor sits (1..)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    50
    cursorShown             <Boolean>       true, if cursor is currently shown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    51
    prevCursorState         <Boolean>       temporary
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    52
    readOnly                <Boolean>       true, if text may not be edited
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    53
    modified                <Boolean>       true, if text has been modified
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    54
    fixedSize               <Boolean>       true, if no lines may be added/removed
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    55
    exceptionBlock          <Block>         block to be evaluated when readonly text is about to be modified
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    56
    errorMessage            <String>        message text 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    57
    cursorFgColor           <Color>         color used for cursor drawing
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    58
    cursorBgColor           <Color>         color used for cursor drawing
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    59
    undoAction              <Block>         block which undoes last cut, paste or replace
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    60
    typeOfSelection         <Symbol>        #paste, if selection created by paste, nil otherwise
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    61
    lastCut                 <String>        last cut or replaced string
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    62
    lastReplacement         <String>        last replacement
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    63
    replacing               <Boolean>       true if entered characters replace last selection
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    64
    showMatchingParenthesis <Boolean>       if true, shows matching parenthesis
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    65
                                            when entering one
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    66
"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    67
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    68
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    69
!EditTextView methodsFor:'initialization'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    70
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    71
initialize
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    72
    super initialize.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    73
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    74
    self level:-1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    75
    errorMessage := 'Text may not me changed'.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    76
    readOnly := false.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    77
    fixedSize := false.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    78
    exceptionBlock := [:errorText | ].
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    79
    cursorShown := prevCursorState := true.
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    80
    cursorLine := 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    81
    cursorVisibleLine := 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    82
    cursorCol := 1.
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    83
    modified := false.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    84
    showMatchingParenthesis := false
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    85
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    86
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    87
initStyle
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    88
    super initStyle.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    89
    cursorFgColor := bgColor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    90
    device hasColors ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    91
        cursorBgColor := Color red
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    92
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    93
        cursorBgColor := fgColor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    94
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    95
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    96
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    97
initializeMiddleButtonMenu
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    98
    |labels|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    99
 
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   100
    labels := resources array:#(
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   101
"
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   102
                                       'undo'
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   103
"
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   104
                                       'again'
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   105
                                       '-'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   106
                                       'copy'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   107
                                       'cut'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   108
                                       'paste'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   109
                                       'replace'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   110
                                       '-'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   111
                                       'font'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   112
                                       '-'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   113
                                       'search'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   114
                                       'goto'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   115
                                       '-'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   116
                                       'indent'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   117
                                       '-'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   118
                                       'save'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   119
                                       'print').
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   120
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   121
    self middleButtonMenu:(PopUpMenu 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   122
                                labels:labels
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   123
                             selectors:#(
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   124
"
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   125
                                         undo
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   126
"
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   127
                                         again
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   128
                                         nil
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   129
                                         copySelection
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   130
                                         cut
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   131
                                         paste
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   132
                                         replace
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   133
                                         nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   134
                                         changeFont
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   135
                                         nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   136
                                         search
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   137
                                         gotoLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   138
                                         nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   139
                                         indent
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   140
                                         nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   141
                                         save
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   142
                                         print)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   143
                                receiver:self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   144
                                     for:self).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   145
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   146
    self enableOrDisableSelectionMenuEntries
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   147
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   148
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   149
realize
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   150
    super realize.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   151
    cursorFgColor := cursorFgColor on:device.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   152
    cursorBgColor := cursorBgColor on:device.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   153
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   154
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   155
!EditTextView methodsFor:'accessing'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   156
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   157
cursorForegroundColor:color1 backgroundColor:color2
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   158
    "set both cursor foreground and cursor background colors"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   159
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   160
    self hideCursor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   161
    cursorFgColor := color1 on:device.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   162
    cursorBgColor := color2 on:device.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   163
    self showCursor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   164
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   165
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   166
contents
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   167
    "answer the contents as a String"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   168
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   169
    list isNil ifTrue:[^ ''].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   170
    self removeTrailingBlankLines.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   171
    ^ list asString
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   172
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   173
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   174
list:something
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   175
    "position cursor home when setting contents"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   176
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   177
    super list:something.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   178
    self cursorHome
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   179
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   180
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   181
readOnly
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   182
    "make the text readonly"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   183
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   184
    readOnly := true
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   185
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   186
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   187
fixedSize
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   188
    "make the texts size fixed (no lines may be added)"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   189
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   190
    readOnly ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   191
        readOnly := true.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   192
        middleButtonMenu disable:#cut.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   193
        middleButtonMenu disable:#paste.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   194
        middleButtonMenu disable:#replace.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   195
        middleButtonMenu disable:#indent
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   196
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   197
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   198
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   199
exceptionBlock:aBlock
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   200
    "define the action to be triggered when user tries to modify
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   201
     readonly text"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   202
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   203
    exceptionBlock := aBlock
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   204
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   205
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   206
fromFile:aFileName
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   207
    "take contents from a named file"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   208
3
claus
parents: 0
diff changeset
   209
    self contents:(aFileName asFilename readStream contents)
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   210
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   211
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   212
modified:aBoolean
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   213
    "set the modified flag"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   214
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   215
    modified := aBoolean
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   216
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   217
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   218
modified
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   219
    "return true if text was modified"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   220
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   221
    ^ modified
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   222
!
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   223
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   224
characterUnderCursor
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   225
    "return the character under the cursor - space if behond line"
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   226
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   227
    ^ self characterAtLine:cursorLine col:cursorCol
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   228
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   229
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   230
!EditTextView methodsFor:'private'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   231
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   232
contentsChanged
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   233
    "triggered whenever text is changed"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   234
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   235
    super contentsChanged.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   236
    modified := true.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   237
    contentsWasSaved := false
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   238
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   239
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   240
!EditTextView methodsFor:'editing'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   241
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   242
mergeLine:lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   243
    "merge line lineNr with line lineNr+1"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   244
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   245
    |leftPart rightPart bothParts nextLineNr|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   246
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   247
    list isNil ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   248
        nextLineNr := lineNr + 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   249
        (nextLineNr > list size) ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   250
            (list at:lineNr) isNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   251
                leftPart := ''
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   252
            ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   253
                leftPart := list at:lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   254
            ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   255
            (list at:nextLineNr) isNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   256
                rightPart := ''
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   257
            ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   258
                rightPart := list at:nextLineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   259
            ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   260
            bothParts := leftPart , rightPart.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   261
            bothParts isBlank ifTrue:[bothParts := nil].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   262
            list at:lineNr put:bothParts.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   263
            self redrawLine:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   264
            self deleteLine:nextLineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   265
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   266
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   267
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   268
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   269
splitLine:lineNr before:colNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   270
    "split the line linNr before colNr; the right part (from colNr)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   271
     is cut off and inserted after lineNr; the view is redrawn"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   272
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   273
    |line lineSize leftRest rightRest visLine w      
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   274
     srcY    "{ Class: SmallInteger }" |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   275
    
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   276
    list isNil ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   277
        lineNr > (list size) ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   278
            (colNr == 1) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   279
                self insertLine:nil before:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   280
                ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   281
            ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   282
            line := list at:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   283
            line isNil ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   284
                lineSize := line size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   285
                (colNr <= lineSize) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   286
                    rightRest := line copyFrom:colNr to:lineSize.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   287
                    (colNr > 1) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   288
                        leftRest := line copyFrom:1 to:(colNr - 1)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   289
                    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   290
                ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   291
                    leftRest := line
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   292
                ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   293
            ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   294
            leftRest notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   295
                leftRest isBlank ifTrue:[leftRest := nil]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   296
            ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   297
            list at:lineNr put:leftRest.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   298
            modified := true.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   299
            contentsWasSaved := false.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   300
            self withoutRedrawInsertLine:rightRest before:(lineNr + 1).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   301
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   302
            visLine := self listLineToVisibleLine:(lineNr).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   303
            visLine notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   304
                w := self widthForScrollBetween:lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   305
                                            and:(firstLineShown + nLinesShown).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   306
                srcY := topMargin + (visLine * fontHeight).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   307
                self copyFrom:self x:textStartLeft y:srcY
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   308
                                 toX:textStartLeft y:(srcY + fontHeight)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   309
                               width:w
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   310
                              height:((nLinesShown - visLine - 1) * fontHeight).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   311
                self redrawLine:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   312
                self redrawLine:(lineNr + 1).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   313
                exposePending := true.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   314
                self waitForExpose
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   315
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   316
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   317
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   318
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   319
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   320
withoutRedrawInsertLine:aString before:lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   321
    "insert the argument, aString before line lineNr; the string
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   322
     becomes line nileNr; everything else is moved down; the view
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   323
     is not redrawn"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   324
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   325
    |line|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   326
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   327
    readOnly ifTrue: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   328
        exceptionBlock value:errorMessage.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   329
        ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   330
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   331
    line := aString.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   332
    line notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   333
        line isBlank ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   334
            line := nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   335
        ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   336
            (line occurrencesOf:(Character tab)) == 0 ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   337
                line := self withTabsExpanded:line
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   338
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   339
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   340
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   341
    list isNil ifTrue: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   342
        list := Text new:lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   343
    ] ifFalse: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   344
        list grow:((list size + 1) max:lineNr)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   345
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   346
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   347
    "I have changed 'replaceFrom:to:with:startingAt:' to correctly handle 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   348
     overlapping copy - if it didn't, we had to use:"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   349
"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   350
    index := list size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   351
    [index > lineNr] whileTrue: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   352
        pIndex := index - 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   353
        list at:index put:(list at:pIndex).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   354
        index := pIndex
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   355
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   356
"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   357
    list replaceFrom:(lineNr + 1) to:(list size) with:list startingAt:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   358
    list at:lineNr put:line.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   359
    self contentsChanged
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   360
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   361
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   362
insertLine:aString before:lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   363
    "insert the line aString before line lineNr"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   364
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   365
    |visLine w 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   366
     dstY "{ Class: SmallInteger }" |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   367
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   368
    self withoutRedrawInsertLine:aString before:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   369
    visLine := self listLineToVisibleLine:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   370
    visLine notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   371
        w := self widthForScrollBetween:lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   372
                                    and:(firstLineShown + nLinesShown).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   373
        dstY := topMargin + ((visLine ) * fontHeight).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   374
        self copyFrom:self x:textStartLeft y:(dstY - fontHeight)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   375
                         toX:textStartLeft y:dstY
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   376
                       width:w
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   377
                      height:((nLinesShown - visLine "- 1") * fontHeight).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   378
        self redrawVisibleLine:visLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   379
        exposePending := true.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   380
        self waitForExpose
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   381
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   382
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   383
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   384
insertLines:someText from:start to:end before:lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   385
    "insert a bunch of lines before line lineNr"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   386
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   387
    |visLine w nLines "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   388
     srcY "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   389
     dstY "{ Class: SmallInteger }" |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   390
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   391
    readOnly ifTrue: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   392
        exceptionBlock value:errorMessage.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   393
        ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   394
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   395
    self withoutRedrawInsertLines:someText
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   396
                             from:start to:end
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   397
                           before:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   398
    visLine := self listLineToVisibleLine:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   399
    visLine notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   400
        nLines := end - start + 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   401
        ((visLine + nLines) >= nLinesShown) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   402
            self redrawFromVisibleLine:visLine to:nLinesShown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   403
        ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   404
            w := self widthForScrollBetween:(lineNr + nLines)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   405
                                        and:(firstLineShown + nLines + nLinesShown).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   406
            srcY := topMargin + ((visLine - 1) * fontHeight).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   407
            dstY := srcY + (nLines * fontHeight).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   408
            self copyFrom:self x:textStartLeft y:srcY
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   409
                             toX:textStartLeft y:dstY
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   410
                           width:w
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   411
                          height:(height - dstY).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   412
            self redrawFromVisibleLine:visLine to:(visLine + nLines - 1).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   413
            exposePending := true.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   414
            self waitForExpose
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   415
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   416
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   417
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   418
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   419
insert:aCharacter atLine:lineNr col:colNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   420
    "insert a single character at lineNr/colNr"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   421
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   422
    |line lineSize newLine drawCharacterOnly|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   423
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   424
    readOnly ifTrue: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   425
        exceptionBlock value:errorMessage.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   426
        ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   427
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   428
    aCharacter == (Character cr) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   429
        self splitLine:lineNr before:colNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   430
        ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   431
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   432
    drawCharacterOnly := false.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   433
    self checkForExistingLine:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   434
    line := list at:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   435
    lineSize := line size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   436
    (aCharacter == Character space) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   437
        (colNr > lineSize)  ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   438
            ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   439
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   440
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   441
    (lineSize == 0) ifTrue: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   442
        newLine := String new:colNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   443
        drawCharacterOnly := true
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   444
    ] ifFalse: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   445
        (colNr > lineSize) ifTrue: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   446
            newLine := String new:colNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   447
            newLine replaceFrom:1 to:lineSize
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   448
                           with:line startingAt:1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   449
            drawCharacterOnly := true
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   450
        ] ifFalse: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   451
            newLine := String new:(lineSize + 1).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   452
            newLine replaceFrom:1 to:(colNr - 1)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   453
                           with:line startingAt:1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   454
            newLine replaceFrom:(colNr + 1) to:(lineSize + 1)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   455
                           with:line startingAt:colNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   456
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   457
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   458
    newLine at:colNr put:aCharacter.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   459
    aCharacter == (Character tab) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   460
        newLine := self withTabsExpanded:newLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   461
        drawCharacterOnly := false
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   462
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   463
    list at:lineNr put:newLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   464
    modified := true.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   465
    contentsWasSaved := false.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   466
    drawCharacterOnly ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   467
        self redrawLine:lineNr col:colNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   468
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   469
        self redrawLine:lineNr from:colNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   470
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   471
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   472
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   473
withoutRedrawInsertLines:lines from:start to:end before:lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   474
    "insert a bunch of lines before line lineNr; the view
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   475
     is not redrawn"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   476
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   477
    |newLine newLines nLines|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   478
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   479
    readOnly ifTrue: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   480
        exceptionBlock value:errorMessage.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   481
        ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   482
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   483
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   484
    nLines := end - start + 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   485
    newLines := Array new:(lines size).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   486
    start to:end do:[:index |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   487
        newLine := lines at:index.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   488
        newLine notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   489
            newLine isBlank ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   490
                newLine := nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   491
            ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   492
                (newLine occurrencesOf:(Character tab)) == 0 ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   493
                    newLine := self withTabsExpanded:newLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   494
                ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   495
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   496
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   497
        newLines at:index put:newLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   498
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   499
    list isNil ifTrue: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   500
        list := Text new:(lineNr + nLines + 1)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   501
    ] ifFalse: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   502
        list grow:((list size + nLines) max:(lineNr + nLines - 1))
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   503
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   504
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   505
    "I have changed 'replaceFrom:to:with:startingAt:' to correctly handle 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   506
     overlapping copy - if it didn't, we had to use:"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   507
"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   508
    index := list size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   509
    [index > lineNr] whileTrue: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   510
        pIndex := index - 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   511
        list at:index put:(list at:pIndex).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   512
        index := pIndex
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   513
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   514
"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   515
    list replaceFrom:(lineNr + nLines) to:(list size) with:list startingAt:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   516
    list replaceFrom:lineNr to:(lineNr + nLines - 1) with:newLines startingAt:start.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   517
    self contentsChanged
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   518
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   519
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   520
withoutRedrawInsertStringWithoutCRs:aString atLine:lineNr col:colNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   521
    "insert aString (which has no crs) at lineNr/colNr"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   522
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   523
    |strLen line lineSize newLine|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   524
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   525
    aString isNil ifTrue:[^ self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   526
    readOnly ifTrue: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   527
        exceptionBlock value:errorMessage.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   528
        ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   529
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   530
    strLen := aString size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   531
    self checkForExistingLine:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   532
    line := list at:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   533
    line notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   534
        lineSize := line size
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   535
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   536
        lineSize := 0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   537
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   538
    ((colNr == 1) and:[lineSize == 0]) ifTrue: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   539
        newLine := aString
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   540
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   541
        (lineSize == 0) ifTrue: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   542
            newLine := String new:(colNr + strLen - 1)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   543
        ] ifFalse: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   544
            (colNr > lineSize) ifTrue: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   545
                newLine := String new:(colNr + strLen - 1).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   546
                newLine replaceFrom:1 to:lineSize
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   547
                               with:line startingAt:1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   548
            ] ifFalse: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   549
                newLine := String new:(lineSize + strLen).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   550
                newLine replaceFrom:1 to:(colNr - 1)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   551
                               with:line startingAt:1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   552
                newLine replaceFrom:(colNr + strLen) to:(lineSize + strLen)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   553
                               with:line startingAt:colNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   554
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   555
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   556
        newLine replaceFrom:colNr to:(colNr + strLen - 1)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   557
                       with:aString startingAt:1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   558
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   559
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   560
    (aString occurrencesOf:(Character tab)) == 0 ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   561
        newLine := self withTabsExpanded:newLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   562
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   563
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   564
    list at:lineNr put:newLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   565
    modified := true.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   566
    contentsWasSaved := false.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   567
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   568
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   569
insertStringWithoutCRs:aString atLine:lineNr col:colNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   570
    "insert aString (which has no crs) at lineNr/colNr"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   571
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   572
    self withoutRedrawInsertStringWithoutCRs:aString atLine:lineNr col:colNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   573
    self redrawLine:lineNr from:colNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   574
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   575
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   576
insertStringWithoutCRsAtCursor:aString
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   577
    "insert a string (which has no crs) at cursor position
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   578
     - advance cursor"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   579
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   580
    aString notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   581
        self withCursorOffDo:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   582
            self insertString:aString atLine:cursorLine col:cursorCol.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   583
            cursorCol := cursorCol + aString size
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   584
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   585
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   586
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   587
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   588
insertCharAtCursor:aCharacter
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   589
    "insert a single character at cursor-position - advance cursor"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   590
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   591
    self withCursorOffDo:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   592
        self insert:aCharacter atLine:cursorLine col:cursorCol.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   593
        aCharacter == (Character cr) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   594
            self cursorReturn
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   595
        ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   596
            cursorCol := cursorCol + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   597
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   598
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   599
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   600
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   601
insertString:aString atLine:lineNr col:colNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   602
    "insert the string, aString at line/col;
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   603
     handle cr's correctly"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   604
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   605
    |start           "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   606
     stop            "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   607
     end             "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   608
     subString c
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   609
     l               "{ Class: SmallInteger }" |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   610
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   611
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   612
    aString isNil ifTrue:[^ self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   613
    ((aString occurrencesOf:(Character cr)) == 0) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   614
        ^ self insertStringWithoutCRs:aString atLine:lineNr col:colNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   615
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   616
    l := lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   617
    c := colNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   618
    start := 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   619
    end := aString size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   620
    [start <= end] whileTrue:[
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   621
        stop := aString indexOf:(Character cr) startingAt:start.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   622
        stop == 0 ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   623
            stop := end + 1
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   624
        ].
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   625
        subString := aString copyFrom:start to:(stop - 1).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   626
        self insertStringWithoutCRs:subString atLine:l col:c.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   627
        (stop < end) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   628
            c := c + subString size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   629
            self insert:(Character cr) atLine:l col:c.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   630
            l := l + 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   631
            c := 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   632
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   633
        start := stop + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   634
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   635
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   636
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   637
insertStringAtCursor:aString
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   638
    "insert the argument, aString at cursor position
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   639
     handle cr's correctly"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   640
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   641
    |start " { Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   642
     stop  " { Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   643
     end   " { Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   644
     subString|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   645
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   646
    aString isNil ifTrue:[^ self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   647
    ((aString occurrencesOf:(Character cr)) == 0) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   648
        ^ self insertStringWithoutCRsAtCursor:aString
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   649
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   650
    start := 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   651
    end := aString size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   652
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   653
    "insert the 1st line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   654
    (cursorCol ~~ 1) ifTrue:[
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   655
        stop := aString indexOf:(Character cr) startingAt:start.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   656
        stop == 0 ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   657
            stop := end + 1
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   658
        ].
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   659
        subString := aString copyFrom:start to:(stop - 1).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   660
        self insertStringWithoutCRsAtCursor:subString.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   661
        self insertCharAtCursor:(Character cr).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   662
        start := stop + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   663
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   664
    "insert the block of full lines"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   665
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   666
    [start <= end] whileTrue:[
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   667
        stop := aString indexOf:(Character cr) startingAt:start.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   668
        stop == 0 ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   669
            stop := end + 1
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   670
        ].
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   671
        subString := aString copyFrom:start to:(stop - 1).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   672
        self insertStringWithoutCRsAtCursor:subString.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   673
        (stop < end) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   674
            self insertCharAtCursor:(Character cr)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   675
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   676
        start := stop + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   677
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   678
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   679
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   680
insertSelectedStringAtCursor:aString
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   681
    "insert the argument, aString at cursor position and select it"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   682
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   683
    |startLine startCol|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   684
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   685
    startLine := cursorLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   686
    startCol := cursorCol.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   687
    self insertStringAtCursor:aString.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   688
    self selectFromLine:startLine col:startCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   689
                 toLine:cursorLine col:(cursorCol - 1)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   690
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   691
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   692
insertLines:lines withCr:withCr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   693
    "insert a bunch of lines at cursor position. Cursor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   694
     is moved behind insertion.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   695
     If withCr is true, append cr after last line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   696
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   697
    |start end nLines|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   698
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   699
    lines notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   700
        nLines := lines size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   701
        (nLines == 1) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   702
            self insertStringAtCursor:(lines at:1).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   703
            withCr ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   704
                self insertCharAtCursor:(Character cr)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   705
            ] 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   706
        ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   707
            (cursorCol ~~ 1) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   708
                self insertStringAtCursor:(lines at:1).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   709
                self insertCharAtCursor:(Character cr).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   710
                start := 2
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   711
            ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   712
                start := 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   713
            ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   714
            withCr ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   715
                end := nLines
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   716
            ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   717
                end := nLines - 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   718
            ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   719
            (start < nLines) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   720
                (end >= start) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   721
                    self withCursorOffDo:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   722
                        self insertLines:lines 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   723
                                    from:start to:end
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   724
                                  before:cursorLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   725
                        cursorLine := cursorLine + (end - start + 1).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   726
                        cursorVisibleLine := self absoluteLineToVisibleLine:
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   727
                                                                     cursorLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   728
                    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   729
                ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   730
            ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   731
            withCr ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   732
                "last line without cr"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   733
                self insertStringAtCursor:(lines at:nLines)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   734
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   735
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   736
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   737
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   738
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   739
deleteFromLine:startLine col:startCol toLine:endLine col:endCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   740
    "delete all text from startLine/startCol to endLine/endCol -
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   741
     joining lines if nescessary"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   742
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   743
    |line lineSize|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   744
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   745
    readOnly ifTrue: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   746
        exceptionBlock value:errorMessage.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   747
        ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   748
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   749
    list isNil ifTrue:[^ self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   750
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   751
    (startLine == endLine) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   752
        "delete chars within a line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   753
        self deleteCharsAtLine:startLine fromCol:startCol toCol:endCol.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   754
        ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   755
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   756
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   757
    ((startCol == 1) and:[endCol == 0]) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   758
        "delete full lines only"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   759
        endLine > startLine ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   760
            self deleteFromLine:startLine toLine:(endLine - 1)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   761
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   762
        ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   763
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   764
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   765
    "delete right rest of 1st line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   766
    self deleteCharsAtLine:startLine fromCol:startCol.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   767
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   768
    "delete the inner lines ..."
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   769
    endLine > (startLine + 1) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   770
        self deleteFromLine:(startLine + 1) toLine:(endLine - 1)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   771
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   772
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   773
    (endCol ~~ 0) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   774
        "delete the left rest of the last line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   775
        self deleteCharsAtLine:(startLine + 1) toCol:endCol.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   776
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   777
        "must add blanks, if startCal lies behond end of startLine"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   778
        line := list at:startLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   779
        lineSize := line size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   780
        (startCol > lineSize) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   781
            line isNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   782
                line := String new:(startCol - 1)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   783
            ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   784
                line := line , (String new:(startCol - 1 - lineSize))
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   785
            ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   786
            list at:startLine put:line.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   787
            modified := true.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   788
            contentsWasSaved := false.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   789
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   790
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   791
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   792
    "merge the left rest of 1st line with right rest of last line into one"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   793
    self mergeLine:startLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   794
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   795
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   796
deleteFromLine:startLineNr toLine:endLineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   797
    "delete some lines"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   798
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   799
    readOnly ifTrue: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   800
        exceptionBlock value:errorMessage.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   801
        ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   802
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   803
    list isNil ifTrue:[^ self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   804
    list removeFromIndex:startLineNr toIndex:endLineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   805
    self contentsChanged.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   806
    self redrawFromLine:startLineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   807
    (firstLineShown >= list size) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   808
        self makeLineVisible:(list size)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   809
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   810
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   811
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   812
deleteLineWithoutRedraw:lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   813
    "delete line - no redraw;
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   814
     answer true, if something was really deleted"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   815
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   816
    readOnly ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   817
        exceptionBlock value:errorMessage.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   818
        ^ false
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   819
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   820
    (list isNil or:[lineNr > list size]) ifTrue:[^ false].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   821
    list removeIndex:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   822
    self contentsChanged.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   823
    ^ true
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   824
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   825
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   826
deleteLinesWithoutRedrawFrom:startLine to:endLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   827
    "delete lines - no redraw;
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   828
     answer true, if something was really deleted"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   829
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   830
    |lastLine|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   831
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   832
    readOnly ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   833
        exceptionBlock value:errorMessage.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   834
        ^ false
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   835
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   836
    (list isNil or:[startLine > list size]) ifTrue:[^ false].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   837
    (endLine > list size) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   838
        lastLine := list size
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   839
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   840
        lastLine := endLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   841
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   842
    list removeFromIndex:startLine toIndex:lastLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   843
    self contentsChanged.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   844
    ^ true
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   845
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   846
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   847
deleteLine:lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   848
    "delete line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   849
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   850
    |visLine w
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   851
     srcY "{ Class: SmallInteger }" |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   852
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   853
    w := self widthForScrollBetween:lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   854
                                and:(firstLineShown + nLinesShown).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   855
    (self deleteLineWithoutRedraw:lineNr) ifFalse:[^ self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   856
    visLine := self listLineToVisibleLine:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   857
    visLine notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   858
        srcY :=  margin + topMargin + (visLine * fontHeight).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   859
        self copyFrom:self x:textStartLeft y:srcY
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   860
                         toX:textStartLeft y:(srcY - fontHeight)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   861
                       width:w height:((nLinesShown - visLine) * fontHeight).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   862
        self redrawVisibleLine:nFullLinesShown.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   863
        (nFullLinesShown ~~ nLinesShown) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   864
            self redrawVisibleLine:nLinesShown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   865
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   866
        exposePending := true.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   867
        self waitForExpose
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   868
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   869
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   870
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   871
deleteCursorLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   872
    "delete the line where the cursor sits"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   873
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   874
    self withCursorOffDo:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   875
         self deleteLine:cursorLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   876
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   877
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   878
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   879
removeTrailingBlankLines
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   880
    "remove all blank lines at end of text"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   881
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   882
    |lastLine "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   883
     line finished|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   884
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   885
    lastLine := list size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   886
    finished := false.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   887
    [finished] whileFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   888
        (lastLine <= 1) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   889
            finished := true
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   890
        ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   891
            line := list at:lastLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   892
            line notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   893
                line isBlank ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   894
                    list at:lastLine put:nil.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   895
                    line := nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   896
                ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   897
            ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   898
            line notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   899
                finished := true
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   900
            ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   901
                lastLine := lastLine - 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   902
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   903
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   904
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   905
    (lastLine ~~ list size) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   906
        list grow:lastLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   907
        self contentsChanged
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   908
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   909
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   910
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   911
deleteCharsAtLine:lineNr toCol:colNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   912
    "delete characters from start up to colNr in line lineNr"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   913
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   914
    |line lineSize newLine|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   915
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   916
    readOnly ifTrue: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   917
        exceptionBlock value:errorMessage.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   918
        ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   919
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   920
    list isNil ifTrue: [^self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   921
    (list size < lineNr) ifTrue: [^ self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   922
    line := list at:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   923
    line isNil ifTrue: [^self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   924
    lineSize := line size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   925
    (colNr >= lineSize) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   926
        newLine := nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   927
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   928
        newLine := line copyFrom:(colNr + 1) to:lineSize.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   929
        newLine isBlank ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   930
            newLine := nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   931
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   932
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   933
    list at:lineNr put:newLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   934
    modified := true.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   935
    contentsWasSaved := false.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   936
    self redrawLine:lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   937
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   938
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   939
deleteCharsAtLine:lineNr fromCol:colNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   940
    "delete characters from colNr up to the end in line lineNr"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   941
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   942
    |line newLine|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   943
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   944
    readOnly ifTrue: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   945
        exceptionBlock value:errorMessage.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   946
        ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   947
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   948
    list isNil ifTrue: [^self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   949
    (list size < lineNr) ifTrue: [^ self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   950
    line := list at:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   951
    line isNil ifTrue: [^self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   952
    (colNr > line size) ifTrue: [^ self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   953
    newLine := line copyFrom:1 to:(colNr - 1).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   954
    newLine isBlank ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   955
        newLine := nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   956
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   957
    list at:lineNr put:newLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   958
    modified := true.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   959
    contentsWasSaved := false.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   960
    self redrawLine:lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   961
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   962
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   963
deleteCharsAtLine:lineNr fromCol:startCol toCol:endCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   964
    "delete characters from startCol to endCol in line lineNr"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   965
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   966
    |line lineSize newLine|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   967
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   968
    readOnly ifTrue: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   969
        exceptionBlock value:errorMessage.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   970
        ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   971
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   972
    list isNil ifTrue: [^self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   973
    (list size < lineNr) ifTrue: [^ self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   974
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   975
    line := list at:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   976
    line isNil ifTrue: [^self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   977
    lineSize := line size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   978
    (startCol > lineSize) ifTrue: [^ self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   979
    (endCol == 0) ifTrue:[^ self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   980
    (endCol < startCol) ifTrue:[^ self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   981
    (startCol == endCol) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   982
        self deleteCharAtLine:lineNr col:startCol.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   983
        ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   984
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   985
    (endCol >= lineSize) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   986
        self deleteCharsAtLine:lineNr fromCol:startCol.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   987
        ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   988
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   989
    (startCol <= 1) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   990
        self deleteCharsAtLine:lineNr toCol:endCol.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   991
        ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   992
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   993
    newLine := (line copyFrom:1 to:(startCol - 1)) 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   994
               , (line copyFrom:(endCol + 1) to:lineSize).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   995
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   996
    newLine isBlank ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   997
        newLine := nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   998
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   999
    list at:lineNr put:newLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1000
    modified := true.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1001
    contentsWasSaved := false.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1002
    self redrawLine:lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1003
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1004
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1005
deleteCharAtLine:lineNr col:colNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1006
    "delete single character at colNr in line lineNr"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1007
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1008
    |line lineSize newLine drawCharacterOnly|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1009
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1010
    readOnly ifTrue: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1011
        exceptionBlock value:errorMessage.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1012
        ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1013
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1014
    list isNil ifTrue: [^self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1015
    (list size < lineNr) ifTrue: [^ self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1016
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1017
    line := list at:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1018
    line isNil ifTrue: [^self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1019
    lineSize := line size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1020
    (colNr > lineSize) ifTrue: [^ self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1021
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1022
    drawCharacterOnly := false.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1023
    (colNr == lineSize) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1024
        newLine := line copyFrom:1 to:(lineSize - 1).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1025
        fontIsFixedWidth ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1026
            drawCharacterOnly := true
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1027
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1028
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1029
        newLine := String new:(lineSize - 1).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1030
        newLine replaceFrom:1 to:(colNr - 1)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1031
                       with:line startingAt:1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1032
        newLine replaceFrom:colNr to:(lineSize - 1)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1033
                       with:line startingAt:(colNr + 1)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1034
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1035
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1036
    newLine isBlank ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1037
        newLine := nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1038
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1039
    list at:lineNr put:newLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1040
    modified := true.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1041
    contentsWasSaved := false.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1042
    drawCharacterOnly ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1043
        self redrawLine:lineNr col:colNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1044
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1045
        self redrawLine:lineNr from:colNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1046
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1047
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1048
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1049
deleteCharBeforeCursor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1050
    "delete single character to the left of cursor and move cursor to left"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1051
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1052
    |oldSize lineNrAboveCursor|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1053
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1054
    (cursorCol == 1) ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1055
         self withCursorOffDo:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1056
             cursorCol := cursorCol - 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1057
             self deleteCharAtLine:cursorLine col:cursorCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1058
         ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1059
    ] ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1060
         (cursorLine == 1) ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1061
             oldSize := 0.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1062
             lineNrAboveCursor := cursorLine - 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1063
             list notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1064
                (list size >= lineNrAboveCursor) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1065
                    (list at:lineNrAboveCursor) notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1066
                        oldSize := (list at:lineNrAboveCursor) size
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1067
                    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1068
                ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1069
             ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1070
             self mergeLine:lineNrAboveCursor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1071
             self withCursorOffDo:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1072
                 cursorLine := lineNrAboveCursor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1073
                 cursorCol := oldSize + 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1074
                 cursorVisibleLine := self listLineToVisibleLine:cursorLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1075
             ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1076
         ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1077
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1078
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1079
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1080
deleteCharAtCursor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1081
    "delete single character under cursor"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1082
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1083
    self withCursorOffDo:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1084
        self deleteCharAtLine:cursorLine col:cursorCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1085
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1086
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1087
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1088
deleteSelection
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1089
    "delete the selection"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1090
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1091
    |startLine startCol endLine endCol|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1092
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1093
    readOnly ifTrue: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1094
        exceptionBlock value:errorMessage.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1095
        ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1096
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1097
    selectionStartLine notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1098
        startLine := selectionStartLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1099
        startCol := selectionStartCol.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1100
        endLine := selectionEndLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1101
        endCol := selectionEndCol.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1102
        self withCursorOffDo:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1103
            self unselectWithoutRedraw.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1104
            self deleteFromLine:startLine col:startCol 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1105
                         toLine:endLine col:endCol.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1106
            cursorCol := startCol.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1107
            cursorLine := startLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1108
            cursorVisibleLine := self listLineToVisibleLine:cursorLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1109
            self makeLineVisible:cursorLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1110
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1111
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1112
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1113
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1114
replaceSelectionBy:something
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1115
    "delete the selection (if any) and insert something, a character or string;
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1116
     leave cursor after insertion"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1117
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1118
    |sel|
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1119
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1120
    sel := self selection.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1121
    sel notNil ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1122
        lastString := sel.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1123
        self deleteSelection.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1124
        replacing := true.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1125
        lastReplacement := ''
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1126
    ].
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1127
    (something isMemberOf:Character) ifTrue:[
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1128
        lastReplacement notNil ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1129
            lastReplacement := lastReplacement copyWith:something.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1130
        ].
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1131
        self insertCharAtCursor:something
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1132
    ] ifFalse:[
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1133
        lastReplacement := something.
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1134
        self insertStringAtCursor:something
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1135
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1136
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1137
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1138
!EditTextView methodsFor:'formatting'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1139
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1140
indent
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1141
    "indent selected line-range"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1142
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1143
    |start end|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1144
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1145
    start := selectionStartLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1146
    end := selectionEndLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1147
    (selectionEndCol == 0) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1148
        end := end - 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1149
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1150
    self unselect.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1151
    self indentFromLine:start toLine:end
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1152
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1153
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1154
indentFromLine:start toLine:end
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1155
    "indent a line-range - this is don by searching for the 
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1156
     last non-empty line before start, and change the indent
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1157
     of the line based on that indent."
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1158
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1159
    |leftStart lnr delta d line spaces|
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1160
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1161
    "find a line to base indent on..."
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1162
    leftStart := -1.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1163
    lnr := start.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1164
    [(leftStart == -1) and:[lnr ~~ 1]] whileTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1165
        lnr := lnr - 1.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1166
        leftStart := self leftIndentOfLine:lnr
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1167
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1168
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1169
    (leftStart == -1) ifTrue:[^ self].
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1170
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1171
    delta := leftStart - (self leftIndentOfLine:start).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1172
    (delta == 0) ifTrue:[^ self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1173
    (delta > 0) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1174
        spaces := String new:delta
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1175
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1176
    start to:end do:[:lineNr |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1177
        line := self listAt:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1178
        line notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1179
            line isBlank ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1180
                list at:lineNr put:nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1181
            ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1182
                (delta > 0) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1183
                    line := spaces , line
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1184
                ] ifFalse:[
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1185
                    "check if deletion is ok"
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1186
                    d := delta negated + 1.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1187
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1188
                    line size > d ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1189
                        (line copyFrom:1 to:(d - 1)) withoutSeparators isEmpty ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1190
                            line := line copyFrom:d
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1191
                        ]
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1192
                    ]
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1193
                ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1194
                list at:lineNr put:line.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1195
                modified := true.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1196
                contentsWasSaved := false.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1197
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1198
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1199
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1200
    self redrawFromLine:start to:end
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1201
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1202
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1203
!EditTextView methodsFor:'cursor handling'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1204
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1205
makeCursorVisible
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1206
    "scroll to make cursor visible"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1207
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1208
    cursorLine notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1209
        self makeLineVisible:cursorLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1210
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1211
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1212
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1213
drawCursorCharacter
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1214
    "draw the cursor - helper for many below"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1215
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1216
    |oldFg oldBg|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1217
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1218
    oldFg := fgColor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1219
    oldBg := bgColor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1220
    fgColor := cursorFgColor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1221
    bgColor := cursorBgColor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1222
    super redrawVisibleLine:cursorVisibleLine col:cursorCol.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1223
    fgColor := oldFg.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1224
    bgColor := oldBg
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1225
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1226
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1227
drawCursor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1228
    "draw the cursor if shown and cursor is visible"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1229
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1230
    shown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1231
        cursorVisibleLine notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1232
            self drawCursorCharacter
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1233
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1234
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1235
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1236
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1237
undrawCursor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1238
    "undraw the cursor"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1239
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1240
    cursorVisibleLine notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1241
        super redrawVisibleLine:cursorVisibleLine col:cursorCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1242
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1243
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1244
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1245
hideCursor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1246
    "make cursor invisible if currently visible; return true if cursor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1247
     was visible"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1248
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1249
    cursorShown ifTrue: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1250
        self undrawCursor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1251
        cursorShown := false.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1252
        ^ true
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1253
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1254
    ^ false
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1255
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1256
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1257
showCursor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1258
    "make cursor visible if currently invisible"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1259
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1260
    cursorShown ifFalse: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1261
        self drawCursor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1262
        cursorShown := true
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1263
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1264
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1265
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1266
withCursorOffDo:aBlock
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1267
    "evaluate aBlock with cursor off"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1268
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1269
    |cShown|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1270
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1271
    shown ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1272
        aBlock value
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1273
    ] ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1274
        cShown := self hideCursor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1275
        aBlock value.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1276
        cShown ifTrue:[self showCursor]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1277
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1278
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1279
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1280
cursorHome
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1281
    "scroll to top AND move cursor to first line of text"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1282
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1283
    self withCursorOffDo:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1284
        self scrollToTop.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1285
        cursorCol := 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1286
        cursorVisibleLine := 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1287
        cursorLine := self visibleLineToAbsoluteLine:1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1288
        self makeCursorVisible.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1289
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1290
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1291
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1292
cursorToBottom
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1293
    "move cursor to last line of text"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1294
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1295
    |newTop|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1296
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1297
    self withCursorOffDo:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1298
        newTop := list size - nFullLinesShown.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1299
        (newTop < 1) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1300
            newTop := 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1301
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1302
        self scrollToLine:newTop.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1303
        cursorCol := 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1304
        cursorLine := list size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1305
        cursorVisibleLine := self listLineToVisibleLine:cursorLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1306
        self makeCursorVisible.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1307
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1308
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1309
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1310
cursorUp
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1311
    "move cursor up; scroll if at start of visible text"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1312
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1313
    (cursorLine == 1) ifFalse: [
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1314
        cursorLine isNil ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1315
            cursorLine := firstLineShown + nFullLinesShown - 1.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1316
        ].
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1317
        self withCursorOffDo:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1318
            (cursorVisibleLine == 1) ifTrue:[self scrollUp].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1319
            cursorLine := cursorLine - 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1320
            cursorVisibleLine := self listLineToVisibleLine:cursorLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1321
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1322
        self makeCursorVisible.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1323
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1324
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1325
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1326
cursorDown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1327
    "move cursor down; scroll if at end of visible text"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1328
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1329
    cursorVisibleLine notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1330
        self withCursorOffDo:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1331
            (cursorVisibleLine >= nFullLinesShown) ifTrue:[self scrollDown].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1332
            cursorLine := cursorLine + 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1333
            cursorVisibleLine := self listLineToVisibleLine:cursorLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1334
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1335
    ] ifFalse:[
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1336
        cursorLine isNil ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1337
            cursorLine := firstLineShown
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1338
        ].
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1339
        cursorLine := cursorLine + 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1340
        cursorVisibleLine := self listLineToVisibleLine:cursorLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1341
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1342
    self makeCursorVisible.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1343
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1344
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1345
cursorLeft
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1346
    "move cursor to left"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1347
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1348
    (cursorCol == 1) ifFalse: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1349
        self withCursorOffDo:[cursorCol := cursorCol - 1]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1350
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1351
    self makeCursorVisible.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1352
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1353
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1354
cursorRight
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1355
    "move cursor to right"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1356
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1357
    self withCursorOffDo:[cursorCol := cursorCol + 1].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1358
    self makeCursorVisible.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1359
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1360
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1361
cursorToBeginOfLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1362
    "move cursor to start of current line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1363
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1364
    self withCursorOffDo:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1365
        cursorCol := 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1366
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1367
    self makeCursorVisible.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1368
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1369
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1370
cursorToEndOfLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1371
    "move cursor to end of current line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1372
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1373
    |line|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1374
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1375
    self withCursorOffDo:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1376
        line := list at:cursorLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1377
        cursorCol := line size + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1378
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1379
    self makeCursorVisible.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1380
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1381
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1382
cursorTab
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1383
    "move cursor to next tabstop"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1384
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1385
    self withCursorOffDo:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1386
        cursorCol := self nextTabAfter:cursorCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1387
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1388
    self makeCursorVisible.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1389
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1390
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1391
cursorBacktab
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1392
    "move cursor to prev tabstop"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1393
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1394
    self withCursorOffDo:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1395
        cursorCol := self prevTabBefore:cursorCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1396
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1397
    self makeCursorVisible.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1398
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1399
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1400
cursorReturn
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1401
    "move cursor to start of next line; scroll if at end of visible text"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1402
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1403
    self checkForExistingLine:(cursorLine + 1).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1404
    cursorVisibleLine notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1405
        nFullLinesShown notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1406
            (cursorVisibleLine >= nFullLinesShown) ifTrue:[self scrollDown]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1407
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1408
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1409
    self withCursorOffDo:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1410
        cursorCol := 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1411
        cursorLine := cursorLine + 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1412
        cursorVisibleLine := self listLineToVisibleLine:cursorLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1413
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1414
    self makeCursorVisible.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1415
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1416
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1417
cursorVisibleLine:visibleLineNr col:colNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1418
    "put cursor to visibleline/col"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1419
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1420
    self withCursorOffDo:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1421
        cursorLine := self visibleLineToAbsoluteLine:visibleLineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1422
        cursorVisibleLine := visibleLineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1423
        cursorCol := colNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1424
        (cursorCol < 1) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1425
            cursorCol := 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1426
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1427
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1428
    self makeCursorVisible.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1429
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1430
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1431
cursorX:x y:y
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1432
    "put cursor to position next to x/y coordinate in view"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1433
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1434
    |line col|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1435
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1436
    line := self visibleLineOfY:y.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1437
    col := self colOfX:x inVisibleLine:line.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1438
    self cursorVisibleLine:line col:col.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1439
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1440
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1441
cursorLine:line col:col
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1442
    "this positions onto physical - not visible - line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1443
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1444
    self withCursorOffDo:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1445
        cursorLine := line.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1446
        cursorVisibleLine := self listLineToVisibleLine:line.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1447
        cursorCol := col.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1448
        (cursorCol < 1) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1449
            cursorCol := 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1450
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1451
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1452
    self makeCursorVisible.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1453
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1454
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1455
cursorToTop
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1456
    "move cursor to absolute home"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1457
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1458
    self cursorLine:1 col:1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1459
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1460
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1461
gotoLine:aLineNumber
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1462
    self makeLineVisible:aLineNumber.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1463
    self cursorLine:aLineNumber col:1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1464
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1465
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1466
!EditTextView methodsFor:'undo & again'!
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1467
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1468
undo
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1469
    "currently not implemented"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1470
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1471
    undoAction notNil ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1472
        undoAction value
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1473
    ]
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1474
!
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1475
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1476
again
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1477
    "repeat the last action (which was a cut or replace).
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1478
     If current selection is not last string, search forward to
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1479
     next occurence of it before repeating the last operation."
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1480
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1481
    |s l c sel|
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1482
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1483
    lastString notNil ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1484
        s := lastString asString.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1485
        "remove final cr"
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1486
        s := s copyTo:(s size - 1).
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1487
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1488
        sel := self selection.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1489
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1490
        "if we are already there (after a find), ommit search"
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1491
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1492
        (sel notNil and:[sel asString withoutSeparators = s]) ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1493
            undoAction := [self insertLines:lastString atLine:cursorLine col:cursorCol].
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1494
            l := selectionStartLine "cursorLine". 
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1495
            c := selectionStartCol "cursorCol".
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1496
            self deleteSelection.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1497
            lastReplacement notNil ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1498
                self insertLines:lastReplacement asText withCr:false.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1499
                self selectFromLine:l col:c
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1500
                             toLine:cursorLine col:(cursorCol - 1).
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1501
            ].
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1502
            ^ true
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1503
        ].
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1504
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1505
        self searchForwardFor:s startingAtLine:cursorLine col:cursorCol
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1506
        ifFound:[:line :col |
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1507
            self selectFromLine:line col:col
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1508
                         toLine:line col:(col + s size - 1).
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1509
            self makeLineVisible:line.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1510
            undoAction := [self insertLines:lastString atLine:line col:col].
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1511
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1512
            self deleteSelection.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1513
            lastReplacement notNil ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1514
                self insertLines:lastReplacement asText withCr:false.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1515
                self selectFromLine:line col:col
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1516
                             toLine:cursorLine col:(cursorCol - 1).
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1517
            ].
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1518
            ^ true
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1519
        ] else:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1520
            self showNotFound.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1521
            ^ false
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1522
        ]
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1523
    ]
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1524
!
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1525
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1526
multipleAgain
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1527
    "repeat the last action (which was a cut or replace) until search fails"
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1528
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1529
    [self again] whileTrue:[]
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1530
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1531
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1532
!EditTextView methodsFor:'cut & paste'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1533
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1534
cut
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1535
    "cut selection into copybuffer"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1536
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1537
    |line col|
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1538
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1539
    lastString := self selection.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1540
    lastString notNil ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1541
        line := selectionStartLine.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1542
        col := selectionStartCol.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1543
        undoAction := [self insertLines:lastString atLine:line col:col].
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1544
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1545
        Smalltalk at:#CopyBuffer put:lastString.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1546
        self deleteSelection.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1547
        lastReplacement := nil
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1548
    ]
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1549
!
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1550
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1551
paste:someText
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1552
    "paste someText at cursor"
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1553
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1554
    |startLine startCol|
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1555
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1556
    someText notNil ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1557
        startLine := cursorLine.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1558
        startCol := cursorCol.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1559
        self insertLines:someText asText withCr:false.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1560
        self selectFromLine:startLine col:startCol
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1561
                     toLine:cursorLine col:(cursorCol - 1).
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1562
        typeOfSelection := #paste.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1563
        undoAction := [self cut].
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1564
    ]
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1565
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1566
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1567
paste
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1568
    "paste copybuffer at cursor"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1569
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1570
    self paste:(Smalltalk at:#CopyBuffer).
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1571
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1572
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1573
replace
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1574
    "replace selection by copybuffer"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1575
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1576
    |selected selectedString replacement replacementString 
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1577
     cutOffSpace addSpace t|
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1578
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1579
    selected := self selection.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1580
    selected isNil ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1581
        ^ self paste
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1582
    ].
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1583
    self deleteSelection.
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1584
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1585
    "take care, if we replace a selection without space by a word selected
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1586
     with one - in this case we usually do not want the space.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1587
     But, if we replace a word-selected selection by something without a
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1588
     space, we DO want the space added."
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1589
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1590
    cutOffSpace := false.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1591
    addSpace := false.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1592
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1593
    replacement := (Smalltalk at:#CopyBuffer) copy.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1594
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1595
    selected size == 1 ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1596
        selectedString := selected at:1.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1597
    ].
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1598
    selectedString notNil ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1599
        ((selectedString startsWith:' ') or:[selectedString endsWith:' ']) ifFalse:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1600
           "selection has no space"
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1601
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1602
            wordSelectStyle notNil ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1603
                cutOffSpace := true
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1604
            ]
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1605
        ] ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1606
            addSpace := true
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1607
        ]
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1608
    ].
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1609
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1610
    replacement size == 1 ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1611
        replacementString := replacement at:1.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1612
        cutOffSpace ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1613
            (replacementString startsWith:' ') ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1614
                replacementString := replacementString withoutSpaces
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1615
            ].
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1616
        ] ifFalse:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1617
            wordSelectStyle == #left ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1618
                "want a space at left"
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1619
                (replacementString startsWith:' ') ifFalse:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1620
                    replacementString := replacementString withoutSpaces.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1621
                    replacementString := ' ' , replacementString
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1622
                ]
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1623
            ].
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1624
            wordSelectStyle == #right ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1625
                "want a space at right"
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1626
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1627
                (replacementString endsWith:' ') ifFalse:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1628
                    replacementString := replacementString withoutSpaces.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1629
                    replacementString := replacementString , ' '
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1630
                ]
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1631
            ].
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1632
        ].
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1633
        replacement at:1 put: replacementString.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1634
        self paste:replacement
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1635
    ] ifFalse:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1636
        self paste:(Smalltalk at:#CopyBuffer).
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1637
    ].
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1638
    lastString := selectedString.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1639
    lastReplacement := Smalltalk at:#CopyBuffer
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1640
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1641
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1642
!EditTextView methodsFor:'selections'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1643
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1644
disableSelectionMenuEntries
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1645
    "disable relevant menu entries for a selection"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1646
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1647
    middleButtonMenu notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1648
        super disableSelectionMenuEntries.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1649
        middleButtonMenu disable:#cut.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1650
        middleButtonMenu disable:#replace.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1651
        middleButtonMenu disable:#indent
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1652
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1653
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1654
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1655
enableSelectionMenuEntries
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1656
    "enable relevant menu entries for a selection"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1657
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1658
    middleButtonMenu notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1659
        readOnly ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1660
            super disableSelectionMenuEntries.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1661
            middleButtonMenu disable:#cut.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1662
            middleButtonMenu disable:#replace.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1663
            middleButtonMenu disable:#indent.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1664
            middleButtonMenu disable:#paste.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1665
        ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1666
            super enableSelectionMenuEntries.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1667
            middleButtonMenu enable:#cut.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1668
            middleButtonMenu enable:#replace.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1669
            middleButtonMenu enable:#indent.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1670
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1671
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1672
! 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1673
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1674
unselect
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1675
    "forget and unhilight selection - must take care of cursor here"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1676
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1677
    self withCursorOffDo:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1678
        super unselect
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1679
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1680
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1681
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1682
selectCursorLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1683
    "select cursorline up to cursor position"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1684
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1685
    self selectFromLine:cursorLine col:1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1686
                 toLine:cursorLine col:cursorCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1687
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1688
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1689
selectWordUnderCursor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1690
    "select the word under the cursor"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1691
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1692
    self selectWordAtLine:cursorLine col:cursorCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1693
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1694
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1695
selectFromLine:startLine col:startCol toLine:endLine col:endCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1696
    "when a range is selected, position the cursor behind the selection
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1697
     for easier editing. Also typeOfSelection is nilled here."
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1698
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1699
    super selectFromLine:startLine col:startCol toLine:endLine col:endCol.
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1700
    self cursorLine:selectionEndLine col:(selectionEndCol + 1).
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1701
    typeOfSelection := nil
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1702
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1703
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1704
!EditTextView methodsFor:'scrolling'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1705
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1706
originWillChange
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1707
    "sent before scrolling - have to hide the cursor"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1708
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1709
    prevCursorState := cursorShown.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1710
    cursorShown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1711
        self hideCursor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1712
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1713
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1714
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1715
originChanged:delta
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1716
    "sent after scrolling - have to show the cursor if it was on before"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1717
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1718
    super originChanged:delta.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1719
    "
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1720
     should we move the cursor with the scroll - or leave it ?
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1721
    "
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1722
    cursorVisibleLine := self listLineToVisibleLine:cursorLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1723
    prevCursorState ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1724
        self showCursor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1725
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1726
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1727
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1728
pageUp
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1729
    "page up - to keep cursor on same visible line, it has to be moved
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1730
     within the real text  "
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1731
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1732
    |prevCursorLine|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1733
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1734
    prevCursorLine := cursorVisibleLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1735
    super pageUp.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1736
    self cursorVisibleLine:prevCursorLine col:cursorCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1737
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1738
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1739
pageDown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1740
    "page down - to keep cursor on same visible line, it has to be moved
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1741
     within the real text  "
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1742
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1743
    |prevCursorLine|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1744
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1745
    prevCursorLine := cursorVisibleLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1746
    super pageDown.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1747
    self cursorVisibleLine:prevCursorLine col:cursorCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1748
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1749
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1750
!EditTextView methodsFor:'searching'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1751
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1752
setSearchPattern
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1753
    "set the searchpattern from the selection if there is one, and position
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1754
     corsor to start of pattern"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1755
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1756
    |sel|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1757
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1758
    "if last operation was a replcae, set pattern to last
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1759
     original string (for search after again)"
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1760
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1761
    (lastString notNil and:[lastReplacement notNil]) ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1762
        searchPattern := lastString asString withoutSeparators.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1763
        ^ self
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1764
    ].
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1765
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1766
    sel := self selection.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1767
    sel notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1768
        self cursorLine:selectionStartLine col:selectionStartCol.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1769
        searchPattern := sel asString withoutSeparators
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1770
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1771
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1772
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1773
searchFwd:pattern
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1774
    "do the forward search"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1775
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1776
    self searchForwardFor:pattern startingAtLine:cursorLine col:cursorCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1777
    ifFound:[:line :col |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1778
        self cursorLine:line col:col.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1779
        self selectFromLine:line col:col
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1780
                     toLine:line col:(col + pattern size - 1).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1781
        self makeLineVisible:cursorLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1782
    ] else:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1783
        self showNotFound
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1784
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1785
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1786
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1787
searchBwd:pattern
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1788
    "do the backward search"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1789
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1790
    self searchBackwardFor:pattern startingAtLine:cursorLine col:cursorCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1791
    ifFound:[:line :col |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1792
        self cursorLine:line col:col.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1793
        self selectFromLine:line col:col
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1794
                     toLine:line col:(col + pattern size - 1).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1795
        self makeLineVisible:cursorLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1796
    ] else:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1797
        self showNotFound
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1798
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1799
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1800
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1801
searchForMatchingParenthesisFromLine:startLine col:startCol
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1802
                     ifFound:foundBlock 
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1803
                  ifNotFound:notFoundBlock
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1804
                     onError:failBlock
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1805
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1806
    "search for a matching parenthesis, parChar is one of '$( $[ ${ $) $] $}'. 
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1807
     Search for the corresponding character is done forward if its an opening,
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1808
     backwards if its a closing parenthesis.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1809
     Performs foundBlock with line/col as argument if found, notFoundBlock if not.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1810
     If there is a parth. nesting error, performs failBlock."
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1811
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1812
    |i direction lineString line col parChar charSet ignoreSet closingChar 
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1813
     ignoring delta endCol cc incSet decSet nesting maxLine|
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1814
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1815
    charSet := #( $( $) $[ $] ${ $} ).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1816
    ignoreSet := #( $' $" ).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1817
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1818
    parChar := self characterAtLine:startLine col:startCol.
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1819
    i := charSet indexOf:parChar.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1820
    i == 0 ifTrue:[
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1821
        ^ failBlock value   "not a parenthesis"
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1822
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1823
    direction := #( fwd bwd fwd bwd fwd bwd) at:i.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1824
    closingChar := #( $) $( $] $[ $} ${ ) at:i.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1825
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1826
    col := startCol.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1827
    line := startLine.
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1828
    direction == #fwd ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1829
        delta := 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1830
        incSet := #( $( $[ ${ ).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1831
        decSet := #( $) $] $} ).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1832
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1833
        delta := -1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1834
        incSet := #( $) $] $} ).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1835
        decSet := #( $( $[ ${ ).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1836
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1837
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1838
    nesting := 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1839
    ignoring := false.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1840
    lineString := list at:line.
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1841
    maxLine := list size.
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1842
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1843
    col := col + delta.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1844
    [nesting ~~ 0] whileTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1845
        lineString notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1846
            direction == #fwd ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1847
                endCol := lineString size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1848
            ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1849
                endCol := 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1850
            ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1851
            col to:endCol by:delta do:[:runCol |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1852
                cc := lineString at:runCol.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1853
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1854
                (ignoreSet includes:cc) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1855
                    ignoring := ignoring not
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1856
                ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1857
                ignoring ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1858
                    (incSet includes:cc) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1859
                        nesting := nesting + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1860
                    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1861
                        (decSet includes:cc) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1862
                            nesting := nesting - 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1863
                        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1864
                    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1865
                ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1866
                nesting == 0 ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1867
                    "check if legal"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1868
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1869
                    cc == closingChar ifFalse:[
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1870
                        ^ failBlock value
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1871
                    ].
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1872
                    ^ foundBlock value:line value:runCol.
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1873
                ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1874
            ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1875
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1876
        line := line + delta.
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1877
        (line < 1 or:[line > maxLine]) ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1878
            ^ failBlock value
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1879
        ].
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1880
        lineString := list at:line.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1881
        direction == #fwd ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1882
            col := 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1883
        ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1884
            col := lineString size
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1885
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1886
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1887
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1888
    ^ notFoundBlock value
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1889
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1890
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1891
searchForMatchingParenthesis
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1892
    "search for a matching parenthesis starting at cursor position. 
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1893
     Search for the corresponding character is done forward if its an opening, 
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1894
     backwards if its a closing parenthesis.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1895
     Positions the cursor if found, peeps if not"
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1896
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1897
     self searchForMatchingParenthesisFromLine:cursorLine col:cursorCol
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1898
                               ifFound:[:line :col | self cursorLine:line col:col]
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1899
                            ifNotFound:[self showNotFound]
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1900
                               onError:[device beep]
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1901
!
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1902
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1903
searchForAndSelectMatchingParenthesis
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1904
    "select characters enclosed by matching parenthesis if one is under cusor"
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1905
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1906
    self searchForMatchingParenthesisFromLine:cursorLine col:cursorCol
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1907
                              ifFound:[:line :col | 
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1908
                                          self selectFromLine:cursorLine col:cursorCol
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1909
                                                       toLine:line col:col
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1910
                                      ]
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1911
                           ifNotFound:[self showNotFound]
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1912
                              onError:[device beep]
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1913
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1914
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1915
!EditTextView methodsFor:'redrawing'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1916
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1917
redrawCursorIfBetweenVisibleLine:startVisLine and:endVisLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1918
    "redraw the cursor, if it sits in a line range"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1919
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1920
    cursorShown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1921
        cursorVisibleLine notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1922
            (cursorVisibleLine between:startVisLine and:endVisLine) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1923
                self drawCursorCharacter
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1924
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1925
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1926
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1927
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1928
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1929
redrawCursorIfInVisibleLine:visLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1930
    "redraw the cursor, if it sits in visible line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1931
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1932
    cursorShown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1933
        (visLine == cursorVisibleLine) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1934
            self drawCursorCharacter
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1935
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1936
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1937
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1938
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1939
redrawFromVisibleLine:startVisLine to:endVisLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1940
    "redraw a visible line range"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1941
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1942
    super redrawFromVisibleLine:startVisLine to:endVisLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1943
    self redrawCursorIfBetweenVisibleLine:startVisLine and:endVisLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1944
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1945
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1946
redrawVisibleLine:visLine col:colNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1947
    "redraw the single character in visibleline at colNr"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1948
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1949
    cursorShown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1950
        (visLine == cursorVisibleLine) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1951
            (colNr == cursorCol) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1952
                self drawCursorCharacter.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1953
                ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1954
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1955
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1956
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1957
    super redrawVisibleLine:visLine col:colNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1958
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1959
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1960
redrawVisibleLine:visLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1961
    "redraw a visible line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1962
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1963
    super redrawVisibleLine:visLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1964
    self redrawCursorIfInVisibleLine:visLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1965
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1966
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1967
redrawVisibleLine:visLine from:startCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1968
    "redraw a visible line from startCol to the end of line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1969
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1970
    super redrawVisibleLine:visLine from:startCol.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1971
    self redrawCursorIfInVisibleLine:visLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1972
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1973
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1974
redrawVisibleLine:visLine from:startCol to:endCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1975
    "redraw a visible line from startCol to endCol"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1976
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1977
    super redrawVisibleLine:visLine from:startCol to:endCol.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1978
    self redrawCursorIfInVisibleLine:visLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1979
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1980
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1981
!EditTextView methodsFor:'event processing'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1982
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1983
sizeChanged:how
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1984
    "make certain, cursor is visible after the sizechange"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1985
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1986
    |cv|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1987
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1988
    cv := cursorVisibleLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1989
    super sizeChanged:how.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1990
    cv notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1991
        self makeLineVisible:cursorLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1992
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1993
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1994
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1995
keyPress:key x:x y:y
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1996
    "handle keyboard input"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1997
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1998
    (key isMemberOf:Character) ifTrue:[
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  1999
        typeOfSelection == #paste ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2000
            "pasted selection will NOT be replaced by keystroke"
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2001
            self unselect
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2002
        ].
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2003
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2004
        "replace selection by what is typed in -
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2005
         if word was selected with a space, keep it"
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2006
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2007
        (wordSelectStyle == #left) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2008
            self replaceSelectionBy:(' ' copyWith:key)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2009
        ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2010
            (wordSelectStyle == #right) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2011
                self replaceSelectionBy:(key asString , ' ').
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2012
                self cursorLeft
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2013
            ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2014
                self replaceSelectionBy:key
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2015
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2016
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2017
        wordSelectStyle := nil.
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2018
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2019
        showMatchingParenthesis ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2020
            "emacs style parenthesis shower"
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2021
            (#( $( $) $[ $] ${ $} ) includes:key) ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2022
            self searchForMatchingParenthesisFromLine:cursorLine col:(cursorCol - 1)
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2023
                               ifFound:[:line :col |
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2024
                                            |savLine savCol|
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2025
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2026
                                            savLine := cursorLine.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2027
                                            savCol := cursorCol.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2028
                                            self cursorLine:line col:col.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2029
                                            device synchronizeOutput.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2030
                                            OperatingSystem millisecondDelay:200.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2031
                                            self cursorLine:savLine col:savCol
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2032
                                       ]
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2033
                            ifNotFound:[self showNotFound]
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2034
                               onError:[device beep]
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2035
            ].
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2036
        ].
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2037
        ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2038
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2039
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2040
    replacing := false.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2041
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2042
    "Fn      pastes a key-sequence,
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2043
     Cmd-Fn evaluates a key-sequence"
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2044
    (#(F1 F2 F3 F4 F5 F6 F7 F8 F9) includes:key) ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2045
        device shiftDown ifFalse:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2046
            device metaDown ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2047
                (Smalltalk at:#FunctionKeySequences) notNil ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2048
                    Parser evaluate:((Smalltalk at:#FunctionKeySequences) at:key) asString
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2049
                           receiver:self
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2050
                          notifying:nil
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2051
                ]
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2052
            ] ifFalse:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2053
                (Smalltalk at:#FunctionKeySequences) notNil ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2054
                    self paste:((Smalltalk at:#FunctionKeySequences) at:key) asText.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2055
                ]
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2056
            ]
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2057
        ]
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2058
    ].
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2059
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2060
    ((key == #Paste) or:[key == #Insert]) ifTrue:[self paste. ^self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2061
    (key == #Cut) ifTrue:[self cut. ^self].
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2062
    (key == #Again) ifTrue:[self again. ^self].
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2063
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2064
    (key == #Replace) ifTrue:[self replace. ^self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2065
    (key == #Cmdw) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2066
        self makeCursorVisible.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2067
        self selectWordUnderCursor. 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2068
        ^self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2069
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2070
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2071
    (key == #Ctrlm) ifTrue:[
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2072
        self searchForMatchingParenthesis. 
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2073
        ^self
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2074
    ].
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2075
    (key == #Cmdm) ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2076
        self searchForAndSelectMatchingParenthesis. 
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2077
        ^self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2078
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2079
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2080
    (key == #Ctrlb) ifTrue:[self unselect. self cursorLeft. ^self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2081
    (key == #Ctrlf) ifTrue:[self unselect. self cursorRight. ^self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2082
    (key == #Ctrln) ifTrue:[self unselect. self cursorDown. ^self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2083
    (key == #Ctrlp) ifTrue:[self unselect. self cursorUp. ^self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2084
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2085
    (key == #Ctrla) ifTrue:[self cursorToBeginOfLine. ^self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2086
    (key == #Ctrle) ifTrue:[self cursorToEndOfLine. ^self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2087
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2088
    (key == #CursorRight)     ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2089
        self unselect. self cursorRight. ^self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2090
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2091
    (key == #CursorLeft)      ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2092
        self unselect. self cursorLeft. ^self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2093
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2094
    (key == #CursorUp)        ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2095
        self unselect. self cursorUp. ^self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2096
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2097
    (key == #CursorDown)      ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2098
        self unselect. self cursorDown. ^self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2099
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2100
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2101
    (key == #Return)    ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2102
        device shiftDown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2103
            self unselect. self cursorReturn. ^self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2104
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2105
        self unselect. 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2106
        self makeCursorVisible.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2107
        self insertCharAtCursor:(Character cr). 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2108
        ^self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2109
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2110
    (key == #Tab) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2111
        device shiftDown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2112
            self unselect. self cursorBacktab. ^self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2113
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2114
        self unselect. self cursorTab. ^self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2115
    ].
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2116
    (key == #BackSpace) ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2117
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2118
" old version just did unselect here "
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2119
"
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2120
        self unselect. 
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2121
"
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2122
" new version deletes selection if any "
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2123
        selectionStartLine notNil ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2124
            Smalltalk at:#CopyBuffer put:(self selection).
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2125
            self deleteSelection. ^ self
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2126
        ].
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2127
        self makeCursorVisible.
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2128
        self deleteCharBeforeCursor. ^self
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2129
    ].
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2130
    (key == #Delete)    ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2131
        selectionStartLine notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2132
            Smalltalk at:#CopyBuffer put:(self selection).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2133
            self deleteSelection. ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2134
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2135
        self makeCursorVisible.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2136
        self deleteCharBeforeCursor. ^self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2137
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2138
    (key == #Home)      ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2139
        self unselect. self cursorHome. ^self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2140
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2141
    (key == #End)       ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2142
        self unselect. self cursorToBottom. ^self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2143
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2144
    (key == #Escape)    ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2145
        self makeCursorVisible.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2146
        self unselect. self selectCursorLine. ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2147
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2148
    (key == #DeleteLine)    ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2149
        self makeCursorVisible.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2150
        self unselect. self deleteCursorLine. ^self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2151
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2152
    super keyPress:key x:x y:y
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2153
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2154
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2155
buttonPress:button x:x y:y
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2156
    "hide the cursor when button is activated"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2157
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2158
    (button == 1) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2159
        self hideCursor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2160
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2161
    super buttonPress:button x:x y:y
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2162
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2163
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2164
buttonRelease:button x:x y:y
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2165
    "move the cursor to the click-position of previous button press"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2166
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2167
    (button == 1) ifTrue:[
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2168
        lastString := nil. "new selection invalidates remembered string"
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2169
        typeOfSelection := nil. 
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2170
        selectionStartLine isNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2171
            clickCol notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2172
                self cursorLine:clickLine col:clickCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2173
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2174
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2175
        self showCursor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2176
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2177
    super buttonRelease:button x:x y:y
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2178
! !