ListView.st
author claus
Wed, 13 Oct 1993 02:04:14 +0100
changeset 3 9d7eefb5e69f
parent 0 e6a541c1c0eb
child 5 7b4fb1b170e5
permissions -rw-r--r--
(none)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     1
"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1989-93 by Claus Gittinger
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     4
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    11
"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    12
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    13
View subclass:#ListView
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:'list
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    15
                              attributes
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    16
                              firstLineShown leftOffset
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    17
                              nFullLinesShown nLinesShown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    18
                              fgColor bgColor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    19
                              partialLines
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    20
                              leftMargin topMargin
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    21
                              textStartLeft textStartTop innerWidth
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    22
                              tabPositions lineSpacing
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    23
                              fontHeight fontAscent
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    24
                              fontIsFixedWidth fontWidth
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    25
                              normalFont boldFont italicFont
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    26
                              autoScrollBlock autoScrollDeltaT
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    27
                              searchPattern'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    28
       classVariableNames:'spaces'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    29
       poolDictionaries:''
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    30
       category:'Views-Text'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    31
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    32
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    33
ListView comment:'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    34
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    35
COPYRIGHT (c) 1989-93 by Claus Gittinger
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    36
              All Rights Reserved
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    37
3
claus
parents: 0
diff changeset
    38
$Header: /cvs/stx/stx/libwidg/ListView.st,v 1.2 1993-10-13 01:02:48 claus Exp $
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    39
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    40
written spring 89 by claus
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    41
'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    42
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    43
!ListView class methodsFor:'documentation'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    44
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    45
documentation
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    46
"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    47
a simple View for lists - the elements must understand printString
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    48
the list is changed - the elements are replaced by their printStrings
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    49
(if this leads to problems - I will change it later)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    50
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    51
This class can only passively display -
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    52
selections, editing, cursors etc. must be done in subclasses.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    53
see SelectionInListView, TextView etc.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    54
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    55
This code currently handles only fixed-height fonts correctly -
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    56
should be rewritten in some places ...
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    57
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    58
Instance variables:
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    59
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    60
list            <aCollection>           the text strings
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    61
attributes      <aCollection>           corresponding attributes
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    62
firstLineShown  <Number>                the index of the 1st visible line (1 ..)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    63
leftOffset      <Number>                left offset for horizontal scroll
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    64
nFullLinesShown <Number>                the number of unclipped lines in visible
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    65
nLinesShown     <Number>                the number of lines in visible
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    66
fgColor         <Color>                 color to draw characters
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    67
bgColor         <Color>                 the background
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    68
partialLines    <Boolean>               allow last line to be partial displayed
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    69
leftMargin      <Number>                margin at left in pixels
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    70
topMargin       <Number>                margin at top in pixels
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    71
textStartLeft   <Number>                margin + leftMargin
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    72
textStartTop    <Number>                margin + topMargin
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    73
innerWidth      <Number>                width - margins
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    74
tabPositions    <aCollection>           tab stops (cols)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    75
fontHeight      <Number>                font height in pixels
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    76
fontAscent      <Number>                font ascent in pixels
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    77
fontIsFixed     <Boolean>               true if its a fixed font
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    78
fontWidth       <Number>                width of space
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    79
lineSpacing     <Number>                pixels between lines
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    80
normalFont      <Font>                  font for normal characters
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    81
boldFont        <Font>                  font for bold characters
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    82
italicFont      <Font>                  font for italic characters
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    83
searchPattern   <String>                last pattern for searching
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    84
"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    85
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    86
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    87
!ListView class methodsFor:'defaults'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    88
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    89
defaultTabPositions
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    90
    ^ #(1 9 17 25 33 41 49 57 65 73 81 89 97 105 113 121 129 137 145)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    91
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    92
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    93
!ListView methodsFor:'initialization'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    94
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    95
initialize
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    96
    super initialize.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    97
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    98
    spaces isNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    99
        spaces := String new:100
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   100
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   101
    bitGravity := #NorthWest.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   102
    list := nil.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   103
    firstLineShown := 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   104
    leftOffset := 0.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   105
    partialLines := true.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   106
    tabPositions := self class defaultTabPositions.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   107
    leftMargin := (self horizontalPixelPerMillimeter:0.5) rounded.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   108
    topMargin := (self verticalPixelPerMillimeter:0.5) rounded.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   109
    textStartLeft := leftMargin + margin.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   110
    textStartTop := topMargin + margin.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   111
    innerWidth := width - textStartLeft - margin.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   112
    self getFontParameters
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   113
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   114
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   115
initStyle
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   116
    super initStyle.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   117
    fgColor := Black.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   118
    bgColor := White.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   119
    lineSpacing := 0.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   120
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   121
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   122
initEvents
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   123
    self enableKeyEvents
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   124
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   125
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   126
create
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   127
    super create.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   128
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   129
    "I cache font parameters here - they are used so often ..."
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   130
    self getFontParameters.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   131
    self computeNumberOfLinesShown.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   132
    fgColor := fgColor on:device.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   133
    bgColor := bgColor on:device
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   134
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   135
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   136
recreate
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   137
    "recreate after a snapin"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   138
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   139
    super recreate.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   140
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   141
    "recompute margins and font parameters
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   142
     - display may have different resolution."
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   143
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   144
    leftMargin := (self horizontalPixelPerMillimeter:0.5) rounded.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   145
    topMargin := (self verticalPixelPerMillimeter:0.5) rounded.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   146
    textStartLeft := leftMargin + margin.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   147
    textStartTop := topMargin + margin.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   148
    innerWidth := width - textStartLeft - margin.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   149
    self getFontParameters
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   150
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   151
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   152
!ListView methodsFor:'accessing'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   153
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   154
backgroundColor:aColor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   155
    "set the background color"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   156
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   157
    bgColor := aColor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   158
    shown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   159
        self redraw
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   160
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   161
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   162
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   163
foregroundColor:aColor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   164
    "set the foreground color"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   165
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   166
    fgColor := aColor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   167
    shown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   168
        self redraw
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   169
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   170
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   171
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   172
foregroundColor:color1 backgroundColor:color2
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   173
    "set both foreground and background colors"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   174
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   175
    fgColor := color1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   176
    bgColor := color2.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   177
    shown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   178
        self redraw
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   179
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   180
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   181
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   182
partialLines:aBoolean
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   183
    "allow/disallow display of a last partial line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   184
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   185
    partialLines := aBoolean.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   186
    self computeNumberOfLinesShown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   187
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   188
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   189
leftMargin:aNumber
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   190
    "set the margin to left of 1st col"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   191
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   192
    leftMargin := aNumber.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   193
    textStartLeft := leftMargin + margin.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   194
    innerWidth := width - textStartLeft - margin
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   195
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   196
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   197
leftMargin
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   198
    "return the margin to left of 1st col"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   199
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   200
    ^ leftMargin
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   201
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   202
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   203
setList:aCollection
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   204
    "set the contents (a collection of strings) keep position unchanged"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   205
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   206
    (aCollection isNil and:[list isNil]) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   207
        "no change"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   208
        ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   209
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   210
    list := aCollection.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   211
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   212
    list notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   213
        self expandTabs
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   214
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   215
    self contentsChanged.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   216
    shown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   217
        self redrawFromVisibleLine:1 to:nLinesShown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   218
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   219
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   220
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   221
list:aCollection
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   222
    "set the contents (a collection of strings) and scroll to top"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   223
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   224
    |oldFirst|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   225
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   226
    (aCollection isNil and:[list isNil]) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   227
        "no change"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   228
        self scrollToTop.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   229
        ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   230
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   231
    list := aCollection.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   232
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   233
    list notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   234
        self expandTabs
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   235
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   236
    self contentsChanged.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   237
    "dont use scroll here to avoid the redraw"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   238
    oldFirst := firstLineShown.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   239
    firstLineShown := 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   240
    self originChanged:(oldFirst - 1) negated.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   241
    shown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   242
        self redrawFromVisibleLine:1 to:nLinesShown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   243
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   244
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   245
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   246
list
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   247
    "return the contents as a collection of strings"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   248
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   249
    ^ list
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   250
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   251
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   252
setContents:something
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   253
    "set the contents (either a string or a Collection of strings)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   254
     dont change position"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   255
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   256
    something isNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   257
        self setList:nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   258
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   259
        self setList:(something asText)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   260
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   261
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   262
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   263
contents:something
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   264
    "set the contents (either a string or a Collection of strings)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   265
     also scroll to top"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   266
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   267
    something isNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   268
        self list:nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   269
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   270
        self list:(something asText)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   271
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   272
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   273
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   274
contents
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   275
    "return the contents as a string"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   276
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   277
    list isNil ifTrue:[^ ''].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   278
    ^ list asString
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   279
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   280
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   281
at:index put:aString
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   282
    "change a line and redisplay"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   283
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   284
    self checkForExistingLine:index.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   285
    list at:index put:aString.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   286
    shown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   287
        self redrawLine:index
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   288
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   289
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   290
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   291
at:index
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   292
    "retrieve a line; return nil if behond end-of-text"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   293
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   294
    ^ self listAt:index
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   295
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   296
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   297
removeIndexWithoutRedraw:lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   298
    "delete line - no redraw;
