IDE: improved xml parser to keep TDomText nodes

git-svn-id: trunk@13928 -
This commit is contained in:
mattias 2008-01-30 22:29:50 +00:00
parent 7901ce1c95
commit 1802d34238
6 changed files with 358 additions and 261 deletions

View File

@ -460,11 +460,11 @@ begin
SetWideStringManager(WideStringManager, OldWideStringManager);
try
{$ENDIF}
// do not call SkipWhitespace. The text is needed by ParseCharData.
// do not call SkipWhitespace. They are needed by ParseCharData.
while ParseCharData(AOwner) or ParseCDSect(AOwner) or ParsePI or
ParseComment(AOwner) or ParseElement(AOwner) or
ParseReference(AOwner) do
;
ParseReference(AOwner)
do ;
{$IFDEF UsesFPCWidestrings}
finally
SetWideStringManager(OldWideStringManager);

View File

@ -56,6 +56,17 @@ procedure WriteDocumentType(node: TDOMNode); forward;
procedure WriteDocumentFragment(node: TDOMNode); forward;
procedure WriteNotation(node: TDOMNode); forward;
function NodeFrontIsText(Node: TDOMNode): boolean;
begin
Result:=(Node is TDOMText) or (Node.ParentNode is TDOMText)
or (Node.PreviousSibling is TDOMText);
end;
function NodeAfterIsText(Node: TDOMNode): boolean;
begin
Result:=(Node is TDOMText) or (Node.ParentNode is TDOMText)
or (Node.NextSibling is TDOMText);
end;
type
TWriteNodeProc = procedure(node: TDOMNode);
@ -84,7 +95,6 @@ threadvar
f: ^Text;
stream: TStream;
wrt, wrtln: TOutputProc;
InsideTextNode: Boolean;
procedure Text_Write(const Buffer; Count: Longint);
var s: string;
@ -241,10 +251,9 @@ procedure WriteElement(node: TDOMNode);
var
i: Integer;
attr, child: TDOMNode;
SavedInsideTextNode: Boolean;
s: String;
begin
if not InsideTextNode then
if not NodeFrontIsText(Node) then
wrtIndent;
wrtChr('<');
wrtStr(node.NodeName);
@ -266,29 +275,30 @@ begin
if Child = nil then begin
wrtChr('/');
wrtChr('>');
if not InsideTextNode then wrtLineEnd;
if not NodeAfterIsText(Node) then
wrtLineEnd;
end else
begin
SavedInsideTextNode := InsideTextNode;
wrtChr('>');
if not (InsideTextNode or Child.InheritsFrom(TDOMText)) then
if not ((Node is TDOMText) or (Node.ParentNode is TDOMText) or
(Child is TDOMText))
then
wrtLineEnd;
IncIndent;
repeat
if Child.InheritsFrom(TDOMText) then
InsideTextNode := True;
WriteNode(Child);
Child := Child.NextSibling;
until child = nil;
DecIndent;
if not InsideTextNode then
if not ((Node is TDOMText) or (Node.ParentNode is TDOMText) or
(Node.LastChild is TDOMText))
then
wrtIndent;
InsideTextNode := SavedInsideTextNode;
wrtChr('<');
wrtChr('/');
wrtStr(node.NodeName);
wrtChr('>');
if not InsideTextNode then
if not NodeAfterIsText(Node) then
wrtLineEnd;
end;
end;
@ -306,7 +316,7 @@ end;
procedure WriteCDATA(node: TDOMNode);
begin
if not InsideTextNode then
if not NodeFrontIsText(Node) then
wrtStr('<![CDATA[' + node.NodeValue + ']]>')
else begin
wrtIndent;
@ -328,22 +338,22 @@ end;
procedure WritePI(node: TDOMNode);
begin
if not InsideTextNode then wrtIndent;
if not NodeFrontIsText(Node) then wrtIndent;
wrtChr('<'); wrtChr('!');
wrtStr(TDOMProcessingInstruction(node).Target);
wrtChr(' ');
wrtStr(TDOMProcessingInstruction(node).Data);
wrtChr('>');
if not InsideTextNode then wrtLineEnd;
if not NodeAfterIsText(Node) then wrtLineEnd;
end;
procedure WriteComment(node: TDOMNode);
begin
if not InsideTextNode then wrtIndent;
if not NodeFrontIsText(Node) then wrtIndent;
wrtStr('<!--');
wrtStr(node.NodeValue);
wrtStr('-->');
if not InsideTextNode then wrtLineEnd;
if not NodeAfterIsText(Node) then wrtLineEnd;
end;
procedure WriteDocument(node: TDOMNode);
@ -366,10 +376,8 @@ begin
if node=nil then ;
end;
procedure InitWriter;
begin
InsideTextNode := False;
SetLength(Indent, 0);
end;

View File

