ETxtView.st
author claus
Tue, 09 May 1995 03:57:16 +0200
changeset 125 3ffa271732f7
parent 123 25ab7ade4d3a
child 127 462396b08e30
permissions -rw-r--r--
.
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
59
450ce95a72a4 *** empty log message ***
claus
parents: 46
diff changeset
     3
	      All Rights Reserved
0
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
121
claus
parents: 118
diff changeset
    13
'From Smalltalk/X, Version:2.10.5 on 4-may-1995 at 6:17:08 am'!
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
    14
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    15
TextView subclass:#EditTextView
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
    16
	 instanceVariableNames:'cursorLine cursorVisibleLine cursorCol cursorShown
118
claus
parents: 105
diff changeset
    17
		prevCursorState readOnly modified fixedSize exceptionBlock
claus
parents: 105
diff changeset
    18
		errorMessage cursorFgColor cursorBgColor cursorType undoAction
claus
parents: 105
diff changeset
    19
		typeOfSelection lastString lastReplacement lastAction replacing
125
claus
parents: 123
diff changeset
    20
		showMatchingParenthesis hasKeyboardFocus acceptAction lockUpdates'
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
    21
	 classVariableNames:'DefaultCursorForegroundColor DefaultCursorBackgroundColor
118
claus
parents: 105
diff changeset
    22
		DefaultCursorType'
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
    23
	 poolDictionaries:''
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
    24
	 category:'Views-Text'
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    25
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    26
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    27
EditTextView comment:'
5
claus
parents: 3
diff changeset
    28
COPYRIGHT (c) 1989 by Claus Gittinger
59
450ce95a72a4 *** empty log message ***
claus
parents: 46
diff changeset
    29
	    All Rights Reserved
450ce95a72a4 *** empty log message ***
claus
parents: 46
diff changeset
    30
125
claus
parents: 123
diff changeset
    31
$Header: /cvs/stx/stx/libwidg/Attic/ETxtView.st,v 1.27 1995-05-09 01:55:23 claus Exp $
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    32
'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    33
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    34
!EditTextView class methodsFor:'documentation'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    35
33
5eeef3ea8ebd added access methods for cursorLine & cursorCol
claus
parents: 25
diff changeset
    36
copyright
5eeef3ea8ebd added access methods for cursorLine & cursorCol
claus
parents: 25
diff changeset
    37
"
5eeef3ea8ebd added access methods for cursorLine & cursorCol
claus
parents: 25
diff changeset
    38
 COPYRIGHT (c) 1989 by Claus Gittinger
59
450ce95a72a4 *** empty log message ***
claus
parents: 46
diff changeset
    39
	      All Rights Reserved
33
5eeef3ea8ebd added access methods for cursorLine & cursorCol
claus
parents: 25
diff changeset
    40
5eeef3ea8ebd added access methods for cursorLine & cursorCol
claus
parents: 25
diff changeset
    41
 This software is furnished under a license and may be used
5eeef3ea8ebd added access methods for cursorLine & cursorCol
claus
parents: 25
diff changeset
    42
 only in accordance with the terms of that license and with the
5eeef3ea8ebd added access methods for cursorLine & cursorCol
claus
parents: 25
diff changeset
    43
 inclusion of the above copyright notice.   This software may not
5eeef3ea8ebd added access methods for cursorLine & cursorCol
claus
parents: 25
diff changeset
    44
 be provided or otherwise made available to, or used by, any
5eeef3ea8ebd added access methods for cursorLine & cursorCol
claus
parents: 25
diff changeset
    45
 other person.  No title to or ownership of the software is
5eeef3ea8ebd added access methods for cursorLine & cursorCol
claus
parents: 25
diff changeset
    46
 hereby transferred.
5eeef3ea8ebd added access methods for cursorLine & cursorCol
claus
parents: 25
diff changeset
    47
"
5eeef3ea8ebd added access methods for cursorLine & cursorCol
claus
parents: 25
diff changeset
    48
!
5eeef3ea8ebd added access methods for cursorLine & cursorCol
claus
parents: 25
diff changeset
    49
5eeef3ea8ebd added access methods for cursorLine & cursorCol
claus
parents: 25
diff changeset
    50
version
5eeef3ea8ebd added access methods for cursorLine & cursorCol
claus
parents: 25
diff changeset
    51
"
125
claus
parents: 123
diff changeset
    52
$Header: /cvs/stx/stx/libwidg/Attic/ETxtView.st,v 1.27 1995-05-09 01:55:23 claus Exp $
33
5eeef3ea8ebd added access methods for cursorLine & cursorCol
claus
parents: 25
diff changeset
    53
"
5eeef3ea8ebd added access methods for cursorLine & cursorCol
claus
parents: 25
diff changeset
    54
!
5eeef3ea8ebd added access methods for cursorLine & cursorCol
claus
parents: 25
diff changeset
    55
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    56
documentation
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    57
"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    58
    a view for editable text - adds editing functionality to TextView
125
claus
parents: 123
diff changeset
    59
    Also, it adds accept functionality, and defines a new actionBlock: 
claus
parents: 123
diff changeset
    60
      acceptAction to be performed for accept
claus
parents: 123
diff changeset
    61
claus
parents: 123
diff changeset
    62
    If used with a model, this is informed by sending it a changeMsg with
claus
parents: 123
diff changeset
    63
    the current contents as argument.
claus
parents: 123
diff changeset
    64
    (however, it is possible to define moth changeMsg and acceptAction)
claus
parents: 123
diff changeset
    65
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    66
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    67
    Instance variables:
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    68
121
claus
parents: 118
diff changeset
    69
      cursorLine              <Number>        line where cursor sits (1..)
claus
parents: 118
diff changeset
    70
      cursorVisibleLine       <Number>        visible line where cursor sits (1..nLinesShown)
claus
parents: 118
diff changeset
    71
      cursorCol               <Number>        col where cursor sits (1..)
claus
parents: 118
diff changeset
    72
      cursorShown             <Boolean>       true, if cursor is currently shown
claus
parents: 118
diff changeset
    73
      prevCursorState         <Boolean>       temporary
claus
parents: 118
diff changeset
    74
      readOnly                <Boolean>       true, if text may not be edited
claus
parents: 118
diff changeset
    75
      modified                <Boolean>       true, if text has been modified
claus
parents: 118
diff changeset
    76
      fixedSize               <Boolean>       true, if no lines may be added/removed
claus
parents: 118
diff changeset
    77
      exceptionBlock          <Block>         block to be evaluated when readonly text is about to be modified
claus
parents: 118
diff changeset
    78
      errorMessage            <String>        message text 
claus
parents: 118
diff changeset
    79
      cursorFgColor           <Color>         color used for cursor drawing
claus
parents: 118
diff changeset
    80
      cursorBgColor           <Color>         color used for cursor drawing
claus
parents: 118
diff changeset
    81
      cursorType              <Symbol>        how the cursor is drawn; currently implemented
claus
parents: 118
diff changeset
    82
					      are #block (solid-block cursor), #ibeam
claus
parents: 118
diff changeset
    83
					      (vertical bar at insertion point) 
claus
parents: 118
diff changeset
    84
					      and #caret (caret below insertion-point)
claus
parents: 118
diff changeset
    85
      undoAction              <Block>         block which undoes last cut, paste or replace
claus
parents: 118
diff changeset
    86
      typeOfSelection         <Symbol>        #paste, if selection created by paste, nil otherwise
claus
parents: 118
diff changeset
    87
      lastCut                 <String>        last cut or replaced string
claus
parents: 118
diff changeset
    88
      lastReplacement         <String>        last replacement
claus
parents: 118
diff changeset
    89
      replacing               <Boolean>       true if entered characters replace last selection
claus
parents: 118
diff changeset
    90
      showMatchingParenthesis <Boolean>       if true, shows matching parenthesis
claus
parents: 118
diff changeset
    91
					      when entering one
33
5eeef3ea8ebd added access methods for cursorLine & cursorCol
claus
parents: 25
diff changeset
    92
5eeef3ea8ebd added access methods for cursorLine & cursorCol
claus
parents: 25
diff changeset
    93
    used globals:
5eeef3ea8ebd added access methods for cursorLine & cursorCol
claus
parents: 25
diff changeset
    94
121
claus
parents: 118
diff changeset
    95
      DeleteHistory           <Text>          last 1000 lines of deleted text
claus
parents: 118
diff changeset
    96
					      (but only if this variable exists already)
claus
parents: 118
diff changeset
    97
claus
parents: 118
diff changeset
    98
    styleSheet parameters:
claus
parents: 118
diff changeset
    99
claus
parents: 118
diff changeset
   100
      textCursorForegroundColor <Color>       cursor fg color; default: text background
claus
parents: 118
diff changeset
   101
      textCursorBackgroundColor <Color>       cursor bg color; default: text foreground
claus
parents: 118
diff changeset
   102
      textCursorType            <Symbol>      cursor type; default:  #block
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   103
"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   104
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   105
59
450ce95a72a4 *** empty log message ***
claus
parents: 46
diff changeset
   106
!EditTextView class methodsFor:'defaults'!
450ce95a72a4 *** empty log message ***
claus
parents: 46
diff changeset
   107
450ce95a72a4 *** empty log message ***
claus
parents: 46
diff changeset
   108
updateStyleCache
60
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   109
    DefaultCursorForegroundColor := StyleSheet colorAt:'textCursorForegroundColor'.
f3c738c24ce6 mostly style
claus
parents: 59
diff changeset
   110
    DefaultCursorBackgroundColor := StyleSheet colorAt:'textCursorBackgroundColor'.
59
450ce95a72a4 *** empty log message ***
claus
parents: 46
diff changeset
   111
    DefaultCursorType := StyleSheet at:'textCursorType' default:#block.
450ce95a72a4 *** empty log message ***
claus
parents: 46
diff changeset
   112
! !
450ce95a72a4 *** empty log message ***
claus
parents: 46
diff changeset
   113
125
claus
parents: 123
diff changeset
   114
!EditTextView methodsFor:'change & update '!
claus
parents: 123
diff changeset
   115
claus
parents: 123
diff changeset
   116
getListFromModel
claus
parents: 123
diff changeset
   117
    "get my contents from the model.
claus
parents: 123
diff changeset
   118
     Redefined to ignore updates resulting from my own change."
claus
parents: 123
diff changeset
   119
claus
parents: 123
diff changeset
   120
    "
claus
parents: 123
diff changeset
   121
     ignore updates from my own change
claus
parents: 123
diff changeset
   122
    "
claus
parents: 123
diff changeset
   123
    lockUpdates ifTrue:[
claus
parents: 123
diff changeset
   124
	lockUpdates := false.
claus
parents: 123
diff changeset
   125
	^ self
claus
parents: 123
diff changeset
   126
    ].
claus
parents: 123
diff changeset
   127
    ^ super getListFromModel
claus
parents: 123
diff changeset
   128
!
claus
parents: 123
diff changeset
   129
claus
parents: 123
diff changeset
   130
accept
claus
parents: 123
diff changeset
   131
    "accept the current contents by executing the accept-action and/or
claus
parents: 123
diff changeset
   132
     changeMessage."
claus
parents: 123
diff changeset
   133
claus
parents: 123
diff changeset
   134
    lockUpdates := true.
claus
parents: 123
diff changeset
   135
     "/
claus
parents: 123
diff changeset
   136
     "/ ST/X way of doing things
claus
parents: 123
diff changeset
   137
     "/ as a historic (and temporary) leftover,
claus
parents: 123
diff changeset
   138
     "/ the block is called with a stringCollection
claus
parents: 123
diff changeset
   139
     "/ - not with the actual string
claus
parents: 123
diff changeset
   140
     "/
claus
parents: 123
diff changeset
   141
     acceptAction notNil ifTrue:[
claus
parents: 123
diff changeset
   142
	 acceptAction value:self list
claus
parents: 123
diff changeset
   143
     ].
claus
parents: 123
diff changeset
   144
claus
parents: 123
diff changeset
   145
     "/
claus
parents: 123
diff changeset
   146
     "/ ST-80 way of doing it
claus
parents: 123
diff changeset
   147
     "/
claus
parents: 123
diff changeset
   148
     self sendChangeMessageWith:self contents.
claus
parents: 123
diff changeset
   149
claus
parents: 123
diff changeset
   150
    lockUpdates := false.
claus
parents: 123
diff changeset
   151
! !
claus
parents: 123
diff changeset
   152
121
claus
parents: 118
diff changeset
   153
!EditTextView methodsFor:'event processing'!
claus
parents: 118
diff changeset
   154
claus
parents: 118
diff changeset
   155
hasKeyboardFocus:aBoolean
claus
parents: 118
diff changeset
   156
    "sent by a delegate to make me show a block cursor
claus
parents: 118
diff changeset
   157
     (otherwise, I would not know about this)"
claus
parents: 118
diff changeset
   158
claus
parents: 118
diff changeset
   159
    hasKeyboardFocus := aBoolean.
claus
parents: 118
diff changeset
   160
    cursorShown ifTrue: [self drawCursor].
claus
parents: 118
diff changeset
   161
!
claus
parents: 118
diff changeset
   162
claus
parents: 118
diff changeset
   163
pointerLeave:state
claus
parents: 118
diff changeset
   164
    (windowGroup isNil or:[windowGroup focusView isNil]) ifTrue:[
claus
parents: 118
diff changeset
   165
	hasKeyboardFocus := false.
claus
parents: 118
diff changeset
   166
	cursorShown ifTrue: [self drawCursor].
claus
parents: 118
diff changeset
   167
    ].
claus
parents: 118
diff changeset
   168
    super pointerLeave:state
claus
parents: 118
diff changeset
   169
!
claus
parents: 118
diff changeset
   170
claus
parents: 118
diff changeset
   171
pointerEnter:state x:x y:y
claus
parents: 118
diff changeset
   172
    (windowGroup isNil or:[windowGroup focusView isNil]) ifTrue:[
claus
parents: 118
diff changeset
   173
	hasKeyboardFocus := true.
claus
parents: 118
diff changeset
   174
	cursorShown ifTrue: [self drawCursor].
claus
parents: 118
diff changeset
   175
    ].
claus
parents: 118
diff changeset
   176
    super pointerEnter:state x:x y:y
claus
parents: 118
diff changeset
   177
!
claus
parents: 118
diff changeset
   178
claus
parents: 118
diff changeset
   179
buttonRelease:button x:x y:y
claus
parents: 118
diff changeset
   180
    "move the cursor to the click-position of previous button press"
claus
parents: 118
diff changeset
   181
