You've already forked lazarus-ccr
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:
@ -81,7 +81,7 @@ type
|
|||||||
procedure UpdateEditorOptions(Sender: TObject);
|
procedure UpdateEditorOptions(Sender: TObject);
|
||||||
function GetUniquePageCaption(const AName: String): String;
|
function GetUniquePageCaption(const AName: String): String;
|
||||||
procedure SetFileName(const Utf8Fn: String; const UpdateFileType: Boolean);
|
procedure SetFileName(const Utf8Fn: String; const UpdateFileType: Boolean);
|
||||||
function ExtToFileType(const Ext: String): TEditorFileType;
|
//function ExtToFileType(const Ext: String): TEditorFileType;
|
||||||
function GuessFileType: TEditorFileType;
|
function GuessFileType: TEditorFileType;
|
||||||
function GuessSyntaxFromString(S: String): TEditorFileType;
|
function GuessSyntaxFromString(S: String): TEditorFileType;
|
||||||
procedure SetFileType(AFileType: TEditorFileType);
|
procedure SetFileType(AFileType: TEditorFileType);
|
||||||
@ -328,6 +328,7 @@ begin
|
|||||||
//debugln('TEditor.GetUniquePageCaption End');
|
//debugln('TEditor.GetUniquePageCaption End');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{
|
||||||
function TEditor.ExtToFileType(const Ext: String): TEditorFileType;
|
function TEditor.ExtToFileType(const Ext: String): TEditorFileType;
|
||||||
var
|
var
|
||||||
Index: TEditorFileType;
|
Index: TEditorFileType;
|
||||||
@ -346,6 +347,7 @@ begin
|
|||||||
//Debugln('TEditor.ExtToFileType: Result = ',eftNames[Result]);
|
//Debugln('TEditor.ExtToFileType: Result = ',eftNames[Result]);
|
||||||
//DebugLn('TEditor.ExtToFileType: End');
|
//DebugLn('TEditor.ExtToFileType: End');
|
||||||
end;
|
end;
|
||||||
|
}
|
||||||
|
|
||||||
function TEditor.GuessSyntaxFromString(S: String): TEditorFileType;
|
function TEditor.GuessSyntaxFromString(S: String): TEditorFileType;
|
||||||
const
|
const
|
||||||
@ -379,7 +381,7 @@ begin
|
|||||||
Ext := ExtractFileExt(FFileName);
|
Ext := ExtractFileExt(FFileName);
|
||||||
//DebugLn('TEditor.GuessFileType: Ext = "',Ext,'"');
|
//DebugLn('TEditor.GuessFileType: Ext = "',Ext,'"');
|
||||||
if (Ext = FFileName) then Ext := ''; //filenames starting with a period (on linux mostly)
|
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
|
if (Result = eftNone) and (FindInMaskList(Ext, FileMaskList[eftNone])) then
|
||||||
begin
|
begin
|
||||||
//Debugln('TEditor.GuessFileType: explicitely defined eftNone extension found: ',Ext);
|
//Debugln('TEditor.GuessFileType: explicitely defined eftNone extension found: ',Ext);
|
||||||
|
@ -39,6 +39,8 @@ unit lazedit_constants;
|
|||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
|
Uses Classes, SysUtils, LCLProc;
|
||||||
|
|
||||||
const
|
const
|
||||||
AppName = 'LazEdit';
|
AppName = 'LazEdit';
|
||||||
AboutTitle = 'Over ' + AppName;
|
AboutTitle = 'Over ' + AppName;
|
||||||
@ -81,28 +83,21 @@ const
|
|||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
FilterText = 'Tekst bestanden (*.txt)|*.txt';
|
FilterText = 'Tekst bestanden (*.txt)|*.txt';
|
||||||
FilterAll = 'Alle bestanden ('+ AllFilesMask + ')|' + AllFilesMask;
|
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
|
//Filter indexes
|
||||||
fiEftFirst = Ord(Low(TEditorFileType)) + 1;
|
fiAllSupported = 1; //FilterIndexes are 1-based!
|
||||||
fiHtml = Ord(eftHtml);
|
|
||||||
fiXml = Ord(eftXml);
|
fiEftFirst = Ord(Low(TEditorFileType)) + 2; //skip eftNone, add 1 for fiAllSupported
|
||||||
fiCss = Ord(eftCss);
|
fiEftLast = Ord(High(TEditorFileType)) + 1; //Add 1 for fiAllSupported
|
||||||
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));
|
|
||||||
|
|
||||||
fiText = fiEftLast + 1;
|
fiText = fiEftLast + 1;
|
||||||
fiAll = fiEftLast + 2;
|
fiTemplate = fiText + 1;
|
||||||
|
fiAll = fiTemplate + 1;
|
||||||
|
|
||||||
DefaultFiletypeMaskList: TFileTypeMaskList = ('.txt',//eftNone (no need to guess syntax for .txt files)
|
DefaultFiletypeMaskList: TFileTypeMaskList = ('.txt',//eftNone (no need to guess syntax for .txt files)
|
||||||
'.htm;.html;.xhtml;.xhtm;' + HtmlTemplateExt, //eftHtml
|
'.htm;.html;.xhtml;.xhtm;' + HtmlTemplateExt, //eftHtml
|
||||||
@ -125,7 +120,56 @@ const
|
|||||||
|
|
||||||
MruEntries = 6;
|
MruEntries = 6;
|
||||||
|
|
||||||
|
function ExtToFileType(const Ext: String; AFileTypeMaskList: TFileTypeMaskList): TEditorFileType;
|
||||||
|
function FindInMaskList(const Ext, MaskList: String): Boolean;
|
||||||
|
|
||||||
implementation
|
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.
|
end.
|
||||||
|
|
||||||
|
@ -456,6 +456,7 @@ type
|
|||||||
procedure CreateMruMenuItemsArray;
|
procedure CreateMruMenuItemsArray;
|
||||||
function TryHlMenuTagToFileType(ATag: PtrInt; out AFileType: TEditorFileType): Boolean;
|
function TryHlMenuTagToFileType(ATag: PtrInt; out AFileType: TEditorFileType): Boolean;
|
||||||
|
|
||||||
|
function FileTypeToFilterIndex(const Index: TEditorFileType): Integer;
|
||||||
procedure ConstructOpenDialogFileFilters;
|
procedure ConstructOpenDialogFileFilters;
|
||||||
procedure ShowError(const Msg: String);
|
procedure ShowError(const Msg: String);
|
||||||
|
|
||||||
@ -1519,31 +1520,37 @@ procedure TLazEditMainForm.ConstructOpenDialogFileFilters;
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
var
|
var
|
||||||
Filter, SubFilter, WildFilter: String;
|
Filter, SubFilter, WildFilter, AllSupportedExt: String;
|
||||||
Index: Integer;
|
Index: Integer;
|
||||||
FileType: TEditorFileType;
|
FileType: TEditorFileType;
|
||||||
begin
|
begin
|
||||||
//First filter for OpenSave
|
//First filter for OpenSave
|
||||||
Filter := '';
|
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
|
begin
|
||||||
FileType := TEditorFileType(Index);
|
|
||||||
//DbgOut(eftNames[FileType],' -> ');
|
//DbgOut(eftNames[FileType],' -> ');
|
||||||
WildFilter := AddWilds(AppOptions.FileTypeMaskList[FileType]);
|
WildFilter := AddWilds(AppOptions.FileTypeMaskList[FileType]);
|
||||||
//DebugLn(WildFilter);
|
//DebugLn(WildFilter);
|
||||||
SubFilter := eftFilterNames[FileType] + ' (' + WildFilter + ')|'+ WildFilter;
|
SubFilter := eftFilterNames[FileType] + {' (' + WildFilter + ')}'|'+ WildFilter;
|
||||||
Filter := Filter + '|' + SubFilter;
|
Filter := Filter + '|' + SubFilter;
|
||||||
end;
|
end;
|
||||||
Filter := Filter + '|' + FilterText;
|
//Add Text files
|
||||||
|
Filter := Filter + '|' + fiNameText + '|'+ fiMaskText;
|
||||||
WildFilter := AddWilds(AppOptions.TemplateMaskList);
|
WildFilter := AddWilds(AppOptions.TemplateMaskList);
|
||||||
//Also add template filter to Open/SaveFilter
|
//Add template filter
|
||||||
Filter := Filter + '|' + STemplate + ' (' + WildFilter + ')|' + WildFilter;
|
Filter := Filter + '|' + STemplate + {' (' + WildFilter + ')}'|' + WildFilter;
|
||||||
Filter := Filter + '|' + FilterAll;
|
Filter := Filter + '|' + fiNameAll + '|' + AllFilesMask;
|
||||||
while (Length(Filter) > 0) and (Filter[1] = '|') do System.Delete(Filter,1,1);
|
while (Length(Filter) > 0) and (Filter[1] = '|') do System.Delete(Filter,1,1);
|
||||||
OpenSaveFilter := Filter;
|
OpenSaveFilter := Filter;
|
||||||
|
|
||||||
//Now filter for Open/Save as Template
|
//Now filter for Open/Save as Template
|
||||||
TemplateFilter := STemplate + ' (' + WildFilter + ')|' + WildFilter + '|' + FilterAll;
|
TemplateFilter := STemplate + {' (' + WildFilter + ')}'|' + WildFilter + '|' + FilterAll;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ ********************** [ Commandline options ] ******************************** }
|
{ ********************** [ Commandline options ] ******************************** }
|
||||||
@ -1656,6 +1663,16 @@ begin
|
|||||||
if Result then AFileType := TEditorFileType(ATag);
|
if Result then AFileType := TEditorFileType(ATag);
|
||||||
end;
|
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;
|
procedure TLazEditMainForm.TagMenuItemsAndActions;
|
||||||
@ -1946,21 +1963,25 @@ end;
|
|||||||
function TLazEditMainForm.AskFileNameSave(const Fn: String; const FileType: TEditorFileType): String;
|
function TLazEditMainForm.AskFileNameSave(const Fn: String; const FileType: TEditorFileType): String;
|
||||||
begin
|
begin
|
||||||
SaveDialog.Filter := OpenSaveFilter;
|
SaveDialog.Filter := OpenSaveFilter;
|
||||||
SaveDialog.FilterIndex := 0;
|
SaveDialog.FilterIndex := fiAllSupported;
|
||||||
if (Fn <> EmptyStr) then
|
if (Fn <> EmptyStr) then
|
||||||
begin
|
begin
|
||||||
SaveDialog.FileName := ExtractFileName(Fn);
|
SaveDialog.FileName := ExtractFileName(Fn);
|
||||||
SaveDialog.InitialDir := ExtractFileDir(Fn);
|
SaveDialog.InitialDir := ExtractFileDir(Fn);
|
||||||
//f/SaveDialog.FilterIndex := GetFilterIndexFromFileName(SaveDialog.Filter, Fn);
|
//SaveDialog.FilterIndex := GetFilterIndexFromFileName(SaveDialog.Filter, Fn);
|
||||||
//f/SaveDialog.DefaultExt := GetExtensionFromFilterAtIndex(SaveDialog.Filter, SaveDialog.FilterIndex);
|
SaveDialog.FilterIndex := FileTypeToFilterIndex(ExtToFileType(ExtractFileExt(Fn),AppOptions.FileTypeMaskList));
|
||||||
|
//SaveDialog.DefaultExt := GetExtensionFromFilterAtIndex(SaveDialog.Filter, SaveDialog.FilterIndex);
|
||||||
|
SaveDialog.DefaultExt := EmptyStr;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
if (FileType <> eftNone) then SaveDialog.FilterIndex := Ord(FileType);
|
if (FileType <> eftNone) then SaveDialog.FilterIndex := FileTypeToFilterIndex(FileType);
|
||||||
//f/SaveDialog.DefaultExt := GetExtensionFromFilterAtIndex(SaveDialog.Filter, SaveDialog.FilterIndex);
|
//SaveDialog.DefaultExt := GetExtensionFromFilterAtIndex(SaveDialog.Filter, SaveDialog.FilterIndex);
|
||||||
|
SaveDialog.DefaultExt := EmptyStr;
|
||||||
end;
|
end;
|
||||||
//debugln('SaveDialog.FilterIndex = ',dbgs(SaveDialog.FilterIndex));
|
//debugln('SaveDialog.FilterIndex = ',dbgs(SaveDialog.FilterIndex));
|
||||||
//debugln('SaveDialog.DefaultExt = ',SaveDialog.DefaultExt);
|
//debugln('SaveDialog.DefaultExt = ',SaveDialog.DefaultExt);
|
||||||
|
|
||||||
if SaveDialog.Execute then
|
if SaveDialog.Execute then
|
||||||
begin
|
begin
|
||||||
Result := SaveDialog.FileName;
|
Result := SaveDialog.FileName;
|
||||||
|
Reference in New Issue
Block a user