From c35cc3c92c4055f76233ee02a5cb52e2a392d88e Mon Sep 17 00:00:00 2001 From: Basile Burg Date: Mon, 4 Jul 2016 05:44:08 +0200 Subject: [PATCH] fix file protocol and anchors, close #80 (not for changelog) --- src/ce_common.pas | 64 +++++++++++++++++++++++++++++++++++++++++++--- src/ce_synmemo.pas | 2 +- 2 files changed, 62 insertions(+), 4 deletions(-) diff --git a/src/ce_common.pas b/src/ce_common.pas index 38efae52..66ddd83a 100644 --- a/src/ce_common.pas +++ b/src/ce_common.pas @@ -8,14 +8,14 @@ uses Classes, SysUtils, {$IFDEF WINDOWS} - Windows, JwaTlHelp32, + Windows, JwaTlHelp32, registry, {$ELSE} ExtCtrls, FileUtil, LazFileUtils, {$ENDIF} {$IFNDEF CEBUILD} forms, {$ENDIF} - process, asyncprocess, ghashmap, ghashset; + process, asyncprocess, ghashmap, ghashset, LCLIntf; const exeExt = {$IFDEF WINDOWS} '.exe' {$ELSE} '' {$ENDIF}; @@ -280,11 +280,17 @@ type *) function indentationMode(strings: TStrings): TIndentationMode; - (** + (** * Detects the main indetation mode used in a file *) function indentationMode(const fname: string): TIndentationMode; + (** + * like LCLIntf eponymous function but includes a woraround that's gonna + * be in Lazarus from version 1.8 (anchor + file:/// protocol under win). + *) + function openUrl(const value: string): boolean; + var // supplementatl directories to find background tools additionalPath: string; @@ -1243,6 +1249,58 @@ begin end; end; +function openUrl(const value: string): boolean; +{$IFDEF WINDOWS} +function GetDefaultBrowserForCurrentUser: String; +begin + result := ''; + with TRegistry.Create do + try + RootKey := HKEY_CURRENT_USER; + if OpenKeyReadOnly('Software\Classes\http\shell\open\command') then + begin + result := ReadString(''); + CloseKey; + end; + finally + Free; + end; +end; +var + browser: string; + i: integer = 2; +{$ENDIF} +begin + {$IFNDEF WINDOWS} + result := LCLIntf.OpenURL(value); + {$ELSE} + if pos('file://', value) = 0 then + result := LCLIntf.OpenURL(value) + else + begin + browser := GetDefaultBrowserForCurrentUser; + if browser.isEmpty then + result := LCLIntf.OpenURL(value) + else + begin + if browser[1] = '"' then + begin + while browser[i] <> '"' do + begin + if i > browser.length then + break; + i += 1; + end; + if i <= browser.length then + browser := browser[1..i]; + end; + result := ShellExecuteW(0, 'open', PWideChar(WideString(browser)), + PWideChar(WideString(value)), nil, SW_SHOWNORMAL) > 32; + end; + end; + {$ENDIF} +end; + initialization registerClasses([TCEPersistentShortcut]); end. diff --git a/src/ce_synmemo.pas b/src/ce_synmemo.pas index bc65182a..9d1944ab 100644 --- a/src/ce_synmemo.pas +++ b/src/ce_synmemo.pas @@ -9,7 +9,7 @@ uses SynEdit, SynPluginSyncroEdit, SynCompletion, SynEditKeyCmds, LazSynEditText, SynHighlighterLFM, SynEditHighlighter, SynEditMouseCmds, SynEditFoldedView, SynEditMarks, SynEditTypes, SynHighlighterJScript, SynBeautifier, dialogs, - fpjson, jsonparser, LCLIntf, + fpjson, jsonparser, ce_common, ce_observer, ce_writableComponent, ce_d2syn, ce_txtsyn, ce_dialogs, ce_sharedres, ce_dlang, ce_stringrange;