claus
parents: 118
diff changeset
   182
    ((button == 1) or:[button == #select]) ifTrue:[
claus
parents: 118
diff changeset
   183
	typeOfSelection := nil. 
claus
parents: 118
diff changeset
   184
	selectionStartLine isNil ifTrue:[
claus
parents: 118
diff changeset
   185
	    clickCol notNil ifTrue:[
claus
parents: 118
diff changeset
   186
		self cursorLine:clickLine col:clickCol
claus
parents: 118
diff changeset
   187
	    ]
claus
parents: 118
diff changeset
   188
	] ifFalse:[
claus
parents: 118
diff changeset
   189
	    lastString := nil. "new selection invalidates remembered string"
claus
parents: 118
diff changeset
   190
	].
claus
parents: 118
diff changeset
   191
	self showCursor
claus
parents: 118
diff changeset
   192
    ].
claus
parents: 118
diff changeset
   193
    super buttonRelease:button x:x y:y
claus
parents: 118
diff changeset
   194
!
claus
parents: 118
diff changeset
   195
claus
parents: 118
diff changeset
   196
buttonPress:button x:x y:y
claus
parents: 118
diff changeset
   197
    "hide the cursor when button is activated"
claus
parents: 118
diff changeset
   198
claus
parents: 118
diff changeset
   199
    hasKeyboardFocus := true.
claus
parents: 118
diff changeset
   200
    cursorShown ifTrue: [self drawCursor].
claus
parents: 118
diff changeset
   201
claus
parents: 118
diff changeset
   202
    ((button == 1) or:[button == #select]) ifTrue:[
claus
parents: 118
diff changeset
   203
	self hideCursor
claus
parents: 118
diff changeset
   204
    ].
claus
parents: 118
diff changeset
   205
    (button == #paste) ifTrue:[
claus
parents: 118
diff changeset
   206
	self paste.
claus
parents: 118
diff changeset
   207
	^ self
claus
parents: 118
diff changeset
   208
    ].
claus
parents: 118
diff changeset
   209
    super buttonPress:button x:x y:y
claus
parents: 118
diff changeset
   210
!
claus
parents: 118
diff changeset
   211
claus
parents: 118
diff changeset
   212
sizeChanged:how
claus
parents: 118
diff changeset
   213
    "make certain, cursor is visible after the sizechange"
claus
parents: 118
diff changeset
   214
claus
parents: 118
diff changeset
   215
    |cv|
claus
parents: 118
diff changeset
   216
claus
parents: 118
diff changeset
   217
    cv := cursorVisibleLine.
claus
parents: 118
diff changeset
   218
    super sizeChanged:how.
claus
parents: 118
diff changeset
   219
    cv notNil ifTrue:[
claus
parents: 118
diff changeset
   220
	self makeLineVisible:cursorLine
claus
parents: 118
diff changeset
   221
    ]
claus
parents: 118
diff changeset
   222
!
claus
parents: 118
diff changeset
   223
claus
parents: 118
diff changeset
   224
keyPress:key x:x y:y
claus
parents: 118
diff changeset
   225
    "handle keyboard input"
claus
parents: 118
diff changeset
   226
125
claus
parents: 123
diff changeset
   227
    |sensor n|
claus
parents: 123
diff changeset
   228
claus
parents: 123
diff changeset
   229
    sensor := self sensor.
claus
parents: 123
diff changeset
   230
121
claus
parents: 118
diff changeset
   231
    (key isMemberOf:Character) ifTrue:[
claus
parents: 118
diff changeset
   232
	readOnly ifFalse:[
claus
parents: 118
diff changeset
   233
	    typeOfSelection == #paste ifTrue:[
claus
parents: 118
diff changeset
   234
		"pasted selection will NOT be replaced by keystroke"
claus
parents: 118
diff changeset
   235
		self unselect
claus
parents: 118
diff changeset
   236
	    ].
claus
parents: 118
diff changeset
   237
claus
parents: 118
diff changeset
   238
	    "replace selection by what is typed in -
claus
parents: 118
diff changeset
   239
	     if word was selected with a space, keep it"
claus
parents: 118
diff changeset
   240
claus
parents: 118
diff changeset
   241
	    (selectStyle == #wordLeft) ifTrue:[
claus
parents: 118
diff changeset
   242
		self replaceSelectionBy:(' ' copyWith:key)
claus
parents: 118
diff changeset
   243
	    ] ifFalse:[
claus
parents: 118
diff changeset
   244
		(selectStyle == #wordRight) ifTrue:[
claus
parents: 118
diff changeset
   245
		    self replaceSelectionBy:(key asString , ' ').
claus
parents: 118
diff changeset
   246
		    self cursorLeft
claus
parents: 118
diff changeset
   247
		] ifFalse:[
claus
parents: 118
diff changeset
   248
		    self replaceSelectionBy:key
claus
parents: 118
diff changeset
   249
		]
claus
parents: 118
diff changeset
   250
	    ].
claus
parents: 118
diff changeset
   251
	    selectStyle := nil.
claus
parents: 118
diff changeset
   252
claus
parents: 118
diff changeset
   253
	    showMatchingParenthesis ifTrue:[
claus
parents: 118
diff changeset
   254
		"emacs style parenthesis shower"
claus
parents: 118
diff changeset
   255
claus
parents: 118
diff changeset
   256
		"claus: only do it for closing parenthesis -
claus
parents: 118
diff changeset
   257
			otherwise its too anoying.
claus
parents: 118
diff changeset
   258
		"
claus
parents: 118
diff changeset
   259
"
claus
parents: 118
diff changeset
   260
		(#( $( $) $[ $] ${ $} ) includes:key) ifTrue:[
claus
parents: 118
diff changeset
   261
"
claus
parents: 118
diff changeset
   262
		(#( $) $] $} ) includes:key) ifTrue:[
claus
parents: 118
diff changeset
   263
		self searchForMatchingParenthesisFromLine:cursorLine col:(cursorCol - 1)
claus
parents: 118
diff changeset
   264
				   ifFound:[:line :col |
claus
parents: 118
diff changeset
   265
						|savLine savCol|
claus
parents: 118
diff changeset
   266
claus
parents: 118
diff changeset
   267
						savLine := cursorLine.
claus
parents: 118
diff changeset
   268
						savCol := cursorCol.
claus
parents: 118
diff changeset
   269
						self cursorLine:line col:col.
claus
parents: 118
diff changeset
   270
						device synchronizeOutput.
claus
parents: 118
diff changeset
   271
						OperatingSystem millisecondDelay:200.
claus
parents: 118
diff changeset
   272
						self cursorLine:savLine col:savCol
claus
parents: 118
diff changeset
   273
					   ]
claus
parents: 118
diff changeset
   274
				ifNotFound:[self showNotFound]
claus
parents: 118
diff changeset
   275
				   onError:[device beep]
claus
parents: 118
diff changeset
   276
		].
claus
parents: 118
diff changeset
   277
	    ].
claus
parents: 118
diff changeset
   278
	].
claus
parents: 118
diff changeset
   279
	^ self
claus
parents: 118
diff changeset
   280
    ].                         
claus
parents: 118
diff changeset
   281
claus
parents: 118
diff changeset
   282
    replacing := false.
claus
parents: 118
diff changeset
   283
claus
parents: 118
diff changeset
   284
    "
claus
parents: 118
diff changeset
   285
     Fn      pastes a key-sequence (but only if not overlayed with
claus
parents: 118
diff changeset
   286
	     another function in the keyboard map)
claus
parents: 118
diff changeset
   287
125
claus
parents: 123
diff changeset
   288
     see TextView>>:x:y
121
claus
parents: 118
diff changeset
   289
    "
claus
parents: 118
diff changeset
   290
    (#(F1 F2 F3 F4 F5 F6 F7 F8 F9) includes:key) ifTrue:[
claus
parents: 118
diff changeset
   291
	device shiftDown ifFalse:[
claus
parents: 118
diff changeset
   292
	    (Smalltalk at:#FunctionKeySequences) notNil ifTrue:[
claus
parents: 118
diff changeset
   293
		self paste:((Smalltalk at:#FunctionKeySequences) at:key) asStringCollection.
claus
parents: 118
diff changeset
   294
		^ self
claus
parents: 118
diff changeset
   295
	    ]
claus
parents: 118
diff changeset
   296
	]
claus
parents: 118
diff changeset
   297
    ].
claus
parents: 118
diff changeset
   298
claus
parents: 118
diff changeset
   299
    ((key == #Paste) or:[key == #Insert]) ifTrue:[self paste. ^self].
claus
parents: 118
diff changeset
   300
    (key == #Cut) ifTrue:[self cut. ^self].
claus
parents: 118
diff changeset
   301
    (key == #Again) ifTrue:[self again. ^self].
claus
parents: 118
diff changeset
   302
claus
parents: 118
diff changeset
   303
    (key == #Replace) ifTrue:[self replace. ^self].
claus
parents: 118
diff changeset
   304
    (key == #SelectWord) ifTrue:[
claus
parents: 118
diff changeset
   305
	self makeCursorVisible.
claus
parents: 118
diff changeset
   306
	^ self selectWordUnderCursor. 
claus
parents: 118
diff changeset
   307
    ].
claus
parents: 118
diff changeset
   308
claus
parents: 118
diff changeset
   309
    (key == #SearchMatchingParent) ifTrue:[^ self searchForMatchingParenthesis.].
claus
parents: 118
diff changeset
   310
    (key == #SelectMatchingParents) ifTrue:[^ self searchForAndSelectMatchingParenthesis.].
claus
parents: 118
diff changeset
   311
    (key == #SelectToEnd) ifTrue:[^ self selectUpToEnd.].
claus
parents: 118
diff changeset
   312
    (key == #SelectFromBeginning) ifTrue:[^ self selectFromBeginning.].
claus
parents: 118
diff changeset
   313
claus
parents: 118
diff changeset
   314
" disabled - nobody liked it ...
claus
parents: 118
diff changeset
   315
  and if you like it, its better done in the keymap.
claus
parents: 118
diff changeset
   316
claus
parents: 118
diff changeset
   317
    (key == #Ctrlb) ifTrue:[self unselect. self cursorLeft. ^self].
claus
parents: 118
diff changeset
   318
    (key == #Ctrlf) ifTrue:[self unselect. self cursorRight. ^self].
claus
parents: 118
diff changeset
   319
    (key == #Ctrln) ifTrue:[self unselect. self cursorDown. ^self].
claus
parents: 118
diff changeset
   320
    (key == #Ctrlp) ifTrue:[self unselect. self cursorUp. ^self].
claus
parents: 118
diff changeset
   321
"
claus
parents: 118
diff changeset
   322
claus
parents: 118
diff changeset
   323
    (key == #BeginOfLine) ifTrue:[self cursorToBeginOfLine. ^self].
claus
parents: 118
diff changeset
   324
    (key == #EndOfLine) ifTrue:[self cursorToEndOfLine. ^self].
claus
parents: 118
diff changeset
   325
    (key == #NextWord) ifTrue:[self cursorToNextWord. ^self].
claus
parents: 118
diff changeset
   326
    (key == #GotoLine) ifTrue:[self gotoLine. ^self].
claus
parents: 118
diff changeset
   327
claus
parents: 118
diff changeset
   328
    (key == #CursorRight) ifTrue:[
claus
parents: 118
diff changeset
   329
	selectionStartLine notNil ifTrue:[
claus
parents: 118
diff changeset
   330
	    cursorLine := selectionEndLine.
claus
parents: 118
diff changeset
   331
	    cursorVisibleLine := self listLineToVisibleLine:cursorLine.
claus
parents: 118
diff changeset
   332
	    cursorCol := selectionEndCol.
claus
parents: 118
diff changeset
   333
	    cursorCol == 0 ifTrue:[
claus
parents: 118
diff changeset
   334
		cursorCol := 1.
claus
parents: 118
diff changeset
   335
	    ].
claus
parents: 118
diff changeset
   336
	    self unselect; makeCursorVisible.
claus
parents: 118
diff changeset
   337
	    cursorCol == 1 ifTrue:[^ self].
claus
parents: 118
diff changeset
   338
	].
claus
parents: 118
diff changeset
   339
	self cursorRight. ^self
claus
parents: 118
diff changeset
   340
    ].
claus
parents: 118
diff changeset
   341
    (key == #CursorDown) ifTrue:[
claus
parents: 118
diff changeset
   342
	selectionStartLine notNil ifTrue:[
claus
parents: 118
diff changeset
   343
	    cursorLine := selectionEndLine.
claus
parents: 118
diff changeset
   344
	    cursorVisibleLine := self listLineToVisibleLine:cursorLine.
claus
parents: 118
diff changeset
   345
	    cursorCol := selectionEndCol.
claus
parents: 118
diff changeset
   346
	    cursorCol == 0 ifTrue:[
claus
parents: 118
diff changeset
   347
		cursorCol := 1.
claus
parents: 118
diff changeset
   348
		cursorLine := cursorLine - 1.
claus
parents: 118
diff changeset
   349
		cursorVisibleLine := self listLineToVisibleLine:cursorLine.
claus
parents: 118
diff changeset
   350
	    ].
claus
parents: 118
diff changeset
   351
	    self makeCursorVisible
claus
parents: 118
diff changeset
   352
	].
claus
parents: 118
diff changeset
   353
	self unselect. 
125
claus
parents: 123
diff changeset
   354
claus
parents: 123
diff changeset
   355
	sensor isNil ifTrue:[
claus
parents: 123
diff changeset
   356
	    n := 1
claus
parents: 123
diff changeset
   357
	] ifFalse:[
claus
parents: 123
diff changeset
   358
	    n := 1 + (sensor compressKeyPressEventsWithKey:#CursorDown).
claus
parents: 123
diff changeset
   359
	].
claus
parents: 123
diff changeset
   360
	self cursorDown:n. 
claus
parents: 123
diff changeset
   361
	^ self
121
claus
parents: 118
diff changeset
   362
    ].
claus
parents: 118
diff changeset
   363
    (key == #CursorLeft or:[key == #CursorUp]) ifTrue:[
claus
parents: 118
diff changeset
   364
	selectionStartLine notNil ifTrue:[
claus
parents: 118
diff changeset
   365
	    cursorLine := selectionStartLine.
claus
parents: 118
diff changeset
   366
	    cursorVisibleLine := self listLineToVisibleLine:cursorLine.
claus
parents: 118
diff changeset
   367
	    cursorCol := selectionStartCol.
claus
parents: 118
diff changeset
   368
	    self makeCursorVisible
claus
parents: 118
diff changeset
   369
	].
claus
parents: 118
diff changeset
   370
	self unselect. 
claus
parents: 118
diff changeset
   371
	(key == #CursorLeft) ifTrue:[
claus
parents: 118
diff changeset
   372
	    self cursorLeft. ^self
claus
parents: 118
diff changeset
   373
	].
claus
parents: 118
diff changeset
   374
	(key == #CursorUp)        ifTrue:[
125
claus
parents: 123
diff changeset
   375
	    sensor isNil ifTrue:[
claus
parents: 123
diff changeset
   376
		n := 1
claus
parents: 123
diff changeset
   377
	    ] ifFalse:[
claus
parents: 123
diff changeset
   378
		n := 1 + (sensor compressKeyPressEventsWithKey:#CursorUp).
claus
parents: 123
diff changeset
   379
	    ].
claus
parents: 123
diff changeset
   380
	    self cursorUp:n. 
claus
parents: 123
diff changeset
   381
	    ^ self
121
claus
parents: 118
diff changeset
   382
	].
claus
parents: 118
diff changeset
   383
    ].
claus
parents: 118
diff changeset
   384
claus
parents: 118
diff changeset
   385
    (key == #Return)    ifTrue:[
claus
parents: 118
diff changeset
   386
	device shiftDown ifTrue:[
claus
parents: 118
diff changeset
   387
	    self unselect. self cursorReturn. ^self
claus
parents: 118
diff changeset
   388
	].
claus
parents: 118
diff changeset
   389
	self unselect; makeCursorVisible.
claus
parents: 118
diff changeset
   390
	self insertCharAtCursor:(Character cr). 
claus
parents: 118
diff changeset
   391
	^self
claus
parents: 118
diff changeset
   392
    ].
claus
parents: 118
diff changeset
   393
    (key == #Tab) ifTrue:[
claus
parents: 118
diff changeset
   394
	device shiftDown ifTrue:[
claus
parents: 118
diff changeset
   395
	    "
claus
parents: 118
diff changeset
   396
	     the old version used shift-tab as backtab,
claus
parents: 118
diff changeset
   397
	     however, backtab was seldom used.
claus
parents: 118
diff changeset
   398
	     An alternative is to make it a non-inserting tab ...
claus
parents: 118
diff changeset
   399
	    "
claus
parents: 118
diff changeset
   400
	    "/ self unselect. self cursorBacktab. ^self
claus
parents: 118
diff changeset
   401
	    self unselect. self cursorTab. ^self
claus
parents: 118
diff changeset
   402
	].
claus
parents: 118
diff changeset
   403
	"
claus
parents: 118
diff changeset
   404
	 uncomment line below, if you like RAND/INed/MAXed editor behavior
claus
parents: 118
diff changeset
   405
	 (where tab-key is only cursor positioning)
claus
parents: 118
diff changeset
   406
	 this was the original behavior of the TAB key, but many people
claus
parents: 118
diff changeset
   407
	 complained ....
claus
parents: 118
diff changeset
   408
	"
claus
parents: 118
diff changeset
   409
	"/ self unselect. self cursorTab. ^self
claus
parents: 118
diff changeset
   410
	self unselect. self insertTabAtCursor. ^self
claus
parents: 118
diff changeset
   411
    ].
claus
parents: 118
diff changeset
   412
    (key == #BackSpace) ifTrue:[
claus
parents: 118
diff changeset
   413
claus
parents: 118
diff changeset
   414
" old version just did unselect here "
claus
parents: 118
diff changeset
   415
"
claus
parents: 118
diff changeset
   416
	self unselect. 
claus
parents: 118
diff changeset
   417
"
claus
parents: 118
diff changeset
   418
" new version deletes selection if any "
claus
parents: 118
diff changeset
   419
	selectionStartLine notNil ifTrue:[
claus
parents: 118
diff changeset
   420
	    self setTextSelection:(self selection).
claus
parents: 118
diff changeset
   421
	    self deleteSelection. ^ self
claus
parents: 118
diff changeset
   422
	].
claus
parents: 118
diff changeset
   423
	self makeCursorVisible.
claus
parents: 118
diff changeset
   424
	self deleteCharBeforeCursor. ^self
claus
parents: 118
diff changeset
   425
    ].
claus
parents: 118
diff changeset
   426
    (key == #Delete)    ifTrue:[
claus
parents: 118
diff changeset
   427
	selectionStartLine notNil ifTrue:[
claus
parents: 118
diff changeset
   428
	    self setTextSelection:(self selection).
claus
parents: 118
diff changeset
   429
	    self deleteSelection. ^ self
claus
parents: 118
diff changeset
   430
	].
claus
parents: 118
diff changeset
   431
	self makeCursorVisible.
claus
parents: 118
diff changeset
   432
	self deleteCharAtCursor. ^self
claus
parents: 118
diff changeset
   433
    ].
claus
parents: 118
diff changeset
   434
    (key == #BeginOfText) ifTrue:[
claus
parents: 118
diff changeset
   435
	self unselect. self cursorHome. ^self
claus
parents: 118
diff changeset
   436
    ].
claus
parents: 118
diff changeset
   437
    (key == #EndOfText) ifTrue:[
claus
parents: 118
diff changeset
   438
	self unselect. self cursorToBottom. ^self
claus
parents: 118
diff changeset
   439
    ].
claus
parents: 118
diff changeset
   440
    (key == #Escape)    ifTrue:[
claus
parents: 118
diff changeset
   441
	self makeCursorVisible.
claus
parents: 118
diff changeset
   442
	self unselect. self selectCursorLine. ^ self
claus
parents: 118
diff changeset
   443
    ].
claus
parents: 118
diff changeset
   444
    (key == #DeleteLine)    ifTrue:[
claus
parents: 118
diff changeset
   445
	self makeCursorVisible.
claus
parents: 118
diff changeset
   446
	self unselect. self deleteCursorLine. ^self
claus
parents: 118
diff changeset
   447
    ].
claus
parents: 118
diff changeset
   448
    (key == #InsertLine)    ifTrue:[
claus
parents: 118
diff changeset
   449
	self makeCursorVisible.
claus
parents: 118
diff changeset
   450
	self unselect. self insertLine:nil before:cursorLine. ^self
claus
parents: 118
diff changeset
   451
    ].
claus
parents: 118
diff changeset
   452
    super keyPress:key x:x y:y
claus
parents: 118
diff changeset
   453
!
claus
parents: 118
diff changeset
   454
claus
parents: 118
diff changeset
   455
showFocus
claus
parents: 118
diff changeset
   456
    hasKeyboardFocus := true.
claus
parents: 118
diff changeset
   457
    cursorShown ifTrue: [self drawCursor].
claus
parents: 118
diff changeset
   458
    super showFocus
claus
parents: 118
diff changeset
   459
!
claus
parents: 118
diff changeset
   460
claus
parents: 118
diff changeset
   461
showNoFocus
claus
parents: 118
diff changeset
   462
    hasKeyboardFocus := false.
claus
parents: 118
diff changeset
   463
    cursorShown ifTrue: [self drawCursor].
claus
parents: 118
diff changeset
   464
    super showNoFocus
claus
parents: 118
diff changeset
   465
claus
parents: 118
diff changeset
   466
! !
claus
parents: 118
diff changeset
   467
claus
parents: 118
diff changeset
   468
!EditTextView methodsFor:'cursor handling'!
claus
parents: 118
diff changeset
   469
claus
parents: 118
diff changeset
   470
cursorHome
claus
parents: 118
diff changeset
   471
    "if not in first visible, place cursor in first visible.
claus
parents: 118
diff changeset
   472
     Otherwise, scroll to top AND move cursor to first line of text.
claus
parents: 118
diff changeset
   473
     Thus, the first CursorHome moves it to the views-top, the second 
claus
parents: 118
diff changeset
   474
     to the texts top."
claus
parents: 118
diff changeset
   475
claus
parents: 118
diff changeset
   476
    |wasOn|
claus
parents: 118
diff changeset
   477
claus
parents: 118
diff changeset
   478
    wasOn := self hideCursor.
claus
parents: 118
diff changeset
   479
    cursorCol := 1.
claus
parents: 118
diff changeset
   480
    cursorVisibleLine == 1 ifTrue:[
claus
parents: 118
diff changeset
   481
	self scrollToTop.
claus
parents: 118
diff changeset
   482
	cursorLine := cursorVisibleLine := 1.
claus
parents: 118
diff changeset
   483
    ] ifFalse:[
claus
parents: 118
diff changeset
   484
	cursorVisibleLine := 1.
claus
parents: 118
diff changeset
   485
	cursorLine := self visibleLineToAbsoluteLine:1.
claus
parents: 118
diff changeset
   486
    ].
claus
parents: 118
diff changeset
   487
    self makeCursorVisibleAndShowCursor:wasOn.
claus
parents: 118
diff changeset
   488
!
claus
parents: 118
diff changeset
   489
claus
parents: 118
diff changeset
   490
makeCursorVisibleAndShowCursor:flag
claus
parents: 118
diff changeset
   491
    "scroll to make cursorLine visible;
claus
parents: 118
diff changeset
   492
     if flag is true, draw the cursor"
claus
parents: 118
diff changeset
   493
claus
parents: 118
diff changeset
   494
    self makeCursorVisible.
claus
parents: 118
diff changeset
   495
    flag ifTrue:[self showCursor]
claus
parents: 118
diff changeset
   496
!
claus
parents: 118
diff changeset
   497
claus
parents: 118
diff changeset
   498
hideCursor
claus
parents: 118
diff changeset
   499
    "make cursor invisible if currently visible; 
claus
parents: 118
diff changeset
   500
     return true if cursor was visible before."
claus
parents: 118
diff changeset
   501
claus
parents: 118
diff changeset
   502
    cursorShown ifTrue: [
claus
parents: 118
diff changeset
   503
	shown ifTrue: [
claus
parents: 118
diff changeset
   504
	    self undrawCursor.
claus
parents: 118
diff changeset
   505
	].
claus
parents: 118
diff changeset
   506
	cursorShown := false.
claus
parents: 118
diff changeset
   507
	^ true
claus
parents: 118
diff changeset
   508
    ].
claus
parents: 118
diff changeset
   509
    ^ false
claus
parents: 118
diff changeset
   510
!
claus
parents: 118
diff changeset
   511
claus
parents: 118
diff changeset
   512
drawNoFocusCursor
claus
parents: 118
diff changeset
   513
    "draw the cursor for the case when the view has no keyboard focus" 
claus
parents: 118
diff changeset
   514
claus
parents: 118
diff changeset
   515
    self hasSelection ifTrue:[
claus
parents: 118
diff changeset
   516
	^ super redrawVisibleLine:cursorVisibleLine col:cursorCol.
claus
parents: 118
diff changeset
   517
    ].
claus
parents: 118
diff changeset
   518
    cursorType ~~ #block ifTrue:[
claus
parents: 118
diff changeset
   519
	"these dont show unfocussed"
claus
parents: 118
diff changeset
   520
	^ self drawFocusCursor
claus
parents: 118
diff changeset
   521
    ].
claus
parents: 118
diff changeset
   522
    self drawCursor:#frame with:cursorFgColor and:cursorBgColor
claus
parents: 118
diff changeset
   523
!
claus
parents: 118
diff changeset
   524
claus
parents: 118
diff changeset
   525
drawCursorCharacter
claus
parents: 118
diff changeset
   526
    "draw the cursor. 
claus
parents: 118
diff changeset
   527
     (i.e. the cursor if no selection)
claus
parents: 118
diff changeset
   528
     - helper for many cursor methods"
claus
parents: 118
diff changeset
   529
claus
parents: 118
diff changeset
   530
    hasKeyboardFocus ifTrue:[
claus
parents: 118
diff changeset
   531
	self drawFocusCursor
claus
parents: 118
diff changeset
   532
    ] ifFalse:[
claus
parents: 118
diff changeset
   533
	self drawNoFocusCursor
claus
parents: 118
diff changeset
   534
    ]
claus
parents: 118
diff changeset
   535
!
claus
parents: 118
diff changeset
   536
claus
parents: 118
diff changeset
   537
makeCursorVisible
claus
parents: 118
diff changeset
   538
    "scroll text to make cursorline visible 
claus
parents: 118
diff changeset
   539
     (i.e. to have cursorLine in visible area)"
claus
parents: 118
diff changeset
   540
claus
parents: 118
diff changeset
   541
    |line col|
claus
parents: 118
diff changeset
   542
claus
parents: 118
diff changeset
   543
    cursorLine notNil ifTrue:[
claus
parents: 118
diff changeset
   544
	line := cursorLine.
claus
parents: 118
diff changeset
   545
	col := cursorCol.
claus
parents: 118
diff changeset
   546
	"
claus
parents: 118
diff changeset
   547
	 if there is a selection, its better to
claus
parents: 118
diff changeset
   548
	 have its start being visible, instead of the end
claus
parents: 118
diff changeset
   549
	"
claus
parents: 118
diff changeset
   550
	(selectionStartLine notNil 
claus
parents: 118
diff changeset
   551
	and:[selectionEndLine notNil]) ifTrue:[
claus
parents: 118
diff changeset
   552
claus
parents: 118
diff changeset
   553
"/ that was wrong
claus
parents: 118
diff changeset
   554
"/      ((line == selectionEndLine)
claus
parents: 118
diff changeset
   555
"/      and:[selectionEndCol notNil
claus
parents: 118
diff changeset
   556
"/      and:[col == (selectionEndCol+1)]]) ifTrue:[
claus
parents: 118
diff changeset
   557
claus
parents: 118
diff changeset
   558
	    line := selectionStartLine.
claus
parents: 118
diff changeset
   559
	    col := selectionStartCol.
claus
parents: 118
diff changeset
   560
	].
claus
parents: 118
diff changeset
   561
	self makeLineVisible:line.
claus
parents: 118
diff changeset
   562
	self makeColVisible:col inLine:line 
claus
parents: 118
diff changeset
   563
    ]
claus
parents: 118
diff changeset
   564
!
claus
parents: 118
diff changeset
   565
claus
parents: 118
diff changeset
   566
undrawCursor
claus
parents: 118
diff changeset
   567
    "undraw the cursor (i.e. redraw the character(s) under the cursor)"
claus
parents: 118
diff changeset
   568
claus
parents: 118
diff changeset
   569
    cursorVisibleLine notNil ifTrue:[
claus
parents: 118
diff changeset
   570
	((cursorType == #caret) or:[cursorType == #solidCaret]) ifTrue:[
claus
parents: 118
diff changeset
   571
	    "caret-cursor touches 4 characters"
claus
parents: 118
diff changeset
   572
	    ((cursorCol > 1) and:[fontIsFixedWidth]) ifTrue:[
claus
parents: 118
diff changeset
   573
		super redrawVisibleLine:cursorVisibleLine from:cursorCol-1 to:cursorCol.
claus
parents: 118
diff changeset
   574
		super redrawVisibleLine:cursorVisibleLine+1 from:cursorCol-1 to:cursorCol.
claus
parents: 118
diff changeset
   575
	    ] ifFalse:[
claus
parents: 118
diff changeset
   576
		"care for left margin"
claus
parents: 118
diff changeset
   577
		super redrawVisibleLine:cursorVisibleLine; redrawVisibleLine:cursorVisibleLine+1.
claus
parents: 118
diff changeset
   578
	    ].
claus
parents: 118
diff changeset
   579
	    ^ self
claus
parents: 118
diff changeset
   580
	].
claus
parents: 118
diff changeset
   581
	cursorType == #ibeam ifTrue:[
claus
parents: 118
diff changeset
   582
	    "ibeam-cursor touches 2 characters"
claus
parents: 118
diff changeset
   583
	    cursorCol > 1 ifTrue:[
claus
parents: 118
diff changeset
   584
		super redrawVisibleLine:cursorVisibleLine from:cursorCol-1 to:cursorCol.
claus
parents: 118
diff changeset
   585
	    ] ifFalse:[
claus
parents: 118
diff changeset
   586
		"care for left margin"
claus
parents: 118
diff changeset
   587
		super redrawVisibleLine:cursorVisibleLine.
claus
parents: 118
diff changeset
   588
	    ].
claus
parents: 118
diff changeset
   589
	    ^ self
claus
parents: 118
diff changeset
   590
	].
claus
parents: 118
diff changeset
   591
	"block is simple - just one character under cursor"
claus
parents: 118
diff changeset
   592
	super redrawVisibleLine:cursorVisibleLine col:cursorCol
claus
parents: 118
diff changeset
   593
    ]
claus
parents: 118
diff changeset
   594
!
claus
parents: 118
diff changeset
   595
claus
parents: 118
diff changeset
   596
drawCursor
claus
parents: 118
diff changeset
   597
    "draw the cursor if shown and cursor is visible.
claus
parents: 118
diff changeset
   598
     (but not, if there is a selection - to avoid confusion)"
claus
parents: 118
diff changeset
   599
claus
parents: 118
diff changeset
   600
    shown ifTrue:[
claus
parents: 118
diff changeset
   601
	cursorVisibleLine notNil ifTrue:[
claus
parents: 118
diff changeset
   602
	    self hasSelection ifFalse:[
claus
parents: 118
diff changeset
   603
		self drawCursorCharacter
claus
parents: 118
diff changeset
   604
	    ]
claus
parents: 118
diff changeset
   605
	]
claus
parents: 118
diff changeset
   606
    ]
claus
parents: 118
diff changeset
   607
!
claus
parents: 118
diff changeset
   608
claus
parents: 118
diff changeset
   609
showCursor
claus
parents: 118
diff changeset
   610
    "make cursor visible if currently invisible"
claus
parents: 118
diff changeset
   611
claus
parents: 118
diff changeset
   612
    cursorShown ifFalse: [
claus
parents: 118
diff changeset
   613
	self drawCursor.
claus
parents: 118
diff changeset
   614
	cursorShown := true
claus
parents: 118
diff changeset
   615
    ]
claus
parents: 118
diff changeset
   616
!
claus
parents: 118
diff changeset
   617
claus
parents: 118
diff changeset
   618
drawFocusCursor
claus
parents: 118
diff changeset
   619
    "draw the cursor when the focus is in the view."
claus
parents: 118
diff changeset
   620
claus
parents: 118
diff changeset
   621
    self hasSelection ifTrue:[
claus
parents: 118
diff changeset
   622
	^ super redrawVisibleLine:cursorVisibleLine col:cursorCol.
claus
parents: 118
diff changeset
   623
    ].
claus
parents: 118
diff changeset
   624
    self drawCursor:cursorType with:cursorFgColor and:cursorBgColor.
claus
parents: 118
diff changeset
   625
!
claus
parents: 118
diff changeset
   626
claus
parents: 118
diff changeset
   627
drawCursor:cursorType with:fgColor and:bgColor
claus
parents: 118
diff changeset
   628
    "draw a cursor; the argument cursorType specifies what type
125
claus
parents: 123
diff changeset
   629
     of cursor should be drawn.
claus
parents: 123
diff changeset
   630
     Currently, supported are: #block, #frame, #ibeam, #caret and #solidCaret"
121
claus
parents: 118
diff changeset
   631
claus
parents: 118
diff changeset
   632
    |x y w char y2 x1 x2|
claus
parents: 118
diff changeset
   633
claus
parents: 118
diff changeset
   634
    self hasSelection ifTrue:[
claus
parents: 118
diff changeset
   635
	"
claus
parents: 118
diff changeset
   636
	 hide cursor, if there is a selection
claus
parents: 118
diff changeset
   637
	"
claus
parents: 118
diff changeset
   638
	^ super redrawVisibleLine:cursorVisibleLine col:cursorCol.
claus
parents: 118
diff changeset
   639
    ].
claus
parents: 118
diff changeset
   640
claus
parents: 118
diff changeset
   641
    cursorType == #block ifTrue:[
claus
parents: 118
diff changeset
   642
	super drawVisibleLine:cursorVisibleLine 
claus
parents: 118
diff changeset
   643
			  col:cursorCol 
claus
parents: 118
diff changeset
   644
			 with:fgColor
claus
parents: 118
diff changeset
   645
			  and:bgColor.
claus
parents: 118
diff changeset
   646
	^ self
claus
parents: 118
diff changeset
   647
    ].
claus
parents: 118
diff changeset
   648
    x := (self xOfCol:cursorCol inVisibleLine:cursorVisibleLine) - leftOffset.
claus
parents: 118
diff changeset
   649
    y := self yOfVisibleLine:cursorVisibleLine.
claus
parents: 118
diff changeset
   650
claus
parents: 118
diff changeset
   651
    cursorType == #frame ifTrue:[
claus
parents: 118
diff changeset
   652
	super redrawVisibleLine:cursorVisibleLine col:cursorCol.
claus
parents: 118
diff changeset
   653
claus
parents: 118
diff changeset
   654
	char := self characterUnderCursor asString.
claus
parents: 118
diff changeset
   655
	self paint:bgColor.
claus
parents: 118
diff changeset
   656
	self displayRectangleX:x y:y width:(font widthOf:char)
claus
parents: 118
diff changeset
   657
				    height:fontHeight.
claus
parents: 118
diff changeset
   658
	^ self
claus
parents: 118
diff changeset
   659
    ].
claus
parents: 118
diff changeset
   660
    self paint:bgColor.
claus
parents: 118
diff changeset
   661
    cursorType == #ibeam ifTrue:[
claus
parents: 118
diff changeset
   662
	x1 := x - 1.
claus
parents: 118
diff changeset
   663
	y2 := y + fontHeight - 1.
claus
parents: 118
diff changeset
   664
	self displayLineFromX:x1 y:y toX:x1 y:y2. 
claus
parents: 118
diff changeset
   665
	self displayLineFromX:x y:y toX:x y:y2. 
claus
parents: 118
diff changeset
   666
	^ self
claus
parents: 118
diff changeset
   667
    ].
claus
parents: 118
diff changeset
   668
claus
parents: 118
diff changeset
   669
    w := fontWidth // 2.
claus
parents: 118
diff changeset
   670
    y := y + fontHeight - 3.
claus
parents: 118
diff changeset
   671
    y2 := y + w.
claus
parents: 118
diff changeset
   672
    x1 := x - w.
claus
parents: 118
diff changeset
   673
    x2 := x + w.
claus
parents: 118
diff changeset
   674
    cursorType == #caret ifTrue:[
claus
parents: 118
diff changeset
   675
	self lineWidth:2.
claus
parents: 118
diff changeset
   676
	self displayLineFromX:x1 y:y2 toX:x y:y. 
claus
parents: 118
diff changeset
   677
	self displayLineFromX:x y:y toX:x2 y:y2. 
125
claus
parents: 123
diff changeset
   678
    ] ifFalse:[
claus
parents: 123
diff changeset
   679
	"anything else: solidCaret"
claus
parents: 123
diff changeset
   680
claus
parents: 123
diff changeset
   681
"/        cursorType == #solidCaret ifTrue:[
claus
parents: 123
diff changeset
   682
	    self fillPolygon:(Array with:(x1 @ y2)
claus
parents: 123
diff changeset
   683
				    with:(x @ y)
claus
parents: 123
diff changeset
   684
				    with:(x2 @ y2))
claus
parents: 123
diff changeset
   685
"/        ]
121
claus
parents: 118
diff changeset
   686
    ].
claus
parents: 118
diff changeset
   687
!
claus
parents: 118
diff changeset
   688
claus
parents: 118
diff changeset
   689
cursorReturn
claus
parents: 118
diff changeset
   690
    "move cursor to start of next line; scroll if at end of visible text"
claus
parents: 118
diff changeset
   691
claus
parents: 118
diff changeset
   692
    |wasOn|
claus
parents: 118
diff changeset
   693
claus
parents: 118
diff changeset
   694
    self checkForExistingLine:(cursorLine + 1).
claus
parents: 118
diff changeset
   695
    cursorVisibleLine notNil ifTrue:[
claus
parents: 118
diff changeset
   696
	nFullLinesShown notNil ifTrue:[
claus
parents: 118
diff changeset
   697
	    (cursorVisibleLine >= nFullLinesShown) ifTrue:[self scrollDown]
claus
parents: 118
diff changeset
   698
	]
claus
parents: 118
diff changeset
   699
    ].
claus
parents: 118
diff changeset
   700
claus
parents: 118
diff changeset
   701
    wasOn := self hideCursor.
claus
parents: 118
diff changeset
   702
    cursorCol := 1.
claus
parents: 118
diff changeset
   703
    cursorLine := cursorLine + 1.
claus
parents: 118
diff changeset
   704
    cursorVisibleLine := self listLineToVisibleLine:cursorLine.
claus
parents: 118
diff changeset
   705
    self makeCursorVisibleAndShowCursor:wasOn.
claus
parents: 118
diff changeset
   706
!
claus
parents: 118
diff changeset
   707
claus
parents: 118
diff changeset
   708
cursorLine:line col:col
claus
parents: 118
diff changeset
   709
    "this positions onto physical - not visible - line"
claus
parents: 118
diff changeset
   710
claus
parents: 118
diff changeset
   711
    |wasOn|
claus
parents: 118
diff changeset
   712
claus
parents: 118
diff changeset
   713
    wasOn := self hideCursor.
claus
parents: 118
diff changeset
   714
    cursorLine := line.
claus
parents: 118
diff changeset
   715
    cursorVisibleLine := self listLineToVisibleLine:line.
claus
parents: 118
diff changeset
   716
    cursorCol := col.
claus
parents: 118
diff changeset
   717
    (cursorCol < 1) ifTrue:[
claus
parents: 118
diff changeset
   718
	cursorCol := 1
claus
parents: 118
diff changeset
   719
    ].
claus
parents: 118
diff changeset
   720
    self makeCursorVisibleAndShowCursor:wasOn.
claus
parents: 118
diff changeset
   721
!
claus
parents: 118
diff changeset
   722
claus
parents: 118
diff changeset
   723
cursorCol:newCol
claus
parents: 118
diff changeset
   724
    "move cursor to some column in the current line"
claus
parents: 118
diff changeset
   725
claus
parents: 118
diff changeset
   726
    |wasOn|
claus
parents: 118
diff changeset
   727
claus
parents: 118
diff changeset
   728
    wasOn := self hideCursor.
claus
parents: 118
diff changeset
   729
    cursorCol := newCol.
claus
parents: 118
diff changeset
   730
    self makeCursorVisibleAndShowCursor:wasOn.
claus
parents: 118
diff changeset
   731
!
claus
parents: 118
diff changeset
   732
claus
parents: 118
diff changeset
   733
withCursorOffDo:aBlock
claus
parents: 118
diff changeset
   734
    "evaluate aBlock with cursor off; turn it on afterwards."
claus
parents: 118
diff changeset
   735
claus
parents: 118
diff changeset
   736
    (shown not or:[cursorShown not]) ifTrue:[
claus
parents: 118
diff changeset
   737
	^ aBlock value
claus
parents: 118
diff changeset
   738
    ].
claus
parents: 118
diff changeset
   739
    self hideCursor.
claus
parents: 118
diff changeset
   740
    aBlock valueNowOrOnUnwindDo:[
claus
parents: 118
diff changeset
   741
	self showCursor
claus
parents: 118
diff changeset
   742
    ]
claus
parents: 118
diff changeset
   743
!
claus
parents: 118
diff changeset
   744
claus
parents: 118
diff changeset
   745
cursorUp
claus
parents: 118
diff changeset
   746
    "move cursor up; scroll if at start of visible text"
claus
parents: 118
diff changeset
   747
125
claus
parents: 123
diff changeset
   748
    self cursorUp:1
claus
parents: 123
diff changeset
   749
!
claus
parents: 123
diff changeset
   750
claus
parents: 123
diff changeset
   751
cursorUp:n
claus
parents: 123
diff changeset
   752
    "move cursor up n lines; scroll if at start of visible text"
claus
parents: 123
diff changeset
   753
claus
parents: 123
diff changeset
   754
    |wasOn nv nl|
claus
parents: 123
diff changeset
   755
claus
parents: 123
diff changeset
   756
    cursorLine isNil ifTrue:[
claus
parents: 123
diff changeset
   757
	cursorLine := firstLineShown + nFullLinesShown - 1.
claus
parents: 123
diff changeset
   758
    ].
claus
parents: 123
diff changeset
   759
    nl := cursorLine - n.
claus
parents: 123
diff changeset
   760
    nl < 1 ifTrue:[nl := 1].
claus
parents: 123
diff changeset
   761
claus
parents: 123
diff changeset
   762
    (nl ~~ cursorLine) ifTrue: [
claus
parents: 123
diff changeset
   763
	wasOn := self hideCursor.
claus
parents: 123
diff changeset
   764
	cursorVisibleLine notNil ifTrue:[
claus
parents: 123
diff changeset
   765
	    nv := cursorVisibleLine - n.
claus
parents: 123
diff changeset
   766
	    nv < 1 ifTrue:[
claus
parents: 123
diff changeset
   767
		self scrollUp:(nv negated + 1)
claus
parents: 123
diff changeset
   768
	    ].
121
claus
parents: 118
diff changeset
   769
	].
125
claus
parents: 123
diff changeset
   770
	cursorLine := nl.
121
claus
parents: 118
diff changeset
   771
	cursorVisibleLine := self listLineToVisibleLine:cursorLine.
claus
parents: 118
diff changeset
   772
	wasOn ifTrue:[self showCursor].
claus
parents: 118
diff changeset
   773
"/
claus
parents: 118
diff changeset
   774
"/ to make cursor visible (even if below visible end):
claus
parents: 118
diff changeset
   775
"/
claus
parents: 118
diff changeset
   776
"/      self makeCursorVisibleAndShowCursor:wasOn.
claus
parents: 118
diff changeset
   777
    ]
claus
parents: 118
diff changeset
   778
!
claus
parents: 118
diff changeset
   779
claus
parents: 118
diff changeset
   780
cursorToBottom
claus
parents: 118
diff changeset
   781
    "move cursor to last line of text"
claus
parents: 118
diff changeset
   782
claus
parents: 118
diff changeset
   783
    |wasOn newTop|
claus
parents: 118
diff changeset
   784
claus
parents: 118
diff changeset
   785
    wasOn := self hideCursor.
claus
parents: 118
diff changeset
   786
claus
parents: 118
diff changeset
   787
    newTop := list size - nFullLinesShown.
claus
parents: 118
diff changeset
   788
    (newTop < 1) ifTrue:[
claus
parents: 118
diff changeset
   789
	newTop := 1
claus
parents: 118
diff changeset
   790
    ].
claus
parents: 118
diff changeset
   791
    self scrollToLine:newTop.
claus
parents: 118
diff changeset
   792
    cursorCol := 1.
claus
parents: 118
diff changeset
   793
    cursorLine := list size.
claus
parents: 118
diff changeset
   794
    cursorVisibleLine := self listLineToVisibleLine:cursorLine.
claus
parents: 118
diff changeset
   795
claus
parents: 118
diff changeset
   796
    self makeCursorVisibleAndShowCursor:wasOn.
claus
parents: 118
diff changeset
   797
!
claus
parents: 118
diff changeset
   798
claus
parents: 118
diff changeset
   799
cursorDown
claus
parents: 118
diff changeset
   800
    "move cursor down; scroll if at end of visible text"
claus
parents: 118
diff changeset
   801
125
claus
parents: 123
diff changeset
   802
    self cursorDown:1
claus
parents: 123
diff changeset
   803
!
claus
parents: 123
diff changeset
   804
claus
parents: 123
diff changeset
   805
cursorDown:n
claus
parents: 123
diff changeset
   806
    "move cursor down by n lines; scroll if at end of visible text"
claus
parents: 123
diff changeset
   807
claus
parents: 123
diff changeset
   808
    |wasOn nv|
121
claus
parents: 118
diff changeset
   809
claus
parents: 118
diff changeset
   810
    cursorVisibleLine notNil ifTrue:[
claus
parents: 118
diff changeset
   811
	wasOn := self hideCursor.
125
claus
parents: 123
diff changeset
   812
	nv := cursorVisibleLine + n - 1.
claus
parents: 123
diff changeset
   813
	(nv >= nFullLinesShown) ifTrue:[
claus
parents: 123
diff changeset
   814
	    self scrollDown:(nv - nFullLinesShown + 1)
claus
parents: 123
diff changeset
   815
	].
claus
parents: 123
diff changeset
   816
	cursorLine := cursorLine + n.
121
claus
parents: 118
diff changeset
   817
	cursorVisibleLine := self listLineToVisibleLine:cursorLine.
claus
parents: 118
diff changeset
   818
	wasOn ifTrue:[self showCursor].
claus
parents: 118
diff changeset
   819
    ] ifFalse:[
claus
parents: 118
diff changeset
   820
	cursorLine isNil ifTrue:[
claus
parents: 118
diff changeset
   821
	    cursorLine := firstLineShown
claus
parents: 118
diff changeset
   822
	].
125
claus
parents: 123
diff changeset
   823
	cursorLine := cursorLine + n.
121
claus
parents: 118
diff changeset
   824
	cursorVisibleLine := self listLineToVisibleLine:cursorLine.
claus
parents: 118
diff changeset
   825
	self makeCursorVisible.
claus
parents: 118
diff changeset
   826
    ].
claus
parents: 118
diff changeset
   827
!
claus
parents: 118
diff changeset
   828
claus
parents: 118
diff changeset
   829
cursorToEndOfLine
claus
parents: 118
diff changeset
   830
    "move cursor to end of current line"
claus
parents: 118
diff changeset
   831
claus
parents: 118
diff changeset
   832
    |line newCol|
claus
parents: 118
diff changeset
   833
claus
parents: 118
diff changeset
   834
    list isNil ifTrue:[
claus
parents: 118
diff changeset
   835
	newCol := 1
claus
parents: 118
diff changeset
   836
    ] ifFalse:[
claus
parents: 118
diff changeset
   837
	line := list at:cursorLine.
claus
parents: 118
diff changeset
   838
	newCol := line size + 1
claus
parents: 118
diff changeset
   839
    ].
claus
parents: 118
diff changeset
   840
    self cursorCol:newCol
claus
parents: 118
diff changeset
   841
!
claus
parents: 118
diff changeset
   842
claus
parents: 118
diff changeset
   843
cursorRight
claus
parents: 118
diff changeset
   844
    "move cursor to right"
claus
parents: 118
diff changeset
   845
claus
parents: 118
diff changeset
   846
    self cursorCol:(cursorCol + 1)
claus
parents: 118
diff changeset
   847
!
claus
parents: 118
diff changeset
   848
claus
parents: 118
diff changeset
   849
cursorLeft
claus
parents: 118
diff changeset
   850
    "move cursor to left"
claus
parents: 118
diff changeset
   851
claus
parents: 118
diff changeset
   852
    (cursorCol ~~ 1) ifTrue: [
claus
parents: 118
diff changeset
   853
	self cursorCol:(cursorCol - 1)
claus
parents: 118
diff changeset
   854
    ].
claus
parents: 118
diff changeset
   855
!
claus
parents: 118
diff changeset
   856
claus
parents: 118
diff changeset
   857
cursorToBeginOfLine
claus
parents: 118
diff changeset
   858
    "move cursor to start of current line"
claus
parents: 118
diff changeset
   859
claus
parents: 118
diff changeset
   860
    self cursorCol:1
claus
parents: 118
diff changeset
   861
!
claus
parents: 118
diff changeset
   862
claus
parents: 118
diff changeset
   863
cursorTab
claus
parents: 118
diff changeset
   864
    "move cursor to next tabstop"
claus
parents: 118
diff changeset
   865
claus
parents: 118
diff changeset
   866
    self cursorCol:(self nextTabAfter:cursorCol).
claus
parents: 118
diff changeset
   867
!
claus
parents: 118
diff changeset
   868
claus
parents: 118
diff changeset
   869
cursorBacktab
claus
parents: 118
diff changeset
   870
    "move cursor to prev tabstop"
claus
parents: 118
diff changeset
   871
claus
parents: 118
diff changeset
   872
    self cursorCol:(self prevTabBefore:cursorCol).
claus
parents: 118
diff changeset
   873
!
claus
parents: 118
diff changeset
   874
claus
parents: 118
diff changeset
   875
cursorVisibleLine:visibleLineNr col:colNr
claus
parents: 118
diff changeset
   876
    "put cursor to visibleline/col"
claus
parents: 118
diff changeset
   877
claus
parents: 118
diff changeset
   878
    |wasOn|
claus
parents: 118
diff changeset
   879
claus
parents: 118
diff changeset
   880
    wasOn := self hideCursor.
claus
parents: 118
diff changeset
   881
    cursorLine := self visibleLineToAbsoluteLine:visibleLineNr.
claus
parents: 118
diff changeset
   882
    cursorVisibleLine := visibleLineNr.
claus
parents: 118
diff changeset
   883
    cursorCol := colNr.
claus
parents: 118
diff changeset
   884
    (cursorCol < 1) ifTrue:[
claus
parents: 118
diff changeset
   885
	cursorCol := 1
claus
parents: 118
diff changeset
   886
    ].
claus
parents: 118
diff changeset
   887
    self makeCursorVisibleAndShowCursor:wasOn.
claus
parents: 118
diff changeset
   888
!
claus
parents: 118
diff changeset
   889
claus
parents: 118
diff changeset
   890
cursorToNextWord
claus
parents: 118
diff changeset
   891
    "move the cursor to the beginning of the next word"
claus
parents: 118
diff changeset
   892
claus
parents: 118
diff changeset
   893
    |col line searching|
claus
parents: 118
diff changeset
   894
claus
parents: 118
diff changeset
   895
    (cursorLine > list size) ifTrue:[^ self].
claus
parents: 118
diff changeset
   896
    self wordAtLine:cursorLine col:cursorCol do:[
claus
parents: 118
diff changeset
   897
	:beginLine :beginCol :endLine :endCol :style | 
claus
parents: 118
diff changeset
   898
claus
parents: 118
diff changeset
   899
	line := endLine.
claus
parents: 118
diff changeset
   900
	col := endCol + 1.
claus
parents: 118
diff changeset
   901
	searching := true.
claus
parents: 118
diff changeset
   902
	[searching 
claus
parents: 118
diff changeset
   903
	 and:[(self characterAtLine:line col:col) isSeparator]] whileTrue:[
claus
parents: 118
diff changeset
   904
	    self wordAtLine:line col:col do:[
claus
parents: 118
diff changeset
   905
		:beginLine :beginCol :endLine :endCol :style |
claus
parents: 118
diff changeset
   906
claus
parents: 118
diff changeset
   907
		(line > list size) ifTrue:[
claus
parents: 118
diff changeset
   908
		    "break out"
claus
parents: 118
diff changeset
   909
		    searching := false
claus
parents: 118
diff changeset
   910
		] ifFalse:[
claus
parents: 118
diff changeset
   911
		    line := endLine.
claus
parents: 118
diff changeset
   912
		    col := endCol + 1.
claus
parents: 118
diff changeset
   913
		]
claus
parents: 118
diff changeset
   914
	    ]
claus
parents: 118
diff changeset
   915
	].
claus
parents: 118
diff changeset
   916
	self cursorLine:line col:col
claus
parents: 118
diff changeset
   917
    ]
claus
parents: 118
diff changeset
   918
!
claus
parents: 118
diff changeset
   919
claus
parents: 118
diff changeset
   920
cursorX:x y:y
claus
parents: 118
diff changeset
   921
    "put cursor to position next to x/y coordinate in view"
claus
parents: 118
diff changeset
   922
claus
parents: 118
diff changeset
   923
    |line col|
claus
parents: 118
diff changeset
   924
claus
parents: 118
diff changeset
   925
    line := self visibleLineOfY:y.
claus
parents: 118
diff changeset
   926
    col := self colOfX:x inVisibleLine:line.
claus
parents: 118
diff changeset
   927
    self cursorVisibleLine:line col:col.
claus
parents: 118
diff changeset
   928
!
claus
parents: 118
diff changeset
   929
claus
parents: 118
diff changeset
   930
cursorToTop
claus
parents: 118
diff changeset
   931
    "move cursor to absolute home"
claus
parents: 118
diff changeset
   932
claus
parents: 118
diff changeset
   933
    self cursorLine:1 col:1
claus
parents: 118
diff changeset
   934
!
claus
parents: 118
diff changeset
   935
claus
parents: 118
diff changeset
   936
gotoLine:aLineNumber
claus
parents: 118
diff changeset
   937
    "position cursor onto line, aLineNumber.
claus
parents: 118
diff changeset
   938
     Make certain that this line is visible"
claus
parents: 118
diff changeset
   939
claus
parents: 118
diff changeset
   940
    self makeLineVisible:aLineNumber.
claus
parents: 118
diff changeset
   941
    self cursorLine:aLineNumber col:1
claus
parents: 118
diff changeset
   942
! !
claus
parents: 118
diff changeset
   943
125
claus
parents: 123
diff changeset
   944
!EditTextView methodsFor:'accessing-behavior'!
claus
parents: 123
diff changeset
   945
claus
parents: 123
diff changeset
   946
acceptAction:aBlock
claus
parents: 123
diff changeset
   947
    "set the action to be performed on accept"
claus
parents: 123
diff changeset
   948
claus
parents: 123
diff changeset
   949
    acceptAction := aBlock
claus
parents: 123
diff changeset
   950
!
claus
parents: 123
diff changeset
   951
claus
parents: 123
diff changeset
   952
acceptAction
claus
parents: 123
diff changeset
   953
    "return the action to be performed on accept (or nil)"
claus
parents: 123
diff changeset
   954
claus
parents: 123
diff changeset
   955
    ^ acceptAction
claus
parents: 123
diff changeset
   956
!
claus
parents: 123
diff changeset
   957
claus
parents: 123
diff changeset
   958
exceptionBlock:aBlock
claus
parents: 123
diff changeset
   959
    "define the action to be triggered when user tries to modify
claus
parents: 123
diff changeset
   960
     readonly text"
claus
parents: 123
diff changeset
   961
claus
parents: 123
diff changeset
   962
    exceptionBlock := aBlock
claus
parents: 123
diff changeset
   963
! !
claus
parents: 123
diff changeset
   964
claus
parents: 123
diff changeset
   965
!EditTextView methodsFor:'accessing-contents'!
121
claus
parents: 118
diff changeset
   966
claus
parents: 118
diff changeset
   967
characterUnderCursor
claus
parents: 118
diff changeset
   968
    "return the character under the cursor - space if behond line.
claus
parents: 118
diff changeset
   969
     For non-block cursors, this is the character immediately to the right
claus
parents: 118
diff changeset
   970
     of the insertion-bar or caret."
claus
parents: 118
diff changeset
   971
claus
parents: 118
diff changeset
   972
    ^ self characterAtLine:cursorLine col:cursorCol
claus
parents: 118
diff changeset
   973
!
claus
parents: 118
diff changeset
   974
claus
parents: 118
diff changeset
   975
list:something
claus
parents: 118
diff changeset
   976
    "position cursor home when setting contents"
claus
parents: 118
diff changeset
   977
claus
parents: 118
diff changeset
   978
    super list:something.
claus
parents: 118
diff changeset
   979
    self cursorHome
claus
parents: 118
diff changeset
   980
!
claus
parents: 118
diff changeset
   981
claus
parents: 118
diff changeset
   982
modified:aBoolean
claus
parents: 118
diff changeset
   983
    "set the modified flag"
claus
parents: 118
diff changeset
   984
claus
parents: 118
diff changeset
   985
    modified := aBoolean
claus
parents: 118
diff changeset
   986
!
claus
parents: 118
diff changeset
   987
claus
parents: 118
diff changeset
   988
contents
claus
parents: 118
diff changeset
   989
    "return the contents as a String"
claus
parents: 118
diff changeset
   990
claus
parents: 118
diff changeset
   991
    list isNil ifTrue:[^ ''].
claus
parents: 118
diff changeset
   992
    self removeTrailingBlankLines.
claus
parents: 118
diff changeset
   993
    ^ list asStringWithCRs
claus
parents: 118
diff changeset
   994
!
claus
parents: 118
diff changeset
   995
claus
parents: 118
diff changeset
   996
modified
claus
parents: 118
diff changeset
   997
    "return true if text was modified"
claus
parents: 118
diff changeset
   998
claus
parents: 118
diff changeset
   999
    ^ modified
claus
parents: 118
diff changeset
  1000
!
claus
parents: 118
diff changeset
  1001
claus
parents: 118
diff changeset
  1002
cursorLine
claus
parents: 118
diff changeset
  1003
    "return the cursors line (1..). 
claus
parents: 118
diff changeset
  1004
     This is the absolute line; NOT the visible line"
claus
parents: 118
diff changeset
  1005
claus
parents: 118
diff changeset
  1006
    ^ cursorLine
claus
parents: 118
diff changeset
  1007
!
claus
parents: 118
diff changeset
  1008
claus
parents: 118
diff changeset
  1009
cursorForegroundColor:color1 backgroundColor:color2
claus
parents: 118
diff changeset
  1010
    "set both cursor foreground and cursor background colors"
claus
parents: 118
diff changeset
  1011
claus
parents: 118
diff changeset
  1012
    |wasOn|
claus
parents: 118
diff changeset
  1013
claus
parents: 118
diff changeset
  1014
    wasOn := self hideCursor.
claus
parents: 118
diff changeset
  1015
    cursorFgColor := color1 on:device.
claus
parents: 118
diff changeset
  1016
    cursorBgColor := color2 on:device.
claus
parents: 118
diff changeset
  1017
    wasOn ifTrue:[self showCursor]
claus
parents: 118
diff changeset
  1018
!
claus
parents: 118
diff changeset
  1019
claus
parents: 118
diff changeset
  1020
cursorCol
claus
parents: 118
diff changeset
  1021
    "return the cursors col (1..).
claus
parents: 118
diff changeset
  1022
     This is the absolute col; NOT the visible col"
claus
parents: 118
diff changeset
  1023
claus
parents: 118
diff changeset
  1024
    ^ cursorCol
claus
parents: 118
diff changeset
  1025
!
claus
parents: 118
diff changeset
  1026
claus
parents: 118
diff changeset
  1027
readOnly
claus
parents: 118
diff changeset
  1028
    "make the text readonly"
claus
parents: 118
diff changeset
  1029
claus
parents: 118
diff changeset
  1030
    readOnly := true
claus
parents: 118
diff changeset
  1031
!
claus
parents: 118
diff changeset
  1032
claus
parents: 118
diff changeset
  1033
fixedSize
claus
parents: 118
diff changeset
  1034
    "make the texts size fixed (no lines may be added).
claus
parents: 118
diff changeset
  1035
     OBSOLETE: use readOnly"
claus
parents: 118
diff changeset
  1036
claus
parents: 118
diff changeset
  1037
    readOnly ifFalse:[
claus
parents: 118
diff changeset
  1038
	readOnly := true.
claus
parents: 118
diff changeset
  1039
	middleButtonMenu disable:#cut.
claus
parents: 118
diff changeset
  1040
	middleButtonMenu disable:#paste.
claus
parents: 118
diff changeset
  1041
	middleButtonMenu disable:#replace.
claus
parents: 118
diff changeset
  1042
	middleButtonMenu disable:#indent
claus
parents: 118
diff changeset
  1043
    ]
claus
parents: 118
diff changeset
  1044
!
claus
parents: 118
diff changeset
  1045
claus
parents: 118
diff changeset
  1046
fromFile:aFileName
claus
parents: 118
diff changeset
  1047
    "take contents from a named file"
claus
parents: 118
diff changeset
  1048
claus
parents: 118
diff changeset
  1049
    self contents:(aFileName asFilename readStream contents)
claus
parents: 118
diff changeset
  1050
! !
claus
parents: 118
diff changeset
  1051
claus
parents: 118
diff changeset
  1052
!EditTextView methodsFor:'redrawing'!
claus
parents: 118
diff changeset
  1053
claus
parents: 118
diff changeset
  1054
redrawVisibleLine:visLine
claus
parents: 118
diff changeset
  1055
    "redraw a visible line"
claus
parents: 118
diff changeset
  1056
claus
parents: 118
diff changeset
  1057
    super redrawVisibleLine:visLine.
claus
parents: 118
diff changeset
  1058
    self redrawCursorIfInVisibleLine:visLine
claus
parents: 118
diff changeset
  1059
!
claus
parents: 118
diff changeset
  1060
claus
parents: 118
diff changeset
  1061
redrawCursorIfInVisibleLine:visLine
claus
parents: 118
diff changeset
  1062
    "redraw the cursor, if it sits in visible line"
claus
parents: 118
diff changeset
  1063
claus
parents: 118
diff changeset
  1064
    cursorShown ifTrue:[
claus
parents: 118
diff changeset
  1065
	(visLine == cursorVisibleLine) ifTrue:[
claus
parents: 118
diff changeset
  1066
	    self drawCursorCharacter
claus
parents: 118
diff changeset
  1067
	]
claus
parents: 118
diff changeset
  1068
    ]
claus
parents: 118
diff changeset
  1069
!
claus
parents: 118
diff changeset
  1070
claus
parents: 118
diff changeset
  1071
redrawVisibleLine:visLine from:startCol to:endCol
claus
parents: 118
diff changeset
  1072
    "redraw a visible line from startCol to endCol"
claus
parents: 118
diff changeset
  1073
claus
parents: 118
diff changeset
  1074
    super redrawVisibleLine:visLine from:startCol to:endCol.
claus
parents: 118
diff changeset
  1075
    self redrawCursorIfInVisibleLine:visLine
claus
parents: 118
diff changeset
  1076
!
claus
parents: 118
diff changeset
  1077
claus
parents: 118
diff changeset
  1078
redrawFromVisibleLine:startVisLine to:endVisLine
claus
parents: 118
diff changeset
  1079
    "redraw a visible line range"
claus
parents: 118
diff changeset
  1080
claus
parents: 118
diff changeset
  1081
    super redrawFromVisibleLine:startVisLine to:endVisLine.
claus
parents: 118
diff changeset
  1082
    self redrawCursorIfBetweenVisibleLine:startVisLine and:endVisLine
claus
parents: 118
diff changeset
  1083
!
claus
parents: 118
diff changeset
  1084
claus
parents: 118
diff changeset
  1085
redrawCursorIfBetweenVisibleLine:startVisLine and:endVisLine
claus
parents: 118
diff changeset
  1086
    "redraw the cursor, if it sits in a line range"
claus
parents: 118
diff changeset
  1087
claus
parents: 118
diff changeset
  1088
    cursorShown ifTrue:[
claus
parents: 118
diff changeset
  1089
	cursorVisibleLine notNil ifTrue:[
claus
parents: 118
diff changeset
  1090
	    (cursorVisibleLine between:startVisLine and:endVisLine) ifTrue:[
claus
parents: 118
diff changeset
  1091
		self drawCursorCharacter
claus
parents: 118
diff changeset
  1092
	    ]
claus
parents: 118
diff changeset
  1093
	]
claus
parents: 118
diff changeset
  1094
    ]
claus
parents: 118
diff changeset
  1095
!
claus
parents: 118
diff changeset
  1096
claus
parents: 118
diff changeset
  1097
redrawVisibleLine:visLine from:startCol
claus
parents: 118
diff changeset
  1098
    "redraw a visible line from startCol to the end of line"
claus
parents: 118
diff changeset
  1099
claus
parents: 118
diff changeset
  1100
    super redrawVisibleLine:visLine from:startCol.
claus
parents: 118
diff changeset
  1101
    self redrawCursorIfInVisibleLine:visLine
claus
parents: 118
diff changeset
  1102
!
claus
parents: 118
diff changeset
  1103
claus
parents: 118
diff changeset
  1104
redrawVisibleLine:visLine col:colNr
claus
parents: 118
diff changeset
  1105
    "redraw the single character in visibleline at colNr"
claus
parents: 118
diff changeset
  1106
claus
parents: 118
diff changeset
  1107
    cursorShown ifTrue:[
claus
parents: 118
diff changeset
  1108
	(visLine == cursorVisibleLine) ifTrue:[
claus
parents: 118
diff changeset
  1109
	    (colNr == cursorCol) ifTrue:[
claus
parents: 118
diff changeset
  1110
		self drawCursorCharacter.
claus
parents: 118
diff changeset
  1111
		^ self
claus
parents: 118
diff changeset
  1112
	    ]
claus
parents: 118
diff changeset
  1113
	]
claus
parents: 118
diff changeset
  1114
    ].
claus
parents: 118
diff changeset
  1115
    super redrawVisibleLine:visLine col:colNr
claus
parents: 118
diff changeset
  1116
! !
claus
parents: 118
diff changeset
  1117
claus
parents: 118
diff changeset
  1118
!EditTextView methodsFor:'selections'!
claus
parents: 118
diff changeset
  1119
claus
parents: 118
diff changeset
  1120
unselect
claus
parents: 118
diff changeset
  1121
    "forget and unhilight selection - must take care of cursor here"
claus
parents: 118
diff changeset
  1122
claus
parents: 118
diff changeset
  1123
    |wasOn|
claus
parents: 118
diff changeset
  1124
claus
parents: 118
diff changeset
  1125
    wasOn := self hideCursor.
claus
parents: 118
diff changeset
  1126
    super unselect.
claus
parents: 118
diff changeset
  1127
    wasOn ifTrue:[self showCursor]
claus
parents: 118
diff changeset
  1128
!
claus
parents: 118
diff changeset
  1129
claus
parents: 118
diff changeset
  1130
selectFromLine:startLine col:startCol toLine:endLine col:endCol
claus
parents: 118
diff changeset
  1131
    "when a range is selected, position the cursor behind the selection
claus
parents: 118
diff changeset
  1132
     for easier editing. Also typeOfSelection is nilled here."
claus
parents: 118
diff changeset
  1133
claus
parents: 118
diff changeset
  1134
    super selectFromLine:startLine col:startCol toLine:endLine col:endCol.
claus
parents: 118
diff changeset
  1135
    self cursorLine:selectionEndLine col:(selectionEndCol + 1).
claus
parents: 118
diff changeset
  1136
    typeOfSelection := nil
claus
parents: 118
diff changeset
  1137
!
claus
parents: 118
diff changeset
  1138
claus
parents: 118
diff changeset
  1139
selectAll
claus
parents: 118
diff changeset
  1140
    "select the whole text.
claus
parents: 118
diff changeset
  1141
     redefined to send super selectFrom... since we dont want the
claus
parents: 118
diff changeset
  1142
     cursor to be moved in this case."
claus
parents: 118
diff changeset
  1143
claus
parents: 118
diff changeset
  1144
    list isNil ifTrue:[
claus
parents: 118
diff changeset
  1145
	self unselect
claus
parents: 118
diff changeset
  1146
    ] ifFalse:[
claus
parents: 118
diff changeset
  1147
	super selectFromLine:1 col:1 toLine:(list size + 1) col:0.
claus
parents: 118
diff changeset
  1148
	typeOfSelection := nil
claus
parents: 118
diff changeset
  1149
    ]
claus
parents: 118
diff changeset
  1150
!
claus
parents: 118
diff changeset
  1151
claus
parents: 118
diff changeset
  1152
selectCursorLine
claus
parents: 118
diff changeset
  1153
    "select cursorline up to cursor position"
claus
parents: 118
diff changeset
  1154
claus
parents: 118
diff changeset
  1155
    self selectFromLine:cursorLine col:1
claus
parents: 118
diff changeset
  1156
		 toLine:cursorLine col:cursorCol
claus
parents: 118
diff changeset
  1157
!
claus
parents: 118
diff changeset
  1158
claus
parents: 118
diff changeset
  1159
selectWordUnderCursor
claus
parents: 118
diff changeset
  1160
    "select the word under the cursor"
claus
parents: 118
diff changeset
  1161
claus
parents: 118
diff changeset
  1162
    self selectWordAtLine:cursorLine col:cursorCol
claus
parents: 118
diff changeset
  1163
!
claus
parents: 118
diff changeset
  1164
claus
parents: 118
diff changeset
  1165
selectFromBeginning
claus
parents: 118
diff changeset
  1166
    "select the text from the beginning to the current cursor position."
claus
parents: 118
diff changeset
  1167
claus
parents: 118
diff changeset
  1168
    |col|
claus
parents: 118
diff changeset
  1169
claus
parents: 118
diff changeset
  1170
    list isNil ifTrue:[
claus
parents: 118
diff changeset
  1171
	self unselect
claus
parents: 118
diff changeset
  1172
    ] ifFalse:[
claus
parents: 118
diff changeset
  1173
	cursorCol == 0 ifTrue:[
claus
parents: 118
diff changeset
  1174
	    col := 0
claus
parents: 118
diff changeset
  1175
	] ifFalse:[
claus
parents: 118
diff changeset
  1176
	    col := cursorCol - 1
claus
parents: 118
diff changeset
  1177
	].
claus
parents: 118
diff changeset
  1178
	super selectFromLine:1 col:1 toLine:cursorLine col:col.
claus
parents: 118
diff changeset
  1179
	typeOfSelection := nil
claus
parents: 118
diff changeset
  1180
    ]
claus
parents: 118
diff changeset
  1181
!
claus
parents: 118
diff changeset
  1182
claus
parents: 118
diff changeset
  1183
selectUpToEnd
claus
parents: 118
diff changeset
  1184
    "select the text from the current cursor position to the end."
claus
parents: 118
diff changeset
  1185
claus
parents: 118
diff changeset
  1186
    list isNil ifTrue:[
claus
parents: 118
diff changeset
  1187
	self unselect
claus
parents: 118
diff changeset
  1188
    ] ifFalse:[
claus
parents: 118
diff changeset
  1189
	super selectFromLine:cursorLine col:cursorCol toLine:(list size + 1) col:0.
claus
parents: 118
diff changeset
  1190
	typeOfSelection := nil
claus
parents: 118
diff changeset
  1191
    ]
claus
parents: 118
diff changeset
  1192
! !
claus
parents: 118
diff changeset
  1193
125
claus
parents: 123
diff changeset
  1194
!EditTextView methodsFor:'queries'!
claus
parents: 123
diff changeset
  1195
claus
parents: 123
diff changeset
  1196
widthOfContents
claus
parents: 123
diff changeset
  1197
    "return the width of the contents in pixels
claus
parents: 123
diff changeset
  1198
     Redefined to add the size of a space (for the cursor).
claus
parents: 123
diff changeset
  1199
     this enables us to scroll one position further than the longest
claus
parents: 123
diff changeset
  1200
     line (and possibly see the cursor behind the line)"
claus
parents: 123
diff changeset
  1201
claus
parents: 123
diff changeset
  1202
    |w|
claus
parents: 123
diff changeset
  1203
claus
parents: 123
diff changeset
  1204
    w := super widthOfContents.
claus
parents: 123
diff changeset
  1205
    ^ w + (font widthOf:' ')
claus
parents: 123
diff changeset
  1206
! !
claus
parents: 123
diff changeset
  1207
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1208
!EditTextView methodsFor:'private'!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1209
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1210
textChanged
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1211
    "triggered whenever text has been edited (not to confuse with
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1212
     contentsChanged, which is triggered when the size has changed, and
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1213
     is used to notify scrollers, other views etc.)"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1214
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1215
    super contentsChanged.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1216
    modified := true.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1217
    contentsWasSaved := false
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1218
! !
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1219
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1220
!EditTextView methodsFor:'editing'!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1221
121
claus
parents: 118
diff changeset
  1222
insertStringAtCursor:aString
claus
parents: 118
diff changeset
  1223
    "insert the argument, aString at cursor position
claus
parents: 118
diff changeset
  1224
     handle cr's correctly. A nil argument is interpreted as an empty line."
claus
parents: 118
diff changeset
  1225
claus
parents: 118
diff changeset
  1226
    |start " { Class: SmallInteger }"
claus
parents: 118
diff changeset
  1227
     stop  " { Class: SmallInteger }"
claus
parents: 118
diff changeset
  1228
     end   " { Class: SmallInteger }"
claus
parents: 118
diff changeset
  1229
     subString|
claus
parents: 118
diff changeset
  1230
claus
parents: 118
diff changeset
  1231
    aString isNil ifTrue:[
claus
parents: 118
diff changeset
  1232
	"new:"
claus
parents: 118
diff changeset
  1233
	self insertCharAtCursor:(Character cr).
claus
parents: 118
diff changeset
  1234
	^ self
claus
parents: 118
diff changeset
  1235
    ].
claus
parents: 118
diff changeset
  1236
    ((aString occurrencesOf:(Character cr)) == 0) ifTrue:[
claus
parents: 118
diff changeset
  1237
	^ self insertStringWithoutCRsAtCursor:aString
claus
parents: 118
diff changeset
  1238
    ].
claus
parents: 118
diff changeset
  1239
claus
parents: 118
diff changeset
  1240
    self insertLines:aString asStringCollection withCr:false.
claus
parents: 118
diff changeset
  1241
claus
parents: 118
diff changeset
  1242
"/    start := 1.
claus
parents: 118
diff changeset
  1243
"/    end := aString size.
claus
parents: 118
diff changeset
  1244
"/    "insert the 1st line"
claus
parents: 118
diff changeset
  1245
"/    (cursorCol ~~ 1) ifTrue:[
claus
parents: 118
diff changeset
  1246
"/        stop := aString indexOf:(Character cr) startingAt:start.
claus
parents: 118
diff changeset
  1247
"/        stop == 0 ifTrue:[
claus
parents: 118
diff changeset
  1248
"/            stop := end + 1
claus
parents: 118
diff changeset
  1249
"/        ].
claus
parents: 118
diff changeset
  1250
"/        subString := aString copyFrom:start to:(stop - 1).
claus
parents: 118
diff changeset
  1251
"/        self insertStringWithoutCRsAtCursor:subString.
claus
parents: 118
diff changeset
  1252
"/        self insertCharAtCursor:(Character cr).
claus
parents: 118
diff changeset
  1253
"/        start := stop + 1
claus
parents: 118
diff changeset
  1254
"/    ].
claus
parents: 118
diff changeset
  1255
"/    "insert the block of full lines"
claus
parents: 118
diff changeset
  1256
"/
claus
parents: 118
diff changeset
  1257
"/    [start <= end] whileTrue:[
claus
parents: 118
diff changeset
  1258
"/        stop := aString indexOf:(Character cr) startingAt:start.
claus
parents: 118
diff changeset
  1259
"/        stop == 0 ifTrue:[
claus
parents: 118
diff changeset
  1260
"/            stop := end + 1
claus
parents: 118
diff changeset
  1261
"/        ].
claus
parents: 118
diff changeset
  1262
"/        subString := aString copyFrom:start to:(stop - 1).
claus
parents: 118
diff changeset
  1263
"/        self insertStringWithoutCRsAtCursor:subString.
claus
parents: 118
diff changeset
  1264
"/        (stop < end) ifTrue:[
claus
parents: 118
diff changeset
  1265
"/            self insertCharAtCursor:(Character cr)
claus
parents: 118
diff changeset
  1266
"/        ].
claus
parents: 118
diff changeset
  1267
"/        start := stop + 1
claus
parents: 118
diff changeset
  1268
"/    ]
claus
parents: 118
diff changeset
  1269
!
claus
parents: 118
diff changeset
  1270
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1271
insert:aCharacter atLine:lineNr col:colNr
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1272
    "insert a single character at lineNr/colNr"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1273
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1274
    |line lineSize newLine drawCharacterOnly|
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1275
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1276
    readOnly ifTrue: [
118
claus
parents: 105
diff changeset
  1277
	exceptionBlock value:errorMessage.
claus
parents: 105
diff changeset
  1278
	^ self
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1279
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1280
    aCharacter == (Character cr) ifTrue:[
118
claus
parents: 105
diff changeset
  1281
	self splitLine:lineNr before:colNr.
claus
parents: 105
diff changeset
  1282
	^ self
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1283
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1284
    drawCharacterOnly := false.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1285
    self checkForExistingLine:lineNr.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1286
    line := list at:lineNr.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1287
    lineSize := line size.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1288
    (aCharacter == Character space) ifTrue:[
118
claus
parents: 105
diff changeset
  1289
	(colNr > lineSize)  ifTrue:[
claus
parents: 105
diff changeset
  1290
	    ^ self
claus
parents: 105
diff changeset
  1291
	]
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1292
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1293
    (lineSize == 0) ifTrue: [
118
claus
parents: 105
diff changeset
  1294
	newLine := String new:colNr.
claus
parents: 105
diff changeset
  1295
	drawCharacterOnly := true
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1296
    ] ifFalse: [
118
claus
parents: 105
diff changeset
  1297
	(colNr > lineSize) ifTrue: [
claus
parents: 105
diff changeset
  1298
	    newLine := String new:colNr.
claus
parents: 105
diff changeset
  1299
	    newLine replaceFrom:1 to:lineSize
claus
parents: 105
diff changeset
  1300
			   with:line startingAt:1.
claus
parents: 105
diff changeset
  1301
	    drawCharacterOnly := true
claus
parents: 105
diff changeset
  1302
	] ifFalse: [
claus
parents: 105
diff changeset
  1303
	    newLine := String new:(lineSize + 1).
claus
parents: 105
diff changeset
  1304
	    newLine replaceFrom:1 to:(colNr - 1)
claus
parents: 105
diff changeset
  1305
			   with:line startingAt:1.
claus
parents: 105
diff changeset
  1306
	    newLine replaceFrom:(colNr + 1) to:(lineSize + 1)
claus
parents: 105
diff changeset
  1307
			   with:line startingAt:colNr
claus
parents: 105
diff changeset
  1308
	]
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1309
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1310
    newLine at:colNr put:aCharacter.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1311
    aCharacter == (Character tab) ifTrue:[
118
claus
parents: 105
diff changeset
  1312
	newLine := self withTabsExpanded:newLine.
claus
parents: 105
diff changeset
  1313
	drawCharacterOnly := false
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1314
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1315
    list at:lineNr put:newLine.
118
claus
parents: 105
diff changeset
  1316
    widthOfWidestLine notNil ifTrue:[
claus
parents: 105
diff changeset
  1317
	widthOfWidestLine := widthOfWidestLine max:(self widthOfLineString:line).
claus
parents: 105
diff changeset
  1318
    ].
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1319
    self textChanged.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1320
    shown ifTrue:[
118
claus
parents: 105
diff changeset
  1321
	drawCharacterOnly ifTrue:[
claus
parents: 105
diff changeset
  1322
	    self redrawLine:lineNr col:colNr
claus
parents: 105
diff changeset
  1323
	] ifFalse:[
claus
parents: 105
diff changeset
  1324
	    self redrawLine:lineNr from:colNr
claus
parents: 105
diff changeset
  1325
	]
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1326
    ]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1327
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1328
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1329
withoutRedrawInsertStringWithoutCRs:aString atLine:lineNr col:colNr
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1330
    "insert aString (which has no crs) at lineNr/colNr"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1331
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1332
    |strLen line lineSize newLine|
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1333
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1334
    aString isNil ifTrue:[^ self].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1335
    readOnly ifTrue: [
118
claus
parents: 105
diff changeset
  1336
	exceptionBlock value:errorMessage.
claus
parents: 105
diff changeset
  1337
	^ self
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1338
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1339
    strLen := aString size.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1340
    self checkForExistingLine:lineNr.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1341
    line := list at:lineNr.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1342
    line notNil ifTrue:[
118
claus
parents: 105
diff changeset
  1343
	lineSize := line size
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1344
    ] ifFalse:[
118
claus
parents: 105
diff changeset
  1345
	lineSize := 0
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1346
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1347
    ((colNr == 1) and:[lineSize == 0]) ifTrue: [
118
claus
parents: 105
diff changeset
  1348
	newLine := aString
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1349
    ] ifFalse:[
118
claus
parents: 105
diff changeset
  1350
	(lineSize == 0) ifTrue: [
claus
parents: 105
diff changeset
  1351
	    newLine := String new:(colNr + strLen - 1)
claus
parents: 105
diff changeset
  1352
	] ifFalse: [
claus
parents: 105
diff changeset
  1353
	    (colNr > lineSize) ifTrue: [
claus
parents: 105
diff changeset
  1354
		newLine := String new:(colNr + strLen - 1).
claus
parents: 105
diff changeset
  1355
		newLine replaceFrom:1 to:lineSize
claus
parents: 105
diff changeset
  1356
			       with:line startingAt:1
claus
parents: 105
diff changeset
  1357
	    ] ifFalse: [
claus
parents: 105
diff changeset
  1358
		newLine := String new:(lineSize + strLen).
claus
parents: 105
diff changeset
  1359
		newLine replaceFrom:1 to:(colNr - 1)
claus
parents: 105
diff changeset
  1360
			       with:line startingAt:1.
claus
parents: 105
diff changeset
  1361
		newLine replaceFrom:(colNr + strLen) to:(lineSize + strLen)
claus
parents: 105
diff changeset
  1362
			       with:line startingAt:colNr
claus
parents: 105
diff changeset
  1363
	    ]
claus
parents: 105
diff changeset
  1364
	].
claus
parents: 105
diff changeset
  1365
	newLine replaceFrom:colNr to:(colNr + strLen - 1)
claus
parents: 105
diff changeset
  1366
		       with:aString startingAt:1
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1367
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1368
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1369
    (aString occurrencesOf:(Character tab)) == 0 ifFalse:[
118
claus
parents: 105
diff changeset
  1370
	newLine := self withTabsExpanded:newLine
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1371
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1372
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1373
    list at:lineNr put:newLine.
118
claus
parents: 105
diff changeset
  1374
    widthOfWidestLine notNil ifTrue:[
claus
parents: 105
diff changeset
  1375
	widthOfWidestLine := widthOfWidestLine max:(self widthOfLineString:newLine).
claus
parents: 105
diff changeset
  1376
    ].
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1377
    self textChanged.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1378
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1379
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1380
splitLine:lineNr before:colNr
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1381
    "split the line linNr before colNr; the right part (from colNr)
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1382
     is cut off and inserted after lineNr; the view is redrawn"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1383
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1384
    |line lineSize leftRest rightRest visLine w      
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1385
     srcY    "{ Class: SmallInteger }" |
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1386
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1387
    list isNil ifFalse:[
118
claus
parents: 105
diff changeset
  1388
	lineNr > (list size) ifFalse:[
claus
parents: 105
diff changeset
  1389
	    (colNr == 1) ifTrue:[
claus
parents: 105
diff changeset
  1390
		self insertLine:nil before:lineNr.
claus
parents: 105
diff changeset
  1391
		^ self
claus
parents: 105
diff changeset
  1392
	    ].
claus
parents: 105
diff changeset
  1393
	    line := list at:lineNr.
claus
parents: 105
diff changeset
  1394
	    line isNil ifFalse:[
claus
parents: 105
diff changeset
  1395
		lineSize := line size.
claus
parents: 105
diff changeset
  1396
		(colNr <= lineSize) ifTrue:[
claus
parents: 105
diff changeset
  1397
		    rightRest := line copyFrom:colNr to:lineSize.
claus
parents: 105
diff changeset
  1398
		    (colNr > 1) ifTrue:[
claus
parents: 105
diff changeset
  1399
			leftRest := line copyTo:(colNr - 1)
claus
parents: 105
diff changeset
  1400
		    ]
claus
parents: 105
diff changeset
  1401
		] ifFalse:[
claus
parents: 105
diff changeset
  1402
		    leftRest := line
claus
parents: 105
diff changeset
  1403
		]
claus
parents: 105
diff changeset
  1404
	    ].
claus
parents: 105
diff changeset
  1405
	    leftRest notNil ifTrue:[
claus
parents: 105
diff changeset
  1406
		leftRest isBlank ifTrue:[leftRest := nil]
claus
parents: 105
diff changeset
  1407
	    ].
claus
parents: 105
diff changeset
  1408
	    list at:lineNr put:leftRest.
claus
parents: 105
diff changeset
  1409
	    self withoutRedrawInsertLine:rightRest before:(lineNr + 1).
claus
parents: 105
diff changeset
  1410
claus
parents: 105
diff changeset
  1411
	    visLine := self listLineToVisibleLine:(lineNr).
claus
parents: 105
diff changeset
  1412
	    visLine notNil ifTrue:[
claus
parents: 105
diff changeset
  1413
		w := self widthForScrollBetween:lineNr
claus
parents: 105
diff changeset
  1414
					    and:(firstLineShown + nLinesShown).
claus
parents: 105
diff changeset
  1415
		srcY := topMargin + (visLine * fontHeight).
claus
parents: 105
diff changeset
  1416
		self catchExpose.
claus
parents: 105
diff changeset
  1417
		self copyFrom:self x:textStartLeft y:srcY
claus
parents: 105
diff changeset
  1418
				 toX:textStartLeft y:(srcY + fontHeight)
claus
parents: 105
diff changeset
  1419
			       width:w
claus
parents: 105
diff changeset
  1420
			      height:((nLinesShown - visLine - 1) * fontHeight).
claus
parents: 105
diff changeset
  1421
		self redrawLine:lineNr.
claus
parents: 105
diff changeset
  1422
		self redrawLine:(lineNr + 1).
claus
parents: 105
diff changeset
  1423
		self waitForExpose
claus
parents: 105
diff changeset
  1424
	    ].
claus
parents: 105
diff changeset
  1425
	    widthOfWidestLine := nil. "/ unknown
claus
parents: 105
diff changeset
  1426
	    self textChanged.
claus
parents: 105
diff changeset
  1427
	]
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1428
    ]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1429
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1430
121
claus
parents: 118
diff changeset
  1431
insertStringWithoutCRs:aString atLine:lineNr col:colNr
claus
parents: 118
diff changeset
  1432
    "insert aString (which has no crs) at lineNr/colNr"
claus
parents: 118
diff changeset
  1433
claus
parents: 118
diff changeset
  1434
    self withoutRedrawInsertStringWithoutCRs:aString atLine:lineNr col:colNr.
claus
parents: 118
diff changeset
  1435
    shown ifTrue:[self redrawLine:lineNr from:colNr]
claus
parents: 118
diff changeset
  1436
!
claus
parents: 118
diff changeset
  1437
claus
parents: 118
diff changeset
  1438
insertStringWithoutCRsAtCursor:aString
claus
parents: 118
diff changeset
  1439
    "insert a string (which has no crs) at cursor position
claus
parents: 118
diff changeset
  1440
     - advance cursor"
claus
parents: 118
diff changeset
  1441
claus
parents: 118
diff changeset
  1442
    |wasOn|
claus
parents: 118
diff changeset
  1443
claus
parents: 118
diff changeset
  1444
    aString notNil ifTrue:[
claus
parents: 118
diff changeset
  1445
	wasOn := self hideCursor.
claus
parents: 118
diff changeset
  1446
	self insertString:aString atLine:cursorLine col:cursorCol.
claus
parents: 118
diff changeset
  1447
	cursorCol := cursorCol + aString size.
claus
parents: 118
diff changeset
  1448
	wasOn ifTrue:[self showCursor]
claus
parents: 118
diff changeset
  1449
    ]
claus
parents: 118
diff changeset
  1450
!
claus
parents: 118
diff changeset
  1451
claus
parents: 118
diff changeset
  1452
insertCharAtCursor:aCharacter
claus
parents: 118
diff changeset
  1453
    "insert a single character at cursor-position - advance cursor"
claus
parents: 118
diff changeset
  1454
claus
parents: 118
diff changeset
  1455
    |wasOn|
claus
parents: 118
diff changeset
  1456
claus
parents: 118
diff changeset
  1457
    wasOn := self hideCursor.
claus
parents: 118
diff changeset
  1458
    self insert:aCharacter atLine:cursorLine col:cursorCol.
claus
parents: 118
diff changeset
  1459
    aCharacter == (Character cr) ifTrue:[
claus
parents: 118
diff changeset
  1460
	self cursorReturn
claus
parents: 118
diff changeset
  1461
    ] ifFalse:[
125
claus
parents: 123
diff changeset
  1462
	self cursorRight.
121
claus
parents: 118
diff changeset
  1463
    ].
claus
parents: 118
diff changeset
  1464
    self makeCursorVisibleAndShowCursor:wasOn.
claus
parents: 118
diff changeset
  1465
!
claus
parents: 118
diff changeset
  1466
claus
parents: 118
diff changeset
  1467
insertString:aString atLine:lineNr col:colNr
claus
parents: 118
diff changeset
  1468
    "insert the string, aString at line/col;
claus
parents: 118
diff changeset
  1469
     handle cr's correctly"
claus
parents: 118
diff changeset
  1470
claus
parents: 118
diff changeset
  1471
    |start           "{ Class: SmallInteger }"
claus
parents: 118
diff changeset
  1472
     stop            "{ Class: SmallInteger }"
claus
parents: 118
diff changeset
  1473
     end             "{ Class: SmallInteger }"
claus
parents: 118
diff changeset
  1474
     subString c
claus
parents: 118
diff changeset
  1475
     l               "{ Class: SmallInteger }" |
claus
parents: 118
diff changeset
  1476
claus
parents: 118
diff changeset
  1477
claus
parents: 118
diff changeset
  1478
    aString isNil ifTrue:[^ self].
claus
parents: 118
diff changeset
  1479
    ((aString occurrencesOf:(Character cr)) == 0) ifTrue:[
claus
parents: 118
diff changeset
  1480
	^ self insertStringWithoutCRs:aString atLine:lineNr col:colNr
claus
parents: 118
diff changeset
  1481
    ].
claus
parents: 118
diff changeset
  1482
    l := lineNr.
claus
parents: 118
diff changeset
  1483
    c := colNr.
claus
parents: 118
diff changeset
  1484
    start := 1.
claus
parents: 118
diff changeset
  1485
    end := aString size.
claus
parents: 118
diff changeset
  1486
    [start <= end] whileTrue:[
claus
parents: 118
diff changeset
  1487
	stop := aString indexOf:(Character cr) startingAt:start.
claus
parents: 118
diff changeset
  1488
	stop == 0 ifTrue:[
claus
parents: 118
diff changeset
  1489
	    stop := end + 1
claus
parents: 118
diff changeset
  1490
	].
claus
parents: 118
diff changeset
  1491
	subString := aString copyFrom:start to:(stop - 1).
claus
parents: 118
diff changeset
  1492
	self insertStringWithoutCRs:subString atLine:l col:c.
claus
parents: 118
diff changeset
  1493
	(stop < end) ifTrue:[
claus
parents: 118
diff changeset
  1494
	    c := c + subString size.
claus
parents: 118
diff changeset
  1495
	    self insert:(Character cr) atLine:l col:c.
claus
parents: 118
diff changeset
  1496
	    l := l + 1.
claus
parents: 118
diff changeset
  1497
	    c := 1
claus
parents: 118
diff changeset
  1498
	].
claus
parents: 118
diff changeset
  1499
	start := stop + 1
claus
parents: 118
diff changeset
  1500
    ]
claus
parents: 118
diff changeset
  1501
!
claus
parents: 118
diff changeset
  1502
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1503
withoutRedrawInsertLine:aString before:lineNr
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1504
    "insert the argument, aString before line lineNr; the string
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1505
     becomes line nileNr; everything else is moved down; the view
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1506
     is not redrawn"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1507
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1508
    |line|
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1509
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1510
    readOnly ifTrue: [
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1511
	exceptionBlock value:errorMessage.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1512
	^ self
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1513
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1514
    line := aString.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1515
    line notNil ifTrue:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1516
	line isBlank ifTrue:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1517
	    line := nil
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1518
	] ifFalse:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1519
	    (line occurrencesOf:(Character tab)) == 0 ifFalse:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1520
		line := self withTabsExpanded:line
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1521
	    ]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1522
	]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1523
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1524
    list isNil ifTrue: [
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1525
	list := StringCollection new:lineNr
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1526
    ] ifFalse: [
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1527
	list grow:((list size + 1) max:lineNr)
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1528
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1529
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1530
    "I have changed 'replaceFrom:to:with:startingAt:' to correctly handle 
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1531
     overlapping copy - if it didn't, we had to use:"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1532
"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1533
    index := list size.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1534
    [index > lineNr] whileTrue: [
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1535
	pIndex := index - 1.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1536
	list at:index put:(list at:pIndex).
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1537
	index := pIndex
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1538
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1539
"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1540
    list replaceFrom:(lineNr + 1) to:(list size) with:list startingAt:lineNr.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1541
    list at:lineNr put:line.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1542
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1543
121
claus
parents: 118
diff changeset
  1544
insertLines:lines withCr:withCr
claus
parents: 118
diff changeset
  1545
    "insert a bunch of lines at cursor position. Cursor
claus
parents: 118
diff changeset
  1546
     is moved behind insertion.
claus
parents: 118
diff changeset
  1547
     If withCr is true, append cr after last line"
claus
parents: 118
diff changeset
  1548
claus
parents: 118
diff changeset
  1549
    |start end nLines wasOn|
claus
parents: 118
diff changeset
  1550
claus
parents: 118
diff changeset
  1551
    lines notNil ifTrue:[
claus
parents: 118
diff changeset
  1552
	nLines := lines size.
claus
parents: 118
diff changeset
  1553
	(nLines == 1) ifTrue:[
claus
parents: 118
diff changeset
  1554
	    self insertStringAtCursor:(lines at:1).
claus
parents: 118
diff changeset
  1555
	    withCr ifTrue:[
claus
parents: 118
diff changeset
  1556
		self insertCharAtCursor:(Character cr)
claus
parents: 118
diff changeset
  1557
	    ] 
claus
parents: 118
diff changeset
  1558
	] ifFalse:[
claus
parents: 118
diff changeset
  1559
	    (cursorCol ~~ 1) ifTrue:[
claus
parents: 118
diff changeset
  1560
		self insertStringAtCursor:(lines at:1).
claus
parents: 118
diff changeset
  1561
		self insertCharAtCursor:(Character cr).
claus
parents: 118
diff changeset
  1562
		start := 2
claus
parents: 118
diff changeset
  1563
	    ] ifFalse:[
claus
parents: 118
diff changeset
  1564
		start := 1
claus
parents: 118
diff changeset
  1565
	    ].
claus
parents: 118
diff changeset
  1566
	    withCr ifTrue:[
claus
parents: 118
diff changeset
  1567
		end := nLines
claus
parents: 118
diff changeset
  1568
	    ] ifFalse:[
claus
parents: 118
diff changeset
  1569
		end := nLines - 1
claus
parents: 118
diff changeset
  1570
	    ].
claus
parents: 118
diff changeset
  1571
	    (start < nLines) ifTrue:[
claus
parents: 118
diff changeset
  1572
		(end >= start) ifTrue:[
claus
parents: 118
diff changeset
  1573
		    wasOn := self hideCursor.
claus
parents: 118
diff changeset
  1574
		    self insertLines:lines from:start to:end before:cursorLine.
claus
parents: 118
diff changeset
  1575
		    cursorLine := cursorLine + (end - start + 1).
claus
parents: 118
diff changeset
  1576
		    cursorVisibleLine := self absoluteLineToVisibleLine:cursorLine.
claus
parents: 118
diff changeset
  1577
		    wasOn ifTrue:[self showCursor].
claus
parents: 118
diff changeset
  1578
		]
claus
parents: 118
diff changeset
  1579
	    ].
claus
parents: 118
diff changeset
  1580
	    withCr ifFalse:[
claus
parents: 118
diff changeset
  1581
		"last line without cr"
claus
parents: 118
diff changeset
  1582
		self insertStringAtCursor:(lines at:nLines)
claus
parents: 118
diff changeset
  1583
	    ]
claus
parents: 118
diff changeset
  1584
	]
claus
parents: 118
diff changeset
  1585
    ]
claus
parents: 118
diff changeset
  1586
!
claus
parents: 118
diff changeset
  1587
claus
parents: 118
diff changeset
  1588
deleteSelection
claus
parents: 118
diff changeset
  1589
    "delete the selection"
claus
parents: 118
diff changeset
  1590
claus
parents: 118
diff changeset
  1591
    |wasOn startLine startCol endLine endCol|
claus
parents: 118
diff changeset
  1592
claus
parents: 118
diff changeset
  1593
    readOnly ifTrue: [
claus
parents: 118
diff changeset
  1594
	exceptionBlock value:errorMessage.
claus
parents: 118
diff changeset
  1595
	^ self
claus
parents: 118
diff changeset
  1596
    ].
claus
parents: 118
diff changeset
  1597
    selectionStartLine notNil ifTrue:[
claus
parents: 118
diff changeset
  1598
	wasOn := self hideCursor.
claus
parents: 118
diff changeset
  1599
claus
parents: 118
diff changeset
  1600
	startLine := selectionStartLine.
claus
parents: 118
diff changeset
  1601
	startCol := selectionStartCol.
claus
parents: 118
diff changeset
  1602
	endLine := selectionEndLine.
claus
parents: 118
diff changeset
  1603
	endCol := selectionEndCol.
claus
parents: 118
diff changeset
  1604
	self unselectWithoutRedraw.
claus
parents: 118
diff changeset
  1605
	self deleteFromLine:startLine col:startCol 
claus
parents: 118
diff changeset
  1606
		     toLine:endLine col:endCol.
claus
parents: 118
diff changeset
  1607
	cursorCol := startCol.
claus
parents: 118
diff changeset
  1608
	cursorLine := startLine.
claus
parents: 118
diff changeset
  1609
	cursorVisibleLine := self listLineToVisibleLine:cursorLine.
claus
parents: 118
diff changeset
  1610
	self makeCursorVisibleAndShowCursor:wasOn
claus
parents: 118
diff changeset
  1611
    ]
claus
parents: 118
diff changeset
  1612
!
claus
parents: 118
diff changeset
  1613
claus
parents: 118
diff changeset
  1614
removeTrailingBlankLines
claus
parents: 118
diff changeset
  1615
    "remove all blank lines at end of text"
claus
parents: 118
diff changeset
  1616
claus
parents: 118
diff changeset
  1617
    |lastLine "{ Class: SmallInteger }"
claus
parents: 118
diff changeset
  1618
     line finished|
claus
parents: 118
diff changeset
  1619
claus
parents: 118
diff changeset
  1620
    lastLine := list size.
claus
parents: 118
diff changeset
  1621
    finished := false.
claus
parents: 118
diff changeset
  1622
    [finished] whileFalse:[
claus
parents: 118
diff changeset
  1623
	(lastLine <= 1) ifTrue:[
claus
parents: 118
diff changeset
  1624
	    finished := true
claus
parents: 118
diff changeset
  1625
	] ifFalse:[
claus
parents: 118
diff changeset
  1626
	    line := list at:lastLine.
claus
parents: 118
diff changeset
  1627
	    line notNil ifTrue:[
claus
parents: 118
diff changeset
  1628
		line isBlank ifTrue:[
claus
parents: 118
diff changeset
  1629
		    list at:lastLine put:nil.
claus
parents: 118
diff changeset
  1630
		    line := nil
claus
parents: 118
diff changeset
  1631
		]
claus
parents: 118
diff changeset
  1632
	    ].
claus
parents: 118
diff changeset
  1633
	    line notNil ifTrue:[
claus
parents: 118
diff changeset
  1634
		finished := true
claus
parents: 118
diff changeset
  1635
	    ] ifFalse:[
claus
parents: 118
diff changeset
  1636
		lastLine := lastLine - 1
claus
parents: 118
diff changeset
  1637
	    ]
claus
parents: 118
diff changeset
  1638
	]
claus
parents: 118
diff changeset
  1639
    ].
claus
parents: 118
diff changeset
  1640
    (lastLine ~~ list size) ifTrue:[
claus
parents: 118
diff changeset
  1641
	list grow:lastLine.
claus
parents: 118
diff changeset
  1642
"/        self textChanged
claus
parents: 118
diff changeset
  1643
    ]
claus
parents: 118
diff changeset
  1644
!
claus
parents: 118
diff changeset
  1645
claus
parents: 118
diff changeset
  1646
replaceSelectionBy:something
claus
parents: 118
diff changeset
  1647
    "delete the selection (if any) and insert something, a character or string;
claus
parents: 118
diff changeset
  1648
     leave cursor after insertion"
claus
parents: 118
diff changeset
  1649
claus
parents: 118
diff changeset
  1650
    self replaceSelectionBy:something keepCursor:false
claus
parents: 118
diff changeset
  1651
!
claus
parents: 118
diff changeset
  1652
claus
parents: 118
diff changeset
  1653
withoutRedrawInsertLines:lines from:start to:end before:lineNr
claus
parents: 118
diff changeset
  1654
    "insert a bunch of lines before line lineNr; the view
claus
parents: 118
diff changeset
  1655
     is not redrawn"
claus
parents: 118
diff changeset
  1656
claus
parents: 118
diff changeset
  1657
    |newLine newLines nLines|
claus
parents: 118
diff changeset
  1658
claus
parents: 118
diff changeset
  1659
    readOnly ifTrue: [
claus
parents: 118
diff changeset
  1660
	exceptionBlock value:errorMessage.
claus
parents: 118
diff changeset
  1661
	^ self
claus
parents: 118
diff changeset
  1662
    ].
claus
parents: 118
diff changeset
  1663
claus
parents: 118
diff changeset
  1664
    nLines := end - start + 1.
claus
parents: 118
diff changeset
  1665
    newLines := Array new:(lines size).
claus
parents: 118
diff changeset
  1666
    start to:end do:[:index |
claus
parents: 118
diff changeset
  1667
	newLine := lines at:index.
claus
parents: 118
diff changeset
  1668
	newLine notNil ifTrue:[
claus
parents: 118
diff changeset
  1669
	    newLine isBlank ifTrue:[
claus
parents: 118
diff changeset
  1670
		newLine := nil
claus
parents: 118
diff changeset
  1671
	    ] ifFalse:[
claus
parents: 118
diff changeset
  1672
		(newLine occurrencesOf:(Character tab)) == 0 ifFalse:[
claus
parents: 118
diff changeset
  1673
		    newLine := self withTabsExpanded:newLine
claus
parents: 118
diff changeset
  1674
		]
claus
parents: 118
diff changeset
  1675
	    ]
claus
parents: 118
diff changeset
  1676
	].
claus
parents: 118
diff changeset
  1677
	newLines at:index put:newLine
claus
parents: 118
diff changeset
  1678
    ].
claus
parents: 118
diff changeset
  1679
    list isNil ifTrue: [
claus
parents: 118
diff changeset
  1680
	list := StringCollection new:(lineNr + nLines + 1)
claus
parents: 118
diff changeset
  1681
    ] ifFalse: [
claus
parents: 118
diff changeset
  1682
	list grow:((list size + nLines) max:(lineNr + nLines - 1))
claus
parents: 118
diff changeset
  1683
    ].
claus
parents: 118
diff changeset
  1684
claus
parents: 118
diff changeset
  1685
    "I have changed 'replaceFrom:to:with:startingAt:' to correctly handle 
claus
parents: 118
diff changeset
  1686
     overlapping copy - if it didn't, we had to use:"
claus
parents: 118
diff changeset
  1687
"
claus
parents: 118
diff changeset
  1688
    index := list size.
claus
parents: 118
diff changeset
  1689
    [index > lineNr] whileTrue: [
claus
parents: 118
diff changeset
  1690
	pIndex := index - 1.
claus
parents: 118
diff changeset
  1691
	list at:index put:(list at:pIndex).
claus
parents: 118
diff changeset
  1692
	index := pIndex
claus
parents: 118
diff changeset
  1693
    ].
claus
parents: 118
diff changeset
  1694
"
claus
parents: 118
diff changeset
  1695
    list replaceFrom:(lineNr + nLines) to:(list size) with:list startingAt:lineNr.
claus
parents: 118
diff changeset
  1696
    list replaceFrom:lineNr to:(lineNr + nLines - 1) with:newLines startingAt:start.
claus
parents: 118
diff changeset
  1697
!
claus
parents: 118
diff changeset
  1698
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1699
insertLines:someText from:start to:end before:lineNr
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1700
    "insert a bunch of lines before line lineNr"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1701
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1702
    |visLine w nLines "{ Class: SmallInteger }"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1703
     srcY "{ Class: SmallInteger }"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1704
     dstY "{ Class: SmallInteger }" |
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1705
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1706
    readOnly ifTrue:[
118
claus
parents: 105
diff changeset
  1707
	^ self
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1708
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1709
    visLine := self listLineToVisibleLine:lineNr.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1710
    (shown not or:[visLine isNil]) ifTrue:[
118
claus
parents: 105
diff changeset
  1711
	self withoutRedrawInsertLines:someText
claus
parents: 105
diff changeset
  1712
				 from:start to:end
claus
parents: 105
diff changeset
  1713
			       before:lineNr.
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1714
    ] ifFalse:[
118
claus
parents: 105
diff changeset
  1715
	nLines := end - start + 1.
claus
parents: 105
diff changeset
  1716
	((visLine + nLines) >= nLinesShown) ifTrue:[
claus
parents: 105
diff changeset
  1717
	    self withoutRedrawInsertLines:someText
claus
parents: 105
diff changeset
  1718
				     from:start to:end
claus
parents: 105
diff changeset
  1719
				   before:lineNr.
claus
parents: 105
diff changeset
  1720
	    self redrawFromVisibleLine:visLine to:nLinesShown
claus
parents: 105
diff changeset
  1721
	] ifFalse:[
claus
parents: 105
diff changeset
  1722
	    w := self widthForScrollBetween:(lineNr + nLines)
claus
parents: 105
diff changeset
  1723
					and:(firstLineShown + nLines + nLinesShown).
claus
parents: 105
diff changeset
  1724
	    srcY := topMargin + ((visLine - 1) * fontHeight).
claus
parents: 105
diff changeset
  1725
	    dstY := srcY + (nLines * fontHeight).
claus
parents: 105
diff changeset
  1726
	    "
claus
parents: 105
diff changeset
  1727
	     stupid: must catchExpose before inserting new
claus
parents: 105
diff changeset
  1728
	     stuff - since catchExpose may perform redraws
claus
parents: 105
diff changeset
  1729
	    "
claus
parents: 105
diff changeset
  1730
	    self catchExpose.
claus
parents: 105
diff changeset
  1731
	    self withoutRedrawInsertLines:someText
claus
parents: 105
diff changeset
  1732
				     from:start to:end
claus
parents: 105
diff changeset
  1733
				   before:lineNr.
claus
parents: 105
diff changeset
  1734
	    self copyFrom:self x:textStartLeft y:srcY
claus
parents: 105
diff changeset
  1735
			     toX:textStartLeft y:dstY
claus
parents: 105
diff changeset
  1736
			   width:w
claus
parents: 105
diff changeset
  1737
			  height:(height - dstY).
claus
parents: 105
diff changeset
  1738
	    self redrawFromVisibleLine:visLine to:(visLine + nLines - 1).
claus
parents: 105
diff changeset
  1739
	    self waitForExpose
claus
parents: 105
diff changeset
  1740
	].
claus
parents: 105
diff changeset
  1741
    ].
claus
parents: 105
diff changeset
  1742
    widthOfWidestLine notNil ifTrue:[
claus
parents: 105
diff changeset
  1743
	someText do:[:line |
claus
parents: 105
diff changeset
  1744
	    widthOfWidestLine := widthOfWidestLine max:(self widthOfLineString:line).
claus
parents: 105
diff changeset
  1745
	]
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1746
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1747
    self textChanged.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1748
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1749
121
claus
parents: 118
diff changeset
  1750
deleteCharsAtLine:lineNr fromCol:startCol toCol:endCol
claus
parents: 118
diff changeset
  1751
    "delete characters from startCol to endCol in line lineNr"
claus
parents: 118
diff changeset
  1752
claus
parents: 118
diff changeset
  1753
    |line lineSize newLine|
claus
parents: 118
diff changeset
  1754
claus
parents: 118
diff changeset
  1755
    readOnly ifTrue: [
claus
parents: 118
diff changeset
  1756
	exceptionBlock value:errorMessage.
claus
parents: 118
diff changeset
  1757
	^ self
claus
parents: 118
diff changeset
  1758
    ].
claus
parents: 118
diff changeset
  1759
claus
parents: 118
diff changeset
  1760
    line := self listAt:lineNr.
claus
parents: 118
diff changeset
  1761
    line isNil ifTrue: [^self].
claus
parents: 118
diff changeset
  1762
    lineSize := line size.
claus
parents: 118
diff changeset
  1763
    (startCol > lineSize) ifTrue: [^ self].
claus
parents: 118
diff changeset
  1764
    (endCol == 0) ifTrue:[^ self].
claus
parents: 118
diff changeset
  1765
    (endCol < startCol) ifTrue:[^ self].
claus
parents: 118
diff changeset
  1766
claus
parents: 118
diff changeset
  1767
    (startCol == endCol) ifTrue:[
claus
parents: 118
diff changeset
  1768
	self deleteCharAtLine:lineNr col:startCol.
claus
parents: 118
diff changeset
  1769
	^ self
claus
parents: 118
diff changeset
  1770
    ].
claus
parents: 118
diff changeset
  1771
    (endCol >= lineSize) ifTrue:[
claus
parents: 118
diff changeset
  1772
	self deleteCharsAtLine:lineNr fromCol:startCol.
claus
parents: 118
diff changeset
  1773
	^ self
claus
parents: 118
diff changeset
  1774
    ].
claus
parents: 118
diff changeset
  1775
    (startCol <= 1) ifTrue:[
claus
parents: 118
diff changeset
  1776
	self deleteCharsAtLine:lineNr toCol:endCol.
claus
parents: 118
diff changeset
  1777
	^ self
claus
parents: 118
diff changeset
  1778
    ].
claus
parents: 118
diff changeset
  1779
    newLine := (line copyTo:(startCol - 1)) 
claus
parents: 118
diff changeset
  1780
	       , (line copyFrom:(endCol + 1) to:lineSize).
claus
parents: 118
diff changeset
  1781
claus
parents: 118
diff changeset
  1782
    newLine isBlank ifTrue:[
claus
parents: 118
diff changeset
  1783
	newLine := nil
claus
parents: 118
diff changeset
  1784
    ].
claus
parents: 118
diff changeset
  1785
    list at:lineNr put:newLine.
claus
parents: 118
diff changeset
  1786
    widthOfWidestLine := nil. "/ i.e. unknown
claus
parents: 118
diff changeset
  1787
    self textChanged.
claus
parents: 118
diff changeset
  1788
    self redrawLine:lineNr
claus
parents: 118
diff changeset
  1789
!
claus
parents: 118
diff changeset
  1790
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1791
deleteFromLine:startLine col:startCol toLine:endLine col:endCol
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1792
    "delete all text from startLine/startCol to endLine/endCol -
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1793
     joining lines if nescessary"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1794
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1795
    |line lineSize|
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1796
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1797
    readOnly ifTrue: [
118
claus
parents: 105
diff changeset
  1798
	exceptionBlock value:errorMessage.
claus
parents: 105
diff changeset
  1799
	^ self
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1800
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1801
    list isNil ifTrue:[^ self].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1802
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1803
    (startLine == endLine) ifTrue:[
118
claus
parents: 105
diff changeset
  1804
	"delete chars within a line"
claus
parents: 105
diff changeset
  1805
	self deleteCharsAtLine:startLine fromCol:startCol toCol:endCol.
claus
parents: 105
diff changeset
  1806
	^ self
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1807
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1808
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1809
    ((startCol == 1) and:[endCol == 0]) ifTrue:[
118
claus
parents: 105
diff changeset
  1810
	"delete full lines only"
claus
parents: 105
diff changeset
  1811
	endLine > startLine ifTrue:[
claus
parents: 105
diff changeset
  1812
	    self deleteFromLine:startLine toLine:(endLine - 1)
claus
parents: 105
diff changeset
  1813
	].
claus
parents: 105
diff changeset
  1814
	^ self
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1815
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1816
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1817
    "delete right rest of 1st line"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1818
    self deleteCharsAtLine:startLine fromCol:startCol.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1819
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1820
    "delete the inner lines ..."
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1821
    endLine > (startLine + 1) ifTrue:[
118
claus
parents: 105
diff changeset
  1822
	self deleteFromLine:(startLine + 1) toLine:(endLine - 1)
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1823
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1824
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1825
    (endCol ~~ 0) ifTrue:[
118
claus
parents: 105
diff changeset
  1826
	"delete the left rest of the last line"
claus
parents: 105
diff changeset
  1827
	self deleteCharsAtLine:(startLine + 1) toCol:endCol.
claus
parents: 105
diff changeset
  1828
claus
parents: 105
diff changeset
  1829
	"must add blanks, if startCal lies behond end of startLine"
claus
parents: 105
diff changeset
  1830
	line := list at:startLine.
claus
parents: 105
diff changeset
  1831
	lineSize := line size.
claus
parents: 105
diff changeset
  1832
	(startCol > lineSize) ifTrue:[
claus
parents: 105
diff changeset
  1833
	    line isNil ifTrue:[
claus
parents: 105
diff changeset
  1834
		line := String new:(startCol - 1)
claus
parents: 105
diff changeset
  1835
	    ] ifFalse:[
claus
parents: 105
diff changeset
  1836
		line := line , (String new:(startCol - 1 - lineSize))
claus
parents: 105
diff changeset
  1837
	    ].
claus
parents: 105
diff changeset
  1838
	    list at:startLine put:line.
claus
parents: 105
diff changeset
  1839
	    widthOfWidestLine := nil. "/ i.e. unknown
claus
parents: 105
diff changeset
  1840
	    self textChanged.
claus
parents: 105
diff changeset
  1841
	]
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1842
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1843
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1844
    "merge the left rest of 1st line with right rest of last line into one"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1845
    self mergeLine:startLine
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1846
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1847
121
claus
parents: 118
diff changeset
  1848
deleteCharsAtLine:lineNr fromCol:colNr
claus
parents: 118
diff changeset
  1849
    "delete characters from colNr up to the end in line lineNr"
claus
parents: 118
diff changeset
  1850
claus
parents: 118
diff changeset
  1851
    |line newLine|
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1852
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1853
    readOnly ifTrue: [
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1854
	exceptionBlock value:errorMessage.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1855
	^ self
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1856
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1857
121
claus
parents: 118
diff changeset
  1858
    line := self listAt:lineNr.
claus
parents: 118
diff changeset
  1859
    line isNil ifTrue: [^self].
claus
parents: 118
diff changeset
  1860
    (colNr > line size) ifTrue: [^ self].
claus
parents: 118
diff changeset
  1861
    newLine := line copyTo:(colNr - 1).
claus
parents: 118
diff changeset
  1862
    newLine isBlank ifTrue:[
claus
parents: 118
diff changeset
  1863
	newLine := nil
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1864
    ].
121
claus
parents: 118
diff changeset
  1865
    list at:lineNr put:newLine.
claus
parents: 118
diff changeset
  1866
    widthOfWidestLine := nil. "/ i.e. unknown
claus
parents: 118
diff changeset
  1867
    self textChanged.
claus
parents: 118
diff changeset
  1868
    self redrawLine:lineNr
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1869
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1870
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1871
insertLine:aString before:lineNr
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1872
    "insert the line aString before line lineNr"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1873
121
claus
parents: 118
diff changeset
  1874
    |wasOn visLine w 
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1875
     dstY "{ Class: SmallInteger }" |
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1876
121
claus
parents: 118
diff changeset
  1877
    wasOn := self hideCursor.
claus
parents: 118
diff changeset
  1878
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1879
    visLine := self listLineToVisibleLine:lineNr.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1880
    (shown not or:[visLine isNil]) ifTrue:[
118
claus
parents: 105
diff changeset
  1881
	self withoutRedrawInsertLine:aString before:lineNr.
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1882
    ] ifFalse:[
118
claus
parents: 105
diff changeset
  1883
	w := self widthForScrollBetween:lineNr
claus
parents: 105
diff changeset
  1884
				    and:(firstLineShown + nLinesShown).
claus
parents: 105
diff changeset
  1885
	dstY := topMargin + ((visLine ) * fontHeight).
claus
parents: 105
diff changeset
  1886
	self catchExpose.
claus
parents: 105
diff changeset
  1887
	self withoutRedrawInsertLine:aString before:lineNr.
claus
parents: 105
diff changeset
  1888
	self copyFrom:self x:textStartLeft y:(dstY - fontHeight)
claus
parents: 105
diff changeset
  1889
			 toX:textStartLeft y:dstY
claus
parents: 105
diff changeset
  1890
		       width:w
claus
parents: 105
diff changeset
  1891
		      height:((nLinesShown - visLine "- 1") * fontHeight).
claus
parents: 105
diff changeset
  1892
	self redrawVisibleLine:visLine.
claus
parents: 105
diff changeset
  1893
	self waitForExpose.
claus
parents: 105
diff changeset
  1894
    ].
claus
parents: 105
diff changeset
  1895
    widthOfWidestLine notNil ifTrue:[
claus
parents: 105
diff changeset
  1896
	widthOfWidestLine := widthOfWidestLine max:(self widthOfLineString:aString).
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1897
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1898
    self textChanged.
121
claus
parents: 118
diff changeset
  1899
    wasOn ifTrue:[self showCursor].
118
claus
parents: 105
diff changeset
  1900
!
claus
parents: 105
diff changeset
  1901
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1902
deleteCharAtLine:lineNr col:colNr
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1903
    "delete single character at colNr in line lineNr"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1904
118
claus
parents: 105
diff changeset
  1905
    |line lineSize newLine drawCharacterOnly wasLargest|
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1906
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1907
    readOnly ifTrue: [
118
claus
parents: 105
diff changeset
  1908
	exceptionBlock value:errorMessage.
claus
parents: 105
diff changeset
  1909
	^ self
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1910
    ].
121
claus
parents: 118
diff changeset
  1911
claus
parents: 118
diff changeset
  1912
    line := self listAt:lineNr.
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1913
    line isNil ifTrue: [^self].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1914
    lineSize := line size.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1915
    (colNr > lineSize) ifTrue: [^ self].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1916
118
claus
parents: 105
diff changeset
  1917
    wasLargest := (self widthOfLineString:line) == widthOfWidestLine.
claus
parents: 105
diff changeset
  1918
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1919
    drawCharacterOnly := false.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1920
    (colNr == lineSize) ifTrue:[
118
claus
parents: 105
diff changeset
  1921
	newLine := line copyTo:(lineSize - 1).
claus
parents: 105
diff changeset
  1922
	fontIsFixedWidth ifTrue:[
claus
parents: 105
diff changeset
  1923
	    drawCharacterOnly := true
claus
parents: 105
diff changeset
  1924
	]
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1925
    ] ifFalse:[
118
claus
parents: 105
diff changeset
  1926
	newLine := String new:(lineSize - 1).
claus
parents: 105
diff changeset
  1927
	newLine replaceFrom:1 to:(colNr - 1)
claus
parents: 105
diff changeset
  1928
		       with:line startingAt:1.
claus
parents: 105
diff changeset
  1929
	newLine replaceFrom:colNr to:(lineSize - 1)
claus
parents: 105
diff changeset
  1930
		       with:line startingAt:(colNr + 1)
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1931
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1932
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1933
    newLine isBlank ifTrue:[
118
claus
parents: 105
diff changeset
  1934
	newLine := nil
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1935
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1936
    list at:lineNr put:newLine.
118
claus
parents: 105
diff changeset
  1937
    wasLargest ifTrue:[
claus
parents: 105
diff changeset
  1938
	widthOfWidestLine := nil. "/ i.e. unknown
claus
parents: 105
diff changeset
  1939
    ].
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1940
    self textChanged.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1941
    drawCharacterOnly ifTrue:[
118
claus
parents: 105
diff changeset
  1942
	self redrawLine:lineNr col:colNr
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1943
    ] ifFalse:[
118
claus
parents: 105
diff changeset
  1944
	self redrawLine:lineNr from:colNr
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1945
    ]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1946
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1947
121
claus
parents: 118
diff changeset
  1948
mergeLine:lineNr
claus
parents: 118
diff changeset
  1949
    "merge line lineNr with line lineNr+1"
claus
parents: 118
diff changeset
  1950
claus
parents: 118
diff changeset
  1951
    |leftPart rightPart bothParts nextLineNr|
claus
parents: 118
diff changeset
  1952
claus
parents: 118
diff changeset
  1953
    list isNil ifFalse:[
claus
parents: 118
diff changeset
  1954
	nextLineNr := lineNr + 1.
claus
parents: 118
diff changeset
  1955
	(nextLineNr > list size) ifFalse:[
claus
parents: 118
diff changeset
  1956
	    (list at:lineNr) isNil ifTrue:[
claus
parents: 118
diff changeset
  1957
		leftPart := ''
118
claus
parents: 105
diff changeset
  1958
	    ] ifFalse:[
121
claus
parents: 118
diff changeset
  1959
		leftPart := list at:lineNr
claus
parents: 118
diff changeset
  1960
	    ].
claus
parents: 118
diff changeset
  1961
	    (list at:nextLineNr) isNil ifTrue:[
claus
parents: 118
diff changeset
  1962
		rightPart := ''
claus
parents: 118
diff changeset
  1963
	    ] ifFalse:[
claus
parents: 118
diff changeset
  1964
		rightPart := list at:nextLineNr
claus
parents: 118
diff changeset
  1965
	    ].
claus
parents: 118
diff changeset
  1966
	    bothParts := leftPart , rightPart.
claus
parents: 118
diff changeset
  1967
	    bothParts isBlank ifTrue:[bothParts := nil].
claus
parents: 118
diff changeset
  1968
	    list at:lineNr put:bothParts.
claus
parents: 118
diff changeset
  1969
	    self redrawLine:lineNr.
claus
parents: 118
diff changeset
  1970
	    self deleteLine:nextLineNr
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1971
	]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1972
    ]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1973
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1974
118
claus
parents: 105
diff changeset
  1975
deleteFromLine:startLineNr toLine:endLineNr
claus
parents: 105
diff changeset
  1976
    "delete some lines"
claus
parents: 105
diff changeset
  1977
121
claus
parents: 118
diff changeset
  1978
    |wasOn|
claus
parents: 118
diff changeset
  1979
118
claus
parents: 105
diff changeset
  1980
    readOnly ifTrue: [
claus
parents: 105
diff changeset
  1981
	exceptionBlock value:errorMessage.
claus
parents: 105
diff changeset
  1982
	^ self
claus
parents: 105
diff changeset
  1983
    ].
121
claus
parents: 118
diff changeset
  1984
118
claus
parents: 105
diff changeset
  1985
    list isNil ifTrue:[^ self].
121
claus
parents: 118
diff changeset
  1986
claus
parents: 118
diff changeset
  1987
    wasOn := self hideCursor.
118
claus
parents: 105
diff changeset
  1988
    list removeFromIndex:startLineNr toIndex:endLineNr.
claus
parents: 105
diff changeset
  1989
    widthOfWidestLine := nil. "/ i.e. unknown
claus
parents: 105
diff changeset
  1990
    self textChanged.
claus
parents: 105
diff changeset
  1991
    self redrawFromLine:startLineNr.
claus
parents: 105
diff changeset
  1992
    (firstLineShown >= list size) ifTrue:[
claus
parents: 105
diff changeset
  1993
	self makeLineVisible:(list size)
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1994
    ].
121
claus
parents: 118
diff changeset
  1995
    wasOn ifTrue:[self showCursor].
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1996
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1997
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1998
replaceSelectionBy:something keepCursor:keep
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  1999
    "delete the selection (if any) and insert something, a character or string;
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2000
     leave cursor after insertion or leave it, depending on keep"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2001
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2002
    |sel l c|
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2003
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2004
    l := cursorLine.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2005
    c := cursorCol.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2006
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2007
    sel := self selection.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2008
    sel notNil ifTrue:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2009
	lastString := sel.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2010
	self deleteSelection.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2011
	replacing := true.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2012
	lastReplacement := ''
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2013
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2014
    (something isMemberOf:Character) ifTrue:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2015
	lastReplacement notNil ifTrue:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2016
	    (lastReplacement endsWith:Character space) ifTrue:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2017
		lastReplacement := lastReplacement copyTo:(lastReplacement size - 1).
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2018
		lastReplacement := lastReplacement copyWith:something.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2019
		lastReplacement := lastReplacement copyWith:Character space
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2020
	    ] ifFalse:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2021
		lastReplacement := lastReplacement copyWith:something.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2022
	    ]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2023
	].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2024
	self insertCharAtCursor:something
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2025
    ] ifFalse:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2026
	lastReplacement := something.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2027
	self insertStringAtCursor:something
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2028
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2029
    keep ifTrue:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2030
	self cursorLine:l col:c
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2031
    ]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2032
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2033
121
claus
parents: 118
diff changeset
  2034
deleteCharsAtLine:lineNr toCol:colNr
claus
parents: 118
diff changeset
  2035
    "delete characters from start up to colNr in line lineNr"
claus
parents: 118
diff changeset
  2036
claus
parents: 118
diff changeset
  2037
    |line lineSize newLine|
claus
parents: 118
diff changeset
  2038
claus
parents: 118
diff changeset
  2039
    readOnly ifTrue: [
claus
parents: 118
diff changeset
  2040
	exceptionBlock value:errorMessage.
claus
parents: 118
diff changeset
  2041
	^ self
claus
parents: 118
diff changeset
  2042
    ].
claus
parents: 118
diff changeset
  2043
    line := self listAt:lineNr.
claus
parents: 118
diff changeset
  2044
    line isNil ifTrue: [^self].
claus
parents: 118
diff changeset
  2045
    lineSize := line size.
claus
parents: 118
diff changeset
  2046
    (colNr >= lineSize) ifTrue:[
claus
parents: 118
diff changeset
  2047
	newLine := nil
claus
parents: 118
diff changeset
  2048
    ] ifFalse:[
claus
parents: 118
diff changeset
  2049
	newLine := line copyFrom:(colNr + 1) to:lineSize.
claus
parents: 118
diff changeset
  2050
	newLine isBlank ifTrue:[
claus
parents: 118
diff changeset
  2051
	    newLine := nil
claus
parents: 118
diff changeset
  2052
	]
claus
parents: 118
diff changeset
  2053
    ].
claus
parents: 118
diff changeset
  2054
    list at:lineNr put:newLine.
claus
parents: 118
diff changeset
  2055
    widthOfWidestLine := nil. "/ i.e. unknown
claus
parents: 118
diff changeset
  2056
    self textChanged.
claus
parents: 118
diff changeset
  2057
    self redrawLine:lineNr
claus
parents: 118
diff changeset
  2058
!
claus
parents: 118
diff changeset
  2059
claus
parents: 118
diff changeset
  2060
insertSelectedStringAtCursor:aString
claus
parents: 118
diff changeset
  2061
    "insert the argument, aString at cursor position and select it"
claus
parents: 118
diff changeset
  2062
claus
parents: 118
diff changeset
  2063
    |startLine startCol|
claus
parents: 118
diff changeset
  2064
claus
parents: 118
diff changeset
  2065
    startLine := cursorLine.
claus
parents: 118
diff changeset
  2066
    startCol := cursorCol.
claus
parents: 118
diff changeset
  2067
    self insertStringAtCursor:aString.
claus
parents: 118
diff changeset
  2068
    self selectFromLine:startLine col:startCol
claus
parents: 118
diff changeset
  2069
		 toLine:cursorLine col:(cursorCol - 1)
claus
parents: 118
diff changeset
  2070
!
claus
parents: 118
diff changeset
  2071
claus
parents: 118
diff changeset
  2072
insertTabAtCursor
claus
parents: 118
diff changeset
  2073
    "insert spaces to next tab"
claus
parents: 118
diff changeset
  2074
claus
parents: 118
diff changeset
  2075
    |wasOn nextTab|
claus
parents: 118
diff changeset
  2076
claus
parents: 118
diff changeset
  2077
    wasOn := self hideCursor.
claus
parents: 118
diff changeset
  2078
    nextTab := self nextTabAfter:cursorCol.
claus
parents: 118
diff changeset
  2079
    self insertStringAtCursor:(String new:(nextTab - cursorCol)).
claus
parents: 118
diff changeset
  2080
    self makeCursorVisibleAndShowCursor:wasOn.
claus
parents: 118
diff changeset
  2081
!
claus
parents: 118
diff changeset
  2082
claus
parents: 118
diff changeset
  2083
deleteLineWithoutRedraw:lineNr
claus
parents: 118
diff changeset
  2084
    "delete line - no redraw;
claus
parents: 118
diff changeset
  2085
     return true, if something was really deleted"
claus
parents: 118
diff changeset
  2086
claus
parents: 118
diff changeset
  2087
    readOnly ifTrue:[
claus
parents: 118
diff changeset
  2088
	exceptionBlock value:errorMessage.
claus
parents: 118
diff changeset
  2089
	^ false
claus
parents: 118
diff changeset
  2090
    ].
claus
parents: 118
diff changeset
  2091
    (list isNil or:[lineNr > list size]) ifTrue:[^ false].
claus
parents: 118
diff changeset
  2092
    list removeIndex:lineNr.
claus
parents: 118
diff changeset
  2093
    widthOfWidestLine := nil. "/ i.e. unknown
claus
parents: 118
diff changeset
  2094
    self textChanged.
claus
parents: 118
diff changeset
  2095
    ^ true
claus
parents: 118
diff changeset
  2096
!
claus
parents: 118
diff changeset
  2097
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2098
deleteCharBeforeCursor
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2099
    "delete single character to the left of cursor and move cursor to left"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2100
121
claus
parents: 118
diff changeset
  2101
    |wasOn oldSize lineNrAboveCursor|
claus
parents: 118
diff changeset
  2102
claus
parents: 118
diff changeset
  2103
    wasOn := self hideCursor.
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2104
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2105
    (cursorCol == 1) ifFalse:[
121
claus
parents: 118
diff changeset
  2106
	"
claus
parents: 118
diff changeset
  2107
	 somewhere in the middle of a line
claus
parents: 118
diff changeset
  2108
	"
125
claus
parents: 123
diff changeset
  2109
	self cursorLeft.
121
claus
parents: 118
diff changeset
  2110
	self deleteCharAtLine:cursorLine col:cursorCol.
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2111
    ] ifTrue:[
121
claus
parents: 118
diff changeset
  2112
	"
claus
parents: 118
diff changeset
  2113
	 at begin of line - merge with previous line;
claus
parents: 118
diff changeset
  2114
	 except for the very first line.
claus
parents: 118
diff changeset
  2115
	"
claus
parents: 118
diff changeset
  2116
	(cursorLine == 1) ifFalse:[
claus
parents: 118
diff changeset
  2117
	    oldSize := 0.
claus
parents: 118
diff changeset
  2118
	    lineNrAboveCursor := cursorLine - 1.
claus
parents: 118
diff changeset
  2119
	    list notNil ifTrue:[
claus
parents: 118
diff changeset
  2120
	       (list size >= lineNrAboveCursor) ifTrue:[
claus
parents: 118
diff changeset
  2121
		   (list at:lineNrAboveCursor) notNil ifTrue:[
claus
parents: 118
diff changeset
  2122
		       oldSize := (list at:lineNrAboveCursor) size
claus
parents: 118
diff changeset
  2123
		   ]
claus
parents: 118
diff changeset
  2124
	       ]
claus
parents: 118
diff changeset
  2125
	    ].
claus
parents: 118
diff changeset
  2126
	    self mergeLine:lineNrAboveCursor.
claus
parents: 118
diff changeset
  2127
	    cursorLine := lineNrAboveCursor.
claus
parents: 118
diff changeset
  2128
	    cursorCol := oldSize + 1.
claus
parents: 118
diff changeset
  2129
	    cursorVisibleLine := self listLineToVisibleLine:cursorLine.
claus
parents: 118
diff changeset
  2130
	    self makeCursorVisible
claus
parents: 118
diff changeset
  2131
	]
claus
parents: 118
diff changeset
  2132
    ].
claus
parents: 118
diff changeset
  2133
    wasOn ifTrue:[self showCursor].
claus
parents: 118
diff changeset
  2134
!
claus
parents: 118
diff changeset
  2135
claus
parents: 118
diff changeset
  2136
deleteLinesWithoutRedrawFrom:startLine to:endLine
claus
parents: 118
diff changeset
  2137
    "delete lines - no redraw;
claus
parents: 118
diff changeset
  2138
     return true, if something was really deleted"
claus
parents: 118
diff changeset
  2139
claus
parents: 118
diff changeset
  2140
    |lastLine|
claus
parents: 118
diff changeset
  2141
claus
parents: 118
diff changeset
  2142
    readOnly ifTrue:[
claus
parents: 118
diff changeset
  2143
	exceptionBlock value:errorMessage.
claus
parents: 118
diff changeset
  2144
	^ false
claus
parents: 118
diff changeset
  2145
    ].
claus
parents: 118
diff changeset
  2146
    (list isNil or:[startLine > list size]) ifTrue:[^ false].
claus
parents: 118
diff changeset
  2147
    (endLine > list size) ifTrue:[
claus
parents: 118
diff changeset
  2148
	lastLine := list size
claus
parents: 118
diff changeset
  2149
    ] ifFalse:[
claus
parents: 118
diff changeset
  2150
	lastLine := endLine
claus
parents: 118
diff changeset
  2151
    ].
claus
parents: 118
diff changeset
  2152
    list removeFromIndex:startLine toIndex:lastLine.
claus
parents: 118
diff changeset
  2153
    widthOfWidestLine := nil. "/ i.e. unknown
claus
parents: 118
diff changeset
  2154
    self textChanged.
claus
parents: 118
diff changeset
  2155
    ^ true
claus
parents: 118
diff changeset
  2156
!
claus
parents: 118
diff changeset
  2157
claus
parents: 118
diff changeset
  2158
deleteLine:lineNr
claus
parents: 118
diff changeset
  2159
    "delete line"
claus
parents: 118
diff changeset
  2160
claus
parents: 118
diff changeset
  2161
    |wasOn visLine w
claus
parents: 118
diff changeset
  2162
     srcY "{ Class: SmallInteger }" |
claus
parents: 118
diff changeset
  2163
claus
parents: 118
diff changeset
  2164
    w := self widthForScrollBetween:lineNr and:(firstLineShown + nLinesShown).
claus
parents: 118
diff changeset
  2165
    (self deleteLineWithoutRedraw:lineNr) ifFalse:[^ self].
claus
parents: 118
diff changeset
  2166
    shown ifFalse:[^ self].
claus
parents: 118
diff changeset
  2167
claus
parents: 118
diff changeset
  2168
    wasOn := self hideCursor.
claus
parents: 118
diff changeset
  2169
claus
parents: 118
diff changeset
  2170
    visLine := self listLineToVisibleLine:lineNr.
claus
parents: 118
diff changeset
  2171
    visLine notNil ifTrue:[
claus
parents: 118
diff changeset
  2172
	srcY :=  margin + topMargin + (visLine * fontHeight).
claus
parents: 118
diff changeset
  2173
	self catchExpose.
claus
parents: 118
diff changeset
  2174
	self copyFrom:self x:textStartLeft y:srcY
claus
parents: 118
diff changeset
  2175
			 toX:textStartLeft y:(srcY - fontHeight)
claus
parents: 118
diff changeset
  2176
		       width:w height:((nLinesShown - visLine) * fontHeight).
claus
parents: 118
diff changeset
  2177
	self redrawVisibleLine:nFullLinesShown.
claus
parents: 118
diff changeset
  2178
	(nFullLinesShown ~~ nLinesShown) ifTrue:[
claus
parents: 118
diff changeset
  2179
	    self redrawVisibleLine:nLinesShown
claus
parents: 118
diff changeset
  2180
	].
claus
parents: 118
diff changeset
  2181
	self waitForExpose
claus
parents: 118
diff changeset
  2182
    ].
claus
parents: 118
diff changeset
  2183
claus
parents: 118
diff changeset
  2184
    wasOn ifTrue:[self showCursor].
claus
parents: 118
diff changeset
  2185
!
claus
parents: 118
diff changeset
  2186
claus
parents: 118
diff changeset
  2187
deleteCursorLine
claus
parents: 118
diff changeset
  2188
    "delete the line where the cursor sits"
claus
parents: 118
diff changeset
  2189
claus
parents: 118
diff changeset
  2190
    self deleteLine:cursorLine
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2191
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2192
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2193
deleteCharAtCursor
121
claus
parents: 118
diff changeset
  2194
    "delete single character under cursor; does not merge lines"
claus
parents: 118
diff changeset
  2195
claus
parents: 118
diff changeset
  2196
    |wasOn|
claus
parents: 118
diff changeset
  2197
claus
parents: 118
diff changeset
  2198
    wasOn := self hideCursor.
claus
parents: 118
diff changeset
  2199
    self deleteCharAtLine:cursorLine col:cursorCol.
claus
parents: 118
diff changeset
  2200
    wasOn ifTrue:[self showCursor]
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2201
! !
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2202
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2203
!EditTextView methodsFor:'scrolling'!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2204
121
claus
parents: 118
diff changeset
  2205
originWillChange
claus
parents: 118
diff changeset
  2206
    "sent before scrolling - have to hide the cursor"
claus
parents: 118
diff changeset
  2207
claus
parents: 118
diff changeset
  2208
    prevCursorState := cursorShown.
claus
parents: 118
diff changeset
  2209
    cursorShown ifTrue:[
claus
parents: 118
diff changeset
  2210
	self hideCursor
claus
parents: 118
diff changeset
  2211
    ]
claus
parents: 118
diff changeset
  2212
!
claus
parents: 118
diff changeset
  2213
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2214
originChanged:delta
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2215
    "sent after scrolling - have to show the cursor if it was on before"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2216
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2217
    super originChanged:delta.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2218
    "
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2219
     should we move the cursor with the scroll - or leave it ?
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2220
    "
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2221
    cursorVisibleLine := self listLineToVisibleLine:cursorLine.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2222
    prevCursorState ifTrue:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2223
	self showCursor
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2224
    ]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2225
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2226
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2227
pageUp
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2228
    "page up - to keep cursor on same visible line, it has to be moved
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2229
     within the real text  "
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2230
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2231
    |prevCursorLine|
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2232
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2233
    prevCursorLine := cursorVisibleLine.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2234
    super pageUp.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2235
    self cursorVisibleLine:prevCursorLine col:cursorCol
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2236
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2237
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2238
pageDown
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2239
    "page down - to keep cursor on same visible line, it has to be moved
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2240
     within the real text  "
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2241
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2242
    |prevCursorLine|
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2243
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2244
    prevCursorLine := cursorVisibleLine.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2245
    super pageDown.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2246
    self cursorVisibleLine:prevCursorLine col:cursorCol
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2247
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2248
121
claus
parents: 118
diff changeset
  2249
halfPageUp
claus
parents: 118
diff changeset
  2250
    "half a page up - to keep cursor on same visible line, it has to be moved
claus
parents: 118
diff changeset
  2251
     within the real text  "
claus
parents: 118
diff changeset
  2252
claus
parents: 118
diff changeset
  2253
    |prevCursorLine|
claus
parents: 118
diff changeset
  2254
claus
parents: 118
diff changeset
  2255
    prevCursorLine := cursorVisibleLine.
claus
parents: 118
diff changeset
  2256
    super halfPageUp.
claus
parents: 118
diff changeset
  2257
    self cursorVisibleLine:prevCursorLine col:cursorCol
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2258
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2259
121
claus
parents: 118
diff changeset
  2260
halfPageDown
claus
parents: 118
diff changeset
  2261
    "half a page down - to keep cursor on same visible line, it has to be moved
claus
parents: 118
diff changeset
  2262
     within the real text  "
claus
parents: 118
diff changeset
  2263
claus
parents: 118
diff changeset
  2264
    |prevCursorLine|
claus
parents: 118
diff changeset
  2265
claus
parents: 118
diff changeset
  2266
    prevCursorLine := cursorVisibleLine.
claus
parents: 118
diff changeset
  2267
    super halfPageDown.
claus
parents: 118
diff changeset
  2268
    self cursorVisibleLine:prevCursorLine col:cursorCol
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2269
! !
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2270
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2271
!EditTextView methodsFor:'initialization'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2272
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2273
initEvents
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2274
    "enable enter/leave events in addition"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2275
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2276
    super initEvents.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2277
    self enableEnterLeaveEvents
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2278
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2279
121
claus
parents: 118
diff changeset
  2280
realize
claus
parents: 118
diff changeset
  2281
    "make the view visible"
claus
parents: 118
diff changeset
  2282
claus
parents: 118
diff changeset
  2283
    super realize.
claus
parents: 118
diff changeset
  2284
    cursorFgColor := cursorFgColor on:device.
claus
parents: 118
diff changeset
  2285
    cursorBgColor := cursorBgColor on:device.
claus
parents: 118
diff changeset
  2286
!
claus
parents: 118
diff changeset
  2287
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2288
initStyle
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2289
    "initialize style specific stuff"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2290
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2291
    super initStyle.
125
claus
parents: 123
diff changeset
  2292
    lockUpdates := false.
claus
parents: 123
diff changeset
  2293
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2294
    cursorFgColor := DefaultCursorForegroundColor.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2295
    cursorFgColor isNil ifTrue:[cursorFgColor := bgColor].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2296
    cursorBgColor := DefaultCursorBackgroundColor.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2297
    cursorBgColor isNil ifTrue:[cursorBgColor := fgColor].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2298
    cursorType := DefaultCursorType.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2299
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2300
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2301
initialize
25
975bead4571a *** empty log message ***
claus
parents: 24
diff changeset
  2302
    "initialize a new EditTextView;
975bead4571a *** empty log message ***
claus
parents: 24
diff changeset
  2303
     setup some instance variables"
975bead4571a *** empty log message ***
claus
parents: 24
diff changeset
  2304
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2305
    super initialize.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2306
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2307
    self level:-1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2308
    errorMessage := 'Text may not me changed'.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2309
    readOnly := false.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2310
    fixedSize := false.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2311
    exceptionBlock := [:errorText | ].
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2312
    cursorShown := prevCursorState := true.
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2313
    cursorLine := 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2314
    cursorVisibleLine := 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2315
    cursorCol := 1.
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2316
    modified := false.
46
c43e944ac3da prepare for different cursors
claus
parents: 40
diff changeset
  2317
    showMatchingParenthesis := false.
77
565b052f5277 *** empty log message ***
claus
parents: 70
diff changeset
  2318
    hasKeyboardFocus := false. "/ true.
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2319
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2320
97
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2321
editMenu
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2322
    "return the views middleButtonMenu"
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2323
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2324
    |labels selectors m sub|
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2325
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2326
    labels := #(
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2327
"/                  'undo'
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2328
		    'again'
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2329
		    '-'
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2330
		    'copy'
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2331
		    'cut'
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2332
		    'paste'
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2333
		    '-'
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2334
		    'accept'
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2335
		    '='
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2336
		    'others'
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2337
	       ).
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2338
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2339
    selectors := #(
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2340
"/                  undo
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2341
		    again
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2342
		    nil
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2343
		    copySelection
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2344
		    cut
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2345
		    paste
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2346
		    nil
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2347
		    accept
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2348
		    nil
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2349
		    others
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2350
		   ).
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2351
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2352
    m := PopUpMenu
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2353
	    labels:(resources array:labels)
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2354
	    selectors:selectors.
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2355
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2356
    labels := #(
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2357
		    'search ...'
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2358
		    'goto ...'
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2359
		    '-'
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2360
		    'font ...'
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2361
		    '-'
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2362
		    'indent'
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2363
		    '-'
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2364
		    'save as ...'
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2365
		    'print'
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2366
		).
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2367
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2368
     selectors := #(
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2369
		     search
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2370
		     gotoLine
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2371
		     nil
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2372
		     changeFont
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2373
		     nil
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2374
		     indent
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2375
		     nil
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2376
		     save
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2377
		     print
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2378
		    ).
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2379
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2380
    sub := PopUpMenu
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2381
		labels:(resources array:labels)
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2382
		selectors:selectors
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2383
		receiver:model.
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2384
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2385
    m subMenuAt:#others put:sub.
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2386
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2387
    readOnly ifTrue:[
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2388
	m disable:#paste
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2389
    ].
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2390
    self hasSelection not ifTrue:[
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2391
	m disable:#copySelection.
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2392
    ].
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2393
    (self hasSelection not or:[readOnly]) ifTrue:[
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2394
	m disable:#cut.
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2395
	sub disable:#indent.
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2396
    ].
cbf495fe3b64 *** empty log message ***
claus
parents: 91
diff changeset
  2397
    ^ m.
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2398
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2399
121
claus
parents: 118
diff changeset
  2400
!EditTextView methodsFor:'menu actions'!
claus
parents: 118
diff changeset
  2401
claus
parents: 118
diff changeset
  2402
paste:someText
claus
parents: 118
diff changeset
  2403
    "paste someText at cursor"
claus
parents: 118
diff changeset
  2404
claus
parents: 118
diff changeset
  2405
    |s startLine startCol|
claus
parents: 118
diff changeset
  2406
claus
parents: 118
diff changeset
  2407
    someText notNil ifTrue:[
claus
parents: 118
diff changeset
  2408
	s := someText.
claus
parents: 118
diff changeset
  2409
	s isString ifTrue:[
claus
parents: 118
diff changeset
  2410
	    s := s asStringCollection
claus
parents: 118
diff changeset
  2411
	] ifFalse:[
claus
parents: 118
diff changeset
  2412
	    (s isKindOf:StringCollection) ifFalse:[
claus
parents: 118
diff changeset
  2413
		self warn:'selection not convertable to Text'.
claus
parents: 118
diff changeset
  2414
		^ self
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2415
	    ]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2416
	].
121
claus
parents: 118
diff changeset
  2417
	startLine := cursorLine.
claus
parents: 118
diff changeset
  2418
	startCol := cursorCol.
claus
parents: 118
diff changeset
  2419
	self insertLines:s asStringCollection withCr:false.
claus
parents: 118
diff changeset
  2420
	self selectFromLine:startLine col:startCol
claus
parents: 118
diff changeset
  2421
		     toLine:cursorLine col:(cursorCol - 1).
claus
parents: 118
diff changeset
  2422
	typeOfSelection := #paste.
claus
parents: 118
diff changeset
  2423
	undoAction := [self cut].
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2424
    ]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2425
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2426
121
claus
parents: 118
diff changeset
  2427
cut
claus
parents: 118
diff changeset
  2428
    "cut selection into copybuffer"
claus
parents: 118
diff changeset
  2429
claus
parents: 118
diff changeset
  2430
    |line col history sel|
claus
parents: 118
diff changeset
  2431
claus
parents: 118
diff changeset
  2432
    sel := self selection.
claus
parents: 118
diff changeset
  2433
    sel notNil ifTrue:[
claus
parents: 118
diff changeset
  2434
	lastString := sel.
claus
parents: 118
diff changeset
  2435
	line := selectionStartLine.
claus
parents: 118
diff changeset
  2436
	col := selectionStartCol.
claus
parents: 118
diff changeset
  2437
	undoAction := [self insertLines:lastString atLine:line col:col].
claus
parents: 118
diff changeset
  2438
claus
parents: 118
diff changeset
  2439
	"
claus
parents: 118
diff changeset
  2440
	 remember in CopyBuffer
claus
parents: 118
diff changeset
  2441
	"
claus
parents: 118
diff changeset
  2442
	self setTextSelection:lastString.
claus
parents: 118
diff changeset
  2443
claus
parents: 118
diff changeset
  2444
	"
claus
parents: 118
diff changeset
  2445
	 append to DeleteHistory (if there is one)
claus
parents: 118
diff changeset
  2446
	"
claus
parents: 118
diff changeset
  2447
	history := Smalltalk at:#DeleteHistory.
claus
parents: 118
diff changeset
  2448
	history notNil ifTrue:[
claus
parents: 118
diff changeset
  2449
	    history addAll:(lastString asStringCollection).
claus
parents: 118
diff changeset
  2450
	    history size > 1000 ifTrue:[
claus
parents: 118
diff changeset
  2451
		history := history copyFrom:(history size - 1000)
59
450ce95a72a4 *** empty log message ***
claus
parents: 46
diff changeset
  2452
	    ].
450ce95a72a4 *** empty log message ***
claus
parents: 46
diff changeset
  2453
	].
121
claus
parents: 118
diff changeset
  2454
claus
parents: 118
diff changeset
  2455
	"
claus
parents: 118
diff changeset
  2456
	 now, delete it
claus
parents: 118
diff changeset
  2457
	"
claus
parents: 118
diff changeset
  2458
	self deleteSelection.
claus
parents: 118
diff changeset
  2459
	lastReplacement := nil
claus
parents: 118
diff changeset
  2460
    ] ifFalse:[
claus
parents: 118
diff changeset
  2461
	"
claus
parents: 118
diff changeset
  2462
	 a cut without selection will search&cut again
claus
parents: 118
diff changeset
  2463
	"
claus
parents: 118
diff changeset
  2464
	self again
claus
parents: 118
diff changeset
  2465
    ]
claus
parents: 118
diff changeset
  2466
!
claus
parents: 118
diff changeset
  2467
claus
parents: 118
diff changeset
  2468
replace:someText
claus
parents: 118
diff changeset
  2469
    "replace selection by someText"
claus
parents: 118
diff changeset
  2470
claus
parents: 118
diff changeset
  2471
    |selected selectedString replacement replacementString 
claus
parents: 118
diff changeset
  2472
     cutOffSpace addSpace|
claus
parents: 118
diff changeset
  2473
claus
parents: 118
diff changeset
  2474
    selected := self selection.
claus
parents: 118
diff changeset
  2475
    selected isNil ifTrue:[
claus
parents: 118
diff changeset
  2476
	^ self paste:someText
claus
parents: 118
diff changeset
  2477
    ].
claus
parents: 118
diff changeset
  2478
    self deleteSelection.
claus
parents: 118
diff changeset
  2479
claus
parents: 118
diff changeset
  2480
    "take care, if we replace a selection without space by a word selected
claus
parents: 118
diff changeset
  2481
     with one - in this case we usually do not want the space.
claus
parents: 118
diff changeset
  2482
     But, if we replace a word-selected selection by something without a
claus
parents: 118
diff changeset
  2483
     space, we DO want the space added."
claus
parents: 118
diff changeset
  2484
claus
parents: 118
diff changeset
  2485
    cutOffSpace := false.
claus
parents: 118
diff changeset
  2486
    addSpace := false.
claus
parents: 118
diff changeset
  2487
claus
parents: 118
diff changeset
  2488
    replacement := someText copy.
claus
parents: 118
diff changeset
  2489
claus
parents: 118
diff changeset
  2490
    selected size == 1 ifTrue:[
claus
parents: 118
diff changeset
  2491
	selectedString := selected at:1.
claus
parents: 118
diff changeset
  2492
    ].
claus
parents: 118
diff changeset
  2493
    selectedString notNil ifTrue:[
claus
parents: 118
diff changeset
  2494
	((selectedString startsWith:' ') or:[selectedString endsWith:' ']) ifFalse:[
claus
parents: 118
diff changeset
  2495
	   "selection has no space"
claus
parents: 118
diff changeset
  2496
claus
parents: 118
diff changeset
  2497
	    ((selectStyle == #wordleft) or:[selectStyle == #wordRight]) ifTrue:[
claus
parents: 118
diff changeset
  2498
		cutOffSpace := true
59
450ce95a72a4 *** empty log message ***
claus
parents: 46
diff changeset
  2499
	    ]
121
claus
parents: 118
diff changeset
  2500
	] ifTrue:[
claus
parents: 118
diff changeset
  2501
	    addSpace := true
59
450ce95a72a4 *** empty log message ***
claus
parents: 46
diff changeset
  2502
	]
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2503
    ].
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2504
121
claus
parents: 118
diff changeset
  2505
    replacement size == 1 ifTrue:[
claus
parents: 118
diff changeset
  2506
	replacementString := replacement at:1.
claus
parents: 118
diff changeset
  2507
	cutOffSpace ifTrue:[
claus
parents: 118
diff changeset
  2508
	    (replacementString startsWith:' ') ifTrue:[
claus
parents: 118
diff changeset
  2509
		replacementString := replacementString withoutSpaces
59
450ce95a72a4 *** empty log message ***
claus
parents: 46
diff changeset
  2510
	    ].
121
claus
parents: 118
diff changeset
  2511
	] ifFalse:[
claus
parents: 118
diff changeset
  2512
	    selectStyle == #wordLeft ifTrue:[
claus
parents: 118
diff changeset
  2513
		"want a space at left"
claus
parents: 118
diff changeset
  2514
		(replacementString startsWith:' ') ifFalse:[
claus
parents: 118
diff changeset
  2515
		    replacementString := replacementString withoutSpaces.
claus
parents: 118
diff changeset
  2516
		    replacementString := ' ' , replacementString
claus
parents: 118
diff changeset
  2517
		]
59
450ce95a72a4 *** empty log message ***
claus
parents: 46
diff changeset
  2518
	    ].
121
claus
parents: 118
diff changeset
  2519
	    selectStyle == #wordRight ifTrue:[
claus
parents: 118
diff changeset
  2520
		"want a space at right"
claus
parents: 118
diff changeset
  2521
claus
parents: 118
diff changeset
  2522
		(replacementString endsWith:' ') ifFalse:[
claus
parents: 118
diff changeset
  2523
		    replacementString := replacementString withoutSpaces.
claus
parents: 118
diff changeset
  2524
		    replacementString := replacementString , ' '
claus
parents: 118
diff changeset
  2525
		]
claus
parents: 118
diff changeset
  2526
	    ].
59
450ce95a72a4 *** empty log message ***
claus
parents: 46
diff changeset
  2527
	].
121
claus
parents: 118
diff changeset
  2528
	replacement at:1 put: replacementString.
claus
parents: 118
diff changeset
  2529
	self paste:replacement
claus
parents: 118
diff changeset
  2530
    ] ifFalse:[
claus
parents: 118
diff changeset
  2531
	self paste:someText.
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
  2532
    ].
121
claus
parents: 118
diff changeset
  2533
    lastString := selectedString.
claus
parents: 118
diff changeset
  2534
    lastReplacement := someText
claus
parents: 118
diff changeset
  2535
!
claus
parents: 118
diff changeset
  2536
claus
parents: 118
diff changeset
  2537
paste
claus
parents: 118
diff changeset
  2538
    "paste copybuffer; if there is a selection, replace it.
claus
parents: 118
diff changeset
  2539
     otherwise paste at cursor position. Replace is not done
claus
parents: 118
diff changeset
  2540
     for originating by a paste, to allow multiple
claus
parents: 118
diff changeset
  2541
     paste."
claus
parents: 118
diff changeset
  2542
claus
parents: 118
diff changeset
  2543
    |sel|
claus
parents: 118
diff changeset
  2544
claus
parents: 118
diff changeset
  2545
    ((self hasSelection == true) and:[typeOfSelection ~~ #paste]) ifTrue:[
claus
parents: 118
diff changeset
  2546
	^ self replace
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2547
    ].
121
claus
parents: 118
diff changeset
  2548
    sel := self getTextSelection.
claus
parents: 118
diff changeset
  2549
    sel notNil ifTrue:[
claus
parents: 118
diff changeset
  2550
	self paste:sel.
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2551
    ]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2552
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2553
121
claus
parents: 118
diff changeset
  2554
replace
claus
parents: 118
diff changeset
  2555
    "replace selection by copybuffer"
claus
parents: 118
diff changeset
  2556
claus
parents: 118
diff changeset
  2557
    |sel|
claus
parents: 118
diff changeset
  2558
claus
parents: 118
diff changeset
  2559
    sel := self getTextSelection.
claus
parents: 118
diff changeset
  2560
    sel notNil ifTrue:[
claus
parents: 118
diff changeset
  2561
	self replace:sel
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2562
    ]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2563
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2564
121
claus
parents: 118
diff changeset
  2565
defaultForGotoLine
claus
parents: 118
diff changeset
  2566
    "return a default value to show in the gotoLine box"
claus
parents: 118
diff changeset
  2567
claus
parents: 118
diff changeset
  2568
    cursorLine notNil ifTrue:[
claus
parents: 118
diff changeset
  2569
	^ cursorLine
claus
parents: 118
diff changeset
  2570
    ].
claus
parents: 118
diff changeset
  2571
    ^ super defaultForGotoLine
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2572
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2573
121
claus
parents: 118
diff changeset
  2574
showDeleted
claus
parents: 118
diff changeset
  2575
    "open a readonly editor on all deleted text"
claus
parents: 118
diff changeset
  2576
claus
parents: 118
diff changeset
  2577
    |v|
claus
parents: 118
diff changeset
  2578
claus
parents: 118
diff changeset
  2579
    v := EditTextView openWith:(Smalltalk at:#DeleteHistory).
claus
parents: 118
diff changeset
  2580
    v readOnly.
claus
parents: 118
diff changeset
  2581
    v topView label:'deleted text'.
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2582
! !
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2583
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2584
!EditTextView methodsFor:'formatting'!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2585
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2586
indent
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2587
    "indent selected line-range"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2588
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2589
    |start end|
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2590
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2591
    selectionStartLine isNil ifTrue:[^ self].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2592
    start := selectionStartLine.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2593
    end := selectionEndLine.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2594
    (selectionEndCol == 0) ifTrue:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2595
	end := end - 1
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2596
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2597
    self unselect.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2598
    self indentFromLine:start toLine:end
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2599
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2600
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2601
indentFromLine:start toLine:end
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2602
    "indent a line-range - this is don by searching for the 
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2603
     last non-empty line before start, and change the indent
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2604
     of the line based on that indent."
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2605
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2606
    |leftStart lnr delta d line spaces|
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2607
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2608
    "find a line to base indent on..."
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2609
    leftStart := 0.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2610
    lnr := start.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2611
    [(leftStart == 0) and:[lnr ~~ 1]] whileTrue:[
118
claus
parents: 105
diff changeset
  2612
	lnr := lnr - 1.
claus
parents: 105
diff changeset
  2613
	leftStart := self leftIndentOfLine:lnr
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2614
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2615
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2616
    (leftStart == 0) ifTrue:[^ self].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2617
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2618
    delta := leftStart - (self leftIndentOfLine:start).
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2619
    (delta == 0) ifTrue:[^ self].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2620
    (delta > 0) ifTrue:[
118
claus
parents: 105
diff changeset
  2621
	spaces := String new:delta
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2622
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2623
    start to:end do:[:lineNr |
118
claus
parents: 105
diff changeset
  2624
	line := self listAt:lineNr.
claus
parents: 105
diff changeset
  2625
	line notNil ifTrue:[
claus
parents: 105
diff changeset
  2626
	    line isBlank ifTrue:[
claus
parents: 105
diff changeset
  2627
		list at:lineNr put:nil
claus
parents: 105
diff changeset
  2628
	    ] ifFalse:[
claus
parents: 105
diff changeset
  2629
		(delta > 0) ifTrue:[
claus
parents: 105
diff changeset
  2630
		    line := spaces , line.
claus
parents: 105
diff changeset
  2631
		    widthOfWidestLine notNil ifTrue:[
claus
parents: 105
diff changeset
  2632
			widthOfWidestLine := widthOfWidestLine max:(self widthOfLineString:line).
claus
parents: 105
diff changeset
  2633
		    ]
claus
parents: 105
diff changeset
  2634
		] ifFalse:[
claus
parents: 105
diff changeset
  2635
		    "check if deletion is ok"
claus
parents: 105
diff changeset
  2636
		    d := delta negated + 1.
claus
parents: 105
diff changeset
  2637
claus
parents: 105
diff changeset
  2638
		    line size > d ifTrue:[
claus
parents: 105
diff changeset
  2639
			(line copyTo:(d - 1)) withoutSeparators isEmpty ifTrue:[
claus
parents: 105
diff changeset
  2640
			    line := line copyFrom:d
claus
parents: 105
diff changeset
  2641
			]
claus
parents: 105
diff changeset
  2642
		    ].
claus
parents: 105
diff changeset
  2643
		    widthOfWidestLine := nil
claus
parents: 105
diff changeset
  2644
		].
claus
parents: 105
diff changeset
  2645
		list at:lineNr put:line.
claus
parents: 105
diff changeset
  2646
		self textChanged.
claus
parents: 105
diff changeset
  2647
	    ]
claus
parents: 105
diff changeset
  2648
	]
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2649
    ].
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2650
    self redrawFromLine:start to:end
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2651
! !
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2652
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2653
!EditTextView methodsFor:'undo & again'!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2654
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2655
again
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2656
    "repeat the last action (which was a cut or replace).
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2657
     If current selection is not last string, search forward to
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2658
     next occurence of it before repeating the last operation."
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2659
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2660
    |s l c sel|
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2661
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2662
    lastString notNil ifTrue:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2663
	s := lastString asString.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2664
	"remove final cr"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2665
	s := s copyTo:(s size - 1).
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2666
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2667
	sel := self selection.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2668
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2669
	"if we are already there (after a find), ommit search"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2670
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2671
	(sel notNil and:[sel asString withoutSeparators = s]) ifTrue:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2672
	    undoAction := [self insertLines:lastString atLine:cursorLine col:cursorCol].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2673
	    l := selectionStartLine "cursorLine". 
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2674
	    c := selectionStartCol "cursorCol".
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2675
	    self deleteSelection.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2676
	    lastReplacement notNil ifTrue:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2677
		self insertLines:lastReplacement asStringCollection withCr:false.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2678
		self selectFromLine:l col:c toLine:cursorLine col:(cursorCol - 1).
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2679
	    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2680
	    ^ true
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2681
	].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2682
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2683
	self searchForwardFor:s startingAtLine:cursorLine col:cursorCol 
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2684
	    ifFound:
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2685
		[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2686
		    :line :col |
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2687
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2688
		    self selectFromLine:line col:col
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2689
				 toLine:line col:(col + s size - 1).
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2690
		    self makeLineVisible:line.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2691
		    undoAction := [self insertLines:lastString atLine:line col:col].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2692
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2693
		    self deleteSelection.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2694
		    lastReplacement notNil ifTrue:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2695
			self insertLines:lastReplacement asStringCollection withCr:false.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2696
			self selectFromLine:line col:col toLine:cursorLine col:(cursorCol - 1).
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2697
		    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2698
		    ^ true
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2699
		] 
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2700
	   ifAbsent:
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2701
		[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2702
		    self showNotFound.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2703
		    ^ false
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2704
		]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2705
    ]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2706
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2707
121
claus
parents: 118
diff changeset
  2708
undo
claus
parents: 118
diff changeset
  2709
    "currently not implemented"
claus
parents: 118
diff changeset
  2710
claus
parents: 118
diff changeset
  2711
    undoAction notNil ifTrue:[
claus
parents: 118
diff changeset
  2712
	undoAction value
claus
parents: 118
diff changeset
  2713
    ]
claus
parents: 118
diff changeset
  2714
!
claus
parents: 118
diff changeset
  2715
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2716
multipleAgain
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2717
    "repeat the last action (which was a cut or replace) until search fails"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2718
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2719
    [self again] whileTrue:[]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2720
! !
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2721
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2722
!EditTextView methodsFor:'searching'!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2723
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2724
searchFwd:pattern startingAtLine:startLine col:startCol ifAbsent:aBlock
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2725
    "do a forward search"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2726
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2727
    cursorLine isNil ifTrue:[^ self].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2728
    self searchForwardFor:pattern startingAtLine:startLine col:startCol
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2729
    ifFound:[:line :col |
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2730
	self cursorLine:line col:col.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2731
	self selectFromLine:line col:col
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2732
		     toLine:line col:(col + pattern size - 1).
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2733
	self makeLineVisible:cursorLine
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2734
    ] ifAbsent:aBlock
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2735
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2736
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2737
searchForMatchingParenthesisFromLine:startLine col:startCol
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2738
		     ifFound:foundBlock 
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2739
		  ifNotFound:notFoundBlock
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2740
		     onError:failBlock
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2741
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2742
    "search for a matching parenthesis, parChar is one of '$( $[ ${ $) $] $}'. 
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2743
     Search for the corresponding character is done forward if its an opening,
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2744
     backwards if its a closing parenthesis.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2745
     Performs foundBlock with line/col as argument if found, notFoundBlock if not.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2746
     If there is a nesting error, performs failBlock."
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2747
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2748
    |i direction lineString line col parChar charSet ignoreSet closingChar 
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2749
     ignoring delta endCol cc incSet decSet nesting maxLine|
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2750
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2751
    charSet := #( $( $) $[ $] ${ $} ).
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2752
    ignoreSet := #( $' $" ).
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2753
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2754
    parChar := self characterAtLine:startLine col:startCol.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2755
    i := charSet indexOf:parChar.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2756
    i == 0 ifTrue:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2757
	^ failBlock value   "not a parenthesis"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2758
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2759
    direction := #( fwd bwd fwd bwd fwd bwd) at:i.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2760
    closingChar := #( $) $( $] $[ $} ${ ) at:i.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2761
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2762
    col := startCol.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2763
    line := startLine.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2764
    direction == #fwd ifTrue:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2765
	delta := 1.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2766
	incSet := #( $( $[ ${ ).
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2767
	decSet := #( $) $] $} ).
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2768
    ] ifFalse:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2769
	delta := -1.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2770
	incSet := #( $) $] $} ).
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2771
	decSet := #( $( $[ ${ ).
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2772
    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2773
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2774
    nesting := 1.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2775
    ignoring := false.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2776
    lineString := list at:line.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2777
    maxLine := list size.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2778
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2779
    col := col + delta.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2780
    [nesting ~~ 0] whileTrue:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2781
	lineString notNil ifTrue:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2782
	    direction == #fwd ifTrue:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2783
		endCol := lineString size.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2784
	    ] ifFalse:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2785
		endCol := 1
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2786
	    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2787
	    col to:endCol by:delta do:[:runCol |
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2788
		cc := lineString at:runCol.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2789
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2790
		(ignoreSet includes:cc) ifTrue:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2791
		    ignoring := ignoring not
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2792
		].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2793
		ignoring ifFalse:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2794
		    (incSet includes:cc) ifTrue:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2795
			nesting := nesting + 1
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2796
		    ] ifFalse:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2797
			(decSet includes:cc) ifTrue:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2798
			    nesting := nesting - 1
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2799
			]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2800
		    ]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2801
		].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2802
		nesting == 0 ifTrue:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2803
		    "check if legal"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2804
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2805
		    cc == closingChar ifFalse:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2806
			^ failBlock value
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2807
		    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2808
		    ^ foundBlock value:line value:runCol.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2809
		]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2810
	    ].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2811
	].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2812
	line := line + delta.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2813
	(line < 1 or:[line > maxLine]) ifTrue:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2814
	    ^ failBlock value
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2815
	].
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2816
	lineString := list at:line.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2817
	direction == #fwd ifTrue:[
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2818
	    col := 1
59
450ce95a72a4 *** empty log message ***
claus
parents: 46
diff changeset
  2819
	] ifFalse:[
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2820
	    col := lineString size
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2821
	]
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2822
    ].
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2823
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2824
    ^ notFoundBlock value
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2825
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2826
121
claus
parents: 118
diff changeset
  2827
setSearchPattern
claus
parents: 118
diff changeset
  2828
    "set the searchpattern from the selection if there is one, and position
claus
parents: 118
diff changeset
  2829
     cursor to start of pattern"
claus
parents: 118
diff changeset
  2830
claus
parents: 118
diff changeset
  2831
    |sel|
claus
parents: 118
diff changeset
  2832
claus
parents: 118
diff changeset
  2833
    "if last operation was a replcae, set pattern to last
claus
parents: 118
diff changeset
  2834
     original string (for search after again)"
claus
parents: 118
diff changeset
  2835
claus
parents: 118
diff changeset
  2836
    (lastString notNil and:[lastReplacement notNil]) ifTrue:[
claus
parents: 118
diff changeset
  2837
	searchPattern := lastString asString withoutSeparators.
claus
parents: 118
diff changeset
  2838
	^ self
claus
parents: 118
diff changeset
  2839
    ].
claus
parents: 118
diff changeset
  2840
claus
parents: 118
diff changeset
  2841
    sel := self selection.
claus
parents: 118
diff changeset
  2842
    sel notNil ifTrue:[
claus
parents: 118
diff changeset
  2843
	self cursorLine:selectionStartLine col:selectionStartCol.
claus
parents: 118
diff changeset
  2844
	searchPattern := sel asString withoutSeparators
claus
parents: 118
diff changeset
  2845
    ]
claus
parents: 118
diff changeset
  2846
!
claus
parents: 118
diff changeset
  2847
claus
parents: 118
diff changeset
  2848
searchFwd:pattern ifAbsent:aBlock
claus
parents: 118
diff changeset
  2849
    "do a forward search"
claus
parents: 118
diff changeset
  2850
claus
parents: 118
diff changeset
  2851
    |startCol|
claus
parents: 118
diff changeset
  2852
claus
parents: 118
diff changeset
  2853
    "/ if there is no selection and the cursor is at the origin, 
claus
parents: 118
diff changeset
  2854
    "/ assume its the first search and do not skip the very first match
claus
parents: 118
diff changeset
  2855
    startCol := cursorCol.
claus
parents: 118
diff changeset
  2856
    self hasSelection ifFalse:[
claus
parents: 118
diff changeset
  2857
	(cursorLine == 1 and:[cursorCol == 1]) ifTrue:[
claus
parents: 118
diff changeset
  2858
	    startCol := 0
claus
parents: 118
diff changeset
  2859
	]
claus
parents: 118
diff changeset
  2860
    ].
claus
parents: 118
diff changeset
  2861
claus
parents: 118
diff changeset
  2862
    self searchFwd:pattern startingAtLine:cursorLine col:startCol ifAbsent:aBlock
claus
parents: 118
diff changeset
  2863
!
claus
parents: 118
diff changeset
  2864
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2865
searchForMatchingParenthesis
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2866
    "search for a matching parenthesis starting at cursor position. 
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2867
     Search for the corresponding character is done forward if its an opening, 
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2868
     backwards if its a closing parenthesis.
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2869
     Positions the cursor if found, peeps if not"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2870
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2871
     self searchForMatchingParenthesisFromLine:cursorLine col:cursorCol
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2872
			       ifFound:[:line :col | self cursorLine:line col:col]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2873
			    ifNotFound:[self showNotFound]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2874
			       onError:[device beep]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2875
!
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2876
121
claus
parents: 118
diff changeset
  2877
searchBwd:pattern ifAbsent:aBlock
claus
parents: 118
diff changeset
  2878
    "do a backward search"
claus
parents: 118
diff changeset
  2879
claus
parents: 118
diff changeset
  2880
    |startLine startCol|
claus
parents: 118
diff changeset
  2881
claus
parents: 118
diff changeset
  2882
    cursorLine isNil ifTrue:[^ self].
claus
parents: 118
diff changeset
  2883
    selectionStartLine notNil ifTrue:[
claus
parents: 118
diff changeset
  2884
	startLine := selectionStartLine.
claus
parents: 118
diff changeset
  2885
	startCol := selectionStartCol
claus
parents: 118
diff changeset
  2886
    ] ifFalse:[
claus
parents: 118
diff changeset
  2887
	startLine := cursorLine min:list size.
claus
parents: 118
diff changeset
  2888
	startCol := cursorCol
claus
parents: 118
diff changeset
  2889
    ].
claus
parents: 118
diff changeset
  2890
    self searchBackwardFor:pattern startingAtLine:startLine col:startCol
claus
parents: 118
diff changeset
  2891
    ifFound:[:line :col |
claus
parents: 118
diff changeset
  2892
	self cursorLine:line col:col.
claus
parents: 118
diff changeset
  2893
	self selectFromLine:line col:col
claus
parents: 118
diff changeset
  2894
		     toLine:line col:(col + pattern size - 1).
claus
parents: 118
diff changeset
  2895
	self makeLineVisible:cursorLine
claus
parents: 118
diff changeset
  2896
    ] ifAbsent:aBlock
claus
parents: 118
diff changeset
  2897
!
claus
parents: 118
diff changeset
  2898
105
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2899
searchForAndSelectMatchingParenthesis
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2900
    "select characters enclosed by matching parenthesis if one is under cusor"
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2901
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2902
    self searchForMatchingParenthesisFromLine:cursorLine col:cursorCol
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2903
			      ifFound:[:line :col | 
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2904
					  self selectFromLine:cursorLine col:cursorCol
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2905
						       toLine:line col:col
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2906
				      ]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2907
			   ifNotFound:[self showNotFound]
3d064ba4a0cc *** empty log message ***
claus
parents: 97
diff changeset
  2908
			      onError:[device beep]
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  2909
! !