1250 lines
29 KiB
ObjectPascal

unit formmain;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ExtCtrls, Spin, ComCtrls, Menus, LclIntf,
ATStrings,
ATStringProc,
ATSynEdit,
ATSynEdit_CanvasProc,
ATSynEdit_Carets,
ATSynEdit_Finder,
ATSynEdit_Export_HTML,
formkey,
formopt,
formcombo,
formfind;
type
{ TfmMain }
TfmMain = class(TForm)
ApplicationProperties1: TApplicationProperties;
bFont: TButton;
bOpt: TButton;
btnStop: TButton;
btnMarker: TButton;
chkGutter: TCheckBox;
chkMicromap: TCheckBox;
chkMinimap: TCheckBox;
chkRuler: TCheckBox;
chkUnprintEnd: TCheckBox;
chkUnprintEndDet: TCheckBox;
chkUnprintSp: TCheckBox;
chkUnprintVis: TCheckBox;
chkWrapIndent: TCheckBox;
chkWrapMargin: TRadioButton;
chkWrapOff: TRadioButton;
chkWrapOn: TRadioButton;
edFontsize: TSpinEdit;
edMarRt: TSpinEdit;
edSpaceX: TSpinEdit;
edSpaceY: TSpinEdit;
edTabsize: TSpinEdit;
FontDialog1: TFontDialog;
gUnpri: TGroupBox;
gWrap: TGroupBox;
Label1: TLabel;
Label10: TLabel;
Label11: TLabel;
Label2: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label9: TLabel;
MainMenu1: TMainMenu;
Memo1: TMemo;
MenuItem1: TMenuItem;
mnuFileHtml: TMenuItem;
mnuFindNext: TMenuItem;
mnuFind: TMenuItem;
MenuItem5: TMenuItem;
MenuItem9: TMenuItem;
mnuSyntax: TMenuItem;
mnuEnc: TMenuItem;
mnuOptSave: TMenuItem;
mnuOptLoad: TMenuItem;
MenuItem2: TMenuItem;
mnuHelpMous: TMenuItem;
MenuItem3: TMenuItem;
MenuItem4: TMenuItem;
MenuItem6: TMenuItem;
MenuItem7: TMenuItem;
MenuItem8: TMenuItem;
mnuOpts: TMenuItem;
mnuBms: TMenuItem;
mnuOneLine: TMenuItem;
mnuPane: TMenuItem;
mnuUnderline: TMenuItem;
mnuTCaret1: TMenuItem;
mnuOptDlg: TMenuItem;
mnuTBms: TMenuItem;
mnuTMargin: TMenuItem;
mnuFile: TMenuItem;
mnuHlp: TMenuItem;
mnuFileEnd: TMenuItem;
mnuTst: TMenuItem;
mnuTCaretK: TMenuItem;
mnuEndWin: TMenuItem;
mnuEndUnix: TMenuItem;
mnuEndMac: TMenuItem;
mnuHelpKey: TMenuItem;
mnuFileOpen: TMenuItem;
mnuFileSav: TMenuItem;
mnuGoto: TMenuItem;
OpenDialog1: TOpenDialog;
PanelMain: TPanel;
PanelRt: TPanel;
PopupBookmk: TPopupMenu;
PopupFold: TPopupMenu;
PopupMinimap: TPopupMenu;
PopupMicromap: TPopupMenu;
PopupRuler: TPopupMenu;
PopupNums: TPopupMenu;
progress: TProgressBar;
SaveDialog1: TSaveDialog;
Status: TStatusBar;
StatusMsg: TStatusBar;
TimerHint: TTimer;
procedure bGotoClick(Sender: TObject);
procedure btnMarkerClick(Sender: TObject);
procedure btnStopClick(Sender: TObject);
procedure FinderProgress(Sender: TObject; ACurPos, AMaxPos: integer;
var AContinue: boolean);
procedure mnuFileHtmlClick(Sender: TObject);
procedure mnuFileOpenClick(Sender: TObject);
procedure bFontClick(Sender: TObject);
procedure bAddCrtClick(Sender: TObject);
procedure mnuFileSaveClick(Sender: TObject);
procedure bKeymapClick(Sender: TObject);
procedure bOptClick(Sender: TObject);
procedure mnuFindClick(Sender: TObject);
procedure mnuFindNextClick(Sender: TObject);
procedure mnuSyntaxClick(Sender: TObject);
procedure TimerHintTimer(Sender: TObject);
procedure UpdateEnc;
procedure mnuHelpMousClick(Sender: TObject);
procedure btnLoadClick(Sender: TObject);
procedure btnSaveClick(Sender: TObject);
procedure chkGutterChange(Sender: TObject);
procedure chkMicromapChange(Sender: TObject);
procedure chkMinimapChange(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure mnuBmsClick(Sender: TObject);
procedure mnuOneLineClick(Sender: TObject);
procedure mnuPaneClick(Sender: TObject);
procedure chkRulerChange(Sender: TObject);
procedure chkUnprintVisChange(Sender: TObject);
procedure chkUnprintEndChange(Sender: TObject);
procedure chkUnprintEndDetChange(Sender: TObject);
procedure chkUnprintSpChange(Sender: TObject);
procedure chkWrapMarginChange(Sender: TObject);
procedure chkWrapOffChange(Sender: TObject);
procedure chkWrapOnChange(Sender: TObject);
procedure chkWrapIndentChange(Sender: TObject);
procedure edFontsizeChange(Sender: TObject);
procedure edMarRtChange(Sender: TObject);
procedure edSpaceXChange(Sender: TObject);
procedure edSpaceYChange(Sender: TObject);
procedure edTabsizeChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure mnuEndMacClick(Sender: TObject);
procedure mnuEndUnixClick(Sender: TObject);
procedure mnuEndWinClick(Sender: TObject);
procedure mnuUnderlineClick(Sender: TObject);
procedure mnuLockClick(Sender: TObject);
procedure mnuTBmsClick(Sender: TObject);
procedure mnuTCaret1Click(Sender: TObject);
procedure mnuTMarginClick(Sender: TObject);
procedure mnuUnlockClick(Sender: TObject);
private
{ private declarations }
ed: TATSynEdit;
wait: boolean;
FDir: string;
FFileName: string;
FFinder: TATEditorFinder;
FFindStopped: boolean;
FFindConfirmAll: TModalResult;
FFindMarkAll: boolean;
procedure DoAddEnc(Sub, SName: string);
procedure FinderBadRegex(Sender: TObject);
procedure FinderConfirmReplace(Sender: TObject; APos1, APos2: TPoint;
AForMany: boolean; var AConfirm, AContinue: boolean);
procedure DoFindError;
procedure DoOpen(const fn: string; ADetectEnc: boolean);
procedure DoSetEnc(const Str: string);
procedure EditChanged(Sender: TObject);
procedure EditCaretMoved(Sender: TObject);
procedure EditDrawLine(Sender: TObject; C: TCanvas; AX, AY: integer;
const AStr: atString; ACharSize: TPoint; const AExtent: TATIntArray);
procedure EditCalcLine(Sender: TObject; var AParts: TATLineParts;
ALineIndex, ACharIndex, ALineLen: integer; var AColorAfterEol: TColor);
procedure EditScroll(Sender: TObject);
procedure EditCommand(Sender: TObject; ACmd{%H-}: integer; const AText: string; var AHandled: boolean);
procedure EditClickGutter(Sender: TObject; ABand, ALine: integer);
procedure EditClickMicromap(Sender: TObject; AX, AY: integer);
procedure EditDrawBm(Sender: TObject; C: TCanvas; ALineNum{%H-}: integer; const ARect: TRect);
procedure EditDrawMicromap(Sender: TObject; C: TCanvas; const ARect: TRect);
procedure EditDrawTest(Sender: TObject; C: TCanvas; const ARect: TRect);
procedure FinderFound(Sender: TObject; APos1, APos2: TPoint);
procedure FinderUpdateEditor(AUpdateText: boolean);
procedure MenuEncClick(Sender: TObject);
procedure MsgStatus(const S: string);
procedure UpdateStatus;
procedure UpdateChecks;
public
{ public declarations }
end;
var
fmMain: TfmMain;
implementation
uses
Types, Math,
LCLType, LCLProc,
atsynedit_commands;
{$R *.lfm}
const
sEncAnsi = 'ANSI';
sEncUtf8 = 'UTF-8';
sEncUtf8NoBom = 'UTF-8 no bom';
sEncUtf16LE = 'UTF-16 LE';
sEncUtf16BE = 'UTF-16 BE';
const
cColorBmIco = clMedGray;
{ TfmMain }
procedure TfmMain.FormCreate(Sender: TObject);
begin
UpdateEnc;
FDir:= ExtractFilePath(ExtractFileDir(ExtractFileDir(Application.ExeName)))+'test_files';
wait:= true;
ed:= TATSynEdit.Create(Self);
ed.Parent:= PanelMain;
ed.Align:= alClient;
{$ifdef windows}
ed.Font.Name:= 'Consolas';
{$else}
ed.Font.Name:= 'Courier New';
{$endif}
ed.PopupGutterBm:= PopupBookmk;
ed.PopupGutterNum:= PopupNums;
ed.PopupGutterFold:= PopupFold;
ed.PopupMinimap:= PopupMinimap;
ed.PopupMicromap:= PopupMicromap;
ed.PopupRuler:= PopupRuler;
ed.OnChange:= @EditChanged;
ed.OnChangeCaretPos:= @EditCaretMoved;
ed.OnChangeState:= @EditCaretMoved;
ed.OnScroll:= @EditCaretMoved;
ed.OnCommand:= @EditCommand;
ed.OnClickGutter:= @EditClickGutter;
ed.OnClickMicromap:= @EditClickMicromap;
ed.OnDrawBookmarkIcon:= @EditDrawBm;
ed.OnDrawLine:= @EditDrawLine;
ed.OnDrawMicromap:= @EditDrawMicromap;
ed.SetFocus;
FFinder:= TATEditorFinder.Create;
FFinder.Editor:= ed;
FFinder.OptRegex:= true;
FFinder.OnConfirmReplace:= @FinderConfirmReplace;
FFinder.OnProgress:= @FinderProgress;
FFinder.OnBadRegex:= @FinderBadRegex;
FFinder.OnFound:= @FinderFound; //slower
end;
procedure TfmMain.FormShow(Sender: TObject);
var
fn: string;
begin
if wait then UpdateChecks;
wait:= false;
ActiveControl:= ed;
fn:= FDir+'/fn.txt';
if FileExists(fn) then
DoOpen(fn, true);
end;
procedure TfmMain.mnuEndMacClick(Sender: TObject);
begin
ed.Strings.Endings:= cEndMac;
ed.Update;
UpdateStatus;
end;
procedure TfmMain.mnuEndUnixClick(Sender: TObject);
begin
ed.Strings.Endings:= cEndUnix;
ed.Update;
UpdateStatus;
end;
procedure TfmMain.mnuEndWinClick(Sender: TObject);
begin
ed.Strings.Endings:= cEndWin;
ed.Update;
UpdateStatus;
end;
procedure TfmMain.mnuUnderlineClick(Sender: TObject);
begin
with mnuUnderline do Checked:= not Checked;
ed.Update;
end;
procedure TfmMain.mnuLockClick(Sender: TObject);
begin
ed.BeginUpdate;
end;
procedure TfmMain.mnuTBmsClick(Sender: TObject);
var
i: integer;
begin
for i:= 0 to ed.Strings.Count-1 do
begin
if ed.Strings.LinesBm[i]=0 then
begin
ed.Strings.LinesBm[i]:= 1;
end
else
ed.Strings.LinesBm[i]:= 0;
end;
ed.Update;
end;
procedure TfmMain.mnuTCaret1Click(Sender: TObject);
var
i: integer;
begin
for i:= 1 to 100 do
ed.Carets.Add(0, i);
ed.Carets.Sort;
ed.Update;
UpdateStatus;
end;
procedure TfmMain.mnuTMarginClick(Sender: TObject);
var
S: string;
begin
S:= ed.OptMarginString;
if InputQuery('Margins', 'space separated ints', S) then
begin
ed.OptMarginString:= S;
ed.Update;
end;
end;
procedure TfmMain.mnuUnlockClick(Sender: TObject);
begin
ed.EndUpdate;
end;
procedure TfmMain.EditCaretMoved(Sender: TObject);
begin
UpdateStatus;
end;
procedure TfmMain.UpdateStatus;
const
cEnd: array[TATLineEnds] of string = ('?', 'Win', 'Unix', 'Mac');
cOvr: array[boolean] of string = ('-', 'Ovr');
cRo: array[boolean] of string = ('-', 'RO');
cMod: array[boolean] of string = ('-', 'Mod');
cSel: array[boolean] of string = ('-', 'Column');
var
sPos: string;
i: integer;
begin
sPos:= '';
for i:= 0 to Min(4, ed.Carets.Count-1) do
with ed.Carets[i] do
sPos:= sPos+Format(' %d:%d', [PosY+1, PosX+1]);
Status.SimpleText:= Format('Line:Col%s | Carets: %d | Top: %d | %s | %s %s %s %s | Undo: %d, Redo: %d', [
sPos,
ed.Carets.Count,
ed.LineTop+1,
cEnd[ed.Strings.Endings],
cOvr[ed.ModeOverwrite],
cRo[ed.ModeReadOnly],
cSel[not ed.IsSelRectEmpty],
cMod[ed.Modified],
ed.UndoCount,
ed.RedoCount
]);
end;
procedure TfmMain.UpdateChecks;
begin
chkGutter.Checked:= ed.OptGutterVisible;
chkRuler.Checked:= ed.OptRulerVisible;
chkMinimap.Checked:= ed.OptMinimapVisible;
chkMicromap.Checked:= ed.OptMicromapVisible;
edFontsize.Value:= ed.Font.Size;
edTabsize.Value:= ed.OptTabSize;
edSpaceX.Value:= ed.OptCharSpacingX;
edSpaceY.Value:= ed.OptCharSpacingY;
edMarRt.Value:= ed.OptMarginRight;
case ed.OptWrapMode of
cWrapOff: chkWrapOff.Checked:= true;
cWrapOn: chkWrapOn.Checked:= true;
cWrapAtMargin: chkWrapMargin.Checked:= true;
end;
chkWrapIndent.Checked:= ed.OptWrapIndented;
chkUnprintVis.Checked:= ed.OptUnprintedVisible;
chkUnprintSp.Checked:= ed.OptUnprintedSpaces;
chkUnprintEnd.Checked:= ed.OptUnprintedEnds;
chkUnprintEndDet.Checked:= ed.OptUnprintedEndsDetails;
end;
procedure TfmMain.EditScroll(Sender: TObject);
begin
UpdateStatus;
end;
procedure TfmMain.EditCommand(Sender: TObject; ACmd: integer;
const AText: string; var AHandled: boolean);
begin
AHandled:= false;
{
if ACmd=cCommand_KeyTab then
begin
AHandled:= true;
Beep;
end;
}
end;
procedure TfmMain.EditClickGutter(Sender: TObject; ABand, ALine: integer);
begin
if ABand=ed.GutterBandBm then
begin
if ed.Strings.LinesBm[ALine]<>0 then
ed.Strings.LinesBm[ALine]:= 0
else
ed.Strings.LinesBm[ALine]:= 1;
ed.Update;
end;
end;
procedure TfmMain.EditClickMicromap(Sender: TObject; AX, AY: integer);
begin
Showmessage(Format('Micromap click: %d:%d', [AX, AY]));
end;
procedure TfmMain.EditDrawBm(Sender: TObject; C: TCanvas; ALineNum: integer;
const ARect: TRect);
var
r: trect;
dx: integer;
begin
r:= arect;
if IsRectEmpty(r) then exit;
c.brush.color:= cColorBmIco;
c.pen.color:= cColorBmIco;
inc(r.top, 1);
inc(r.left, 4);
dx:= (r.bottom-r.top) div 2-1;
c.Polygon([Point(r.left, r.top), Point(r.left+dx, r.top+dx), Point(r.left, r.top+2*dx)]);
end;
procedure TfmMain.EditDrawMicromap(Sender: TObject; C: TCanvas; const ARect: TRect);
begin
C.Pen.Color:= $c0c0c0;
C.Brush.Color:= $eeeeee;
C.Rectangle(ARect);
C.TextOut(ARect.Left+2, ARect.Top+2, 'tst');
end;
procedure TfmMain.EditDrawTest(Sender: TObject; C: TCanvas; const ARect: TRect);
begin
//Exit;
C.Pen.Color:= clred;
C.Brush.Style:= bsClear;
C.Rectangle(ARect);
end;
procedure TfmMain.mnuFileOpenClick(Sender: TObject);
begin
with OpenDialog1 do
begin
InitialDir:= FDir;
if not Execute then Exit;
DoOpen(FileName, true);
end;
end;
procedure TfmMain.DoOpen(const fn: string; ADetectEnc: boolean);
begin
Application.ProcessMessages;
FFileName:= fn;
Progress.Show;
Progress.Position:= 0;
ed.BeginUpdate;
try
if ADetectEnc then
ed.Strings.EncodingCodepage:= '';
ed.Strings.EncodingDetect:= ADetectEnc;
ed.LoadFromFile(fn);
ed.Strings.EncodingDetect:= true;
finally
ed.EndUpdate;
end;
Progress.Hide;
Caption:= 'Demo - '+ExtractFileName(fn);
end;
procedure TfmMain.EditChanged(Sender: TObject);
begin
UpdateStatus;
{$ifdef test_text}
with Memo1 do
begin
Lines.Clear;
Lines.Text:= utf8encode(ed.Strings.TextString);
end;
{$else}
//Memo1.Hide;
{$endif}
end;
procedure TfmMain.bGotoClick(Sender: TObject);
var
s: string;
n: integer;
begin
s:= Inttostr(ed.LineTop+1);
if not InputQuery('Go to', 'Line:', s) then Exit;
if s='' then Exit;
n:= StrToIntDef(s, 0)-1;
if (n>=0) and (n<ed.Strings.Count) then
ed.DoGotoPos_AndUnfold(Point(0, n), 5, 5)
else
Showmessage('Incorrect index: '+s);
end;
procedure TfmMain.btnMarkerClick(Sender: TObject);
begin
if ed.Carets.Count=1 then
begin
ed.Markers.Add(ed.Carets[0].PosX, ed.Carets[0].PosY);
ed.Update;
end;
end;
procedure TfmMain.btnStopClick(Sender: TObject);
begin
FFindStopped:= true;
end;
procedure TfmMain.FinderProgress(Sender: TObject; ACurPos, AMaxPos: integer;
var AContinue: boolean);
begin
progress.Position:= ACurPos * 100 div AMaxPos;
Application.ProcessMessages;
if FFindStopped then AContinue:= false;
end;
procedure TfmMain.mnuFileHtmlClick(Sender: TObject);
var
fn: string;
begin
fn:= GetTempDir+DirectorySeparator+'_export.html';
DoEditorExportToHTML(Ed, fn, 'Export test',
'Courier New', 12, false,
clWhite, clMedGray);
if FileExists(fn) then
OpenDocument(fn);
end;
procedure TfmMain.bFontClick(Sender: TObject);
begin
with FontDialog1 do
begin
Font:= ed.Font;
if Execute then
begin
ed.Font.Assign(Font);
ed.Update;
end;
end;
ed.SetFocus;
end;
procedure TfmMain.bAddCrtClick(Sender: TObject);
var
i, j: integer;
begin
for j:= 1 to 100 do
for i:= 1 to 20 do
ed.Carets.Add(i*2, j);
ed.Carets.Sort;
ed.Update;
UpdateStatus;
end;
procedure TfmMain.mnuFileSaveClick(Sender: TObject);
begin
with SaveDialog1 do
begin
InitialDir:= FDir;
FileName:= '';
if Execute then
begin
ed.SaveToFile(FileName);
ed.Update;
end;
end;
end;
procedure TfmMain.bKeymapClick(Sender: TObject);
var
Cmd: integer;
begin
Cmd:= DoCommandDialog(ed);
if Cmd>0 then
begin
ed.DoCommand(Cmd);
ed.Update;
end;
end;
procedure TfmMain.bOptClick(Sender: TObject);
begin
DoConfigEditor(ed);
wait:= true;
chkUnprintVis.Checked:= ed.OptUnprintedVisible;
chkUnprintSp.Checked:= ed.OptUnprintedSpaces;
chkUnprintEnd.Checked:= ed.OptUnprintedEnds;
chkUnprintEndDet.Checked:= ed.OptUnprintedEndsDetails;
wait:= false;
ed.SetFocus;
end;
procedure TfmMain.mnuFindClick(Sender: TObject);
var
res: TModalResult;
cnt: integer;
ok, fchanged: boolean;
begin
with TfmFind.Create(nil) do
try
edFind.Text:= Utf8Encode(FFinder.StrFind);
edRep.Text:= Utf8Encode(FFinder.StrReplace);
chkBack.Checked:= FFinder.OptBack;
chkCase.Checked:= FFinder.OptCase;
chkWords.Checked:= FFinder.OptWords;
chkRegex.Checked:= FFinder.OptRegex;
chkFromCaret.Checked:= FFinder.OptFromCaret;
chkConfirm.Checked:= FFinder.OptConfirmReplace;
res:= ShowModal;
if res=mrCancel then Exit;
if edFind.Text='' then Exit;
FFinder.StrFind:= Utf8Decode(edFind.Text);
FFinder.StrReplace:= Utf8Decode(edRep.Text);
FFinder.OptBack:= chkBack.Checked;
FFinder.OptCase:= chkCase.Checked;
FFinder.OptWords:= chkWords.Checked;
FFinder.OptRegex:= chkRegex.Checked;
FFinder.OptFromCaret:= chkFromCaret.Checked;
FFinder.OptConfirmReplace:= chkConfirm.Checked;
FFindStopped:= false;
FFindConfirmAll:= mrNone;
FFindMarkAll:= false;
btnStop.Show;
progress.Show;
progress.Position:= 0;
FFinder.UpdateBuffer;
case res of
mrOk: //find
begin
ok:= FFinder.DoFindOrReplace(false, false, false, fchanged);
FinderUpdateEditor(false);
if not ok then DoFindError;
end;
mrYes: //replace
begin
ok:= FFinder.DoFindOrReplace(false, true, false, fchanged);
FinderUpdateEditor(true);
if not ok then DoFindError;
end;
mrYesToAll: //replace all
begin
cnt:= FFinder.DoReplaceAll;
FinderUpdateEditor(true);
MsgStatus('Replaces made: '+Inttostr(cnt));
end;
mrIgnore: //count all
begin
cnt:= FFinder.DoCountAll(false);
MsgStatus('Count of "'+FFinder.StrFind+'": '+Inttostr(cnt));
end;
mrRetry: //mark all
begin
FFindMarkAll:= true;
cnt:= FFinder.DoCountAll(true);
FFindMarkAll:= false;
FinderUpdateEditor(false);
MsgStatus('Marked matches: '+Inttostr(cnt));
end;
end;
finally
Free;
end;
btnStop.Hide;
progress.Hide;
end;
procedure TfmMain.mnuFindNextClick(Sender: TObject);
var
ok, fchanged: boolean;
begin
if FFinder.StrFind='' then
begin
mnuFind.Click;
Exit
end;
FFinder.OptFromCaret:= true;
FFinder.UpdateBuffer;
ok:= FFinder.DoFindOrReplace(false, false, false, fchanged);
FinderUpdateEditor(false);
if not ok then DoFindError;
end;
procedure TfmMain.mnuSyntaxClick(Sender: TObject);
begin
mnuSyntax.Checked:= not mnuSyntax.Checked;
if mnuSyntax.Checked then
ed.OnCalcHilite:= @EditCalcLine
else
ed.OnCalcHilite:= nil;
ed.Update;
end;
procedure TfmMain.TimerHintTimer(Sender: TObject);
begin
TimerHint.Enabled:= false;
StatusMsg.SimpleText:= '';
end;
procedure TfmMain.DoSetEnc(const Str: string);
begin
if Str=sEncAnsi then
begin
Ed.Strings.Encoding:= cEncAnsi;
Ed.Strings.EncodingCodepage:= '';
end
else
if Str=sEncUtf8 then
begin
Ed.Strings.Encoding:= cEncUTF8;
Ed.Strings.SaveSignUtf8:= true;
Ed.Strings.EncodingCodepage:= '';
end
else
if Str=sEncUtf8NoBom then
begin
Ed.Strings.Encoding:= cEncUTF8;
Ed.Strings.SaveSignUtf8:= false;
Ed.Strings.EncodingCodepage:= '';
end
else
if Str=sEncUtf16LE then
begin
Ed.Strings.Encoding:= cEncWideLE;
Ed.Strings.EncodingCodepage:= '';
end
else
if Str=sEncUtf16BE then
begin
Ed.Strings.Encoding:= cEncWideBE;
Ed.Strings.EncodingCodepage:= '';
end
else
begin
Ed.Strings.Encoding:= cEncAnsi;
Ed.Strings.EncodingCodepage:= Str;
end;
if FFileName<>'' then
if Application.Messagebox('Encoding changed in mem. Also reload file in this encoding?',
'Editor', MB_OKCANCEL or MB_ICONQUESTION) = id_ok then
DoOpen(FFileName, false);
end;
procedure TfmMain.DoAddEnc(Sub, SName: string);
var
mi, miSub: TMenuItem;
n: integer;
subEnc: TMenuItem;
begin
subEnc:= mnuEnc;
miSub:= nil;
if Sub<>'' then
begin
n:= subEnc.IndexOfCaption(Sub);
if n<0 then
begin
mi:= TMenuItem.Create(Self);
mi.Caption:= Sub;
subEnc.Add(mi);
n:= subEnc.IndexOfCaption(Sub);
end;
miSub:= subEnc.Items[n]
end;
if miSub=nil then miSub:= subEnc;
mi:= TMenuItem.Create(Self);
mi.Caption:= SName;
mi.OnClick:= @MenuEncClick;
miSub.Add(mi);
end;
procedure TfmMain.MenuEncClick(Sender: TObject);
begin
DoSetEnc((Sender as TMenuItem).Caption);
end;
procedure TfmMain.UpdateEnc;
begin
mnuEnc.Clear;
DoAddEnc('', sEncAnsi);
DoAddEnc('', sEncUtf8);
DoAddEnc('', sEncUtf8NoBom);
DoAddEnc('', sEncUtf16LE);
DoAddEnc('', sEncUtf16BE);
DoAddEnc('', '-');
DoAddEnc('Europe', 'CP1250');
DoAddEnc('Europe', 'CP1251');
DoAddEnc('Europe', 'CP1252');
DoAddEnc('Europe', 'CP1253');
DoAddEnc('Europe', 'CP1257');
DoAddEnc('Europe', '-');
DoAddEnc('Europe', 'CP437');
DoAddEnc('Europe', 'CP850');
DoAddEnc('Europe', 'CP852');
DoAddEnc('Europe', 'CP866');
DoAddEnc('Europe', '-');
DoAddEnc('Europe', 'ISO-8859-1');
DoAddEnc('Europe', 'ISO-8859-2');
DoAddEnc('Europe', 'Macintosh');
DoAddEnc('Other', 'CP1254');
DoAddEnc('Other', 'CP1255');
DoAddEnc('Other', 'CP1256');
DoAddEnc('Asian', 'CP874');
DoAddEnc('Asian', 'CP932');
DoAddEnc('Asian', 'CP936');
DoAddEnc('Asian', 'CP949');
DoAddEnc('Asian', 'CP950');
DoAddEnc('Asian', 'CP1258');
end;
procedure TfmMain.mnuHelpMousClick(Sender: TObject);
const
txt =
'Ctrl+click - add/del caret'#13+
'Ctrl+drag - add caret with select'#13+
'Ctrl+Shift+click - add caret column'#13+
#13+
'Alt+drag - column-select (looks weird with wrap, ignores tab-width)'#13+
'drag on line numbers - line-select'#13;
begin
Showmessage(txt);
end;
procedure TfmMain.btnLoadClick(Sender: TObject);
begin
{
wait:= true;
LoadComponentFromFile(ed, FIniName, nil);
ed.Update(true);
UpdateChecks;
wait:= false;
}
end;
procedure TfmMain.btnSaveClick(Sender: TObject);
begin
{
SaveComponentToFile(ed, FIniName);
}
end;
procedure TfmMain.chkGutterChange(Sender: TObject);
begin
if wait then Exit;
ed.OptGutterVisible:= chkGutter.Checked;
ed.Update;
end;
procedure TfmMain.chkMicromapChange(Sender: TObject);
begin
if wait then Exit;
ed.OptMicromapVisible:= chkMicromap.Checked;
ed.Update;
end;
procedure TfmMain.chkMinimapChange(Sender: TObject);
begin
if wait then Exit;
ed.OptMinimapVisible:= chkMinimap.Checked;
ed.Update;
end;
procedure TfmMain.FormDestroy(Sender: TObject);
begin
//
end;
procedure TfmMain.FormResize(Sender: TObject);
begin
//
end;
procedure TfmMain.mnuBmsClick(Sender: TObject);
begin
mnuTBmsClick(Self);
end;
procedure TfmMain.mnuOneLineClick(Sender: TObject);
begin
with TfmCombo.Create(Self) do
try
ShowModal
finally
Free
end;
end;
procedure TfmMain.mnuPaneClick(Sender: TObject);
begin
with mnuPane do
begin
Checked:= not Checked;
PanelRt.Visible:= Checked;
end;
end;
procedure TfmMain.chkRulerChange(Sender: TObject);
begin
if wait then Exit;
ed.OptRulerVisible:= chkRuler.Checked;
ed.Update;
end;
procedure TfmMain.chkUnprintVisChange(Sender: TObject);
begin
if wait then Exit;
ed.OptUnprintedVisible:= chkUnprintVis.Checked;
ed.Update;
end;
procedure TfmMain.chkUnprintEndChange(Sender: TObject);
begin
if wait then Exit;
ed.OptUnprintedEnds:= chkUnprintEnd.Checked;
ed.Update;
end;
procedure TfmMain.chkUnprintEndDetChange(Sender: TObject);
begin
if wait then Exit;
ed.OptUnprintedEndsDetails:= chkUnprintEndDet.Checked;
ed.Update;
end;
procedure TfmMain.chkUnprintSpChange(Sender: TObject);
begin
if wait then Exit;
ed.OptUnprintedSpaces:= chkUnprintSp.Checked;
ed.Update;
end;
procedure TfmMain.chkWrapMarginChange(Sender: TObject);
begin
if wait then Exit;
ed.OptWrapMode:= cWrapAtMargin;
end;
procedure TfmMain.chkWrapOffChange(Sender: TObject);
begin
if wait then Exit;
ed.OptWrapMode:= cWrapOff;
end;
procedure TfmMain.chkWrapOnChange(Sender: TObject);
begin
if wait then Exit;
ed.OptWrapMode:= cWrapOn;
end;
procedure TfmMain.chkWrapIndentChange(Sender: TObject);
begin
if wait then Exit;
ed.OptWrapIndented:= chkWrapIndent.Checked;
ed.Update;
end;
procedure TfmMain.edFontsizeChange(Sender: TObject);
begin
if wait then Exit;
ed.Font.Size:= edFontsize.Value;
ed.Update(true);
end;
procedure TfmMain.edMarRtChange(Sender: TObject);
begin
if wait then Exit;
ed.OptMarginRight:= edMarRt.Value;
ed.Update;
end;
procedure TfmMain.edSpaceXChange(Sender: TObject);
begin
if wait then Exit;
ed.OptCharSpacingX:= edSpaceX.Value;
ed.Update;
end;
procedure TfmMain.edSpaceYChange(Sender: TObject);
begin
if wait then Exit;
ed.OptCharSpacingY:= edSpaceY.Value;
ed.Update;
end;
procedure TfmMain.edTabsizeChange(Sender: TObject);
begin
if wait then Exit;
ed.OptTabSize:= edTabsize.Value;
ed.Update;
end;
procedure TfmMain.EditDrawLine(Sender: TObject; C: TCanvas;
AX, AY: integer; const AStr: atString; ACharSize: TPoint; const AExtent: TATIntArray);
var
X1, X2, Y, i: integer;
begin
if AStr='' then Exit;
if not mnuUnderline.Checked then Exit;
C.Pen.Color:= clBlue;
C.Pen.Width:= 2;
C.Pen.EndCap:= pecSquare;
for i:= 1 to Length(AStr) do
if AStr[i]='w' then
begin
X1:= AX;
if i>1 then
Inc(X1, AExtent[i-2]);
X2:= AX+AExtent[i-1];
Y:= AY+ACharSize.Y-1;
C.Line(X1, Y, X2, Y);
end;
C.Pen.Width:= 1;
end;
procedure TfmMain.EditCalcLine(Sender: TObject; var AParts: TATLineParts;
ALineIndex, ACharIndex, ALineLen: integer; var AColorAfterEol: TColor);
var
nlen, npart, noffset: integer;
kind, kindnew: integer;
//
procedure Add;
begin
if npart>High(AParts) then exit;
with AParts[npart] do
begin
ColorBG:= clNone;
case kind of
1: begin
ColorFont:= clblue;
end;
2: begin
ColorFont:= clgreen;
ColorBorder:= clgreen;
BorderLeft:= cLineStyleDotted;
BorderDown:= BorderLeft;
BorderRight:= BorderLeft;
BorderUp:= BorderLeft;
FontItalic:= true;
FontBold:= true;
end;
3: begin
ColorFont:= clred;
Colorbg:= clyellow;
ColorBorder:= clred;
BorderDown:= cLineStyleWave;
//BorderLeft:= cLineDotted;
//BorderRight:= cLineRounded;
//BorderUp:= cLineRounded;
end;
else
begin
ColorFont:= clgray;
end;
end;
Offset:= noffset;
Len:= nlen;
end;
inc(npart);
end;
//
var
Str: atString;
i: integer;
begin
Str:= Copy(ed.Strings.Lines[ALineIndex], ACharIndex, ALineLen);
npart:= 0;
noffset:= 0;
nlen:= 1;
kind:= -1;
for i:= 1 to Length(Str) do
begin
case Str[i] of
'w': kindnew:= 1;
'e': kindnew:= 2;
'0'..'9': kindnew:= 3;
else kindnew:= 0;
end;
if kindnew=kind then
begin
inc(nlen);
Continue;
end;
if kind>=0 then Add;
kind:= kindnew;
nlen:= 1;
noffset:= i-1;
end;
Add;
//test
//AParts[0].Colorbg:= clgreen;
//AParts[1].Colorbg:= clyellow;
end;
procedure TfmMain.MsgStatus(const S: string);
begin
StatusMsg.SimpleText:= S;
TimerHint.Enabled:= false;
TimerHint.Enabled:= true;
end;
procedure TfmMain.DoFindError;
begin
MsgStatus('Cannot find: '+FFinder.StrFind);
end;
procedure TfmMain.FinderConfirmReplace(Sender: TObject; APos1, APos2: TPoint;
AForMany: boolean; var AConfirm, AContinue: boolean);
var
Res: TModalResult;
Buttons: TMsgDlgButtons;
begin
case FFindConfirmAll of
mrYesToAll: begin AConfirm:= true; exit end;
mrNoToAll: begin AConfirm:= false; exit end;
end;
with Ed.Carets[0] do
begin
PosX:= APos1.X;
PosY:= APos1.Y;
EndX:= APos2.X;
EndY:= APos2.Y; end;
Ed.DoCommand(cCommand_ScrollToCaretTop);
Ed.Update(true);
Buttons:= [mbYes, mbNo];
if AForMany then
Buttons:= Buttons+[mbYesToAll, mbNoToAll];
//Str:= Ed.Strings.TextSubstring(APos1.X, APos1.Y, APos2.X, APos2.Y);
Res:= MessageDlg(
'Confirm replace',
'Replace string at line '+Inttostr(APos1.Y+1),
mtConfirmation,
Buttons, '');
AConfirm:= Res in [mrYes, mrYesToAll];
AContinue:= Res<>mrNoToAll;
if Res in [mrYesToAll, mrNoToAll] then
FFindConfirmAll:= Res;
end;
procedure TfmMain.FinderBadRegex(Sender: TObject);
begin
Application.MessageBox(
PChar('Incorrect regex passed:'#13+Utf8Encode(FFinder.StrFind)),
PChar(Application.Title),
mb_ok or mb_iconerror);
end;
procedure TfmMain.FinderUpdateEditor(AUpdateText: boolean);
begin
FFinder.Editor.Update(AUpdateText);
FFinder.Editor.DoGotoCaret(cEdgeTop);
UpdateStatus;
end;
procedure TfmMain.FinderFound(Sender: TObject; APos1, APos2: TPoint);
begin
if FFindMarkAll then
begin
ed.Carets.Add(APos1.X, APos1.Y, APos2.X, APos2.Y);
ed.Carets.Sort;
end;
//Memo1.Lines.Add(Format('Found %d:%d', [APos1.Y+1, APos1.X+1]));
end;
end.