@@ -49,10 +49,11 @@ TSaveSourceMgr = class abstract(TNoPublicConstructObject)
4949 // / Provides array of encodings supported for a file extension.</summary>
5050 // / <param name="Sender">TObject [in] Reference to object that triggered
5151 // / event.</param>
52- // / <param name="Ext">string [in] Name of extension to check.</param>
52+ // / <param name="FilterIdx">string [in] Index of file type withing dialog's
53+ // / filter string to check.</param>
5354 // / <param name="Encodings">TSourceFileEncodings [in/out] Receives array of
5455 // / supported encodings.</param>
55- procedure EncodingQueryHandler (Sender: TObject; const Ext: string ;
56+ procedure EncodingQueryHandler (Sender: TObject; const FilterIdx: Integer ;
5657 var Encodings: TSourceFileEncodings);
5758 // / <summary>Handles custom save dialog's OnPreview event. Displays source
5859 // / code appropriately formatted in preview dialog box.</summary>
@@ -81,6 +82,12 @@ TSaveSourceMgr = class abstract(TNoPublicConstructObject)
8182 // / <returns>TEncodedData - Formatted source code, syntax highlighted if
8283 // / required.</returns>
8384 function GenerateOutput (const FileType: TSourceFileType): TEncodedData;
85+ // / <summary>Returns the source file type associated with the selected
86+ // / index in the save dialogue box.</summary>
87+ // / <remarks>This method assumes that the filter string entries are in the
88+ // / same order as elements of the <c>TSourceFileType</c> enumeration.
89+ // / </remarks>
90+ function FileTypeFromFilterIdx : TSourceFileType;
8491 strict protected
8592 // / <summary>Internal constructor. Initialises managed save source dialog
8693 // / box and records information about supported file types.</summary>
@@ -178,18 +185,16 @@ procedure TSaveSourceMgr.DoExecute;
178185begin
179186 // Set up dialog box
180187 fSaveDlg.Filter := fSourceFileInfo.FilterString;
181- fSaveDlg.FilterIndex := ExtToFilterIndex (
188+ fSaveDlg.FilterIndex := FilterDescToIndex (
182189 fSaveDlg.Filter,
183- fSourceFileInfo.FileTypeInfo[Preferences.SourceDefaultFileType].Extension ,
190+ fSourceFileInfo.FileTypeInfo[Preferences.SourceDefaultFileType].DisplayName ,
184191 1
185192 );
186193 fSaveDlg.FileName := fSourceFileInfo.DefaultFileName;
187194 // Display dialog box and save file if user OKs
188195 if fSaveDlg.Execute then
189196 begin
190- FileType := fSourceFileInfo.FileTypeFromExt(
191- ExtractFileExt(fSaveDlg.FileName)
192- );
197+ FileType := FileTypeFromFilterIdx;
193198 FileContent := GenerateOutput(FileType).ToString;
194199 Encoding := TEncodingHelper.GetEncoding(fSaveDlg.SelectedEncoding);
195200 try
@@ -201,14 +206,27 @@ procedure TSaveSourceMgr.DoExecute;
201206end ;
202207
203208procedure TSaveSourceMgr.EncodingQueryHandler (Sender: TObject;
204- const Ext: string ; var Encodings: TSourceFileEncodings);
209+ const FilterIdx: Integer ; var Encodings: TSourceFileEncodings);
205210var
206211 FileType: TSourceFileType; // type of file that has given extension
207212begin
208- FileType := fSourceFileInfo.FileTypeFromExt(Ext) ;
213+ FileType := FileTypeFromFilterIdx ;
209214 Encodings := fSourceFileInfo.FileTypeInfo[FileType].Encodings;
210215end ;
211216
217+ function TSaveSourceMgr.FileTypeFromFilterIdx : TSourceFileType;
218+ var
219+ FilterIdx: Integer; // dlg FilterIndex adjusted to be 0 based
220+ begin
221+ FilterIdx := fSaveDlg.FilterIndex - 1 ;
222+ Assert(
223+ (FilterIdx >= Ord(Low(TSourceFileType)))
224+ and (FilterIdx <= Ord(High(TSourceFileType))),
225+ ClassName + ' .FileTypeFromFilterIdx: FilerIdx out of range'
226+ );
227+ Result := TSourceFileType(FilterIdx)
228+ end ;
229+
212230function TSaveSourceMgr.GenerateOutput (const FileType: TSourceFileType):
213231 TEncodedData;
214232var
@@ -231,7 +249,7 @@ function TSaveSourceMgr.GenerateOutput(const FileType: TSourceFileType):
231249procedure TSaveSourceMgr.HiliteQueryHandler (Sender: TObject; const Ext: string;
232250 var CanHilite: Boolean);
233251begin
234- CanHilite := IsHilitingSupported(fSourceFileInfo.FileTypeFromExt(Ext) );
252+ CanHilite := IsHilitingSupported(FileTypeFromFilterIdx );
235253end ;
236254
237255constructor TSaveSourceMgr.InternalCreate;
@@ -262,6 +280,13 @@ constructor TSaveSourceMgr.InternalCreate;
262280 TSourceFileEncoding.Create(etUTF8, sUTF8Encoding)
263281 ]
264282 );
283+ fSourceFileInfo.FileTypeInfo[sfHTML5] := TSourceFileTypeInfo.Create(
284+ ' .html' ,
285+ GetFileTypeDesc(sfHTML5),
286+ [
287+ TSourceFileEncoding.Create(etUTF8, sUTF8Encoding)
288+ ]
289+ );
265290 fSourceFileInfo.FileTypeInfo[sfXHTML] := TSourceFileTypeInfo.Create(
266291 ' .html' ,
267292 GetFileTypeDesc(sfXHTML),
@@ -305,7 +330,7 @@ procedure TSaveSourceMgr.PreviewHandler(Sender: TObject);
305330var
306331 FileType: TSourceFileType; // type of source file to preview
307332begin
308- FileType := fSourceFileInfo.FileTypeFromExt(fSaveDlg.SelectedExt) ;
333+ FileType := FileTypeFromFilterIdx ;
309334 // Display preview dialog box. We use save dialog as owner to ensure preview
310335 // dialog box is aligned over save dialog box
311336 TPreviewDlg.Execute(
0 commit comments