import FreeCADGui as Gui
import FreeCAD as App

class AHB_View_Annotate:
	def GetResources(self):
		return {"MenuText": "Annotate view",
				"ToolTip": "Annotates a TechDraw view with object names",
				"Pixmap": ""
				}

	def IsActive(self):
		return True

	def Activated(self):
		workbench = Gui.getWorkbench("AssemblyHandbookWorkbench") #: :type workbench: AssemblyHandbookWorkbench
		
		if len(Gui.Selection.getSelection()) != 1:
			raise Exception("Please select exactly one TechDraw view")

		view = Gui.Selection.getSelection()[0]
		if view.TypeId != 'TechDraw::DrawViewPart':
			raise Exception("Selected object is not a TechDraw view")
		
		doc = view.Document
		
		page = workbench.techDrawExtensions.getViewPage(view)
		if page is None:
			raise Exception("Can't find page in which the selected view is located")
		
		# Remove balloons referencing missing objects
		for balloon in page.Views:
			if balloon.TypeId == 'TechDraw::DrawViewBalloon' and "Assembly_handbook_PartName" in balloon.PropertiesList:
				if balloon.SourceView != view: continue
				partLink = doc.getObject(balloon.Assembly_handbook_PartName)
				if partLink is None or partLink not in view.XSource:
					print(balloon.Name + " references missing object " + balloon.Assembly_handbook_PartName + ", removing balloon")
					doc.removeObject(balloon.Name)
		
		for partLink in view.XSource:
			balloon = None
			
			# Search an existing balloon to update
			for obj in page.Views:
				if obj.TypeId == 'TechDraw::DrawViewBalloon' and "Assembly_handbook_PartName" in obj.PropertiesList and obj.Assembly_handbook_PartName == partLink.Name:
					if obj.SourceView != view: continue
					balloon = obj
			
			# Create a new balloon if needed
			if balloon is None:
				partName = partLink.Name
				
				balloonName = partName + "_Balloon"
				
				balloon = doc.addObject("TechDraw::DrawViewBalloon", balloonName)
				balloon.SourceView = view
				
				balloon.addProperty("App::PropertyString", "Assembly_handbook_PartName", "Assembly_handbook")
				balloon.Assembly_handbook_PartName = partName
				
				balloon.addProperty("App::PropertyFloat", "Assembly_handbook_OriginOffsetX", "Assembly_handbook")
				balloon.addProperty("App::PropertyFloat", "Assembly_handbook_OriginOffsetY", "Assembly_handbook")
				
				page.addView(balloon)
				
				workbench.techDrawExtensions.updateBalloon(balloon)
				
				balloon.X = int(balloon.OriginX) + 20
				balloon.Y = int(balloon.OriginY) + 20
				
				if not workbench.techDrawExtensions.isNewPartInView(view, partLink):
					balloon.ViewObject.Visibility = False
			else:
				workbench.techDrawExtensions.updateBalloon(balloon)

from ahb_command import AHB_CommandWrapper
AHB_CommandWrapper.addGuiCommand('AHB_view_annotate', AHB_View_Annotate())