mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-11-04 15:49:32 +01:00 
			
		
		
		
	IDE: improved xml parser to keep TDomText nodes
git-svn-id: trunk@13928 -
This commit is contained in:
		
							parent
							
								
									7901ce1c95
								
							
						
					
					
						commit
						1802d34238
					
				@ -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);
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										204
									
								
								ide/codehelp.pas
									
									
									
									
									
								
							
							
						
						
									
										204
									
								
								ide/codehelp.pas
									
									
									
									
									
								
							@ -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;
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user