mirror of
https://github.com/doublecmd/doublecmd.git
synced 2026-06-21 09:58:13 +00:00
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:
parent
cb21bfedb8
commit
cf0e895b45
3 changed files with 95 additions and 19 deletions
Binary file not shown.
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue