diff --git a/applications/lazedit/editorpagecontrol.pp b/applications/lazedit/editorpagecontrol.pp index a4dea6332..6de0b93e3 100644 --- a/applications/lazedit/editorpagecontrol.pp +++ b/applications/lazedit/editorpagecontrol.pp @@ -81,7 +81,7 @@ type procedure UpdateEditorOptions(Sender: TObject); function GetUniquePageCaption(const AName: String): String; procedure SetFileName(const Utf8Fn: String; const UpdateFileType: Boolean); - function ExtToFileType(const Ext: String): TEditorFileType; + //function ExtToFileType(const Ext: String): TEditorFileType; function GuessFileType: TEditorFileType; function GuessSyntaxFromString(S: String): TEditorFileType; procedure SetFileType(AFileType: TEditorFileType); @@ -328,6 +328,7 @@ begin //debugln('TEditor.GetUniquePageCaption End'); end; +{ function TEditor.ExtToFileType(const Ext: String): TEditorFileType; var Index: TEditorFileType; @@ -346,6 +347,7 @@ begin //Debugln('TEditor.ExtToFileType: Result = ',eftNames[Result]); //DebugLn('TEditor.ExtToFileType: End'); end; +} function TEditor.GuessSyntaxFromString(S: String): TEditorFileType; const @@ -379,7 +381,7 @@ begin Ext := ExtractFileExt(FFileName); //DebugLn('TEditor.GuessFileType: Ext = "',Ext,'"'); if (Ext = FFileName) then Ext := ''; //filenames starting with a period (on linux mostly) - Result := ExtToFileType(Ext); + Result := ExtToFileType(Ext, FileMaskList); if (Result = eftNone) and (FindInMaskList(Ext, FileMaskList[eftNone])) then begin //Debugln('TEditor.GuessFileType: explicitely defined eftNone extension found: ',Ext); diff --git a/applications/lazedit/lazedit_constants.pp b/applications/lazedit/lazedit_constants.pp index 3682cb349..6c9c4a32e 100644 --- a/applications/lazedit/lazedit_constants.pp +++ b/applications/lazedit/lazedit_constants.pp @@ -39,6 +39,8 @@ unit lazedit_constants; interface +Uses Classes, SysUtils, LCLProc; + const AppName = 'LazEdit'; AboutTitle = 'Over ' + AppName; @@ -81,28 +83,21 @@ const {$ENDIF} FilterText = 'Tekst bestanden (*.txt)|*.txt'; FilterAll = 'Alle bestanden ('+ AllFilesMask + ')|' + AllFilesMask; + fiMaskText = '*.txt'; + fiNameText = 'Tekst bestanden'; + fiNameAll = 'Alle bestanden'; + fiNameAllSupported = 'Alle ondersteunde bestandstypen'; + //FilterIndexes all start with FilterAllSupported, then all individually supported filetypes followed by .txt, templates and * //Filter indexes - fiEftFirst = Ord(Low(TEditorFileType)) + 1; - fiHtml = Ord(eftHtml); - fiXml = Ord(eftXml); - fiCss = Ord(eftCss); - fiJS = Ord(eftJS); - fiFpc = Ord(eftFpc); - fiLfm = Ord(eftLfm); - fiC = Ord(eftC); - fiPy = Ord(eftPy); - fiPhp = Ord(eftPhp); - fiPerl = Ord(eftPerl); - fiUnixShell = Ord(eftUnixShell); - fiBat = Ord(eftBat); - fiDiff = Ord(eftDiff); - fiIni = Ord(eftIni); - fiPo = Ord(eftPo); - fiEftLast = Ord(High(TEditorFileType)); + fiAllSupported = 1; //FilterIndexes are 1-based! + + fiEftFirst = Ord(Low(TEditorFileType)) + 2; //skip eftNone, add 1 for fiAllSupported + fiEftLast = Ord(High(TEditorFileType)) + 1; //Add 1 for fiAllSupported fiText = fiEftLast + 1; - fiAll = fiEftLast + 2; + fiTemplate = fiText + 1; + fiAll = fiTemplate + 1; DefaultFiletypeMaskList: TFileTypeMaskList = ('.txt',//eftNone (no need to guess syntax for .txt files) '.htm;.html;.xhtml;.xhtm;' + HtmlTemplateExt, //eftHtml @@ -125,7 +120,56 @@ const MruEntries = 6; +function ExtToFileType(const Ext: String; AFileTypeMaskList: TFileTypeMaskList): TEditorFileType; +function FindInMaskList(const Ext, MaskList: String): Boolean; + implementation +function FindInMaskList(const Ext, MaskList: String): Boolean; +var + SL: TStringList; + i: Integer; +begin + Result := False; + if (Length(Ext) = 0) or (Length(MaskList) = 0) then Exit; + SL := TStringList.Create; + try + SL.StrictDelimiter := True; + SL.Delimiter := ';'; + SL.CaseSensitive := False; + SL.Duplicates := dupAccept; + SL.DelimitedText := Trim(MaskList); + for i := 0 to SL.Count - 1 do + begin + if CompareText(Ext, SL.Strings[i]) = 0 then + begin + Result := True; + Break; + end; + end; + finally + SL.Free; + end; +end; + +function ExtToFileType(const Ext: String; AFileTypeMaskList: TFileTypeMaskList): TEditorFileType; +var + Index: TEditorFileType; +begin + //DebugLn('ExtToFileType: Ext = "',Ext,'"'); + Result := eftNone; + if (Length(Ext) = 0) then Exit; + for Index := Low(TEditorFileType) to High(TEditorFileType) do + begin + if FindInMaskList(Ext, AFileTypeMaskList[Index]) then + begin + Result := Index; + Exit; + end; + end; + //Debugln('ExtToFileType: Result = ',eftNames[Result]); + //DebugLn('ExtToFileType: End'); +end; + end. diff --git a/applications/lazedit/main.pp b/applications/lazedit/main.pp index 73f41abf5..3f411bbde 100644 --- a/applications/lazedit/main.pp +++ b/applications/lazedit/main.pp @@ -456,6 +456,7 @@ type procedure CreateMruMenuItemsArray; function TryHlMenuTagToFileType(ATag: PtrInt; out AFileType: TEditorFileType): Boolean; + function FileTypeToFilterIndex(const Index: TEditorFileType): Integer; procedure ConstructOpenDialogFileFilters; procedure ShowError(const Msg: String); @@ -1519,31 +1520,37 @@ procedure TLazEditMainForm.ConstructOpenDialogFileFilters; end; end; var - Filter, SubFilter, WildFilter: String; + Filter, SubFilter, WildFilter, AllSupportedExt: String; Index: Integer; FileType: TEditorFileType; begin //First filter for OpenSave Filter := ''; - for Index := fiEftFirst to fiEftLast do + AllSupportedExt := ''; + //first "AllSupported" + for FileType := Succ(Low(TEditorFileType)) to High(TEditorFileType) do + AllSupportedExt := AllSupportedExt + AppOptions.FileTypeMaskList[FileType]; + Filter := Filter + fiNameAllSupported + '|' + AddWilds(AllSupportedExt); + //Add supported filetypes indivdually + for FileType := Succ(Low(TEditorFileType)) to High(TEditorFileType) do begin - FileType := TEditorFileType(Index); //DbgOut(eftNames[FileType],' -> '); WildFilter := AddWilds(AppOptions.FileTypeMaskList[FileType]); //DebugLn(WildFilter); - SubFilter := eftFilterNames[FileType] + ' (' + WildFilter + ')|'+ WildFilter; + SubFilter := eftFilterNames[FileType] + {' (' + WildFilter + ')}'|'+ WildFilter; Filter := Filter + '|' + SubFilter; end; - Filter := Filter + '|' + FilterText; + //Add Text files + Filter := Filter + '|' + fiNameText + '|'+ fiMaskText; WildFilter := AddWilds(AppOptions.TemplateMaskList); - //Also add template filter to Open/SaveFilter - Filter := Filter + '|' + STemplate + ' (' + WildFilter + ')|' + WildFilter; - Filter := Filter + '|' + FilterAll; + //Add template filter + Filter := Filter + '|' + STemplate + {' (' + WildFilter + ')}'|' + WildFilter; + Filter := Filter + '|' + fiNameAll + '|' + AllFilesMask; while (Length(Filter) > 0) and (Filter[1] = '|') do System.Delete(Filter,1,1); OpenSaveFilter := Filter; //Now filter for Open/Save as Template - TemplateFilter := STemplate + ' (' + WildFilter + ')|' + WildFilter + '|' + FilterAll; + TemplateFilter := STemplate + {' (' + WildFilter + ')}'|' + WildFilter + '|' + FilterAll; end; { ********************** [ Commandline options ] ******************************** } @@ -1656,6 +1663,16 @@ begin if Result then AFileType := TEditorFileType(ATag); end; +function TLazEditMainForm.FileTypeToFilterIndex(const Index: TEditorFileType + ): Integer; +const + OffSet = fiEftFirst - 1; +begin + if Index > eftNone then + Result := Ord(Index) + OffSet + else + Result := fiAll; +end; procedure TLazEditMainForm.TagMenuItemsAndActions; @@ -1946,21 +1963,25 @@ end; function TLazEditMainForm.AskFileNameSave(const Fn: String; const FileType: TEditorFileType): String; begin SaveDialog.Filter := OpenSaveFilter; - SaveDialog.FilterIndex := 0; + SaveDialog.FilterIndex := fiAllSupported; if (Fn <> EmptyStr) then begin SaveDialog.FileName := ExtractFileName(Fn); SaveDialog.InitialDir := ExtractFileDir(Fn); - //f/SaveDialog.FilterIndex := GetFilterIndexFromFileName(SaveDialog.Filter, Fn); - //f/SaveDialog.DefaultExt := GetExtensionFromFilterAtIndex(SaveDialog.Filter, SaveDialog.FilterIndex); + //SaveDialog.FilterIndex := GetFilterIndexFromFileName(SaveDialog.Filter, Fn); + SaveDialog.FilterIndex := FileTypeToFilterIndex(ExtToFileType(ExtractFileExt(Fn),AppOptions.FileTypeMaskList)); + //SaveDialog.DefaultExt := GetExtensionFromFilterAtIndex(SaveDialog.Filter, SaveDialog.FilterIndex); + SaveDialog.DefaultExt := EmptyStr; end else begin - if (FileType <> eftNone) then SaveDialog.FilterIndex := Ord(FileType); - //f/SaveDialog.DefaultExt := GetExtensionFromFilterAtIndex(SaveDialog.Filter, SaveDialog.FilterIndex); + if (FileType <> eftNone) then SaveDialog.FilterIndex := FileTypeToFilterIndex(FileType); + //SaveDialog.DefaultExt := GetExtensionFromFilterAtIndex(SaveDialog.Filter, SaveDialog.FilterIndex); + SaveDialog.DefaultExt := EmptyStr; end; //debugln('SaveDialog.FilterIndex = ',dbgs(SaveDialog.FilterIndex)); //debugln('SaveDialog.DefaultExt = ',SaveDialog.DefaultExt); + if SaveDialog.Execute then begin Result := SaveDialog.FileName;