var VSW=GetSystemMetrics(SM_CXVSCROLL);
// Главная форма
frm=new TForm();
frm.Caption="JS+ - компонент TTextAttributes";
frm.Width =800;
frm.Height=600;
frm.BorderStyle=bsSizeable;
frm.BorderIcons=biMaximize | biMinimize | biSystemMenu;
// Строка состояния
stb=new TStatusBar(frm);
stb.OnResize=stb_Resize;
stb.SimplePanel=false;
for (i=w=0;i<3;i++) {
stp=new TStatusPanel(stb);
switch (i) {
case 0: continue;
case 1: stp.Text="Вставка"; break;
case 2: stp.Text="Строка 000 из 000";
}
stp.Alignment=taCenter;
w+=(stp.numTag=stp.Width=stb.TextWidth(stp.Text)+20);
}
stb.Panels[0].Text=" Пример простого текстового редактора";
// ToolBar
tlb=new TToolBar(frm);
tlb.BorderWidth=4;
// Список шрифтов
cb1=new TComboBox(tlb);
cb1.Name="F";
cb1.AutoDropDown=true;
for (i=max_dx=0;i<Screen.Fonts.Count;i++) {
cb1.Items.Add(Lst_Str=Screen.Fonts[i]);
if ((dx=cb1.TextWidth(Lst_Str))>max_dx)
max_dx=dx;
}
cb1.DropDownCount=Math.min(i,15);
cb1.ClientWidth=max_dx+cb1.TextWidth("_")+VSW;
cb1.OnSelect=cmb_Select;
// Список размеров шрифта
cb2=new TComboBox(tlb);
cb2.Name="S";
cb2.AutoDropDown=true;
cb2.Align=alNone;
for (i=6,max_dx=0;i<50;i+=2) {
cb2.Items.Add(Lst_Str=""+i);
if ((dx=cb2.TextWidth(Lst_Str))>max_dx)
max_dx=dx;
}
cb2.DropDownCount=cb1.DropDownCount;
cb2.ClientWidth=max_dx+cb2.TextWidth("_")+VSW;
cb2.OnSelect=cmb_Select;
// Кнопки
for (i=0;i<7;i++) {
tbt=new TToolButton(tlb);
tbt.Style=tbsCheck;
tbt.ShowHint=true;
switch (i) {
// Разделитель
case 3: tbt.Style=tbsSeparator;
tbt.Width=4;
continue;
// Стиль шрифта
case 0: tbt_Name="B";
tbt.Hint="Полужирный";
break;
case 1: tbt_Name="I";
tbt.Hint="Курсив";
break;
case 2: tbt_Name="U";
tbt.Hint="Подчеркнутый";
break;
// Выравнивание текста
case 4: tbt_Name="L";
tbt.Hint="Влево";
tbt.AllowAllUp=tbt.Grouped=tbt.Down=true;
break;
case 5: tbt_Name="C";
tbt.Hint="По центру";
tbt.AllowAllUp=tbt.Grouped=true;
break;
case 6: tbt_Name="R";
tbt.Hint="Вправо";
tbt.AllowAllUp=tbt.Grouped=true;
}
tbt.Name=tbt_Name;
tbt.LoadImage(JSPlus.HelpDir+"IMAGE\\TRichEdit\\"+tbt_Name+".ico");
tbt.OnClick=tbt_Click;
}
// RichEdit
rce=new TRichEdit(frm);
rce.BorderStyle=bsSingle;
rce.Align=alClient;
rce.Font.Name="Times New Roman";
rce.Font.Size=10;
rce.OnClick=rce_Click;
rce.OnKeyUp=rce_KeyUp;
rce_StatusLines(rce);
cb1.Text=rce.Font.Name;
cb2.Text=""+rce.Font.Size;
stb_Resize(stb);
rce.SetFocus();
frm.ShowModal();
function rce_StatusLines(rce)
{
stb.Panels[2].Text="Строка "+
(rce.CaretPos.y+1)+" из "+(rce.Text.substrings("\n")+1);
}
function rce_ToolBar(rce)
{
var cmp,pf2,pfType=0,fsType=0,sat=rce.SelAttributes;
for (i=0;i<tlb.ButtonCount;i++) {
switch ((cmp=tlb.Buttons[i]).Name) {
case "L": pfType=PFA_LEFT; break;
case "C": pfType=PFA_CENTER; break;
case "R": pfType=PFA_RIGHT; break;
case "B": fsType=fsBold; break;
case "I": fsType=fsItalic; break;
case "U": fsType=fsUnderline; break;
default: continue;
}
if ((cmp.Down) && (pfType>0)) {
pf2=new TPARAFORMAT2();
pf2.Mask=PFM_ALIGNMENT;
pf2.Alignment=pfType;
rce.SetParaFormat2(pf2);
pf2.Delete();
continue;
}
if (cmp.Down)
sat.Style|=fsType;
else
sat.Style&=~fsType;
}
}
// Обработчик события OnClick ToolButton
function tbt_Click(tbt)
{
var btn,dlg;
switch (tbt.Name) {
case "L":
case "C":
case "R": if ((!tbt.Down) &&
((btn=tlb.FindChildControl("L"))!=null))
btn.Down=true;
}
rce_ToolBar(rce);
}
// Обработчик события OnClick RichEdit
function rce_Click(rce)
{
rce_StatusLines(rce);
}
// Обработчик события OnSelect
function cmb_Select(cmb)
{
var sat=rce.SelAttributes;
rce.SetFocus();
switch (cmb.Name) {
case "F": sat.Name=cmb.Text; break;
case "S": sat.Size=parseInt(cmb.Text);
}
}
// Обработчик события OnKeyUp
function rce_KeyUp(rce,Key,Shift)
{
var Ovr_Str="";
rce_StatusLines(rce);
if (Key!=VK_INSERT)
return;
rce.numTag=1-rce.numTag;
switch (rce.numTag) {
case 0: Ovr_Str="Вставка"; break;
case 1: Ovr_Str="Замена";
}
stb.Panels[1].Text=Ovr_Str;
}
// Обработчик события OnResize
function stb_Resize(stb)
{
var i,w;
for (i=stb.Panels.Count-1,w=0;i>0;i--)
w+=(stb.Panels[i].Width=stb.Panels[i].numTag);
stb.Panels[0].Width=stb.ClientWidth-w;
}