mirror of https://gitlab.com/basile.b/dexed.git
318 lines
7.6 KiB
Plaintext
318 lines
7.6 KiB
Plaintext
unit ce_term;
|
|
|
|
{$I ce_defines.inc}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
|
|
ce_widget, TerminalCtrls, ce_interfaces, ce_writableComponent, ce_observer,
|
|
ce_common, ce_synmemo;
|
|
|
|
type
|
|
|
|
// Terminal options
|
|
TCETerminalOptionsBase = class(TWritableLfmTextComponent)
|
|
private
|
|
fBackgroundColor: TColor;
|
|
fForegroundColor: TColor;
|
|
fSelectedColor: TColor;
|
|
fFollowEditors: boolean;
|
|
fFollowProjects: boolean;
|
|
fFollowExplorer: boolean;
|
|
fScrollbackLines: longword;
|
|
fFont: TFont;
|
|
procedure setFont(value: TFont);
|
|
public
|
|
constructor create(AOwner: TComponent); override;
|
|
destructor destroy; override;
|
|
procedure assign(value: TPersistent); override;
|
|
published
|
|
property backgroundColor: TColor read fBackgroundColor write fBackgroundColor;
|
|
property foregroundColor: TColor read fForegroundColor write fForegroundColor;
|
|
property selectedColor: TColor read fSelectedColor write fSelectedColor;
|
|
property font: TFont read fFont write setFont;
|
|
property followEditors: boolean read fFollowEditors write fFollowEditors;
|
|
property followProjects: boolean read fFollowProjects write fFollowProjects;
|
|
property followExplorer: boolean read fFollowExplorer write fFollowExplorer;
|
|
property scrollbackLines: longword read fScrollbackLines write fScrollbackLines default 512;
|
|
end;
|
|
|
|
// Editable and reversible Terminal options
|
|
TCETerminalOptions = class(TCETerminalOptionsBase, ICEEditableOptions)
|
|
private
|
|
fBackup: TCETerminalOptionsBase;
|
|
function optionedWantCategory(): string;
|
|
function optionedWantEditorKind: TOptionEditorKind;
|
|
function optionedWantContainer: TPersistent;
|
|
procedure optionedEvent(event: TOptionEditorEvent);
|
|
function optionedOptionsModified: boolean;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
procedure applyChanges;
|
|
end;
|
|
|
|
{ TCETermWidget }
|
|
|
|
TCETermWidget = class(TCEWidget, ICEDocumentObserver, ICEProjectObserver, ICEMiniExplorerObserver)
|
|
procedure ContentPaint(Sender: TObject);
|
|
private
|
|
fTerm: TTerminal;
|
|
fOpts: TCETerminalOptions;
|
|
fLastCd: string;
|
|
fNeedApplyChanges: boolean;
|
|
|
|
procedure docNew(document: TCESynMemo);
|
|
procedure docFocused(document: TCESynMemo);
|
|
procedure docChanged(document: TCESynMemo);
|
|
procedure docClosing(document: TCESynMemo);
|
|
|
|
procedure mnexDirectoryChanged(const directory: string);
|
|
|
|
procedure projNew(project: ICECommonProject);
|
|
procedure projChanged(project: ICECommonProject);
|
|
procedure projClosing(project: ICECommonProject);
|
|
procedure projFocused(project: ICECommonProject);
|
|
procedure projCompiling(project: ICECommonProject);
|
|
procedure projCompiled(project: ICECommonProject; success: boolean);
|
|
|
|
protected
|
|
|
|
procedure DoShow; override;
|
|
procedure SetVisible(Value: boolean); override;
|
|
|
|
public
|
|
constructor create(aOwner: TComponent); override;
|
|
destructor destroy; override;
|
|
end;
|
|
|
|
implementation
|
|
{$R *.lfm}
|
|
|
|
const
|
|
optFname = 'terminal.txt';
|
|
|
|
constructor TCETerminalOptionsBase.create(AOwner: TComponent);
|
|
begin
|
|
inherited;
|
|
fFont := TFont.Create;
|
|
fBackgroundColor:= clWhite;
|
|
fForegroundColor:= clBlack;
|
|
fSelectedColor:= clBlack;
|
|
fFont.Name:= 'Monospace';
|
|
fFont.Size:= 12;
|
|
fScrollbackLines:=512;
|
|
end;
|
|
|
|
destructor TCETerminalOptionsBase.destroy;
|
|
begin
|
|
fFont.Free;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TCETerminalOptionsBase.setFont(value: TFont);
|
|
begin
|
|
fFont.Assign(value);
|
|
end;
|
|
|
|
procedure TCETerminalOptionsBase.assign(value: TPersistent);
|
|
var
|
|
s: TCETerminalOptionsBase;
|
|
begin
|
|
if value is TCETerminalOptionsBase then
|
|
begin
|
|
s := TCETerminalOptionsBase(value);
|
|
fBackgroundColor:=s.fbackgroundColor;
|
|
fForegroundColor:=s.fForegroundColor;
|
|
fSelectedColor:=s.fSelectedColor;
|
|
followEditors:=s.fFollowEditors;
|
|
fFont.BeginUpdate;
|
|
fFont.Height:=fFont.Height+1;
|
|
fFont.Height:=fFont.Height-1;
|
|
fFont.Assign(s.font);
|
|
fFont.EndUpdate;
|
|
fScrollbackLines := s.fScrollbackLines;
|
|
end
|
|
else inherited;
|
|
end;
|
|
|
|
constructor TCETerminalOptions.Create(AOwner: TComponent);
|
|
begin
|
|
inherited;
|
|
fBackup := TCETerminalOptionsBase.Create(self);
|
|
end;
|
|
|
|
procedure TCETerminalOptions.applyChanges;
|
|
var
|
|
w: TCETermWidget;
|
|
begin
|
|
w := TCETermWidget(owner);
|
|
w.fTerm.backgroundColor:= backgroundColor;
|
|
w.fTerm.foregroundColor:= foregroundColor;
|
|
w.fTerm.selectedColor:= selectedColor;
|
|
w.fTerm.Font.BeginUpdate;
|
|
w.fTerm.Font.Assign(fFont);
|
|
// force the change: assigning does always trigger TTerminal.FontChanged.
|
|
w.fTerm.Font.Size := w.fTerm.Font.Size +1;
|
|
w.fTerm.Font.Size := w.fTerm.Font.Size -1;
|
|
w.fTerm.Font.endUpdate;
|
|
w.fTerm.scrollbackLines:=fScrollbackLines;
|
|
end;
|
|
|
|
function TCETerminalOptions.optionedWantCategory(): string;
|
|
begin
|
|
result := 'Terminal';
|
|
end;
|
|
|
|
function TCETerminalOptions.optionedWantEditorKind: TOptionEditorKind;
|
|
begin
|
|
result := oekGeneric;
|
|
end;
|
|
|
|
function TCETerminalOptions.optionedWantContainer: TPersistent;
|
|
begin
|
|
result := self;
|
|
end;
|
|
|
|
procedure TCETerminalOptions.optionedEvent(event: TOptionEditorEvent);
|
|
begin
|
|
case event of
|
|
oeeAccept:
|
|
begin
|
|
fBackup.assign(self);
|
|
applyChanges;
|
|
end;
|
|
oeeCancel:
|
|
begin
|
|
self.assign(fBackup);
|
|
applyChanges;
|
|
end;
|
|
oeeChange:
|
|
begin
|
|
applyChanges;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TCETerminalOptions.optionedOptionsModified: boolean;
|
|
begin
|
|
result := false;
|
|
end;
|
|
|
|
constructor TCETermWidget.create(aOwner: TComponent);
|
|
var
|
|
f: string;
|
|
begin
|
|
inherited;
|
|
toolbarVisible:=false;
|
|
fTerm := TTerminal.Create(self);
|
|
fTerm.Align:= alClient;
|
|
fTerm.BorderSpacing.Around:=4;
|
|
fterm.Parent := self;
|
|
|
|
fOpts:= TCETerminalOptions.Create(self);
|
|
|
|
f := getDocPath + optFname;
|
|
if f.fileExists then
|
|
fOpts.loadFromFile(f);
|
|
|
|
EntitiesConnector.addObserver(fOpts);
|
|
end;
|
|
|
|
destructor TCETermWidget.destroy;
|
|
begin
|
|
fOpts.saveToFile(getDocPath + optFname);
|
|
EntitiesConnector.removeObserver(fOpts);
|
|
inherited;
|
|
end;
|
|
|
|
procedure TCETermWidget.DoShow;
|
|
begin
|
|
inherited;
|
|
fNeedApplyChanges := true;
|
|
end;
|
|
|
|
procedure TCETermWidget.SetVisible(Value: boolean);
|
|
begin
|
|
inherited;
|
|
if Value then
|
|
fNeedApplyChanges := true;
|
|
end;
|
|
|
|
procedure TCETermWidget.ContentPaint(Sender: TObject);
|
|
begin
|
|
if not fNeedApplyChanges then
|
|
exit;
|
|
fNeedApplyChanges:=false;
|
|
fOpts.applyChanges;
|
|
end;
|
|
|
|
procedure TCETermWidget.mnexDirectoryChanged(const directory: string);
|
|
begin
|
|
if fOpts.followExplorer and directory.dirExists and
|
|
not SameText(directory, fLastCd) then
|
|
begin
|
|
fLastCd := directory;
|
|
fTerm.Command('cd ' + directory);
|
|
end;
|
|
end;
|
|
|
|
procedure TCETermWidget.docNew(document: TCESynMemo);
|
|
begin
|
|
end;
|
|
|
|
procedure TCETermWidget.docFocused(document: TCESynMemo);
|
|
var
|
|
s: string;
|
|
begin
|
|
s := document.fileName.extractFileDir;
|
|
if fOpts.followEditors and s.fileExists and not SameText(s, fLastCd) then
|
|
begin
|
|
fLastCd := s;
|
|
fTerm.Command('cd ' + s);
|
|
end;
|
|
end;
|
|
|
|
procedure TCETermWidget.docChanged(document: TCESynMemo);
|
|
begin
|
|
end;
|
|
|
|
procedure TCETermWidget.docClosing(document: TCESynMemo);
|
|
begin
|
|
end;
|
|
|
|
procedure TCETermWidget.projNew(project: ICECommonProject);
|
|
begin
|
|
end;
|
|
|
|
procedure TCETermWidget.projChanged(project: ICECommonProject);
|
|
begin
|
|
end;
|
|
|
|
procedure TCETermWidget.projClosing(project: ICECommonProject);
|
|
begin
|
|
end;
|
|
|
|
procedure TCETermWidget.projFocused(project: ICECommonProject);
|
|
var
|
|
s: string;
|
|
begin
|
|
s := project.fileName.extractFileDir;
|
|
if fOpts.followProjects and s.dirExists and not SameText(s, fLastCd) then
|
|
begin
|
|
fLastCd := s;
|
|
fTerm.Command('cd ' + s);
|
|
end;
|
|
end;
|
|
|
|
procedure TCETermWidget.projCompiling(project: ICECommonProject);
|
|
begin
|
|
end;
|
|
|
|
procedure TCETermWidget.projCompiled(project: ICECommonProject; success: boolean);
|
|
begin
|
|
end;
|
|
|
|
end.
|
|
|