Quellcode durchsuchen

Symbol browse window unit info panel resize proportionaly.

Margers vor 5 Monaten
Ursprung
Commit
93d7c4d20d
1 geänderte Dateien mit 81 neuen und 0 gelöschten Zeilen
  1. 81 0
      packages/ide/fpsymbol.pas

+ 81 - 0
packages/ide/fpsymbol.pas

@@ -253,6 +253,10 @@ type
       InOwnerCall: boolean;
       UnitInfoUsed: PSymbolScopeView;
       UnitInfoDependent: PSymbolScopeView;
+      UsedVSB: PScrollBar;
+      DependVSB: PScrollBar;
+      UsedCST: PColorStaticText;
+      DependCST: PColorStaticText;
       procedure SetState(AState: Word; Enable: Boolean); virtual;
       procedure HandleEvent(var Event: TEvent); virtual;
     end;
@@ -274,9 +278,11 @@ type
       function    GetFlags: longint; virtual;
       procedure   SetFlags(AFlags: longint); virtual;
       procedure   SizeLimits (Var Min, Max: TPoint); Virtual;
+      procedure   OnResize; Virtual; { called on window resize event }
       destructor  Done;virtual;
     private
       BrowserFlags  : Longint;
+      PrevSize      : TPoint;
       PageTab       : PBrowserTab;
       ST            : PStaticText;
       Sym           : PSymbol;
@@ -2330,6 +2336,8 @@ begin
         UnitInfoUsed^.MyBW:=@Self;
         UnitInfo^.Insert(UnitInfoUsed);
         UnitInfo^.UnitInfoUsed:=UnitInfoUsed;
+        UnitInfo^.UsedVSB:=VSB;
+        UnitInfo^.UsedCST:=CST;
       end;
 
       UnitInfo^.UnitInfoDependent:=nil;
@@ -2359,13 +2367,19 @@ begin
         UnitInfoDependent^.MyBW:=@Self;
         UnitInfo^.Insert(UnitInfoDependent);
         UnitInfo^.UnitInfoDependent:=UnitInfoDependent;
+        UnitInfo^.DependVSB:=VSB;
+        UnitInfo^.DependCST:=CST;
       end;
 
       if Assigned(UnitInfoText) then
         UnitInfoText^.Select;
 
+      PrevSize.Y:=0;
+      PrevSize.X:=0;
+      OnResize;
       Insert(UnitInfo);
     end;
+  PrevSize:=Size;
 
   { hide not active pages so that scrollbars do not overlap }
   if assigned(ScopeView) then ScopeView^.SetState(sfVisible,False);
@@ -2609,6 +2623,73 @@ begin
   Min.Y:=15; { Scrollbars in unit info page is still usable }
   Max.X:=ScreenWidth;
   Max.Y:=ScreenHeight-2;
+  if (PrevSize.X<>Size.X) or (PrevSize.Y<>Size.Y) then
+  begin
+    OnResize;
+    PrevSize:=Size;
+  end;
+end;
+
+procedure TBrowserWindow.OnResize;
+var Y, uL,dL,tL: sw_integer;
+    uMi,dMi,tMi: sw_integer;
+    T,U,D : sw_integer;
+    TotalLinesNeed : sw_integer;
+begin
+  if (PrevSize.Y<>Size.Y) then
+  begin
+    {-- unit info page resize manualy --}
+    if assigned(UnitInfo) then
+    begin
+      { get number of lines everyone needs }
+      Y:=UnitInfo^.Size.Y;
+      tL:=UnitInfoText^.GetLineCount;
+      tMi:=Min(tL,3);
+      uL:=0;dL:=0;uMi:=0;dMi:=0;
+      if assigned(UnitInfoUsed) then
+      begin
+        uMi:=4;
+        uL:=UnitInfoUsed^.FilteredSym^.Count+1;
+      end;
+      if assigned(UnitInfoDependent) then
+      begin
+        dMi:=4;
+        dL:=UnitInfoDependent^.FilteredSym^.Count+1;
+      end;
+      { proportional split amongst needy }
+      TotalLinesNeed:=Max(tL+uL+dL,1);
+      T:=Max(tMi,(tL*Y) div TotalLinesNeed);
+      T:=Min(T,Max(tMi,tL)); { don't give more than actual need }
+      TotalLinesNeed:=Max(uL+dL,1);
+      Y:=Y-T;
+      U:=Max(uMi,(uL*Y) div TotalLinesNeed);
+      Y:=Y-U;
+      D:=Y;
+      if D<dMi then
+      begin
+        U:=U-(dMi-D);
+        D:=dMi;
+      end;
+      { assign newly calculated positions and height for everyone }
+      UnitInfoText^.Size.Y:=T;
+      if assigned(UnitInfoUsed) then
+      begin
+        UnitInfo^.UsedCST^.Origin.Y:=T;
+        UnitInfoUsed^.Origin.Y:=T+1;
+        UnitInfo^.UsedVSB^.Origin.Y:=T+1;
+        UnitInfoUsed^.Size.Y:=U-1;
+        UnitInfo^.UsedVSB^.Size.Y:=U-1;
+      end;
+      if assigned(UnitInfoDependent) then
+      begin
+        UnitInfo^.DependCST^.Origin.Y:=T+U;
+        UnitInfoDependent^.Origin.Y:=T+U+1;
+        UnitInfo^.DependVSB^.Origin.Y:=T+U+1;
+        UnitInfoDependent^.Size.Y:=D-1;
+        UnitInfo^.DependVSB^.Size.Y:=D-1;
+      end;
+    end;
+  end;
 end;
 
 procedure TBrowserWindow.Close;