• Login
Community
  • Login

last modified date in status bar?

Scheduled Pinned Locked Moved General Discussion
40 Posts 5 Posters 20.0k 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.
  • S
    Scott Sumner
    last edited by PeterJones Aug 24, 2024, 8:19 PM May 6, 2018, 3:22 PM

    …without overriding the language name?

    Ah…so I guess I missed this part of @SalviaSage 's posting. Okay, so there is no prebuilt function to get the statusbar data, like there is to set the statusbar data…but we can create one:

    import ctypes
    from ctypes.wintypes import BOOL, HWND, LPARAM
    
    def npp_get_statusbar(statusbar_item_number):
    
        WNDENUMPROC = ctypes.WINFUNCTYPE(BOOL, HWND, LPARAM)
        FindWindow = ctypes.windll.user32.FindWindowW
        SendMessage = ctypes.windll.user32.SendMessageW
        EnumChildWindows = ctypes.windll.user32.EnumChildWindows
        GetClassName = ctypes.windll.user32.GetClassNameW
        create_unicode_buffer = ctypes.create_unicode_buffer
        WM_USER = 0x400; SB_GETTEXTLENGTHW = WM_USER + 12; SB_GETTEXTW = WM_USER + 13
    
        npp_get_statusbar.STATUSBAR_HANDLE = None
    
        def get_data_from_statusbar(statusbar_item_number):
            retcode = SendMessage(npp_get_statusbar.STATUSBAR_HANDLE, SB_GETTEXTLENGTHW, statusbar_item_number, 0)
            length = retcode & 0xFFFF
            type = (retcode >> 16) & 0xFFFF
            text_buffer = create_unicode_buffer(length)
            retcode = SendMessage(npp_get_statusbar.STATUSBAR_HANDLE, SB_GETTEXTW, statusbar_item_number, text_buffer)
            retval = '{}'.format(text_buffer[:length])
            return retval
    
        def EnumCallback(hwnd, lparam):
            curr_class = create_unicode_buffer(256)
            GetClassName(hwnd, curr_class, 256)
            if curr_class.value.lower() == "msctls_statusbar32":
                npp_get_statusbar.STATUSBAR_HANDLE = hwnd
                return False
            return True
    
        EnumChildWindows(FindWindow(u"Notepad++", None), WNDENUMPROC(EnumCallback), 0)
    
        return get_data_from_statusbar(statusbar_item_number) if npp_get_statusbar.STATUSBAR_HANDLE else None
    

    Thus to add the modification timestamp info to the first section of the status bar, one would call npp_get_statusbar(0) and then use the returned string (if not None) by adding the time to it, e.g.:

    notepad.setStatusBar(STATUSBARSECTION.DOCTYPE, npp_get_statusbar(0) + ' ' * 8 + last_modified_date)

    I’m sure the basis for this status bar code goes back to some @Claudia-Frank code, but I can’t find the reference to it right now. Sorry, CF.

    -----
    note from the future: if this code gives you all NULL for the characters read back from the status bar, use the updated code found in this 2024 post

    1 Reply Last reply Reply Quote 1
    • P
      patrickdrd
      last edited by patrickdrd May 6, 2018, 3:27 PM May 6, 2018, 3:27 PM

      yes, it works CF

      I tried BUFFERACTIVATED but it didn’t work

      1 Reply Last reply Reply Quote 1
      • S
        SalviaSage
        last edited by SalviaSage May 7, 2018, 9:21 PM May 7, 2018, 9:19 PM

        @patrickdrd, have you been able to get this working? I’ve been trying here from my end. I can’t get the last modified date to display on the statusbar. If you have been able to get this working, can you please post the code?

        Thank you.

        1 Reply Last reply Reply Quote 0
        • P
          patrickdrd
          last edited by May 8, 2018, 5:17 AM

          from Npp import editor, notepad, SCINTILLANOTIFICATION, NOTIFICATION, STATUSBARSECTION
          import os
          from datetime import datetime

          def StatusbarSelOverride(args):
          modified_time = os.path.getmtime(notepad.getCurrentFilename())
          last_modified_date = datetime.fromtimestamp(modified_time)
          notepad.setStatusBar(STATUSBARSECTION.DOCTYPE, ‘Mod: {:%d/%m/%Y %H:%M}’.format(last_modified_date))

          editor.callback(StatusbarSelOverride, [SCINTILLANOTIFICATION.UPDATEUI])
          notepad.callback(StatusbarSelOverride, [NOTIFICATION.FILESAVED])
          notepad.callback(StatusbarSelOverride, [NOTIFICATION.READY])

          1 Reply Last reply Reply Quote 0
          • S
            SalviaSage
            last edited by May 8, 2018, 12:55 PM

            I still can’t figure out how to add the timestamp and still keep the original contents of a statusbar section.

            Scott Sumner, I would appreciate it very much if you can fix this code and post it here. thank you.

            D 1 Reply Last reply May 8, 2018, 2:32 PM Reply Quote 0
            • P
              patrickdrd
              last edited by May 8, 2018, 1:30 PM

              I don’t think you need the original contents, if we’re talking about the first tab,
              is DOCTYPE really that important for you?
              If so, why?
              I can’t think that’s important, that’s why I’m overwriting it

              1 Reply Last reply Reply Quote 0
              • D
                dail @SalviaSage
                last edited by dail May 8, 2018, 2:42 PM May 8, 2018, 2:32 PM

                Using LuaScript I’ve been able to keep the doc type and display the file modification time. Should be easily translatable to PythonScript.

                Note this works with a yet-to-be released version of LuaScript

                npp.AddEventHandler({"OnSave", "OnSwitchFile", "OnLangChange"}, function()
                	-- Make sure it is a "real" file first
                	if npp:GetCurrentDirectory() == "" then
                		return
                	end
                
                	local text = npp.LanguageDescription[npp.BufferLangType[npp.CurrentBufferID]] .. " - " .. os.date('%d/%m/%Y %H:%M', winfile.attributes(npp:GetFullCurrentPath(), "modification"))
                	npp.StatusBar[STATUSBAR_DOC_TYPE] = text
                end)
                

                Gives the results:

                C 1 Reply Last reply May 8, 2018, 2:38 PM Reply Quote 2
                • C
                  Claudia Frank @dail
                  last edited by May 8, 2018, 2:38 PM

                  @dail

                  unfortunately not, as python script hasn’t been updated with recent npp messages yet.

                  Cheers
                  Claudia

                  D 1 Reply Last reply May 8, 2018, 2:39 PM Reply Quote 1
                  • D
                    dail @Claudia Frank
                    last edited by May 8, 2018, 2:39 PM

                    @Claudia-Frank

                    Ah. Thanks for clarifying.

                    1 Reply Last reply Reply Quote 0
                    • S
                      SalviaSage
                      last edited by SalviaSage May 8, 2018, 4:34 PM May 8, 2018, 4:34 PM

                      @dail
                      Nice, I will be using your script then.
                      When is the release of the next version of luascript?

                      Thanks.

                      1 Reply Last reply Reply Quote 0
                      • D
                        dail
                        last edited by May 8, 2018, 4:43 PM

                        Not sure. You can download a prelease though.

                        • 32 bit
                        • 64 bit

                        Just drop the DLL in with the other plugins. Edit the startup script with Plugins > LuaScript > Edit startup script and put the above code in there, save, and restart Notepad++.

                        1 Reply Last reply Reply Quote 2
                        • S
                          SalviaSage
                          last edited by May 8, 2018, 5:55 PM

                          Thanks. the code works.

                          1 Reply Last reply Reply Quote 0
                          • P
                            patrickdrd
                            last edited by patrickdrd May 14, 2018, 2:37 PM May 14, 2018, 2:35 PM

                            I think I’ve found a bug:

                            I had around 10 tabs opened in npp, and my work shift is close to the end so I decided to close npp, so I pressed the x in the top right corner to find out that:

                            there was a file open which was attached to an email,
                            it was opened as read-only originally,
                            I clicked on edit -> clear read-only and I edited it,
                            I never saved it,

                            the date on the bottom left corner is updated continuously/ every minute that passes (on the clock), even though I’m not saving it (I can see a star on the top left corner - the star that means that the file is not saved),
                            I opened the containing folder and the file doesn’t exist there,
                            I’m using autosave plugin to run every time focus is switched off
                            from the current file as well

                            edit: more likely its an autosave bug

                            C 1 Reply Last reply May 14, 2018, 3:33 PM Reply Quote 0
                            • C
                              Claudia Frank @patrickdrd
                              last edited by Claudia Frank May 14, 2018, 3:34 PM May 14, 2018, 3:33 PM

                              @patrickdrd

                              something is strange here - how can python get a modified timestamp if the file doesn’t exist at all??
                              The autosave plugin could explain why you see the continuous update of the timestamp
                              but only if there is a file which can be saved.
                              Sorry, but, are you really sure that the file doesn’t exist?

                              Cheers
                              Claudia

                              1 Reply Last reply Reply Quote 0
                              • P
                                patrickdrd
                                last edited by May 17, 2018, 5:37 AM

                                yes, I checked in windows explorer, it should be easy to reproduce it yourself

                                1 Reply Last reply Reply Quote 0
                                • P
                                  patrickdrd
                                  last edited by May 17, 2018, 8:25 AM

                                  I’m also using the lua script too, not the python one

                                  1 Reply Last reply Reply Quote 0
                                  • D
                                    dail
                                    last edited by May 17, 2018, 12:18 PM

                                    @patrickdrd

                                    The Lua I posted above simply askes the operating system (i.e. Windows) when the file was last modified. Even if the file isn’t being saved from Notepad++, it would appear something else is changing the file’s modification timestamp.

                                    1 Reply Last reply Reply Quote 2
                                    • S
                                      SalviaSage
                                      last edited by Sep 23, 2018, 12:26 AM

                                      @dail

                                      Hi dail, I just tested your script today and it is not working anymore on notepad++ v7.5.8

                                      Can you please also check it and maybe we can come up with a fix.

                                      File:8: attempt to index a nil value (global 'winfile')
                                      stack traceback:
                                          File:8: in function <File:3>
                                      Lua 5.3.4  Copyright (C) 1994-2017 Lua.org, PUC-Rio
                                      
                                      1 Reply Last reply Reply Quote 0
                                      • P
                                        patrickdrd
                                        last edited by Sep 23, 2018, 8:25 AM

                                        lua script implementation works fine with 7.5.8

                                        1 Reply Last reply Reply Quote 1
                                        • S
                                          SalviaSage
                                          last edited by Sep 23, 2018, 1:45 PM

                                          It does, but this particular code does not work for me as of this date. I fear windows OS might have changed something, since this script calls something from the OS.

                                          npp.AddEventHandler({"OnSave", "OnSwitchFile", "OnLangChange"}, function()
                                              -- Make sure it is a "real" file first
                                              if npp:GetCurrentDirectory() == "" then
                                                  return
                                              end
                                          
                                              local text = npp.LanguageDescription[npp.BufferLangType[npp.CurrentBufferID]] .. " - " .. os.date('%d/%m/%Y %H:%M', winfile.attributes(npp:GetFullCurrentPath(), "modification"))
                                              npp.StatusBar[STATUSBAR_DOC_TYPE] = text
                                          end)
                                          
                                          1 Reply Last reply Reply Quote 0
                                          • First post
                                            Last post
                                          The Community of users of the Notepad++ text editor.
                                          Powered by NodeBB | Contributors