Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > SynUniHighlighter and SynEdit (English Language) > SynUniHighlighter + SynMix: SynTokenMatch??


Автор: MechMac 22.10.2006, 23:00
Hello!

First of all: I`m from Germany, my English is bad and i don`t speak any word russian.  smile 

I use the modified version of SynEdit V2.03 (SynMix) with CodeFolding. For SynMix i have to use the SynUniHighlighter instead of the internal Highlighters. This all works good, but how can i use TokenMatching:  IF..ENDIF or DO..ENDDO or (..).
I have a component "SynTokenMatch", but it doesn`t work together with the SynUniHighlighter. The Demo-exe, which can be downloaded on the SynMix page is using TokenMatching, too.

Is there a easy way to implemet such a function, or can i use a modified version of SynTokenMatch, or something else?

Greetings, MechMac

Автор: _was_ 23.10.2006, 01:04
Can be this???   smile 

Код


uses ... SynEditTypes...;
...
...
...

var
  PrevPos1, PrevPos2: TBufferCoord; 
const
  BracketSet = ['{', '[', '(', '}', ']', ')', '<', '>'];
  OpenChars: array[0..3] of Char = ('{', '[', '(', '<');
  CloseChars: array[0..3] of Char = ('}', ']', ')', '>');
  BgColorHighlight = clAqua;
  FgColorHighlight = $FFFFFF - BgColorHighlight; 
  needHighlightBrackets = True;
implementation

{$R *.dfm}
//-------------------------------------


function GetOppositeBracket(C: Char): Char;
var
  i: integer;
begin
  Result := #0;
  for i := 0 to High(OpenChars) do
    if C = OpenChars[i] then begin
      Result := CloseChars[i];
      Exit;
    end;
  for i := 0 to High(CloseChars) do
    if C = CloseChars[i] then begin
      Result := OpenChars[i];
      Exit;
    end;
end;
procedure TForm1.SynEditPaintTransient(Sender: TObject; Canvas: TCanvas;
  TransientType: TTransientType);
var
  Pos1, Pos2: TBufferCoord;
  P1, P2: TPoint; 
  Token: string;
  Bracket1, Bracket2: Char;
  Attri: TSynHighlighterAttributes; 
  Rect1, Rect2: TRect;
begin
  if (not needHighlightBrackets) or (SynEdit.Highlighter = nil) then
    Exit;
  Pos1 := SynEdit.CaretXY;
  SynEdit.GetHighlighterAttriAtRowCol(Pos1, Token, Attri);
  Pos2 := SynEdit.GetMatchingBracketEx(Pos1); 
  if (Pos1.char > 1) and (Pos2.char = 0) then begin
    Dec(Pos1.char); 
    SynEdit.GetHighlighterAttriAtRowCol(Pos1, Token, Attri);
    Pos2 := SynEdit.GetMatchingBracketEx(Pos1);
  end;
  if (PrevPos1.char <> Pos1.char) or (PrevPos1.line <> Pos1.line) or
     (PrevPos2.char <> Pos2.char) or (PrevPos2.line <> Pos2.line) then
  begin 
    SynEdit.InvalidateLine(PrevPos1.line);
    PrevPos1 := Pos1;
    SynEdit.InvalidateLine(PrevPos2.line);
    PrevPos2 := Pos2;
  end;
  
  if ((Pos2.char = 0) and (Pos2.line = 0)) or SynEdit.SelAvail or 
    (Length(Token) <> 1) then
      Exit;
  Bracket1 := Token[1];
  if Bracket1 in BracketSet then begin
    Bracket2 := GetOppositeBracket(Bracket1);
    P1 := SynEdit.RowColumnToPixels(SynEdit.BufferToDisplayPos(Pos1));
    P2 := SynEdit.RowColumnToPixels(SynEdit.BufferToDisplayPos(Pos2));

    with Canvas do begin 
      Font.Assign(SynEdit.Font);
      Font.Style := Attri.Style;
      Font.Color := FgColorHighlight;
      Brush.Color := BgColorHighlight;
    end;
    Rect1.Top := P1.Y;
    Rect1.Left := P1.X;
    Rect1.Bottom := Rect1.Top + Canvas.TextHeight(Bracket1);
    Rect1.Right := Rect1.Left + Canvas.TextWidth(Bracket1);
    Canvas.FillRect(Rect1);
    Canvas.TextOut(P1.X, P1.Y, Bracket1);
    Rect2.Top := P2.Y;
    Rect2.Left := P2.X;
    Rect2.Bottom := Rect2.Top + Canvas.TextHeight(Bracket2);
    Rect2.Right := Rect2.Left + Canvas.TextWidth(Bracket2);
    Canvas.FillRect(Rect2);
    Canvas.TextOut(P2.X, P2.Y, Bracket2);
  end;
end;
//----------------------------------------------------


procedure TForm1.FormCreate(Sender: TObject);
var
  SynKeyList: TSynKeyList;
  SynRange: TSynRange;
begin
 SynUni := TSynUniSyn.Create(Self);

  //---------------Brackets---------------
  SynKeyList := TSynKeyList.Create('');
  SynKeyList.Name := 'Brackets';
  SynKeyList.KeyList.Add('{');
  SynKeyList.KeyList.Add('}');
  SynKeyList.KeyList.Add('<');
  SynKeyList.KeyList.Add('>');
  SynKeyList.KeyList.Add('(');
  SynKeyList.KeyList.Add(')');
  SynKeyList.KeyList.Add('[');
  SynKeyList.KeyList.Add(']');

  SynKeyList.Attributes.Foreground := clBlack;
  SynKeyList.Attributes.Background := clWhite;
  SynUni.MainRules.AddKeyList(SynKeyList);



  SynEdit.Highlighter := SynUni;
end;




Автор: MechMac 23.10.2006, 17:22
Thanx, it works great!!  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)