mirror of
https://github.com/doublecmd/doublecmd.git
synced 2026-06-21 09:58:13 +00:00
3015 lines
110 KiB
ObjectPascal
3015 lines
110 KiB
ObjectPascal
{-------------------------------------------------------------------------------
|
|
The contents of this file are subject to the Mozilla Public License
|
|
Version 1.1 (the "License"); you may not use this file except in compliance
|
|
with the License. You may obtain a copy of the License at
|
|
http://www.mozilla.org/MPL/
|
|
|
|
Software distributed under the License is distributed on an "AS IS" basis,
|
|
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
|
|
the specific language governing rights and limitations under the License.
|
|
|
|
The Original Code is: SynUniHighlighter.pas, released 2003-01
|
|
All Rights Reserved.
|
|
|
|
Alternatively, the contents of this file may be used under the terms of the
|
|
GNU General Public License Version 2 or later (the "GPL"), in which case
|
|
the provisions of the GPL are applicable instead of those above.
|
|
If you wish to allow use of your version of this file only under the terms
|
|
of the GPL and not to allow others to use your version of this file
|
|
under the MPL, indicate your decision by deleting the provisions above and
|
|
replace them with the notice and other provisions required by the GPL.
|
|
If you do not delete the provisions above, a recipient may use your version
|
|
of this file under either the MPL or the GPL.
|
|
|
|
{
|
|
@abstract(Desginer for TSynUniSyn)
|
|
@authors(Vit [nevzorov@yahoo.com], Fantasist [walking_in_the_sky@yahoo.com],
|
|
Vitalik [vetal-x@mail.ru])
|
|
@created(2003)
|
|
@lastmod(2004-05-12)
|
|
}
|
|
|
|
(******************************************************************************
|
|
Authors: Vit (Vitaly Nevzorov nevzorov@yahoo.com)
|
|
Fantasist (Kirill Burtsev walking_in_the_sky@yahoo.com)
|
|
Vitalik (Vitaly Lyapota vetal-x@mail.ru)
|
|
Official Site: www.delphist.com
|
|
With all questions, please visit www.delphist.com/forum
|
|
******************************************************************************)
|
|
|
|
unit SynUniDesigner;
|
|
|
|
//================== SCHMaster ==================
|
|
{$IFNDEF FPC}
|
|
//23.02.2012, Alex Dr., SynPlus is plugin for TC...
|
|
{$DEFINE SYNPLUS}
|
|
{$ENDIF}
|
|
//===============================================
|
|
|
|
{$IFNDEF FPC}
|
|
{$I SynEdit.inc}
|
|
{$ELSE}
|
|
{$IFNDEF SYN_LAZARUS}
|
|
{$define SYN_LAZARUS}
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
|
|
interface
|
|
|
|
uses
|
|
{$IFDEF SYN_CLX}
|
|
Types, kTextDrawer, QGraphics, QControls, QForms, QExtCtrls, QStdCtrls,
|
|
QComCtrls, QImgList, QDialogs, QMenus,
|
|
{$ELSE}
|
|
{$IFNDEF FPC}
|
|
Windows, Messages, Registry,
|
|
{$ELSE}
|
|
LMessages, LCLType,
|
|
{$ENDIF}
|
|
Graphics, Controls, Forms, ExtCtrls, StdCtrls, ComCtrls, Dialogs, Menus,
|
|
{$ENDIF}
|
|
Classes, SysUtils, SynEdit, SynEditHighlighter, SynUniHighlighter,
|
|
SynUniClasses, SynUniRules, Clipbrd, ImgList, Inifiles, Buttons,
|
|
SynUniImport, SynUniImportEditPlus, SynUniImportUltraEdit;
|
|
|
|
type
|
|
{$IFDEF SYN_CLX}
|
|
TNodeText = WideString;
|
|
{$ELSE}
|
|
TNodeText = string;
|
|
{$ENDIF}
|
|
|
|
TNodeType = (ntRangeLink, ntRange, ntRoot, ntKeywords, ntSet, ntNone);
|
|
TAddKind = (akAdd, akInsert, akReplace);
|
|
TRangeType = (rtRange, rtRoot, rtLink);
|
|
|
|
{ TfmDesigner }
|
|
|
|
TfmDesigner = class(TForm)
|
|
MenuItem10: TMenuItem;
|
|
//==================== P O P U P M E N U S ==============================
|
|
//=== popStandard ========================================================
|
|
popStandard: TPopupMenu;
|
|
popUndo: TMenuItem;
|
|
N1: TMenuItem;
|
|
popCut: TMenuItem;
|
|
popCopy: TMenuItem;
|
|
popPaste: TMenuItem;
|
|
popDelete: TMenuItem;
|
|
N2: TMenuItem;
|
|
popSelectAll: TMenuItem;
|
|
//=== popSampleMemoMenu ==================================================
|
|
popSampleMemoMenu: TPopupMenu;
|
|
AddselectedtoKeywords1: TMenuItem;
|
|
N7: TMenuItem;
|
|
Undo1: TMenuItem;
|
|
N5: TMenuItem;
|
|
Cut1: TMenuItem;
|
|
Copy1: TMenuItem;
|
|
Paste1: TMenuItem;
|
|
Delete1: TMenuItem;
|
|
N6: TMenuItem;
|
|
SelectAll1: TMenuItem;
|
|
//=== popOpenTagMenu =====================================================
|
|
popOpenTagMenu: TPopupMenu;
|
|
Closemenu1: TMenuItem;
|
|
N3: TMenuItem;
|
|
Opentagisfirstsymbolsonline1: TMenuItem;
|
|
Opentagisfirstnonspacesymbolsonline1: TMenuItem;
|
|
N4: TMenuItem;
|
|
Opentagispartofterm1: TMenuItem;
|
|
Opentagispartoftermonlyrightside1: TMenuItem;
|
|
Opentagispartoftermonlyleftside1: TMenuItem;
|
|
Opentagisnotpartofterm1: TMenuItem;
|
|
//=== popCloseTagMenu ====================================================
|
|
popCloseTagMenu: TPopupMenu;
|
|
MenuItem1: TMenuItem;
|
|
MenuItem2: TMenuItem;
|
|
MenuItem3: TMenuItem;
|
|
MenuItem4: TMenuItem;
|
|
MenuItem5: TMenuItem;
|
|
MenuItem6: TMenuItem;
|
|
MenuItem7: TMenuItem;
|
|
MenuItem8: TMenuItem;
|
|
MenuItem9: TMenuItem;
|
|
//=== popRootMenu ========================================================
|
|
popRootMenu: TPopupMenu;
|
|
rootCut: TMenuItem;
|
|
rootCopy: TMenuItem;
|
|
rootPaste: TMenuItem;
|
|
rootPasteAndReplace: TMenuItem;
|
|
rootBreak1: TMenuItem;
|
|
rootLoadFromFile: TMenuItem;
|
|
rootSaveToFile: TMenuItem;
|
|
rootBreak2: TMenuItem;
|
|
rootAddRange: TMenuItem;
|
|
rootAddKeywords: TMenuItem;
|
|
rootAddSetto: TMenuItem;
|
|
rootBreak3: TMenuItem;
|
|
rootRename: TMenuItem;
|
|
rootDeleteAll: TMenuItem;
|
|
rootBreak4: TMenuItem;
|
|
rootInfo: TMenuItem;
|
|
//=== popRangeMenu =======================================================
|
|
popRangeMenu: TPopupMenu;
|
|
rangeBack: TMenuItem;
|
|
rangeBreak1: TMenuItem;
|
|
rangeCut: TMenuItem;
|
|
rangeCopy: TMenuItem;
|
|
rangePaste: TMenuItem;
|
|
rangePasteAndReplace: TMenuItem;
|
|
rangePasteNextTo: TMenuItem;
|
|
rangeBreak2: TMenuItem;
|
|
rangeLoadFromFile: TMenuItem;
|
|
rangeSaveToFile: TMenuItem;
|
|
rangeBreak3: TMenuItem;
|
|
rangeAddRange: TMenuItem;
|
|
rangeAddKeywords: TMenuItem;
|
|
rangeAddSet: TMenuItem;
|
|
rangeBreak4: TMenuItem;
|
|
rangeRename: TMenuItem;
|
|
rangeDelete: TMenuItem;
|
|
//=== popKeywordsMenu ====================================================
|
|
popKeywordsMenu: TPopupMenu;
|
|
keywordsBack: TMenuItem;
|
|
keywordsBreak1: TMenuItem;
|
|
keywordsCut: TMenuItem;
|
|
keywordsCopy: TMenuItem;
|
|
keywordsPaste: TMenuItem;
|
|
keywordsPasteAndReplace: TMenuItem;
|
|
keywordsBreak2: TMenuItem;
|
|
keywordsLoadFromFile: TMenuItem;
|
|
keywordsSaveToFile: TMenuItem;
|
|
keywordsBreak3: TMenuItem;
|
|
keywordsRename: TMenuItem;
|
|
keywordsDelete: TMenuItem;
|
|
//=== popSetMenu =========================================================
|
|
popSetMenu: TPopupMenu;
|
|
setBack: TMenuItem;
|
|
setBreak1: TMenuItem;
|
|
setCut: TMenuItem;
|
|
setCopy: TMenuItem;
|
|
setPaste: TMenuItem;
|
|
setPasteAndReplace: TMenuItem;
|
|
setBreak2: TMenuItem;
|
|
setLoadFromFile: TMenuItem;
|
|
setSaveToFile: TMenuItem;
|
|
setBreak3: TMenuItem;
|
|
setRename: TMenuItem;
|
|
setDelete: TMenuItem;
|
|
//=== popPanels ==========================================================
|
|
popPanels: TPopupMenu;
|
|
RulesTree1: TMenuItem;
|
|
Properties1: TMenuItem;
|
|
Attributes1: TMenuItem;
|
|
Sampletext1: TMenuItem;
|
|
Buttons1: TMenuItem;
|
|
//=== Popup Menus ========================================================
|
|
popColorStd: TPopupMenu;
|
|
popColorAdv: TPopupMenu;
|
|
popColorSys: TPopupMenu;
|
|
//===================== C O M P O N E N T S ==============================
|
|
//=== Top panel ==========================================================
|
|
pTop: TPanel;
|
|
SplitterBottom: TSplitter;
|
|
//=== Panel "Rules' Tree" ================================================
|
|
pLeft: TPanel;
|
|
SplitterLeft: TSplitter;
|
|
pLeftParentCapt: TPanel;
|
|
lbRootMenu: TLabel;
|
|
pLeftCapt: TPanel;
|
|
Bevel1: TBevel;
|
|
pTree: TPanel;
|
|
Tree: TTreeView;
|
|
//=== Panel "Attributes" =================================================
|
|
pRight: TPanel;
|
|
SplitterRight: TSplitter;
|
|
pRightCapt: TPanel;
|
|
Bevel2: TBevel;
|
|
pAttri: TPanel;
|
|
//=== Panel "Proprties" ==================================================
|
|
pMiddle: TPanel;
|
|
pMiddleParentCapt: TPanel;
|
|
lbPropBack: TLabel;
|
|
lbRuleMenu: TLabel;
|
|
pMiddleCapt: TPanel;
|
|
Bevel4: TBevel;
|
|
//=== "Root" page ========================================================
|
|
PageControl: TPageControl;
|
|
tabRoot: TTabSheet;
|
|
chCaseRoot: TCheckBox;
|
|
chEnabledRoot: TCheckBox;
|
|
lbDelimitersRoot: TLabel;
|
|
edDelimitersRoot: TEdit;
|
|
pRootButtons: TPanel;
|
|
btAddRangeRoot: TButton;
|
|
btAddKeywordsRoot: TButton;
|
|
btAddSetRoot: TButton;
|
|
//=== "Range" page =======================================================
|
|
tabRange: TTabSheet;
|
|
chCaseRange: TCheckBox;
|
|
chEnabledRange: TCheckBox;
|
|
btChooseRule: TButton;
|
|
lbRangeFrom: TLabel;
|
|
edFrom: TEdit;
|
|
btFromList: TButton;
|
|
btFromMenu: TButton;
|
|
chFromEOL: TCheckBox;
|
|
lbRangeTo: TLabel;
|
|
edTo: TEdit;
|
|
btToList: TButton;
|
|
btToMenu: TButton;
|
|
chToEOL: TCheckBox;
|
|
chCloseOnWord: TCheckBox;
|
|
chCloseOnEOL: TCheckBox;
|
|
chCloseParent: TCheckBox;
|
|
lbDelimitersRange: TLabel;
|
|
edDelimitersRange: TEdit;
|
|
pRangeButtons: TPanel;
|
|
btAddRange: TButton;
|
|
btAddKeywords: TButton;
|
|
btAddSet: TButton;
|
|
//=== "Keywords" page ====================================================
|
|
tabKeywords: TTabSheet;
|
|
Memo: TMemo;
|
|
pProp: TPanel;
|
|
chEnabledKeyList: TCheckBox;
|
|
btSort_old: TButton;
|
|
btLowerCase_old: TButton;
|
|
btSpacesToEol_old: TButton;
|
|
lbKeywordCount: TLabel;
|
|
//=== "Set" page =========================================================
|
|
tabSet: TTabSheet;
|
|
chAnyStart: TCheckBox;
|
|
chEnabledSet: TCheckBox;
|
|
lbSymbSet: TLabel;
|
|
edSymbSet: TEdit;
|
|
//=== Panel "Sample text" ================================================
|
|
pBottom: TPanel;
|
|
pBottomParentCapt: TPanel;
|
|
lbSampMin: TLabel;
|
|
lbSampMax: TLabel;
|
|
pBottomCapt: TPanel;
|
|
Bevel5: TBevel;
|
|
SampleMemo: TSynEdit;
|
|
//=== Panel with "finish" buttons ========================================
|
|
StatusBar: TStatusBar;
|
|
pButtons: TPanel;
|
|
SplitterButtons: TSplitter;
|
|
btOk: TButton;
|
|
btCancel: TButton;
|
|
btApply: TButton;
|
|
//=== Invisible components ===============================================
|
|
SynUniSyn: TSynUniSyn;
|
|
listImages: TImageList;
|
|
listRules: TImageList;
|
|
listColors16: TImageList;
|
|
listColors40: TImageList;
|
|
listColorsSys: TImageList;
|
|
OpenDialog: TOpenDialog;
|
|
SaveDialog: TSaveDialog;
|
|
tabSeveralRules: TTabSheet;
|
|
Label1: TLabel;
|
|
btSort: TSpeedButton;
|
|
btLowerCase: TSpeedButton;
|
|
btSpacesToEol: TSpeedButton;
|
|
PageControl1: TPageControl;
|
|
TabSheet1: TTabSheet;
|
|
chStrikeOut: TCheckBox;
|
|
chUnderline: TCheckBox;
|
|
chItalic: TCheckBox;
|
|
chBold: TCheckBox;
|
|
pForeColorBox: TPanel;
|
|
pForeColor: TPanel;
|
|
pForeColorArrow: TPanel;
|
|
pBackColorBox: TPanel;
|
|
pBackColor: TPanel;
|
|
pBackColorArrow: TPanel;
|
|
chForeground: TCheckBox;
|
|
chBackground: TCheckBox;
|
|
TabSheet2: TTabSheet;
|
|
CheckBox1: TCheckBox;
|
|
CheckBox2: TCheckBox;
|
|
CheckBox3: TCheckBox;
|
|
CheckBox4: TCheckBox;
|
|
Panel2: TPanel;
|
|
Panel3: TPanel;
|
|
Panel4: TPanel;
|
|
Panel5: TPanel;
|
|
Panel6: TPanel;
|
|
Panel7: TPanel;
|
|
CheckBox5: TCheckBox;
|
|
CheckBox6: TCheckBox;
|
|
CheckBox7: TCheckBox;
|
|
Button1: TButton;
|
|
CheckBox8: TCheckBox;
|
|
Bevel6: TBevel;
|
|
Label3: TLabel;
|
|
edStylesFile: TEdit;
|
|
btStylesFile: TButton;
|
|
cbStyle: TComboBox;
|
|
Label2: TLabel;
|
|
Label4: TLabel;
|
|
Label5: TLabel;
|
|
ComboBox2: TComboBox;
|
|
OpenDialog2: TOpenDialog;
|
|
Button3: TButton;
|
|
Button4: TButton;
|
|
Label6: TLabel;
|
|
|
|
//============================ M E T O D S ===================================
|
|
//=== Form events ============================================================
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure FormShow(Sender: TObject);
|
|
procedure FormKeyPress(Sender: TObject; var Key: Char);
|
|
procedure FormKeyDown(Sender: TObject; var Key: Word;
|
|
Shift: TShiftState);
|
|
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
|
|
//=== Translate ==============================================================
|
|
procedure OldTranslate(LangFile: String); //SCHMaster 2004
|
|
procedure Translate(LangFile: String);
|
|
//=== TreeView ===============================================================
|
|
procedure TreeEdited(Sender: TObject; Node: TTreeNode; var S: String);
|
|
procedure TreeKeyDown(Sender: TObject; var Key: Word;
|
|
Shift: TShiftState);
|
|
procedure TreeMouseDown(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
procedure TreeMouseUp(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
procedure TreeChange(Sender: TObject; Node: TTreeNode);
|
|
//=== Fill Tree with Rules ===================================================
|
|
procedure FillTree;
|
|
procedure SetNodeData(Node: TTreeNode; Rule: TAbstractRule; Root: boolean = False);
|
|
function TreeAddRule(ParentNode: TTreeNode; Rule: TSynRule;
|
|
AddKind: TAddKind = akAdd): TTreeNode;
|
|
function TreeAddRangeLink(Node: TTreeNode; RangeLink: TSynRangeLink;
|
|
AddKind: TAddKind = akAdd): TTreeNode;
|
|
function TreeAddRange(Node: TTreeNode; Range: TSynRange;
|
|
AddKind: TAddKind = akAdd): TTreeNode;
|
|
function TreeAddKeyList(Node: TTreeNode; Keyword: TSynKeyList;
|
|
AddKind: TAddKind = akAdd): TTreeNode;
|
|
function TreeAddSet(Node: TTreeNode; SymbSet: TSynSet;
|
|
AddKind: TAddKind = akAdd): TTreeNode;
|
|
//=== Adding RangeLink =======================================================
|
|
procedure DoAddRangeLinkToRoot(Sender: TObject);
|
|
procedure DoAddRangeLink(Sender: TObject);
|
|
procedure AddingRangeLink(ParentNode: TTreeNode);
|
|
//=== Adding Range ===========================================================
|
|
procedure DoAddRangeToRoot(Sender: TObject);
|
|
procedure DoAddRange(Sender: TObject);
|
|
procedure AddingRange(ParentNode: TTreeNode);
|
|
//=== Adding KeyList =========================================================
|
|
procedure DoAddKeywordToRoot(Sender:TObject);
|
|
procedure DoAddKeyword(Sender: TObject);
|
|
procedure AddingKeyWord(ParentNode: TTreeNode);
|
|
//=== Adding Set =============================================================
|
|
procedure DoAddSetToRoot(Sender:TObject);
|
|
procedure DoAddSet(Sender: TObject);
|
|
procedure AddingSet(ParentNode: TTreeNode);
|
|
//=== Delete and Rename Rules ================================================
|
|
procedure DoDeleteNode(Sender: TObject);
|
|
procedure DeleteNode(Node: TTreeNode; OnlyChilds: boolean = False);
|
|
procedure DoRenameNode(Sender: TObject);
|
|
//=== Useful functions... ====================================================
|
|
function GetNodeType(Node: TTreeNode): TNodeType;
|
|
procedure TotalUpdate;
|
|
procedure Modified(State: boolean = True);
|
|
//=== KeyList Tools ==========================================================
|
|
procedure btSort_oldClick(Sender: TObject);
|
|
procedure btLowerCase_oldClick(Sender: TObject);
|
|
procedure btSpacesToEol_oldClick(Sender: TObject);
|
|
//=== Finish buttons =========================================================
|
|
procedure btOkClick(Sender: TObject);
|
|
procedure btCancelClick(Sender: TObject);
|
|
procedure btApplyClick(Sender: TObject);
|
|
//=== Work with schemes ======================================================
|
|
{ procedure btNewSchemeClick(Sender: TObject);
|
|
procedure btDelSchemeClick(Sender: TObject);
|
|
procedure cbSchemeChange(Sender: TObject);
|
|
procedure cbSchemeSelect(Sender: TObject);}
|
|
//=== Rules changed ==========================================================
|
|
procedure RootChange(Sender: TObject);
|
|
procedure RangeChange(Sender: TObject);
|
|
procedure KeywordsChange(Sender: TObject);
|
|
procedure SetChange(Sender: TObject);
|
|
//=== Wotk with Attributes ===================================================
|
|
procedure AttributesChanged(Sender: TObject);
|
|
procedure SetDefaultAttributes(Node: TTreeNode);
|
|
procedure SetControlAttributes(Node: TTreeNode; AlreadyUpdate: boolean = False);
|
|
procedure SetAttributes(Node: TTreeNode);
|
|
|
|
//============================ D E S I G N ===================================
|
|
//=== Splitter CanResize =====================================================
|
|
procedure SplitterBottomCanResize(Sender: TObject;
|
|
var NewSize: Integer; var Accept: Boolean);
|
|
procedure SplitterCannotResize(Sender: TObject;
|
|
var NewSize: Integer; var Accept: Boolean);
|
|
//=== Label Mouse Leave/Enter ================================================
|
|
procedure LabelMouseLeave(Sender: TObject);
|
|
procedure LabelMouseEnter(Sender: TObject);
|
|
procedure LabelContextPopup(Sender: TObject; MousePos: TPoint;
|
|
var Handled: Boolean);
|
|
//=== CheckBox ===============================================================
|
|
procedure CheckBoxMouseDown(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
procedure DontNeedContextPopup(Sender: TObject; MousePos: TPoint;
|
|
var Handled: Boolean);
|
|
//=== Show/Hide panels =======================================================
|
|
procedure ShowHideTree(Sender: TObject);
|
|
procedure ShowHideProp(Sender: TObject);
|
|
procedure ShowHideAttr(Sender: TObject);
|
|
procedure ShowHideSamp(Sender: TObject);
|
|
procedure PanelDblClick(Sender: TObject);
|
|
//=== Middle panel Resize ====================================================
|
|
procedure pMiddleResize(Sender: TObject);
|
|
//=== Push label clicks ======================================================
|
|
procedure lbPropBackClick(Sender: TObject);
|
|
procedure lbRootMenuClick(Sender: TObject);
|
|
procedure lbRuleMenuClick(Sender: TObject);
|
|
procedure lbSampMaxClick(Sender: TObject);
|
|
//procedure lbSampRestoreClick(Sender: TObject);
|
|
procedure lbSampMinClick(Sender: TObject);
|
|
|
|
//============================ P O P U P S ===================================
|
|
//=== Standard PopupMenu =====================================================
|
|
procedure SetPopupMenuEnables(Edit: TCustomEdit; popMenu: TPopupMenu);
|
|
procedure EditKeyDown(Sender: TObject; var Key: Word;
|
|
Shift: TShiftState);
|
|
procedure EditContextPopup(Sender: TObject; MousePos: TPoint;
|
|
var Handled: Boolean);
|
|
procedure popCopyClick(Sender: TObject);
|
|
procedure popUndoClick(Sender: TObject);
|
|
procedure popCutClick(Sender: TObject);
|
|
procedure popPasteClick(Sender: TObject);
|
|
procedure popDeleteClick(Sender: TObject);
|
|
procedure popSelectAllClick(Sender: TObject);
|
|
//=== Sample Memo PopupMenu ==================================================
|
|
procedure SetPopupMenuEnables2(Edit: TCustomSynEdit; popMenu: TPopupMenu);
|
|
procedure SampleMemoKeyDown(Sender: TObject; var Key: Word;
|
|
Shift: TShiftState);
|
|
procedure SampleMemoMouseDown(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
procedure Undo1Click(Sender: TObject);
|
|
procedure Cut1Click(Sender: TObject);
|
|
procedure Copy1Click(Sender: TObject);
|
|
procedure Paste1Click(Sender: TObject);
|
|
procedure Delete1Click(Sender: TObject);
|
|
procedure SelectAll1Click(Sender: TObject);
|
|
procedure AddselectedtoKeywords1Click(Sender: TObject);
|
|
procedure popSampleMemoMenuPopup(Sender: TObject);
|
|
//=== Tag Menu Clicks... =====================================================
|
|
procedure btTagMenuClick(Sender: TObject);
|
|
procedure miTagMenuClick(Sender: TObject);
|
|
procedure miOpenTagMenuClick(Sender: TObject);
|
|
procedure miCloseTagMenuClick(Sender: TObject);
|
|
//=== ColorBox Clicks... =====================================================
|
|
procedure PanelColorChange(Sender: TObject);
|
|
procedure miColor16Click(Sender: TObject);
|
|
procedure miColorSysClick(Sender: TObject);
|
|
procedure miColor40Click(Sender: TObject);
|
|
{$IFNDEF FPC}
|
|
procedure Color40MeasureItem(Sender: TObject; ACanvas: TCanvas;
|
|
var Width, Height: Integer);
|
|
{$ELSE}
|
|
procedure Color40MeasureItem(Sender: TObject; ACanvas: TCanvas;
|
|
var AWidth, AHeight: Integer);
|
|
{$ENDIF}
|
|
procedure pColorMouseUp(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
procedure pColorArrowMouseUp(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
//=== TabSheet showing =======================================================
|
|
procedure tabRootShow(Sender: TObject);
|
|
procedure tabRangeShow(Sender: TObject);
|
|
procedure tabKeywordsShow(Sender: TObject);
|
|
procedure tabSetShow(Sender: TObject);
|
|
//=== Work with files ========================================================
|
|
// procedure LoadFromFileClick(Sender: TObject);
|
|
procedure rootSaveToFileClick(Sender: TObject);
|
|
procedure rootLoadFromFileClick(Sender: TObject);
|
|
procedure rangeLoadFromFileClick(Sender: TObject);
|
|
procedure rangeSaveToFileClick(Sender: TObject);
|
|
//=== Clipboard ==============================================================
|
|
procedure StreamToClipboard(Stream: TStream);
|
|
function GetClipboardAsStream: TMemoryStream;
|
|
//=== Root range =============================================================
|
|
procedure rootCutClick(Sender: TObject);
|
|
procedure rootCopyClick(Sender: TObject);
|
|
procedure rootPasteInsideClick(Sender: TObject);
|
|
procedure rootPasteAndReplaceClick(Sender: TObject);
|
|
//=== Other rules ============================================================
|
|
procedure rangeCutClick(Sender: TObject);
|
|
procedure rangeCopyClick(Sender: TObject);
|
|
procedure rangePasteInsideClick(Sender: TObject);
|
|
procedure rangePasteAndReplaceClick(Sender: TObject);
|
|
procedure rangePasteNextToClick(Sender: TObject);
|
|
|
|
//=== NOT SORTED =============================================================
|
|
procedure rootInfoClick(Sender: TObject);
|
|
procedure TreeClick(Sender: TObject);
|
|
procedure btStylesFileClick(Sender: TObject);
|
|
|
|
private
|
|
{ Private declarations }
|
|
public
|
|
{ Public declarations }
|
|
popPropMenu: TPopupMenu;
|
|
OriginalSyn: TSynUniSyn;
|
|
ForceClose: boolean;
|
|
UpdatingControls: boolean;
|
|
ShowDialog: boolean;
|
|
_Modified, _Confirm, _DeleteNode, _SaveChanges, _EnterName, _DeleteScheme,
|
|
_Lines, _Name, _Extensions, _Version, _Date, _Author, _Mail, _Web,
|
|
_Copyright, _Company, _Remark: string;
|
|
end;
|
|
|
|
TSynUniDesigner = class(TObject)
|
|
private
|
|
Form: TfmDesigner;
|
|
//=== Standard metods ========================================================
|
|
function Execute(FormTitle: string; LangFile: string): boolean;
|
|
procedure SetSample(const Value: string);
|
|
function GetSample: string;
|
|
procedure SetTitle(const Value: string);
|
|
function GetTitle: string;
|
|
public
|
|
constructor Create(Highlighter: TSynUniSyn);
|
|
destructor Destroy; override;
|
|
property Title: string read GetTitle write SetTitle;
|
|
property Sample: string read GetSample write SetSample;
|
|
class function EditHighlighter(OriginalSyn: TSynUniSyn;
|
|
FormTitle: string = ''; LangFile: string = ''): boolean;
|
|
end;
|
|
|
|
implementation
|
|
|
|
{$R *.dfm}
|
|
|
|
{$IFDEF SYN_CLX}
|
|
uses Qt;
|
|
|
|
const
|
|
VK_F1 = Key_F1;
|
|
VK_F2 = Key_F2;
|
|
VK_RETURN = Key_Return;
|
|
VK_DELETE = Key_Delete;
|
|
{$ENDIF}
|
|
|
|
const Colors16: array [0..15] of TColor = (clBlack, clMaroon, clGreen, clOlive,
|
|
clNavy, clPurple, clTeal, clGray, clSilver, clRed, clLime, clYellow,
|
|
clBlue, clFuchsia, clAqua, clWhite);
|
|
const Colors16s: array [0..15] of string = ('Black', 'Maroon', 'Green', 'Olive',
|
|
'Navy', 'Purple', 'Teal', 'Gray', 'Silver', 'Red', 'Lime', 'Yellow',
|
|
'Blue', 'Fuchsia', 'Aqua', 'White');
|
|
const Colors40: array [0..39] of TColor = (
|
|
$000000, $000080, $0000FF, $FF00FF, $CC99FF,
|
|
$003399, $0066FF, $0099FF, $00CCFF, $99CCFF,
|
|
$003333, $008080, $00CC99, $00FFFF, $99FFFF,
|
|
$003300, $008000, $669933, $00FF00, $CCFFCC,
|
|
$663300, $808000, $CCCC33, $FFFF00, $FFFFCC,
|
|
$800000, $FF0000, $FF6633, $FFCC00, $FFCC99,
|
|
$993333, $996666, $800080, $663399, $FF99CC,
|
|
$333333, $808080, $969696, $C0C0C0, $FFFFFF);
|
|
const ColorsSys: array [0..27] of TColor = (clActiveBorder, clActiveCaption,
|
|
clAppWorkSpace, clBackground, clBtnFace, clBtnHighlight, clBtnShadow,
|
|
clBtnText, clCaptionText, clDefault, clGradientActiveCaption,
|
|
clGradientInactiveCaption, clGrayText, clHighlight, clHighlightText,
|
|
clInactiveBorder, clInactiveCaption, clInactiveCaptionText,
|
|
clInfoBk, clInfoText, clMenu, clMenuText, clScrollBar, cl3DDkShadow,
|
|
cl3DLight, clWindow, clWindowFrame, clWindowText);
|
|
|
|
const
|
|
_pTopHeight = 210;
|
|
|
|
function GetFontStyle(Bold, Italic, Underline, StrikeOut: boolean): TFontStyles;
|
|
begin
|
|
Result := [];
|
|
if Bold then Result := Result + [fsBold];
|
|
if Italic then Result := Result + [fsItalic];
|
|
if Underline then Result := Result + [fsUnderline];
|
|
if Strikeout then Result := Result + [fsStrikeOut];
|
|
end;
|
|
|
|
constructor TSynUniDesigner.Create(Highlighter: TSynUniSyn);
|
|
(*{$IFNDEF SYN_CLX}Tree.HideSelection:=False;Tree.RightClickSelect:=True;{$ENDIF}*)
|
|
begin
|
|
inherited Create;
|
|
Form := TfmDesigner.Create(nil);
|
|
Form.OriginalSyn := Highlighter;
|
|
{popRangeMenu.Items.Items[1].Caption := '&Go to subnode';}
|
|
{Tree.DragMode := dmAutomatic;}
|
|
{CreateButtonLabel(lbSampRestore, pBottomParentCapt, alRight, #50, 'Restore');}
|
|
end;
|
|
|
|
(*procedure TSynUniDesigner.DelimDblClick(Sender: TObject);
|
|
begin
|
|
(Sender as TEdit).Text := Set2String( DefaultTermSymbols );
|
|
end;*)
|
|
|
|
destructor TSynUniDesigner.Destroy;
|
|
begin
|
|
Form.SampleMemo.Highlighter := nil;
|
|
Form.SampleMemo.Free;
|
|
Form.Free;
|
|
inherited;
|
|
end;
|
|
|
|
class function TSynUniDesigner.EditHighlighter(OriginalSyn: TSynUniSyn; FormTitle: string; LangFile: string): boolean;
|
|
begin
|
|
with Create(OriginalSyn) do begin
|
|
Result := Execute(FormTitle, LangFile);
|
|
Free;
|
|
end;
|
|
end;
|
|
|
|
//=== Standard metods ========================================================
|
|
procedure TSynUniDesigner.SetSample(const Value: string);
|
|
begin
|
|
Form.SampleMemo.Text := Value;
|
|
end;
|
|
|
|
function TSynUniDesigner.GetSample: string;
|
|
begin
|
|
Result := Form.SampleMemo.Text;
|
|
end;
|
|
|
|
procedure TSynUniDesigner.SetTitle(const Value: string);
|
|
begin
|
|
Form.Caption := Value;
|
|
end;
|
|
|
|
function TSynUniDesigner.GetTitle: string;
|
|
begin
|
|
Result := Form.Caption;
|
|
end;
|
|
|
|
|
|
//================== SCHMaster ==================
|
|
{$IFDEF SYNPLUS}
|
|
function TSynUniDesigner.Execute(FormTitle: string; LangFile: string): boolean;
|
|
var
|
|
msg : TMsg;
|
|
TcClosed: boolean;
|
|
begin
|
|
/////////////////////////
|
|
if FormTitle <> '' then Title := FormTitle;
|
|
Form.Translate(LangFile);
|
|
TcClosed := False;
|
|
Form.ModalResult := mrNone;
|
|
Form.Show;
|
|
|
|
while (Form.ModalResult = mrNone) do begin
|
|
GetMessage({$IFDEF FPC} @ {$ENDIF}msg, 0, 0, 0);
|
|
if (msg.message = WM_QUIT) then begin
|
|
TcClosed := True;
|
|
Form.ModalResult := mrCancel;
|
|
result:=False;
|
|
end else begin
|
|
Result := (Form.ModalResult = mrOk);
|
|
TranslateMessage({$IFDEF FPC} @ {$ENDIF}msg);
|
|
DispatchMessage({$IFDEF FPC} @ {$ENDIF}msg);
|
|
end;
|
|
end;
|
|
|
|
Result := (Form.ModalResult = mrOk);
|
|
if TcClosed then
|
|
PostMessage(msg.hwnd, msg.message, msg.wParam, msg.lParam);
|
|
/////////////////////////
|
|
end;
|
|
{$ELSE}
|
|
function TSynUniDesigner.Execute(FormTitle: string; LangFile: string): boolean;
|
|
begin
|
|
if FormTitle <> '' then Title := FormTitle;
|
|
Form.Translate(LangFile);
|
|
Result := (Form.ShowModal = mrOk);
|
|
end;
|
|
{$ENDIF}
|
|
//===============================================
|
|
|
|
|
|
|
|
|
|
/// ///
|
|
/// NNNN NNNN EEEEEEEEEEE WWWW WWWW $$$ $$$ $$$ ///
|
|
/// NNNN NN EE EE WW WW $$$$$ $$$$$ $$$$$ ///
|
|
/// NN NN NN EE E E WW WW $$$$$ $$$$$ $$$$$ ///
|
|
/// NN NN NN EEEEEE WW WW WW $$$$$ $$$$$ $$$$$ ///
|
|
/// NN NN NN EE T T WW WWWW WW $$$ $$$ $$$ ///
|
|
/// NN NNNN EE TT WWW WWWW ///
|
|
/// NNNN NNNN EEEETTTTTTT WW WW $$$ $$$ $$$ ///
|
|
/// ///
|
|
//============================ M E T O D S ===================================
|
|
//=== Form events ============================================================
|
|
procedure TfmDesigner.FormCreate(Sender: TObject);
|
|
|
|
procedure AddBitmap(ImageList: TImageList; aColor: TColor; aSize: integer; aSymbol: string);
|
|
var Bitmap: TBitmap;
|
|
begin
|
|
Bitmap := TBitmap.Create;
|
|
with Bitmap do begin
|
|
Width := 16; Height := 16;
|
|
end;
|
|
with Bitmap.Canvas do begin
|
|
Font.Name := 'Marlett'; Font.Color := aColor;
|
|
Font.Size := aSize;
|
|
{$IFNDEF FPC}
|
|
TextOut(1, 1, aSymbol);
|
|
{$ELSE}
|
|
TextOut(0, 0, aSymbol);
|
|
{$ENDIF}
|
|
ImageList.AddMasked(Bitmap, clWhite);
|
|
end;
|
|
Bitmap.Free;
|
|
end;
|
|
|
|
procedure AddBitmapColor(out ImageList: TImageList; aColor: TColor);
|
|
var Bitmap: TBitmap;
|
|
begin
|
|
Bitmap := TBitmap.Create;
|
|
with Bitmap do begin
|
|
Width := 16; Height := 16;
|
|
end;
|
|
with Bitmap.Canvas do begin
|
|
Brush.Color := clBtnFace; FillRect(Rect(0, 0, 16, 16));
|
|
Brush.Color := aColor; Rectangle(1, 1, 15, 15);
|
|
ImageList.AddMasked(Bitmap, clBtnFace);
|
|
end;
|
|
Bitmap.Free;
|
|
end;
|
|
|
|
procedure CreateMenuItem(out popMenu: TPopupMenu; aCaption: TCaption;
|
|
aOnClick: TNotifyEvent; aImageIndex: integer); overload;
|
|
begin
|
|
popMenu.Items.Add(TMenuItem.Create(Self));
|
|
with popMenu.Items.Items[popMenu.Items.Count-1] do begin
|
|
Caption := aCaption; ImageIndex := aImageIndex; OnClick := aOnClick;
|
|
end;
|
|
end;
|
|
|
|
var
|
|
i: integer;
|
|
begin
|
|
ForceClose := False;
|
|
UpdatingControls := False;
|
|
ShowDialog := True;
|
|
|
|
_DeleteNode := 'Are you sure you want to delete "%s"?';
|
|
_SaveChanges := 'Save changes in highlight rools?';
|
|
_EnterName := 'Enter Scheme Name:';
|
|
_DeleteScheme := 'Delete current color scheme?';
|
|
_Modified := 'Modified';
|
|
_Confirm := 'Confirm';
|
|
_Lines := 'Lines: %d';
|
|
_Name := 'Name: %s';
|
|
_Extensions := 'Extensions: %s';
|
|
_Version := 'Version: %s';
|
|
_Date := 'Date: %s';
|
|
_Author := 'Author: %s';
|
|
_Mail := 'Mail: %s';
|
|
_Web := 'Web: %s';
|
|
_Copyright := 'Copyright: %s';
|
|
_Company := 'Company: %s';
|
|
_Remark := 'Remark: %s';
|
|
|
|
Caption := 'Unihighlighter Designer © Fantasist, Vit, Vitalik (2002-2004)';
|
|
if SynUniSyn.Info.General.Name <> '' then
|
|
Caption := Caption + ' - [' + SynUniSyn.Info.General.Name + ']';
|
|
|
|
popColorStd.Images := listColors16;
|
|
for i := 0 to 15 do begin
|
|
AddBitmapColor(listColors16, Colors16[i]);
|
|
CreateMenuItem(popColorStd, Colors16s[i], miColor16Click, i);
|
|
end;
|
|
|
|
{$note May be error...}
|
|
{$IFNDEF FPC}
|
|
popColorStd.Items[8].Break := {$IFDEF FPC} @ {$ENDIF}mbBarBreak;
|
|
{$ENDIF}
|
|
|
|
popColorAdv.Images := listColors40;
|
|
for i := 0 to 39 do begin
|
|
AddBitmapColor(listColors40, Colors40[i]);
|
|
CreateMenuItem(popColorAdv, '', miColor40Click, i);
|
|
{$note May be error...}
|
|
{$IFNDEF FPC}
|
|
popColorAdv.Items.Items[i].OnMeasureItem := Color40MeasureItem;
|
|
{$ENDIF}
|
|
end;
|
|
{$note May be error...}
|
|
{$IFNDEF FPC}
|
|
for i := 1 to 7 do
|
|
popColorAdv.Items[5*i].Break := mbBreak;
|
|
{$ENDIF}
|
|
|
|
popColorSys.Images := listColorsSys;
|
|
for i := 0 to 27 do begin
|
|
AddBitmapColor(listColorsSys, ColorsSys[i]);
|
|
CreateMenuItem(popColorSys, ColorToString(ColorsSys[i]), miColorSysClick, i);
|
|
end;
|
|
{$note May be error...}
|
|
{$IFNDEF FPC}
|
|
popColorSys.Items[14].Break := mbBarBreak;
|
|
{$ENDIF}
|
|
|
|
AddBitmap(listRules, clRed, 14, #52); //: Image0: 'Root Range'
|
|
AddBitmap(listRules, clGreen, 14, #52); //: Image1: 'Range'
|
|
AddBitmap(listRules, clBlue, 14, #104); //: Image2: 'Keyword'
|
|
AddBitmap(listRules, clMaroon, 14, #104); //: Image3: 'Set'
|
|
AddBitmap(listRules, clOlive, 14, #52); //: Image1: 'RangeLink'
|
|
AddBitmap(listRules, clOlive, 14, #52); //: Image4: 'Conteiner'
|
|
|
|
{ cbScheme.Items.AddStrings(SynUniSyn.SchemesList);
|
|
cbScheme.ItemIndex := SynUniSyn.SchemeIndex;}
|
|
|
|
SampleMemo.Highlighter := SynUniSyn;
|
|
SampleMemo.Lines.Text := SynUniSyn.Info.Sample.Text;
|
|
end;
|
|
|
|
procedure TfmDesigner.FormShow(Sender: TObject);
|
|
var
|
|
Stream: TMemoryStream;
|
|
begin
|
|
Stream := TMemoryStream.Create;
|
|
try
|
|
OriginalSyn.SaveToStream(Stream);
|
|
OriginalSyn.SaveToFile('r:\test.xml');
|
|
Stream.Position := 0;
|
|
try
|
|
if Stream.Size <> 0 then SynUniSyn.LoadFromStream(Stream, False);
|
|
Stream.Clear;
|
|
SampleMemo.Text := OriginalSyn.Info.Sample.Text;
|
|
finally end;
|
|
finally
|
|
Stream.Free;
|
|
end;
|
|
|
|
FillTree;
|
|
Tree.Selected := Tree.Items[0];
|
|
TreeChange(nil, Tree.Selected);
|
|
Tree.Items[0].Expand(False);
|
|
end;
|
|
|
|
procedure TfmDesigner.FormKeyPress(Sender: TObject; var Key: Char);
|
|
begin
|
|
if (Key = #27) and (not Tree.IsEditing) then Close;
|
|
end;
|
|
|
|
procedure TfmDesigner.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
|
|
begin
|
|
if Key = VK_F1 then
|
|
if ssCtrl in Shift then
|
|
rootInfoClick(Sender)
|
|
else
|
|
Application.MessageBox('UniHighlighter Component'+#13#10#13#10+
|
|
'Copyright © 2002-2004:'+#13#10+
|
|
'Fantasist (walking_in_the_sky@yahoo.com)'+#13#10+
|
|
'Vit (nevzorov@yahoo.com)'+#13#10+
|
|
'Vitalik (vetal-x@mail.ru)'+#13#10#13#10+
|
|
'Official Web Site: www.delphist.com'{+#13#10#13#10+
|
|
'Thanks to:'+#13#10+
|
|
'P@VeL, '+
|
|
'bouville, '+
|
|
'StayAtHome, '+
|
|
'Jasny, '+
|
|
'SCHMaster'},
|
|
'About...', MB_ICONINFORMATION)
|
|
else
|
|
if (ssAlt in Shift) and (ssShift in Shift) and (ssCtrl in Shift) and (Key = VK_F12) then begin
|
|
edStylesFile.Enabled := True;
|
|
btStylesFile.Enabled := True;
|
|
cbStyle.Enabled := True;
|
|
end;
|
|
end;
|
|
|
|
procedure TfmDesigner.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
|
|
var
|
|
Choise: integer;
|
|
begin
|
|
if Tree.IsEditing then Tree.Selected.EndEdit(False);
|
|
if ModalResult = mrOk then Exit;
|
|
if btApply.Enabled then begin
|
|
if ForceClose then Exit;
|
|
Choise := Application.MessageBox(PChar(_SaveChanges), PChar(_Confirm), MB_YESNOCANCEL+MB_ICONQUESTION);
|
|
if Choise = ID_YES then begin
|
|
btApplyClick(Sender);
|
|
ModalResult := mrOk
|
|
end
|
|
else if Choise = ID_NO then
|
|
ModalResult := mrCancel
|
|
else
|
|
CanClose := False;
|
|
end
|
|
else
|
|
ModalResult := mrCancel;
|
|
|
|
//================== SCHMaster ==================
|
|
{$IFDEF SYNPLUS}
|
|
if ModalResult = mrNone then
|
|
ModalResult:=mrCancel;
|
|
{$ENDIF}
|
|
//===============================================
|
|
end;
|
|
|
|
//=== Translate ==============================================================
|
|
procedure TfmDesigner.OldTranslate(LangFile: String); //SCHMaster 2004
|
|
var
|
|
L: TStringList;
|
|
begin
|
|
L := TStringList.Create;
|
|
if (LangFile <> '') and FileExists(LangFile) then
|
|
L.LoadFromFile(LangFile);
|
|
|
|
if Length(L.Values['2000'])>2 then Caption := L.Values['2000'] + ' - [' + SynUniSyn.Info.General.Name + ']';
|
|
with popPanels do begin
|
|
if Length(L.Values['2001'])>2 then Items[0].Caption := L.Values['2001'];
|
|
if Length(L.Values['2002'])>2 then Items[1].Caption := L.Values['2002'];
|
|
if Length(L.Values['2003'])>2 then Items[2].Caption := L.Values['2003'];
|
|
if Length(L.Values['2004'])>2 then Items[3].Caption := L.Values['2004'];
|
|
end;
|
|
|
|
if Length(L.Values['2010'])>2 then btOk.Caption := L.Values['2010'];
|
|
if Length(L.Values['2011'])>2 then btCancel.Caption := L.Values['2011'];
|
|
if Length(L.Values['2012'])>2 then btApply.Caption := L.Values['2012'];
|
|
|
|
with popStandard do begin
|
|
if Length(L.Values['2013'])>2 then Items[0].Caption := L.Values['2013'];
|
|
if Length(L.Values['2014'])>2 then Items[2].Caption := L.Values['2014'];
|
|
if Length(L.Values['2015'])>2 then Items[3].Caption := L.Values['2015'];
|
|
if Length(L.Values['2016'])>2 then Items[4].Caption := L.Values['2016'];
|
|
if Length(L.Values['2017'])>2 then Items[5].Caption := L.Values['2017'];
|
|
if Length(L.Values['2018'])>2 then Items[7].Caption := L.Values['2018'];
|
|
end;
|
|
|
|
with popSampleMemoMenu do begin
|
|
if Length(L.Values['2013'])>2 then Items[2].Caption := L.Values['2013'];
|
|
if Length(L.Values['2014'])>2 then Items[4].Caption := L.Values['2014'];
|
|
if Length(L.Values['2015'])>2 then Items[5].Caption := L.Values['2015'];
|
|
if Length(L.Values['2016'])>2 then Items[6].Caption := L.Values['2016'];
|
|
if Length(L.Values['2017'])>2 then Items[7].Caption := L.Values['2017'];
|
|
if Length(L.Values['2018'])>2 then Items[9].Caption := L.Values['2018'];
|
|
end;
|
|
|
|
if Length(L.Values['2020'])>2 then _Modified := L.Values['2020'];
|
|
if Length(L.Values['2030'])>2 then _DeleteNode := L.Values['2030'];
|
|
if Length(L.Values['2031'])>2 then _SaveChanges := L.Values['2031'];
|
|
if Length(L.Values['2032'])>2 then _EnterName := L.Values['2032'];
|
|
if Length(L.Values['2033'])>2 then _DeleteScheme := L.Values['2033'];
|
|
if Length(L.Values['2034'])>2 then _Confirm := L.Values['2034'];
|
|
|
|
if Length(L.Values['2100'])>2 then pLeftCapt.Caption := L.Values['2100'];
|
|
if Length(L.Values['2200'])>2 then pMiddleCapt.Caption := L.Values['2200'];
|
|
if Length(L.Values['2201'])>2 then lbPropBack.Hint := L.Values['2201'];
|
|
if Length(L.Values['2202'])>2 then lbRuleMenu.Hint := L.Values['2202'];
|
|
|
|
with popRootMenu do begin
|
|
if Length(L.Values['2305'])>2 then Items[8].Caption := L.Values['2305'];
|
|
if Length(L.Values['2306'])>2 then Items[9].Caption := L.Values['2306'];
|
|
if Length(L.Values['2307'])>2 then Items[10].Caption := L.Values['2307'];
|
|
if Length(L.Values['2204'])>2 then Items[13].Caption := L.Values['2204'];
|
|
end;
|
|
with popRangeMenu do begin
|
|
if Length(L.Values['2203'])>2 then Items[0].Caption := L.Values['2203'];
|
|
if Length(L.Values['2204'])>2 then Items[16].Caption := L.Values['2204'];
|
|
if Length(L.Values['2406'])>2 then Items[11].Caption := L.Values['2406'];
|
|
if Length(L.Values['2407'])>2 then Items[12].Caption := L.Values['2407'];
|
|
if Length(L.Values['2408'])>2 then Items[13].Caption := L.Values['2408'];
|
|
end;
|
|
with popKeywordsMenu do begin
|
|
if Length(L.Values['2203'])>2 then Items[0].Caption := L.Values['2203'];
|
|
if Length(L.Values['2204'])>2 then Items[11].Caption := L.Values['2204'];
|
|
end;
|
|
with popSetMenu do begin
|
|
if Length(L.Values['2203'])>2 then Items[0].Caption := L.Values['2203'];
|
|
if Length(L.Values['2204'])>2 then Items[11].Caption := L.Values['2204'];
|
|
end;
|
|
|
|
if Length(L.Values['2300'])>2 then chCaseRoot.Caption := L.Values['2300'];
|
|
if Length(L.Values['2300'])>2 then chCaseRange.Caption := L.Values['2300'];
|
|
if Length(L.Values['2301'])>2 then btAddRangeRoot.Caption := L.Values['2301'];
|
|
if Length(L.Values['2301'])>2 then btAddRange.Caption := L.Values['2301'];
|
|
if Length(L.Values['2302'])>2 then btAddKeywordsRoot.Caption := L.Values['2302'];
|
|
if Length(L.Values['2302'])>2 then btAddKeywords.Caption := L.Values['2302'];
|
|
if Length(L.Values['2303'])>2 then btAddSetRoot.Caption := L.Values['2303'];
|
|
if Length(L.Values['2303'])>2 then btAddSet.Caption := L.Values['2303'];
|
|
if Length(L.Values['2304'])>2 then lbDelimitersRoot.Caption := L.Values['2304'];
|
|
if Length(L.Values['2304'])>2 then lbDelimitersRange.Caption := L.Values['2304'];
|
|
|
|
if Length(L.Values['2400'])>2 then lbRangeFrom.Caption := L.Values['2400'];
|
|
if Length(L.Values['2401'])>2 then lbRangeTo.Caption := L.Values['2401'];
|
|
if Length(L.Values['2402'])>2 then chCloseOnWord.Caption := L.Values['2402'];
|
|
if Length(L.Values['2403'])>2 then chCloseOnEOL.Caption := L.Values['2403'];
|
|
if Length(L.Values['2404'])>2 then chCloseParent.Caption := L.Values['2404'];
|
|
|
|
if Length(L.Values['2501'])>2 then btSort.Hint := L.Values['2501'];
|
|
if Length(L.Values['2502'])>2 then btLowercase.Hint := L.Values['2502'];
|
|
if Length(L.Values['2503'])>2 then btSpacesToEol.Hint := L.Values['2503'];
|
|
|
|
if Length(L.Values['2600'])>2 then lbSymbSet.Caption := L.Values['2600'];
|
|
|
|
if Length(L.Values['2700'])>2 then pRightCapt.Caption := L.Values['2700'];
|
|
if Length(L.Values['2701'])>2 then chForeground.Caption := L.Values['2701'];
|
|
if Length(L.Values['2702'])>2 then chBackground.Caption := L.Values['2702'];
|
|
if Length(L.Values['2703'])>2 then chBold.Caption := L.Values['2703'];
|
|
if Length(L.Values['2704'])>2 then chItalic.Caption := L.Values['2704'];
|
|
if Length(L.Values['2705'])>2 then chUnderline.Caption := L.Values['2705'];
|
|
if Length(L.Values['2706'])>2 then chStrikeOut.Caption := L.Values['2706'];
|
|
{ if Length(L.Values['2707'])>2 then lbScheme.Caption := L.Values['2707'];
|
|
if Length(L.Values['2708'])>2 then btNewScheme.Caption := L.Values['2708'];
|
|
if Length(L.Values['2709'])>2 then btDelScheme.Caption := L.Values['2709'];}
|
|
|
|
if Length(L.Values['2800'])>2 then pBottomCapt.Caption := L.Values['2800'];
|
|
if Length(L.Values['2801'])>2 then lbSampMin.Hint := L.Values['2801'];
|
|
if Length(L.Values['2802'])>2 then lbSampMax.Hint := L.Values['2802'];
|
|
|
|
L.Free;
|
|
end;
|
|
|
|
procedure TfmDesigner.Translate(LangFile: String);
|
|
var
|
|
L: TStringList;
|
|
Ini: TIniFile;
|
|
i: integer;
|
|
begin
|
|
L := TStringList.Create;
|
|
if (LangFile = '') or not FileExists(LangFile) then
|
|
Exit;
|
|
{ else
|
|
if ExtractFileExt(LangFile) = '.lng' then begin
|
|
OldTranslate(LangFile); Exit;
|
|
end else
|
|
Ini := TIniFile.Create(LangFile);}
|
|
|
|
OldTranslate(LangFile);
|
|
Ini := TIniFile.Create(LangFile);
|
|
|
|
Ini.ReadSectionValues('Form', L);
|
|
if Length(L.Values['Caption' ]) > 0 then Caption := L.Values['Caption' ];
|
|
if Length(L.Values[btOk.Caption ]) > 0 then btOk.Caption := L.Values[btOk.Caption ];
|
|
if Length(L.Values[btCancel.Caption ]) > 0 then btCancel.Caption := L.Values[btCancel.Caption ];
|
|
if Length(L.Values[btApply.Caption ]) > 0 then btApply.Caption := L.Values[btApply.Caption ];
|
|
if Length(L.Values[_Modified ]) > 0 then _Modified := L.Values[_Modified ];
|
|
if Length(L.Values[_Name ]) > 0 then _Name := L.Values[_Name ];
|
|
if Length(L.Values[_Extensions ]) > 0 then _Extensions := L.Values[_Extensions ];
|
|
if Length(L.Values[_Version ]) > 0 then _Version := L.Values[_Version ];
|
|
if Length(L.Values[_Date ]) > 0 then _Date := L.Values[_Date ];
|
|
if Length(L.Values[_Author ]) > 0 then _Author := L.Values[_Author ];
|
|
if Length(L.Values[_Mail ]) > 0 then _Mail := L.Values[_Mail ];
|
|
if Length(L.Values[_Web ]) > 0 then _Web := L.Values[_Web ];
|
|
if Length(L.Values[_Copyright ]) > 0 then _Copyright := L.Values[_Copyright ];
|
|
if Length(L.Values[_Company ]) > 0 then _Company := L.Values[_Company ];
|
|
if Length(L.Values[_Remark ]) > 0 then _Remark := L.Values[_Remark ];
|
|
if Length(L.Values[_DeleteNode ]) > 0 then _DeleteNode := L.Values[_DeleteNode ];
|
|
if Length(L.Values[_SaveChanges ]) > 0 then _SaveChanges := L.Values[_SaveChanges ];
|
|
if Length(L.Values[_EnterName ]) > 0 then _EnterName := L.Values[_EnterName ];
|
|
if Length(L.Values[_DeleteScheme ]) > 0 then _DeleteScheme := L.Values[_DeleteScheme ];
|
|
if Length(L.Values[_Confirm ]) > 0 then _Confirm := L.Values[_Confirm ];
|
|
|
|
Ini.ReadSectionValues('popPanels', L);
|
|
with popPanels do for i := 0 to 4 do
|
|
if Length(L.Values[Items[i].Caption]) > 0 then Items[i].Caption := L.Values[Items[i].Caption];
|
|
|
|
Ini.ReadSectionValues('popStandard', L);
|
|
with popStandard do for i := 0 to 7 do
|
|
if Length(L.Values[Items[i].Caption]) > 0 then Items[i].Caption := L.Values[Items[i].Caption];
|
|
|
|
Ini.ReadSectionValues('popTagMenus', L);
|
|
with popOpenTagMenu do for i := 0 to 8 do
|
|
if Length(L.Values[Items[i].Caption]) > 0 then Items[i].Caption := L.Values[Items[i].Caption];
|
|
|
|
Ini.ReadSectionValues('popTagMenus', L);
|
|
with popCloseTagMenu do for i := 0 to 8 do
|
|
if Length(L.Values[Items[i].Caption]) > 0 then Items[i].Caption := L.Values[Items[i].Caption];
|
|
|
|
Ini.ReadSectionValues('popRootMenu', L);
|
|
with popRootMenu do for i := 0 to 15 do
|
|
if Length(L.Values[Items[i].Caption]) > 0 then Items[i].Caption := L.Values[Items[i].Caption];
|
|
|
|
Ini.ReadSectionValues('popRangeMenu', L);
|
|
with popRangeMenu do for i := 0 to 16 do
|
|
if Length(L.Values[Items[i].Caption]) > 0 then Items[i].Caption := L.Values[Items[i].Caption];
|
|
|
|
Ini.ReadSectionValues('popKeywordsMenu', L);
|
|
with popKeywordsMenu do for i := 0 to 11 do
|
|
if Length(L.Values[Items[i].Caption]) > 0 then Items[i].Caption := L.Values[Items[i].Caption];
|
|
|
|
Ini.ReadSectionValues('popSetMenu', L);
|
|
with popSetMenu do for i := 0 to 11 do
|
|
if Length(L.Values[Items[i].Caption]) > 0 then Items[i].Caption := L.Values[Items[i].Caption];
|
|
|
|
Ini.ReadSectionValues('popSampleMemoMenu', L);
|
|
with popSampleMemoMenu do for i := 0 to 9 do
|
|
if Length(L.Values[Items[i].Caption]) > 0 then Items[i].Caption := L.Values[Items[i].Caption];
|
|
|
|
Ini.ReadSectionValues('popColorStd', L);
|
|
with popColorStd do for i := 0 to 15 do
|
|
if Length(L.Values[Items[i].Caption]) > 0 then Items[i].Caption := L.Values[Items[i].Caption];
|
|
|
|
Ini.ReadSectionValues('pLeft', L);
|
|
if Length(L.Values[pLeftCapt.Caption ]) > 0 then pLeftCapt.Caption := L.Values[pLeftCapt.Caption ];
|
|
if Length(L.Values[lbRootMenu.Hint ]) > 0 then lbRootMenu.Hint := L.Values[lbRootMenu.Hint ];
|
|
|
|
Ini.ReadSectionValues('pMiddle', L);
|
|
if Length(L.Values[pMiddleCapt.Caption ]) > 0 then pMiddleCapt.Caption := L.Values[pMiddleCapt.Caption ];
|
|
if Length(L.Values[lbPropBack.Hint ]) > 0 then lbPropBack.Hint := L.Values[lbPropBack.Hint ];
|
|
if Length(L.Values[lbRuleMenu.Hint ]) > 0 then lbRuleMenu.Hint := L.Values[lbRuleMenu.Hint ];
|
|
|
|
Ini.ReadSectionValues('tabRoot', L);
|
|
if Length(L.Values[chCaseRoot.Caption ]) > 0 then chCaseRoot.Caption := L.Values[chCaseRoot.Caption ];
|
|
if Length(L.Values[chEnabledRoot.Caption ]) > 0 then chEnabledRoot.Caption := L.Values[chEnabledRoot.Caption ];
|
|
if Length(L.Values[lbDelimitersRoot.Caption ]) > 0 then lbDelimitersRoot.Caption := L.Values[lbDelimitersRoot.Caption ];
|
|
if Length(L.Values[btAddRangeRoot.Caption ]) > 0 then btAddRangeRoot.Caption := L.Values[btAddRangeRoot.Caption ];
|
|
if Length(L.Values[btAddKeywordsRoot.Caption ]) > 0 then btAddKeywordsRoot.Caption := L.Values[btAddKeywordsRoot.Caption ];
|
|
if Length(L.Values[btAddSetRoot.Caption ]) > 0 then btAddSetRoot.Caption := L.Values[btAddSetRoot.Caption ];
|
|
|
|
Ini.ReadSectionValues('tabRange', L);
|
|
if Length(L.Values[chCaseRange.Caption ]) > 0 then chCaseRange.Caption := L.Values[chCaseRange.Caption ];
|
|
if Length(L.Values[chEnabledRange.Caption ]) > 0 then chEnabledRange.Caption := L.Values[chEnabledRange.Caption ];
|
|
if Length(L.Values[lbRangeFrom.Caption ]) > 0 then lbRangeFrom.Caption := L.Values[lbRangeFrom.Caption ];
|
|
if Length(L.Values[lbRangeTo.Caption ]) > 0 then lbRangeTo.Caption := L.Values[lbRangeTo.Caption ];
|
|
if Length(L.Values[chCloseOnWord.Caption ]) > 0 then chCloseOnWord.Caption := L.Values[chCloseOnWord.Caption ];
|
|
if Length(L.Values[chCloseOnEol.Caption ]) > 0 then chCloseOnEol.Caption := L.Values[chCloseOnEol.Caption ];
|
|
if Length(L.Values[chCloseParent.Caption ]) > 0 then chCloseParent.Caption := L.Values[chCloseParent.Caption ];
|
|
if Length(L.Values[lbDelimitersRange.Caption ]) > 0 then lbDelimitersRange.Caption := L.Values[lbDelimitersRange.Caption ];
|
|
if Length(L.Values[btAddRange.Caption ]) > 0 then btAddRange.Caption := L.Values[btAddRange.Caption ];
|
|
if Length(L.Values[btAddKeywords.Caption ]) > 0 then btAddKeywords.Caption := L.Values[btAddKeywords.Caption ];
|
|
if Length(L.Values[btAddSet.Caption ]) > 0 then btAddSet.Caption := L.Values[btAddSet.Caption ];
|
|
|
|
Ini.ReadSectionValues('tabKeywords', L);
|
|
if Length(L.Values[chEnabledKeyList.Caption ]) > 0 then chEnabledKeyList.Caption := L.Values[chEnabledKeyList.Caption ];
|
|
if Length(L.Values[btSort.Hint ]) > 0 then btSort.Hint := L.Values[btSort.Hint ];
|
|
if Length(L.Values[btLowerCase.Hint ]) > 0 then btLowerCase.Hint := L.Values[btLowerCase.Hint ];
|
|
if Length(L.Values[btSpacesToEol.Hint ]) > 0 then btSpacesToEol.Hint := L.Values[btSpacesToEol.Hint ];
|
|
if Length(L.Values[_Lines ]) > 0 then _Lines := L.Values[_Lines ];
|
|
|
|
Ini.ReadSectionValues('tabSet', L);
|
|
if Length(L.Values[chEnabledSet.Caption ]) > 0 then chEnabledSet.Caption := L.Values[chEnabledSet.Caption ];
|
|
if Length(L.Values[lbSymbSet.Caption ]) > 0 then lbSymbSet.Caption := L.Values[lbSymbSet.Caption ];
|
|
|
|
Ini.ReadSectionValues('tabSeveralRules', L);
|
|
if Length(L.Values[Label1.Caption]) > 0 then Label1.Caption := L.Values[Label1.Caption];
|
|
|
|
Ini.ReadSectionValues('pRight', L);
|
|
if Length(L.Values[pRightCapt.Caption ]) > 0 then pRightCapt.Caption := L.Values[pRightCapt.Caption ];
|
|
if Length(L.Values[chForeground.Caption ]) > 0 then chForeground.Caption := L.Values[chForeground.Caption ];
|
|
if Length(L.Values[chBackground.Caption ]) > 0 then chBackground.Caption := L.Values[chBackground.Caption ];
|
|
if Length(L.Values[chBold.Caption ]) > 0 then chBold.Caption := L.Values[chBold.Caption ];
|
|
if Length(L.Values[chItalic.Caption ]) > 0 then chItalic.Caption := L.Values[chItalic.Caption ];
|
|
if Length(L.Values[chUnderline.Caption ]) > 0 then chUnderline.Caption := L.Values[chUnderline.Caption ];
|
|
if Length(L.Values[chStrikeOut.Caption ]) > 0 then chStrikeOut.Caption := L.Values[chStrikeOut.Caption ];
|
|
{
|
|
if Length(L.Values[lbScheme.Caption ]) > 0 then lbScheme.Caption := L.Values[lbScheme.Caption ];
|
|
if Length(L.Values[btNewScheme.Caption ]) > 0 then btNewScheme.Caption := L.Values[btNewScheme.Caption ];
|
|
if Length(L.Values[btDelScheme.Caption ]) > 0 then btDelScheme.Caption := L.Values[btDelScheme.Caption ];
|
|
}
|
|
Ini.ReadSectionValues('pBottom', L);
|
|
if Length(L.Values[pBottomCapt.Caption ]) > 0 then pBottomCapt.Caption := L.Values[pBottomCapt.Caption ];
|
|
if Length(L.Values[lbSampMin.Hint ]) > 0 then lbSampMin.Hint := L.Values[lbSampMin.Hint ];
|
|
if Length(L.Values[lbSampMax.Hint ]) > 0 then lbSampMax.Hint := L.Values[lbSampMax.Hint ];
|
|
{
|
|
if Length(L.Values[]) > 0 then := L.Values[];
|
|
if Length(L.Values[]) > 0 then := L.Values[];
|
|
}
|
|
L.Free;
|
|
end;
|
|
|
|
//=== TreeView ===============================================================
|
|
procedure TfmDesigner.TreeEdited(Sender: TObject; Node: TTreeNode;
|
|
var S: TNodeText);
|
|
begin
|
|
if Node.Data = nil then Exit;
|
|
if TObject(Node.Data) is TSynRange then TSynRange(Node.Data).Name := S;
|
|
if TObject(Node.Data) is TSynKeyList then TSynKeyList(Node.Data).Name := S;
|
|
if TObject(Node.Data) is TSynSet then TSynSet(Node.Data).Name := S;
|
|
Modified();
|
|
end;
|
|
|
|
procedure TfmDesigner.TreeKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
|
|
begin
|
|
if Key = VK_DELETE then DoDeleteNode(Sender) else
|
|
if Key = VK_F2 then DoRenameNode(Sender) else
|
|
if popPropMenu = popRootMenu then
|
|
if (Key = ord('X')) and (ssCtrl in Shift) then rootCutClick(Sender) else
|
|
if (Key = ord('C')) and (ssCtrl in Shift) then rootCopyClick(Sender) else
|
|
if (Key = ord('V')) and (ssCtrl in Shift) then rootPasteInsideClick(Sender) else
|
|
else
|
|
if popPropMenu = popRangeMenu then
|
|
if (Key = ord('X')) and (ssCtrl in Shift) then rangeCutClick(Sender) else
|
|
if (Key = ord('C')) and (ssCtrl in Shift) then rangeCopyClick(Sender) else
|
|
if (Key = ord('V')) and (ssCtrl in Shift) then rangePasteInsideClick(Sender) else
|
|
else
|
|
if (popPropMenu = popKeywordsMenu) or (popPropMenu = popSetMenu) then
|
|
if (Key = ord('X')) and (ssCtrl in Shift) then rangeCutClick(Sender) else
|
|
if (Key = ord('C')) and (ssCtrl in Shift) then rangeCopyClick(Sender) else
|
|
if (Key = ord('V')) and (ssCtrl in Shift) then rangePasteNextToClick(Sender) else
|
|
else
|
|
end;
|
|
|
|
procedure TfmDesigner.TreeMouseDown(Sender: TObject;
|
|
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
|
//: Handle Right Mouse Up on the Tree
|
|
var
|
|
iNode: TTreeNode;
|
|
begin
|
|
if Button <> mbRight then
|
|
Exit;
|
|
// Tree.PopupMenu := nil;
|
|
// iNode := Tree.GetNodeAt( X, Y );
|
|
iNode := Tree.GetNodeAt( X, Y );
|
|
// Tree.PopupMenu := popRuleMenu;
|
|
// Tree.Items.Item[0].Focused := True;
|
|
// TreeChange(Sender, iNode);
|
|
if iNode <> nil then begin
|
|
iNode.Selected := True;
|
|
TreeChange(Sender, Tree.Selected);
|
|
// TreeChange(Sender, iNode);
|
|
// popRuleMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
|
|
end;
|
|
end;
|
|
|
|
procedure TfmDesigner.TreeMouseUp(Sender: TObject;
|
|
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
|
//: Handle Right Mouse Up on the Tree
|
|
//: ??? Переделать ???
|
|
var
|
|
iNode: TTreeNode;
|
|
begin
|
|
if Button <> mbRight then
|
|
Exit;
|
|
iNode := Tree.GetNodeAt( X, Y );
|
|
// TreeChange(Sender, iNode);
|
|
if iNode <> nil then
|
|
iNode.Selected := True;
|
|
TreeChange(Sender, Tree.Selected);
|
|
{ case GetNodeType(Tree.Selected) of
|
|
ntRoot: popRootMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
|
|
ntRange: popRangeMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
|
|
ntKeywords: popKeywordsMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
|
|
ntSet: popSetMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
|
|
end;}
|
|
popPropMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
|
|
// TreeChange(Sender, iNode);
|
|
// popRuleMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
|
|
end;
|
|
|
|
|
|
procedure TfmDesigner.TreeClick(Sender: TObject);
|
|
begin
|
|
TreeChange(Sender, Tree.Selected);
|
|
end;
|
|
|
|
procedure TfmDesigner.TreeChange(Sender: TObject; Node: TTreeNode);
|
|
var
|
|
Range: TSynRange;
|
|
Symbol: string;
|
|
len: integer;
|
|
// list: TList;
|
|
begin
|
|
UpdatingControls := True;
|
|
// ListBox1.Clear;
|
|
// list := TList.Create;
|
|
// Tree.GetSelections(list);
|
|
{ for i := 0 to list.Count-1 do
|
|
ListBox1.Items.Add(TTreeNode(list.Items[i]).Text);
|
|
list.Free;}
|
|
if Tree.SelectionCount > 1 then
|
|
PageControl.ActivePage := tabSeveralRules
|
|
else
|
|
if Tree.SelectionCount = 1 then begin
|
|
// Tree.Selected := TTreeNode(list.Items[0]);
|
|
case GetNodeType(Node) of
|
|
ntRange, ntRangeLink: begin
|
|
if (TObject(Node.Data) is TSynRangeLink) then
|
|
Range := TSynRangeLink(Node.Data).Range
|
|
else
|
|
Range := TSynRange(Node.Data);
|
|
with Range do begin
|
|
Symbol := fRule.fOpenSymbol.Symbol;
|
|
edFrom.Text := Symbol;
|
|
len := length(Symbol);
|
|
if len > 0 then
|
|
chFromEOL.Checked := Symbol[len] = #0
|
|
else
|
|
chFromEOL.Checked := False;
|
|
|
|
Symbol := fRule.fCloseSymbol.Symbol;
|
|
edTo.Text := Symbol;
|
|
len := length(Symbol);
|
|
if len > 0 then
|
|
chToEOL.Checked := Symbol[len] = #0
|
|
else
|
|
chToEOL.Checked := False;
|
|
|
|
chEnabledRange.Checked := Enabled;
|
|
chCloseOnWord.Checked := fRule.fCloseOnTerm;
|
|
chCloseOnEOL.Checked := fRule.fCloseOnEol;
|
|
chCloseParent.Checked := fRule.fAllowPredClose;
|
|
chCaseRange.Checked := CaseSensitive;
|
|
edDelimitersRange.Text := SetToStr(TermSymbols);
|
|
popOpenTagMenu.Items.Items[2].Checked := fRule.fOpenSymbol.StartLine = slFirst;
|
|
popOpenTagMenu.Items.Items[3].Checked := fRule.fOpenSymbol.StartLine = slFirstNonSpace;
|
|
popCloseTagMenu.Items.Items[2].Checked := fRule.fCloseSymbol.StartLine = slFirst;
|
|
popCloseTagMenu.Items.Items[3].Checked := fRule.fCloseSymbol.StartLine = slFirstNonSpace;
|
|
if fRule.fOpenSymbol.StartType = stAny then
|
|
if fRule.fOpenSymbol.BrakeType = btAny then
|
|
popOpenTagMenu.Items.Items[5].Checked := True
|
|
else
|
|
popOpenTagMenu.Items.Items[7].Checked := True
|
|
else
|
|
if fRule.fOpenSymbol.BrakeType = btAny then
|
|
popOpenTagMenu.Items.Items[6].Checked := True
|
|
else
|
|
popOpenTagMenu.Items.Items[8].Checked := True;
|
|
if fRule.fCloseSymbol.StartType = stAny then
|
|
if fRule.fCloseSymbol.BrakeType = btAny then
|
|
popCloseTagMenu.Items.Items[5].Checked := True
|
|
else
|
|
popCloseTagMenu.Items.Items[7].Checked := True
|
|
else
|
|
if fRule.fCloseSymbol.BrakeType = btAny then
|
|
popCloseTagMenu.Items.Items[6].Checked := True
|
|
else
|
|
popCloseTagMenu.Items.Items[8].Checked := True;
|
|
SetControlAttributes(Node, True);
|
|
PageControl.ActivePage := tabRange;
|
|
end;
|
|
end;
|
|
ntRoot: begin
|
|
chEnabledRoot.Checked := TSynRange(Node.data).Enabled;
|
|
SetControlAttributes(Node, True);
|
|
chCaseRoot.Checked := TSynRange(Node.data).CaseSensitive;
|
|
edStylesFile.Text := SynUniSyn.SchemeFileName;
|
|
edDelimitersRoot.text := SetToStr(TSynRange(Node.data).TermSymbols);
|
|
PageControl.ActivePage := tabRoot;
|
|
end;
|
|
ntKeywords: begin
|
|
chEnabledKeyList.Checked := TSynKeyList(Node.Data).Enabled;
|
|
Memo.Lines.Assign(TSynKeyList(Node.Data).KeyList);
|
|
SetControlAttributes(Node, True);
|
|
PageControl.ActivePage := tabKeywords;
|
|
end;
|
|
ntSet: begin
|
|
chEnabledSet.Checked := TSynSet(Node.Data).Enabled;
|
|
SetControlAttributes(Node, True);
|
|
edSymbSet.Text := SetToStr(TSynSet(Node.Data).SymbSet);
|
|
PageControl.ActivePage := tabSet;
|
|
end;
|
|
end;
|
|
end;
|
|
UpdatingControls := False;
|
|
end;
|
|
|
|
//=== Fill Tree with Rules ===================================================
|
|
procedure TfmDesigner.FillTree; //: Fill Tree with Rules
|
|
begin
|
|
TreeAddRange(nil, SynUniSyn.MainRules);
|
|
end;
|
|
|
|
procedure TfmDesigner.SetNodeData(Node: TTreeNode; Rule: TAbstractRule; Root: boolean);
|
|
begin
|
|
if Root then begin
|
|
Node.ImageIndex := 0;
|
|
Node.SelectedIndex := 0;
|
|
end
|
|
else if Rule is TSynRangeLink then begin
|
|
Node.ImageIndex := 4;
|
|
Node.SelectedIndex := 4;
|
|
end
|
|
else if Rule is TSynRange then begin
|
|
Node.ImageIndex := 1;
|
|
Node.SelectedIndex := 1;
|
|
end else
|
|
if Rule is TSynKeyList then begin
|
|
Node.ImageIndex := 2;
|
|
Node.SelectedIndex := 2;
|
|
end else
|
|
if Rule is TSynSet then begin
|
|
Node.ImageIndex := 3;
|
|
Node.SelectedIndex := 3;
|
|
end else
|
|
raise Exception.Create(ClassName + '.SetNodeData - Unknown rule to set node!');
|
|
Node.Data := Rule;
|
|
end;
|
|
|
|
function TfmDesigner.TreeAddRule(ParentNode: TTreeNode; Rule: TSynRule; AddKind: TAddKind): TTreeNode;
|
|
begin
|
|
// if Rule is TSynRangeLink then Result:= TreeAddRangeLink(ParentNode, TSynRangeLink(Rule), AddKind) else
|
|
if Rule is TSynRange then Result:= TreeAddRange(ParentNode, TSynRange(Rule), AddKind) else
|
|
if Rule is TSynKeyList then Result:= TreeAddKeyList(ParentNode, TSynKeyList(Rule), AddKind) else
|
|
if Rule is TSynSet then Result:= TreeAddSet(ParentNode, TSynSet(Rule), AddKind) else
|
|
raise Exception.Create(ClassName + '.TreeAddRule - Unknown rule to add!');
|
|
end;
|
|
|
|
function TfmDesigner.TreeAddRangeLink(Node: TTreeNode; RangeLink: TSynRangeLink; AddKind: TAddKind): TTreeNode;
|
|
begin
|
|
Result := Tree.Items.AddChild(Node, RangeLink.Range.Name);
|
|
SetNodeData(Result, RangeLink);
|
|
end;
|
|
|
|
function TfmDesigner.TreeAddRange(Node: TTreeNode; Range: TSynRange; AddKind: TAddKind): TTreeNode;
|
|
var
|
|
i, ind: integer;
|
|
begin
|
|
if AddKind = akReplace then
|
|
Result := Node
|
|
else
|
|
if Node = nil then begin
|
|
Result := Tree.Items.Add(nil, Range.Name);
|
|
SetNodeData(Result, Range, True);
|
|
end
|
|
else begin
|
|
if AddKind = akInsert then begin
|
|
ind := Node.Index;
|
|
{$IFNDEF FPC}
|
|
Result := Tree.Items.Insert(Node.Parent.Item[ind], Range.Name)
|
|
{$ELSE}
|
|
Result := Tree.Items.Insert(Node.Parent.Items[ind], Range.Name)
|
|
{$ENDIF}
|
|
end else
|
|
Result := Tree.Items.AddChild(Node, Range.Name);
|
|
SetNodeData(Result, Range);
|
|
end;
|
|
|
|
for i := 0 to Range.KeyListCount-1 do TreeAddKeyList(Result, Range.KeyLists[i]);
|
|
for i := 0 to Range.SetCount-1 do TreeAddSet(Result, Range.Sets[i]);
|
|
for i := 0 to Range.RangeCount-1 do TreeAddRange(Result, Range.Ranges[i]);
|
|
end;
|
|
|
|
function TfmDesigner.TreeAddKeyList(Node: TTreeNode; Keyword: TSynKeyList; AddKind: TAddKind): TTreeNode;
|
|
var
|
|
i, ind: integer;
|
|
NeedToInsert: boolean;
|
|
begin
|
|
if AddKind = akReplace then
|
|
Result := Node
|
|
else
|
|
if AddKind = akInsert then begin
|
|
ind := Node.Index;
|
|
{$IFNDEF FPC}
|
|
Result := Tree.Items.Insert(Node.Parent.Item[ind], Keyword.Name)
|
|
{$ELSE}
|
|
Result := Tree.Items.Insert(Node.Parent.Items[ind], Keyword.Name)
|
|
{$ENDIF}
|
|
end else
|
|
if Node.Count = 0 then
|
|
Result := Tree.Items.AddChild(Node, Keyword.Name)
|
|
else begin
|
|
NeedToInsert := False;
|
|
for i := 0 to Node.Count-1 do
|
|
{$IFNDEF FPC}
|
|
if (TObject(Node.Item[i].Data) is TSynRange) or (TObject(Node.Item[i].Data) is TSynSet) then begin
|
|
{$ELSE}
|
|
if (TObject(Node.Items[i].Data) is TSynRange) or (TObject(Node.Items[i].Data) is TSynSet) then begin
|
|
{$ENDIF}
|
|
NeedToInsert := True; break; end;
|
|
{$IFNDEF FPC}
|
|
if NeedToInsert then Result := Tree.Items.Insert(Node.Item[i], Keyword.Name)
|
|
{$ELSE}
|
|
if NeedToInsert then Result := Tree.Items.Insert(Node.Items[i], Keyword.Name)
|
|
{$ENDIF}
|
|
else Result := Tree.Items.AddChild(Node, Keyword.Name);
|
|
end;
|
|
|
|
SetNodeData(Result, Keyword);
|
|
end;
|
|
|
|
function TfmDesigner.TreeAddSet(Node: TTreeNode; SymbSet: TSynSet; AddKind: TAddKind): TTreeNode;
|
|
var
|
|
i, ind: integer;
|
|
NeedToInsert: boolean;
|
|
begin
|
|
if AddKind = akReplace then
|
|
Result := Node
|
|
else
|
|
if AddKind = akInsert then begin
|
|
ind := Node.Index;
|
|
{$IFNDEF FPC}
|
|
Result := Tree.Items.Insert(Node.Parent.Item[ind], SymbSet.Name)
|
|
{$ELSE}
|
|
Result := Tree.Items.Insert(Node.Parent.Items[ind], SymbSet.Name)
|
|
{$ENDIF}
|
|
end else
|
|
if Node.Count = 0 then
|
|
Result := Tree.Items.AddChild(Node, SymbSet.Name)
|
|
else begin
|
|
NeedToInsert := False;
|
|
for i := 0 to Node.Count-1 do
|
|
{$IFNDEF FPC}
|
|
if TObject(Node.Item[i].Data) is TSynRange then begin
|
|
{$ELSE}
|
|
if TObject(Node.Items[i].Data) is TSynRange then begin
|
|
{$ENDIF}
|
|
NeedToInsert := True; break; end;
|
|
{$IFNDEF FPC}
|
|
if NeedToInsert then Result := Tree.Items.Insert(Node.Item[i], SymbSet.Name)
|
|
{$ELSE}
|
|
if NeedToInsert then Result := Tree.Items.Insert(Node.Items[i], SymbSet.Name)
|
|
{$ENDIF}
|
|
else Result := Tree.Items.AddChild(Node, SymbSet.Name);
|
|
end;
|
|
|
|
SetNodeData(Result, SymbSet);
|
|
end;
|
|
|
|
//=== Adding RangeLink =======================================================
|
|
procedure TfmDesigner.DoAddRangeLinkToRoot(Sender:TObject); //: Click on button
|
|
begin
|
|
AddingRangeLink(Tree.Items[0]);
|
|
Modified();
|
|
end;
|
|
|
|
procedure TfmDesigner.DoAddRangeLink(Sender: TObject); //: Click on button
|
|
begin
|
|
AddingRangeLink(Tree.Selected);
|
|
Modified();
|
|
end;
|
|
|
|
procedure TfmDesigner.AddingRangeLink(ParentNode: TTreeNode);
|
|
var Node: TTreeNode;
|
|
RangeLink: TSynRangeLink;
|
|
// i: integer;
|
|
begin
|
|
RangeLink := TSynRangeLink.Create(SynUniSyn.MainRules.Ranges[6]);
|
|
TSynRange(ParentNode.Data).AddRangeLink(RangeLink);
|
|
Node := TreeAddRangeLink(ParentNode, RangeLink);
|
|
with Node do begin
|
|
Expand(False);
|
|
Selected := True;
|
|
Tree.SetFocus;
|
|
EditText;
|
|
end;
|
|
{ Range.ClearAttributes();
|
|
for i := 0 to SynUniSyn.SchemesList.Count-1 do begin
|
|
TSynRange(ParentNode.Data).SetAttributesIndex(i);
|
|
Range.AddAttribute();
|
|
SetDefaultAttributes(Node);
|
|
end;
|
|
TSynRange(ParentNode.Data).SetAttributesIndex(SynUniSyn.SchemeIndex);}
|
|
SetControlAttributes(Node);
|
|
end;
|
|
|
|
//=== Adding Range ===========================================================
|
|
procedure TfmDesigner.DoAddRangeToRoot(Sender:TObject); //: Click on button
|
|
begin
|
|
AddingRange(Tree.Items[0]);
|
|
Modified();
|
|
end;
|
|
|
|
procedure TfmDesigner.DoAddRange(Sender: TObject); //: Click on button
|
|
begin
|
|
AddingRange(Tree.Selected);
|
|
Modified();
|
|
end;
|
|
|
|
procedure TfmDesigner.AddingRange(ParentNode: TTreeNode);
|
|
var Node: TTreeNode;
|
|
Range: TSynRange;
|
|
i: integer;
|
|
begin
|
|
if ParentNode = nil then begin //Never happened ???
|
|
Tree.Items.Clear;
|
|
Node := Tree.Items.Add(nil, _Root);
|
|
SynUniSyn.MainRules.Name := _Root;
|
|
Node.Data := SynUniSyn.MainRules;
|
|
Node.ImageIndex := 0;
|
|
Node.SelectedIndex := 0;
|
|
Exit;
|
|
end
|
|
else begin
|
|
Range := TSynRange.Create;
|
|
Range.Name := _New;
|
|
TSynRange(ParentNode.Data).AddRange(Range);
|
|
Node := TreeAddRange(ParentNode, Range);
|
|
with Node do begin
|
|
Expand(False);
|
|
Selected := True;
|
|
Tree.SetFocus;
|
|
EditText;
|
|
end;
|
|
end;
|
|
// Range.ClearAttributes();
|
|
for i := 0 to SynUniSyn.SchemesList.Count-1 do begin
|
|
// TSynRange(ParentNode.Data).SetAttributesIndex(i);
|
|
// Range.AddAttribute();
|
|
SetDefaultAttributes(Node);
|
|
end;
|
|
// TSynRange(ParentNode.Data).SetAttributesIndex(SynUniSyn.SchemeIndex);
|
|
SetControlAttributes(Node);
|
|
end;
|
|
|
|
//=== Adding KeyList =========================================================
|
|
procedure TfmDesigner.DoAddKeywordToRoot(Sender:TObject); //: Click on button
|
|
begin
|
|
AddingKeyword(Tree.Items[0]);
|
|
Modified();
|
|
end;
|
|
|
|
procedure TfmDesigner.DoAddKeyword(Sender: TObject); //: Click on button
|
|
begin
|
|
AddingKeyWord(Tree.selected);
|
|
Modified();
|
|
end;
|
|
|
|
procedure TfmDesigner.AddingKeyWord(ParentNode: TTreeNode);
|
|
var Node: TTreeNode;
|
|
Keyword: TSynKeyList;
|
|
i: integer;
|
|
begin
|
|
Keyword := TSynKeyList.Create;
|
|
Keyword.Name := _New;
|
|
Node := TreeAddKeyList(ParentNode, Keyword);
|
|
with Node do begin
|
|
Expand(False);
|
|
Selected := True;
|
|
Tree.SetFocus;
|
|
EditText;
|
|
end;
|
|
// Keyword.ClearAttributes();
|
|
for i := 0 to SynUniSyn.SchemesList.Count-1 do begin
|
|
// TSynRange(ParentNode.Data).SetAttributesIndex(i);
|
|
// Keyword.AddAttribute();
|
|
SetDefaultAttributes(Node);
|
|
end;
|
|
// TSynRange(ParentNode.Data).SetAttributesIndex(SynUniSyn.SchemeIndex);
|
|
TSynRange(ParentNode.Data).AddKeyList(Keyword);
|
|
SetControlAttributes(Node);
|
|
end;
|
|
|
|
//=== Adding Set =============================================================
|
|
procedure TfmDesigner.DoAddSetToRoot(Sender:TObject); //: Click on button
|
|
begin
|
|
AddingSet(Tree.Items[0]);
|
|
Modified();
|
|
end;
|
|
|
|
procedure TfmDesigner.DoAddSet(Sender: TObject); //: Click on button
|
|
begin
|
|
AddingSet(Tree.Selected);
|
|
Modified();
|
|
end;
|
|
|
|
procedure TfmDesigner.AddingSet(ParentNode: TTreeNode);
|
|
var
|
|
Node: TTreeNode;
|
|
SymbolSet: TSynSet;
|
|
i: integer;
|
|
begin
|
|
SymbolSet := TSynSet.Create;
|
|
SymbolSet.Name := _New;
|
|
TSynRange(ParentNode.data).AddSet(SymbolSet);
|
|
Node := TreeAddSet(ParentNode, SymbolSet);
|
|
with Node do begin
|
|
Expand(False);
|
|
Selected := True;
|
|
Tree.SetFocus;
|
|
EditText;
|
|
end;
|
|
// SymbolSet.ClearAttributes();
|
|
for i := 0 to SynUniSyn.SchemesList.Count-1 do begin
|
|
// TSynRange(ParentNode.Data).SetAttributesIndex(i);
|
|
// SymbolSet.AddAttribute();
|
|
SetDefaultAttributes(Node);
|
|
end;
|
|
// TSynRange(ParentNode.Data).SetAttributesIndex(SynUniSyn.SchemeIndex);
|
|
SetControlAttributes(Node);
|
|
end;
|
|
|
|
//=== Delete and Rename Rules ================================================
|
|
procedure TfmDesigner.DoDeleteNode(Sender: TObject);
|
|
begin
|
|
if not Tree.IsEditing then
|
|
if not ShowDialog or (Application.MessageBox(PChar(Format(_DeleteNode,[Tree.Selected.Text])), PChar(_Confirm), MB_YESNOCANCEL+MB_ICONQUESTION) = ID_YES) then begin
|
|
DeleteNode(Tree.Selected);
|
|
TotalUpdate;
|
|
Modified();
|
|
end;
|
|
ShowDialog := True;
|
|
end;
|
|
|
|
procedure TfmDesigner.DeleteNode(Node: TTreeNode; OnlyChilds: boolean);
|
|
begin
|
|
//Node.DeleteChildren; - когда-нить исправить!
|
|
while Node.Count > 0 do
|
|
DeleteNode(Node[0]);
|
|
if (TSynRange(Node.Data) <> SynUniSyn.MainRules) and not OnlyChilds then begin
|
|
if TObject(Node.Data) is TSynRange then
|
|
TSynRange(Node.Parent.Data).DeleteRange(TSynRange(Node.Data))
|
|
else
|
|
if TObject(Node.Data) is TSynKeyList then
|
|
TSynRange(Node.Parent.Data).DeleteKeyList(TSynKeyList(Node.Data))
|
|
else
|
|
if TObject(Node.Data) is TSynSet then
|
|
TSynRange(Node.Parent.Data).DeleteSet(TSynSet(Node.Data));
|
|
Node.Delete;
|
|
end;
|
|
end;
|
|
|
|
procedure TfmDesigner.DoRenameNode(Sender: TObject);
|
|
begin
|
|
Tree.Selected.EditText;
|
|
end;
|
|
|
|
//=== Usefuk functions... ====================================================
|
|
function TfmDesigner.GetNodeType(Node: TTreeNode): TNodeType;
|
|
begin
|
|
Result := ntNone;
|
|
if Node <> nil then
|
|
if (TObject(Node.Data) is TSynRange) and (Node.Level = 0) then Result := ntRoot else
|
|
if (TObject(Node.Data) is TSynRangeLink) then Result := ntRangeLink else
|
|
if (TObject(Node.Data) is TSynRange) then Result := ntRange else
|
|
if (TObject(Node.Data) is TSynKeyList) then Result := ntKeywords else
|
|
if (TObject(Node.Data) is TSynSet) then Result := ntSet;
|
|
end;
|
|
|
|
procedure TfmDesigner.TotalUpdate;
|
|
begin
|
|
SynUniSyn.Reset;
|
|
SynUniSyn.MainRules.Reset;
|
|
SynUniSyn.ResetRange;
|
|
SynUniSyn.Prepare;
|
|
SampleMemo.Highlighter := nil;
|
|
SampleMemo.Highlighter := SynUniSyn;
|
|
SampleMemo.Refresh;
|
|
end;
|
|
|
|
procedure TfmDesigner.Modified(State: boolean = True);
|
|
begin
|
|
if State then begin
|
|
btApply.Enabled := True;
|
|
StatusBar.Panels.Items[0].Text := _Modified;
|
|
end else begin
|
|
btApply.Enabled := False;
|
|
StatusBar.Panels.Items[0].Text := '';
|
|
end;
|
|
end;
|
|
|
|
//=== KeyList Tools ==========================================================
|
|
procedure TfmDesigner.btSort_oldClick(Sender: TObject);
|
|
var i: integer;
|
|
begin
|
|
With TStringList.Create do
|
|
try
|
|
Sorted := True;
|
|
Duplicates := dupIgnore;
|
|
for i := 0 to Memo.Lines.Count-1 do
|
|
if Trim(Memo.Lines[i]) <> '' then
|
|
Add(Trim(Memo.Lines[i]));
|
|
Sort;
|
|
Memo.Text := Trim(Text);
|
|
finally
|
|
Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TfmDesigner.btLowerCase_oldClick(Sender: TObject);
|
|
begin
|
|
Memo.text := LowerCase(Memo.Text);
|
|
end;
|
|
|
|
procedure TfmDesigner.btSpacesToEol_oldClick(Sender: TObject);
|
|
begin
|
|
Memo.text := StringReplace(Memo.Text, ' ', #13#10, [rfReplaceAll]);
|
|
end;
|
|
|
|
//=== Finish buttons =========================================================
|
|
procedure TfmDesigner.btOkClick(Sender: TObject);
|
|
begin
|
|
if Tree.IsEditing then
|
|
Tree.Selected.EndEdit(False)
|
|
else
|
|
if btApply.Enabled then begin
|
|
btApplyClick(Sender);
|
|
ModalResult := mrOk;
|
|
end else
|
|
if (btApply.Tag = 1) then
|
|
ModalResult := mrOk
|
|
else
|
|
ModalResult := mrCancel;
|
|
ForceClose := True;
|
|
end;
|
|
|
|
procedure TfmDesigner.btCancelClick(Sender: TObject);
|
|
begin
|
|
ModalResult := mrCancel;
|
|
ForceClose := True;
|
|
end;
|
|
|
|
procedure TfmDesigner.btApplyClick(Sender: TObject);
|
|
var
|
|
Stream: TMemoryStream;
|
|
begin
|
|
Stream := TMemoryStream.Create;
|
|
SynUniSyn.SaveToStream(Stream);
|
|
Stream.Position := 0;
|
|
OriginalSyn.LoadFromStream(Stream);
|
|
OriginalSyn.Info.Sample.Text := SampleMemo.Text;
|
|
Modified(False);
|
|
btApply.Tag := 1;
|
|
end;
|
|
|
|
//=== Work with schemes ======================================================
|
|
{procedure TfmDesigner.btNewSchemeClick(Sender: TObject);
|
|
var
|
|
Name: string;
|
|
begin
|
|
if InputQuery(_EnterName, _EnterName, Name) then begin
|
|
SynUniSyn.AddNewScheme(Name);
|
|
SynUniSyn.MainRules.Attribs.ParentForeground := False;
|
|
SynUniSyn.MainRules.Attribs.ParentBackground := False;
|
|
cbScheme.ItemIndex := cbScheme.Items.Add(Name);
|
|
SetControlAttributes(Tree.Selected);
|
|
TotalUpdate;
|
|
Modified();
|
|
end;
|
|
end;
|
|
|
|
procedure TfmDesigner.btDelSchemeClick(Sender: TObject);
|
|
var
|
|
Index: integer;
|
|
begin
|
|
if cbScheme.Items.Count > 1 then
|
|
if Application.MessageBox(PChar(_DeleteScheme),PChar(_Confirm),MB_YESNOCANCEL+MB_ICONQUESTION) = ID_YES then begin
|
|
Index := cbScheme.ItemIndex;
|
|
cbScheme.Items.Delete(Index);
|
|
SynUniSyn.DeleteScheme(Index);
|
|
if cbScheme.Items.Count = Index then
|
|
cbScheme.ItemIndex := Index-1
|
|
else
|
|
cbScheme.ItemIndex := Index;
|
|
SetControlAttributes(Tree.Selected);
|
|
TotalUpdate;
|
|
Modified();
|
|
end;
|
|
end;
|
|
|
|
procedure TfmDesigner.cbSchemeSelect(Sender: TObject);
|
|
begin
|
|
SynUniSyn.SetSchemeIndex(cbScheme.ItemIndex);
|
|
SetControlAttributes(Tree.Selected);
|
|
TotalUpdate;
|
|
Modified();
|
|
end;
|
|
|
|
procedure TfmDesigner.cbSchemeChange(Sender: TObject);
|
|
var
|
|
SelStart, SelLength: integer;
|
|
begin
|
|
if cbScheme.ItemIndex > -1 then
|
|
cbScheme.Tag := cbScheme.ItemIndex;
|
|
SelStart := cbScheme.SelStart;
|
|
SelLength := cbScheme.SelLength;
|
|
cbScheme.Items[cbScheme.Tag] := cbScheme.Text;
|
|
cbScheme.ItemIndex := cbScheme.Tag;
|
|
SynUniSyn.SchemesList.Strings[cbScheme.Tag] := cbScheme.Text;
|
|
cbScheme.SelStart := SelStart;
|
|
cbScheme.SelLength := SelLength;
|
|
Modified();
|
|
end;}
|
|
|
|
//=== Rules changed ==========================================================
|
|
procedure TfmDesigner.RootChange(Sender: TObject);
|
|
var
|
|
i: integer;
|
|
begin
|
|
if UpdatingControls then Exit;
|
|
with SynUniSyn do begin
|
|
SchemeFileName := edStylesFile.Text;
|
|
if Styles <> nil then begin
|
|
Styles.Free;
|
|
Styles := nil;
|
|
end;
|
|
if FileExists(SchemeFileName) then begin
|
|
Styles := TSynUniStyles.Create;
|
|
Styles.FileName := SchemeFileName;
|
|
Styles.Load;
|
|
end;
|
|
end;
|
|
with TSynRange(Tree.Selected.Data) do begin
|
|
if GetNodeType(Tree.Selected) in [ntRoot] then begin
|
|
CaseSensitive := chCaseRoot.Checked;
|
|
Enabled := chEnabledRoot.Checked;
|
|
end;
|
|
TermSymbols := [];
|
|
{ the apparently useless typecast to char is for CLX compatibility }
|
|
for i := 1 to length(edDelimitersRoot.Text) do
|
|
TermSymbols := TermSymbols + [char(edDelimitersRoot.Text[i])];
|
|
TotalUpdate;
|
|
end;
|
|
Modified();
|
|
end;
|
|
|
|
procedure TfmDesigner.RangeChange(Sender: TObject);
|
|
var
|
|
i: integer;
|
|
null: string;
|
|
Range: TSynRange;
|
|
begin
|
|
if UpdatingControls then Exit;
|
|
if GetNodeType(Tree.Selected) in [ntRange, ntRangeLink] then begin
|
|
if TObject(Tree.Selected.Data) is TSynRange then
|
|
Range := TSynRange(Tree.Selected.Data)
|
|
else if TObject(Tree.Selected.Data) is TSynRangeLink then
|
|
Range := TSynRangeLink(Tree.Selected.Data).Range
|
|
else
|
|
Exit;
|
|
with Range do begin
|
|
if chFromEOL.Checked then null := #0 else null := '';
|
|
fRule.fOpenSymbol.Symbol := edFrom.Text + null;
|
|
if chToEOL.Checked then null := #0 else null := '';
|
|
fRule.fCloseSymbol.Symbol := edTo.Text + null;
|
|
Enabled := chEnabledRange.Checked;
|
|
fRule.fCloseOnTerm := chCloseOnWord.Checked;
|
|
fRule.fCloseOnEol := chCloseOnEOL.Checked;
|
|
fRule.fAllowPredClose := chCloseParent.Checked;
|
|
CaseSensitive := chCaseRange.Checked;
|
|
TermSymbols := StrToSet(edDelimitersRange.Text);
|
|
{ the apparently useless typecast to char is for CLX compatibility }
|
|
for i := 1 to Length(edDelimitersRange.Text) do
|
|
TermSymbols := TermSymbols + [Char(edDelimitersRange.Text[i])];
|
|
|
|
if popOpenTagMenu.Items.Items[2].Checked then
|
|
fRule.fOpenSymbol.StartLine := slFirst
|
|
else
|
|
if popOpenTagMenu.Items.Items[3].Checked then
|
|
fRule.fOpenSymbol.StartLine := slFirstNonSpace
|
|
else
|
|
fRule.fOpenSymbol.StartLine := slNotFirst;
|
|
|
|
if popCloseTagMenu.Items.Items[2].Checked then
|
|
fRule.fCloseSymbol.StartLine := slFirst
|
|
else
|
|
if popCloseTagMenu.Items.Items[3].Checked then
|
|
fRule.fCloseSymbol.StartLine := slFirstNonSpace
|
|
else
|
|
fRule.fCloseSymbol.StartLine := slNotFirst;
|
|
|
|
if popOpenTagMenu.Items.Items[5].Checked then begin
|
|
fRule.fOpenSymbol.StartType := stAny;
|
|
fRule.fOpenSymbol.BrakeType := btAny;
|
|
end else
|
|
if popOpenTagMenu.Items.Items[6].Checked then begin
|
|
fRule.fOpenSymbol.StartType := stTerm;
|
|
fRule.fOpenSymbol.BrakeType := btAny;
|
|
end else
|
|
if popOpenTagMenu.Items.Items[7].Checked then begin
|
|
fRule.fOpenSymbol.StartType := stAny;
|
|
fRule.fOpenSymbol.BrakeType := btTerm;
|
|
end else
|
|
if popOpenTagMenu.Items.Items[8].Checked then begin
|
|
fRule.fOpenSymbol.StartType := stTerm;
|
|
fRule.fOpenSymbol.BrakeType := btTerm;
|
|
end;
|
|
|
|
if popCloseTagMenu.Items.Items[5].Checked then begin
|
|
fRule.fCloseSymbol.StartType := stAny;
|
|
fRule.fCloseSymbol.BrakeType := btAny;
|
|
end else
|
|
if popCloseTagMenu.Items.Items[6].Checked then begin
|
|
fRule.fCloseSymbol.StartType := stTerm;
|
|
fRule.fCloseSymbol.BrakeType := btAny;
|
|
end else
|
|
if popCloseTagMenu.Items.Items[7].Checked then begin
|
|
fRule.fCloseSymbol.StartType := stAny;
|
|
fRule.fCloseSymbol.BrakeType := btTerm;
|
|
end else
|
|
if popCloseTagMenu.Items.Items[8].Checked then begin
|
|
fRule.fCloseSymbol.StartType := stTerm;
|
|
fRule.fCloseSymbol.BrakeType := btTerm;
|
|
end;
|
|
end;
|
|
end;
|
|
TotalUpdate;
|
|
Modified();
|
|
end;
|
|
|
|
procedure TfmDesigner.KeywordsChange(Sender: TObject);
|
|
begin
|
|
lbKeywordCount.Caption := Format(_Lines, [Memo.Lines.Count]);
|
|
if UpdatingControls then Exit;
|
|
TSynKeyList(Tree.Selected.Data).Enabled := chEnabledKeyList.Checked;
|
|
TSynKeyList(Tree.Selected.Data).KeyList.Text := Memo.Lines.Text;
|
|
TotalUpdate;
|
|
Modified();
|
|
end;
|
|
|
|
procedure TfmDesigner.SetChange(Sender: TObject);
|
|
begin
|
|
if UpdatingControls then Exit;
|
|
TSynSet(Tree.Selected.Data).Enabled := chEnabledSet.Checked;
|
|
TSynSet(Tree.Selected.Data).SymbSet := StrToSet(edSymbSet.Text);
|
|
TotalUpdate;
|
|
Modified();
|
|
end;
|
|
|
|
//=== Wotk with Attributes ===================================================
|
|
procedure TfmDesigner.AttributesChanged(Sender: TObject);
|
|
begin
|
|
SetAttributes(Tree.Selected);
|
|
end;
|
|
|
|
procedure TfmDesigner.SetDefaultAttributes(Node: TTreeNode);
|
|
begin
|
|
if TObject(Node.Data) is TSynRule then
|
|
with TSynRule(Node.Data).Attribs do begin
|
|
ParentForeground := True;
|
|
ParentBackground := True;
|
|
Foreground := TSynRange(Node.Parent.Data).Attribs.Foreground;
|
|
Background := TSynRange(Node.Parent.Data).Attribs.Background;
|
|
OldColorForeground := Foreground;
|
|
OldColorBackground := Background;
|
|
Style := [];
|
|
end
|
|
end;
|
|
|
|
procedure TfmDesigner.SetControlAttributes(Node: TTreeNode;
|
|
AlreadyUpdate: boolean);
|
|
var
|
|
Rule: TSynRule;
|
|
isCustom: boolean;
|
|
i: integer;
|
|
begin
|
|
UpdatingControls := True;
|
|
if GetNodeType(Node) in [ntRoot] then begin
|
|
chForeground.Enabled := False;
|
|
chBackground.Enabled := False;
|
|
end
|
|
else begin
|
|
chForeground.Enabled := True;
|
|
chBackground.Enabled := True;
|
|
end;
|
|
if TObject(Node.Data) is TSynRule then
|
|
Rule := TSynRule(Node.Data)
|
|
else if TObject(Node.Data) is TSynRangeLink then
|
|
Rule := TSynRangeLink(Node.Data).Range
|
|
else
|
|
raise Exception.Create(ClassName + '.SetControlAttributes - Wrong Node data!');
|
|
with Rule do begin
|
|
isCustom := True;
|
|
for i := 0 to cbStyle.Items.Count-2 do
|
|
if cbStyle.Items.Strings[i] = Style then begin
|
|
cbStyle.ItemIndex := i;
|
|
isCustom := False;
|
|
continue;
|
|
end;
|
|
if isCustom then begin
|
|
cbStyle.ItemIndex := cbStyle.Items.Count-2;
|
|
//cbStyle.Text := Style;
|
|
end;
|
|
if GetNodeType(Node) in [ntRoot] then begin
|
|
Attribs.ParentForeground := False; //Need to fix this problem another way... !!!
|
|
Attribs.ParentBackground := False;
|
|
end;
|
|
chForeground.Checked := Attribs.ParentForeground;
|
|
chBackground.Checked := Attribs.ParentBackground;
|
|
if Attribs.ParentForeground then
|
|
pForeColor.Color := TSynRange(Node.Parent.Data).Attribs.Foreground
|
|
else
|
|
pForeColor.Color := Attribs.Foreground;
|
|
if Attribs.ParentBackground then
|
|
pBackColor.Color := TSynRange(Node.Parent.Data).Attribs.Background
|
|
else
|
|
pBackColor.Color := Attribs.Background;
|
|
chBold.checked := fsBold in Attribs.Style;
|
|
chItalic.checked := fsItalic in Attribs.Style;
|
|
chUnderline.checked := fsUnderline in Attribs.Style;
|
|
chStrikeOut.checked := fsStrikeOut in Attribs.Style;
|
|
end;
|
|
if not AlreadyUpdate then UpdatingControls := False;
|
|
end;
|
|
|
|
procedure TfmDesigner.SetAttributes(Node: TTreeNode);
|
|
var
|
|
Rule: TSynRule;
|
|
begin
|
|
if UpdatingControls then Exit;
|
|
if (Node <> nil) then begin
|
|
if (TObject(Node.Data) is TSynRule) then
|
|
Rule := TSynRule(Node.Data)
|
|
else if (TObject(Node.Data) is TSynRangeLink) then
|
|
Rule := TSynRangeLink(Node.Data).Range
|
|
else
|
|
Exit;
|
|
with Rule.Attribs, Rule do begin
|
|
Style := cbStyle.Text;
|
|
if (ParentForeground and not chForeground.Checked) then begin
|
|
if pForeColor.Color = Foreground then
|
|
pForeColor.Color := OldColorForeground;
|
|
end
|
|
else if (not ParentForeground and chForeground.Checked) then begin
|
|
OldColorForeground := pForeColor.Color;
|
|
pForeColor.Color := TSynRange(Node.Parent.Data).Attribs.Foreground
|
|
end
|
|
else if chForeground.Checked then
|
|
if pForeColor.Color <> Foreground then
|
|
chForeground.Checked := False;
|
|
|
|
if (ParentBackground and not chBackground.Checked) then begin
|
|
if pBackColor.Color = Background then
|
|
pBackColor.Color := OldColorBackground;
|
|
end
|
|
else if (not ParentBackground and chBackground.Checked) then begin
|
|
OldColorBackground := pBackColor.Color;
|
|
pBackColor.Color := TSynRange(Node.Parent.Data).Attribs.Background
|
|
end
|
|
else if chBackground.Checked then
|
|
if pBackColor.Color <> Background then
|
|
chBackground.Checked := False;
|
|
|
|
ParentForeground := chForeground.Checked;
|
|
ParentBackground := chBackground.Checked;
|
|
Foreground := pForeColor.Color;
|
|
Background := pBackColor.Color;
|
|
Attribs.Style := GetFontStyle(chBold.checked, chItalic.checked, chUnderline.checked, chStrikeOut.checked);
|
|
|
|
if Styles <> nil then begin
|
|
Attribs := Styles.GetStyleDef(Style, Attribs);
|
|
SetControlAttributes(Node);
|
|
end;
|
|
|
|
if TObject(Node.data) is TSynRange then
|
|
TSynRange(Node.data).SetColorForChilds;
|
|
TotalUpdate;
|
|
end;
|
|
end;
|
|
Modified();
|
|
end;
|
|
|
|
//============================ D E S I G N ===================================
|
|
//=== Splitter CanResize =====================================================
|
|
procedure TfmDesigner.SplitterBottomCanResize(Sender: TObject;
|
|
var NewSize: Integer; var Accept: Boolean);
|
|
begin
|
|
if pTop.Tag <> -1 then begin
|
|
Accept := False;
|
|
Exit;
|
|
end;
|
|
if pBottom.Height <= pBottom.Constraints.MinHeight then
|
|
lbSampMin.Enabled := False
|
|
else
|
|
lbSampMin.Enabled := True;
|
|
|
|
if pTop.Height = 0 then lbSampMax.Enabled := False
|
|
else lbSampMax.Enabled := True;
|
|
if (0 <= NewSize) and (NewSize < 19) then
|
|
NewSize := 0
|
|
else
|
|
if (19 <= NewSize) and (NewSize <= 19+10) then
|
|
NewSize := 19
|
|
else
|
|
if (_pTopHeight-10 <= NewSize) and (NewSize <= _pTopHeight+10) then
|
|
NewSize := _pTopHeight
|
|
end;
|
|
|
|
procedure TfmDesigner.SplitterCannotResize(Sender: TObject;
|
|
var NewSize: Integer; var Accept: Boolean);
|
|
begin
|
|
Accept := False;
|
|
end;
|
|
|
|
//=== Label Mouse Leave/Enter ================================================
|
|
procedure TfmDesigner.LabelMouseLeave(Sender: TObject);
|
|
begin
|
|
(Sender as TLabel).Font.Color := clBtnFace;
|
|
end;
|
|
|
|
procedure TfmDesigner.LabelMouseEnter(Sender: TObject);
|
|
begin
|
|
(Sender as TLabel).Font.Color := clRed;
|
|
end;
|
|
|
|
procedure TfmDesigner.LabelContextPopup(Sender: TObject;
|
|
MousePos: TPoint; var Handled: Boolean);
|
|
begin
|
|
LabelMouseLeave(Sender);
|
|
end;
|
|
|
|
//=== CheckBox ===============================================================
|
|
procedure TfmDesigner.CheckBoxMouseDown(Sender: TObject;
|
|
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
|
begin
|
|
if Button = mbRight then
|
|
with (Sender as TCheckBox) do
|
|
Checked := not Checked;
|
|
end;
|
|
|
|
procedure TfmDesigner.DontNeedContextPopup(Sender: TObject;
|
|
MousePos: TPoint; var Handled: Boolean);
|
|
begin
|
|
Handled := True;
|
|
end;
|
|
|
|
//=== Show/Hide panels =======================================================
|
|
procedure TfmDesigner.ShowHideTree(Sender: TObject);
|
|
begin
|
|
if pLeft.Visible then begin
|
|
pLeft.Hide;
|
|
SplitterLeft.Hide;
|
|
end
|
|
else begin
|
|
SplitterLeft.Show;
|
|
pLeft.Show;
|
|
end;
|
|
end;
|
|
|
|
procedure TfmDesigner.ShowHideProp(Sender: TObject);
|
|
begin
|
|
if pMiddle.Visible then begin
|
|
pMiddle.Hide;
|
|
SplitterLeft.Hide;
|
|
pLeft.Tag := pLeft.Width;
|
|
pLeft.Align := alClient;
|
|
end
|
|
else begin
|
|
pLeft.Align := alLeft;
|
|
pLeft.Width := pLeft.Tag;
|
|
SplitterLeft.Show;
|
|
pMiddle.Show;
|
|
end;
|
|
end;
|
|
|
|
procedure TfmDesigner.ShowHideAttr(Sender: TObject);
|
|
begin
|
|
if pRight.Visible then begin
|
|
pRight.Hide;
|
|
SplitterRight.Hide;
|
|
end
|
|
else begin
|
|
pRight.Show;
|
|
SplitterRight.Show;
|
|
end;
|
|
end;
|
|
|
|
procedure TfmDesigner.ShowHideSamp(Sender: TObject);
|
|
begin
|
|
if pBottom.Visible then begin
|
|
pBottom.Hide;
|
|
SplitterBottom.Hide;
|
|
pTop.Tag := pTop.Height;
|
|
pTop.Align := alClient;
|
|
end
|
|
else begin
|
|
pTop.Align := alTop;
|
|
pTop.Height := pTop.Tag;
|
|
SplitterBottom.Show;
|
|
pBottom.Show;
|
|
end;
|
|
end;
|
|
|
|
procedure TfmDesigner.PanelDblClick(Sender: TObject);
|
|
begin
|
|
if (Sender as TPanel).Name = 'pBottomCapt' then begin
|
|
if pTop.Height = _pTopHeight then
|
|
lbSampMaxClick(Sender)
|
|
else begin
|
|
pTop.Height := _pTopHeight;
|
|
lbSampMin.Enabled := True;
|
|
if pTop.Tag <> -1 then
|
|
lbSampMinClick(Sender);
|
|
if not pTop.Visible then
|
|
lbSampMaxClick(Sender);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
//=== Middle panel Resize ====================================================
|
|
procedure TfmDesigner.pMiddleResize(Sender: TObject);
|
|
begin
|
|
if tabRoot.Width <> pRootButtons.Width then begin
|
|
pRootButtons.ScaleBy(tabRoot.Width, pRootButtons.Width);
|
|
pRootButtons.Height := 24;
|
|
btAddRangeRoot.Height := 24;
|
|
btAddKeywordsRoot.Height := 24;
|
|
btAddSetRoot.Height := 24;
|
|
end;
|
|
if tabRange.Width <> pRangeButtons.Width then begin
|
|
pRangeButtons.ScaleBy(tabRange.Width, pRangeButtons.Width);
|
|
pRangeButtons.Height := 24;
|
|
btAddRange.Height := 24;
|
|
btAddKeywords.Height := 24;
|
|
btAddSet.Height := 24;
|
|
end;
|
|
end;
|
|
|
|
//=== Push label clicks ======================================================
|
|
procedure TfmDesigner.lbPropBackClick(Sender: TObject);
|
|
begin
|
|
if (Tree.Selected <> Tree.Items[0]) and (Tree.Selected <> nil) then
|
|
Tree.Selected.Parent.Selected := True;
|
|
end;
|
|
|
|
procedure TfmDesigner.lbRootMenuClick(Sender: TObject);
|
|
begin
|
|
popRootMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
|
|
LabelMouseLeave(Sender);
|
|
end;
|
|
|
|
procedure TfmDesigner.lbRuleMenuClick(Sender: TObject);
|
|
begin
|
|
popPropMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
|
|
LabelMouseLeave(Sender);
|
|
end;
|
|
|
|
procedure TfmDesigner.lbSampMaxClick(Sender: TObject);
|
|
begin
|
|
if pTop.Visible then begin //: Not maximized (Maximize)
|
|
pTop.Hide;
|
|
lbSampMax.Caption := '2';
|
|
if pTop.Tag <> -1 then //: Minimized (Restore)
|
|
lbSampMinClick(Sender);
|
|
end
|
|
else begin //: Maximized (Restore)
|
|
pTop.Show;
|
|
lbSampMax.Caption := '1';
|
|
end;
|
|
end;
|
|
(*
|
|
procedure TfmDesigner.lbSampRestoreClick(Sender: TObject);
|
|
begin
|
|
pTop.Height := _pTopHeight;
|
|
end;
|
|
*)
|
|
procedure TfmDesigner.lbSampMinClick(Sender: TObject);
|
|
begin
|
|
if pTop.Tag = -1 then begin //: Not minimized (Minimize)
|
|
pTop.Tag := pTop.Height;
|
|
pTop.Height := ClientHeight - pBottom.Constraints.MinHeight - SplitterBottom.Height - pButtons.ClientHeight - StatusBar.ClientHeight - SplitterButtons.ClientHeight;
|
|
lbSampMin.Caption := '2';
|
|
if not pTop.Visible then //: Miximized (Restore)
|
|
lbSampMaxClick(Sender);
|
|
end
|
|
else begin //: Minimized (Restore)
|
|
pTop.Height := pTop.Tag;
|
|
PTop.Tag := -1;
|
|
lbSampMin.Caption := '0';
|
|
end;
|
|
end;
|
|
|
|
//============================ P O P U P S ===================================
|
|
//=== Standard PopupMenu =====================================================
|
|
procedure TfmDesigner.SetPopupMenuEnables(Edit: TCustomEdit; popMenu: TPopupMenu);
|
|
begin
|
|
with popMenu, Edit do begin
|
|
Items[0].Enabled := CanUndo;
|
|
Items[2].Enabled := SelLength <> 0;
|
|
Items[3].Enabled := SelLength <> 0;
|
|
Items[4].Enabled := Clipboard.AsText <> '';
|
|
Items[5].Enabled := Length(Edit.Text) <> 0;//SelLength <> 0;
|
|
Items[7].Enabled := Text <> SelText;
|
|
end;
|
|
end;
|
|
|
|
procedure TfmDesigner.EditKeyDown(Sender: TObject; var Key: Word;
|
|
Shift: TShiftState);
|
|
begin
|
|
SetPopupMenuEnables((Sender as TCustomEdit), popStandard);
|
|
end;
|
|
|
|
procedure TfmDesigner.EditContextPopup(Sender: TObject;
|
|
MousePos: TPoint; var Handled: Boolean);
|
|
begin
|
|
SetPopupMenuEnables((Sender as TCustomEdit), popStandard);
|
|
end;
|
|
|
|
procedure TfmDesigner.popUndoClick(Sender: TObject);
|
|
begin
|
|
(ActiveControl as TCustomEdit).Undo;
|
|
SetPopupMenuEnables((ActiveControl as TCustomEdit), popStandard);
|
|
end;
|
|
|
|
procedure TfmDesigner.popCutClick(Sender: TObject);
|
|
begin
|
|
(ActiveControl as TCustomEdit).CutToClipboard;
|
|
SetPopupMenuEnables((ActiveControl as TCustomEdit), popStandard);
|
|
end;
|
|
|
|
procedure TfmDesigner.popCopyClick(Sender: TObject);
|
|
begin
|
|
(ActiveControl as TCustomEdit).CopyToClipboard;
|
|
SetPopupMenuEnables((ActiveControl as TCustomEdit), popStandard);
|
|
end;
|
|
|
|
procedure TfmDesigner.popPasteClick(Sender: TObject);
|
|
begin
|
|
(ActiveControl as TCustomEdit).PasteFromClipboard;
|
|
SetPopupMenuEnables((ActiveControl as TCustomEdit), popStandard);
|
|
end;
|
|
|
|
procedure TfmDesigner.popDeleteClick(Sender: TObject);
|
|
begin
|
|
if (ActiveControl as TCustomEdit).SelLength = 0 then
|
|
(ActiveControl as TCustomEdit).SelLength := 1;
|
|
(ActiveControl as TCustomEdit).ClearSelection;
|
|
SetPopupMenuEnables((ActiveControl as TCustomEdit), popStandard);
|
|
end;
|
|
|
|
procedure TfmDesigner.popSelectAllClick(Sender: TObject);
|
|
begin
|
|
(ActiveControl as TCustomEdit).SelectAll;
|
|
SetPopupMenuEnables((ActiveControl as TCustomEdit), popStandard);
|
|
end;
|
|
|
|
//=== Sample Memo PopupMenu ==================================================
|
|
procedure TfmDesigner.SetPopupMenuEnables2(Edit: TCustomSynEdit; popMenu: TPopupMenu);
|
|
begin
|
|
with popMenu, Edit do begin
|
|
Items[0].Enabled := (Edit.SelEnd - Edit.SelStart) <> 0;
|
|
Items[2].Enabled := CanUndo;
|
|
Items[4].Enabled := (Edit.SelEnd - Edit.SelStart) <> 0;
|
|
Items[5].Enabled := (Edit.SelEnd - Edit.SelStart) <> 0;
|
|
Items[6].Enabled := Clipboard.AsText <> '';
|
|
Items[7].Enabled := (Edit.SelEnd - Edit.SelStart) <> 0;
|
|
Items[8].Enabled := Text <> SelText;
|
|
end;
|
|
end;
|
|
|
|
procedure TfmDesigner.SampleMemoKeyDown(Sender: TObject; var Key: Word;
|
|
Shift: TShiftState);
|
|
begin
|
|
SetPopupMenuEnables2(SampleMemo, popSampleMemoMenu);
|
|
end;
|
|
|
|
procedure TfmDesigner.SampleMemoMouseDown(Sender: TObject;
|
|
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
|
begin
|
|
SetPopupMenuEnables2(SampleMemo, popSampleMemoMenu);
|
|
end;
|
|
|
|
procedure TfmDesigner.Undo1Click(Sender: TObject);
|
|
begin
|
|
SampleMemo.Undo;
|
|
end;
|
|
|
|
procedure TfmDesigner.Cut1Click(Sender: TObject);
|
|
begin
|
|
SampleMemo.CutToClipboard;
|
|
end;
|
|
|
|
procedure TfmDesigner.Copy1Click(Sender: TObject);
|
|
begin
|
|
SampleMemo.CopyToClipboard;
|
|
end;
|
|
|
|
procedure TfmDesigner.Paste1Click(Sender: TObject);
|
|
begin
|
|
SampleMemo.PasteFromClipboard;
|
|
end;
|
|
|
|
procedure TfmDesigner.Delete1Click(Sender: TObject);
|
|
begin
|
|
SampleMemo.ClearSelection;
|
|
end;
|
|
|
|
procedure TfmDesigner.SelectAll1Click(Sender: TObject);
|
|
begin
|
|
SampleMemo.SelectAll;
|
|
end;
|
|
|
|
procedure TfmDesigner.AddselectedtoKeywords1Click(Sender: TObject);
|
|
begin
|
|
if PageControl.ActivePage = tabKeyWords then begin
|
|
Memo.Lines.Add(SampleMemo.SelText);
|
|
TotalUpdate;
|
|
end;
|
|
end;
|
|
|
|
procedure TfmDesigner.popSampleMemoMenuPopup(Sender: TObject);
|
|
begin
|
|
popSampleMemoMenu.Items[0].Visible := PageControl.ActivePage = tabKeyWords;
|
|
popSampleMemoMenu.Items[1].Visible := PageControl.ActivePage = tabKeyWords;
|
|
end;
|
|
|
|
//=== Tag Menu Clicks... =====================================================
|
|
procedure TfmDesigner.btTagMenuClick(Sender: TObject);
|
|
var P: TPoint;
|
|
begin
|
|
// popTagMenu.Tag := Mouse.CursorPos.X + Mouse.CursorPos.Y shl 16;
|
|
P := (Sender as TButton).ClientToScreen(Point(0, 0));
|
|
if (Sender as TButton).Name = 'btFromMenu' then
|
|
popOpenTagMenu.Popup(P.x, P.y)
|
|
else if (Sender as TButton).Name = 'btToMenu' then
|
|
popCloseTagMenu.Popup(P.x, P.y)
|
|
// popTagMenu.Popup(popTagMenu.Tag and $FFFF,
|
|
// popTagMenu.Tag shr 16);
|
|
end;
|
|
|
|
procedure TfmDesigner.miTagMenuClick(Sender: TObject);
|
|
begin
|
|
if not (Sender as TMenuItem).Checked then
|
|
(Sender as TMenuItem).Checked := True;
|
|
RangeChange(Sender);
|
|
end;
|
|
|
|
procedure TfmDesigner.miOpenTagMenuClick(Sender: TObject);
|
|
var i: integer;
|
|
begin
|
|
i := popOpenTagMenu.Items.IndexOf(Sender as TMenuItem);
|
|
if popOpenTagMenu.Items.Items[5-i].Checked then
|
|
popOpenTagMenu.Items.Items[5-i].Checked := False;
|
|
RangeChange(Sender);
|
|
end;
|
|
|
|
procedure TfmDesigner.miCloseTagMenuClick(Sender: TObject);
|
|
var i: integer;
|
|
begin
|
|
i := popCloseTagMenu.Items.IndexOf(Sender as TMenuItem);
|
|
if popCloseTagMenu.Items.Items[5-i].Checked then
|
|
popCloseTagMenu.Items.Items[5-i].Checked := False;
|
|
RangeChange(Sender);
|
|
end;
|
|
|
|
//=== ColorBox Clicks... =====================================================
|
|
procedure TfmDesigner.PanelColorChange(Sender: TObject);
|
|
//: Handle clicking on Color panel (Show ColorBox to choose color)
|
|
begin
|
|
with TColorDialog.Create(nil) do
|
|
try
|
|
CustomColors.Text := 'ColorA='+inttohex((Sender as TPanel).Color,6)+#13#10+'ColorB=FFFFEE'+#13#10+'ColorC=EEFFFF'+#13#10+'ColorD=EEFFEE'+#13#10+'ColorE=EEEEFF'+#13#10+'ColorF=FFEEEE'+#13#10+'ColorG=EEEEEE'+#13#10+'ColorH=FFEEAA'+#13#10+'ColorJ=FFAAEE'+#13#10+'ColorK=AAFFEE'+#13#10+'ColorI=AAEEFF'+#13#10+'ColorL=EEFFAA'+#13#10+'ColorM=EEAAFF'+#13#10+'ColorN=AAAAAA'+#13#10+'ColorO=DDDDDD'+#13#10+'ColorP=999999';
|
|
Color := (Sender as TPanel).Color;
|
|
{$IFNDEF SYN_CLX}
|
|
{$IFNDEF FPC}
|
|
Options := [cdFullOpen];
|
|
{$ENDIF}
|
|
{$ENDIF}
|
|
if Execute then
|
|
begin
|
|
(Sender as TPanel).Color := Color;
|
|
SetAttributes(Tree.Selected);
|
|
end;
|
|
finally
|
|
Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TfmDesigner.miColor16Click(Sender: TObject);
|
|
begin
|
|
if popColorStd.Tag = 1 then
|
|
pForeColor.Color := Colors16[(Sender as TMenuItem).ImageIndex]
|
|
else
|
|
if popColorStd.Tag = 2 then
|
|
pBackColor.Color := Colors16[(Sender as TMenuItem).ImageIndex];
|
|
SetAttributes(Tree.Selected);
|
|
end;
|
|
|
|
procedure TfmDesigner.miColorSysClick(Sender: TObject);
|
|
begin
|
|
if popColorStd.Tag = 1 then
|
|
pForeColor.Color := ColorsSys[(Sender as TMenuItem).ImageIndex]
|
|
else
|
|
if popColorStd.Tag = 2 then
|
|
pBackColor.Color := ColorsSys[(Sender as TMenuItem).ImageIndex];
|
|
SetAttributes(Tree.Selected);
|
|
end;
|
|
|
|
procedure TfmDesigner.miColor40Click(Sender: TObject);
|
|
begin
|
|
if popColorStd.Tag = 1 then
|
|
pForeColor.Color := Colors40[(Sender as TMenuItem).ImageIndex]
|
|
else if popColorStd.Tag = 2 then
|
|
pBackColor.Color := Colors40[(Sender as TMenuItem).ImageIndex];
|
|
SetAttributes(Tree.Selected);
|
|
end;
|
|
|
|
{$IFNDEF FPC}
|
|
procedure TfmDesigner.Color40MeasureItem(Sender: TObject; ACanvas: TCanvas;
|
|
var Width, Height: Integer);
|
|
begin
|
|
Width := 6;
|
|
end;
|
|
{$ELSE}
|
|
procedure TfmDesigner.Color40MeasureItem(Sender: TObject; ACanvas: TCanvas;
|
|
var AWidth, AHeight: Integer);
|
|
begin
|
|
AWidth := 6;
|
|
end;
|
|
{$ENDIF}
|
|
|
|
procedure TfmDesigner.pColorMouseUp(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
//var P: TPoint;
|
|
begin
|
|
// if (Button = mbRight) or (Button = mbMiddle) then
|
|
if ((Sender as TPanel).Name = 'pForeColor') or ((Sender as TPanel).Name = 'pForeColorArrow') then
|
|
popColorStd.Tag := 1
|
|
else
|
|
if ((Sender as TPanel).Name = 'pBackColor') or ((Sender as TPanel).Name = 'pBackColorArrow') then
|
|
popColorStd.Tag := 2;
|
|
|
|
// P := ((Sender as TPanel).Parent as TPanel).ClientToScreen(Point(-1, ((Sender as TPanel).Parent as TPanel).Height-1));
|
|
|
|
if (Button = mbMiddle) then
|
|
popColorSys.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y)
|
|
else if ((Button = mbRight) and (ssLeft in Shift)) then
|
|
popColorAdv.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y)
|
|
else
|
|
if Button = mbRight then
|
|
if ssShift in Shift then
|
|
popColorAdv.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y)
|
|
else
|
|
popColorStd.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
|
|
end;
|
|
|
|
procedure TfmDesigner.pColorArrowMouseUp(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
//var P: TPoint;
|
|
begin
|
|
// if (Button = mbRight) or (Button = mbMiddle) then
|
|
if ((Sender as TPanel).Name = 'pForeColor') or ((Sender as TPanel).Name = 'pForeColorArrow') then
|
|
popColorStd.Tag := 1
|
|
else
|
|
if ((Sender as TPanel).Name = 'pBackColor') or ((Sender as TPanel).Name = 'pBackColorArrow') then
|
|
popColorStd.Tag := 2;
|
|
|
|
// P := ((Sender as TPanel).Parent as TPanel).ClientToScreen(Point(-1, ((Sender as TPanel).Parent as TPanel).Height-1));
|
|
if ((Sender as TPanel).Name = 'pForeColorArrow') or ((Sender as TPanel).Name = 'pBackColorArrow') then
|
|
(Sender as TPanel).BevelInner := bvLowered;
|
|
|
|
if (Button = mbLeft) then
|
|
popColorStd.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
|
|
if (Button = mbMiddle) then
|
|
popColorAdv.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y)
|
|
else if ((Button = mbRight) and (ssLeft in Shift)) then
|
|
popColorAdv.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y)
|
|
else
|
|
if Button = mbRight then
|
|
if ssShift in Shift then
|
|
popColorAdv.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y)
|
|
else
|
|
popColorSys.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
|
|
|
|
if ((Sender as TPanel).Name = 'pForeColorArrow') or ((Sender as TPanel).Name = 'pBackColorArrow') then
|
|
(Sender as TPanel).BevelInner := bvNone;
|
|
end;
|
|
|
|
//=== TabSheet showing =======================================================
|
|
procedure TfmDesigner.tabRootShow(Sender: TObject);
|
|
begin
|
|
popPropMenu := popRootMenu;
|
|
end;
|
|
|
|
procedure TfmDesigner.tabRangeShow(Sender: TObject);
|
|
begin
|
|
popPropMenu := popRangeMenu;
|
|
end;
|
|
|
|
procedure TfmDesigner.tabKeywordsShow(Sender: TObject);
|
|
begin
|
|
popPropMenu := popKeywordsMenu;
|
|
end;
|
|
|
|
procedure TfmDesigner.tabSetShow(Sender: TObject);
|
|
begin
|
|
popPropMenu := popSetMenu;
|
|
end;
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
// RESORTING RESORTING RESORTING RESORTING RESORTING RESORTING RESORTING //
|
|
// RESORTING RESORTING RESORTING RESORTING RESORTING RESORTING RESORTING //
|
|
// RESORTING RESORTING RESORTING RESORTING RESORTING RESORTING RESORTING //
|
|
// RESORTING RESORTING RESORTING RESORTING RESORTING RESORTING RESORTING //
|
|
// RESORTING RESORTING RESORTING RESORTING RESORTING RESORTING RESORTING //
|
|
// RESORTING RESORTING RESORTING RESORTING RESORTING RESORTING RESORTING //
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
|
//=== Work with files ========================================================
|
|
//procedure TfmDesigner.LoadFromFileClick(Sender: TObject);
|
|
//resourcestring
|
|
// sUniFileDescription = 'UniHighlighter Syntax';
|
|
//var
|
|
// iDlg: TOpenDialog;
|
|
// iFile: TFileStream;
|
|
// iNode: TTreeNode;
|
|
// iRange: TSynRange;
|
|
// cSub: integer;
|
|
//begin
|
|
// { TreeMenuPopup should handle this }
|
|
// Assert( TObject(Tree.Selected.Data) is TSynRange );
|
|
// iNode := Tree.Selected;
|
|
// iRange := TSynRange(iNode.Data);
|
|
// iDlg := TOpenDialog.Create( nil );
|
|
// try
|
|
// iDlg.DefaultExt := '.hgl';
|
|
// iDlg.Filter := sUniFileDescription + ' (*.hgl)|*.hgl';
|
|
// if not iDlg.Execute then
|
|
// Exit;
|
|
// iFile := TFileStream.Create( iDlg.FileName, fmOpenRead or fmShareDenyWrite );
|
|
// try
|
|
// if iRange = SynUniSyn.MainRules then
|
|
// begin
|
|
// SynUniSyn.LoadFromStream( iFile );
|
|
// Tree.Items.Clear;
|
|
// FillTree;
|
|
// SampleMemo.Lines.Text := SynUniSyn.SampleSource;
|
|
// iNode := Tree.Items[0];
|
|
// end
|
|
// else begin
|
|
// iRange.LoadFromStream( iFile );
|
|
// iNode.DeleteChildren;
|
|
// for cSub := 0 to iRange.KeyListCount - 1 do
|
|
// TreeAddKeyList( iNode, iRange.KeyLists[cSub] );
|
|
// for cSub := 0 to iRange.RangeCount - 1 do
|
|
// TreeAddRange( iNode, iRange.Ranges[cSub] );
|
|
// end;
|
|
// iNode.Expand( False );
|
|
// TotalUpdate;
|
|
// finally
|
|
// iFile.Free;
|
|
// end;
|
|
// finally
|
|
// iDlg.Free;
|
|
// end;
|
|
// Modified();
|
|
//end;
|
|
|
|
procedure TfmDesigner.rootSaveToFileClick(Sender: TObject);
|
|
begin
|
|
if SaveDialog.Execute then
|
|
SynUniSyn.SaveToFile(SaveDialog.FileName);
|
|
end;
|
|
|
|
procedure TfmDesigner.rootLoadFromFileClick(Sender: TObject);
|
|
var
|
|
Ext: string;
|
|
EditPlus: TSynUniImportEditPlus;
|
|
UltraEdit: TSynUniImportUltraEdit;
|
|
begin
|
|
if OpenDialog.Execute then begin
|
|
Ext := ExtractFileExt(OpenDialog.FileName);
|
|
try
|
|
if SameText(Ext, '.hgl') or SameText(Ext, '.hlr') then
|
|
SynUniSyn.{LoadHglFromFile}LoadFromFile(OpenDialog.FileName)
|
|
else
|
|
if SameText(Ext, '.stx') then begin
|
|
EditPlus := TSynUniImportEditPlus.Create();
|
|
EditPlus.LoadFromFile(OpenDialog.FileName);
|
|
EditPlus.Import(SynUniSyn.MainRules, SynUniSyn.Info);
|
|
EditPlus.Free;
|
|
end else
|
|
if SameText(Ext, '.txt') then begin
|
|
UltraEdit := TSynUniImportUltraEdit.Create();
|
|
UltraEdit.LoadFromFile(OpenDialog.FileName);
|
|
UltraEdit.Import(SynUniSyn.MainRules, SynUniSyn.Info);
|
|
UltraEdit.Free;
|
|
{ else // '.hlr'
|
|
SynUniSyn.LoadFromFile(OpenDialog.FileName);}
|
|
end else
|
|
raise Exception.Create(ClassName + '.rootLoadFromFile - Bad file extension!');
|
|
finally
|
|
Tree.Items.Clear;
|
|
FillTree;
|
|
SampleMemo.Lines.Text := SynUniSyn.SampleSource;
|
|
Tree.Items[0].Expand(False);
|
|
TotalUpdate;
|
|
Modified();
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TfmDesigner.rangeLoadFromFileClick(Sender: TObject);
|
|
begin
|
|
if OpenDialog.Execute then begin
|
|
if Application.MessageBox('It will delete current rule. Continue?', PChar(_Confirm), MB_OKCANCEL+MB_ICONQUESTION) = ID_OK then begin
|
|
DeleteNode(Tree.Selected, True);
|
|
TSynRule(Tree.Selected.Data).LoadFromFile(OpenDialog.FileName); //Сделать, что можно загрузить Keywords в Ranges и т.д...
|
|
TreeAddRange(Tree.Selected, TSynRange(Tree.Selected.Data), akReplace);
|
|
TreeChange(Sender, Tree.Selected);
|
|
Tree.Selected.Text := TSynRule(Tree.Selected.Data).Name;
|
|
Tree.Items[0].Expand(False);
|
|
TotalUpdate;
|
|
Modified();
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TfmDesigner.rangeSaveToFileClick(Sender: TObject);
|
|
begin
|
|
if SaveDialog.Execute then
|
|
SynUniSyn.SaveToFile(SaveDialog.FileName, TSynRule(Tree.Selected.Data));
|
|
end;
|
|
|
|
//=== Clipboard ==============================================================
|
|
procedure TfmDesigner.StreamToClipboard(Stream: TStream);
|
|
var
|
|
Buf: PChar;
|
|
BufSize: Integer;
|
|
begin
|
|
buf := nil; // Чтобы убрать Warning компилятора
|
|
try
|
|
BufSize := Stream.Size;
|
|
GetMem(Buf, BufSize+1);
|
|
Stream.Position := 0;
|
|
Stream.ReadBuffer(Buf^, BufSize);
|
|
Buf[BufSize] := #0;
|
|
Clipboard.SetTextBuf(Buf);
|
|
finally
|
|
FreeMem(Buf);
|
|
Stream.Free;
|
|
end;
|
|
end;
|
|
|
|
function TfmDesigner.GetClipboardAsStream: TMemoryStream;
|
|
var
|
|
hClipbrd: THandle;
|
|
Buf: PChar;
|
|
begin
|
|
{$note Error 2}
|
|
{$IFNDEF FPC}
|
|
Result := TMemoryStream.Create;
|
|
ClipBoard.Open;
|
|
try
|
|
hClipbrd := Clipboard.GetAsHandle(CF_TEXT);
|
|
Buf := GlobalLock(hClipbrd);
|
|
Result.WriteBuffer(Buf^, StrLen(Buf));
|
|
Result.Position := 0;
|
|
GlobalUnlock(hClipbrd);
|
|
finally
|
|
Clipboard.Close;
|
|
end;
|
|
{$ENDIF}
|
|
end;
|
|
|
|
//=== Root range =============================================================
|
|
procedure TfmDesigner.rootCutClick(Sender: TObject);
|
|
begin
|
|
rootCopyClick(Sender);
|
|
ShowDialog := False;
|
|
DoDeleteNode(Sender);
|
|
end;
|
|
|
|
procedure TfmDesigner.rootCopyClick(Sender: TObject);
|
|
begin
|
|
StreamToClipboard(SynUniSyn.GetAsStream());
|
|
end;
|
|
|
|
procedure TfmDesigner.rootPasteInsideClick(Sender: TObject);
|
|
begin
|
|
Tree.Selected.Selected := False;
|
|
Tree.Selected := Tree.Items[0];
|
|
rangePasteInsideClick(Sender);
|
|
end;
|
|
|
|
procedure TfmDesigner.rootPasteAndReplaceClick(Sender: TObject);
|
|
begin
|
|
Tree.Selected := Tree.Items[0];
|
|
DeleteNode(Tree.Selected, True);
|
|
SynUniSyn.LoadFromStream(GetClipboardAsStream);
|
|
TreeAddRange(Tree.Selected, SynUniSyn.MainRules, akReplace);
|
|
TreeChange(nil, Tree.Selected);
|
|
Tree.Selected.Text := TSynRule(Tree.Selected.Data).Name;
|
|
SampleMemo.Text := SynUniSyn.Info.Sample.Text;
|
|
TotalUpdate;
|
|
Modified();
|
|
end;
|
|
|
|
//=== Other rules ============================================================
|
|
procedure TfmDesigner.rangeCutClick(Sender: TObject);
|
|
begin
|
|
rangeCopyClick(Sender);
|
|
ShowDialog := False;
|
|
DoDeleteNode(Sender);
|
|
end;
|
|
|
|
procedure TfmDesigner.rangeCopyClick(Sender: TObject);
|
|
begin
|
|
StreamToClipboard(TSynRule(Tree.Selected.Data).GetAsStream);
|
|
end;
|
|
|
|
procedure TfmDesigner.rangePasteInsideClick(Sender: TObject);
|
|
var
|
|
Rule: TSynRule;
|
|
begin
|
|
if (copy(Clipboard.AsText, 1, Length('<UniHighlighter')) = '<UniHighlighter') or (copy(Clipboard.AsText, 1, Length('<Range')) = '<Range') then
|
|
Rule := TSynRange.Create else
|
|
if (copy(Clipboard.AsText, 1, Length('<Keywords')) = '<Keywords') then
|
|
Rule := TSynKeyList.Create else
|
|
if (copy(Clipboard.AsText, 1, Length('<Set')) = '<Set') then
|
|
Rule := TSynSet.Create
|
|
else
|
|
Exit;
|
|
Rule.LoadFromStream(GetClipboardAsStream);
|
|
TSynRange(Tree.Selected.Data).AddRule(Rule);
|
|
// Tree.MultiSelect := False;
|
|
with TreeAddRule(Tree.Selected, Rule) do Selected := True;
|
|
TotalUpdate;
|
|
// Tree.MultiSelect := True;
|
|
Modified();
|
|
end;
|
|
|
|
procedure TfmDesigner.rangePasteAndReplaceClick(Sender: TObject);
|
|
begin
|
|
if Application.MessageBox('It will delete current rule. Continue?', PChar(_Confirm), MB_OKCANCEL+MB_ICONQUESTION) = ID_OK then begin
|
|
DeleteNode(Tree.Selected, True);
|
|
TSynRule(Tree.Selected.Data).LoadFromStream(GetClipboardAsStream);
|
|
TreeAddRange(Tree.Selected, TSynRange(Tree.Selected.Data), akReplace);
|
|
TreeChange(Sender, Tree.Selected);
|
|
Tree.Selected.Text := TSynRule(Tree.Selected.Data).Name;
|
|
TotalUpdate;
|
|
Modified();
|
|
end;
|
|
end;
|
|
|
|
procedure TfmDesigner.rangePasteNextToClick(Sender: TObject);
|
|
var
|
|
Rule: TSynRule;
|
|
begin
|
|
if (copy(Clipboard.AsText, 1, Length('<UniHighlighter')) = '<UniHighlighter') or (copy(Clipboard.AsText, 1, Length('<Range')) = '<Range') then
|
|
Rule := TSynRange.Create else
|
|
if (copy(Clipboard.AsText, 1, Length('<Keywords')) = '<Keywords') then
|
|
Rule := TSynKeyList.Create else
|
|
if (copy(Clipboard.AsText, 1, Length('<Set')) = '<Set') then
|
|
Rule := TSynSet.Create
|
|
else
|
|
Exit;
|
|
Rule.LoadFromStream(GetClipboardAsStream);
|
|
TSynRange(Tree.Selected.Parent.Data).AddRule(Rule);
|
|
with TreeAddRule(Tree.Selected, Rule, akInsert) do Selected := True;
|
|
TotalUpdate;
|
|
Modified();
|
|
end;
|
|
|
|
//=== UNSORTED ===============================================================
|
|
procedure TfmDesigner.rootInfoClick(Sender: TObject);
|
|
var InfoText: string;
|
|
begin
|
|
with SynUniSyn.Info do begin
|
|
if General.Name <> '' then InfoText := InfoText + Format(_Name, [General.Name]) + #13#10
|
|
else InfoText := InfoText + Format(_Name, ['<Noname>']) + #13#10;
|
|
if General.Extensions <> '' then InfoText := InfoText + Format(_Extensions, [General.Extensions]) + #13#10;
|
|
InfoText := InfoText + Format(_Version, [IntToStr(Version.Version) + '.' + IntToStr(Version.Revision)]) + #13#10;
|
|
InfoText := InfoText + Format(_Date, [DateTimeToStr(Version.ReleaseDate)]) + #13#10;
|
|
if Author.Name <> '' then InfoText := InfoText + Format(_Author, [Author.Name]) + #13#10;
|
|
if Author.Email <> '' then InfoText := InfoText + Format(_Mail, [Author.Email]) + #13#10;
|
|
if Author.Web <> '' then InfoText := InfoText + Format(_Web, [Author.Web]) + #13#10;
|
|
if Author.Copyright <> '' then InfoText := InfoText + Format(_Copyright, [Author.Copyright]) + #13#10;
|
|
if Author.Company <> '' then InfoText := InfoText + Format(_Company, [Author.Company]) + #13#10;
|
|
if Author.Remark <> '' then InfoText := InfoText + Format(_Remark, [Author.Remark]) + #13#10;
|
|
Application.MessageBox(PChar(InfoText),'About highlighter...', MB_ICONINFORMATION);
|
|
end;
|
|
end;
|
|
|
|
procedure TfmDesigner.btStylesFileClick(Sender: TObject);
|
|
//var
|
|
// xml: TXMLParser; ++++++++++++
|
|
begin
|
|
{
|
|
if OpenDialog2.Execute then begin
|
|
edStylesFile.Text := OpenDialog2.FileName;
|
|
ComboBox2.Clear;
|
|
xml := TXMLParser.Create;
|
|
try
|
|
if xml.LoadFromFile(edStylesFile.Text) then begin
|
|
xml.StartScan;
|
|
while xml.Scan do
|
|
if (xml.CurPartType = ptStartTag) and SameText(xml.CurName, 'Scheme') then
|
|
ComboBox2.Items.Add(xml.CurAttr.Value('Name'));
|
|
end;
|
|
finally
|
|
xml.Free;
|
|
end;
|
|
ComboBox2.ItemIndex := 0;
|
|
end;
|
|
}
|
|
end;
|
|
|
|
//============================================================================
|
|
end.
|
|
|