
local PANEL = {}

/*---------------------------------------------------------
   Name: Init
---------------------------------------------------------*/
function PANEL:Init()

	self.pnlCanvas 	= vgui.Create( "Panel", self )
	self.Items = {}
	self.YOffset = 0
	
	self:SetSpacing( 0 )
	self:SetPadding( 4 )
	self:EnableHorizontal( false )
	
	self.BackgroundColor = Color( 0, 0, 0, 200 )

end

/*---------------------------------------------------------
   Name: EnableHorizontal
---------------------------------------------------------*/
function PANEL:EnableHorizontal( bHoriz )

	self.Horizontal = bHoriz
	
end

/*---------------------------------------------------------
   Name: EnableVerticalScrollbar
---------------------------------------------------------*/
function PANEL:EnableVerticalScrollbar()

	if (self.VBar) then return end
	
	self.VBar = vgui.Create( "SlideBar", self )
	self:InvalidateLayout()
	
end

/*---------------------------------------------------------
   Name: GetCanvas
---------------------------------------------------------*/
function PANEL:GetCanvas()

	return self.pnlCanvas

end

/*---------------------------------------------------------
   Name: GetCanvas
---------------------------------------------------------*/
function PANEL:Clear()

	for k, panel in pairs( self.Items ) do
	
		panel:Remove()
	
	end
	
	self.Items = {}

end

/*---------------------------------------------------------
   Name: AddItem
---------------------------------------------------------*/
function PANEL:AddItem( item )

	item:SetParent( self:GetCanvas() )
	table.insert( self.Items, item )
	
	self:InvalidateLayout()

end

/*---------------------------------------------------------
   Name: Rebuild
---------------------------------------------------------*/
function PANEL:Rebuild()

	local Offset = 0
	
	if ( self.Horizontal ) then
	
		local x, y = 0, 0;
		for k, panel in pairs( self.Items ) do
		
			local w = panel:GetWide()
			local h = panel:GetTall()
			
			if ( x + w  > self:GetWide() ) then
			
				x = 0
				y = y + h + self.Spacing
			
			end
			
			panel:SetPos( x, y )
			
			x = x + w + self.Spacing
			Offset = y + h + self.Spacing
		
		end
	
	else
	
		for k, panel in pairs( self.Items ) do
		
			panel:SetSize( self:GetCanvas():GetWide(), panel:GetTall() )
			panel:SetPos( 0, Offset )
			Offset = Offset + panel:GetTall() + self.Spacing
		
		end
		
	end
	
	self:GetCanvas():SetSize( self:GetCanvas():GetWide(), Offset + self.Padding * 2 - self.Spacing ) 

end

/*---------------------------------------------------------
   Name: OnMouseWheeled
---------------------------------------------------------*/
function PANEL:OnMouseWheeled( dlta )

	if ( self.VBar ) then
		return self.VBar:AddVelocity( dlta )
	end
	
end

/*---------------------------------------------------------
   Name: Paint
---------------------------------------------------------*/
function PANEL:Paint()
	
	draw.RoundedBox( 4, 0, 0, self:GetWide(), self:GetTall(), self.BackgroundColor )
	return true
	
end

/*---------------------------------------------------------
   Name: SetSpacing
---------------------------------------------------------*/
function PANEL:SetSpacing( _num_ )
	
	self.Spacing = _num_
	
end

/*---------------------------------------------------------
   Name: SetPadding
---------------------------------------------------------*/
function PANEL:SetPadding( _num_ )
	
	self.Padding = _num_
	
end


/*---------------------------------------------------------
   Name: Think
---------------------------------------------------------*/
function PANEL:Think()
	
	if ( self.VBar && self.VBar:Changed() ) then
	
		local MaxOffset = self.pnlCanvas:GetTall() - self:GetTall()
		self.YOffset = MaxOffset * self.VBar:Value()
		self:InvalidateLayout()
		
	end
	
end

/*---------------------------------------------------------
   Name: PerformLayout
---------------------------------------------------------*/
function PANEL:PerformLayout()

	local Wide = self:GetWide()
	
	if ( self.VBar ) then
	
		self.VBar:SetPos( self:GetWide() - 18, 2 )
		self.VBar:SetSize( 16, self:GetTall() - 4 )
		self.VBar:SetBarScale( self.pnlCanvas:GetTall() / self:GetTall() )
	
		if ( self.VBar.Enabled ) then Wide = Wide - 20 end
		
	end

	self.pnlCanvas:SetPos( self.Padding, self.YOffset * -1 + self.Padding )
	self.pnlCanvas:SetSize( Wide - self.Padding * 2, self.pnlCanvas:GetTall() )
	
	self:Rebuild()

end

function PANEL:OnMousePressed( mcode )

	if ( mcode == MOUSE_RIGHT ) then
	
		if ( self.VBar ) then
			self.VBar:Grip()
		end
		
	end
	
end


vgui.Register( "PanelList", PANEL, "Panel" )