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:
parent
ab46c9f782
commit
041633a17f
@ -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);
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user