Improved Open/SaveDialog filter handling

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@2316 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
lazarus-bart 2012-02-28 13:32:11 +00:00
parent ab46c9f782
commit 041633a17f
3 changed files with 101 additions and 34 deletions

View File

@ -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);

View File

@ -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.

View File

@ -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;