ProgressIndicator.st
author claus
Wed, 03 May 1995 03:11:23 +0200
changeset 50 61bc3c275f6b
child 62 378b60ba1200
permissions -rw-r--r--
.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50
claus
parents:
diff changeset
     1
'From Smalltalk/X, Version:2.10.5 on 30-apr-1995 at 8:48:16 am'!
claus
parents:
diff changeset
     2
claus
parents:
diff changeset
     3
View subclass:#ProgressIndicator
claus
parents:
diff changeset
     4
	 instanceVariableNames:'percentage showPercentage fgColor'
claus
parents:
diff changeset
     5
	 classVariableNames:''
claus
parents:
diff changeset
     6
	 poolDictionaries:''
claus
parents:
diff changeset
     7
	 category:'Views-Misc'
claus
parents:
diff changeset
     8
!
claus
parents:
diff changeset
     9
claus
parents:
diff changeset
    10
!ProgressIndicator class methodsFor:'documentation'!
claus
parents:
diff changeset
    11
claus
parents:
diff changeset
    12
version
claus
parents:
diff changeset
    13
"
claus
parents:
diff changeset
    14
$Header: /cvs/stx/stx/libwidg2/ProgressIndicator.st,v 1.1 1995-05-03 01:11:23 claus Exp $
claus
parents:
diff changeset
    15
"
claus
parents:
diff changeset
    16
!
claus
parents:
diff changeset
    17
claus
parents:
diff changeset
    18
documentation
claus
parents:
diff changeset
    19
"
claus
parents:
diff changeset
    20
    a view showing a rectangle filled according the percentage value.
claus
parents:
diff changeset
    21
    Can be used as a progress indicator a la MSwindows.
claus
parents:
diff changeset
    22
"
claus
parents:
diff changeset
    23
!
claus
parents:
diff changeset
    24
claus
parents:
diff changeset
    25
examples
claus
parents:
diff changeset
    26
"
claus
parents:
diff changeset
    27
    typical progress indicator:
claus
parents:
diff changeset
    28
claus
parents:
diff changeset
    29
      |top p h|
claus
parents:
diff changeset
    30
claus
parents:
diff changeset
    31
      top := StandardSystemView new.
claus
parents:
diff changeset
    32
      top extent:300@100.
claus
parents:
diff changeset
    33
      top label:'Progress'.
claus
parents:
diff changeset
    34
      p := ProgressIndicator in:top.
claus
parents:
diff changeset
    35
      p origin:(0.0@0.5) corner:(1.0@0.5).
claus
parents:
diff changeset
    36
      p level:-1.
claus
parents:
diff changeset
    37
      h := p preferedExtent y.
