Community
    • Login

    PythonScript 2.0

    Scheduled Pinned Locked Moved Notepad++ & Plugin Development
    19 Posts 4 Posters 4.1k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • EkopalypseE
      Ekopalypse @chcg
      last edited by Ekopalypse

      @chcg

      thx for all the work you’ve and other have done to keep this alive.
      I’m very much enjoying this plugin.
      Concerning the open issues, at least the second part, custom dialogs,
      could be ignored when including pywin32 into PythonScript.

      Alan KilbornA 1 Reply Last reply Reply Quote 1
      • Alan KilbornA
        Alan Kilborn @Ekopalypse
        last edited by

        @Ekopalypse

        custom dialogs…could be ignored when including pywin32 into PythonScript.

        In PS, I do some basic UI stuff that is missing from PS with the techniques shown here:

        http://www.averdevelopment.com/python/EasyDialogs.html

        Granted these are simple standard dialogs, but they fill gap.

        Of course I think the custom dialogs mentioned would be a little different, but I thought I’d share my way of doing File Open, Save etc dialogs in PS when needed.

        EkopalypseE 1 Reply Last reply Reply Quote 3
        • EkopalypseE
          Ekopalypse @Alan Kilborn
          last edited by

          @Alan-Kilborn

          thank you, didn’t know about this site.
          pywin32 advantage is not only the easy to build uis but although the already defined win api functions.
          No need to check and see which function/structure needs to be create how but
          have to admit, that the usage of a few functions is a little bit different to what msdn states.

          I think the custom dialogs mentioned would be a little different,

          For example

          Alan KilbornA 1 Reply Last reply Reply Quote 2
          • Alan KilbornA
            Alan Kilborn @Ekopalypse
            last edited by

            @Ekopalypse

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

            1 Reply Last reply Reply Quote 0
            • chcgC
              chcg
              last edited by

              Example for ctypes:
              https://github.com/bruderstein/PythonScript/blob/master/scripts/Samples/ReplaceDefaultReplaceDialog.py

              Currently already available is https://github.com/bruderstein/PythonScript/releases/download/v1.3.0/PythonScript_TclTk_1.3.0.0.zip
              , see https://github.com/bruderstein/PythonScript/blob/master/scripts/Samples/Sorter.py

              Alan KilbornA EkopalypseE 2 Replies Last reply Reply Quote 3
              • Alan KilbornA
                Alan Kilborn @chcg
                last edited by

                @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.

                1 Reply Last reply Reply Quote 1
                • EkopalypseE
                  Ekopalypse @chcg
                  last edited by Ekopalypse

                  @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.

                  Alan KilbornA 1 Reply Last reply Reply Quote 0
                  • Alan KilbornA
                    Alan Kilborn @Ekopalypse
                    last edited by

                    @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. :)

                    EkopalypseE 1 Reply Last reply Reply Quote 3
                    • EkopalypseE
                      Ekopalypse @Alan Kilborn
                      last edited by Ekopalypse

                      @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)
                      ...
                      
                      Alan KilbornA 1 Reply Last reply Reply Quote 2
                      • Alan KilbornA
                        Alan Kilborn @Ekopalypse
                        last edited by Alan Kilborn

                        @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.

                        EkopalypseE 1 Reply Last reply Reply Quote 2
                        • EkopalypseE
                          Ekopalypse @Alan Kilborn
                          last edited by

                          @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.

                          Alan KilbornA 1 Reply Last reply Reply Quote 1
                          • chcgC
                            chcg
                            last edited by

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

                            1 Reply Last reply Reply Quote 3
                            • Alan KilbornA
                              Alan Kilborn @Ekopalypse
                              last edited by

                              @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.

                              1 Reply Last reply Reply Quote 2
                              • First post
                                Last post
                              The Community of users of the Notepad++ text editor.
                              Powered by NodeBB | Contributors