ADD: added integration with MacOS (#530)

* ADD: MacOS: added integration with MacOS. using the system context 'services' menu, reveal selected folder or file in Double Commander (for all apps including Finder.app)

* FIX: Free Resource
This commit is contained in:
rich2014 2022-08-09 02:23:37 +08:00 committed by GitHub
commit cf0e895b45
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 95 additions and 19 deletions

Binary file not shown.

View file

@ -53,6 +53,8 @@ uses
, Qt5, QtWidgets
{$ELSEIF DEFINED(LCLGTK2)}
, Glib2, Gtk2
{$ELSEIF DEFINED(DARWIN)}
, uMyDarwin
{$ENDIF}
, Types, LMessages;
@ -865,6 +867,10 @@ type
procedure RestoreWindow;
procedure LoadTabs;
procedure LoadTabsCommandLine(Params: TCommandLineParams);
procedure AddTab(ANoteBook: TFileViewNotebook; aPath: String);
{$IF DEFINED(DARWIN)}
procedure OnNSServiceOpenWithNewTab( filenames:TStringList );
{$ENDIF}
procedure LoadWindowState;
procedure SaveWindowState;
@ -1207,6 +1213,10 @@ begin
UpdateSelectedDrives;
UpdateFreeSpace(fpLeft, True);
UpdateFreeSpace(fpRight, True);
{$IF DEFINED(DARWIN)}
InitNSServiceProvider( @OnNSServiceOpenWithNewTab );
{$ENDIF}
end;
procedure TfrmMain.btnLeftClick(Sender: TObject);
@ -6007,24 +6017,6 @@ end;
procedure TfrmMain.LoadTabsCommandLine(Params: TCommandLineParams);
procedure AddTab(ANoteBook: TFileViewNotebook; aPath: String);
var
Page: TFileViewPage;
AFileView: TFileView;
AFileViewFlags: TFileViewFlags;
aFileSource: IFileSource;
begin
Page := ANoteBook.AddPage;
aFileSource := TFileSystemFileSource.GetFileSource;
if gDelayLoadingTabs then
AFileViewFlags := [fvfDelayLoadingFiles]
else
AFileViewFlags := [];
AFileView := TColumnsFileView.Create(Page, aFileSource, aPath, AFileViewFlags);
AssignEvents(AFileView);
ANoteBook.PageIndex := ANoteBook.PageCount - 1;
end;
procedure LoadPanel(aNoteBook: TFileViewNotebook; aPath: String);
begin
if Length(aPath) <> 0 then
@ -6067,6 +6059,36 @@ begin
ActiveFrame.SetFocus;
end;
procedure TfrmMain.AddTab(ANoteBook: TFileViewNotebook; aPath: String);
var
Page: TFileViewPage;
AFileView: TFileView;
AFileViewFlags: TFileViewFlags;
aFileSource: IFileSource;
begin
Page := ANoteBook.AddPage;
aFileSource := TFileSystemFileSource.GetFileSource;
if gDelayLoadingTabs then
AFileViewFlags := [fvfDelayLoadingFiles]
else
AFileViewFlags := [];
AFileView := TColumnsFileView.Create(Page, aFileSource, aPath, AFileViewFlags);
AssignEvents(AFileView);
ANoteBook.PageIndex := ANoteBook.PageCount - 1;
end;
{$IF DEFINED(DARWIN)}
procedure TfrmMain.OnNSServiceOpenWithNewTab( filenames:TStringList );
begin
if Assigned(filenames) and (filenames.Count>0) then
begin
AddTab( nbRight, filenames[0] );
SetActiveFrame(fpRight);
ActiveFrame.SetFocus;
end;
end;
{$ENDIF}
procedure TfrmMain.LoadWindowState;
var
ANode: TXmlNode;

View file

@ -28,7 +28,7 @@ unit uMyDarwin;
interface
uses
Classes, SysUtils, MacOSAll, CocoaAll;
Classes, SysUtils, MacOSAll, CocoaAll, CocoaUtils, CocoaInt, InterfaceBase;
function NSGetTempPath: String;
@ -40,14 +40,68 @@ function NSGetFolderPath(Folder: NSSearchPathDirectory): String;
function GetFileDescription(const FileName: String): String;
function MountNetworkDrive(const serverAddress: String): Boolean;
type TNSServiceProviderCallBack = Procedure( filenames:TStringList ) of object;
type TNSServiceProvider = objcclass(NSObject)
public
onOpenWithNewTab: TNSServiceProviderCallBack;
public
procedure openWithNewTab( pboard:NSPasteboard; userData:NSString; error:NSStringPtr ); message 'openWithNewTab:userData:error:';
end;
procedure InitNSServiceProvider( callback:TNSServiceProviderCallBack );
var
HasMountURL: Boolean = False;
NSServiceProvider: TNSServiceProvider;
implementation
uses
DynLibs;
procedure InitNSServiceProvider( callback:TNSServiceProviderCallBack );
begin
if not Assigned(NSServiceProvider) then
begin
NSServiceProvider:= TNSServiceProvider.alloc.init;
NSServiceProvider.onOpenWithNewTab:= callback;
TCocoaWidgetSet(WidgetSet).NSApp.setServicesProvider( NSServiceProvider );
NSUpdateDynamicServices;
end;
end;
function NSArrayToList(const theArray:NSArray): TStringList;
var
i: Integer;
list : TStringList;
begin
list := TStringList.Create;
for i := 0 to theArray.Count-1 do
begin
list.Add( NSStringToString( theArray.objectAtIndex(i) ) );
end;
Result := list;
end;
procedure TNSServiceProvider.openWithNewTab( pboard:NSPasteboard; userData:NSString; error:NSStringPtr );
var
filenameArray{, lClasses}: NSArray;
filenameList: TStringList;
begin
filenameArray := pboard.propertyListForType(NSFilenamesPboardType);
if filenameArray <> nil then
begin
if Assigned(onOpenWithNewTab) then
begin
filenameList:= NSArrayToList( filenameArray );
onOpenWithNewTab( filenameList );
FreeAndNil( filenameList );
end;
end;
end;
function NSGetTempPath: String;
begin
Result:= IncludeTrailingBackslash(NSTemporaryDirectory.UTF8String);