claus
parents:
diff changeset
    38
      p topInset:(h // 2) negated; 
claus
parents:
diff changeset
    39
	bottomInset:(h // 2) negated;
claus
parents:
diff changeset
    40
	leftInset:5;
claus
parents:
diff changeset
    41
	rightInset:5.
claus
parents:
diff changeset
    42
      top open.
claus
parents:
diff changeset
    43
claus
parents:
diff changeset
    44
      [
claus
parents:
diff changeset
    45
	  1 to:100 do:[:val |
claus
parents:
diff changeset
    46
	      (Delay forSeconds:0.05) wait.
claus
parents:
diff changeset
    47
	      p percentage:val 
claus
parents:
diff changeset
    48
	  ]
claus
parents:
diff changeset
    49
      ] fork
claus
parents:
diff changeset
    50
claus
parents:
diff changeset
    51
claus
parents:
diff changeset
    52
    changing colors, turning percentage display off:
claus
parents:
diff changeset
    53
claus
parents:
diff changeset
    54
      |top p h|
claus
parents:
diff changeset
    55
claus
parents:
diff changeset
    56
      top := StandardSystemView new.
claus
parents:
diff changeset
    57
      top extent:300@100.
claus
parents:
diff changeset
    58
      top label:'Progress'.
claus
parents:
diff changeset
    59
      p := ProgressIndicator in:top.
claus
parents:
diff changeset
    60
      p origin:(0.0@0.5) corner:(1.0@0.5).
claus
parents:
diff changeset
    61
      p level:-1.
claus
parents:
diff changeset
    62
      p showPercentage:false.
claus
parents:
diff changeset
    63
      p foregroundColor:(Color red).
claus
parents:
diff changeset
    64
      h := 10.
claus
parents:
diff changeset
    65
      p topInset:(h // 2) negated; 
claus
parents:
diff changeset
    66
	bottomInset:(h // 2) negated;
claus
parents:
diff changeset
    67
	leftInset:5;
claus
parents:
diff changeset
    68
	rightInset:5.
claus
parents:
diff changeset
    69
      top open.
claus
parents:
diff changeset
    70
      [
claus
parents:
diff changeset
    71
	  1 to:100 do:[:val |
claus
parents:
diff changeset
    72
	      (Delay forSeconds:0.05) wait.
claus
parents:
diff changeset
    73
	      p percentage:val 
claus
parents:
diff changeset
    74
	  ]
claus
parents:
diff changeset
    75
      ] fork
claus
parents:
diff changeset
    76
claus
parents:
diff changeset
    77
    with border (2D look):
claus
parents:
diff changeset
    78
claus
parents:
diff changeset
    79
      |top p h|
claus
parents:
diff changeset
    80
claus
parents:
diff changeset
    81
      top := StandardSystemView new.
claus
parents:
diff changeset
    82
      top extent:300@100.
claus
parents:
diff changeset
    83
      top label:'Progress'.
claus
parents:
diff changeset
    84
      p := ProgressIndicator in:top.
claus
parents:
diff changeset
    85
      p origin:(0.0@0.5) corner:(1.0@0.5).
claus
parents:
diff changeset
    86
      p borderWidth:1.
claus
parents:
diff changeset
    87
      h := p preferedExtent y.
claus
parents:
diff changeset
    88
      p topInset:(h // 2) negated; 
claus
parents:
diff changeset
    89
	bottomInset:(h // 2) negated;
claus
parents:
diff changeset
    90
	leftInset:5;
claus
parents:
diff changeset
    91
	rightInset:5.
claus
parents:
diff changeset
    92
      top open.
claus
parents:
diff changeset
    93
      [
claus
parents:
diff changeset
    94
	  1 to:100 do:[:val |
claus
parents:
diff changeset
    95
	      (Delay forSeconds:0.05) wait.
claus
parents:
diff changeset
    96
	      p percentage:val 
claus
parents:
diff changeset
    97
	  ]
claus
parents:
diff changeset
    98
      ] fork
claus
parents:
diff changeset
    99
claus
parents:
diff changeset
   100
claus
parents:
diff changeset
   101
    getting progress from a model:
claus
parents:
diff changeset
   102
claus
parents:
diff changeset
   103
      |model top p h|
claus
parents:
diff changeset
   104
claus
parents:
diff changeset
   105
      model := 0 asValue.
claus
parents:
diff changeset
   106
claus
parents:
diff changeset
   107
      top := StandardSystemView new.
claus
parents:
diff changeset
   108
      top extent:300@100.
claus
parents:
diff changeset
   109
      top label:'Progress'.
claus
parents:
diff changeset
   110
      p := ProgressIndicator in:top.
claus
parents:
diff changeset
   111
      p model:model.
claus
parents:
diff changeset
   112
      p origin:(0.0@0.5) corner:(1.0@0.5).
claus
parents:
diff changeset
   113
      p level:-1.
claus
parents:
diff changeset
   114
      h := p preferedExtent y.
claus
parents:
diff changeset
   115
      p topInset:(h // 2) negated; 
claus
parents:
diff changeset
   116
	bottomInset:(h // 2) negated;
claus
parents:
diff changeset
   117
	leftInset:5;
claus
parents:
diff changeset
   118
	rightInset:5.
claus
parents:
diff changeset
   119
      top open.
claus
parents:
diff changeset
   120
claus
parents:
diff changeset
   121
      [
claus
parents:
diff changeset
   122
	  1 to:100 do:[:val |
claus
parents:
diff changeset
   123
	      (Delay forSeconds:0.05) wait.
claus
parents:
diff changeset
   124
	      model value:val 
claus
parents:
diff changeset
   125
	  ]
claus
parents:
diff changeset
   126
      ] fork
claus
parents:
diff changeset
   127
claus
parents:
diff changeset
   128
    concrete example:
claus
parents:
diff changeset
   129
      search all files in the source directory for a string
claus
parents:
diff changeset
   130
      using grep. Show progress while doing so.
claus
parents:
diff changeset
   131
claus
parents:
diff changeset
   132
      |top p h names done|
claus
parents:
diff changeset
   133
claus
parents:
diff changeset
   134
      top := StandardSystemView new.
claus
parents:
diff changeset
   135
      top extent:300@100.
claus
parents:
diff changeset
   136
      top label:'Searching ...'.
claus
parents:
diff changeset
   137
      p := ProgressIndicator in:top.
claus
parents:
diff changeset
   138
      p origin:(0.0@0.5) corner:(1.0@0.5).
claus
parents:
diff changeset
   139
      p level:-1.
claus
parents:
diff changeset
   140
      h := p preferedExtent y.
claus
parents:
diff changeset
   141
      p topInset:(h // 2) negated; 
claus
parents:
diff changeset
   142
	bottomInset:(h // 2) negated;
claus
parents:
diff changeset
   143
	leftInset:5;
claus
parents:
diff changeset
   144
	rightInset:5.
claus
parents:
diff changeset
   145
      top openWithPriority:(Processor activePriority + 1).
claus
parents:
diff changeset
   146
claus
parents:
diff changeset
   147
      names := 'source' asFilename directoryContents.
claus
parents:
diff changeset
   148
      done := 0.
claus
parents:
diff changeset
   149
      names do:[:aName |
claus
parents:
diff changeset
   150
	|stream line|
claus
parents:
diff changeset
   151
claus
parents:
diff changeset
   152
	p percentage:(done / names size * 100).
claus
parents:
diff changeset
   153
	stream := ('source/' , aName) asFilename readStream.
claus
parents:
diff changeset
   154
	[stream atEnd] whileFalse:[
claus
parents:
diff changeset
   155
	    line := stream nextLine.
claus
parents:
diff changeset
   156
	    (line findString:'subclass:') ~~ 0 ifTrue:[
claus
parents:
diff changeset
   157
		Transcript showCr:line
claus
parents:
diff changeset
   158
	    ].
claus
parents:
diff changeset
   159
	].
claus
parents:
diff changeset
   160
	stream close.
claus
parents:
diff changeset
   161
	done := done + 1
claus
parents:
diff changeset
   162
      ].
claus
parents:
diff changeset
   163
claus
parents:
diff changeset
   164
      top destroy
claus
parents:
diff changeset
   165
"
claus
parents:
diff changeset
   166
! !
claus
parents:
diff changeset
   167
claus
parents:
diff changeset
   168
!ProgressIndicator methodsFor:'drawing'!
claus
parents:
diff changeset
   169
claus
parents:
diff changeset
   170
redraw
claus
parents:
diff changeset
   171
    |s rx sx sy sw m w h|
claus
parents:
diff changeset
   172
claus
parents:
diff changeset
   173
    m := margin + 1.
claus
parents:
diff changeset
   174
    w := width - (m*2).
claus
parents:
diff changeset
   175
    h := height - (m*2).
claus
parents:
diff changeset
   176
claus
parents:
diff changeset
   177
    s := percentage printString , ' %'.
claus
parents:
diff changeset
   178
    sw := font widthOf:s.
claus
parents:
diff changeset
   179
    sx := (width - sw) // 2.
claus
parents:
diff changeset
   180
    sy := height // 2 + font descent + 2.
claus
parents:
diff changeset
   181
claus
parents:
diff changeset
   182
    rx := (w * percentage / 100) rounded.
claus
parents:
diff changeset
   183
claus
parents:
diff changeset
   184
    self paint:Color white.
claus
parents:
diff changeset
   185
    self fillRectangleX:m y:m width:w height:h.
claus
parents:
diff changeset
   186
claus
parents:
diff changeset
   187
    showPercentage ifTrue:[
claus
parents:
diff changeset
   188
	rx <= (sx+sw) ifTrue:[
claus
parents:
diff changeset
   189
	    self paint:Color black.
claus
parents:
diff changeset
   190
	    self displayString:s x:sx y:sy.
claus
parents:
diff changeset
   191
	]
claus
parents:
diff changeset
   192
    ].
claus
parents:
diff changeset
   193
claus
parents:
diff changeset
   194
    self paint:fgColor.
claus
parents:
diff changeset
   195
    self fillRectangleX:m y:m width:rx height:h.
claus
parents:
diff changeset
   196
claus
parents:
diff changeset
   197
    showPercentage ifTrue:[
claus
parents:
diff changeset
   198
	rx >= sx ifTrue:[
claus
parents:
diff changeset
   199
	    self clipRect:(m@m corner:rx+1 @ h).
claus
parents:
diff changeset
   200
	    self paint:Color white.
claus
parents:
diff changeset
   201
	    self displayString:s x:sx y:sy.
claus
parents:
diff changeset
   202
	    self clipRect:nil
claus
parents:
diff changeset
   203
	]
claus
parents:
diff changeset
   204
    ]
claus
parents:
diff changeset
   205
! !
claus
parents:
diff changeset
   206
claus
parents:
diff changeset
   207
!ProgressIndicator methodsFor:'initialization'!
claus
parents:
diff changeset
   208
claus
parents:
diff changeset
   209
initialize
claus
parents:
diff changeset
   210
    super initialize.
claus
parents:
diff changeset
   211
    viewBackground := StyleSheet colorAt:'progressIndicatorViewBackground' default:Color white.
claus
parents:
diff changeset
   212
    fgColor := StyleSheet colorAt:'progressIndicatorForegroundColor' default:Color blue.
claus
parents:
diff changeset
   213
    percentage := 0.
claus
parents:
diff changeset
   214
    showPercentage := true.
claus
parents:
diff changeset
   215
! !
claus
parents:
diff changeset
   216
claus
parents:
diff changeset
   217
!ProgressIndicator methodsFor:'accessing'!
claus
parents:
diff changeset
   218
claus
parents:
diff changeset
   219
percentage:aNumber
claus
parents:
diff changeset
   220
    |newPercentage|
claus
parents:
diff changeset
   221
claus
parents:
diff changeset
   222
    newPercentage := ((aNumber max:0) min:100) rounded.
claus
parents:
diff changeset
   223
    newPercentage ~~ percentage ifTrue:[
claus
parents:
diff changeset
   224
	percentage := newPercentage.
claus
parents:
diff changeset
   225
	shown ifTrue:[self redraw].
claus
parents:
diff changeset
   226
    ]
claus
parents:
diff changeset
   227
!
claus
parents:
diff changeset
   228
claus
parents:
diff changeset
   229
showPercentage:aBoolean
claus
parents:
diff changeset
   230
    showPercentage := aBoolean
claus
parents:
diff changeset
   231
!
claus
parents:
diff changeset
   232
claus
parents:
diff changeset
   233
foregroundColor:aColor 
claus
parents:
diff changeset
   234
    fgColor := aColor
claus
parents:
diff changeset
   235
! !
claus
parents:
diff changeset
   236
claus
parents:
diff changeset
   237
!ProgressIndicator methodsFor:'queries'!
claus
parents:
diff changeset
   238
claus
parents:
diff changeset
   239
preferedExtent
claus
parents:
diff changeset
   240
    ^ 100 @ (font height + font descent + ((margin + 1) * 2))
claus
parents:
diff changeset
   241
! !
claus
parents:
diff changeset
   242
claus
parents:
diff changeset
   243
!ProgressIndicator methodsFor:'change & update'!
claus
parents:
diff changeset
   244
claus
parents:
diff changeset
   245
update:aspect with:aParameter from:changedObject
claus
parents:
diff changeset
   246
    (aspect == aspectMsg
claus
parents:
diff changeset
   247
    and:[changedObject == model]) ifTrue:[
claus
parents:
diff changeset
   248
	self percentage:(model perform:aspectMsg).
claus
parents:
diff changeset
   249
	^ self
claus
parents:
diff changeset
   250
    ].
claus
parents:
diff changeset
   251
    ^ super update:aspect with:aParameter from:changedObject
claus
parents:
diff changeset
   252
! !
claus
parents:
diff changeset
   253