3
claus
parents: 0
diff changeset
   299
     return true, if something was really deleted"
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   300
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   301
    (list isNil or:[lineNr > list size]) ifTrue:[^ false].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   302
    list removeIndex:lineNr.
3
claus
parents: 0
diff changeset
   303
    lineNr "<=" < firstLineShown ifTrue:[
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   304
        firstLineShown := firstLineShown - 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   305
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   306
    self contentsChanged.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   307
    ^ true
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   308
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   309
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   310
removeIndex:lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   311
    "delete line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   312
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   313
    |visLine w
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   314
     srcY "{ Class: SmallInteger }" |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   315
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   316
    w := self widthForScrollBetween:lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   317
                                and:(firstLineShown + nLinesShown).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   318
    (self removeIndexWithoutRedraw:lineNr) ifFalse:[^ self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   319
    visLine := self listLineToVisibleLine:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   320
    visLine notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   321
        srcY := topMargin + (visLine * fontHeight).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   322
        self copyFrom:self x:textStartLeft y:srcY
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   323
                         toX:textStartLeft y:(srcY - fontHeight)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   324
                       width:w height:((nLinesShown - visLine) * fontHeight).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   325
        self redrawVisibleLine:nFullLinesShown.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   326
        (nFullLinesShown ~~ nLinesShown) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   327
            self redrawVisibleLine:nLinesShown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   328
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   329
        exposePending := true.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   330
        self waitForExpose
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   331
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   332
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   333
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   334
font:aFont
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   335
    "set the font"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   336
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   337
    aFont isNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   338
        ^ self error:'nil font'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   339
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   340
    super font:aFont.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   341
    (font device == device) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   342
        self getFontParameters.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   343
        self computeNumberOfLinesShown.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   344
        shown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   345
            self redrawFromVisibleLine:1 to:nLinesShown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   346
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   347
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   348
    self contentsChanged
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   349
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   350
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   351
level:aNumber
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   352
    "set the level - cought here to update text-position variables
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   353
     (which avoid many computations later)"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   354
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   355
    super level:aNumber.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   356
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   357
    textStartLeft := leftMargin + margin.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   358
    textStartTop := topMargin + margin.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   359
"    textStartLeft := leftMargin.              "
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   360
    innerWidth := width - textStartLeft - margin
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   361
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   362
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   363
innerHeight
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   364
    "return the number of pixels visible of the contents
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   365
     - redefined since ListView adds a margin"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   366
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   367
    ^ height - (2 * margin) - (2 * topMargin)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   368
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   369
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   370
!ListView methodsFor:'queries'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   371
3
claus
parents: 0
diff changeset
   372
firstLineShown
claus
parents: 0
diff changeset
   373
    "return the index of the first (possibly partial) visible line"
claus
parents: 0
diff changeset
   374
claus
parents: 0
diff changeset
   375
    ^ firstLineShown
claus
parents: 0
diff changeset
   376
!
claus
parents: 0
diff changeset
   377
claus
parents: 0
diff changeset
   378
lastLineShown
claus
parents: 0
diff changeset
   379
    "return the index of the last (possibly partial)
claus
parents: 0
diff changeset
   380
     visible line"
claus
parents: 0
diff changeset
   381
claus
parents: 0
diff changeset
   382
    ^ firstLineShown + nLinesShown
claus
parents: 0
diff changeset
   383
!
claus
parents: 0
diff changeset
   384
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   385
numberOfLines
3
claus
parents: 0
diff changeset
   386
    "return the number of lines the text has"
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   387
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   388
    ^ list size
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   389
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   390
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   391
lengthOfLongestLine
3
claus
parents: 0
diff changeset
   392
    "return the length (in characters) of the longest line"
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   393
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   394
    |max      "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   395
     thisLen  "{ Class: SmallInteger }" |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   396
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   397
    max := 0.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   398
    list notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   399
        list do:[:lineString |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   400
            lineString notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   401
                thisLen := lineString size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   402
                (thisLen > max) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   403
                    max := thisLen
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   404
                ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   405
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   406
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   407
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   408
    ^ max
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   409
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   410
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   411
lengthOfLongestLineBetween:firstLine and:lastLine
3
claus
parents: 0
diff changeset
   412
    "return the length (in characters) of the longest line in a line-range"
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   413
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   414
    |max      "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   415
     thisLen  "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   416
     listSize "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   417
     first    "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   418
     last     "{ Class: SmallInteger }" |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   419
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   420
    listSize := list size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   421
    max := 0.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   422
    first := firstLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   423
    last := lastLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   424
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   425
    (first > listSize) ifTrue:[^ max].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   426
    (last > listSize) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   427
        last := listSize
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   428
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   429
    list from:first to:last do:[:lineString |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   430
        lineString notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   431
            thisLen := lineString size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   432
            (thisLen > max) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   433
                max := thisLen
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   434
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   435
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   436
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   437
    ^ max
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   438
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   439
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   440
heightOfContents
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   441
    "return the height of the contents in pixels
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   442
     - used for scrollbar interface"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   443
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   444
    | numLines |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   445
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   446
    numLines := self numberOfLines.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   447
    ^ numLines * fontHeight + textStartTop.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   448
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   449
    "it used to be that code - which is wrong"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   450
    (nLinesShown == nFullLinesShown) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   451
        ^ numLines * fontHeight
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   452
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   453
    "add one - otherwise we cannot make last line
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   454
     fully visible since scrolling is done by full lines only"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   455
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   456
    ^ (numLines + 1) * fontHeight
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   457
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   458
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   459
widthOfContents
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   460
    "return the width of the contents in pixels"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   461
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   462
    |max|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   463
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   464
    fontIsFixedWidth ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   465
        ^ self lengthOfLongestLine * fontWidth
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   466
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   467
    max := 0.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   468
    list notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   469
        max := max max:(font widthOf:list)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   470
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   471
    ^ max
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   472
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   473
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   474
yOriginOfContents
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   475
    "return the vertical origin of the contents in pixels
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   476
     - used for scrollbar interface"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   477
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   478
    ^ (firstLineShown - 1) * fontHeight
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   479
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   480
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   481
xOriginOfContents
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   482
    "return the horizontal origin of the contents in pixels
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   483
     - used for scrollbar interface"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   484
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   485
    ^leftOffset 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   486
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   487
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   488
leftIndentOfLine:lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   489
    "return the number of spaces at the left in line, lineNr"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   490
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   491
    |lineString index end|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   492
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   493
    lineString := self listAt:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   494
    lineString isNil ifTrue:[^ 0].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   495
    index := 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   496
    end := lineString size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   497
    [index <= end] whileTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   498
        (lineString at:index) isSeparator ifFalse:[^ index - 1].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   499
        index := index + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   500
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   501
    ^ 0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   502
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   503
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   504
!ListView methodsFor:'private'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   505
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   506
getFontParameters
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   507
    "get some info of the used font. They are cached since we use them often .."
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   508
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   509
    font := font on:device.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   510
    normalFont := font.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   511
    fontHeight := font height + lineSpacing.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   512
    fontAscent := font ascent.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   513
    fontWidth := font width.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   514
    fontIsFixedWidth := font isFixedWidth.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   515
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   516
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   517
checkForExistingLine:lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   518
    "check if a line for lineNr exists; if not, expand text"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   519
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   520
    list isNil ifTrue: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   521
        list := Text new:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   522
        self contentsChanged
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   523
    ] ifFalse: [
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   524
        lineNr > (list size) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   525
            list grow:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   526
            self contentsChanged
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   527
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   528
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   529
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   530
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   531
getBoldFont
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   532
    "get a bold-font corresponding to font"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   533
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   534
    font style notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   535
        boldFont := Font family:(font family) face:'bold'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   536
                          style:'roman' size:(font size)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   537
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   538
    boldFont isNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   539
        boldFont := font
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   540
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   541
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   542
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   543
getItalicFont
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   544
    "get an italic-font corresponding to font"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   545
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   546
    font style notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   547
        italicFont := Font family:(font family) face:'medium'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   548
                            style:'oblique' size:(font size)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   549
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   550
    italicFont isNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   551
        italicFont := font
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   552
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   553
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   554
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   555
convertRTF:aList
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   556
    "this is a q&d RTF to poor-text converter which removes any rich stuff.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   557
     - a first shot 'til  DocumentView is finished ..."
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   558
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   559
    |newList newLine charIndex inEscape char special|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   560
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   561
    newList := Text new:200.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   562
    newList grow:0.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   563
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   564
    newLine := ''.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   565
    aList do:[:line |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   566
        ((line size == 0) or:[line isBlank]) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   567
            newList add:newLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   568
            newLine := ''
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   569
        ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   570
            special := ((line at:1) == ${) or:[(line includes:$\)].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   571
            special := special or:[(line at:1) == $}].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   572
            special ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   573
                newList add:(newLine , line)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   574
            ] ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   575
                charIndex := 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   576
                [charIndex <= line size] whileTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   577
                    char := line at:charIndex.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   578
                    ((char == ${ ) or:[char == $} ]) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   579
                        "left-brace: ignore rest of line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   580
                        charIndex := line size + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   581
                    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   582
                        (char == $\) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   583
                            inEscape := true
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   584
                        ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   585
                            inEscape ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   586
                                (char == Character space) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   587
                                    inEscape := false
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   588
                                ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   589
                            ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   590
                                newLine := newLine copyWith:char
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   591
                            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   592
                        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   593
                        charIndex := charIndex + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   594
                    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   595
                ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   596
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   597
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   598
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   599
    ^ newList
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   600
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   601
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   602
expandTabs
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   603
    "go through whole text expanding tabs into spaces"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   604
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   605
    |line newLine nLines "{ Class: SmallInteger }"|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   606
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   607
    list notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   608
        nLines := list size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   609
        1 to:nLines do:[:index |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   610
            line := list at:index.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   611
            line notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   612
                (line class == String) ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   613
                    newLine := line printString
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   614
                ] ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   615
                    newLine := line
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   616
                ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   617
                (newLine occurrencesOf:(Character tab)) == 0 ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   618
                    newLine := self withTabsExpanded:newLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   619
                ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   620
                (newLine ~~ line) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   621
                    list at:index put:newLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   622
                ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   623
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   624
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   625
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   626
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   627
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   628
nextTabAfter:colNr
3
claus
parents: 0
diff changeset
   629
    "return the next tab position after col"
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   630
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   631
    |col      "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   632
     tabIndex "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   633
     thisTab  "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   634
     nTabs    "{ Class: SmallInteger }" |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   635
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   636
    tabIndex := 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   637
    col := colNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   638
    thisTab := tabPositions at:tabIndex.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   639
    nTabs := tabPositions size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   640
    [thisTab <= col] whileTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   641
        (tabIndex == nTabs) ifTrue:[^ thisTab].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   642
        tabIndex := tabIndex + 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   643
        thisTab := tabPositions at:tabIndex
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   644
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   645
    ^ thisTab
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   646
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   647
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   648
prevTabBefore:colNr
3
claus
parents: 0
diff changeset
   649
    "return the prev tab position before col"
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   650
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   651
    |col      "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   652
     tabIndex "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   653
     thisTab  "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   654
     nTabs    "{ Class: SmallInteger }" |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   655
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   656
    tabIndex := 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   657
    col := colNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   658
    thisTab := tabPositions at:tabIndex.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   659
    nTabs := tabPositions size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   660
    [thisTab < col] whileTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   661
        (tabIndex == nTabs) ifTrue:[^ thisTab].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   662
        tabIndex := tabIndex + 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   663
        thisTab := tabPositions at:tabIndex
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   664
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   665
    (tabIndex == 1) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   666
        ^ 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   667
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   668
    ^ tabPositions at:(tabIndex - 1)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   669
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   670
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   671
withTabsExpanded:line
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   672
    "good idea, to make this one a primitive"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   673
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   674
    |tmpString nString
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   675
     currentMax "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   676
     dstIndex   "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   677
     nextTab    "{ Class: SmallInteger }" |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   678
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   679
    currentMax := 200.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   680
    tmpString := String new:currentMax.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   681
    dstIndex := 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   682
    line do:[:character |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   683
        (character == (Character tab)) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   684
            nextTab := self nextTabAfter:dstIndex.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   685
            [dstIndex < nextTab] whileTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   686
                tmpString at:dstIndex put:(Character space).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   687
                dstIndex := dstIndex + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   688
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   689
        ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   690
            tmpString at:dstIndex put:character.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   691
            dstIndex := dstIndex + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   692
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   693
        (dstIndex > currentMax) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   694
            currentMax := currentMax + currentMax.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   695
            nString := String new:currentMax.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   696
            nString replaceFrom:1 to:(dstIndex - 1) 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   697
                           with:tmpString startingAt:1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   698
            tmpString := nString.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   699
            nString := nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   700
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   701
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   702
        "make stc-optimizer happy
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   703
         - no need to return value of ifTrue:/ifFalse above"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   704
        0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   705
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   706
    ^ tmpString copyFrom:1 to:(dstIndex - 1)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   707
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   708
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   709
computeNumberOfLinesShown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   710
    "recompute the number of visible lines"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   711
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   712
    nFullLinesShown := self innerHeight // fontHeight.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   713
    nLinesShown := nFullLinesShown.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   714
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   715
    partialLines ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   716
        ((nLinesShown * fontHeight) == height) ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   717
            nLinesShown := nLinesShown + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   718
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   719
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   720
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   721
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   722
widthOfWidestLineBetween:firstLine and:lastLine
3
claus
parents: 0
diff changeset
   723
    "return the width in pixels of the widest line in a range"
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   724
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   725
    |max      "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   726
     first    "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   727
     last     "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   728
     thisLen  "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   729
     listSize "{ Class: SmallInteger }" |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   730
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   731
    fontIsFixedWidth ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   732
        ^ (self lengthOfLongestLineBetween:firstLine and:lastLine) * fontWidth
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   733
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   734
    listSize := list size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   735
    max := 0.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   736
    first := firstLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   737
    last := lastLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   738
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   739
    (first > listSize) ifTrue:[^ max].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   740
    (last > listSize) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   741
        last := listSize
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   742
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   743
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   744
    list from:first to:last do:[:line |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   745
        line notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   746
            thisLen := font widthOf:line.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   747
            (thisLen > max) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   748
                max := thisLen
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   749
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   750
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   751
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   752
    ^ max
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   753
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   754
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   755
widthForScrollBetween:firstLine and:lastLine
3
claus
parents: 0
diff changeset
   756
    "return the width in pixels for a scroll between firstLine and lastLine"
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   757
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   758
    |w|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   759
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   760
    "for small width, its not worth searching for
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   761
     longest line ..."
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   762
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   763
    (width < 300) ifTrue:[^ innerWidth].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   764
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   765
    w := self widthOfWidestLineBetween:firstLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   766
                                   and:lastLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   767
    (w > innerWidth) ifTrue:[^ innerWidth].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   768
    ^ w
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   769
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   770
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   771
listAt:lineNr
3
claus
parents: 0
diff changeset
   772
    "given a lineNumber, return the corresponding string"
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   773
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   774
    list isNil ifTrue:[^ nil].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   775
    (lineNr between:1 and:list size) ifFalse:[^ nil].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   776
    ^ list at:lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   777
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   778
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   779
listAt:lineNr from:startCol to:endCol
3
claus
parents: 0
diff changeset
   780
    "return substring from startCol to endCol of a line"
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   781
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   782
    |line stop lineLen|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   783
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   784
    line := self listAt:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   785
    line isNil ifTrue:[^ nil].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   786
    lineLen := line size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   787
    (startCol > lineLen) ifTrue:[^ nil].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   788
    stop := endCol.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   789
    (stop > lineLen) ifTrue:[stop := lineLen].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   790
    ^ line copyFrom:startCol to:stop
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   791
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   792
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   793
listAt:lineNr from:startCol
3
claus
parents: 0
diff changeset
   794
    "return right substring from startCol to end of a line"
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   795
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   796
    |line|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   797
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   798
    line := self listAt:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   799
    line isNil ifTrue:[^ nil].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   800
    (startCol > line size) ifTrue:[^ nil].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   801
    ^ line copyFrom:startCol to:(line size)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   802
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   803
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   804
listAt:lineNr to:endCol
3
claus
parents: 0
diff changeset
   805
    "return left substring from start to endCol of a line"
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   806
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   807
    |line stop|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   808
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   809
    line := self listAt:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   810
    line isNil ifTrue:[^ nil].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   811
    stop := endCol.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   812
    (stop > line size) ifTrue:[stop := line size].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   813
    ^ line copyFrom:1 to:stop
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   814
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   815
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   816
listLineToVisibleLine:listLineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   817
    "given a list line (1..) return visible linenr or nil"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   818
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   819
    |visibleLineNr "{ Class: SmallInteger }"|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   820
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   821
    shown ifFalse:[^ nil].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   822
    listLineNr isNil ifTrue:[^ nil].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   823
    visibleLineNr := listLineNr + 1 - firstLineShown.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   824
    (visibleLineNr between:1 and:nLinesShown) ifFalse:[^ nil].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   825
    ^ visibleLineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   826
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   827
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   828
visibleLineToListLine:visibleLineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   829
    "given a visible line (1..) return linenr in list or nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   830
     (this one returns nil if the given visibleLineNr is one of the
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   831
     separators)"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   832
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   833
    |listLineNr  "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   834
     listsize    "{ Class: SmallInteger }" |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   835
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   836
    visibleLineNr isNil ifTrue:[^ nil].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   837
    listLineNr := visibleLineNr + firstLineShown - 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   838
    (listLineNr == 0) ifTrue:[^nil].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   839
    listsize := list size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   840
    (listLineNr <= listsize) ifTrue:[^ listLineNr].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   841
    ^ nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   842
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   843
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   844
absoluteLineToVisibleLine:absLineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   845
    "given an absolute line (1..) return visible linenr or nil"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   846
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   847
    absLineNr isNil ifTrue:[^ nil].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   848
    (absLineNr < firstLineShown) ifTrue:[^ nil].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   849
    (absLineNr >= (firstLineShown + nLinesShown)) ifTrue:[^ nil].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   850
    ^ absLineNr - firstLineShown + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   851
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   852
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   853
visibleLineToAbsoluteLine:visibleLineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   854
    "given a visible line (1..) return absolut linenr"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   855
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   856
    visibleLineNr isNil ifTrue:[^ nil].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   857
    ^ visibleLineNr + firstLineShown - 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   858
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   859
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   860
yOfLine:visLineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   861
    "given a visible lineNr, return y-coordinate in view
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   862
     - works for fix-height fonts only"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   863
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   864
    ^ ((visLineNr - 1) * fontHeight) + textStartTop
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   865
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   866
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   867
xOfCol:col inLine:visLineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   868
    "given a visible line- and colNr, return x-coordinate in view"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   869
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   870
    |line lineSize tcol|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   871
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   872
    tcol := col - 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   873
    fontIsFixedWidth ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   874
        ^ (tcol * fontWidth) + textStartLeft
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   875
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   876
    line := self visibleAt:visLineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   877
    line notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   878
        lineSize := line size
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   879
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   880
        lineSize := 0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   881
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   882
    (lineSize == 0) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   883
        ^ (tcol * fontWidth) + textStartLeft
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   884
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   885
    (lineSize < col) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   886
        ^ (font widthOf:line) 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   887
          + (fontWidth * (tcol - lineSize)) 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   888
          + textStartLeft
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   889
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   890
    ^ (font widthOf:line from:1 to:tcol) + textStartLeft
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   891
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   892
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   893
colOfX:x inVisibleLine:visLineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   894
    "given a visible lineNr and x-coordinate, return colNr"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   895
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   896
    |lineString linePixelWidth xRel runCol posLeft posRight done|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   897
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   898
    xRel := x - textStartLeft.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   899
    fontIsFixedWidth ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   900
        ^ (xRel // fontWidth) + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   901
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   902
    lineString := self visibleAt:visLineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   903
    lineString notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   904
        linePixelWidth := font widthOf:lineString
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   905
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   906
        linePixelWidth := 0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   907
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   908
    (xRel <= 0) ifTrue:[^ 1].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   909
    (linePixelWidth <= xRel) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   910
        ^ lineString size + ((xRel - linePixelWidth) // fontWidth) + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   911
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   912
    runCol := lineString size // 2.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   913
    (runCol == 0) ifTrue:[runCol := 1].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   914
    posLeft := font widthOf:lineString from:1 to:(runCol - 1).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   915
    posRight := font widthOf:lineString from:1 to:runCol.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   916
    done := (posLeft <= xRel) and:[posRight > xRel].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   917
    [done] whileFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   918
        (posRight <= xRel) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   919
            runCol := runCol + 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   920
            posLeft := posRight.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   921
            posRight := font widthOf:lineString from:1 to:runCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   922
        ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   923
            (posLeft > xRel) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   924
                runCol := runCol - 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   925
                (runCol == 0) ifTrue:[^ 0].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   926
                posRight := posLeft.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   927
                posLeft := font widthOf:lineString from:1 to:(runCol - 1)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   928
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   929
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   930
        done := (posLeft <= xRel) and:[posRight > xRel]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   931
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   932
    ^ runCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   933
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   934
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   935
visibleLineOfY:y
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   936
    "given a y-coordinate, return lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   937
     - works for fix-height fonts only"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   938
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   939
    ^ ((y - textStartTop) // fontHeight) + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   940
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   941
3
claus
parents: 0
diff changeset
   942
visibleAttributeAt:visibleLineNr
claus
parents: 0
diff changeset
   943
    "return the attributes of what is visible at line (numbers start at 1)"
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   944
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   945
    |listLineNr listsize|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   946
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   947
    listLineNr := visibleLineNr + firstLineShown - 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   948
    (listLineNr == 0) ifTrue:[^ nil].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   949
    (attributes notNil) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   950
        listsize := attributes size
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   951
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   952
        listsize := 0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   953
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   954
    (listLineNr <= listsize) ifTrue:[^ attributes at:listLineNr].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   955
    ^ nil 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   956
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   957
    
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   958
visibleAt:visibleLineNr
3
claus
parents: 0
diff changeset
   959
    "return what is visible at line (numbers start at 1)"
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   960
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   961
    |listLineNr listsize|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   962
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   963
    listLineNr := visibleLineNr + firstLineShown - 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   964
    (listLineNr == 0) ifTrue:[^ nil].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   965
    (list notNil) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   966
        listsize := list size
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   967
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   968
        listsize := 0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   969
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   970
    (listLineNr <= listsize) ifTrue:[^ list at:listLineNr].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   971
    ^ ''
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   972
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   973
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   974
lineOfCharacterPosition:charPos
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   975
    "given a character index within the contents-string,
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   976
     return the lineNumber where the character is
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   977
     - used to find line to hilight from Compilers error-position"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   978
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   979
    |lineNr sum lastLine|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   980
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   981
    lineNr := 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   982
    sum := 0.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   983
    lastLine := list size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   984
    [sum < charPos] whileTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   985
        (lineNr > lastLine) ifTrue:[^ lineNr - 1].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   986
        sum := sum + (list at:lineNr) size + 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   987
        lineNr := lineNr + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   988
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   989
    ^ lineNr - 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   990
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   991
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   992
characterPositionOfLine:lineNr col:col
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   993
    "given a line/col position, return the character index within the contents-string,
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   994
     - used with Compilers error-positioning"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   995
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   996
    |lineString pos|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   997
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   998
    pos := 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   999
    1 to:(lineNr - 1) do:[:lnr |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1000
        lineString := list at:lnr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1001
        lineString notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1002
            pos := pos + lineString size
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1003
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1004
        pos := pos + 1   "the return-character"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1005
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1006
    ^ pos + col - 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1007
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1008
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1009
!ListView methodsFor:'searching'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1010
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1011
setSearchPattern:aString
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1012
    "set the searchpattern"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1013
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1014
    searchPattern := aString withoutSeparators
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1015
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1016
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1017
searchForwardFor:pattern startingAtLine:startLine col:startCol ifFound:block1 else:block2
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1018
    "search for a pattern, if found evaluate block1 with row/col as arguments, if not
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1019
     found evaluate block2"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1020
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1021
    |lineString col cc found firstChar savedCursor patternSize|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1022
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1023
    patternSize := pattern size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1024
    patternSize ~~ 0 ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1025
        savedCursor := cursor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1026
        self cursor:(Cursor questionMark).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1027
        searchPattern := pattern.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1028
        col := startCol + 1.
3
claus
parents: 0
diff changeset
  1029
"
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1030
        firstChar := pattern at:1.
3
claus
parents: 0
diff changeset
  1031
"
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1032
        startLine to:(list size) do:[:lnr |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1033
            lineString := list at:lnr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1034
            lineString notNil ifTrue:[
3
claus
parents: 0
diff changeset
  1035
                col := lineString findString:pattern startingAt:col ifAbsent:[0].
claus
parents: 0
diff changeset
  1036
                col ~~ 0 ifTrue:[
claus
parents: 0
diff changeset
  1037
                    self cursor:savedCursor.
claus
parents: 0
diff changeset
  1038
                    ^ block1 value:lnr value:col.
claus
parents: 0
diff changeset
  1039
                ]
claus
parents: 0
diff changeset
  1040
"
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1041
                col := lineString indexOf:firstChar startingAt:col.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1042
                [col == 0] whileFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1043
                    cc := col.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1044
                    found := true.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1045
                    1 to:patternSize do:[:cnr |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1046
                        cc > lineString size ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1047
                            found := false
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1048
                        ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1049
                            (pattern at:cnr) ~~ (lineString at:cc) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1050
                                found := false
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1051
                            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1052
                        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1053
                        cc := cc + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1054
                    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1055
                    found ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1056
                        self cursor:savedCursor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1057
                        ^ block1 value:lnr value:col.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1058
                    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1059
                    col := col + 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1060
                    col := lineString indexOf:firstChar startingAt:col
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1061
                ]
3
claus
parents: 0
diff changeset
  1062
"
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1063
            ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1064
            col := 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1065
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1066
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1067
    "not found"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1068
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1069
    self cursor:savedCursor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1070
    ^ block2 value
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1071
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1072
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1073
searchBackwardFor:pattern startingAtLine:startLine col:startCol ifFound:block1 else:block2
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1074
    "search for a pattern, if found evaluate block1 with row/col as arguments, if not
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1075
     found evaluate block2"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1076
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1077
    |lineString col cc found firstChar savedCursor patternSize|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1078
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1079
    patternSize := pattern size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1080
    patternSize ~~ 0 ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1081
        savedCursor := cursor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1082
        self cursor:(Cursor questionMark).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1083
        searchPattern := pattern.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1084
        col := startCol - 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1085
        firstChar := pattern at:1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1086
        col > (list at:startLine) size ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1087
            col := nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1088
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1089
        startLine to:1 by:-1 do:[:lnr |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1090
            lineString := list at:lnr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1091
            lineString notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1092
                col isNil ifTrue:[col := lineString size - patternSize + 1].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1093
                [(col > 0) and:[(lineString at:col) ~~ firstChar]] whileTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1094
                    col := col - 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1095
                ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1096
                [col > 0] whileTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1097
                    cc := col.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1098
                    found := true.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1099
                    1 to:patternSize do:[:cnr |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1100
                        cc > lineString size ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1101
                            found := false
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1102
                        ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1103
                            (pattern at:cnr) ~~ (lineString at:cc) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1104
                                found := false
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1105
                            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1106
                        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1107
                        cc := cc + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1108
                    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1109
                    found ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1110
                        self cursor:savedCursor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1111
                        ^ block1 value:lnr value:col.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1112
                    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1113
                    col := col - 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1114
                    [(col > 0) and:[(lineString at:col) ~~ firstChar]] whileTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1115
                        col := col - 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1116
                    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1117
                ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1118
            ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1119
            col := nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1120
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1121
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1122
    "not found"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1123
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1124
    self cursor:savedCursor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1125
    ^ block2 value
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1126
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1127
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1128
!ListView methodsFor:'scrolling'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1129
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1130
gotoLine:aLineNumber
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1131
    "position to line aLineNumber; this may be redefined
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1132
     in subclasses (for example to move the cursor also)"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1133
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1134
    ^ self scrollToLine:aLineNumber
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1135
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1136
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1137
pageDown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1138
    "change origin to display next page"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1139
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1140
    self originWillChange.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1141
    firstLineShown := firstLineShown + nFullLinesShown.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1142
    self originChanged:nFullLinesShown.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1143
    self redrawFromVisibleLine:1 to:nLinesShown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1144
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1145
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1146
pageUp
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1147
    "change origin to display previous page"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1148
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1149
    |oldOrg|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1150
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1151
    (firstLineShown == 1) ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1152
        self originWillChange.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1153
        oldOrg := firstLineShown.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1154
        firstLineShown := firstLineShown - nFullLinesShown.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1155
        (firstLineShown < 1) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1156
            firstLineShown := 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1157
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1158
        self originChanged:(firstLineShown - oldOrg).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1159
        self redrawFromVisibleLine:1 to:nLinesShown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1160
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1161
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1162
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1163
halfPageDown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1164
    "scroll down half a page"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1165
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1166
    self scrollDown:(nFullLinesShown // 2)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1167
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1168
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1169
halfPageUp
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1170
    "scroll up half a page"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1171
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1172
    self scrollUp:(nFullLinesShown // 2)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1173
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1174
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1175
scrollDown:nLines
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1176
    "change origin to scroll down some lines"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1177
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1178
    |w     "{ Class:SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1179
     h     "{ Class:SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1180
     m2    "{ Class:SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1181
     count "{ Class:SmallInteger }"|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1182
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1183
    count := nLines.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1184
    (firstLineShown + nLines + nFullLinesShown > list size) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1185
        count := list size - firstLineShown - nFullLinesShown + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1186
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1187
    count <= 0 ifTrue:[^ self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1188
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1189
    self originWillChange.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1190
    (count >= nLinesShown) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1191
        firstLineShown := firstLineShown + count.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1192
        self redrawFromVisibleLine:1 to:nLinesShown.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1193
        self originChanged:(count negated)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1194
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1195
        m2 := margin * 2.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1196
        w := self widthForScrollBetween:firstLineShown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1197
                                    and:(firstLineShown + nLinesShown).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1198
        w := w + leftMargin.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1199
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1200
        firstLineShown := firstLineShown + count.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1201
        h := (fontHeight * count) + textStartTop.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1202
        self copyFrom:self x:margin y:h
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1203
                         toX:margin y:textStartTop
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1204
                       width:w height:(height - m2 - h).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1205
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1206
        self redrawFromVisibleLine:(nFullLinesShown - count + 1)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1207
                                to:nLinesShown.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1208
        self originChanged:(count negated).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1209
        exposePending := true.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1210
        self waitForExpose
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1211
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1212
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1213
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1214
scrollDown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1215
    "change origin to scroll down one line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1216
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1217
    self scrollDown:1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1218
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1219
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1220
scrollUp:nLines
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1221
    "change origin to scroll up some lines"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1222
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1223
    |w      "{ Class:SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1224
     h      "{ Class:SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1225
     count  "{ Class:SmallInteger }"|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1226
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1227
    count := nLines.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1228
    count >= firstLineShown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1229
        count := firstLineShown - 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1230
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1231
    (count == 0) ifTrue:[^ self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1232
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1233
    self originWillChange.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1234
    (count >= nLinesShown) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1235
        firstLineShown := firstLineShown - count.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1236
        self redrawFromVisibleLine:1 to:nLinesShown.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1237
        self originChanged:(count negated)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1238
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1239
        w := self widthForScrollBetween:firstLineShown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1240
                                    and:(firstLineShown + nLinesShown).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1241
        w := w + leftMargin.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1242
        firstLineShown := firstLineShown - count.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1243
        h := (fontHeight * count) + topMargin.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1244
        self copyFrom:self x:margin y:topMargin
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1245
                         toX:margin y:h
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1246
                       width:w height:(height - h - margin).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1247
        self redrawFromVisibleLine:1 to:count.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1248
        self originChanged:(count negated).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1249
        exposePending := true.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1250
        self waitForExpose
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1251
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1252
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1253
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1254
scrollUp
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1255
    "change origin to scroll up one line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1256
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1257
    self scrollUp:1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1258
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1259
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1260
scrollToTop
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1261
    "change origin to start of text"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1262
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1263
    self scrollToLine:1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1264
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1265
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1266
scrollToLine:aLineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1267
    "change origin to make aLineNr be the top line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1268
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1269
    aLineNr < firstLineShown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1270
        self scrollUp:(firstLineShown - aLineNr)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1271
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1272
        aLineNr > firstLineShown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1273
            self scrollDown:(aLineNr - firstLineShown)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1274
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1275
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1276
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1277
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1278
scrollVerticalToPercent:percent
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1279
    "scroll to a position given in percent of total"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1280
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1281
    |lineNr|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1282
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1283
    lineNr := (((self numberOfLines * percent) asFloat / 100.0) + 0.5) asInteger + 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1284
    self scrollToLine:lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1285
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1286
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1287
makeLineVisible:aListLineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1288
    "if aListLineNr is not visible, scroll to make it visible"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1289
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1290
    |bott|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1291
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1292
    (aListLineNr isNil or:[shown not]) ifTrue:[^ self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1293
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1294
    (aListLineNr >= firstLineShown) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1295
        (aListLineNr < (firstLineShown + nFullLinesShown)) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1296
            ^ self
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1297
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1298
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1299
    (aListLineNr < nFullLinesShown) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1300
        ^ self scrollToLine:1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1301
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1302
    (nFullLinesShown < 3) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1303
        ^ self scrollToLine:aListLineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1304
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1305
    bott := self numberOfLines - (nFullLinesShown - 1).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1306
    (aListLineNr > bott) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1307
        ^ self scrollToLine:bott
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1308
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1309
    self scrollToLine:(aListLineNr - (nFullLinesShown // 2) + 1)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1310
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1311
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1312
scrollSelectUp
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1313
    "just a template - I do not know anything about selections"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1314
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1315
    ^ self subclassResponsibility
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1316
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1317
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1318
scrollSelectDown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1319
    "just a template - I do not know anything about selections"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1320
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1321
    ^ self subclassResponsibility
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1322
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1323
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1324
startScrollDown:yDistance
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1325
    "setup for auto-scroll down (when button-press-moving below view)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1326
     - timeDelta for scroll is computed from distance"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1327
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1328
    |deltaT mm|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1329
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1330
    mm := yDistance // self verticalIntegerPixelPerMillimeter + 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1331
    deltaT := 0.5 / mm.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1332
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1333
    (deltaT = autoScrollDeltaT) ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1334
        autoScrollDeltaT := deltaT.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1335
        autoScrollBlock isNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1336
            autoScrollBlock := [self scrollSelectDown].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1337
            device addTimedBlock:autoScrollBlock after:deltaT
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1338
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1339
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1340
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1341
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1342
startScrollUp:yDistance
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1343
    "setup for auto-scroll up (when button-press-moving below view)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1344
     - timeDelta for scroll is computed from distance"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1345
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1346
    |deltaT mm|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1347
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1348
    mm := yDistance negated // self verticalIntegerPixelPerMillimeter + 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1349
    deltaT := 0.5 / mm.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1350
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1351
    (deltaT = autoScrollDeltaT) ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1352
        autoScrollDeltaT := deltaT.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1353
        autoScrollBlock isNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1354
            autoScrollBlock := [self scrollSelectUp].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1355
            device addTimedBlock:autoScrollBlock after:deltaT
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1356
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1357
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1358
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1359
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1360
stopAutoScroll
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1361
    "stop any auto-scroll"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1362
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1363
    autoScrollBlock notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1364
        device compressMotionEvents:true.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1365
        device removeTimedBlock:autoScrollBlock.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1366
        autoScrollBlock := nil.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1367
        autoScrollDeltaT := nil
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1368
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1369
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1370
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1371
!ListView methodsFor:'drawing'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1372
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1373
drawVisibleLine:visLineNr col:col with:fg and:bg
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1374
    "draw single character at col index of visible line in fg/bg"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1375
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1376
    |y x lineString characterString|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1377
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1378
    lineString := self visibleAt:visLineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1379
    x := (self xOfCol:col inLine:visLineNr) - leftOffset.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1380
    y := self yOfLine:visLineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1381
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1382
    self paint:bg.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1383
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1384
    (lineString isNil or:[col > lineString size]) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1385
        self fillRectangleX:x y:y width:(font widthOf:' ')
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1386
                                 height:fontHeight.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1387
        self paint:fg
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1388
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1389
        characterString := (lineString at:col) asString.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1390
        self fillRectangleX:x y:y width:(font widthOf:characterString)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1391
                                 height:fontHeight.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1392
        self paint:fg.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1393
        self displayString:characterString x:x y:(y + fontAscent)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1394
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1395
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1396
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1397
drawVisibleLine:visLineNr from:startCol to:endCol with:fg and:bg
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1398
    "draw part of a visible line in fg/bg"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1399
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1400
    |y x lineString len characterString|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1401
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1402
    (endCol >= startCol) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1403
        lineString := self visibleAt:visLineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1404
        x := (self xOfCol:startCol inLine:visLineNr) - leftOffset.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1405
        y := (self yOfLine:visLineNr).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1406
        
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1407
        len := lineString size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1408
        (startCol > len) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1409
            len := endCol - startCol + 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1410
            self paint:bg.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1411
            self fillRectangleX:x y:y 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1412
                          width:(fontWidth * len) 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1413
                         height:fontHeight
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1414
        ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1415
            (endCol > len) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1416
                characterString := String new:endCol.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1417
                characterString replaceFrom:1 to:len with:lineString startingAt:1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1418
                lineString := characterString
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1419
            ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1420
            self paint:bg.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1421
            self fillRectangleX:x y:y width:(font widthOf:lineString from:startCol to:endCol)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1422
                                      height:fontHeight.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1423
            self paint:fg.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1424
            self displayString:lineString from:startCol to:endCol x:x y:(y + fontAscent)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1425
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1426
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1427
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1428
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1429
drawVisibleLine:visLineNr from:startCol with:fg and:bg
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1430
    "draw right part of a visible line from startCol to end of line in fg/bg"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1431
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1432
    |y x lineString index1 index2|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1433
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1434
    (startCol < 1) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1435
        index1 := 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1436
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1437
        index1 := startCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1438
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1439
    y := self yOfLine:visLineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1440
    x := (self xOfCol:index1 inLine:visLineNr) - leftOffset.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1441
    self paint:bg.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1442
    self fillRectangleX:x y:y
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1443
                  width:(width + leftOffset - x)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1444
                 height:fontHeight.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1445
    
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1446
    lineString := self visibleAt:visLineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1447
    lineString notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1448
        index2 := lineString size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1449
        (index2 < index1) ifTrue:[^ self].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1450
        (index1 <= index2) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1451
            self paint:fg.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1452
            self displayString:lineString from:index1 to:index2 x:x y:(y + fontAscent)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1453
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1454
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1455
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1456
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1457
drawFromVisibleLine:startVisLineNr to:endVisLineNr with:fg and:bg
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1458
    "draw a visible line range in fg/bg"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1459
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1460
    |y         "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1461
     x         "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1462
     startLine "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1463
     endLine   "{ Class: SmallInteger }"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1464
     listSize e|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1465
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1466
    y := self yOfLine:startVisLineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1467
    self paint:bg.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1468
    self fillRectangleX:margin y:y
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1469
                  width:(width - (margin * 2))
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1470
                 height:(endVisLineNr - startVisLineNr + 1) * fontHeight.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1471
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1472
    y := y + fontAscent.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1473
    listSize := list size.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1474
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1475
    startLine := startVisLineNr + firstLineShown - 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1476
    endLine := endVisLineNr + firstLineShown - 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1477
    (startLine == 0) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1478
        y := y + fontHeight.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1479
        startLine := startLine + 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1480
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1481
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1482
    (endLine > listSize) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1483
        e := listSize
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1484
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1485
        e := endLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1486
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1487
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1488
    (startLine <= e) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1489
        x := textStartLeft - leftOffset.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1490
        self paint:fg.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1491
        list from:startLine to:e do:[:line |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1492
            line notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1493
                self displayString:line x:x y:y
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1494
            ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1495
            y := y + fontHeight
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1496
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1497
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1498
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1499
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1500
drawVisibleLine:visLineNr with:fg and:bg
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1501
    "draw a visible line in fg/bg"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1502
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1503
    |y line|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1504
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1505
    y := self yOfLine:visLineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1506
    line := self visibleAt:visLineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1507
    self paint:bg.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1508
    self fillRectangleX:margin y:y
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1509
                  width:(width - (margin * 2)) 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1510
                 height:fontHeight.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1511
    line notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1512
        self paint:fg.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1513
        self displayString:line x:(textStartLeft - leftOffset) y:(y + fontAscent)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1514
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1515
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1516
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1517
!ListView methodsFor:'redrawing'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1518
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1519
redrawVisibleLine:visLineNr col:col
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1520
    "redraw single character at col index of visible line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1521
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1522
    shown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1523
        self drawVisibleLine:visLineNr col:col with:fgColor and:bgColor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1524
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1525
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1526
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1527
redrawVisibleLine:visLineNr from:startCol to:endCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1528
    "redraw part of a visible line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1529
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1530
    shown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1531
        self drawVisibleLine:visLineNr from:startCol to:endCol with:fgColor and:bgColor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1532
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1533
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1534
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1535
redrawVisibleLine:visLineNr from:startCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1536
    "redraw right part of a visible line from startCol to end of line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1537
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1538
    shown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1539
        self drawVisibleLine:visLineNr from:startCol with:fgColor and:bgColor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1540
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1541
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1542
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1543
redrawFromVisibleLine:startVisLineNr to:endVisLineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1544
    "redraw a visible line range"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1545
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1546
    shown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1547
        self drawFromVisibleLine:startVisLineNr to:endVisLineNr with:fgColor and:bgColor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1548
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1549
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1550
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1551
redrawVisibleLine:visLineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1552
    "redraw a visible line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1553
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1554
    shown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1555
        self drawVisibleLine:visLineNr with:fgColor and:bgColor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1556
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1557
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1558
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1559
redrawLine:lineNr col:col
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1560
    "redraw a single character"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1561
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1562
    |visibleLine|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1563
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1564
    visibleLine := self listLineToVisibleLine:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1565
    visibleLine notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1566
        self redrawVisibleLine:visibleLine col:col
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1567
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1568
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1569
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1570
redrawLine:lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1571
    "redraw a list line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1572
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1573
    |visibleLine|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1574
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1575
    visibleLine := self listLineToVisibleLine:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1576
    visibleLine notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1577
        self redrawVisibleLine:visibleLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1578
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1579
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1580
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1581
redrawLine:lineNr from:startCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1582
    "redraw a list line from startCol to end of line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1583
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1584
    |visibleLine|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1585
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1586
    visibleLine := self listLineToVisibleLine:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1587
    visibleLine notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1588
        self redrawVisibleLine:visibleLine from:startCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1589
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1590
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1591
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1592
redrawLine:lineNr from:startCol to:endCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1593
    "redraw a list line from startCol to endCol"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1594
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1595
    |visibleLine|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1596
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1597
    visibleLine := self listLineToVisibleLine:lineNr.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1598
    visibleLine notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1599
        self redrawVisibleLine:visibleLine from:startCol to:endCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1600
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1601
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1602
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1603
redrawFromLine:lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1604
    "redraw starting at linrNr"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1605
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1606
    |visibleLine first|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1607
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1608
    shown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1609
        "if first line to redraw is above 1st visible line,
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1610
         start redraw at 1st visible line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1611
        (lineNr < firstLineShown) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1612
            first := firstLineShown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1613
        ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1614
            first := lineNr
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1615
        ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1616
        visibleLine := self listLineToVisibleLine:first.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1617
        visibleLine notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1618
            self redrawFromVisibleLine:visibleLine to:nLinesShown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1619
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1620
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1621
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1622
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1623
redrawFromLine:start to:end
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1624
    "redraw lines from start to end"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1625
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1626
    |visibleFirst visibleLast first last lastLineShown|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1627
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1628
    shown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1629
        lastLineShown := firstLineShown + nLinesShown - 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1630
        (start <= lastLineShown) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1631
            (end >= firstLineShown) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1632
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1633
                "if first line to redraw is above 1st visible line,
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1634
                 start redraw at 1st visible line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1635
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1636
                (start < firstLineShown) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1637
                    first := firstLineShown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1638
                ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1639
                    first := start
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1640
                ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1641
                (end > lastLineShown) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1642
                    last := lastLineShown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1643
                ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1644
                    last := end
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1645
                ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1646
                visibleFirst := self listLineToVisibleLine:first.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1647
                visibleLast := self listLineToVisibleLine:last.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1648
                self redrawFromVisibleLine:visibleFirst to:visibleLast
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1649
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1650
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1651
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1652
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1653
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1654
redraw
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1655
    "redraw complete view"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1656
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1657
    shown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1658
        self redrawFromVisibleLine:1 to:nLinesShown
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1659
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1660
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1661
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1662
!ListView methodsFor:'event processing'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1663
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1664
sizeChanged:how
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1665
    "size changed - move origin up if possible"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1666
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1667
    |listSize newOrigin|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1668
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1669
    self computeNumberOfLinesShown.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1670
    innerWidth := width - textStartLeft - margin.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1671
    shown ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1672
        list notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1673
            listSize := self numberOfLines.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1674
            ((firstLineShown + nFullLinesShown) > listSize) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1675
                newOrigin := listSize - nFullLinesShown + 1.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1676
                newOrigin < 1 ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1677
                    newOrigin := 1
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1678
                ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1679
                self scrollToLine: newOrigin
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1680
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1681
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1682
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1683
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1684
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1685
redrawX:x y:y width:w height:h
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1686
    "a region must be redrawn"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1687
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1688
    |startLine stopLine startCol endCol|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1689
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1690
    startLine := self visibleLineOfY:y.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1691
    stopLine := self visibleLineOfY:(y + h).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1692
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1693
    "if text-margin is affected"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1694
    x < textStartLeft ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1695
        self paint:bgColor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1696
        self fillRectangleX:margin y:margin width:(textStartLeft - margin)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1697
                                           height:(height - margin - margin)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1698
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1699
    y < textStartTop ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1700
        self paint:bgColor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1701
        self fillRectangleX:margin y:margin width:(width - margin - margin)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1702
                                           height:(textStartTop - margin)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1703
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1704
    (w > (width // 4 * 3)) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1705
        "if area is big enough redraw whole lines"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1706
        self redrawFromVisibleLine:startLine to:stopLine
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1707
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1708
        fontIsFixedWidth ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1709
            "start/end col has to be computed for each line"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1710
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1711
            startLine to:stopLine do:[:i |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1712
                startCol := self colOfX:x inVisibleLine:i.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1713
                endCol := self colOfX:(x + w) inVisibleLine:i.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1714
                self redrawVisibleLine:i from:startCol to:endCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1715
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1716
        ] ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1717
            "start/end col is the same for all lines"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1718
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1719
            startCol := self colOfX:x inVisibleLine:startLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1720
            endCol := self colOfX:(x + w) inVisibleLine:startLine.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1721
            startLine to:stopLine do:[:i |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1722
                  self redrawVisibleLine:i from:startCol to:endCol
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1723
            ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1724
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1725
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1726
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1727
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1728
keyPress:key x:x y:y
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1729
    "a key was pressed - handle page-keys here"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1730
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1731
    (key == #Prior)    ifTrue: [^ self pageUp].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1732
    (key == #Next)     ifTrue: [^ self pageDown].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1733
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1734
    (key == #Ctrlb) ifTrue:[^ self pageUp].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1735
    (key == #Ctrlf) ifTrue:[^ self pageDown].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1736
    (key == #Ctrld) ifTrue:[^ self halfPageDown].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1737
    (key == #Ctrlu) ifTrue:[^ self halfPageUp].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1738
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1739
    super keyPress:key x:x y:y
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
  1740
! !