@ -17,6 +17,12 @@
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
***************************************************************************
Author: Mattias Gaertner
Abstract:
This unit is part of the IDE's help system. It implements the help for sources via
fpdoc files and pascal comments.
}
unit CodeHelp;
@ -65,17 +71,18 @@ type
);
TLazFPDocFileFlags = set of TLazFPDocFileFlag;
{ TLazFPDocFile }
{ TLazFPDocFile
An fpdoc xml file. The CodeBuffer is the xml source. The Doc is the parsed dom tree. }
TLazFPDocFile = class
private
fUpdateLock: integer;
FFlags: TLazFPDocFileFlags;
public
Filename: string;
Filename: string;// the fpdoc xml filename
Doc: TXMLdocument;// IMPORTANT: if you change this, call DocChanging and DocChanged to notify the references
DocModified: boolean;
ChangeStep: integer;// the CodeBuffer.ChangeStep value, when Doc was build
ChangeStep: integer;// the CodeBuffer.ChangeStep value, when Doc was built
CodeBuffer: TCodeBuffer;
destructor Destroy; override;
function GetModuleNode: TDOMNode;
@ -102,7 +109,8 @@ type
FilesTimeStamp: integer;
end;
{ TCodeHelpElement }
{ TCodeHelpElement - mapping between one codetools position and a fpdoc xml node.
This data is only valid for short times, so don't store it. }
TCodeHelpElement = class
public
@ -114,7 +122,9 @@ type
FPDocFile: TLazFPDocFile;
end;
{ TCodeHelpElementChain }
{ TCodeHelpElementChain - a list of TCodeHelpElement.
For example the list of one element plus its ancestors.
Only valid for short time. So always check IsValid. }
TCodeHelpElementChain = class
private
@ -227,6 +237,7 @@ function CompareAnsistringWithLDSrc2DocSrcFile(Key, Data: Pointer): integer;
function ToUnixLineEnding(const s: String): String;
function ToOSLineEnding(const s: String): String;
function ReplaceLineEndings(const s, NewLineEnds: string): string;
implementation
@ -286,6 +297,27 @@ begin
end;
end;
function ReplaceLineEndings(const s, NewLineEnds: string): string;
var
p: Integer;
StartPos: LongInt;
begin
Result:=s;
p:=1;
while (p<=length(Result)) do begin
if Result[p] in [#10,#13] then begin
StartPos:=p;
if (p<length(Result))
and (Result[p+1] in [#10,#13]) and (Result[p]<>Result[p+1]) then
inc(p);
Result:=copy(Result,1,StartPos-1)+NewLineEnds+copy(Result,p+1,length(Result));
inc(p,length(NewLineEnds));
end else begin
inc(p);
end;
end;
end;
function CompareLazFPDocFilenames(Data1, Data2: Pointer): integer;
begin
Result:=CompareFilenames(TLazFPDocFile(Data1).Filename,
@ -384,6 +416,22 @@ begin
end;
function TLazFPDocFile.GetChildValuesAsString(Node: TDOMNode): String;
procedure FindEndOfTag(const Src: string; var EndPos: integer);
begin
while (EndPos<=length(Src)) do begin
if (Src[EndPos]='>') then begin
inc(EndPos);
exit;
end else if Src[EndPos]='"' then begin
repeat
inc(EndPos);
until (EndPos>=length(Src)) or (Src[EndPos]='"');
end;
inc(EndPos);
end;
end;
var
MemStream: TMemoryStream;
StartPos: Integer;
@ -398,28 +446,25 @@ begin
SetLength(Result,MemStream.Size);
if Result<>'' then
MemStream.Read(Result[1],length(Result));
// remove tag(s) for node, because Result should only contain the child values:
// remove enclosing tag(s) for Node, because Result should only
// contain the child values:
// <nodename/> or <nodename>...<nodename/>
// <nodename something=""/>
// plus line ends
StartPos:=1;
EndPos:=length(Result)+1;
// skip start tag
// skip start tag and spaces at start
while (StartPos<=length(Result))
and (Result[StartPos] in [' ',#9,#10,#13]) do
inc(StartPos);
if (Result<>'') and (Result[StartPos]='<') then begin
inc(StartPos);
while (StartPos<=EndPos) do begin
if (Result[StartPos]='>') then begin
inc(StartPos);
break;
end else if Result[StartPos]='"' then begin
repeat
inc(StartPos);
until (StartPos>=EndPos) or (Result[StartPos]='"');
end;
FindEndOfTag(Result,StartPos);
while (StartPos<=length(Result))
and (Result[StartPos] in [' ',#9,#10,#13]) do
inc(StartPos);
end;
end;
// skip ending line ends
// skip ending line ends and spaces at end
while (EndPos>StartPos) and (Result[EndPos-1] in [' ',#9,#10,#13]) do
dec(EndPos);
// skip end tag
@ -436,31 +481,37 @@ begin
break;
end;
until false;
while (EndPos>StartPos) and (Result[EndPos-1] in [' ',#9,#10,#13]) do
dec(EndPos);
end;
Result:=copy(Result,StartPos,EndPos-StartPos);
// the xml writer adds/removes spaces/new lines automatically
// add newlines after br and p tags
StartPos:=1;
while StartPos<length(Result) do begin
if Result[StartPos]='<' then begin
// search end of tag
EndPos:=StartPos+1;
FindEndOfTag(Result,EndPos);
if Result[StartPos+1]='/' then
inc(StartPos);
if (CompareIdentifiers(@Result[StartPos+1],'br')=0)
or (CompareIdentifiers(@Result[StartPos+1],'p')=0) then
begin
// add new line
if not (Result[EndPos] in [#10,#13]) then
Result:=copy(Result,1,EndPos-1)+LineEnding+copy(Result,EndPos,length(Result));
end;
StartPos:=EndPos;
end else begin
inc(StartPos);
end;
end;
finally
MemStream.Free;
end;
DebugLn(['TLazFPDocFile.GetChildValuesAsString Node=',Node.NodeName,' Result=',Result]);
{Child:=Node.FirstChild;
//DebugLn(['TLazFPDocFile.GetChildValuesAsString Node=',Node.NodeName]);
while Child<>nil do begin
//DebugLn(['TLazFPDocFile.GetChildValuesAsString ',dbgsName(Child),' ',Child.NodeName]);
if Child is TDOMText then begin
//DebugLn(['TLazFPDocFile.GetChildValuesAsString Data="',TDOMText(Child).Data,'" Length=',TDOMText(Child).Length]);
Result:=Result+TDOMText(Child).Data;
end else if Child is TDOMElement then begin
if Child.FirstChild=nil then begin
Result:=Result+'<'+Child.NodeName+'/>';
end else begin
Result:=Result+'<'+Child.NodeName+'>'
+GetChildValuesAsString(Child)
+'</'+Child.NodeName+'>'
end;
end;
Child:=Child.NextSibling;
end;}
end;
function TLazFPDocFile.GetValuesFromNode(Node: TDOMNode): TFPDocElementValues;
@ -530,54 +581,61 @@ procedure TLazFPDocFile.SetChildValue(Node: TDOMNode; const ChildName: string;
var
Child: TDOMNode;
OldNode: TDOMNode;
FileAttribute: TDOMAttr;
begin
Child:=Node.FindNode(ChildName);
NewValue:=ToUnixLineEnding(NewValue);
if Child=nil then begin
{if ChildName = 'example' then begin
if ChildName = 'example' then begin
OldNode:=nil;
if Child<>nil then
OldNode:=Child.Attributes.GetNamedItem('file');
NewValue:=FilenameToURLPath(NewValue);
if (NewValue<>'')
or (not (OldNode is TDOMAttr))
or (TDOMAttr(OldNode).Value<>NewValue) then begin
DebugLn(['TLazFPDocFile.SetChildValue Changing Name=',ChildName,' NewValue="',NewValue,'"']);
// add or change example
DocChanging;
NewValue:=FilenameToURLPath(NewValue);
if (NewValue<>'')
or (not (OldNode is TDOMAttr))
or (TDOMAttr(OldNode).Value<>NewValue) then begin
DebugLn(['TLazFPDocFile.SetChildValue Changing Name=',ChildName,' NewValue="',NewValue,'"']);
// add or change example
DocChanging;
try
FileAttribute := Doc.CreateAttribute('file');
FileAttribute.Value := NewValue;
OldNode:=Node.Attributes.SetNamedItem(FileAttribute);
OldNode.Free;
DocChanged;
end;
end
else }
// add node
if NewValue<>'' then begin
DebugLn(['TLazFPDocFile.SetChildValue Adding Name=',ChildName,' NewValue="',NewValue,'"']);
DocChanging;
try
Child := Doc.CreateElement(ChildName);
Node.AppendChild(Child);
ReadXMLFragmentFromString(Child,NewValue);
finally
DocChanged;
end;
end;
end else if GetChildValuesAsString(Child)<>NewValue then begin
// change node
DocChanging;
try
DebugLn(['TLazFPDocFile.CheckAndWriteNode Changing ',Node.NodeName,
' ChildName=',Child.NodeName,
' OldValue=',GetChildValuesAsString(Child),
' NewValue="',NewValue,'"']);
// remove old content
while Child.LastChild<>nil do
Child.RemoveChild(Child.LastChild);
// set new content
ReadXMLFragmentFromString(Child,NewValue);
finally
DocChanged;
end else begin
if Child=nil then begin
// add node
if NewValue<>'' then begin
DebugLn(['TLazFPDocFile.SetChildValue Adding Name=',ChildName,' NewValue="',NewValue,'"']);
DocChanging;
try
Child := Doc.CreateElement(ChildName);
Node.AppendChild(Child);
ReadXMLFragmentFromString(Child,NewValue);
finally
DocChanged;
end;
end;
end else if GetChildValuesAsString(Child)<>NewValue then begin
// change node
DocChanging;
try
DebugLn(['TLazFPDocFile.CheckAndWriteNode Changing ',Node.NodeName,
' ChildName=',Child.NodeName,
' OldValue=',GetChildValuesAsString(Child),
' NewValue="',NewValue,'"']);
// remove old content
while Child.LastChild<>nil do
Child.RemoveChild(Child.LastChild);
// set new content
ReadXMLFragmentFromString(Child,NewValue);
finally
DocChanged;
end;
end;
end;
end;

View File

@ -5,7 +5,7 @@ object FPDocEditor: TFPDocEditor
Width = 753
HorzScrollBar.Page = 752
VertScrollBar.Page = 116
ActiveControl = LinkIdComboBox
ActiveControl = DescrMemo
Caption = 'FPDoc editor'
ClientHeight = 117
ClientWidth = 753
@ -16,9 +16,9 @@ object FPDocEditor: TFPDocEditor
Left = 17
Height = 117
Width = 736
ActivePage = SeeAlsoTabSheet
ActivePage = DescrTabSheet
Align = alClient
TabIndex = 3
TabIndex = 1
TabOrder = 0
TabPosition = tpBottom
object ShortTabSheet: TTabSheet
@ -30,7 +30,8 @@ object FPDocEditor: TFPDocEditor
Width = 730
Align = alTop
BorderSpacing.Right = 2
OnEditingDone = DocumentationTagChange
OnChange = ShortEditEditingDone
OnEditingDone = ShortEditEditingDone
TabOrder = 0
Text = 'ShortEdit'
end
@ -75,7 +76,7 @@ object FPDocEditor: TFPDocEditor
Lines.Strings = (
'DescrMemo'
)
OnChange = DocumentationTagChange
OnChange = DescrMemoChange
TabOrder = 0
end
end
@ -92,7 +93,7 @@ object FPDocEditor: TFPDocEditor
Lines.Strings = (
'ErrorsMemo'
)
OnChange = DocumentationTagChange
OnChange = ErrorsMemoChange
TabOrder = 0
end
end
@ -177,17 +178,17 @@ object FPDocEditor: TFPDocEditor
Width = 730
Align = alTop
BorderSpacing.Right = 2
OnChange = DocumentationTagChange
OnChange = ExampleEditChange
TabOrder = 0
Text = 'ExampleEdit'
end
object BrowseExampleButton: TButton
AnchorSideRight.Control = ExampleTabSheet
AnchorSideRight.Side = asrBottom
Left = 592
Height = 25
Left = 574
Height = 29
Top = 28
Width = 134
Width = 156
Anchors = [akTop, akRight]
AutoSize = True
BorderSpacing.Right = 2

View File

@ -3,153 +3,153 @@
LazarusResources.Add('TFPDocEditor','FORMDATA',[
'TPF0'#12'TFPDocEditor'#11'FPDocEditor'#4'Left'#3'/'#1#6'Height'#2'u'#3'Top'#3
+'$'#2#5'Width'#3#241#2#18'HorzScrollBar.Page'#3#240#2#18'VertScrollBar.Page'
+#2't'#13'ActiveControl'#7#14'LinkIdComboBox'#7'Caption'#6#12'FPDoc editor'#12
+'ClientHeight'#2'u'#11'ClientWidth'#3#241#2#8'OnCreate'#7#10'FormCreate'#9'O'
+'nDestroy'#7#11'FormDestroy'#8'OnResize'#7#10'FormResize'#0#12'TPageControl'
+#11'PageControl'#4'Left'#2#17#6'Height'#2'u'#5'Width'#3#224#2#10'ActivePage'
+#7#15'SeeAlsoTabSheet'#5'Align'#7#8'alClient'#8'TabIndex'#2#3#8'TabOrder'#2#0
+#11'TabPosition'#7#8'tpBottom'#0#9'TTabSheet'#13'ShortTabSheet'#7'Caption'#6
+#13'ShortTabSheet'#12'ClientHeight'#2'V'#11'ClientWidth'#3#220#2#0#5'TEdit'#9
+'ShortEdit'#6'Height'#2#23#5'Width'#3#218#2#5'Align'#7#5'alTop'#19'BorderSpa'
+'cing.Right'#2#2#13'OnEditingDone'#7#22'DocumentationTagChange'#8'TabOrder'#2
+#0#4'Text'#6#9'ShortEdit'#0#0#7'TButton'#12'CreateButton'#21'AnchorSideTop.C'
+'ontrol'#7#9'ShortEdit'#18'AnchorSideTop.Side'#7#9'asrBottom'#4'Left'#2#6#6
+'Height'#2#29#3'Top'#2#29#5'Width'#2'b'#8'AutoSize'#9#20'BorderSpacing.Aroun'
+'d'#2#6#7'Caption'#6#12'CreateButton'#7'OnClick'#7#17'CreateButtonClick'#8'T'
+'abOrder'#2#1#0#0#7'TButton'#10'SaveButton'#22'AnchorSideLeft.Control'#7#12
+'CreateButton'#19'AnchorSideLeft.Side'#7#9'asrBottom'#21'AnchorSideTop.Contr'
+'ol'#7#12'CreateButton'#4'Left'#2'n'#6'Height'#2#29#3'Top'#2#29#5'Width'#2'W'
+#8'AutoSize'#9#18'BorderSpacing.Left'#2#6#7'Caption'#6#10'SaveButton'#7'OnCl'
+'ick'#7#15'SaveButtonClick'#8'TabOrder'#2#2#0#0#0#9'TTabSheet'#13'DescrTabSh'
+'eet'#7'Caption'#6#13'DescrTabSheet'#12'ClientHeight'#2'V'#11'ClientWidth'#3
+#220#2#0#5'TMemo'#9'DescrMemo'#6'Height'#2'R'#5'Width'#3#218#2#5'Align'#7#8
+'alClient'#19'BorderSpacing.Right'#2#2#20'BorderSpacing.Bottom'#2#4#13'Lines'
+'.Strings'#1#6#9'DescrMemo'#0#8'OnChange'#7#22'DocumentationTagChange'#8'Tab'
+'Order'#2#0#0#0#0#9'TTabSheet'#14'ErrorsTabSheet'#7'Caption'#6#14'ErrorsTabS'
+'heet'#12'ClientHeight'#2'V'#11'ClientWidth'#3#220#2#0#5'TMemo'#10'ErrorsMem'
+'o'#6'Height'#2'R'#5'Width'#3#218#2#5'Align'#7#8'alClient'#19'BorderSpacing.'
+'Right'#2#2#20'BorderSpacing.Bottom'#2#4#13'Lines.Strings'#1#6#10'ErrorsMemo'
+#0#8'OnChange'#7#22'DocumentationTagChange'#8'TabOrder'#2#0#0#0#0#9'TTabShee'
+'t'#15'SeeAlsoTabSheet'#7'Caption'#6#15'SeeAlsoTabSheet'#12'ClientHeight'#2
+'V'#11'ClientWidth'#3#220#2#0#8'TListBox'#11'LinkListBox'#21'AnchorSideTop.C'
+'ontrol'#7#13'AddLinkButton'#18'AnchorSideTop.Side'#7#9'asrBottom'#6'Height'
+#2'1'#3'Top'#2'!'#5'Width'#3#218#2#5'Align'#7#8'alBottom'#7'Anchors'#11#5'ak'
+'Top'#6'akLeft'#7'akRight'#8'akBottom'#0#17'BorderSpacing.Top'#2#4#19'Border'
+'Spacing.Right'#2#2#20'BorderSpacing.Bottom'#2#4#7'OnClick'#7#16'LinkListBox'
+'Click'#8'TabOrder'#2#0#8'TopIndex'#2#255#0#0#7'TButton'#13'AddLinkButton'#23
+'AnchorSideRight.Control'#7#16'DeleteLinkButton'#4'Left'#3#241#1#6'Height'#2
+#29#5'Width'#2'i'#7'Anchors'#11#5'akTop'#7'akRight'#0#8'AutoSize'#9#19'Borde'
+'rSpacing.Right'#2#6#7'Caption'#6#13'AddLinkButton'#7'OnClick'#7#18'AddLinkB'
+'uttonClick'#8'TabOrder'#2#1#0#0#7'TButton'#16'DeleteLinkButton'#23'AnchorSi'
+'deRight.Control'#7#15'SeeAlsoTabSheet'#20'AnchorSideRight.Side'#7#9'asrBott'
+'om'#4'Left'#3'`'#2#6'Height'#2#29#5'Width'#2'z'#7'Anchors'#11#5'akTop'#7'ak'
+'Right'#0#8'AutoSize'#9#19'BorderSpacing.Right'#2#2#7'Caption'#6#16'DeleteLi'
+'nkButton'#7'OnClick'#7#21'DeleteLinkButtonClick'#8'TabOrder'#2#2#0#0#5'TEdi'
+'t'#12'LinkTextEdit'#22'AnchorSideLeft.Control'#7#14'LinkIdComboBox'#19'Anch'
+'orSideLeft.Side'#7#9'asrBottom'#23'AnchorSideRight.Control'#7#13'AddLinkBut'
+'ton'#4'Left'#3#229#0#6'Height'#2#27#3'Top'#2#1#5'Width'#3#8#1#7'Anchors'#11
+#5'akTop'#6'akLeft'#7'akRight'#0#8'AutoSize'#9#18'BorderSpacing.Left'#2#4#19
+'BorderSpacing.Right'#2#4#8'OnChange'#7#10'LinkChange'#8'TabOrder'#2#3#4'Tex'
+'t'#6#12'LinkTextEdit'#0#0#9'TComboBox'#14'LinkIdComboBox'#6'Height'#2#27#3
+'Top'#2#1#5'Width'#3#225#0#16'AutoCompleteText'#11#22'cbactEndOfLineComplete'
+#20'cbactSearchAscending'#0#8'AutoSize'#9#9'MaxLength'#2#0#8'OnChange'#7#10
+'LinkChange'#8'TabOrder'#2#4#4'Text'#6#14'LinkIdComboBox'#0#0#0#9'TTabSheet'
+#15'ExampleTabSheet'#7'Caption'#6#15'ExampleTabSheet'#12'ClientHeight'#2'V'
+#11'ClientWidth'#3#220#2#0#5'TEdit'#11'ExampleEdit'#6'Height'#2#23#5'Width'#3
+#218#2#5'Align'#7#5'alTop'#19'BorderSpacing.Right'#2#2#8'OnChange'#7#22'Docu'
+'mentationTagChange'#8'TabOrder'#2#0#4'Text'#6#11'ExampleEdit'#0#0#7'TButton'
+#19'BrowseExampleButton'#23'AnchorSideRight.Control'#7#15'ExampleTabSheet'#20
+'AnchorSideRight.Side'#7#9'asrBottom'#4'Left'#3'P'#2#6'Height'#2#25#3'Top'#2
+#28#5'Width'#3#134#0#7'Anchors'#11#5'akTop'#7'akRight'#0#8'AutoSize'#9#19'Bo'
+'rderSpacing.Right'#2#2#7'Caption'#6#19'BrowseExampleButton'#7'OnClick'#7#24
+'BrowseExampleButtonClick'#8'TabOrder'#2#1#0#0#0#9'TTabSheet'#17'InheritedTa'
+'bSheet'#7'Caption'#6#17'InheritedTabSheet'#12'ClientHeight'#2'V'#11'ClientW'
+'idth'#3#220#2#0#6'TLabel'#19'InheritedShortLabel'#6'Height'#2#20#3'Top'#2#2
,#5'Width'#3#220#2#5'Align'#7#5'alTop'#17'BorderSpacing.Top'#2#2#7'Caption'#6
+#19'InheritedShortLabel'#11'ParentColor'#8#0#0#5'TEdit'#18'InheritedShortEdi'
+'t'#22'AnchorSideLeft.Control'#7#17'InheritedTabSheet'#21'AnchorSideTop.Cont'
+'rol'#7#19'InheritedShortLabel'#18'AnchorSideTop.Side'#7#9'asrBottom'#23'Anc'
+'horSideRight.Control'#7#17'InheritedTabSheet'#20'AnchorSideRight.Side'#7#9
+'asrBottom'#6'Height'#2#23#3'Top'#2#24#5'Width'#3#220#2#7'Anchors'#11#5'akTo'
+'p'#6'akLeft'#7'akRight'#0#17'BorderSpacing.Top'#2#2#8'ReadOnly'#9#8'TabOrde'
+'r'#2#0#4'Text'#6#18'InheritedShortEdit'#0#0#7'TButton'#21'MoveToInheritedBu'
+'tton'#6'Height'#2#29#3'Top'#2'6'#5'Width'#3#158#0#8'AutoSize'#9#7'Caption'#6
+#21'MoveToInheritedButton'#7'OnClick'#7#26'MoveToInheritedButtonClick'#8'Tab'
+'Order'#2#1#0#0#7'TButton'#23'CopyFromInheritedButton'#22'AnchorSideLeft.Con'
+'trol'#7#21'MoveToInheritedButton'#19'AnchorSideLeft.Side'#7#9'asrBottom'#21
+'AnchorSideTop.Control'#7#21'MoveToInheritedButton'#18'AnchorSideTop.Side'#7
+#9'asrCenter'#4'Left'#3#168#0#6'Height'#2#29#3'Top'#2'6'#5'Width'#3#175#0#8
+'AutoSize'#9#18'BorderSpacing.Left'#2#10#7'Caption'#6#23'CopyFromInheritedBu'
+'tton'#7'OnClick'#7#28'CopyFromInheritedButtonClick'#8'TabOrder'#2#2#0#0#0#0
+#6'TPanel'#6'Panel1'#6'Height'#2'u'#5'Width'#2#17#5'Align'#7#6'alLeft'#10'Be'
+'velOuter'#7#6'bvNone'#12'ClientHeight'#2'u'#11'ClientWidth'#2#17#11'FullRep'
+'aint'#8#14'ParentShowHint'#8#8'ShowHint'#9#8'TabOrder'#2#1#0#12'TSpeedButto'
+'n'#16'BoldFormatButton'#6'Height'#2#17#5'Width'#2#17#5'Align'#7#5'alTop'#5
+'Color'#7#9'clBtnFace'#10'Glyph.Data'#10#190#4#0#0#186#4#0#0'BM'#186#4#0#0#0
+#0#0#0'6'#0#0#0'('#0#0#0#17#0#0#0#17#0#0#0#1#0' '#0#0#0#0#0#132#4#0#0'd'#0#0
+#0'd'#0#0#0#0#0#0#0#0#0#0#0#0#255#255#0#219#152' '#0#0#14#165#0#243#165#13#0
+#0#0'g'#0#250#226'c'#0#0#255#0#0#0#0#0#0#0#255#255#0#255#255#0#0#0#0#0#0#221
+#255#255#0#0#2'|'#0#250#205'R'#0#0#0#0#0#0#0#0#0#136#4#0#0#0#0#0#0#0#0#0#0'h'
+#3#0#0#0'|'#167#0#5'9'#178#0#0#0#0#0#0#0#0#0#0#255#255#0#255#255#255#0#0'L'
+#218#0#221'W'#255#0#0#255#255#0#255#255#255#0#0#255#0#0#0#0#0#0#0#255#0#0#0#0
+#0#0#0#236'M'#0' '#161#255#0#0#138'v'#0#0#0#0#0#0#255#0#0#0#0#0#0#0#255#0#0#0
+#0#0#0#0#255#0#0'#p'#226#0#0#151#168#0#19#171#150#0#0'n'#204#0#4#29#151#0#0
+#255#0#0#0#0#0#0#0#0#0#0#0#0'd'#0#0#232#31#0#0'!'#231#0#0#222'-'#0#0#0#0#0#0
+#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#8#0#0#0#0#224#13#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#251#255#0#255#255#254#0#0#0#0#255
+#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#255
+#0#0#0#0#0#0#0#255#0#0#0#0#0#0#0#255#0#0#255#255#255#0#0#0#0#0'~'#0#0#0#0#255
+#0#0#0#0#0#0#0#0#0#255#0#0#0#255#0#0#0#255#0#0#23#0#0#252#3#0#0#0#0#255#0#0#0
+#255#0#0#0#255#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#231' '#0#0'!'#230#0#0#221
+'-'#0#0#0#0#0#0#255#255#0#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0
+#255#0#0#0#255#0#0#0#255#0#0#0#0#0#255#0#0#0#0#0#0#0'8'#194#0#0#0#0#0#0'}'
+#185#0#13#154#152#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0#255#0#0#0#255#0#8#246#0#0
+#0#0#0#0#0#0#255#0#0#0#255#0#0#0#255#0#255#0#0#4'0'#191#0#0#255#0#0#0#0#4#0#0
+#0#0#0#0'z'#133#0#0#255#0#0#0#0#0#0#0#255#0#0#0#0#0#255#0#0#0#255#0#0#0#255#0
+#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#242#161#11#0#0#0'd'#0#249#224'b'#0#0#255#0#0#0#0#0#0#0#0#0#255#0#0#0#255
+#0#0#0#255#0#0#0#0#0#3#133#0#0#0#0#255#0#0#0#255#0#0#0#255#0#255#0#0#0#0#0#0
+#0#0#163#0#7's'#189#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0#0#0#255#0#0
+#0#255#0#0#0#255#0#255#255#0#255#255#255#0#0#0#0#255#0#0#0#255#0#0#0#255#0#0
+#23#0#0#255#0#0#0#0'd'#0#0#12#163#0#0#0#0#0#0#255#0#0#0#0#0#0#0#255#0#0#5'0'
+#189#0#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0#255#0#0
+#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#0#255#255
+#255#0#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255
+#0#0#0#255#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0
+#255#255#255#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#0
+#255#255#255#0#0#255#255#0#251#222#136#0#0#255#255#0#218#151' '#0#0#0#0#0#0#0
+#2't'#13'ActiveControl'#7#9'DescrMemo'#7'Caption'#6#12'FPDoc editor'#12'Clie'
+'ntHeight'#2'u'#11'ClientWidth'#3#241#2#8'OnCreate'#7#10'FormCreate'#9'OnDes'
+'troy'#7#11'FormDestroy'#8'OnResize'#7#10'FormResize'#0#12'TPageControl'#11
+'PageControl'#4'Left'#2#17#6'Height'#2'u'#5'Width'#3#224#2#10'ActivePage'#7
+#13'DescrTabSheet'#5'Align'#7#8'alClient'#8'TabIndex'#2#1#8'TabOrder'#2#0#11
+'TabPosition'#7#8'tpBottom'#0#9'TTabSheet'#13'ShortTabSheet'#7'Caption'#6#13
+'ShortTabSheet'#12'ClientHeight'#2'V'#11'ClientWidth'#3#220#2#0#5'TEdit'#9'S'
+'hortEdit'#6'Height'#2#23#5'Width'#3#218#2#5'Align'#7#5'alTop'#19'BorderSpac'
+'ing.Right'#2#2#8'OnChange'#7#20'ShortEditEditingDone'#13'OnEditingDone'#7#20
+'ShortEditEditingDone'#8'TabOrder'#2#0#4'Text'#6#9'ShortEdit'#0#0#7'TButton'
+#12'CreateButton'#21'AnchorSideTop.Control'#7#9'ShortEdit'#18'AnchorSideTop.'
+'Side'#7#9'asrBottom'#4'Left'#2#6#6'Height'#2#29#3'Top'#2#29#5'Width'#2'b'#8
+'AutoSize'#9#20'BorderSpacing.Around'#2#6#7'Caption'#6#12'CreateButton'#7'On'
+'Click'#7#17'CreateButtonClick'#8'TabOrder'#2#1#0#0#7'TButton'#10'SaveButton'
+#22'AnchorSideLeft.Control'#7#12'CreateButton'#19'AnchorSideLeft.Side'#7#9'a'
+'srBottom'#21'AnchorSideTop.Control'#7#12'CreateButton'#4'Left'#2'n'#6'Heigh'
+'t'#2#29#3'Top'#2#29#5'Width'#2'W'#8'AutoSize'#9#18'BorderSpacing.Left'#2#6#7
+'Caption'#6#10'SaveButton'#7'OnClick'#7#15'SaveButtonClick'#8'TabOrder'#2#2#0
+#0#0#9'TTabSheet'#13'DescrTabSheet'#7'Caption'#6#13'DescrTabSheet'#12'Client'
+'Height'#2'V'#11'ClientWidth'#3#220#2#0#5'TMemo'#9'DescrMemo'#6'Height'#2'R'
+#5'Width'#3#218#2#5'Align'#7#8'alClient'#19'BorderSpacing.Right'#2#2#20'Bord'
+'erSpacing.Bottom'#2#4#13'Lines.Strings'#1#6#9'DescrMemo'#0#8'OnChange'#7#15
+'DescrMemoChange'#8'TabOrder'#2#0#0#0#0#9'TTabSheet'#14'ErrorsTabSheet'#7'Ca'
+'ption'#6#14'ErrorsTabSheet'#12'ClientHeight'#2'V'#11'ClientWidth'#3#220#2#0
+#5'TMemo'#10'ErrorsMemo'#6'Height'#2'R'#5'Width'#3#218#2#5'Align'#7#8'alClie'
+'nt'#19'BorderSpacing.Right'#2#2#20'BorderSpacing.Bottom'#2#4#13'Lines.Strin'
+'gs'#1#6#10'ErrorsMemo'#0#8'OnChange'#7#16'ErrorsMemoChange'#8'TabOrder'#2#0
+#0#0#0#9'TTabSheet'#15'SeeAlsoTabSheet'#7'Caption'#6#15'SeeAlsoTabSheet'#12
+'ClientHeight'#2'V'#11'ClientWidth'#3#220#2#0#8'TListBox'#11'LinkListBox'#21
+'AnchorSideTop.Control'#7#13'AddLinkButton'#18'AnchorSideTop.Side'#7#9'asrBo'
+'ttom'#6'Height'#2'1'#3'Top'#2'!'#5'Width'#3#218#2#5'Align'#7#8'alBottom'#7
+'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#8'akBottom'#0#17'BorderSpacing.To'
+'p'#2#4#19'BorderSpacing.Right'#2#2#20'BorderSpacing.Bottom'#2#4#7'OnClick'#7
+#16'LinkListBoxClick'#8'TabOrder'#2#0#8'TopIndex'#2#255#0#0#7'TButton'#13'Ad'
+'dLinkButton'#23'AnchorSideRight.Control'#7#16'DeleteLinkButton'#4'Left'#3
+#241#1#6'Height'#2#29#5'Width'#2'i'#7'Anchors'#11#5'akTop'#7'akRight'#0#8'Au'
+'toSize'#9#19'BorderSpacing.Right'#2#6#7'Caption'#6#13'AddLinkButton'#7'OnCl'
+'ick'#7#18'AddLinkButtonClick'#8'TabOrder'#2#1#0#0#7'TButton'#16'DeleteLinkB'
+'utton'#23'AnchorSideRight.Control'#7#15'SeeAlsoTabSheet'#20'AnchorSideRight'
+'.Side'#7#9'asrBottom'#4'Left'#3'`'#2#6'Height'#2#29#5'Width'#2'z'#7'Anchors'
+#11#5'akTop'#7'akRight'#0#8'AutoSize'#9#19'BorderSpacing.Right'#2#2#7'Captio'
+'n'#6#16'DeleteLinkButton'#7'OnClick'#7#21'DeleteLinkButtonClick'#8'TabOrder'
+#2#2#0#0#5'TEdit'#12'LinkTextEdit'#22'AnchorSideLeft.Control'#7#14'LinkIdCom'
+'boBox'#19'AnchorSideLeft.Side'#7#9'asrBottom'#23'AnchorSideRight.Control'#7
+#13'AddLinkButton'#4'Left'#3#229#0#6'Height'#2#27#3'Top'#2#1#5'Width'#3#8#1#7
+'Anchors'#11#5'akTop'#6'akLeft'#7'akRight'#0#8'AutoSize'#9#18'BorderSpacing.'
+'Left'#2#4#19'BorderSpacing.Right'#2#4#8'OnChange'#7#10'LinkChange'#8'TabOrd'
+'er'#2#3#4'Text'#6#12'LinkTextEdit'#0#0#9'TComboBox'#14'LinkIdComboBox'#6'He'
+'ight'#2#27#3'Top'#2#1#5'Width'#3#225#0#16'AutoCompleteText'#11#22'cbactEndO'
+'fLineComplete'#20'cbactSearchAscending'#0#8'AutoSize'#9#9'MaxLength'#2#0#8
+'OnChange'#7#10'LinkChange'#8'TabOrder'#2#4#4'Text'#6#14'LinkIdComboBox'#0#0
+#0#9'TTabSheet'#15'ExampleTabSheet'#7'Caption'#6#15'ExampleTabSheet'#12'Clie'
+'ntHeight'#2'V'#11'ClientWidth'#3#220#2#0#5'TEdit'#11'ExampleEdit'#6'Height'
+#2#23#5'Width'#3#218#2#5'Align'#7#5'alTop'#19'BorderSpacing.Right'#2#2#8'OnC'
+'hange'#7#17'ExampleEditChange'#8'TabOrder'#2#0#4'Text'#6#11'ExampleEdit'#0#0
+#7'TButton'#19'BrowseExampleButton'#23'AnchorSideRight.Control'#7#15'Example'
+'TabSheet'#20'AnchorSideRight.Side'#7#9'asrBottom'#4'Left'#3'>'#2#6'Height'#2
+#29#3'Top'#2#28#5'Width'#3#156#0#7'Anchors'#11#5'akTop'#7'akRight'#0#8'AutoS'
+'ize'#9#19'BorderSpacing.Right'#2#2#7'Caption'#6#19'BrowseExampleButton'#7'O'
+'nClick'#7#24'BrowseExampleButtonClick'#8'TabOrder'#2#1#0#0#0#9'TTabSheet'#17
+'InheritedTabSheet'#7'Caption'#6#17'InheritedTabSheet'#12'ClientHeight'#2'V'
+#11'ClientWidth'#3#220#2#0#6'TLabel'#19'InheritedShortLabel'#6'Height'#2#20#3
,'Top'#2#2#5'Width'#3#220#2#5'Align'#7#5'alTop'#17'BorderSpacing.Top'#2#2#7'C'
+'aption'#6#19'InheritedShortLabel'#11'ParentColor'#8#0#0#5'TEdit'#18'Inherit'
+'edShortEdit'#22'AnchorSideLeft.Control'#7#17'InheritedTabSheet'#21'AnchorSi'
+'deTop.Control'#7#19'InheritedShortLabel'#18'AnchorSideTop.Side'#7#9'asrBott'
+'om'#23'AnchorSideRight.Control'#7#17'InheritedTabSheet'#20'AnchorSideRight.'
+'Side'#7#9'asrBottom'#6'Height'#2#23#3'Top'#2#24#5'Width'#3#220#2#7'Anchors'
+#11#5'akTop'#6'akLeft'#7'akRight'#0#17'BorderSpacing.Top'#2#2#8'ReadOnly'#9#8
+'TabOrder'#2#0#4'Text'#6#18'InheritedShortEdit'#0#0#7'TButton'#21'MoveToInhe'
+'ritedButton'#6'Height'#2#29#3'Top'#2'6'#5'Width'#3#158#0#8'AutoSize'#9#7'Ca'
+'ption'#6#21'MoveToInheritedButton'#7'OnClick'#7#26'MoveToInheritedButtonCli'
+'ck'#8'TabOrder'#2#1#0#0#7'TButton'#23'CopyFromInheritedButton'#22'AnchorSid'
+'eLeft.Control'#7#21'MoveToInheritedButton'#19'AnchorSideLeft.Side'#7#9'asrB'
+'ottom'#21'AnchorSideTop.Control'#7#21'MoveToInheritedButton'#18'AnchorSideT'
+'op.Side'#7#9'asrCenter'#4'Left'#3#168#0#6'Height'#2#29#3'Top'#2'6'#5'Width'
+#3#175#0#8'AutoSize'#9#18'BorderSpacing.Left'#2#10#7'Caption'#6#23'CopyFromI'
+'nheritedButton'#7'OnClick'#7#28'CopyFromInheritedButtonClick'#8'TabOrder'#2
+#2#0#0#0#0#6'TPanel'#6'Panel1'#6'Height'#2'u'#5'Width'#2#17#5'Align'#7#6'alL'
+'eft'#10'BevelOuter'#7#6'bvNone'#12'ClientHeight'#2'u'#11'ClientWidth'#2#17
+#11'FullRepaint'#8#14'ParentShowHint'#8#8'ShowHint'#9#8'TabOrder'#2#1#0#12'T'
+'SpeedButton'#16'BoldFormatButton'#6'Height'#2#17#5'Width'#2#17#5'Align'#7#5
+'alTop'#5'Color'#7#9'clBtnFace'#10'Glyph.Data'#10#190#4#0#0#186#4#0#0'BM'#186
+#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#17#0#0#0#17#0#0#0#1#0' '#0#0#0#0#0#132#4#0#0
+'d'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#0#255#255#0#219#152' '#0#0#14#165#0#243
+#165#13#0#0#0'g'#0#250#226'c'#0#0#255#0#0#0#0#0#0#0#255#255#0#255#255#0#0#0#0
+#0#0#221#255#255#0#0#2'|'#0#250#205'R'#0#0#0#0#0#0#0#0#0#136#4#0#0#0#0#0#0#0
+#0#0#0'h'#3#0#0#0'|'#167#0#5'9'#178#0#0#0#0#0#0#0#0#0#0#255#255#0#255#255#255
+#0#0'L'#218#0#221'W'#255#0#0#255#255#0#255#255#255#0#0#255#0#0#0#0#0#0#0#255
+#0#0#0#0#0#0#0#236'M'#0' '#161#255#0#0#138'v'#0#0#0#0#0#0#255#0#0#0#0#0#0#0
+#255#0#0#0#0#0#0#0#255#0#0'#p'#226#0#0#151#168#0#19#171#150#0#0'n'#204#0#4#29
+#151#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0'd'#0#0#232#31#0#0'!'#231#0#0#222'-'#0#0
+#0#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#8#0#0#0#0#224#13#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#251#255#0#255#255#254#0#0
+#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0
+#255#0#255#0#0#0#0#0#0#0#255#0#0#0#0#0#0#0#255#0#0#255#255#255#0#0#0#0#0'~'#0
+#0#0#0#255#0#0#0#0#0#0#0#0#0#255#0#0#0#255#0#0#0#255#0#0#23#0#0#252#3#0#0#0#0
+#255#0#0#0#255#0#0#0#255#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#231' '#0#0'!'
+#230#0#0#221'-'#0#0#0#0#0#0#255#255#0#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#0#0
+#0#0#0#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#0#0#255#0#0#0#0#0#0#0'8'#194#0#0#0
+#0#0#0'}'#185#0#13#154#152#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0#255#0#0#0#255#0
+#8#246#0#0#0#0#0#0#0#0#255#0#0#0#255#0#0#0#255#0#255#0#0#4'0'#191#0#0#255#0#0
+#0#0#4#0#0#0#0#0#0'z'#133#0#0#255#0#0#0#0#0#0#0#255#0#0#0#0#0#255#0#0#0#255#0
+#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#255#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#242#161#11#0#0#0'd'#0#249#224'b'#0#0#255#0#0#0#0#0#0#0#0#0#255
+#0#0#0#255#0#0#0#255#0#0#0#0#0#3#133#0#0#0#0#255#0#0#0#255#0#0#0#255#0#255#0
+#0#0#0#0#0#0#0#163#0#7's'#189#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0#0
+#0#255#0#0#0#255#0#0#0#255#0#255#255#0#255#255#255#0#0#0#0#255#0#0#0#255#0#0
+#0#255#0#0#23#0#0#255#0#0#0#0'd'#0#0#12#163#0#0#0#0#0#0#255#0#0#0#0#0#0#0#255
+#0#0#5'0'#189#0#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#255#0#0#0
+#255#0#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#0
+#255#255#255#0#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0
+#0#0#255#0#0#0#255#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255
+#255#0#255#255#255#0#0#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255
+#255#0#255#255#255#0#0#255#255#0#251#222#136#0#0#255#255#0#218#151' '#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#184#163#18#0#152#28#241
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#9'NumGlyphs'#2#0#7'OnClick'#7
+#17'FormatButtonClick'#0#0#12'TSpeedButton'#18'ItalicFormatButton'#3'Tag'#2#1
+#6'Height'#2#17#3'Top'#2#17#5'Width'#2#17#5'Align'#7#5'alTop'#5'Color'#7#9'c'
+'lBtnFace'#10'Glyph.Data'#10#190#4#0#0#186#4#0#0'BM'#186#4#0#0#0#0#0#0'6'#0#0
+#0'('#0#0#0#17#0#0#0#17#0#0#0#1#0' '#0#0#0#0#0#132#4#0#0'd'#0#0#0'd'#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#25#0#0#0#0#0#0#0'd'#253'F'#0#0#0#1#0#239#239
,#136#0#255#255#255#0#0#0#0#0#4#0#0#0#0#4#0#0#1#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#136#4#0#0#197'}N'#0#8#4#0#0#128#0#0#0#1#0#24#0#230#2#224#0#0#0#0#0
+#16#0#16#0#152'N$'#0'H'#129'j'#0#0#0#0#0'@'#0#0#0#136#228'D'#0#244#167#18#0#0
+#0#0#0#0#0#0#0#0#0#0#0#8#168#18#0#251#224#201#0#197'}N'#0' '#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#212'l'#187#0#0#0'h'#0#26#26#198#0#0#0#0#0#0#0#156#0#197'}N'#0
+#197'}N'#0#197'}N'#0#197'}N'#0#197'}N'#0#197'}N'#0#252#226#206#0#251#224#201
+#0#197'}N'#0#255#0#0#0#0#0#0#0'O'#7'"'#0#174#133'j'#0#181#142'v'#0#188#153
+#129#0#195#162#142#0#211#139'h'#0#225#143'p'#0#195'}C'#0#251#224#201#0#251
+#224#201#0#251#224#201#0#251#224#201#0#228#157'X'#0#228#157'X'#0#250#223#199
+#0#197'}N'#0#162#0#0#0#0#0#0#0#164'uV'#0#171'c'#0#177#137'o'#0#198#131'U'#0
+#239#206#186#0#221#255#255#0#135#238#199#0#228#174'z'#0#228#157'X'#0#229#157
+'\'#0#228#174'z'#0#228#157'X'#0#228#174'z'#0#250#223#199#0#246#218#189#0#0#0
+#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#195'Q'#0#239#182
+#154#0#234#243#232#0#228#157'X'#0#228#157'X'#0#254#232#214#0#253#231#214#0
+#252#227#207#0#252#228#207#0#250#225#202#0#246#217#188#0#247#242#236#0#197'}'
+'N'#0#0#0#0#255#0#0#0#255#175#150#150#255#164'tV'#0#170'~b'#0#177#137'n'#0
+#234#182#151#0#243#243#234#0#237#241#230#0#228#174'z'#0#228#157'X'#0#197'}N'
+#0#250#224#199#0#251#226#201#0#249#223#197#0#244#214#184#0#246#216#180#0#175
+#150#150#255#0#0#0#255#0#0#0#255#154'eB'#0#160'oO'#0#167'y\'#0#201#139'a'#0
+#230#181#146#0#226#167#129#0#225#167#129#0#197'}N'#0#254#252#251#0#197'}N'#0
+#197'}N'#0#197'}N'#0#197'}N'#0#197'}N'#0#197'}N'#0#0#0#0#255#0#0#0#255#175
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#184#163#18#0#152
+#28#241#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#9'NumGlyphs'#2#0#7'OnCl'
+'ick'#7#17'FormatButtonClick'#0#0#12'TSpeedButton'#18'ItalicFormatButton'#3
+'Tag'#2#1#6'Height'#2#17#3'Top'#2#17#5'Width'#2#17#5'Align'#7#5'alTop'#5'Col'
+'or'#7#9'clBtnFace'#10'Glyph.Data'#10#190#4#0#0#186#4#0#0'BM'#186#4#0#0#0#0#0
+#0'6'#0#0#0'('#0#0#0#17#0#0#0#17#0#0#0#1#0' '#0#0#0#0#0#132#4#0#0'd'#0#0#0'd'
+#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#25#0#0#0#0#0#0#0'd'#253'F'#0#0#0#1#0
,#239#239#136#0#255#255#255#0#0#0#0#0#4#0#0#0#0#4#0#0#1#0#0#0#0#0#0#0#0#0#0#0
+#0#0#0#0#0#0#0#0#136#4#0#0#197'}N'#0#8#4#0#0#128#0#0#0#1#0#24#0#230#2#224#0#0
+#0#0#0#16#0#16#0#152'N$'#0'H'#129'j'#0#0#0#0#0'@'#0#0#0#136#228'D'#0#244#167
+#18#0#0#0#0#0#0#0#0#0#0#0#0#0#8#168#18#0#251#224#201#0#197'}N'#0' '#0#0#0#0#0
+#0#0#0#0#0#0#0#0#0#0#212'l'#187#0#0#0'h'#0#26#26#198#0#0#0#0#0#0#0#156#0#197
+'}N'#0#197'}N'#0#197'}N'#0#197'}N'#0#197'}N'#0#197'}N'#0#252#226#206#0#251
+#224#201#0#197'}N'#0#255#0#0#0#0#0#0#0'O'#7'"'#0#174#133'j'#0#181#142'v'#0
+#188#153#129#0#195#162#142#0#211#139'h'#0#225#143'p'#0#195'}C'#0#251#224#201
+#0#251#224#201#0#251#224#201#0#251#224#201#0#228#157'X'#0#228#157'X'#0#250
+#223#199#0#197'}N'#0#162#0#0#0#0#0#0#0#164'uV'#0#171'c'#0#177#137'o'#0#198
+#131'U'#0#239#206#186#0#221#255#255#0#135#238#199#0#228#174'z'#0#228#157'X'#0
+#229#157'\'#0#228#174'z'#0#228#157'X'#0#228#174'z'#0#250#223#199#0#246#218
+#189#0#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#0#0#0#255#195'Q'#0
+#239#182#154#0#234#243#232#0#228#157'X'#0#228#157'X'#0#254#232#214#0#253#231
+#214#0#252#227#207#0#252#228#207#0#250#225#202#0#246#217#188#0#247#242#236#0
+#197'}N'#0#0#0#0#255#0#0#0#255#175#150#150#255#164'tV'#0#170'~b'#0#177#137'n'
+#0#234#182#151#0#243#243#234#0#237#241#230#0#228#174'z'#0#228#157'X'#0#197'}'
+'N'#0#250#224#199#0#251#226#201#0#249#223#197#0#244#214#184#0#246#216#180#0
+#175#150#150#255#0#0#0#255#0#0#0#255#154'eB'#0#160'oO'#0#167'y\'#0#201#139'a'
+#0#230#181#146#0#226#167#129#0#225#167#129#0#197'}N'#0#254#252#251#0#197'}N'
+#0#197'}N'#0#197'}N'#0#197'}N'#0#197'}N'#0#197'}N'#0#0#0#0#255#0#0#0#255#175
+#150#150#255#150'_<'#0#157'jH'#0#224#187#155#0#202#141'e'#0#234#184#153#0#221
+#165'~'#0#221#166#128#0#208#169#140#0#204#147'n'#0#255#255#255#0#255#255#255
+#0#255#251#247#0#255#248#241#0#228#175#140#0#175#150#150#255#0#0#0#255#0#0#0

View File

@ -96,7 +96,9 @@ type
procedure CopyFromInheritedButtonClick(Sender: TObject);
procedure CreateButtonClick(Sender: TObject);
procedure DeleteLinkButtonClick(Sender: TObject);
procedure DocumentationTagChange(Sender: TObject);
procedure DescrMemoChange(Sender: TObject);
procedure ErrorsMemoChange(Sender: TObject);
procedure ExampleEditChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormResize(Sender: TObject);
@ -106,6 +108,7 @@ type
procedure ApplicationIdle(Sender: TObject; var Done: Boolean);
procedure MoveToInheritedButtonClick(Sender: TObject);
procedure SaveButtonClick(Sender: TObject);
procedure ShortEditEditingDone(Sender: TObject);
private
FCaretXY: TPoint;
FModified: Boolean;
@ -114,6 +117,7 @@ type
fSourceFilename: string;
fChain: TCodeHelpElementChain;
FOldValues: TFPDocElementValues;
FOldVisualValues: TFPDocElementValues;
function GetDoc: TXMLdocument;
function GetDocFile: TLazFPDocFile;
function GetSourceFilename: string;
@ -426,6 +430,12 @@ begin
Save;
end;
procedure TFPDocEditor.ShortEditEditingDone(Sender: TObject);
begin
if ShortEdit.Text<>FOldVisualValues[fpdiShort] then
Modified:=true;
end;
function TFPDocEditor.GetContextTitle(Element: TCodeHelpElement): string;
// get codetools path. for example: TButton.Align
begin
@ -619,24 +629,31 @@ begin
if EnabledState then
begin
FOldValues:=Element.FPDocFile.GetValuesFromNode(Element.ElementNode);
ShortEdit.Text := ConvertLineEndings(FOldValues[fpdiShort]);
DescrMemo.Lines.Text := ConvertLineEndings(FOldValues[fpdiDescription]);
ErrorsMemo.Lines.Text := ConvertLineEndings(FOldValues[fpdiErrors]);
LinkListBox.Items.Text := ConvertLineEndings(FOldValues[fpdiSeeAlso]);
FOldVisualValues[fpdiShort]:=ReplaceLineEndings(FOldValues[fpdiShort],'');
FOldVisualValues[fpdiDescription]:=ConvertLineEndings(FOldValues[fpdiDescription]);
FOldVisualValues[fpdiErrors]:=ConvertLineEndings(FOldValues[fpdiErrors]);
FOldVisualValues[fpdiSeeAlso]:=ConvertLineEndings(FOldValues[fpdiSeeAlso]);
FOldVisualValues[fpdiExample]:=ConvertLineEndings(FOldValues[fpdiExample]);
DebugLn(['TFPDocEditor.LoadGUIValues Short="',dbgstr(FOldValues[fpdiShort]),'"']);
LinkListBox.Items.Text := FOldVisualValues[fpdiSeeAlso];
LinkIdComboBox.Text := '';
LinkTextEdit.Clear;
ExampleEdit.Text := ConvertLineEndings(FOldValues[fpdiExample]);
end
else
begin
ShortEdit.Text := lisCodeHelpNoDocumentation;
DescrMemo.Lines.Text := lisCodeHelpNoDocumentation;
ErrorsMemo.Lines.Text := lisCodeHelpNoDocumentation;
FOldVisualValues[fpdiShort]:=lisCodeHelpNoDocumentation;
FOldVisualValues[fpdiDescription]:=lisCodeHelpNoDocumentation;
FOldVisualValues[fpdiErrors]:=lisCodeHelpNoDocumentation;
FOldVisualValues[fpdiSeeAlso]:=lisCodeHelpNoDocumentation;
FOldVisualValues[fpdiExample]:=lisCodeHelpNoDocumentation;
LinkIdComboBox.Text := lisCodeHelpNoDocumentation;
LinkTextEdit.Text := lisCodeHelpNoDocumentation;
LinkListBox.Clear;
ExampleEdit.Text := lisCodeHelpNoDocumentation;
end;
ShortEdit.Text := FOldVisualValues[fpdiShort];
DescrMemo.Lines.Text := FOldVisualValues[fpdiDescription];
ErrorsMemo.Lines.Text := FOldVisualValues[fpdiErrors];
ExampleEdit.Text := FOldVisualValues[fpdiExample];
ShortEdit.Enabled := EnabledState;
DescrMemo.Enabled := EnabledState;
@ -929,9 +946,16 @@ begin
Result:=true;
end;
procedure TFPDocEditor.DocumentationTagChange(Sender: TObject);
procedure TFPDocEditor.ErrorsMemoChange(Sender: TObject);
begin
Modified := True;
if ErrorsMemo.Text<>FOldVisualValues[fpdiErrors] then
Modified:=true;
end;
procedure TFPDocEditor.ExampleEditChange(Sender: TObject);
begin
if ExampleEdit.Text<>FOldVisualValues[fpdiExample] then
Modified:=true;
end;
function TFPDocEditor.MakeLink: String;
@ -1012,6 +1036,12 @@ begin
end;
end;
procedure TFPDocEditor.DescrMemoChange(Sender: TObject);
begin
if DescrMemo.Text<>FOldVisualValues[fpdiDescription] then
Modified:=true;
end;
initialization
{$I fpdoceditwindow.lrs}