
#coding: gbk

from win32com import universal
from win32com.server.exception import COMException
from win32com.client import gencache, DispatchWithEvents
import winerror
import pythoncom
from win32com.client import constants, Dispatch
import sys
import win32com.client

# Support for COM objects we use.
gencache.EnsureModule('{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}', 0, 2, 1, bForDemand=True) # Office 9
gencache.EnsureModule('{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}', 0, 2, 5, bForDemand=True)

# The TLB defiining the interfaces we implement
universal.RegisterInterfaces('{AC0714F2-3D04-11D1-AE7D-00A0C90F26F4}', 0, 1, 0, ["_IDTExtensibility2"])
universal.RegisterInterfaces('{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}', 0, 2, 5, ["IRibbonExtensibility", "IRibbonControl"])

class ButtonEvent:
    def OnClick(self, button, cancel):
        import win32ui # Possible, but not necessary, to use a Pythonwin GUI
        import win32con
        win32ui.MessageBox("Hello from Python","PythonTest",win32con.MB_OKCANCEL)
        return cancel

class WordAddin:
    _com_interfaces_ = ['_IDTExtensibility2', 'IRibbonExtensibility']
    _public_methods_ = ['do','GetImage']
    _reg_clsctx_ = pythoncom.CLSCTX_INPROC_SERVER
    _reg_clsid_ = "{C5482ECA-F559-45A0-B078-B2036E6F011A}"
    _reg_progid_ = "Python.Test.WordAddin"
    _reg_policy_spec_ = "win32com.server.policy.EventHandlerPolicy"

    def __init__(self):
        self.appHostApp = None    

    def do(self,ctrl):
        import win32ui # Possible, but not necessary, to use a Pythonwin GUI
        import win32con
        win32ui.MessageBox("Hello from Python","PythonTest",win32con.MB_OKCANCEL)
           
    def GetImage(self,ctrl):
        from gdiplus import LoadImage
        i = LoadImage( 'c:/edit.png' )
        print i, 'ddd'
        return i

    def GetCustomUI(self,control):
        s = '''
            <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
              <ribbon startFromScratch="false">
                <tabs>
                  <tab id="CustomTab" label="JJ">
                    <group id="MainGroup" label="Main">
                      <button id="Button" label="doo" imageMso="HappyFace" 
                        size="large" onAction="do" />
                        
                      <button id="Button2" label="doo2" getImage='GetImage' 
                        size="large" onAction="do" />

                    </group>

                  </tab>
                </tabs>
              </ribbon>
            </customUI>
        '''
        return s
        
    def OnConnection(self, application, connectMode, addin, custom):
        print "OnConnection", application, connectMode, addin, custom
        try:
            self.appHostApp = application
        except pythoncom.com_error, (hr, msg, exc, arg):
            print "The Excel call failed with code %d: %s" % (hr, msg)
            if exc is None:
                print "There is no extended error information"
            else:
                wcode, source, text, helpFile, helpId, scode = exc
                print "The source of the error is", source
                print "The error message is", text
                print "More info can be found in %s (id=%d)" % (helpFile, helpId)

    def OnDisconnection(self, mode, custom):
        print "OnDisconnection"
        #self.appHostApp.CommandBars("PythonBar").Delete
        self.appHostApp=None
        
        
    def OnAddInsUpdate(self, custom):
        print "OnAddInsUpdate", custom
        
    def OnStartupComplete(self, custom):
        print "OnStartupComplete", custom
        
    def OnBeginShutdown(self, custom):
        print "OnBeginShutdown", custom
        
        

def RegisterAddin(klass):
    import _winreg
    key = _winreg.CreateKey(_winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Office\\Word\\Addins")
    subkey = _winreg.CreateKey(key, klass._reg_progid_)
    _winreg.SetValueEx(subkey, "CommandLineSafe", 0, _winreg.REG_DWORD, 0)
    _winreg.SetValueEx(subkey, "LoadBehavior", 0, _winreg.REG_DWORD, 3)
    _winreg.SetValueEx(subkey, "Description", 0, _winreg.REG_SZ, "Word Addin")
    _winreg.SetValueEx(subkey, "FriendlyName", 0, _winreg.REG_SZ, "JJ Word Addin")

def UnregisterAddin(klass):
    import _winreg
    try:
        _winreg.DeleteKey(_winreg.HKEY_CURRENT_USER, "Software\\Microsoft\\Office\\Word\\Addins\\" + klass._reg_progid_)
    except WindowsError:
        pass

if __name__ == '__main__':
    import win32com.server.register
    win32com.server.register.UseCommandLine( WordAddin )
    if "--unregister" in sys.argv:
        UnregisterAddin( WordAddin )
    else:
        RegisterAddin( WordAddin )


