# HG changeset patch # User fm # Date 1205339944 -3600 # Node ID 4e27ebbd5d79f1bed638913a187b130971661f13 # Parent ade46105bcc06eda625fdfe2f4d32dd1cd127931 initial checkin diff -r ade46105bcc0 -r 4e27ebbd5d79 Win32FileDialog.st --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Win32FileDialog.st Wed Mar 12 17:39:04 2008 +0100 @@ -0,0 +1,1041 @@ +"{ Package: 'stx:libtool' }" + +Object subclass:#Win32FileDialog + instanceVariableNames:'fileName openFileNameStruct filters lpstrFilter lpstrFile + lpstrInitialDir lpstrTitle lpstrDefExt defFilter defExtension + style title smalltalkFileFilters defFilterIndex parent' + classVariableNames:'InitialDirectory CommonDialogConstants FilterPatternDescriptions' + poolDictionaries:'' + category:'Interface-Tools-File' +! + +ByteArray variableByteSubclass:#OpenFilenameStructure + instanceVariableNames:'' + classVariableNames:'' + poolDictionaries:'' + privateIn:Win32FileDialog +! + + +!Win32FileDialog class methodsFor:'instance creation'! + +new + + ^ super new initialize +! ! + +!Win32FileDialog class methodsFor:'accessing'! + +getInitialDirectory + + ^ InitialDirectory +! + +setInitialDirectory: aName + + InitialDirectory := Directory pathName: aName +! ! + +!Win32FileDialog class methodsFor:'constants'! + +commonDialogConstantAt: aString + + ^ self commonDialogConstants at: aString ifAbsent:[Transcript showCR: 'Common Dialog Constant ', aString, ' notfound!!'] +! + +commonDialogConstants + + CommonDialogConstants isNil ifTrue:[CommonDialogConstants := self generateCommonDialogConstants ]. + ^ CommonDialogConstants +! + +generateCommonDialogConstants + + |dictionary| + + dictionary := Dictionary new. + dictionary + at: 'CcPreventfullopen' put: 4; + at: 'FrShowhelp' put: 128; + at: 'PdEnablesetuptemplate' put: 32768; + at: 'FrNoupdown' put: 1024; + at: 'CfNosimulations' put: 4096; + at: 'OfnPathmustexist' put: 2048; + at: 'CfWysiwyg' put: 32768; + at: 'PdReturndc' put: 256; + at: 'PdEnableprinthook' put: 4096; + at: 'CfInittologfontstruct' put: 64; + at: 'CfScalableonly' put: 131072; + at: 'PdPrinttofile' put: 32; + at: 'CfEffects' put: 256; + at: 'PdShowhelp' put: 2048; + at: 'OfnEnabletemplatehandle' put: 128; + at: 'CfBoth' put: 3; + at: 'OfnReadonly' put: 1; + at: 'PdNopagenums' put: 8; + at: 'PdDisableprinttofile' put: 524288; + at: 'PdHideprinttofile' put: 1048576; + at: 'OfnAllowmultiselect' put: 512; + at: 'CfPrinterfonts' put: 2; + at: 'CfEnabletemplatehandle' put: 32; + at: 'PdSelection' put: 1; + at: 'OfnHidereadonly' put: 4; + at: 'PdPrintsetup' put: 64; + at: 'OfnExtentiondifferent' put: 1024; + at: 'FrReplaceall' put: 32; + at: 'FrMatchcase' put: 4; + at: 'OfnFilemustexist' put: 4096; + at: 'PdCollate' put: 16; + at: 'CfFixedpitchonly' put: 16384; + at: 'PdEnablesetuphook' put: 8192; + at: 'OfnShareaware' put: 16384; + at: 'CcEnablehook' put: 16; + at: 'CfEnabletemplate' put: 16; + at: 'Findmsgstring' put: 'commdlgFindreplace'; + at: 'CfLimitsize' put: 8192; + at: 'OfnNochangedir' put: 8; + at: 'OfnCreateprompt' put: 8192; + at: 'ScreenFonttype' put: 8192; + at: 'PdUsedevmodecopies' put: 262144; + at: 'CcRgbinit' put: 1; + at: 'FrFindnext' put: 8; + at: 'CfUsestyle' put: 128; + at: 'FrEnablehook' put: 256; + at: 'PdEnableprinttemplatehandle' put: 65536; + at: 'CfShowhelp' put: 4; + at: 'FrNowholeword' put: 4096. + dictionary + at: 'ShareExist' put: 16448; + at: 'OfnOverwriteprompt' put: 2; + at: 'OfnEnablehook' put: 32; + at: 'OfnShowhelp' put: 16; + at: 'CcEnabletemplatehandle' put: 64; + at: 'SimulatedFonttype' put: 32768; + at: 'FrDown' put: 1; + at: 'PdEnableprinttemplate' put: 16384; + at: 'CfNovectorfonts' put: 2048; + at: 'PdNoselection' put: 4; + at: 'CfAnsionly' put: 1024; + at: 'OfnNovalidate' put: 256; + at: 'CfScreenfonts' put: 1; + at: 'FrWholeword' put: 2; + at: 'FrEnabletemplatehandle' put: 8192; + at: 'PdAllpages' put: 0; + at: 'CfForcefontexist' put: 65536; + at: 'CcEnabletemplate' put: 32; + at: 'PdPagenums' put: 2; + at: 'FrReplace' put: 16; + at: 'PdEnablesetuptemplatehandle' put: 131072; + at: 'CfApply' put: 512; + at: 'OfnEnabletemplate' put: 64; + at: 'DnDefaultprn' put: 1; + at: 'PdNowarning' put: 128; + at: 'CfTtonly' put: 262144; + at: 'PrinterFonttype' put: 16384; + at: 'CcShowhelp' put: 8; + at: 'CcFullopen' put: 2; + at: 'PdReturnic' put: 512; + at: 'FrEnabletemplate' put: 512; + at: 'FrDialogterm' put: 64; + at: 'Helpmsgstring' put: 'commdlgHelp'; + at: 'PdReturndefault' put: 1024; + at: 'FrNomatchcase' put: 2048; + at: 'CfEnablehook' put: 8. + ^ dictionary +! ! + +!Win32FileDialog class methodsFor:'examples'! + +openFile + + " + self openFile + " + + ^ (FileDialogWin new openFile: 'c:\untitled.txt') file. +! + +saveFile + + " + self saveFile + " + + ^ (FileDialogWin new saveFile: 'C:\vsw311\untitled.txt') file. +! ! + +!Win32FileDialog class methodsFor:'filters'! + +filterPatternDescription: filterPattern + + ^ self filterPatternDescriptions at: filterPattern ifAbsent: '' +! + +filterPatternDescriptions + + FilterPatternDescriptions isNil ifTrue:[ FilterPatternDescriptions := self generateFilterPatternDescriptions ]. + ^ FilterPatternDescriptions +! + +filtersFor: pattern + + |filters filterPatterns| + + pattern isEmptyOrNil ifTrue:[^ nil]. + + filters := OrderedCollection new. + filterPatterns := pattern subStrings: $;. + filterPatterns do:[:filterPattern | + filterPattern notEmpty ifTrue:[ + filters add: (Array with: (self filterPatternDescription: filterPattern) + with:filterPattern) + ]. + ]. + ^ filters asArray +! + +generateFilterPatternDescriptions + + ^ Dictionary new + at: '*.txt' put: 'Text files (*.txt)'; + at: '*.st' put: 'Smalltalk files (*.st)'; + at: '*.csv' put: 'CSV files (*.csv)'; + at: '*.xml' put: 'XML files (*.xml)'; + at: '*.zip' put: 'ZIP files (*.zip)'; + at: '*.xls' put: 'Excel files (*.xls)'; + at: '*.ent' put: 'SGML Entity files (*.ent)'; + at: '*.ccs' put: 'CCS files (*.ccs)'; + at: '*.ini' put: 'Configuration files (*.ini)'; + at: '*.prn' put: 'Printer Text files (*.prn)'; + at: '*.dir' put: 'DapasX Database files (*.dir)'; + at: '*.dat' put: 'DapasX Database files (*.dat)'; + at: '*.prg' put: 'DapasX Program files (*.prg)'; + at: '*.dcf' put: 'DapasX Options files (*.dcf)'; + at: '*.ext' put: 'DapasX Backup files (*.ext)'; + at: '*.mpl' put: 'DapasX Project files (*.mpl)'; + yourself +! ! + +!Win32FileDialog class methodsFor:'initialize'! + +startUp + + "Private - Initialize the class variables. This is called + during startup." + + InitialDirectory := Directory pathName: Disk drivePathName. +! ! + +!Win32FileDialog class methodsFor:'opening'! + +fileDialogFor:ownerWindow + save:isSaveDialog + title:titleOrNil + inDirectory:dirPathOrNil +initialAnswer:initialOrNil + filter:pattern + extension:extensionOrNil + + + "start a native open-file dialog. + If not cancelled, the selected fileName is returned; nil otherwise. + Of course, this one looks like the + Windows file dialog - no matter which viewStyle settings are active. + Notice: if no ownerWindow is given, the dialog pops up at 0@0. + + EXPERIMENTAL & non-portable: use with caution" + + |filePath filterArrayOrNil| + + filterArrayOrNil := self filtersFor: pattern. + + filePath := self new + openFor:ownerWindow + save:isSaveDialog + title:titleOrNil + inDirectory:dirPathOrNil + initialAnswer:initialOrNil + filter:filterArrayOrNil + extension:extensionOrNil. + + ^ filePath +! ! + +!Win32FileDialog methodsFor:'accessing'! + +addAllFilesFilter + + self addFilter: '*.*' description: 'All Files (*.*)'. +! + +addFilter: aFilter description: aDescription + "Add aFilter and aDescription to the list of File dialog + filters." + + filters add: ( Association key: aFilter value: aDescription ). +! + +addSmalltalkFileFilters + + ^ smalltalkFileFilters +! + +defExtension: aDefExtension + "Specifies the default extension of File dialog." + + defExtension := aDefExtension. +! + +defFilter + "Answers the aDefFilterString as the default filter of File dialog." + + ^ defFilter +! + +defFilter: aDefFilterString + "Specifies the aDefFilterString as the default filter of File dialog." + + defFilter := aDefFilterString +! + +defFilterIndex: defaultFilterIndex + + defFilterIndex := defaultFilterIndex. +! + +directory + "Answer the selected directory." + + ^ InitialDirectory ? OperatingSystem getCurrentDirectory asFilename +! + +directory: directory + "Sets the initial directory." + + | aFilename | + + directory isNil ifTrue:[^ self.]. + aFilename := directory asFilename. + aFilename exists ifTrue: [ InitialDirectory := aFilename ]. +! + +file + "Answer the selected file." + + ^fileName +! + +fileSpec: aFileSpec + "Sets the initial fileName and directory in the File Dialog." + + | array dir | + + "SHOULD assign initial fileName and directory separately using #fileName: and #directory" + + self halt. + fileName := aFileSpec. +"/ array := Filename splitPath: aFileSpec in: self directory . +"/ dir := +"/ (( String with: ( array at: 1 ) with: $: ), +"/ ( ( array at: 2 ) isEmpty ifTrue: [ '\' ] ifFalse: [ array at: 2 ] )) asFilename. +"/ dir exists ifFalse: [ dir := OperatingSystem getCurrentDirectory asFilename ]. +"/ +"/ self directory: dir. +"/ fileName := array at: 3 +! + +filters + "Private - answers a string containing all filters and sets up + the defFilterIndex property" + + | filterString count defaultFilterIndex defaultFilter| + + smalltalkFileFilters notNil ifTrue: [ + self + addFilter: '*.cls' description: 'Class Files (*.CLS)'; + addFilter: '*.mth' description: 'Method Files (*.MTH)'; + addFilter: '*.st' description: 'Smalltalk Files (*.ST)'; + addFilter: '*.bnd' description: 'Library Bind Files (*.BND)'; + addFilter: '*.map' description: 'Library Map Files (*.MAP)'; + addFilter: '*.ini' description: 'Initialization Files (*.INI)'; + addFilter: '*.obj' description: 'Object Files (*.OBJ)'; + addFilter: '*.log' description: 'Log Files (*.LOG)' + ]. + + defaultFilter := self defFilter. + (fileName notEmptyOrNil and:[defaultFilter isNil]) ifTrue:[ + |initialFilenameSuffix| + initialFilenameSuffix := fileName asFilename suffix. + initialFilenameSuffix notEmptyOrNil ifTrue:[ + defaultFilter := '*.', initialFilenameSuffix. + ]. + ]. + + filterString := String new. + count := 0. + defaultFilterIndex := 0. + filters do: [:assoc | + count := count + 1. + assoc key = defaultFilter ifTrue: [ defaultFilterIndex := count ]. + filterString := filterString, assoc value asAsciiZ, assoc key asAsciiZ + ]. + + self defFilterIndex: defaultFilterIndex. + ^filterString +! + +flags + "Private - Answers the dialog box current flags. + For compatibility reasons -> use style instead" + + ^openFileNameStruct flags +! + +flags: flags + + "Private - Specifies the dialog box creation flags. + Kept for compatibility reasons. Use style: instead" + + self style: flags +! + +hideReadonly + + "Hides the file dialog's Readonly check box. " + + self style: self style | (self class commonDialogConstantAt: 'OfnHidereadonly') +! + +initialFileName: filename + "Sets the initial fileName string in the File Dialog." + + | aString | + filename isNil ifTrue:[^ self.]. + aString := filename. + filename isFilename ifTrue:[ aString := filename baseName]. + fileName := aString. +! + +overwritePrompt + + "Prompt if the user attempts to overwrite a file" + + self style: self style | (self class commonDialogConstantAt: 'OfnOverwriteprompt') +! + +owner: ownerWindow + + "Sets the owner of the Dialog box." + + |mainView handle| + + ownerWindow isNil ifTrue:[^ self]. + mainView := ownerWindow windowGroup mainView. + mainView notNil ifTrue:[ + handle := mainView id. + handle notNil ifTrue:[ + parent := handle address + ]. + ]. + +"/ super owner: anOwner. +"/ owner isWindow +"/ ifTrue: [ parent := owner ] +"/ ifFalse: [ parent := owner mainView. +"/ parent isWindow ifFalse: [ +"/ parent := Notifier findWindow: WindowHandle queryActive ]]. +! + +pathMustExist + + "Private & DEFAULT!!." + "Changed by K3/EES5-Mg, 29.01.97" + + self style: self style | 16r800. +! + +shareAware + + "Allows a previously opened file to be opened + (e.g. change.log)" + + self style: self style | (self class commonDialogConstantAt: 'OfnShareaware') +! + +style + ^ style ? 8 +! + +style:something + style := something. +! + +title: aTitle + + "Specifies the string to be placed in the title bar of the + File dialog." + + title := aTitle +! ! + +!Win32FileDialog methodsFor:'dapas'! + +dapasOpenFile + + "Brings up the default open file dialog " + "Changed by K3/EES5-Mg, 28.02.96" + + self hideReadonly; + shareAware; + addFilter: '*.*' description: 'All Files (*.*)'. + + self defFilter isNil ifTrue:[ self defFilter: '*.*']. + + self open. +! + +dapasSaveFile + + "Brings up the file save dialog." + "Changed by K3/EES5-Mg, 28.02.96" + + self hideReadonly; + overwritePrompt; + addFilter: '*.*' description: 'All Files (*.*)'. + + self save. +! + +openFileXml + + "Brings up the default open file dialog " + "Changed by K3/EES5-Mg, 28.02.96" + "Changed by GS-EC/EES3 - Bernd Eisenmann, 14.08.03" + + self hideReadonly; + shareAware; + addFilter: '*.xml' description: 'XML-Datei'. + + self defFilter isNil ifTrue:[ self defFilter: '*.*']. + + self open. +! + +openFileXmlZip + + "Brings up the default open file dialog " + "Changed by K3/EES5-Mg, 28.02.96" + "Changed by GS-EC/EES3 - Bernd Eisenmann, 14.08.03" + + self hideReadonly; + shareAware; + addFilter: '*.xml' description: 'XML-Datei'; + addFilter: '*.zip' description: 'ZIP-Datei'. + + self defFilter isNil ifTrue:[ self defFilter: '*.*']. + + self open. +! ! + +!Win32FileDialog methodsFor:'initialize & release'! + +cleanUp + "Private - Free openFileNameStruct." + + self style: self flags. + lpstrFilter notNil ifTrue: [lpstrFilter free]. + lpstrFile notNil ifTrue: [lpstrFile free]. + lpstrInitialDir notNil ifTrue: [lpstrInitialDir free]. + lpstrTitle notNil ifTrue: [ lpstrTitle free ]. + lpstrDefExt notNil ifTrue: [ lpstrDefExt free ]. + + openFileNameStruct := nil +! + +initialize + + "Private - Initialize openFileNameStruct" + + super initialize. + openFileNameStruct := OpenFilenameStructure new. + openFileNameStruct lStructSize: openFileNameStruct sizeInBytes. + fileName := String new. + filters := OrderedCollection new. + self style: (self class commonDialogConstantAt: 'OfnNochangedir') +! ! + +!Win32FileDialog methodsFor:'opening'! + +open + "Brings up the open file dialog." + + | error rslt openFileNameStructExternalBytes | + + [ + self fillStruct. + parent notNil ifTrue: [ openFileNameStruct hwndOwner: parent.]. + style notNil ifTrue: [ openFileNameStruct flags: style ]. + + openFileNameStructExternalBytes := ExternalBytes from: openFileNameStruct asByteArray. + rslt := OperatingSystem getOpenFilename: openFileNameStructExternalBytes address. + rslt + ifTrue: [ self getFileName ] + ifFalse: [ + fileName := nil. + error := OperatingSystem commDlgExtendedError. + ]. + ] ensure:[ + openFileNameStructExternalBytes free. + self cleanUp. + ]. + + (error notNil and:[error ~= 0]) ifTrue: [self error: error ]. +! + +openFile + "Brings up the default open file dialog. The title is set to 'Open File' + and fileSpec is set to '*.*'. " + + self openFile: '*.*'. +! + +openFile: initialFileName + + "Brings up the default open file dialog. The title is set to 'Open File' + and fileSpec is set to patternString. " + + self title: 'Open'. + initialFileName notNil ifTrue: [ self initialFileName: initialFileName ]. + self + hideReadonly; + shareAware; + addAllFilesFilter; + addFilter: '*.txt' description: 'Text Files (*.txt)'. + Smalltalk isStandAloneApp ifFalse: [ self addSmalltalkFileFilters ]. + self defFilter isNil ifTrue:[ self defFilter: '*.*']. + self open. +! + +openFor:ownerWindow + save:isSaveDialog + title:titleOrNil + inDirectory:dirPathOrNil + initialAnswer:initialOrNil + filter:filterArrayOrNil + extension:extensionOrNil + + self + owner: ownerWindow; + title: titleOrNil; + initialFileName: initialOrNil; + defFilter: extensionOrNil. + + filterArrayOrNil notNil ifTrue:[ + filterArrayOrNil do:[:each | self addFilter: each last description: each first]. + ]. + + self addAllFilesFilter. +"/ self defFilter isNil ifTrue:[ self defFilter: '*.*']. + + isSaveDialog + ifTrue:[ + self hideReadonly; + overwritePrompt; + save. + ] ifFalse:[ + self hideReadonly; + shareAware; + open. + ]. + + ^ self file +! + +save + "Brings up the save file dialog." + + | error rslt openFileNameStructExternalBytes | + + [ + self fillStruct. + parent notNil ifTrue: [ openFileNameStruct hwndOwner: parent.]. + style notNil ifTrue: [ openFileNameStruct flags: style ]. + + openFileNameStructExternalBytes := ExternalBytes from: openFileNameStruct asByteArray. + rslt := OperatingSystem getSaveFilename: openFileNameStructExternalBytes address. + rslt + ifTrue: [ self getFileName ] + ifFalse: [ + fileName := nil. + error := OperatingSystem commDlgExtendedError. + ]. + ] ensure:[ + openFileNameStructExternalBytes free. + self cleanUp. + ]. + + (error notNil and:[error ~= 0]) ifTrue: [self error: error ]. +! + +saveFile: aString + + "Brings up the save file dialog with aString as the + default name. The title is set to 'Save File'. " + + self saveTitle: 'Save File' fileName: aString +! + +saveTitle: aTitle fileName: initialFileName + + "Brings up the file save dialog with aTitle and aString + as the default name." + + self title: aTitle; + initialFileName: initialFileName; + hideReadonly; + overwritePrompt; + addAllFilesFilter; + addFilter: '*.txt' description: 'Text Files (*.txt)'. + + self save. +! ! + +!Win32FileDialog methodsFor:'private'! + +fillStruct + "Private - fills the openFileNameStruct" + + | temp | + + temp := fileName asAsciiZ. + lpstrFile := ExternalBytes new: 512. + lpstrFile + replaceBytesFrom:1 + to:temp size + with:temp + startingAt:1. + + lpstrFilter := ExternalBytes fromString: self filters. + + lpstrInitialDir := ExternalBytes fromString: self directory pathName. + + openFileNameStruct + lpstrFile: lpstrFile address ; + nMaxFile: 512; + lpstrFilter: lpstrFilter address ; + nFilterIndex: defFilterIndex ; "set by filters" + lpstrInitialDir: lpstrInitialDir address. + + ( temp := defExtension) notNil ifTrue: [ + lpstrDefExt := ExternalBytes fromString: temp. + openFileNameStruct lpstrDefExt: lpstrDefExt address]. + + ( temp := title ) notNil ifTrue: [ + lpstrTitle := ExternalBytes fromString: temp. + openFileNameStruct lpstrTitle: lpstrTitle address ]. +! + +getFileName + "Private - get the filename" + + | directory | + + self style: self flags. + fileName := lpstrFile stringAt: 1. + directory := fileName copyFrom: 1 to: openFileNameStruct nFileOffset. + self directory: directory asFilename. +! ! + +!Win32FileDialog::OpenFilenameStructure class methodsFor:'accessing'! + +sizeInBytes + + ^ 76 +! ! + +!Win32FileDialog::OpenFilenameStructure class methodsFor:'instance creation'! + +new + + ^ super new: self sizeInBytes +! ! + +!Win32FileDialog::OpenFilenameStructure methodsFor:'accessing'! + +flags + "Answer the receiver's flags field as a Smalltalk object." + + ^ self doubleWordAtOffset: 52 +! + +flags: anObject + "Set the receiver's flags field as a Smalltalk object." + + ^ self doubleWordAtOffset: 52 put: anObject +! + +hInstance + "Get the receiver's hInstance field." + + ^ self doubleWordAtOffset: 4 +! + +hInstance: anObject + "Set the receiver's hInstance field to the value of anObject." + + self doubleWordAtOffset: 8 put: anObject +! + +hwndOwner + "Get the receiver's hwndOwner field." + + ^ self doubleWordAtOffset: 4 +! + +hwndOwner: anObject + "Set the receiver's hwndOwner field to the value of anObject." + + self doubleWordAtOffset: 4 put: anObject +! + +lCustData + "Get the receiver's lCustData field." + + ^ self doubleWordAtOffset: 64 +! + +lCustData: anObject + "Set the receiver's lCustData field as a Smalltalk object." + + ^ self doubleWordAtOffset: 64 put: anObject +! + +lStructSize + "Get the receiver's lStructSize field." + + ^ self doubleWordAtOffset: 0 +! + +lStructSize: anObject + "Set the receiver's lStructSize field to the value of anObject." + + self doubleWordAtOffset: 0 put: anObject +! + +lpfnHook + "Get the receiver's lpfnHook field." + + ^ self doubleWordAtOffset: 68 +! + +lpfnHook: anObject + "Set the receiver's lpfnHook field to the value of anObject." + + self doubleWordAtOffset: 68 put: anObject +! + +lpstrCustomFilter + "Get the receiver's lpstrCustomFilter field." + + ^ self doubleWordAtOffset: 16 +! + +lpstrCustomFilter: anObject + "Set the receiver's lpstrCustomFilter field to the value of anObject." + + self doubleWordAtOffset: 16 put: anObject +! + +lpstrDefExt + "Get the receiver's lpstrDefExt field." + + ^ self doubleWordAtOffset: 60 +! + +lpstrDefExt: anObject + "Set the receiver's lpstrDefExt field to the value of anObject." + + self doubleWordAtOffset: 60 put: anObject +! + +lpstrFile + "Get the receiver's lpstrFile field." + + ^ self doubleWordAtOffset: 28 +! + +lpstrFile: anObject + "Set the receiver's lpstrFile field to the value of anObject." + + self doubleWordAtOffset: 28 put: anObject +! + +lpstrFileTitle + "Get the receiver's lpstrFileTitle field." + + ^ self doubleWordAtOffset: 36 +! + +lpstrFileTitle: anObject + "Set the receiver's lpstrFileTitle field to the value of anObject." + + self doubleWordAtOffset: 36 put: anObject +! + +lpstrFilter + "Get the receiver's lpstrFilter field." + + ^ self doubleWordAtOffset: 12 +! + +lpstrFilter: anObject + "Set the receiver's lpstrFilter field to the value of anObject." + + self doubleWordAtOffset: 12 put: anObject +! + +lpstrInitialDir + "Get the receiver's lpstrInitialDir field." + + ^ self doubleWordAtOffset: 44 +! + +lpstrInitialDir: anObject + "Set the receiver's lpstrInitialDir field to the value of anObject." + + self doubleWordAtOffset: 44 put: anObject +! + +lpstrTemplateName + "Get the receiver's lpstrTemplateName field." + + ^ self doubleWordAtOffset: 72 +! + +lpstrTemplateName: anObject + "Set the receiver's lpstrTemplateName field to the value of anObject." + + self doubleWordAtOffset: 72 put: anObject +! + +lpstrTitle + "Get the receiver's lpstrTitle field." + + ^ self doubleWordAtOffset: 48 +! + +lpstrTitle: anObject + "Set the receiver's lpstrTitle field to the value of anObject." + + self doubleWordAtOffset: 48 put: anObject +! + +nFileExtension + "Get the receiver's nFileExtension field." + + ^ self unsignedShortAtOffset: 58 +! + +nFileExtension: anObject + "Set the receiver's nFileExtension field to the value of anObject." + + self unsignedShortAtOffset: 58 put: anObject +! + +nFileOffset + "Get the receiver's nFileOffset field." + + ^ self unsignedShortAtOffset: 56 +! + +nFileOffset: anObject + "Set the receiver's nFileOffset field to the value of anObject." + + self unsignedShortAtOffset: 56 put: anObject +! + +nFilterIndex + "Get the receiver's nFilterIndex field." + + ^ self doubleWordAtOffset: 24 +! + +nFilterIndex: anObject + "Set the receiver's nFilterIndex field to the value of anObject." + + self doubleWordAtOffset: 24 put: anObject +! + +nMaxCustFilter + "Get the receiver's nMaxCustFilter field." + + ^ self doubleWordAtOffset: 20 +! + +nMaxCustFilter: anObject + "Set the receiver's nMaxCustFilter field to the value of anObject." + + self doubleWordAtOffset: 20 put: anObject +! + +nMaxFile + "Get the receiver's nMaxFile field." + + ^ self doubleWordAtOffset: 32 +! + +nMaxFile: anObject + "Set the receiver's nMaxFile field to the value of anObject." + + self doubleWordAtOffset: 32 put: anObject +! + +nMaxFileTitle + "Get the receiver's nMaxFileTitle field." + + ^ self doubleWordAtOffset: 40 +! + +nMaxFileTitle: anObject + "Set the receiver's nMaxFileTitle field to the value of anObject." + + self doubleWordAtOffset: 40 put: anObject +! + +sizeInBytes + + ^ self class sizeInBytes +! ! + +!Win32FileDialog::OpenFilenameStructure methodsFor:'printing'! + +printOn: aStream + + super printOn: aStream. + aStream cr. + aStream nextPutAll:'flags: ', self flags printString; cr. + aStream nextPutAll:'hInstance: ', self hInstance printString; cr. + aStream nextPutAll:'hwndOwner: ', self hwndOwner printString; cr. + aStream nextPutAll:'lCustData: ', self lCustData printString; cr. + aStream nextPutAll:'lpfnHook: ', self lpfnHook printString; cr. + aStream nextPutAll:'lpstrCustomFilter: ', self lpstrCustomFilter printString; cr. + aStream nextPutAll:'lpstrDefExt: ', self lpstrDefExt printString; cr. + aStream nextPutAll:'lpstrFile: ', self lpstrFile printString; cr. + aStream nextPutAll:'lpstrFileTitle: ', self lpstrFileTitle printString; cr. + aStream nextPutAll:'lpstrFilter: ', self lpstrFilter printString; cr. + aStream nextPutAll:'lpstrInitialDir: ', self lpstrInitialDir printString; cr. + aStream nextPutAll:'lpstrTemplateName: ', self lpstrTemplateName printString; cr. + aStream nextPutAll:'lStructSize: ', self lStructSize printString; cr. + aStream nextPutAll:'nFileExtension: ', self nFileExtension printString; cr. + aStream nextPutAll:'nFileOffset: ', self nFileOffset printString; cr. + aStream nextPutAll:'nFilterIndex: ', self nFilterIndex printString; cr. + aStream nextPutAll:'nMaxCustFilter: ', self nMaxCustFilter printString; cr. + aStream nextPutAll:'nMaxFile: ', self nMaxFile printString; cr. + aStream nextPutAll:'nMaxFileTitle: ', self nMaxFileTitle printString; cr. +! ! + +!Win32FileDialog class methodsFor:'documentation'! + +version + ^ '$Header: /cvs/stx/stx/libtool/Win32FileDialog.st,v 1.1 2008-03-12 16:39:04 fm Exp $' +! !