📄 syneditmiscclasses.pas
字号:
end;
procedure TSynGutter.SetVisible(Value: boolean);
begin
if fVisible <> Value then begin
fVisible := Value;
if Assigned(fOnChange) then fOnChange(Self);
end;
end;
procedure TSynGutter.SetWidth(Value: integer);
begin
Value := Max(0, Value);
if fWidth <> Value then begin
fWidth := Value;
if Assigned(fOnChange) then fOnChange(Self);
end;
end;
procedure TSynGutter.SetZeroStart(const Value: boolean);
begin
if fZeroStart <> Value then begin
fZeroStart := Value;
if Assigned(fOnChange) then fOnChange(Self);
end;
end;
procedure TSynGutter.SetBorderStyle(const Value: TSynGutterBorderStyle);
begin
fBorderStyle := Value;
if Assigned(fOnChange) then fOnChange(Self);
end;
{ TSynBookMarkOpt }
constructor TSynBookMarkOpt.Create(AOwner: TComponent);
begin
inherited Create;
fDrawBookmarksFirst := TRUE;
fEnableKeys := True;
fGlyphsVisible := True;
fLeftMargin := 2;
fOwner := AOwner;
fXOffset := 12;
end;
procedure TSynBookMarkOpt.Assign(Source: TPersistent); //jcr 2000-12-08
var
Src: TSynBookMarkOpt;
begin
if (Source <> nil) and (Source is TSynBookMarkOpt) then begin
Src := TSynBookMarkOpt(Source);
fBookmarkImages := Src.fBookmarkImages;
fDrawBookmarksFirst := Src.fDrawBookmarksFirst;
fEnableKeys := Src.fEnableKeys;
fGlyphsVisible := Src.fGlyphsVisible;
fLeftMargin := Src.fLeftMargin;
fXoffset := Src.fXoffset;
if Assigned(fOnChange) then fOnChange(Self);
end else
inherited Assign(Source);
end;
procedure TSynBookMarkOpt.SetBookmarkImages(const Value: TImageList);
begin
if fBookmarkImages <> Value then begin
fBookmarkImages := Value;
if Assigned(fBookmarkImages) then fBookmarkImages.FreeNotification(fOwner);
if Assigned(fOnChange) then fOnChange(Self);
end;
end;
procedure TSynBookMarkOpt.SetDrawBookmarksFirst(Value: boolean);
begin
if Value <> fDrawBookmarksFirst then begin
fDrawBookmarksFirst := Value;
if Assigned(fOnChange) then fOnChange(Self);
end;
end;
procedure TSynBookMarkOpt.SetGlyphsVisible(Value: Boolean);
begin
if fGlyphsVisible <> Value then begin
fGlyphsVisible := Value;
if Assigned(fOnChange) then fOnChange(Self);
end;
end;
procedure TSynBookMarkOpt.SetLeftMargin(Value: Integer);
begin
if fLeftMargin <> Value then begin
fLeftMargin := Value;
if Assigned(fOnChange) then fOnChange(Self);
end;
end;
procedure TSynBookMarkOpt.SetXOffset(Value: integer);
begin
if fXOffset <> Value then begin
fXOffset := Value;
if Assigned(fOnChange) then fOnChange(Self);
end;
end;
{ TSynMethodChain }
procedure TSynMethodChain.Add(AEvent: TMethod);
begin
if not Assigned(@AEvent) then
raise ESynMethodChain.CreateFmt(
'%s.Entry : the parameter `AEvent'' must be specified.', [ClassName]);
with FNotifyProcs, AEvent do
begin
Add(Code);
Add(Data);
end
end;
constructor TSynMethodChain.Create;
begin
inherited;
FNotifyProcs := TList.Create;
end;
destructor TSynMethodChain.Destroy;
begin
FNotifyProcs.Free;
inherited;
end;
function TSynMethodChain.DoHandleException(E: Exception): Boolean;
begin
if not Assigned(FExceptionHandler) then
raise E
else
try
Result := True;
FExceptionHandler(Self, E, Result);
except
raise ESynMethodChain.CreateFmt(
'%s.DoHandleException : MUST NOT occur any kind of exception in '+
'ExceptionHandler', [ClassName]);
end;
end;
procedure TSynMethodChain.Fire;
var
AMethod: TMethod;
i: Integer;
begin
i := 0;
with FNotifyProcs, AMethod do
while i < Count do
try
repeat
Code := Items[i];
Inc(i);
Data := Items[i];
Inc(i);
DoFire(AMethod)
until i >= Count;
except
on E: Exception do
if not DoHandleException(E) then
i := MaxInt;
end;
end;
procedure TSynMethodChain.Remove(AEvent: TMethod);
var
i: Integer;
begin
if not Assigned(@AEvent) then
raise ESynMethodChain.CreateFmt(
'%s.Remove: the parameter `AEvent'' must be specified.', [ClassName]);
with FNotifyProcs, AEvent do
begin
i := Count - 1;
while i > 0 do
if Items[i] <> Data then
Dec(i, 2)
else
begin
Dec(i);
if Items[i] = Code then
begin
Delete(i);
Delete(i);
end;
Dec(i);
end;
end;
end;
{ TSynNotifyEventChain }
procedure TSynNotifyEventChain.Add(AEvent: TNotifyEvent);
begin
inherited Add(TMethod(AEvent));
end;
constructor TSynNotifyEventChain.CreateEx(ASender: TObject);
begin
inherited Create;
FSender := ASender;
end;
procedure TSynNotifyEventChain.DoFire(AEvent: TMethod);
begin
TNotifyEvent(AEvent)(FSender);
end;
procedure TSynNotifyEventChain.Remove(AEvent: TNotifyEvent);
begin
inherited Remove(TMethod(AEvent));
end;
{ TSynInternalImage }
type
TInternalResource = class (TObject)
public
UsageCount : Integer;
Name : string;
Bitmap : TBitmap;
end;
var
InternalResources: TList;
constructor TSynInternalImage.Create(aModule: THandle; const Name: string; Count: integer);
begin
inherited Create;
fImages := CreateBitmapFromInternalList( aModule, Name );
fWidth := (fImages.Width + Count shr 1) div Count;
fHeight := fImages.Height;
fCount := Count;
end;
destructor TSynInternalImage.Destroy;
begin
FreeBitmapFromInternalList;
inherited Destroy;
end;
function TSynInternalImage.CreateBitmapFromInternalList(aModule: THandle; const Name: string): TBitmap;
var
idx: Integer;
newIntRes: TInternalResource;
begin
{ There is no list until now }
if (InternalResources = nil) then
InternalResources := TList.Create;
{ Search the list for the needed resource }
for idx := 0 to InternalResources.Count - 1 do
if (TInternalResource (InternalResources[idx]).Name = UpperCase (Name)) then
with TInternalResource (InternalResources[idx]) do begin
UsageCount := UsageCount + 1;
Result := Bitmap;
exit;
end;
{ There is no loaded resource in the list so let's create a new one }
Result := TBitmap.Create;
Result.LoadFromResourceName( aModule, Name );
{ Add the new resource to our list }
newIntRes:= TInternalResource.Create;
newIntRes.UsageCount := 1;
newIntRes.Name := UpperCase (Name);
newIntRes.Bitmap := Result;
InternalResources.Add (newIntRes);
end;
procedure TSynInternalImage.FreeBitmapFromInternalList;
var
idx: Integer;
intRes: TInternalResource;
function FindImageInList: Integer;
begin
for Result := 0 to InternalResources.Count - 1 do
if (TInternalResource (InternalResources[Result]).Bitmap = fImages) then
exit;
Result := -1;
end;
begin
{ Search the index of our resource in the list }
idx := FindImageInList;
{ Ey, what's this ???? }
if (idx = -1) then
exit;
{ Decrement the usagecount in the object. If there are no more users
remove the object from the list and free it }
intRes := TInternalResource (InternalResources[idx]);
with intRes do begin
UsageCount := UsageCount - 1;
if (UsageCount = 0) then begin
Bitmap.Free;
InternalResources.Delete (idx);
intRes.Free;
end;
end;
{ If there are no more entries in the list free it }
if (InternalResources.Count = 0) then begin
InternalResources.Free;
InternalResources := nil;
end;
end;
procedure TSynInternalImage.DrawMark(ACanvas: TCanvas;
Number, X, Y, LineHeight: integer);
var
rcSrc, rcDest: TRect;
begin
if (Number >= 0) and (Number < fCount) then
begin
if LineHeight >= fHeight then begin
rcSrc := Rect(Number * fWidth, 0, (Number + 1) * fWidth, fHeight);
Inc(Y, (LineHeight - fHeight) div 2);
rcDest := Rect(X, Y, X + fWidth, Y + fHeight);
end else begin
rcDest := Rect(X, Y, X + fWidth, Y + LineHeight);
Y := (fHeight - LineHeight) div 2;
rcSrc := Rect(Number * fWidth, Y, (Number + 1) * fWidth,
Y + LineHeight);
end;
ACanvas.CopyRect(rcDest, fImages.Canvas, rcSrc);
end;
end;
procedure TSynInternalImage.DrawMarkTransparent(ACanvas: TCanvas; Number, X, Y,
LineHeight: integer; TransparentColor: TColor);
var
rcSrc, rcDest: TRect;
begin
if (Number >= 0) and (Number < fCount) then
begin
if LineHeight >= fHeight then begin
rcSrc := Rect(Number * fWidth, 0, (Number + 1) * fWidth, fHeight);
Inc(Y, (LineHeight - fHeight) div 2);
rcDest := Rect(X, Y, X + fWidth, Y + fHeight);
end else begin
rcDest := Rect(X, Y, X + fWidth, Y + LineHeight);
Y := (fHeight - LineHeight) div 2;
rcSrc := Rect(Number * fWidth, Y, (Number + 1) * fWidth,
Y + LineHeight);
end;
{$IFDEF SYN_CLX}
ACanvas.CopyMode := cmMergeCopy;
ACanvas.CopyRect(rcDest, fImages.Canvas, rcSrc);
{$ELSE}
ACanvas.BrushCopy(rcDest, fImages, rcSrc, TransparentColor);
{$ENDIF}
end;
end;
{ TSynHotKey }
function RemoveStates(St: string): string;
begin
if Copy(St, 1, 5) = 'Ctrl+' then
Delete(St, 1, 5);
if Copy(St, 1, 4) = 'Alt+' then
Delete(St, 1, 4);
if Copy(St, 1, 6) = 'Shift+' then
Delete(St, 1, 6);
Result := St;
end;
procedure TSynHotKey.DoExit;
begin
inherited;
if (length(Text) > 0) and (RemoveStates(Text) = '') then
begin
Text := 'None';
SelStart := length(Text);
end;
end;
function TSynHotKey.GetHotKey: TShortcut;
begin
{$IFDEF SYN_CLX}
Result := QMenus.TextToShortCut(Text);
{$ELSE}
Result := Menus.TextToShortCut(Text);
{$ENDIF}
end;
procedure TSynHotKey.KeyDown(var Key: Word; Shift: TShiftState);
const
{$IFDEF SYN_CLX}
ShortCutToText: function (aKey: TShortCut): WideString = QMenus.ShortCutToText;
VK_CONTROL = Key_Control;
VK_MENU = Key_Alt;
VK_SHIFT = Key_Shift;
{$ELSE}
ShortCutToText: function (aKey: TShortCut): string = Menus.ShortCutToText;
{$ENDIF}
VAR TmpString : String;
begin
// inherited;
TmpString := '';
if ssCtrl in Shift then
TmpString := TmpString + ShortCutToText(VK_CONTROL) + '+';
if ssAlt in Shift then
TmpString := TmpString + ShortCutToText(VK_MENU) + '+';
if ssShift in Shift then
TmpString := TmpString + ShortCutToText(VK_SHIFT) + '+';
if (key = SYNEDIT_CONTROL) or (key = SYNEDIT_MENU) or (key = SYNEDIT_SHIFT) then
begin
//Nothing, the Shift state takes care of it
end else begin
{$IFDEF SYN_CLX}
TmpString := TmpString + QMenus.ShortCutToText(Key);
{$ELSE}
TmpString := TmpString + Menus.ShortCutToText(Key);
{$ENDIF}
end;
if Text <> TmpString then
Text := TmpString;
SelStart := length(Text);
end;
procedure TSynHotKey.KeyPress(var Key: Char);
begin
// inherited;
if (length(Text) > 0) and (RemoveStates(Text) <> '') then
Key := #0;
end;
procedure TSynHotKey.KeyUp(var Key: Word; Shift: TShiftState);
begin
// inherited;
if (length(Text) > 0) and (RemoveStates(Text) = '') then
begin
Text := 'None';
SelStart := length(Text);
end;
end;
procedure TSynHotKey.SetHotKey(const Value: TShortcut);
begin
if Value = 0 then
Text := 'None'
else
{$IFDEF SYN_CLX}
Text := QMenus.ShortCutToText(Value);
{$ELSE}
Text := Menus.ShortCutToText(Value);
{$ENDIF}
SelStart := length(Text);
end;
{$IFDEF SYN_CLX}
{$ELSE}
procedure TSynHotKey.WMGetDlgCode(var Message: TWMGetDlgCode);
begin
inherited;
// Message.Result := Message.Result or DLGC_WANTTAB //This is causing an invalid pointer op right now.
end;
{$ENDIF}
{$IFDEF SYN_WIN32}
{$IFNDEF SYN_COMPILER_4_UP}
{ TBetterRegistry }
function TBetterRegistry.OpenKeyReadOnly(const Key: string): Boolean;
function IsRelative(const Value: string): Boolean;
begin
Result := not ((Value <> '') and (Value[1] = '\'));
end;
var
TempKey: HKey;
S: string;
Relative: Boolean;
begin
S := Key;
Relative := IsRelative(S);
if not Relative then Delete(S, 1, 1);
TempKey := 0;
Result := RegOpenKeyEx(GetBaseKey(Relative), PChar(S), 0,
KEY_READ, TempKey) = ERROR_SUCCESS;
if Result then
begin
if (CurrentKey <> 0) and Relative then S := CurrentPath + '\' + S;
ChangeKey(TempKey, S);
end;
end; { TBetterRegistry.OpenKeyReadOnly }
{$ENDIF}
{$ENDIF}
begin
InternalResources := nil;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -