diff -r 0df6bda4b353 -r 76291d984db9 PrinterContext.st --- a/PrinterContext.st Tue Oct 10 17:55:30 2006 +0200 +++ b/PrinterContext.st Tue Oct 10 18:22:07 2006 +0200 @@ -394,61 +394,63 @@ !PrinterContext methodsFor:'abort handling'! abortPrintJob - "Abort the current print job." - + "Abort the current print job." + abort := true. jobid := nil. "Modified: / 02-08-2006 / 15:40:26 / fm" + "Modified: / 10-10-2006 / 18:13:45 / cg" ! aborted - "Answer whether the user aborted from PrintAbortDialog." - ^abort + "Answer whether the user aborted from PrintAbortDialog." + + ^ abort "Created: / 27-07-2006 / 10:20:10 / fm" + "Modified: / 10-10-2006 / 18:13:50 / cg" ! ! !PrinterContext methodsFor:'accessing'! getCharHeight - "Private - answer the height of the font selected in the receiver's - device context." + "Private - answer the height of the font selected in the receiver's + device context." + + |textMetrics| - | textMetrics | textMetrics := Win32OperatingSystem::TextMetricsStructure new. - ( OperatingSystem - getTextMetrics: gcId "deviceContext" - lpMetrics: textMetrics "asParameter" ) - ifFalse: [ ^self error ]. - ^textMetrics tmHeight + textMetrics tmExternalLeading + (OperatingSystem getTextMetrics:gcId lpMetrics:textMetrics) ifFalse:[ ^ self error ]. + ^ textMetrics tmHeight + textMetrics tmExternalLeading "Created: / 02-08-2006 / 17:47:20 / fm" "Modified: / 03-08-2006 / 10:09:01 / fm" + "Modified: / 10-10-2006 / 18:15:17 / cg" ! -name - "Answer the receiver's name from the current printerInfo." - - ^self printerInfo printerName +name + "Answer the receiver's name from the current printerInfo." + + ^ self printerInfo printerName "Modified: / 02-08-2006 / 16:55:03 / fm" + "Modified: / 10-10-2006 / 18:15:33 / cg" ! -name: aName - "Set the receiver's printer name to aName." +name:aName + "Set the receiver's printer name to aName." + + self printerInfo:(self class getPrinterInformation:aName) - self printerInfo: (self class getPrinterInformation: aName) - - "Created: / 27-07-2006 / 10:33:04 / fm" - "Modified: / 02-08-2006 / 16:54:46 / fm" + "Modified: / 10-10-2006 / 18:15:36 / cg" ! numberOfColorBitsPerPixel - ^ OperatingSystem getDeviceCaps:gcId index:12 "Bitspixel" "Created: / 03-08-2006 / 09:58:18 / fm" + "Modified: / 10-10-2006 / 18:15:40 / cg" ! pixelsPerInchOfScreenHeight @@ -464,77 +466,65 @@ ! printerInfo - "Answer the receiver's name from the current printerInfo." - - ^printerInfo + "Answer the receiver's name from the current printerInfo." + + ^ printerInfo "Created: / 02-08-2006 / 16:55:17 / fm" + "Modified: / 10-10-2006 / 18:18:34 / cg" ! -printerInfo: aPrinterInfo - "Sets the receiver's printerInfo." - +printerInfo:aPrinterInfo + "Sets the receiver's printerInfo." + printerInfo := aPrinterInfo "Created: / 02-08-2006 / 16:55:34 / fm" "Modified: / 03-08-2006 / 13:11:19 / fm" + "Modified: / 10-10-2006 / 18:18:37 / cg" ! -printerInfoWithName: aName - "Set the receiver's printer name to aName." - - self printerInfo: (self class getPrinterInformation: aName). - ^self +printerInfoWithName:aName + "Set the receiver's printer name to aName." + + self printerInfo:(self class getPrinterInformation:aName). + ^ self "Created: / 02-08-2006 / 16:55:52 / fm" + "Modified: / 10-10-2006 / 18:18:41 / cg" ! printerUserFriendlyName - "Answer the receiver's name from the current printerInfo." - - ^self printerInfo userFriendlyName + "Answer the receiver's name from the current printerInfo." + + ^ self printerInfo userFriendlyName "Created: / 03-08-2006 / 12:55:57 / fm" + "Modified: / 10-10-2006 / 18:18:55 / cg" ! ! !PrinterContext methodsFor:'initialization & release'! buildPrinter - "Private - create all the operating system resources needed." - self - createDC; + "Private - create all the operating system resources needed." + + self + createDC; initExtent "Created: / 27-07-2006 / 10:20:36 / fm" "Modified: / 01-08-2006 / 15:57:49 / fm" + "Modified: / 10-10-2006 / 18:14:04 / cg" ! createDC - "Private - Create a device context for the receiver" - - gcId := printerInfo createDC - -"/ | printerInfo driverNm mediumNm deviceNm hPrinter driverData| -"/ printerInfo := self class getPrinterInformation: self name. -"/ driverNm := printerInfo driverName. -"/ mediumNm := printerInfo medium. -"/ deviceNm := printerInfo printerName. -"/ -"/ hPrinter := OperatingSystem openPrinter:deviceNm. -"/ driverData := OperatingSystem getDocumentProperties:nil hPrinter:hPrinter pDeviceName:deviceNm. -"/ Win32OperatingSystem primClosePrinter:hPrinter. -"/ -"/ "deviceContext" gcId := OperatingSystem createPrinterDC:driverNm device:deviceNm output:mediumNm initData:driverData. - -"/ ( deviceContext := GDILibrary -"/ createDC: driverName asParameter -"/ deviceName: deviceName asParameter -"/ output: printerPort asParameter -"/ initData: nil ) = 0 -"/ ifTrue: [ ^self osError ]. + "Private - Create a device context for the receiver" + + gcId := printerInfo createDC "Created: / 27-07-2006 / 10:21:05 / fm" "Modified: / 02-08-2006 / 17:30:47 / fm" + "Modified: / 10-10-2006 / 18:14:28 / cg" ! initExtent @@ -548,9 +538,9 @@ ! printerHeightArea - ^ (OperatingSystem getDeviceCaps:gcId index:10 "Vertres") + ^ (OperatingSystem getDeviceCaps:gcId index:10) - "Created: / 01-08-2006 / 16:14:49 / fm" + "Modified: / 10-10-2006 / 18:18:31 / cg" ! printerWidthArea @@ -561,43 +551,58 @@ !PrinterContext methodsFor:'printing'! -print: aString - font: aFont - title: aTitle - wordWrap: wordWrapBoolean - marginsRect: aMarginsRect - "Answer the receiver. Output the receiver string to - the printer using aFont. A Print abort dialog box will be opened - with aTitle. If collateBoolean is true, collate output, otherwise - do not. Print copiesInteger copies of the specified string. If - wordWrapBoolean is true, word wrap the lines, otherwise do not. - Left, top, right & bottom margins are specified in inches in - aMarginsRect." - | lines linesPerPage totalPage marginsRect firstPage charHeight abortDialog | +print:aString font:aFont title:aTitle wordWrap:wordWrapBoolean marginsRect:aMarginsRect + "Answer the receiver. Output the receiver string to + the printer using aFont. A Print abort dialog box will be opened + with aTitle. If collateBoolean is true, collate output, otherwise + do not. Print copiesInteger copies of the specified string. If + wordWrapBoolean is true, word wrap the lines, otherwise do not. + Left, top, right & bottom margins are specified in inches in + aMarginsRect." + + |lines linesPerPage totalPage marginsRect firstPage charHeight abortDialog| - jobid isNil - ifTrue: [ self startPrintJob: aTitle ]. - abortDialog := PrintAbortDialog new open: aTitle printer: self. - self font: aFont. - marginsRect := self marginsRectangleFor: aMarginsRect. - lines := self asArrayOfStringLines: aString in: marginsRect wordWrap: wordWrapBoolean. - charHeight := self getCharHeight. - linesPerPage := marginsRect bottom - marginsRect top // charHeight. - totalPage := lines size + linesPerPage - 1 // linesPerPage. + jobid isNil ifTrue:[ + self startPrintJob:aTitle + ]. + abortDialog := PrintAbortDialog new open:aTitle printer:self. + self font:aFont. + marginsRect := self marginsRectangleFor:aMarginsRect. + lines := self + asArrayOfStringLines:aString + in:marginsRect + wordWrap:wordWrapBoolean. + charHeight := self getCharHeight. + linesPerPage := (marginsRect bottom - marginsRect top) // charHeight. + totalPage := (lines size + linesPerPage - 1) // linesPerPage. firstPage := true. - + "/ collateBoolean "/ ifTrue: [ "/ copiesInteger timesRepeat: [ - 1 to: totalPage do: [ :page | - abort ifTrue: [^self]. - firstPage ifFalse: [ self formFeed ]. - abortDialog updatePrintingPageInfo: 'Page ', page printString, '/', totalPage printString. + + 1 to:totalPage do:[:page | + abort ifTrue:[ ^ self ]. + firstPage ifFalse:[ + self formFeed + ]. + abortDialog + updatePrintingPageInfo:(self class classResources + string:'Page %1/%2' + with:page printString + with:totalPage printString). + "/ self device font: printerFont. - self font: aFont. - self printPage: page in: marginsRect lines: lines linesPerPage: linesPerPage. - firstPage := false ]. - + + self font:aFont. + self + printPage:page + in:marginsRect + lines:lines + linesPerPage:linesPerPage. + firstPage := false + ]. + "/ ] "/ ] ifFalse: [ "/ 1 to: totalPage do: [ :page | @@ -610,205 +615,208 @@ "/ ] "/ ] "/ ]. + + jobid notNil ifTrue:[ + self endPrintJob. + abortDialog close. + ]. - jobid notNil - ifTrue: [ self endPrintJob. - abortDialog close.]. - -"/ abort ifFalse: [ abortDialog close ] + "/ abort ifFalse: [ abortDialog close ] "Created: / 03-08-2006 / 16:13:33 / fm" "Modified: / 04-08-2006 / 13:40:02 / fm" + "Modified: / 10-10-2006 / 18:16:54 / cg" ! -print: aString - pageHeader: aString2 - font: aFont - title: aTitle - wordWrap: wordWrapBoolean - marginsRect: aMarginsRect - - "Private - Answer the receiver. Output the receiver string to - the printer using aFont. A Print abort dialog box will be opened - with aTitle. If collateBoolean is true, collate output, otherwise - do not. Print copiesInteger copies of the specified string. If - wordWrapBoolean is true, word wrap the lines, otherwise do not. - Left, top, right & bottom margins are specified in inches in - aMarginsRect. - Mg: Erweitert um pageHeader" - "Changed by K3/EES5-Mg, 08.01.96" +print:aString pageHeader:aString2 font:aFont title:aTitle wordWrap:wordWrapBoolean marginsRect:aMarginsRect + "Private - Answer the receiver. Output the receiver string to + the printer using aFont. A Print abort dialog box will be opened + with aTitle. If collateBoolean is true, collate output, otherwise + do not. Print copiesInteger copies of the specified string. If + wordWrapBoolean is true, word wrap the lines, otherwise do not. + Left, top, right & bottom margins are specified in inches in + aMarginsRect." + + |lines linesPerPage totalPage marginsRect firstPage charHeight printerFont headerLines| - | lines linesPerPage totalPage marginsRect firstPage charHeight printerFont headerLines| - - self font: aFont. + self font:aFont. charHeight := self getCharHeight. - marginsRect := self marginsRectangleFor: aMarginsRect. - lines := self asArrayOfStringLines: aString in: marginsRect wordWrap: wordWrapBoolean. - headerLines := self asArrayOfStringLines: aString2 in: marginsRect wordWrap: wordWrapBoolean. - linesPerPage := marginsRect bottom - marginsRect top // charHeight. - - linesPerPage > headerLines size - ifFalse: - [Dialog information: 'Der Dokumentenkopf ist zu groß; wird ignoriert!!'. - headerLines := #(). - ] - ifTrue: [linesPerPage := linesPerPage - headerLines size]. - totalPage := lines size + linesPerPage - 1 // linesPerPage. + marginsRect := self marginsRectangleFor:aMarginsRect. + lines := self + asArrayOfStringLines:aString + in:marginsRect + wordWrap:wordWrapBoolean. + headerLines := self + asArrayOfStringLines:aString2 + in:marginsRect + wordWrap:wordWrapBoolean. + linesPerPage := (marginsRect bottom - marginsRect top) // charHeight. + linesPerPage > headerLines size ifFalse:[ + Dialog information:(self class classResources + string:'The header is too large - ignored!!'). + headerLines := #(). + ] ifTrue:[ + linesPerPage := linesPerPage - headerLines size + ]. + totalPage := (lines size + linesPerPage - 1) // linesPerPage. firstPage := true. - + "/ collateBoolean "/ ifTrue: [ "/ copiesInteger timesRepeat: [ - - 1 to: totalPage do: [ :page | - abort ifTrue: [ ^self]. - firstPage ifFalse: [ self formFeed ]. - self font: printerFont. - self printPage: page in: marginsRect lines: lines headerLines: headerLines linesPerPage: linesPerPage. - firstPage := false - ] + + 1 to:totalPage do:[:page | + abort ifTrue:[ ^ self ]. + firstPage ifFalse:[ + self formFeed + ]. + self font:printerFont. + self + printPage:page + in:marginsRect + lines:lines + headerLines:headerLines + linesPerPage:linesPerPage. + firstPage := false + ] -"/ ] -"/ ] ifFalse: [ -"/ 1 to: totalPage do: [ :page | -"/ copiesInteger timesRepeat: [ -"/ abort ifTrue: [ ^self endPrintJob ]. -"/ firstPage ifFalse: [ self formFeed ]. -"/ self device font: printerFont. -"/ self printPage: page in: marginsRect lines: lines headerLines: headerLines linesPerPage: linesPerPage. -"/ firstPage := false -"/ ] -"/ ] -"/ ]. + "/ ] + "/ ] ifFalse: [ + "/ 1 to: totalPage do: [ :page | + "/ copiesInteger timesRepeat: [ + "/ abort ifTrue: [ ^self endPrintJob ]. + "/ firstPage ifFalse: [ self formFeed ]. + "/ self device font: printerFont. + "/ self printPage: page in: marginsRect lines: lines headerLines: headerLines linesPerPage: linesPerPage. + "/ firstPage := false + "/ ] + "/ ] + "/ ]. "Created: / 03-08-2006 / 16:14:10 / fm" + "Modified: / 10-10-2006 / 18:18:03 / cg" ! ! !PrinterContext methodsFor:'printing process'! endPage - "Informs device that we are finished writing to a page." - ( OperatingSystem endPage: gcId ) > 0 - ifFalse: [ self error ] + "Informs device that we are finished writing to a page." + + (OperatingSystem endPage:gcId) > 0 ifFalse:[ + self error + ] "Created: / 27-07-2006 / 18:20:48 / fm" "Modified: / 01-08-2006 / 16:01:34 / fm" + "Modified: / 10-10-2006 / 18:14:44 / cg" ! endPrintJob + "End the print job. Everything drawn between startPrintJob + and endPrintJob will become one entry in the print queue." + + |result| - "End the print job. Everything drawn between startPrintJob - and endPrintJob will become one entry in the print queue." - "Changed by K3EES5-Mg, 19.09.97" - - | result | self endPage. - result := OperatingSystem endDoc: gcId "deviceContext". - "graphicsTool" device close "deleteDC". - "deviceContext" gcId := nil. + result := OperatingSystem endDoc:gcId. + device close. + gcId := nil. jobid := nil. - result >= 0 "> geändert in >=: Mg 22.6.95" - ifFalse: [ ^self error "osError" ] + result >= 0 ifFalse:[ + ^ self error + ] "Created: / 27-07-2006 / 18:21:04 / fm" "Modified: / 01-08-2006 / 16:01:38 / fm" + "Modified: / 10-10-2006 / 18:15:02 / cg" ! formFeed - "Send a form feed to the printer." + "Send a form feed to the printer." + self endPage; startPage "Created: / 27-07-2006 / 18:25:40 / fm" + "Modified: / 10-10-2006 / 18:15:07 / cg" ! startPage - "Starts a page." - ( OperatingSystem startPage: gcId ) > 0 - ifFalse: [ ^self error "osError" ]. + "Starts a page." + + (OperatingSystem startPage:gcId) > 0 ifFalse:[ + ^ self error + ]. "Created: / 27-07-2006 / 18:25:55 / fm" "Modified: / 28-07-2006 / 18:19:04 / fm" + "Modified: / 10-10-2006 / 18:19:02 / cg" ! startPrintJob - "Start a print job. Everything drawn between startPrintJob - and endPrintJob will become one entry in the print queue." - self startPrintJob: nil + "Start a print job. Everything drawn between startPrintJob + and endPrintJob will become one entry in the print queue." + + self startPrintJob:nil "Created: / 27-07-2006 / 18:18:52 / fm" + "Modified: / 10-10-2006 / 18:19:05 / cg" ! -startPrintJob: aString - - "Start a print job, using aString as the job title; everything - drawn between startPrintJob and endPrintJob will become - one entry in the print queue. - - Mg: Bei SpUserabort (bei Drucken in Datei) wird abort auf true gesetzt - und SpUserabort zurückgegeben. - " - "Changed by K3/EES5-Mg, 21.07.97" - "Changed by K3EES5-Mg, 19.09.97" - - ^self startPrintJob: aString fileName: nil +startPrintJob:aString + "Start a print job, using aString as the job title; everything + drawn between startPrintJob and endPrintJob will become + one entry in the print queue." + + ^ self startPrintJob:aString fileName:nil "Created: / 27-07-2006 / 18:19:09 / fm" + "Modified: / 10-10-2006 / 18:19:12 / cg" ! -startPrintJob: aString fileName: aFileName +startPrintJob:aString fileName:aFileName + "Start a print job, using aString as the job title; everything + drawn between startPrintJob and endPrintJob will become + one entry in the print queue." + + |docInfoStruct nameAddress title fileNameAddress| - "Start a print job, using aString as the job title; everything - drawn between startPrintJob and endPrintJob will become - one entry in the print queue." - "Changed by K3/EES5-Mg, 21.07.97" - "Changed by K3EES5-Mg, 19.09.97" - "Changed by GS/EEZ3-Vr, 15.03.02" - - | docInfoStruct nameAddress title fileNameAddress | - - gcId "deviceContext" isNil ifTrue: [ self buildPrinter ]. + gcId isNil ifTrue:[ + self buildPrinter + ]. abort := false. - "self setAbortProc." - title := aString isNil ifTrue: [ 'Smalltalk/X' "WindowLabelPrefix" ] ifFalse: [ aString ]. - + title := aString ? 'Smalltalk/X'. nameAddress := title asExternalBytes unprotectFromGC. -"/ nameAddress := ExternalAddress copyToNonSmalltalkMemory: title. - aFileName isNil ifFalse: [fileNameAddress := aFileName pathName asExternalBytes unprotectFromGC]. -"/ aFileName isNil ifFalse: [fileNameAddress := ExternalAddress copyToNonSmalltalkMemory: aFileName]. - - docInfoStruct := Win32OperatingSystem::DocInfoStructure new "some value". - docInfoStruct cbSize: docInfoStruct sizeInBytes; - lpszDocName: nameAddress address. -"/ ( docInfoStruct := SelfDefinedStructure named: 'DOCINFO' ) -"/ cbSize: docInfoStruct sizeInBytes; -"/ lpszDocName: nameAddress "asParameter". - - fileNameAddress isNil ifFalse:[docInfoStruct lpszOutput: fileNameAddress address"asParameter"]. - - jobid := OperatingSystem startDoc: gcId "deviceContext" - docInfo: docInfoStruct "asParameter". -"/ nameAddress free. -"/ fileNameAddress isNil ifFalse: [fileNameAddress free]. - - jobid > 0 - ifFalse: [jobid = -1 - ifTrue: [abort := true. ^nil]. - ^self error "osError" ]. + aFileName isNil ifFalse:[ + fileNameAddress := aFileName pathName asExternalBytes unprotectFromGC + ]. + docInfoStruct := Win32OperatingSystem::DocInfoStructure new. + docInfoStruct + cbSize:docInfoStruct sizeInBytes; + lpszDocName:nameAddress address. + fileNameAddress isNil ifFalse:[ + docInfoStruct lpszOutput:fileNameAddress address + ]. + jobid := OperatingSystem startDoc:gcId docInfo:docInfoStruct. + jobid > 0 ifFalse:[ + jobid = -1 ifTrue:[ + abort := true. + ^ nil + ]. + ^ self error + ]. self startPage "Created: / 27-07-2006 / 18:19:31 / fm" "Modified: / 03-08-2006 / 15:11:19 / fm" + "Modified: / 10-10-2006 / 18:20:01 / cg" ! ! !PrinterContext methodsFor:'queries'! supportsColor - "Changed by K3/EES5-Vo, 11.03.98" - "Changed by GS-EC/EES3-Vo, 06.10.05" - "/ | retVal info | "/ "/ info := (self class getPrinterInformation: self name) asUppercase. @@ -824,115 +832,125 @@ "/ "/ ^retVal + ^ false. + "Created: / 03-08-2006 / 09:55:26 / fm" "Modified: / 04-08-2006 / 13:20:40 / fm" + "Modified: / 10-10-2006 / 18:21:07 / cg" ! supportsGraphics - - "Private & DEFAULT!!." - "Changed by K3/EES5-Mg, 26.01.96" - ^(OperatingSystem getDeviceCaps: gcId asParameter index: 2 "Technology") ~= 4 "Created: / 03-08-2006 / 10:07:43 / fm" + "Modified: / 10-10-2006 / 18:21:14 / cg" ! ! !PrinterContext methodsFor:'text printing'! -asArrayOfStringLines: aString in: aRectangle wordWrap: wordWrapBoolean - "Private - convert aString into an array of lines; if wordWrapBoolean - is true, also perform word wrapping on the lines, within aRectangle." - | line lines stream x0 x1 partialLine leftMargin rightMargin partialLineWidth index | - stream := ReadStream on: aString. +asArrayOfStringLines:aString in:aRectangle wordWrap:wordWrapBoolean + "Private - convert aString into an array of lines; if wordWrapBoolean + is true, also perform word wrapping on the lines, within aRectangle." + + |line lines stream x0 x1 partialLine leftMargin rightMargin partialLineWidth index| + + stream := ReadStream on:aString. lines := OrderedCollection new. - wordWrapBoolean ifTrue: [ + wordWrapBoolean ifTrue:[ leftMargin := aRectangle left. - rightMargin := aRectangle right ]. - [ stream atEnd ] whileFalse: [ + rightMargin := aRectangle right + ]. + [ stream atEnd ] whileFalse:[ line := stream nextLine. - wordWrapBoolean - ifFalse: [ lines add: line ] - ifTrue: [ - x0 := x1 := 1. - 1 to: line size do: [ :i | - ( ( line at: i ) = Character space "32" and: [ (partialLine := line copyFrom: x0 to: i) trimBlanks notEmpty ] ) - ifTrue: [ - partialLineWidth := self stringWidthOf: partialLine. - ( leftMargin + partialLineWidth ) > rightMargin - ifTrue: [ - partialLine := line copyFrom: x0 to: x1. - lines add: partialLine. - x0 := x1 + 1 ] - ifFalse: [ x1 := i ] ]. - index := i + wordWrapBoolean ifFalse:[ + lines add:line + ] ifTrue:[ + x0 := x1 := 1. + 1 to:line size do:[:i | + ((line at:i) = Character space "32" + and:[ (partialLine := line copyFrom:x0 to:i) trimBlanks notEmpty ]) + ifTrue:[ + partialLineWidth := self stringWidthOf:partialLine. + (leftMargin + partialLineWidth) > rightMargin ifTrue:[ + partialLine := line copyFrom:x0 to:x1. + lines add:partialLine. + x0 := x1 + 1 + ] ifFalse:[ x1 := i ] ]. - line isEmpty - ifTrue: [ lines add: line ] - ifFalse: [ - partialLine := line copyFrom: x0 to: index. - partialLineWidth := self stringWidthOf: partialLine. - ( leftMargin + partialLineWidth ) > rightMargin - ifTrue: [ - partialLine := line copyFrom: x0 to: x1. - lines add: partialLine. - partialLine := line copyFrom: x1 + 1 to: index - ]. - lines add: partialLine - ] - ] + index := i + ]. + line isEmpty ifTrue:[ + lines add:line + ] ifFalse:[ + partialLine := line copyFrom:x0 to:index. + partialLineWidth := self stringWidthOf:partialLine. + (leftMargin + partialLineWidth) > rightMargin ifTrue:[ + partialLine := line copyFrom:x0 to:x1. + lines add:partialLine. + partialLine := line copyFrom:x1 + 1 to:index + ]. + lines add:partialLine + ] + ] ]. - ^lines asArray + ^ lines asArray "Created: / 02-08-2006 / 17:56:51 / fm" "Modified: / 04-08-2006 / 13:39:50 / fm" + "Modified: / 10-10-2006 / 18:14:00 / cg" ! -displayStringLines: anIndexedCollection from: startIndex to: endIndex in: aRectangle - "Private - display Strings in anIndexedCollection starting at startIndex and - ending at endIndex, clipped within the bounds of aRectangle." - | charHeight ta region ascent| +displayStringLines:anIndexedCollection from:startIndex to:endIndex in:aRectangle + "Private - display Strings in anIndexedCollection starting at startIndex and + ending at endIndex, clipped within the bounds of aRectangle." + + |charHeight ta region ascent| + charHeight := self getCharHeight. - ascent := self font ascentOn: self device. - startIndex to: endIndex do: [ :i | + ascent := self font ascentOn:self device. + startIndex to:endIndex do:[:i | |lineToPrint| - lineToPrint := ( anIndexedCollection at: i ). - self device - displayString: lineToPrint - from:1 - to: lineToPrint size - x: aRectangle left - y: (aRectangle top + ( i - startIndex * charHeight ) ) - in:nil - with: gcId - opaque:false - fontAscent: ascent. + + lineToPrint := (anIndexedCollection at:i). + self device + displayString:lineToPrint + from:1 + to:lineToPrint size + x:aRectangle left + y:(aRectangle top + ((i - startIndex) * charHeight)) + in:nil + with:gcId + opaque:false + fontAscent:ascent. ]. -"/ region := self setClipRect: aRectangle. -"/ ta := self getTextAlign. -"/ self setTextAlign: TaTop. -"/ startIndex to: endIndex do: [ :i | -"/ self -"/ displayText: ( anIndexedCollection at: i ) -"/ at: aRectangle left @ ( aRectangle top + ( i - startIndex * charHeight ) ) ]. -"/ self setTextAlign: ta. -"/ self destroyRegion: region + "/ region := self setClipRect: aRectangle. + "/ ta := self getTextAlign. + "/ self setTextAlign: TaTop. + "/ startIndex to: endIndex do: [ :i | + "/ self + "/ displayText: ( anIndexedCollection at: i ) + "/ at: aRectangle left @ ( aRectangle top + ( i - startIndex * charHeight ) ) ]. + "/ self setTextAlign: ta. + "/ self destroyRegion: region "Created: / 03-08-2006 / 11:37:52 / fm" "Modified: / 03-08-2006 / 12:38:43 / fm" + "Modified: / 10-10-2006 / 18:14:36 / cg" ! -displayStringLines: anIndexedCollection in: aRectangle - "Private - display anIndexedCollection of Strings clipped within - the bounds of aRectangle." - self - displayStringLines: anIndexedCollection - from: 1 - to: anIndexedCollection size - in: aRectangle +displayStringLines:anIndexedCollection in:aRectangle + "Private - display anIndexedCollection of Strings clipped within + the bounds of aRectangle." + + self + displayStringLines:anIndexedCollection + from:1 + to:anIndexedCollection size + in:aRectangle "Created: / 03-08-2006 / 16:03:07 / fm" + "Modified: / 10-10-2006 / 18:14:40 / cg" ! marginsRectangleFor:aRectangle @@ -941,6 +959,7 @@ in device units (pixels)." |left top right bottom pixelsPerInchX pixelsPerInchY horzRes vertRes inset rectangle| + pixelsPerInchX := self pixelsPerInchOfScreenWidth. pixelsPerInchY := self pixelsPerInchOfScreenHeight. aRectangle isNil ifTrue:[ @@ -957,98 +976,110 @@ right := (aRectangle right * pixelsPerInchX) asInteger. bottom := (aRectangle bottom * pixelsPerInchY) asInteger ]. - rectangle := left @ top extent: right @ bottom. + rectangle := left @ top extent:right @ bottom. ^ rectangle "Created: / 27-07-2006 / 18:22:57 / fm" "Modified: / 04-08-2006 / 13:39:45 / fm" + "Modified: / 10-10-2006 / 18:15:26 / cg" ! -printPage: pageIndex in: aRectangle lines: lines headerLines: headerLines linesPerPage: linesPerPage +printPage:pageIndex in:aRectangle lines:lines headerLines:headerLines linesPerPage:linesPerPage + "Private - print page # pageIndex from lines, assuming + the given number of linesPerPage." + + |firstLine lastLine l indexString p cHeight rect hLines| - "Private - print page # pageIndex from lines, assuming - the given number of linesPerPage." - "Changed by K3/EES5-Mg, 30.07.97" - - | firstLine lastLine l indexString p cHeight rect hLines| - firstLine := ( pageIndex - 1 ) * linesPerPage + 1. - lastLine := ( firstLine + linesPerPage - 1 ) min: lines size. - + firstLine := (pageIndex - 1) * linesPerPage + 1. + lastLine := (firstLine + linesPerPage - 1) min:lines size. rect := aRectangle deepCopy. hLines := headerLines deepCopy. - headerLines size > 0 ifTrue: - [l := hLines first. - (p := l indexOfString: '#P') = 0 ifFalse: - [indexString := pageIndex printString,' '. - "l replaceFrom: p to: p + indexString size - 1 with: indexString startingAt: 1." - l := (l copyFrom: 1 to: p - 1),indexString,(l copyFrom: p + 2 to: l size). - hLines at: 1 put: l. - ]. - cHeight := self getCharHeight. - rect top: rect top + (hLines size * cHeight). - ]. - - self displayStringLines: hLines in: aRectangle. - self displayStringLines: lines from: firstLine to: lastLine in: rect. + headerLines size > 0 ifTrue:[ + l := hLines first. + (p := l indexOfString:'#P') = 0 ifFalse:[ + indexString := pageIndex printString , ' '. + l := (l copyFrom:1 to:p - 1) , indexString , (l copyFrom:p + 2 to:l size). + hLines at:1 put:l. + ]. + cHeight := self getCharHeight. + rect top:rect top + (hLines size * cHeight). + ]. + self displayStringLines:hLines in:aRectangle. + self + displayStringLines:lines + from:firstLine + to:lastLine + in:rect. "Created: / 27-07-2006 / 18:28:00 / fm" "Modified: / 03-08-2006 / 16:03:15 / fm" + "Modified: / 10-10-2006 / 18:18:15 / cg" ! -printPage: pageIndex in: aRectangle lines: lines linesPerPage: linesPerPage - "Private - print page # pageIndex from lines, assuming - the given number of linesPerPage." - | firstLine lastLine | - firstLine := ( pageIndex - 1 ) * linesPerPage + 1. - lastLine := ( firstLine + linesPerPage - 1 ) min: lines size. - self displayStringLines: lines from: firstLine to: lastLine in: aRectangle +printPage:pageIndex in:aRectangle lines:lines linesPerPage:linesPerPage + "Private - print page # pageIndex from lines, assuming + the given number of linesPerPage." + + |firstLine lastLine| + + firstLine := (pageIndex - 1) * linesPerPage + 1. + lastLine := (firstLine + linesPerPage - 1) min:lines size. + self + displayStringLines:lines + from:firstLine + to:lastLine + in:aRectangle "Created: / 27-07-2006 / 18:24:59 / fm" "Modified: / 03-08-2006 / 12:47:24 / fm" + "Modified: / 10-10-2006 / 18:18:22 / cg" ! -stringWidthOf: aString - "Return the width of aString - when written using the current font." - ^self - stringWidthOf: aString - at: aString size. +stringWidthOf:aString + "Return the width of aString + when written using the current font." + + ^ self stringWidthOf:aString at:aString size. "Modified: / 03-08-2006 / 10:18:23 / fm" + "Modified: / 10-10-2006 / 18:20:08 / cg" ! -stringWidthOf: aString at: index - "Return the width of aString up to index - when written using the current font; expand tabs out - to 4 spaces for calculations" - | answer str size spaceWidth| - index <= 0 ifTrue: [^0]. - str := index >= aString size - ifTrue:[aString] - ifFalse:[aString copyFrom: 1 to: index]. - true "self font isNil" - ifTrue: [ "if font not set yet, calculate based on default font" -"/ extString := str asExternalString. - size := Win32OperatingSystem::WinPointStructure new. - ( OperatingSystem - getTextExtentPoint: gcId "self handle" - string: str - size: size) - ifFalse: [ ^self error ]. - answer := size x. -#TODO. - ] ifFalse: [ answer := self font widthOf: str on: self device "self handle" ]. - index > aString size ifTrue: [ - spaceWidth:= self font widthOf: Character space on: self device. - answer := answer + (index - aString size * spaceWidth)]. - ^answer. +stringWidthOf:aString at:index + "Return the width of aString up to index + when written using the current font; expand tabs out + to 4 spaces for calculations" + + |answer str size spaceWidth| + + index <= 0 ifTrue:[ ^ 0 ]. + str := index >= aString size ifTrue:[ aString ] ifFalse:[ aString copyFrom:1 to:index ]. + true "self font isNil" ifTrue:[ + "if font not set yet, calculate based on default font" + "/ extString := str asExternalString. + size := Win32OperatingSystem::WinPointStructure new. + (OperatingSystem + getTextExtentPoint:gcId + string:str + size:size) ifFalse:[ ^ self error ]. + answer := size x. + #TODO. + ] ifFalse:[ + answer := self font widthOf:str on:self device + ]. + index > aString size ifTrue:[ + spaceWidth := self font widthOf:Character space on:self device. + answer := answer + ((index - aString size) * spaceWidth) + ]. + ^ answer. "Created: / 03-08-2006 / 10:27:20 / fm" "Modified: / 04-08-2006 / 12:27:26 / fm" + "Modified: / 10-10-2006 / 18:20:43 / cg" ! ! !PrinterContext class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libview2/PrinterContext.st,v 1.5 2006-10-10 15:55:30 cg Exp $' + ^ '$Header: /cvs/stx/stx/libview2/PrinterContext.st,v 1.6 2006-10-10 16:22:07 cg Exp $' ! !