Community
    • Login

    My first plugin development: CollectionInterface [was: Need help with getting started using C++ Plugin Template]

    Scheduled Pinned Locked Moved Notepad++ & Plugin Development
    67 Posts 8 Posters 2.4k 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.
    • CoisesC
      Coises @PeterJones
      last edited by Coises

      @PeterJones said in Need help with getting started using C++ Plugin Template:

      If the plugin has a dialog which will enable you to download a file with a DOWNLOAD button, but the user might want to do more than one dialog in a row (for example, if you want to grab a UDL file and then its FL)

      Consider using a List Box or a List View instead of a Combo Box. If you make it multi-selection, the user can highlight everything wanted at once and then click a button to download and relaunch. (That would be similar to the Plugins Admin… though I would not recommend putting the Install button at the top!)

      Drop-downs can be annoying when you’re trying to select from a long list. They save space, but when there’s nothing much else in the dialog, you could display enough items at once in a List Box to make it easier for a user to scroll through, even if you make it single selection.

      I’m pretty sure List Box is no more complex to use than Combo Box (aside from processing multiple selections, if you allow that). I don’t recall using a List View, but it does look like a bit more work.

      1 Reply Last reply Reply Quote 1
      • Lycan ThropeL
        Lycan Thrope @PeterJones
        last edited by Lycan Thrope

        @PeterJones ,
        This is kind of unfair, as you’ve already seen my clunky interface for the dBASE UDL installer. :-)

        That aside, considering that, like the dBASE UDL, it’s really considered a package if you have all those files for the same language so it would make sense that the user should just pick the UDL they want to download, and your plugin would pick all the files needed for that package. This, of course, would be dependent on your application being aware of the files needed for it…and my guess is that since you’re trying to set it up to pull from the UDL repository, it would make sense that the repository have some kind of mechanism for the plugin to be able to read that mechanism’s connection of the different files for that language and be able to use that to collect all the relevant files for download at once.

        Just my input, as it would seem to really simplify the process of getting UDL languages installed into Notepad++, so folks like me wouldn’t have to write their own installers to get the right files into the right directories. This is especially important if you have more than just a UDL definition, and also create the other files (functionList, autoCompletion, light and dark modes), because the problem is that they are all named the same, and hence, the need to have an installer.

        I’ll try your plugin and see if I can help or not.

        Edit:
        If you’d like, I can send you my code that I used for the dBASE UDL installer, so you can see what I had to do to first identify if there is a standard system directory to install to, if there is no standard directory at which point they’d need to point to where the portable directory is, and if there is a cloud directory for either version. It’s in the dBASE language, but it’s a fairly easy language to read, to figure it out.

        PeterJonesP 1 Reply Last reply Reply Quote 0
        • PeterJonesP
          PeterJones @Lycan Thrope
          last edited by PeterJones

          @Coises ,

          Consider using a List Box

          I will keep the Category as a dropdown (since there are only 4), but yeah, it makes sense to make the file list a List Box.

          @Lycan-Thrope,

          it would make sense that the repository have some kind of mechanism for the plugin to be able to read that mechanism’s connection of the different files

          Yeah, there’s the JSON which has the information for 3 of the 4 file types (because Themes are a separate repo and not attached to the UDL). So it should be doable to automatically download all the appropriate files for a UDL (though I might make that be an option, because someone might want to just grab the updated UDL, without overwriting their previously-customized FunctionList, for example).

          If you’d like, I can send you my code that I used for the dBASE UDL installer, so you can see what I had to do to first identify if there is a standard system directory to install to, if there is no standard directory at which point they’d need to point to where the portable directory is, and if there is a cloud directory for either version. It’s in the dBASE language, but it’s a fairly easy language to read, to figure it out.

          I don’t see a reason for that, for me. NPPM_GETNPPDIRECTORY tells you where notepad++.exe is for the current instance, which is the only parent directory for autoCompletion\. And NPPM_GETPLUGINSCONFIGDIR, which tells you where Notepad++ Plugins\Config is, which is relative to %AppData% for standard, relative to notepad++.exe for local, and should* be relative to CloudDirectory or -settingsDir if one of those options is chosen.

          Your installer needs the more complicated code, because you are running outside of Notepad++ environment, but the plugin should have access to all the information it needs to put the files in the right location.

          Lycan ThropeL 1 Reply Last reply Reply Quote 1
          • Lycan ThropeL
            Lycan Thrope @PeterJones
            last edited by Lycan Thrope

            @PeterJones said in Need help with getting started using C++ Plugin Template:

            Yeah, there’s the JSON which has the information for 3 of the 4 file types (because Themes are a separate repo and not attached to the UDL). So it should be doable to automatically download all the appropriate files for a UDL (though I might make that be an option, because someone might want to just grab the updated UDL, without overwriting their previously-customized FunctionList, for example).

            Good point, as that would be an option, as I am probably going to need that for when I update the dBASE UDL definitions for all the versions that I’m working on now, to make more of the language color configurable for users via the UDL defintion dialog by including builtin functions/commands that they can custom color as well as, if I organize it well, leave a Keywords box open so they can put their own function definitions in it separate from the standard ones.
            Just an FYI, the light and dark modes are actual languages in the different versions, not themes.

            @PeterJones said in Need help with getting started using C++ Plugin Template:

            I don’t see a reason for that, for me. NPPM_GETNPPDIRECTORY tells you where notepad++.exe is for the current instance, which is the only parent directory for autoCompletion. And NPPM_GETPLUGINSCONFIGDIR, which tells you where Notepad++ Plugins\Config is, which is relative to %AppData% for standard, relative to notepad++.exe for local, and should* be relative to CloudDirectory or -settingsDir if one of those options is chosen.

            Your installer needs the more complicated code, because you are running outside of Notepad++ environment, but the plugin should have access to all the information it needs to put the files in the right location.

            Which, if I was somewhat able to code in C++, using the NPP plugin would have made my life simpler then, at least from the installer perspective. :-)

            1 Reply Last reply Reply Quote 0
            • CoisesC
              Coises @PeterJones
              last edited by

              @PeterJones said in Need help with getting started using C++ Plugin Template:

              would you prefer:

              1. After hitting DOWNLOAD for the first file, the dialog closes itself, so you have to re-run the Plugin command to get the next file
              2. After hitting DOWNLOAD for the first file, when it’s done, it pops up a MessageBox to inform you it’s done, and you can go immediately get another file from the same dialog
              3. After hitting DOWNLOAD for the first file, when it’s done, it changes a status bar on that dialog to indicate that it’s complete
              4. Other ideas (the less complicated, the better)

              I would do the reverse of 2: raise a dialog box while the content is downloading, then close it when the download is finished. I looked just briefly at your project; since you’re using an asynchronous interface (wininet) you should be able to put a cancel button on the downloading dialog. (Progress would be more work; I’d guess these files are small enough that it wouldn’t be necessary?)

              You could still put up a status message showing the last thing that happened (downloaded, or download cancelled or failed) and the item name.

              Your button layout is non-standard. It’s allowed, but might confuse users. The rightmost button is usually Cancel or Close. (No real difference, but Cancel usually goes with a single-use OK, whereas Close usually goes with a dialog that has other options and stays open after one or more of them.)

              The Restart button leaves me wondering if it means “Download what I have selected and then restart” or “Restart without downloading anything (more).”

              If it means just Restart, I would put it to the far left and disable it until at least one file has been downloaded successfully, and put the Download button just to the left of the Close button, disabled until there is a valid selection.

              If it means download and restart… then it’s more like an OK button. In that case, I suppose I would put Download to the far left, but really consider the multiple selection option.

              A possibility would be to just have Download/Close (if you only want one selection at a time) or OK/Cancel (for multiple selections). Then, upon Close (if at least one file has been downloaded) or OK, raise another dialog asking whether the user wants to restart.

              Lycan ThropeL PeterJonesP 2 Replies Last reply Reply Quote 1
              • Lycan ThropeL
                Lycan Thrope @Coises
                last edited by Lycan Thrope

                @Coises said in Need help with getting started using C++ Plugin Template:

                The Restart button leaves me wondering if it means “Download what I have selected and then restart” or “Restart without downloading anything (more).”

                If it means just Restart, I would put it to the far left and disable it until at least one file has been downloaded successfully, and put the Download button just to the left of the Close button, disabled until there is a valid selection.

                I believe it’s to restart Notepad++, to allow for the UDL/Themes to be able to be active, is what it means, this of course would mean that it’s going to close the dialog of the Plugin as well.

                1 Reply Last reply Reply Quote 0
                • Lycan ThropeL
                  Lycan Thrope @PeterJones
                  last edited by

                  @PeterJones said in Need help with getting started using C++ Plugin Template:

                  alpha testing

                  For those interested in alpha testing, the copy at https://github.com/pryrt/NppPlugin-CollectionInterface should now have all features implemented, though it definitely needs error handling improvements (right now, it will throw uncaught exceptions)

                  Well, I probably did something wrong, but this is what I got after building your .dll in VS2022, and then creating the directory in the Programs\Notepad++\Plugins\CollectionInterface directory and copying the CollectionInterface.dll into it and trying to start NPP.

                  StartNPPErrorAfterInstall.PNG

                  StartNPPErrorAfterInstall2.PNG

                  Like I said, it might be me, all I did was clone your github directory to my github desktop directories and ran VS 2022, went to that directory as a project in it and then hit build. Not sure if it’s a program error, mine or not compatible with 8.7.7, which my current standard install is at. I’ll try it in one of my portable RC’s if that matters.

                  PeterJonesP 2 Replies Last reply Reply Quote 1
                  • PeterJonesP
                    PeterJones @Lycan Thrope
                    last edited by PeterJones

                    @Lycan-Thrope ,

                    Per MS Learn > GetTempPath2W(), that function is in Kernel32.dll, so I cannot see why it wouldn’t be found for you. [update: see next reply]

                    Are you sure you were building the 64bit DLL for the 64bit Notepad++?

                    Because I didn’t do anything special other than linking the Plugins\CollectionInterface directory to the VS build output (as described above), along with setting the run command to use my normal Notepad++ (also mentioned above). It works for me when I run it either from the VS Run button, or when I just manually run Notepad++ normally.

                    Mine is v8.7.5, but I don’t see how anything I’ve coded would be NPP-version dependent

                    1 Reply Last reply Reply Quote 0
                    • PeterJonesP
                      PeterJones @Lycan Thrope
                      last edited by

                      @Lycan-Thrope ,

                      The same MS Learn page mentioned at the bottom:

                      Requirement	Value
                      Minimum supported client	Windows 11 Build 22000
                      Minimum supported server	Windows Server 2022 Build 20348
                      Header	fileapi.h (include Windows.h)
                      Library	Kernel32.lib
                      DLL	Kernel32.dll
                      

                      I hadn’t previously noticed that. I just saw that GetTempPathW told me to use GetTempPath2W instead.

                      Try changing from GetTempPath2() to GetTempPath() (which has been around since WinXP, If that fixes it, I will update the repo tomorrow.

                      Lycan ThropeL 4 Replies Last reply Reply Quote 0
                      • Lycan ThropeL
                        Lycan Thrope @PeterJones
                        last edited by

                        @PeterJones ,
                        Looking for it now, but it appears to only show up in system files using the Code Search, and I don’t want to change VS2022 files…will change it when I find it in your code.

                        1 Reply Last reply Reply Quote 0
                        • Lycan ThropeL
                          Lycan Thrope @PeterJones
                          last edited by

                          @PeterJones ,
                          Okay, that fixed it.
                          ROFLMAO, I couldn’t find out how to use VS 2022 search to just find the file it was in, so I had to use Notepad++ Search in file feature to find it in the right .cpp file. God you got to love Notepad++ for it’s simplicity and funtionality.

                          I may not be familar with VS 2022…but searching for code shouldn’t start at the libraries and never mention the opened code folder where it is. Sheesh.

                          Now to check out your handy work…remember, we all aren’t using Win 11. :-)

                          1 Reply Last reply Reply Quote 0
                          • Lycan ThropeL
                            Lycan Thrope @PeterJones
                            last edited by

                            @PeterJones ,
                            It worked beautifully. I was able to download my dBASE UDL files, and install them in the right directories. The only problem, is that the Autocomplete and Functionlist aren’t functional because of the lack of linkage via the overrideMap.xml file, that didn’t include the association. That’s the only remaining issue, of automating it completely. :-)

                            1 Reply Last reply Reply Quote 0
                            • Lycan ThropeL
                              Lycan Thrope @PeterJones
                              last edited by Lycan Thrope

                              @PeterJones ,
                              One other thing, is that the names have to be consistent, and mine were all over the place. The file internal names (for the UDL definition) and the names in the autoCompletion and functionList and the overrideMap.xml file. That’s the weak spot at this point, is being able to keep the names consistent between the internal file name and the rest. I only did the Light version and had to modify all of them, because the long names in the repository, don’t match the names needed in the rest of the linkages needed for the files. At least, mine. :-)

                              Other than that…where was this thing when I needed it. I could have focused more on the things I’m trying to do now with the UDL, but had to write the darn installer because of the namings required. :-)
                              I’m going to have to look at your code and stuff now, so maybe I can learn from it as it’s apparently something I’m interested in.

                              PeterJonesP 1 Reply Last reply Reply Quote 0
                              • PeterJonesP
                                PeterJones @Coises
                                last edited by

                                @Coises,

                                might confuse users. The rightmost button is usually Cancel or Close

                                I knew that, but since RESTART N++ is “even more close than CLOSE” – it’s a more drastic “exit this dialog”, since it also exits and restarts the application, so I thought that it might be more logical to be further right than the DONE. I’ll probably reorder and rename to DOWNLOAD, RESTART N++, and CLOSE (instead of DONE)

                                if it means “Download what I have selected and then restart” or “Restart without downloading anything (more).”

                                Odd, I wasn’t expecting any confusion, especially since the instructions in the dialog explain why you would need to RESTART. I’ll definitely have the README explain things in more detail, but maybe I’ll add a HELP interface of some sort.

                                If it means just Restart, I would put it to the far left and disable it

                                I like the idea of disabling it… But putting it on the far left doesn’t make sense to me, because the primary action of the dialog is to DOWNLOAD, and I tend to think of the buttons as being layed out left-to-right in the order they would be used: since you would DOWNLOAD first, it would be leftmost, and then you would either RESTART or CLOSE, depending on your preferences, so those would go to the right. What’s your reasoning for putting the RESTART on the left?

                                really consider the multiple selection option

                                We’ll see. Doing the automatic or at least optional “also download AC and/or FL when you download the UDL” makes sense to me… but I’m not as certain about downloading multiple UDLs at the same time.

                                since you’re using an asynchronous interface (wininet) you should be able to put a cancel button on the downloading dialog. (Progress would be more work; I’d guess these files are small enough that it wouldn’t be necessary?)

                                With the downloading happening self-contained in a method on the object, rather than being inside the dialog-handler, I’m not sure of an easy way to signal the class/method to stop the download. Progress, in my mind, would be easier, because if I just passed the control for the progress bar as an argument to the download method, it could send the right signals at appropriate times. But we’ll see what I can figure out.

                                CoisesC 2 Replies Last reply Reply Quote 0
                                • PeterJonesP
                                  PeterJones @Lycan Thrope
                                  last edited by PeterJones

                                  @Lycan-Thrope said in Need help with getting started using C++ Plugin Template:

                                  @PeterJones ,
                                  One other thing, is that the names have to be consistent, and mine were all over the place.

                                  yes, that does get confusing. And I’ve just realized that I might have to work on the autoCompletion naming, because I think I’m basing it off the JSON’s “id-name” field (ie, the UDL’s filename) rather than basing it off the JSON’s “display-name” field (which is what Notepad++ calls the UDL, and what I understand the autoCompletion feature needs for file naming on UDLs; I’ll have to double-check.[*]

                                  The file internal names (for the UDL definition) and the names in the autoCompletion and functionList and the overrideMap.xml file.

                                  The functionList requires the overrideMap update. If named correctly, autoCompletion should “just work” (though “if named correctly” is a big caveat; see my previous paragraph in this reply ;-))

                                  Other than that…where was this thing when I needed it.

                                  Just an idea at the back of my mind, at that point. Sorry I’m not a time traveler. ;-)


                                  [*] update: yes, AC files must match the “display-name” (ie, the <UserLang name="XYZPDQ" ... name); I need to update the CONTRIBUTING.md to make that clear, and eventually update the automatic checks run on the repo so that any AC filename must match its associated UDL actual-name. Yay, another thing for my growing TODO list on this project. ;-)

                                  Lycan ThropeL 1 Reply Last reply Reply Quote 2
                                  • CoisesC
                                    Coises @PeterJones
                                    last edited by Coises

                                    @PeterJones said in Need help with getting started using C++ Plugin Template:

                                    What’s your reasoning for putting the RESTART on the left?

                                    (All these things are just thoughts from someone who is merely looking at your writing and images and hasn’t used the program or tried to implement any part of its function. If my tone sounds a little know-it-all, please accept my apology in advance; it gets unreadable to qualify everything with “I think maybe, if you like the idea”; but I’m really not trying to say everything should be the way I say, even if succinctness sometimes makes it sound that way.)

                                    Usually dialogs which you call up via a command either show requested information, let you specify changes and then either OK or Cancel them, or let you make changes “live” and then Close them.

                                    In all those cases, when the dialog closes, you are (in some sense) back where you started when you opened it. The buttons at the bottom in the center or at the right of a dialog usually represent actions within that flow.

                                    Closing and restarting the host program is a more drastic action than one normally associates with a dialog. Buttons don’t usually go on the left; when you see one there, you know (maybe subconsciously) that something is different about that button.

                                    However, the more I think about it, the more I would recommend just the two buttons — Download and Close — and then raise an message box after the user closes your dialog if anything was downloaded. (Users are more used to a message box — if it appears when the action they took didn’t represent the intent to raise a dialog — indicating something unusual happened, will happen or might happen depending on their choice.) In that separate step, tell the user the changes won’t take effect until Notepad++ is restarted and ask whether to do that now. (Yes or No, No should be the default.)

                                    (This isn’t something people are going to do often, so clarity is more important than keystroke efficiency.)

                                    I will keep the Category as a dropdown (since there are only 4), but yeah, it makes sense to make the file list a List Box.

                                    If there are only four categories, and they are always the same, and the names are short, consider radio buttons. (Or tabs: not a true tabbed dialog, since the content would be always the same single list box populated with different data; just the visual appearance. I haven’t used one in a while, but if memory serves the Tab Control itself is really just like a group box with a selector on top; what you put in the box is your business. If I did that, I would also put the Download button in the tab box, under the list box, with the close button below and outside the tab box.)

                                    Edit to add: Roughly, like this:

                                    17dd5f08-946e-4399-ab41-baded1cb055f-image.png

                                    Lycan ThropeL 1 Reply Last reply Reply Quote 1
                                    • Lycan ThropeL
                                      Lycan Thrope @PeterJones
                                      last edited by

                                      @PeterJones said in Need help with getting started using C++ Plugin Template:

                                      [*] update: yes, AC files must match the “display-name” (ie, the <UserLang name=“XYZPDQ” … name); I need to update the CONTRIBUTING.md to make that clear, and eventually update the automatic checks run on the repo so that any AC filename must match its associated UDL actual-name. Yay, another thing for my growing TODO list on this project. ;-)

                                      Now you know how I felt making the UDL. I had to figure out how to implement the features everyone wanted, via the Notepad++ features and learn how to do it, then learn the hard way that the naming matters, and then write the installer because people had problems figuring out which dbaseplus.xml (UDL, functionList & autoCompletion) file went into which directory, then try and explain how to modify the overrideMap.xml file, and then depending on if they had a standard, portable and/or cloud install, and then write the installer to handle it all. I know your angst, believe me. :-)

                                      And your herculean efforts are appreciated for sure by me for my future works, considering you can’t time travel. :-) So Thanks!

                                      1 Reply Last reply Reply Quote 0
                                      • Lycan ThropeL
                                        Lycan Thrope @Coises
                                        last edited by

                                        @Coises ,
                                        I can understand your point about upon having a popup appear when the user tries closing the dialog box, alerting them that their changes won’t take effect until NPP is rebooted, so you’re putting the responsibility on to the user…which by the way, is counter to the way the Plugin Admin itself does things.

                                        PluginDialogShutdown.PNG

                                        It does the reboot, the same as @PeterJones plugin does, which is what I would expect when I’m required to reboot after completion, also just like Windows own update process requires. This might be the only change needed for the reboot procedure, but other than that, for a rough first version, it’s fine for me…I read directions. Sometimes not as well as I should, but I do read them. :-)

                                        1 Reply Last reply Reply Quote 0
                                        • CoisesC
                                          Coises @PeterJones
                                          last edited by

                                          @PeterJones said in Need help with getting started using C++ Plugin Template:

                                          @Coises,

                                          since you’re using an asynchronous interface (wininet) you should be able to put a cancel button on the downloading dialog. (Progress would be more work; I’d guess these files are small enough that it wouldn’t be necessary?)

                                          With the downloading happening self-contained in a method on the object, rather than being inside the dialog-handler, I’m not sure of an easy way to signal the class/method to stop the download. Progress, in my mind, would be easier, because if I just passed the control for the progress bar as an argument to the download method, it could send the right signals at appropriate times. But we’ll see what I can figure out.

                                          My apologies. I also used wininet, but forgot that asynchronous operation is an option, not the only way it works. I see from your code that you are operating synchronously. I think passing a progress bar control couldn’t work, because if you’re operating synchronously, the message loop doesn’t run until you return. You can update the control, but the change won’t be displayed because the message loop never gets control to update the display.

                                          1 Reply Last reply Reply Quote 0
                                          • PeterJonesP
                                            PeterJones
                                            last edited by

                                            Next GUI opinion: if I’m going to make the “download AutoCompletion/FunctionList at same time as UDL” optional, I’ll want checkboxes.

                                            Should they go on the left or right?

                                            2464c4cb-efd3-4202-a213-e038ccf71a48-image.png

                                            My plan is to disable the checkbox for a given UDL if the UDL doesn’t have the corresponding AC or FL. And on the AC, FL, and Theme tabs, the checkboxes will be hidden completely (but the Download button will still be in the same place).

                                            CoisesC Lycan ThropeL 2 Replies Last reply Reply Quote 3
                                            • First post
                                              Last post
                                            The Community of users of the Notepad++ text editor.
                                            Powered by NodeBB | Contributors