Browse Source

+ added B tab for functions and vars for break/watch
TBrowserWindow also stores the symbol itself for break/watchpoints

pierre 26 years ago
parent
commit
ce1f8d84c2
1 changed files with 86 additions and 13 deletions
  1. 86 13
      ide/text/fpsymbol.pas

+ 86 - 13
ide/text/fpsymbol.pas

@@ -26,7 +26,8 @@ const
       btScope       = 1;
       btReferences  = 2;
       btInheritance = 4;
-
+      btBreakWatch  = 8;
+      
 type
     PSymbolView = ^TSymbolView;
     TSymbolView = object(TListBox)
@@ -74,7 +75,7 @@ type
 
     PBrowserWindow = ^TBrowserWindow;
     TBrowserWindow = object(TFPWindow)
-      constructor Init(var Bounds: TRect; ATitle: TTitleStr; ANumber: Sw_Integer;
+      constructor Init(var Bounds: TRect; ATitle: TTitleStr; ANumber: Sw_Integer;ASym : PSymbol;
                     const AName: string; ASymbols: PSymbolCollection; AReferences: PReferenceCollection);
       procedure   HandleEvent(var Event: TEvent); virtual;
       procedure   SetState(AState: Word; Enable: Boolean); virtual;
@@ -83,11 +84,12 @@ type
       function    GetPalette: PPalette; virtual;
     private
       PageTab       : PBrowserTab;
+      Sym           : PSymbol;
       ScopeView     : PSymbolScopeView;
       ReferenceView : PSymbolReferenceView;
     end;
 
-procedure OpenSymbolBrowser(X,Y: Sw_integer;const Name,Line: string;
+procedure OpenSymbolBrowser(X,Y: Sw_integer;const Name,Line: string;S : PSymbol;
             Symbols: PSymbolCollection; References: PReferenceCollection);
 
 function IsSymbolInfoAvailable: boolean;
@@ -97,7 +99,7 @@ procedure OpenOneSymbolBrowser(Name : String);
 implementation
 
 uses Commands,App,
-     WEditor,
+     WEditor,FPDebug,
      FPConst,FPUtils,FPVars;
 
 function IsSymbolInfoAvailable: boolean;
@@ -123,7 +125,7 @@ begin
        PS:=BrowCol.Modules^.FirstThat(@Search);
        If assigned(PS) then
          OpenSymbolBrowser(0,20,
-                PS^.Items^.At(Index)^.GetName,'',
+                PS^.Items^.At(Index)^.GetName,'',PS^.Items^.At(Index),
                 PS^.Items^.At(Index)^.Items,PS^.Items^.At(Index)^.References)
        else
          begin
@@ -482,12 +484,12 @@ var B: TDrawBuffer;
     SelColor, NormColor, C: word;
     I,CurX,Count: Sw_integer;
 const
-    Names: string[3] = 'SRI';
+    Names: string[4] = 'SRIB';
 begin
   NormColor:=GetColor(1); SelColor:=GetColor(2);
   MoveChar(B,'Ä',SelColor,Size.X);
   CurX:=0; Count:=0;
-  for I:=0 to 2 do
+  for I:=0 to 3 do
     if (Flags and (1 shl I))<>0 then
     begin
       Inc(Count);
@@ -509,7 +511,7 @@ begin
   GetPalette:=@P;
 end;
 
-constructor TBrowserWindow.Init(var Bounds: TRect; ATitle: TTitleStr; ANumber: Sw_Integer;
+constructor TBrowserWindow.Init(var Bounds: TRect; ATitle: TTitleStr; ANumber: Sw_Integer;ASym : PSymbol;
              const AName: string; ASymbols: PSymbolCollection; AReferences: PReferenceCollection);
 var R: TRect;
     ST: PStaticText;
@@ -518,6 +520,7 @@ function CreateVSB(R: TRect): PScrollBar;
 var R2: TRect;
     SB: PScrollBar;
 begin
+  Sym:=ASym;
   R2.Copy(R); R2.Move(1,0); R2.A.X:=R2.B.X-1;
   New(SB, Init(R2)); SB^.GrowMode:=gfGrowLoX+gfGrowHiX+gfGrowHiY;
   CreateVSB:=SB;
@@ -587,7 +590,7 @@ begin
               if (S^.GetReferenceCount>0) or (S^.GetItemCount>0) then
               OpenSymbolBrowser(Origin.X-1,P.Y,
                 S^.GetName,
-                ScopeView^.GetText(ScopeView^.Focused,255),
+                ScopeView^.GetText(ScopeView^.Focused,255),S,
                 S^.Items,S^.References);
             end;
       end;
@@ -597,6 +600,8 @@ begin
         case Event.KeyCode of
           kbEsc :
             Close;
+          kbCtrlB :
+            SelectTab(btBreakWatch);
           kbCtrlS :
             SelectTab(btScope);
           kbCtrlR :
@@ -627,6 +632,9 @@ end;
 
 procedure TBrowserWindow.SelectTab(BrowserTab: Sw_integer);
 var Tabs: Sw_integer;
+    PB : PBreakpoint;
+    PS :PString;
+    l : longint;
 begin
   case BrowserTab of
     btScope :
@@ -635,16 +643,77 @@ begin
     btReferences :
       if assigned(ReferenceView) then
         ReferenceView^.Select;
+    btBreakWatch :
+      begin
+        if Assigned(Sym) then
+          begin
+            if Pos('proc',Sym^.GetText)>0 then
+          { insert function breakpoint }
+            begin
+               { make it visible }
+               PS:=Sym^.Name;
+               l:=Length(PS^);
+               If PS^[l]='*' then
+                 begin
+                   PB:=BreakpointCollection^.GetType(bt_function,copy(GetStr(PS),1,l-1));
+                   If Assigned(PB) then
+                     BreakpointCollection^.Delete(PB);
+                   Sym^.Name:=NewStr(copy(GetStr(PS),1,l-1));
+                   DrawView;
+                   DisposeStr(PS);
+                 end
+               else
+                 begin
+                   Sym^.Name:=NewStr(GetStr(PS)+'*');
+                   DrawView;
+                   New(PB,init_function(GetStr(PS)));
+                   DisposeStr(PS);
+                   BreakpointCollection^.Insert(PB);
+                   BreakpointCollection^.Update;
+                 end;
+            end
+          else if pos('var',Sym^.GetText)>0 then
+            { insert watch point }
+            begin
+               { make it visible }
+               PS:=Sym^.Name;
+               l:=Length(PS^);
+               If PS^[l]='*' then
+                 begin
+                   PB:=BreakpointCollection^.GetType(bt_awatch,copy(PS^,1,l-1));
+                   If Assigned(PB) then
+                     BreakpointCollection^.Delete(PB);
+                   Sym^.Name:=NewStr(copy(PS^,1,l-1));
+                   DrawView;
+                   DisposeStr(PS);
+                 end
+               else
+                 begin
+                   Sym^.Name:=NewStr(GetStr(PS)+'*');
+                   DrawView;
+                   New(PB,init_type(bt_awatch,GetStr(PS)));
+                   DisposeStr(PS);
+                   BreakpointCollection^.Insert(PB);
+                   BreakpointCollection^.Update;
+                 end;
+            end;
+        end;
+      end;
+
   end;
   Tabs:=0;
   if assigned(ScopeView) then
     Tabs:=Tabs or btScope;
   if assigned(ReferenceView) then
     Tabs:=Tabs or btReferences;
+  if Assigned(Sym) then
+    if (Pos('proc',Sym^.GetText)>0) or (Pos('var',Sym^.GetText)>0) then
+      Tabs:=Tabs or btBreakWatch;
   if (Tabs and BrowserTab)=0 then
     if (Tabs and btScope)<>0 then BrowserTab:=btScope else
     if (Tabs and btReferences)<>0 then BrowserTab:=btReferences else
-      BrowserTab:=btInheritance;
+    if (Tabs and btInheritance)<>0 then BrowserTab:=btInheritance else
+      BrowserTab:=btBreakWatch;
   if PageTab<>nil then PageTab^.SetParams(Tabs,BrowserTab);
 end;
 
@@ -654,7 +723,7 @@ begin
   GetPalette:=@S;
 end;
 
-procedure OpenSymbolBrowser(X,Y: Sw_integer;const Name,Line: string;
+procedure OpenSymbolBrowser(X,Y: Sw_integer;const Name,Line: string;S : PSymbol;
             Symbols: PSymbolCollection; References: PReferenceCollection);
 var R: TRect;
 begin
@@ -663,14 +732,18 @@ begin
   R.B.X:=R.A.X+35; R.B.Y:=R.A.Y+15;
   while (R.B.Y>Desktop^.Size.Y) do R.Move(0,-1);
   Desktop^.Insert(New(PBrowserWindow, Init(R,
-    'Browse: '+Name,SearchFreeWindowNo,Line,Symbols,References)));
+    'Browse: '+Name,SearchFreeWindowNo,S,Line,Symbols,References)));
 end;
 
 
 END.
 {
   $Log$
-  Revision 1.5  1999-02-04 17:53:47  pierre
+  Revision 1.6  1999-02-10 09:44:59  pierre
+    + added B tab for functions and vars for break/watch
+      TBrowserWindow also stores the symbol itself for break/watchpoints
+
+  Revision 1.5  1999/02/04 17:53:47  pierre
    + OpenOneSymbolBrowser
 
   Revision 1.4  1999/02/04 13:16:14  pierre