initial checkin
authorfm
Wed, 12 Mar 2008 17:39:04 +0100
changeset 8015 4e27ebbd5d79
parent 8014 ade46105bcc0
child 8016 7db8447ef77b
initial checkin
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 $'
+! !