# Demo of ToolBars

# Shows the toolbar control.
# Demos how to make custom tooltips, etc.

import win32ui
import win32con
import win32api
from pywin.mfc import docview, window, afxres
import commctrl

class GenericFrame(window.MDIChildWnd):
	def OnCreateClient(self, cp, context):
		# handlers for toolbar buttons
		self.HookCommand (self.OnPrevious, 401)
		self.HookCommand (self.OnNext, 402)
		# Its not necessary for us to hook both of these - the
		# common controls should fall-back all by themselves.
		# Indeed, given we hook TTN_NEEDTEXTW, commctrl.TTN_NEEDTEXTA
		# will not be called.
		self.HookNotify(self.GetTTText, commctrl.TTN_NEEDTEXT)
		self.HookNotify(self.GetTTText, commctrl.TTN_NEEDTEXTW)
	
#		parent = win32ui.GetMainFrame()
		parent = self
		style = win32con.WS_CHILD | win32con.WS_VISIBLE | \
		    afxres.CBRS_SIZE_DYNAMIC | afxres.CBRS_TOP | afxres.CBRS_TOOLTIPS | afxres.CBRS_FLYBY

		buttons = (win32ui.ID_APP_ABOUT,win32ui.ID_VIEW_INTERACTIVE)
		bitmap = win32ui.IDB_BROWSER_HIER
		tbid = 0xE840
		self.toolbar = tb = win32ui.CreateToolBar (parent, style, tbid)
		tb.LoadBitmap(bitmap)
		tb.SetButtons(buttons)
		    
		tb.EnableDocking(afxres.CBRS_ALIGN_ANY)
		tb.SetWindowText("Test")
		parent.EnableDocking(afxres.CBRS_ALIGN_ANY)
		parent.DockControlBar(tb)
		parent.LoadBarState("ToolbarTest")
		window.MDIChildWnd.OnCreateClient(self, cp, context)
		return 1

	def OnDestroy(self, msg):
		self.SaveBarState("ToolbarTest")
		
	def GetTTText(self, std, extra):
		(hwndFrom, idFrom, code) = std
		text, hinst, flags = extra
		if flags & commctrl.TTF_IDISHWND:
			return # Not handled
		if (idFrom==win32ui.ID_APP_ABOUT):
			# our 'extra' return value needs to be the following
			# entries from a NMTTDISPINFO[W] struct:
			# (szText, hinst, uFlags).  None means 'don't change
			# the value'
			return 0, ("It works!", None, None)
		return None # not handled.
			
	def GetMessageString(self, id):
		if id==win32ui.ID_APP_ABOUT:
			return "Dialog Test\nTest"
		else:
			return self._obj_.GetMessageString(id)

	def OnSize (self, params):
		print('OnSize called with ', params)

	def OnNext (self, id, cmd):
		print('OnNext called')
	
	def OnPrevious (self, id, cmd):
		print('OnPrevious called')
	
msg = """\
This toolbar was dynamically created.\r
\r
The first item's tooltips is provided by Python code.\r
\r
(Dont close the window with the toolbar in a floating state - it may not re-appear!)\r
"""

def test():
	template = docview.DocTemplate( win32ui.IDR_PYTHONTYPE, None, GenericFrame, docview.EditView)
	doc = template.OpenDocumentFile(None)
	doc.SetTitle("Toolbar Test")
	view = doc.GetFirstView()
	view.SetWindowText(msg)

if __name__=='__main__':
	import demoutils
	if demoutils.NeedGoodGUI():
		test()
