option explicit

!INC Local Scripts.EAConstants-VBScript

'
' Recursively counts the number of elements in the selected package and its children
' 
' Related APIs
' =================================================================================
' Package API - http://www.sparxsystems.com/enterprise_architect_user_guide/12.1/automation_and_scripting/package_2.html
' Repository API - http://www.sparxsystems.com/enterprise_architect_user_guide/12.1/automation_and_scripting/repository3.html
'

sub RecursiveElementCountExample()

	' Show the script output window
	Repository.EnsureOutputVisible "Script"
	
	Session.Output( "VBScript RECURSIVE ELEMENT COUNT EXAMPLE" )
	Session.Output( "=======================================" )
	
	' Get the package to work on
	dim contextObjectType
	contextObjectType = Repository.GetContextItemType()
	
	if contextObjectType = otPackage then
		dim elementCounter
		elementCounter = 0
	
		' Get the context object as a package
		dim contextPackage as EA.Package
		set contextPackage = GetContextObject()
		
		' Recursively count the number of elements in the package and its
		' children
		elementCounter = CountElements( contextPackage )
				
		' Output the results!
		dim message
		message = "Package '" & contextPackage.Name & "' has " & elementCounter & _
			" element(s) under it" 
		
		MsgBox ( message )
		Session.Output( message )
		
		Session.Output( "Done!" )

	else
		' Package is not currently the context item
		MsgBox( "This script requires a package to be selected." & vbCrLf & _
			"Please select a package and try again." )
	end if

end sub

'
' Counts the number of elements under the provided package and its children
'
function CountElements( thePackage )

	dim count 
	count = 0	

	' Cast thePackage to EA.Package so we get intellisense
	dim contextPackage as EA.Package
	set contextPackage = thePackage

	' Iterate through all child packages
	dim currentPackage as EA.Package
	for each currentPackage in contextPackage.Packages
		' Recursively process child packages
		count = count + CountElements( currentPackage )
	next
	
	' Add this package's element count to the counter
	CountElements = count + contextPackage.Elements.Count
	
end function

RecursiveElementCountExample
