www.pudn.com > TMS.Component.Pack.v5.0.rar > AdvHTMLProp.pas, change:2009-01-24,size:16952b
{*************************************************************************}
{ HTMLText property editor }
{ for Delphi & C++Builder }
{ version 1.1 }
{ }
{ written by TMS Software }
{ copyright © 2000-2004 }
{ Email : info@tmssoftware.com }
{ Web : http://www.tmssoftware.com }
{ }
{ The source code is given as is. The author is not responsible }
{ for any possible damage done due to the use of this code. }
{ The component can be freely used in any application. The complete }
{ source code remains property of the author and may not be distributed, }
{ published, given or sold in any form as such. No parts of the source }
{ code can be included in any other component or application without }
{ written authorization of the author. }
{*************************************************************************}
{$I TMSDEFS.INC}
unit AdvHTMLProp;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, htmltext, ExtCtrls, {$IFDEF DELPHI4_LVL} ImgList, {$ENDIF} ComCtrls,
ToolWin, Menus, AdvMemo, AdvmWS
{$IFDEF TMSDOTNET}
, Types
{$ENDIF}
;
type
TAdvHTMLEditor = class(TForm)
ToolBar1: TToolBar;
Fontname: TComboBox;
FontSize: TComboBox;
BoldButton: TToolButton;
ItalicButton: TToolButton;
UnderlineButton: TToolButton;
LeftAlign: TToolButton;
CenterAlign: TToolButton;
RightAlign: TToolButton;
URLButton: TToolButton;
ToolButton1: TToolButton;
Superscript: TToolButton;
Subscript: TToolButton;
ToolButton2: TToolButton;
ToolButton3: TToolButton;
ImageList1: TImageList;
ColorDialog1: TColorDialog;
Splitter1: TSplitter;
HTMLStaticText1: THTMLStaticText;
StatusBar1: TStatusBar;
ToolButton4: TToolButton;
ToolButton5: TToolButton;
ToolButton6: TToolButton;
ListButton: TToolButton;
ToolButton8: TToolButton;
dbfields: TToolButton;
PopupMenu1: TPopupMenu;
Test1: TMenuItem;
N11: TMenuItem;
N21: TMenuItem;
N31: TMenuItem;
N441: TMenuItem;
ToolButton7: TToolButton;
AcceptBtn: TToolButton;
CancelBtn: TToolButton;
ToolButton9: TToolButton;
Memo1: TAdvMemo;
AdvHTMLMemoStyler1: TAdvHTMLMemoStyler;
procedure Memo1Change(Sender: TObject);
procedure BoldButtonClick(Sender: TObject);
procedure ItalicButtonClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ToolButton1Click(Sender: TObject);
procedure UnderlineButtonClick(Sender: TObject);
procedure CenterAlignClick(Sender: TObject);
procedure RightAlignClick(Sender: TObject);
procedure FontnameChange(Sender: TObject);
procedure URLButtonClick(Sender: TObject);
procedure SuperscriptClick(Sender: TObject);
procedure SubscriptClick(Sender: TObject);
procedure HTMLStaticText1AnchorEnter(Sender: TObject; Anchor: String);
procedure HTMLStaticText1AnchorExit(Sender: TObject; Anchor: String);
procedure Memo1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure ToolButton2Click(Sender: TObject);
procedure Memo1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure LeftAlignClick(Sender: TObject);
procedure FontSizeChange(Sender: TObject);
procedure ToolButton3Click(Sender: TObject);
procedure ToolButton5Click(Sender: TObject);
procedure ToolButton4Click(Sender: TObject);
procedure ToolButton6Click(Sender: TObject);
procedure ListButtonClick(Sender: TObject);
procedure ToolButton8Click(Sender: TObject);
procedure dbfieldsClick(Sender: TObject);
procedure PopupClick(Sender: TObject);
procedure AcceptBtnClick(Sender: TObject);
procedure CancelBtnClick(Sender: TObject);
procedure ToolButton9Click(Sender: TObject);
private
{ Private declarations }
fFieldNames:tstringlist;
procedure GetFontNames;
procedure SetFieldNames(const Value: TStringList);
public
{ Public declarations }
constructor Create(aOwner:TComponent); override;
destructor Destroy; override;
procedure InsertTags(starttag,endtag:string);
function HasTags(starttag,endtag:string):boolean;
procedure RemoveTags(starttag,endtag:string);
function ScanForward(starttag,endtag:string):boolean;
function ScanBackward(starttag,endtag:string):boolean;
procedure ChangeTagProp(starttag,endtag,propname,propval:string);
procedure UpdateButtons;
property FieldNames:TStringList read fFieldNames write SetFieldNames;
function GetHTMLString:string;
end;
var
AdvHTMLEditor: TAdvHTMLEditor;
implementation
{$R *.DFM}
{not case sensitive pos function}
function IPos(substr,s:string):integer;
begin
Result := pos(uppercase(substr),uppercase(s));
end;
function PosFrom(selpos:integer; substr,s:string):integer;
begin
Delete(s,1,selpos-1);
Result := IPos(substr,s);
end;
procedure TAdvHTMLEditor.Memo1Change(Sender: TObject);
begin
if ToolButton9.Down then
htmlstatictext1.HTMLText.Assign(memo1.lines);
end;
procedure TAdvHTMLEditor.InsertTags(starttag,endtag:string);
var
s:string;
ss,sl:integer;
begin
ss:=memo1.selstart+1;
sl:=memo1.sellength;
s:=memo1.lines.text;
insert(starttag,s,ss);
insert(endtag,s,ss+memo1.sellength+length(starttag));
memo1.lines.text:=s;
memo1.selstart:=ss-1+length(starttag);
memo1.sellength:=sl;
end;
function TAdvHTMLEditor.ScanBackward(starttag,endtag:string):boolean;
var
i:integer;
s:string;
begin
i:=memo1.selstart;
s:=memo1.lines.text;
s:=copy(s,1,i);
result:=false;
while (i>=1) do
begin
if PosFrom(i,starttag,s)>PosFrom(i,endtag,s) then
begin
if pos('>',starttag)=0 then result:=pos('>',s)<>0 else
result:=true;
break;
end;
dec(i);
end;
end;
function TAdvHTMLEditor.ScanForward(starttag,endtag:string):boolean;
var
i:integer;
s:string;
st,et:integer;
begin
i:=memo1.selstart+1;
s:=memo1.lines.text;
s:=copy(s,i,length(s));
st:=IPos(starttag,s);
et:=IPos(endtag,s);
Result:=false;
if (st=0) and (et>0) then result:=true;
if (st>0) and (et>0) and (et<st) then result:=true;
end;
function TAdvHTMLEditor.HasTags(starttag, endtag: string): boolean;
begin
Result := ScanBackward(starttag, endtag) and ScanForward(starttag,endtag);
end;
procedure TAdvHTMLEditor.RemoveTags(starttag, endtag: string);
var
i,j,k:integer;
s:string;
begin
i:=memo1.selstart;
j:=memo1.sellength;
s:=memo1.lines.text;
s:=copy(s,1,i);
k:=i;
while (i>=1) do
begin
if PosFrom(i,starttag,s)>PosFrom(i,endtag,s) then
begin
s:=memo1.lines.text;
delete(s,i,length(starttag));
if (pos('>',starttag)=0) then delete(s,i,posfrom(i,'>',s));
break;
end;
dec(i);
end;
{first tag is removed}
delete(s,PosFrom(i,endtag,s)+i-1,length(endtag));
memo1.lines.text:=s;
memo1.selstart:=k-length(starttag);
memo1.sellength:=j;
end;
procedure TAdvHTMLEditor.ChangeTagProp(starttag,endtag,propname,propval:string);
var
i,j,k,l,pp:integer;
s,tag:string;
begin
i:=memo1.selstart;
j:=memo1.sellength;
s:=memo1.lines.text;
k:=length(s); l:=i;
s:=copy(s,1,i);
tag:=starttag;
while (i>=1) do
begin
if PosFrom(i,starttag,s)>PosFrom(i,endtag,s) then
begin
{found the tag here}
s:=memo1.lines.text;
tag:=copy(s,i,posfrom(i,'>',s));
pp:=ipos(' '+propname,tag);
if (pp>0) then
begin
inc(pp);
{found the tag}
delete(s,i+pp-1,length(propname));
delete(s,i+pp-1,posfrom(i+pp,'"',s)+1);
delete(s,i+pp-1,posfrom(i+pp,'"',s)+1);
end;
insert(propname+'="'+propval+'" ',s,i+length(starttag));
break;
end;
dec(i);
end;
memo1.lines.text:=s;
memo1.selstart:=l+length(s)-k;
memo1.sellength:=j;
end;
{$IFNDEF TMSDOTNET}
function EnumFontsProc(var LogFont: TLogFont; var TextMetric: TTextMetric;
FontType: Integer; Data: Pointer): Integer; stdcall;
begin
TStrings(Data).Add(LogFont.lfFaceName);
Result := 1;
end;
{$ENDIF}
procedure TAdvHTMLEditor.GetFontNames;
var
DC: HDC;
begin
DC := GetDC(0);
{$IFNDEF TMSDOTNET}
EnumFonts(DC, nil, @EnumFontsProc, Pointer(FontName.Items));
{$ENDIF}
ReleaseDC(0, DC);
{$IFDEF TMSDOTNET}
FontName.Items.Assign(Screen.Fonts);
{$ENDIF}
ReleaseDC(0, DC);
FontName.Sorted := True;
FontName.ItemIndex:=0;
FontSize.ItemIndex:=0;
end;
procedure TAdvHTMLEditor.FormCreate(Sender: TObject);
begin
GetFontNames;
end;
procedure TAdvHTMLEditor.ToolButton1Click(Sender: TObject);
var
l:integer;
begin
// ColorDialog1.Color:=RTFControl.SelAttributes.Color;
if ColorDialog1.Execute then
begin
l:=colortorgb(colordialog1.color);
l:=((l and $FF0000) shr 16) or ((l and $FF) shl 16) or (l and $FF00);
if HasTags('<FONT ','</FONT>') then
ChangeTagProp('<FONT ','</FONT>','color','#'+inttohex(l,6))
else
InsertTags('<FONT color="#'+inttohex(l,6)+'">','</FONT>');
end;
end;
procedure TAdvHTMLEditor.FontnameChange(Sender: TObject);
begin
if HasTags('<FONT ','</FONT>') then
ChangeTagProp('<FONT ','</FONT>','face',fontname.items[fontname.itemindex])
else
InsertTags('<FONT face="'+fontname.items[fontname.itemindex]+'">','</FONT>');
memo1.setfocus;
end;
procedure TAdvHTMLEditor.URLButtonClick(Sender: TObject);
var
tag:string;
begin
tag:='';
if HasTags('<A ','</A>') then RemoveTags('<A ','</A>') else
if InputQuery('Anchor', 'Anchor value',tag) then
InsertTags('<A href="'+tag+'">','</A>');
memo1.setfocus;
end;
procedure TAdvHTMLEditor.UnderlineButtonClick(Sender: TObject);
begin
if not HasTags('<U>','</U>') then InsertTags('<U>','</U>') else RemoveTags('<U>','</U>');
end;
procedure TAdvHTMLEditor.BoldButtonClick(Sender: TObject);
begin
if not HasTags('<B>','</B>') then InsertTags('<B>','</B>') else RemoveTags('<B>','</B>');
end;
procedure TAdvHTMLEditor.ItalicButtonClick(Sender: TObject);
begin
if not HasTags('<I>','</I>') then InsertTags('<I>','</I>') else RemoveTags('<I>','</I>');
end;
procedure TAdvHTMLEditor.SuperscriptClick(Sender: TObject);
begin
if not HasTags('<SUP>','</SUP>') then InsertTags('<SUP>','</SUP>') else RemoveTags('<SUP>','</SUP>');
end;
procedure TAdvHTMLEditor.SubscriptClick(Sender: TObject);
begin
if not HasTags('<SUB>','</SUB>') then InsertTags('<SUB>','</SUB>') else RemoveTags('<SUB>','</SUB>');
end;
procedure TAdvHTMLEditor.HTMLStaticText1AnchorEnter(Sender: TObject;
Anchor: String);
begin
statusbar1.simpletext:=anchor;
end;
procedure TAdvHTMLEditor.HTMLStaticText1AnchorExit(Sender: TObject;
Anchor: String);
begin
statusbar1.simpletext:='';
end;
procedure TAdvHTMLEditor.ToolButton2Click(Sender: TObject);
begin
InsertTags('<BR>','');
end;
procedure TAdvHTMLEditor.Memo1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
UpdateButtons;
end;
procedure TAdvHTMLEditor.Memo1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
UpdateButtons;
end;
procedure TAdvHTMLEditor.UpdateButtons;
begin
BoldButton.Down:=HasTags('<B>','</B>');
ItalicButton.Down:=HasTags('<I>','</I>');
UnderlineButton.Down:=HasTags('<U>','</U>');
LeftAlign.Down:=not HasTags('<P align="right">','</P>') and not HasTags('<P align="center">','</P>');
RightAlign.Down:=HasTags('<P align="right">','</P>');
CenterAlign.Down:=HasTags('<P align="center">','</P>');
LeftAlign.Down:=HasTags('<P align="left">','</P>');
URLButton.Down:=HasTags('<A ','</A>');
SuperScript.Down:=HasTags('<SUP>','</SUP>');
SubScript.Down:=HasTags('<SUB>','</SUB>');
ListButton.Down:=HasTags('<UL>','</UL>');
end;
procedure TAdvHTMLEditor.LeftAlignClick(Sender: TObject);
begin
if HasTags('<P align="right">','</P>') then RemoveTags('<P align="right">','</P>');
if HasTags('<P align="center">','</P>') then RemoveTags('<P align="center">','</P>');
InsertTags('<P align="left">','</P>');
end;
procedure TAdvHTMLEditor.CenterAlignClick(Sender: TObject);
begin
if HasTags('<P align="right">','</P>') then RemoveTags('<P align="right">','</P>');
if HasTags('<P align="left">','</P>') then RemoveTags('<P align="left">','</P>');
InsertTags('<P align="center">','</P>');
end;
procedure TAdvHTMLEditor.RightAlignClick(Sender: TObject);
begin
if HasTags('<P align="center">','</P>') then RemoveTags('<P align="center">','</P>');
if HasTags('<P align="left">','</P>') then RemoveTags('<P align="left">','</P>');
InsertTags('<P align="right">','</P>');
end;
procedure TAdvHTMLEditor.FontSizeChange(Sender: TObject);
begin
if HasTags('<FONT ','</FONT>') then
ChangeTagProp('<FONT ','</FONT>',' size',fontsize.items[fontsize.itemindex])
else
InsertTags('<FONT size="'+fontsize.items[fontsize.itemindex]+'">','</FONT>');
memo1.setfocus;
end;
procedure TAdvHTMLEditor.ToolButton3Click(Sender: TObject);
var
l:integer;
begin
if ColorDialog1.Execute then
begin
l:=colortorgb(colordialog1.color);
l:=((l and $FF0000) shr 16) or ((l and $FF) shl 16) or (l and $FF00);
if HasTags('<FONT ','</FONT>') then
ChangeTagProp('<FONT ','</FONT>','bgcolor','#'+inttohex(l,6))
else
InsertTags('<FONT bgcolor="#'+inttohex(l,6)+'">','</FONT>');
end;
end;
procedure TAdvHTMLEditor.ToolButton5Click(Sender: TObject);
var
tag:string;
begin
tag:='0';
if InputQuery('Set indent', 'Indent value',tag) then
InsertTags('<IND x="'+tag+'">','');
end;
procedure TAdvHTMLEditor.ToolButton4Click(Sender: TObject);
var
tag:string;
begin
tag:='0';
if InputQuery('Image', 'Image reference',tag) then
InsertTags('<IMG src="'+tag+'">','');
end;
procedure TAdvHTMLEditor.ToolButton6Click(Sender: TObject);
begin
if not HasTags('<BLINK>','</BLINK>') then
InsertTags('<BLINK>','</BLINK>')
else
RemoveTags('<BLINK>','</BLINK>');
end;
procedure TAdvHTMLEditor.ListButtonClick(Sender: TObject);
begin
if memo1.SelLength=0 then InsertTags('<LI>','')
else
if not HasTags('<UL>','</UL>') then
InsertTags('<UL>','</UL>')
else
RemoveTags('<UL>','</UL>');
end;
procedure TAdvHTMLEditor.ToolButton8Click(Sender: TObject);
begin
if not HasTags('<SHAD>','</SHAD>') then
InsertTags('<SHAD>','</SHAD>')
else
RemoveTags('<SHAD>','</SHAD>');
end;
constructor TAdvHTMLEditor.Create(aOwner: TComponent);
begin
inherited;
FFieldNames := TStringList.Create;
end;
destructor TAdvHTMLEditor.Destroy;
begin
FFieldNames.Free;
inherited;
end;
procedure TAdvHTMLEditor.SetFieldNames(const Value: TStringList);
begin
FFieldNames.Assign(Value);
end;
procedure TAdvHTMLEditor.dbfieldsClick(Sender: TObject);
var
pt:tpoint;
i:integer;
menuitem:tmenuitem;
begin
while popupmenu1.Items.Count>0 do
popupmenu1.items.items[0].Free;
for i:=1 to fFieldNames.Count do
begin
menuitem:=tmenuitem.Create(self);
menuitem.Caption:=fFieldNames.Strings[i-1];
menuitem.OnClick:=PopupClick;
popupmenu1.Items.add(menuitem);
end;
pt:=clienttoscreen(point(dbfields.left,dbfields.top+dbfields.height));
popupmenu1.Popup(pt.x,pt.y);
end;
procedure TAdvHTMLEditor.PopupClick(Sender: TObject);
var
s:string;
begin
s:=(sender as TMenuItem).Caption;
while (pos('&',s)>0) do delete(s,pos('&',s),1);
InsertTags('<#'+s+'>','');
end;
procedure TAdvHTMLEditor.AcceptBtnClick(Sender: TObject);
begin
modalresult:=mrOk;
end;
procedure TAdvHTMLEditor.CancelBtnClick(Sender: TObject);
begin
modalresult:=mrCancel;
end;
function TAdvHTMLEditor.GetHTMLString: string;
var
i: Integer;
begin
Result := '';
for i := 1 to Memo1.Lines.Count do
begin
Result := Result + Memo1.Lines[i - 1];
end;
end;
procedure TAdvHTMLEditor.ToolButton9Click(Sender: TObject);
begin
if (Sender as TToolButton).Down then
begin
htmlstatictext1.HTMLText.Assign(memo1.lines);
end;
end;
end.