diff -r bbff3dc4085b -r 54e3fbee2822 FileApplicationNoteBook.st --- a/FileApplicationNoteBook.st Tue Feb 17 12:08:22 2004 +0100 +++ b/FileApplicationNoteBook.st Tue Feb 17 13:08:05 2004 +0100 @@ -73,7 +73,7 @@ semaChangeItem wantToPrintAsHexDump printAsHexDump itemChanged itemRemoved enableHexToggle md5CheckSum md5HashValueComputationProcess viewModifiedChannel - textEditorModificationTime checkModifiedBlock fileEncoding' + textEditorModificationTime checkModifiedBlock fileEncodingHolder' classVariableNames:'' poolDictionaries:'' privateIn:FileApplicationNoteBook @@ -810,6 +810,14 @@ ] ! +fileEncodingHolder + ^ self + aspectFor:#fileEncodingHolder + ifAbsent:[ + IndirectValue for:('ascii' asValue) + ] +! + modeLabelHolder ^ self aspectFor:#modeLabelHolder @@ -863,6 +871,7 @@ self cursorLineLabelHolder valueHolder: (app cursorLineLabelHolder). self cursorColLabelHolder valueHolder: (app cursorColLabelHolder). self modeLabelHolder valueHolder: (app modeLabelHolder). + self fileEncodingHolder valueHolder: (app fileEncodingHolder). ! update:something with:aParameter from:changedObject @@ -4057,6 +4066,18 @@ !FileApplicationNoteBook::TextEditor methodsFor:'accessing'! +fileEncoding + ^ self fileEncodingHolder value +! + +fileEncoding:fileEncodingArg + self fileEncodingHolder value:fileEncodingArg. + + editView notNil ifTrue:[ + editView externalEncoding:fileEncodingArg + ]. +! + item:aDirContentsItem self releaseCheckModify. @@ -4066,6 +4087,9 @@ super item:aDirContentsItem. self printAsHexDump value:(self presentation == #hexDump) withoutNotifying:self. self setContents ifFalse:[ ^ false]. + + self setUpTextView. + checkModifiedBlock isNil ifTrue:[ checkModifiedBlock := [ self enqueueMessage:#checkItemForChangesWithNewSetup @@ -4229,7 +4253,7 @@ ] do:[ present := self presentation. present == #asText ifTrue:[ - contents := file contents. + contents := self getContentsAsText. ] ifFalse:[ present == #hexDump ifTrue:[ self withWaitCursorDo:[ @@ -4242,6 +4266,54 @@ ^ contents. ! +getContentsAsText + |text guessedEncoding preferredFontEncoding fontsEncoding doNotShowFontDialog action + s| + + guessedEncoding := FileBrowser guessEncodingOfFile:item fileName asFilename. + guessedEncoding := guessedEncoding ? (self fileEncoding). + + editView notNil ifTrue:[ + fontsEncoding := editView font encoding ? 'ascii'. + + preferredFontEncoding := FontDescription preferredFontEncodingFor:guessedEncoding. + (CharacterEncoder isEncoding:preferredFontEncoding subSetOf:fontsEncoding) ifFalse:[ + doNotShowFontDialog == true ifTrue:[ + action := #show + ] ifFalse:[ + action := Dialog choose:(resources string:'''%1'' seems to require a %2 font (file encoding is %3).' + with:self fileName baseName + with:preferredFontEncoding allBold + with:guessedEncoding) + labels:(resources array:#('Cancel' 'Show' 'Don''t Ask Again' 'Change Font')) + values:#(nil #show #showAlways #encoding) + default:#encoding. + ]. + action == #showAlways ifTrue:[ + doNotShowFontDialog := true. + action := #show. + ]. + action isNil ifTrue:[ + AbortSignal raise + ]. + action == #encoding ifTrue:[ + self fileEncoding:(guessedEncoding asSymbol). + editView validateFontEncodingFor:self fileEncoding ask:false. + ] ifFalse:[ +"/ doNotShowFontDialog ~~ true ifTrue:[ +"/ self information:(resources string:'Individual characters may be invisible/wrong in this font.') +"/ ] + ]. + ]. + editView externalEncoding:self fileEncoding. + ]. + self fileEncoding:(guessedEncoding asSymbol). + + s := self fileName readStream. + text := self readStream:s lineDelimiter:(Character cr) encoding:self fileEncoding. + ^ text +! + getHashForContents:contents | hashStream| @@ -4273,6 +4345,49 @@ diffView topView label:'File ' , self fileName baseName , ' vs. Editor Contents'. ! +readStream:aStream lineDelimiter:aCharacter encoding:fileEncodingArg + "read from aStream, answer its contents as StringCollection. + The files lines are delimited by aCharacter. + If encoding is nonNil, the file is assumed to be coded according to + that symbol, and #decodeString: should be able to convert it." + + |text line fileEncoding editorsEncoding encoder| + + editView isNil ifTrue:[ + editorsEncoding := #'iso8859-1'. + ] ifFalse:[ + editorsEncoding := editView characterEncoding ? #'iso8859-1'. + ]. + fileEncoding := fileEncodingArg ? #'iso8859-1'. + encoder := CharacterEncoder encoderToEncodeFrom:editorsEncoding into:fileEncoding. + + text := StringCollection new. + +DecodingFailedError handle:[:ex|self halt] +do:[ + aCharacter == Character cr ifTrue:[ + FileStream lineTooLongErrorSignal handle:[:ex | + |s partialLine| + + s := ex parameter at:1. + partialLine := ex parameter at:2. + ex proceedWith:(partialLine , s upTo:aCharacter) + ] do:[ + [aStream atEnd] whileFalse:[ + line := aStream nextLine withTabsExpanded. + text add:(encoder decodeString:line) + ]. + ]. + ] ifFalse:[ + [aStream atEnd] whileFalse:[ + line := (aStream upTo:aCharacter) withTabsExpanded. + text add:(encoder decodeString:line) + ]. + ]. +]. + ^ text +! + reload textEditorModificationTime := self fileName modificationTime. @@ -4335,12 +4450,15 @@ ! setContents - | text| + |text| text := self getContents. text isNil ifTrue:[ ^ false]. + self setContentsFor:text. ^ true + + ! setContentsFor:aText @@ -4459,6 +4577,13 @@ ^ fileContentsModel. ! +fileEncodingHolder + fileEncodingHolder isNil ifTrue:[ + fileEncodingHolder := #'utf-8' asValue + ]. + ^ fileEncodingHolder +! + itemChanged itemChanged isNil ifTrue:[ @@ -4694,6 +4819,8 @@ editView saveAction:[ self doSaveAs ]. aWidget modifiedChannel:self viewModifiedChannel. + + editView externalEncoding:self fileEncoding. ! postBuildWith:aBuilder @@ -4744,6 +4871,9 @@ editView parenthesisSpecification:parenthesis ]. ]. + ]. + editView notNil ifTrue:[ + editView externalEncoding:self fileEncoding. ] ! ! @@ -5238,5 +5368,5 @@ !FileApplicationNoteBook class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libtool/FileApplicationNoteBook.st,v 1.145 2004-02-12 13:20:12 cg Exp $' + ^ '$Header: /cvs/stx/stx/libtool/FileApplicationNoteBook.st,v 1.146 2004-02-17 12:07:52 cg Exp $' ! !