UWindow
Class UWindowTabControlTabArea

source: e:\games\UnrealTournament\UWindow\Classes\UWindowTabControlTabArea.uc
Core.Object
   |
   +--UWindow.UWindowBase
      |
      +--UWindow.UWindowWindow
         |
         +--UWindow.UWindowTabControlTabArea
Direct Known Subclasses:None

class UWindowTabControlTabArea
extends UWindow.UWindowWindow


Variables
 UWindowTabControlItem DragTab
 UWindowTabControlItem FirstShown
 int TabOffset
 int TabRows
 float UnFlashTime
 bool bArrangeRowsLikeTimHates
 bool bDragging
 bool bFlashShown
 bool bShowSelected


Function Summary
 bool CheckMousePassThrough(float X, float Y)
 void Created()
 void DrawItem(Canvas C, UWindowList Item, float X, float Y, float W, float H, bool bShowText)
 void LMouseDown(float X, float Y)
 void LayoutTabs(Canvas C)
 void MouseMove(float X, float Y)
 void Paint(Canvas C, float X, float Y)
 void RMouseDown(float X, float Y)
 void SizeTabsMultiLine(Canvas C)
 void SizeTabsSingleLine(Canvas C)



Source Code


00001	class UWindowTabControlTabArea extends UWindowWindow;
00002	
00003	var int TabOffset;
00004	var bool bShowSelected;
00005	var UWindowTabControlItem FirstShown;
00006	var bool bDragging;
00007	var UWindowTabControlItem DragTab;
00008	var int TabRows;
00009	var globalconfig bool bArrangeRowsLikeTimHates;
00010	var float UnFlashTime;
00011	var bool bFlashShown;
00012	
00013	function Created()
00014	{
00015		TabOffset = 0;
00016		Super.Created();
00017	}
00018	
00019	function SizeTabsSingleLine(Canvas C)
00020	{
00021		local UWindowTabControlItem I, Selected, LastHidden;
00022		local int Count, TabCount;
00023		local float ItemX, W, H;
00024		local bool bHaveMore;
00025	
00026		ItemX = LookAndFeel.Size_TabXOffset;
00027		TabCount=0;
00028		for( 
00029				I = UWindowTabControlItem(UWindowTabControl(ParentWindow).Items.Next);
00030				I != None; 
00031				I = UWindowTabControlItem(I.Next) 
00032			)
00033		{
00034			LookAndFeel.Tab_GetTabSize(Self, C, RemoveAmpersand(I.Caption), W, H);
00035			I.TabWidth = W;
00036			I.TabHeight = H + 1;
00037			I.TabTop = 0;
00038			I.RowNumber = 0;
00039			TabCount++;
00040		}
00041	
00042		Selected = UWindowTabControl(ParentWindow).SelectedTab;
00043		
00044		while(True)
00045		{
00046			ItemX = LookAndFeel.Size_TabXOffset;
00047			Count = 0;
00048			LastHidden = None;
00049			FirstShown = None;
00050			for( 
00051					I = UWindowTabControlItem(UWindowTabControl(ParentWindow).Items.Next);
00052					I != None; 
00053					I = UWindowTabControlItem(I.Next) 
00054				)
00055			{
00056				if( Count < TabOffset)
00057				{
00058					I.TabLeft = -1;
00059					LastHidden = I;
00060				}
00061				else
00062				{
00063					if(FirstShown == None) FirstShown = I;
00064					I.TabLeft = ItemX;
00065					if(I.TabLeft + I.TabWidth >= WinWidth + 5) bHaveMore = True;
00066					ItemX += I.TabWidth;
00067				}
00068				Count++;
00069	
00070			}
00071	
00072			if( TabOffset > 0 && LastHidden != None && LastHidden.TabWidth + 5 < WinWidth - ItemX)
00073				TabOffset--;
00074			else 
00075			if(	bShowSelected && TabOffset < TabCount - 1 
00076				&&	Selected != None &&	Selected != FirstShown 
00077				&& Selected.TabLeft + Selected.TabWidth > WinWidth - 5
00078			  ) 
00079				TabOffset++;
00080			else				
00081				break;
00082		}
00083		bShowSelected = False;
00084	
00085		UWindowTabControl(ParentWindow).LeftButton.bDisabled = TabOffset <= 0;
00086		UWindowTabControl(ParentWindow).RightButton.bDisabled = !bHaveMore;
00087		TabRows = 1;
00088	}
00089	
00090	function SizeTabsMultiLine(Canvas C)
00091	{
00092		local UWindowTabControlItem I, Selected;
00093		local float W, H;
00094		local int MinRow;
00095		local float RowWidths[10];
00096		local int TabCounts[10];
00097		local int j;
00098		local bool bTryAnotherRow;
00099			
00100		TabOffset = 0;
00101		FirstShown = None;
00102	
00103		TabRows = 1;
00104		bTryAnotherRow = True;
00105	
00106		while(bTryAnotherRow && TabRows <= 10)
00107		{	
00108			bTryAnotherRow = False;
00109			for(j=0;j<TabRows;j++)
00110			{
00111				RowWidths[j] = 0;
00112				TabCounts[j] = 0;		
00113			}
00114	
00115			for( 
00116					I = UWindowTabControlItem(UWindowTabControl(ParentWindow).Items.Next);
00117					I != None; 
00118					I = UWindowTabControlItem(I.Next) 
00119				)
00120			{
00121				LookAndFeel.Tab_GetTabSize(Self, C, RemoveAmpersand(I.Caption), W, H);
00122				I.TabWidth = W;
00123				I.TabHeight = H;
00124	
00125				// find the best row for this tab
00126				MinRow = 0;
00127				for(j=1;j<TabRows;j++)
00128					if(RowWidths[j] < RowWidths[MinRow])
00129						MinRow = j;
00130	
00131				if(RowWidths[MinRow] + W > WinWidth)
00132				{
00133					TabRows ++;
00134					bTryAnotherRow = True;
00135					break;
00136				}
00137				else
00138				{
00139					RowWidths[MinRow] += W;
00140					TabCounts[MinRow]++;
00141					I.RowNumber = MinRow;
00142				}
00143			}
00144		}
00145	
00146		Selected = UWindowTabControl(ParentWindow).SelectedTab;
00147	
00148		if(TabRows > 1)
00149		{
00150			for( 
00151					I = UWindowTabControlItem(UWindowTabControl(ParentWindow).Items.Next);
00152					I != None; 
00153					I = UWindowTabControlItem(I.Next) 
00154				)
00155			{
00156				I.TabWidth += (WinWidth - RowWidths[I.RowNumber]) / TabCounts[I.RowNumber];
00157			}
00158		}
00159	
00160		for(j=0;j<TabRows;j++)
00161			RowWidths[j] = 0;
00162	
00163		for( 
00164				I = UWindowTabControlItem(UWindowTabControl(ParentWindow).Items.Next);
00165				I != None; 
00166				I = UWindowTabControlItem(I.Next) 
00167			)
00168		{
00169			I.TabLeft = RowWidths[I.RowNumber];
00170	
00171			if(bArrangeRowsLikeTimHates)
00172				I.TabTop = ((I.RowNumber + ((TabRows - 1) - Selected.RowNumber)) % TabRows) * I.TabHeight;
00173			else
00174				I.TabTop = I.RowNumber * I.TabHeight;
00175	
00176			RowWidths[I.RowNumber] += I.TabWidth;
00177		}
00178	}
00179	
00180	function LayoutTabs(Canvas C)
00181	{
00182		if(UWindowTabControl(ParentWindow).bMultiLine)
00183			SizeTabsMultiLine(C);
00184		else
00185			SizeTabsSingleLine(C);
00186	}
00187	
00188	function Paint(Canvas C, float X, float Y)
00189	{
00190		local UWindowTabControlItem I;
00191		local int Count;
00192		local int Row;
00193		local float T;
00194		
00195		T = GetEntryLevel().TimeSeconds;
00196	
00197		if(UnFlashTime < T)
00198		{
00199			bFlashShown = !bFlashShown;
00200	
00201			if(bFlashShown)
00202				UnFlashTime = T + 0.5;
00203			else
00204				UnFlashTime = T + 0.3;
00205		}
00206		
00207		for(Row=0;Row<TabRows;Row++)
00208		{
00209			Count = 0;
00210			for( 
00211					I = UWindowTabControlItem(UWindowTabControl(ParentWindow).Items.Next);
00212					I != None; 
00213					I = UWindowTabControlItem(I.Next) 
00214				)
00215			{
00216				if( Count < TabOffset)
00217				{
00218					Count++;
00219					continue;
00220				}
00221				if(I.RowNumber == Row)
00222					DrawItem(C, I, I.TabLeft, I.TabTop, I.TabWidth, I.TabHeight, (!I.bFlash) || bFlashShown);
00223			}
00224		}
00225	}
00226	
00227	function LMouseDown(float X, float Y)
00228	{
00229		local UWindowTabControlItem I;
00230		local int Count;
00231	
00232		Super.LMouseDown(X, Y);
00233	
00234		Count = 0;
00235		for( 
00236				I = UWindowTabControlItem(UWindowTabControl(ParentWindow).Items.Next);
00237				I != None; 
00238				I = UWindowTabControlItem(I.Next) 
00239			)
00240		{
00241			if( Count < TabOffset)
00242			{
00243				Count++;
00244				continue;
00245			}
00246			if( X >= I.TabLeft && X <= I.TabLeft + I.TabWidth && (TabRows==1 || (Y >= I.TabTop && Y <= I.TabTop + I.TabHeight)) )
00247			{
00248				if(!UWindowTabControl(ParentWindow).bMultiLine)
00249				{
00250					bDragging = True;
00251					DragTab = I;
00252					Root.CaptureMouse();
00253				}
00254				UWindowTabControl(ParentWindow).GotoTab(I, True);
00255			}
00256		}
00257	}
00258	
00259	function MouseMove(float X, float Y)
00260	{
00261		if(bDragging && bMouseDown)
00262		{
00263			if(X < DragTab.TabLeft)
00264				TabOffset++;
00265	
00266			if(X > DragTab.TabLeft + DragTab.TabWidth && TabOffset > 0)
00267				TabOffset--;	
00268		}
00269		else
00270			bDragging = False;
00271	}
00272	
00273	function RMouseDown(float X, float Y)
00274	{
00275		local UWindowTabControlItem I;
00276		local int Count;
00277	
00278		Super.LMouseDown(X, Y);
00279	
00280		Count = 0;
00281		for( 
00282				I = UWindowTabControlItem(UWindowTabControl(ParentWindow).Items.Next);
00283				I != None; 
00284				I = UWindowTabControlItem(I.Next) 
00285			)
00286		{
00287			if( Count < TabOffset)
00288			{
00289				Count++;
00290				continue;
00291			}
00292			if( X >= I.TabLeft && X <= I.TabLeft + I.TabWidth )
00293			{
00294				I.RightClickTab();
00295			}
00296		}
00297	}
00298	
00299	function DrawItem(Canvas C, UWindowList Item, float X, float Y, float W, float H, bool bShowText)
00300	{
00301		if(Item == UWindowTabControl(ParentWindow).SelectedTab)
00302			LookAndFeel.Tab_DrawTab(Self, C, True, FirstShown==Item, X, Y, W, H, UWindowTabControlItem(Item).Caption, bShowText);
00303		else
00304			LookAndFeel.Tab_DrawTab(Self, C, False, FirstShown==Item, X, Y, W, H, UWindowTabControlItem(Item).Caption, bShowText);
00305	}
00306	
00307	function bool CheckMousePassThrough(float X, float Y)
00308	{
00309		return Y >= LookAndFeel.Size_TabAreaHeight*TabRows;
00310	}
00311	
00312	defaultproperties
00313	{
00314	}

End Source Code