PythonScript 2.0



  • @Ekopalypse

    Yea, I believe I tried pywin32 at some point and found it strange.





  • @chcg

    Yea…except that Tk sucks. :(

    In fact, most Python GUIs except PyQt and wxPython (or whatever it is called now) are so bad they aren’t useful. My opinions only, people, don’t go nuts on me.



  • @chcg

    you are absolutely right and I would say, there is a MUST DO READ those samples
    for everyone starting investing pythonscript plugin as it nearly covers any aspect of
    manipulating either notepad++ or scintilla or how to extend npp - as far as I can see.

    But using ctypes is … uncomfortable, as you have to declare every piece,
    with the risk of making it wrong. pywin32 did this already for you and Tk is a different beast.
    I haven’t found out how one can create a Tk UI which can be docked.
    Please don’t get me wrong - not having pywin32 isn’t a showstopper at all - it is just convenient.
    And, at any time, one could install a local python and replace the python dll with the one of the local installation and can benefit from pip.



  • @Ekopalypse

    You mean like this stuff is “uncomfortable” when doing ctypes?:

            self.WNDENUMPROC = ctypes.WINFUNCTYPE(BOOL, HWND, LPARAM)
            self.FindWindow = ctypes.windll.user32.FindWindowW
            self.EnumChildWindows = ctypes.windll.user32.EnumChildWindows
            self.GetClassName = ctypes.windll.user32.GetClassNameW
            self.GetWindowText = ctypes.windll.user32.GetWindowTextW
            self.GetWindowTextLength = ctypes.windll.user32.GetWindowTextLengthW
            self.SetWindowText = ctypes.windll.user32.SetWindowTextW
            self.GetACP = ctypes.windll.kernel32.GetACP
            self.create_unicode_buffer = ctypes.create_unicode_buffer
    

    It really isn’t that bad, once you get some boilerplate (word of the day!) worked up. :)



  • @Alan-Kilborn

    yes, but the real pain starts when you have to do something like this ;-)

    LVS_ICON = 0x0
    LVS_REPORT = 0x1
    LVS_SMALLICON = 0x2
    LVS_LIST = 0x3
    LVS_TYPEMASK = 0x3
    LVS_SINGLESEL = 0x4
    LVS_SHOWSELALWAYS = 0x8
    LVS_SORTASCENDING = 0x10
    LVS_SORTDESCENDING = 0x20
    LVS_SHAREIMAGELISTS = 0x40
    LVS_NOLABELWRAP = 0x80
    LVS_AUTOARRANGE = 0x100
    LVS_EDITLABELS = 0x200
    LVS_OWNERDATA = 0x1000
    LVS_NOSCROLL = 0x2000
    LVS_TYPESTYLEMASK = 0xFC00
    LVS_ALIGNTOP = 0x0
    LVS_ALIGNLEFT = 0x800
    LVS_ALIGNMASK = 0xC00
    LVS_OWNERDRAWFIXED = 0x400
    LVS_NOCOLUMNHEADER = 0x4000
    LVS_NOSORTHEADER = 0x8000
    
    LVS_EX_GRIDLINES = 0x1
    LVS_EX_SUBITEMIMAGES = 0x2
    LVS_EX_CHECKBOXES = 0x4
    LVS_EX_TRACKSELECT = 0x8
    LVS_EX_HEADERDRAGDROP = 0x10
    LVS_EX_FULLROWSELECT = 0x20    # applies to report mode only
    LVS_EX_ONECLICKACTIVATE = 0x40
    LVS_EX_TWOCLICKACTIVATE = 0x80
    LVS_EX_FLATSB = 0x100          # cannot be cleared - Win32 & IE4 and later
    LVS_EX_REGIONAL = 0x200
    LVS_EX_INFOTIP = 0x400
    
    LVM_FIRST = 0x1000
    
    # ListView Messages
    LVM_GETBKCOLOR = LVM_FIRST + 0
    LVM_SETBKCOLOR = LVM_FIRST + 1
    LVM_GETIMAGELIST = LVM_FIRST + 2
    LVM_SETIMAGELIST = LVM_FIRST + 3
    LVM_GETITEMCOUNT = LVM_FIRST + 4
    
    LVM_DELETEITEM = LVM_FIRST + 8
    LVM_DELETEALLITEMS = LVM_FIRST + 9
    LVM_GETCALLBACKMASK = LVM_FIRST + 10
    LVM_SETCALLBACKMASK = LVM_FIRST + 11
    LVM_GETNEXTITEM = LVM_FIRST + 12
    
    LVM_SETITEMPOSITION = LVM_FIRST + 15
    LVM_GETITEMPOSITION = LVM_FIRST + 16
    
    LVM_HITTEST = LVM_FIRST + 18
    LVM_ENSUREVISIBLE = LVM_FIRST + 19
    LVM_SCROLL = LVM_FIRST + 20
    LVM_REDRAWITEMS = LVM_FIRST + 21
    LVM_ARRANGE = LVM_FIRST + 22
    
    LVM_GETEDITCONTROL = LVM_FIRST + 24
    
    LVM_DELETECOLUMN = LVM_FIRST + 28
    LVM_GETCOLUMNWIDTH = LVM_FIRST + 29
    LVM_SETCOLUMNWIDTH = LVM_FIRST + 30
    
    LVM_GETHEADER = LVM_FIRST + 31
    
    LVM_CREATEDRAGIMAGE = LVM_FIRST + 33
    LVM_GETVIEWRECT = LVM_FIRST + 34
    LVM_GETTEXTCOLOR = LVM_FIRST + 35
    LVM_SETTEXTCOLOR = LVM_FIRST + 36
    LVM_GETTEXTBKCOLOR = LVM_FIRST + 37
    LVM_SETTEXTBKCOLOR = LVM_FIRST + 38
    LVM_GETTOPINDEX = LVM_FIRST + 39
    LVM_GETCOUNTPERPAGE = LVM_FIRST + 40
    LVM_GETORIGIN = LVM_FIRST + 41
    LVM_UPDATE = LVM_FIRST + 42
    LVM_SETITEMSTATE = LVM_FIRST + 43
    LVM_GETITEMSTATE = LVM_FIRST + 44
    LVM_SETITEMCOUNT = LVM_FIRST + 47
    LVM_SORTITEMS = LVM_FIRST + 48
    LVM_SETITEMPOSITION32 = LVM_FIRST + 49
    LVM_GETSELECTEDCOUNT = LVM_FIRST + 50
    LVM_GETITEMSPACING = LVM_FIRST + 51
    
    LVM_SETICONSPACING = LVM_FIRST + 53
    LVM_SETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 54
    LVM_GETEXTENDEDLISTVIEWSTYLE = LVM_FIRST + 55
    LVM_GETSUBITEMRECT = LVM_FIRST + 56
    LVM_SUBITEMHITTEST = LVM_FIRST + 57
    LVM_SETCOLUMNORDERARRAY = LVM_FIRST + 58
    LVM_GETCOLUMNORDERARRAY = LVM_FIRST + 59
    LVM_SETHOTITEM = LVM_FIRST + 60
    LVM_GETHOTITEM = LVM_FIRST + 61
    LVM_SETHOTCURSOR = LVM_FIRST + 62
    LVM_GETHOTCURSOR = LVM_FIRST + 63
    LVM_APPROXIMATEVIEWRECT = LVM_FIRST + 64
    LVM_SETWORKAREA = LVM_FIRST + 65
    LVM_GETSELECTIONMARK = LVM_FIRST + 66
    LVM_SETSELECTIONMARK = LVM_FIRST + 67
    LVM_GETWORKAREA = LVM_FIRST + 70
    LVM_SETHOVERTIME = LVM_FIRST + 71
    LVM_GETHOVERTIME = LVM_FIRST + 72
    
    LVM_GETITEM = LVM_FIRST + 75
    LVM_SETITEM = LVM_FIRST + 76
    LVM_INSERTITEMW = LVM_FIRST + 77
    LVM_INSERTITEM = LVM_INSERTITEMW
    LVM_FINDITEMW = LVM_FIRST + 83
    LVM_FINDITEM = LVM_FINDITEMW
    LVM_GETSTRINGWIDTHW = LVM_FIRST + 87
    LVM_GETSTRINGWIDTH = LVM_GETSTRINGWIDTHW
    LVM_EDITLABELW = LVM_FIRST + 118
    LVM_EDITLABEL = LVM_EDITLABELW
    LVM_GETCOLUMNW = LVM_FIRST + 95
    LVM_GETCOLUMN = LVM_GETCOLUMNW
    LVM_SETCOLUMNW = LVM_FIRST + 96
    LVM_SETCOLUMN = LVM_SETCOLUMNW
    LVM_INSERTCOLUMNW = LVM_FIRST + 97
    LVM_INSERTCOLUMN = LVM_INSERTCOLUMNW
    LVM_GETITEMTEXTW = LVM_FIRST + 115
    LVM_GETITEMTEXT = LVM_GETITEMTEXTW
    LVM_SETITEMTEXTW = LVM_FIRST + 116
    LVM_SETITEMTEXT = LVM_SETITEMTEXTW
    LVM_GETISEARCHSTRINGW = LVM_FIRST + 117
    LVM_GETISEARCHSTRING = LVM_GETISEARCHSTRINGW
    LVM_GETBKIMAGEW = LVM_FIRST + 139
    LVM_SETBKIMAGEW = LVM_FIRST + 138
    # LVBKIMAGE = LVBKIMAGEW
    # LPLVBKIMAGE = LPLVBKIMAGEW
    LVM_SETBKIMAGE = LVM_SETBKIMAGEW
    LVM_GETBKIMAGE = LVM_GETBKIMAGEW
    
    LVCF_FMT = 0x1
    LVCF_WIDTH = 0x2
    LVCF_TEXT = 0x4
    LVCF_SUBITEM = 0x8
    LVCF_IMAGE = 0x10
    LVCF_ORDER = 0x20
    
    LVCFMT_LEFT = 0x0
    LVCFMT_RIGHT = 0x1
    LVCFMT_CENTER = 0x2
    LVCFMT_JUSTIFYMASK = 0x3
    LVCFMT_IMAGE = 0x800
    LVCFMT_BITMAP_ON_RIGHT = 0x1000
    LVCFMT_COL_HAS_IMAGES = 0x8000
    
    LVIF_TEXT = 0x1
    LVSCW_AUTOSIZE = -1
    
    class LVCOLUMN(ctypes.Structure):
        _fields_ = [('mask',        wintypes.UINT),
                    ('fmt',         wintypes.INT),
                    ('cx',          wintypes.INT),
                    ('pszText',     wintypes.LPWSTR),
                    ('cchTextMax',  wintypes.INT),
                    ('iSubItem',    wintypes.INT),
                    ('iImage',      wintypes.INT),
                    ('iOrder',      wintypes.INT),
                    ('cxMin',       wintypes.INT),
                    ('cxDefault',   wintypes.INT),
                    ('cxIdeal',     wintypes.INT),
                    ]
    
    class LVITEM(ctypes.Structure):
        _fields_ = [('mask',       wintypes.UINT),
                    ('iItem',      wintypes.INT),
                    ('iSubItem',   wintypes.INT),
                    ('state',      wintypes.UINT),
                    ('stateMask',  wintypes.UINT),
                    ('pszText',    wintypes.LPWSTR),
                    ('cchTextMax', wintypes.INT),
                    ('iImage',     wintypes.INT),
                    ('lParam',     wintypes.LPARAM),
                    ('iIndent',    wintypes.INT),
                    ('iGroupId',   wintypes.INT),
                    ('cColumns',   wintypes.UINT),
                    ('puColumns',  PUINT),
                    ('piColFmt',   wintypes.INT),
                    ('iGroup',     wintypes.INT),
                    ]
    
    class NMITEMACTIVATE(ctypes.Structure):
        _fields_ = [('hdr',       LPNMHDR),
                    ('iItem',     wintypes.INT),
                    ('iSubItem',  wintypes.INT),
                    ('uNewState', wintypes.UINT),
                    ('uOldState', wintypes.UINT),
                    ('uChanged',  wintypes.UINT),
                    ('ptAction',  wintypes.POINT),
                    ('lParam',    wintypes.LPARAM),
                    ('uKeyFlags', wintypes.UINT),
                    ]
    LPNMITEMACTIVATE = ctypes.POINTER(NMITEMACTIVATE)
    ...
    


  • @Ekopalypse

    Even that isn’t that bad (all in a separate file that is imported), but I admit it will get a bit tedious when posting scripts here and just going to get the ones needed for the scripts. But overall I find ctypes an amazing thing. And the things that you can use it for in a PS under Notepad++…also amazing. :)

    But some of the constructs get pretty tricky. I’ve used nulledge to find examples I need.



  • @Alan-Kilborn

    … and just going to get the ones needed for the scripts …

    at the end that’s exactly where it is handy to have it already defined.
    Of course, now that I have made it, I can use it but if I want to post a script which
    would use it, it isn’t that easy anymore as I might have to undo some parts to make it work …

    But some of the constructs get pretty tricky. I’ve used nulledge to find examples I need.

    To be honest, if I don’t understand how it should work I’m looking for VB6 examples :-)
    Most of the time those can be used just by converting and using the right python syntax.



  • So if you have some example scripts worth sharing guys you could create a PR at pythonscript and I will merge them.



  • @Ekopalypse

    The beauty of the code on nulledge is that it is already in Python. But oops, it appears that nulledge has gone 404. :( Maybe my future needs will have VB6 searches involved.


Log in to reply