Re: [Lazarus] help needed making an ide extension
On Do, 2015-08-13 at 01:06 +0200, Mattias Gaertner wrote: On Thu, 13 Aug 2015 00:06:34 +0200 Marc Santhoff m.santh...@web.de wrote: [...] Good example. I do not fully understand the creation mechanism. I see an extra register procedure in frmexploremenu.pas that actually sets the menu entry. I thought a constructor of the extension class would be called. But since it is a modal form that is done by execution of the menu code. Instead there is a notify event FormCreate(), where is that one called? Is it done that way by convention? Did I miss some piece of documentation? It is set by the lfm, which is parsed in the forms constructor. I see, time to activate some code in the IDE instead of only reading it. [...] It opens all forms of the project. OK, not what I want. What strategy can be used to get a list of forms in the users project without having to open them all? If you need the list of all units with designer, you can simply search for lfm files. If you want only specific classes, you have to check each lfm. Simple and effective. Beautiful. [...] Afterwards, will the new component created and have owner, parent and essential properties set and then added, like I would do in any other program creating components in code at runtime or is there another way (sth. like IDEDoCreateComponetntAndAdd(newcomponent.class))? Maybe such a function can be added to the IDEIntf. In principle making something like designer/designer.pp TDesigner.MouseUpOnControl AddComponent publicly available would suffice. It needs various parameters: ComponentClass ParentComponent Left,Top, Optional: Width,Height Optional: Name Would that suffice? From my POV it would, although I'm not the most experienced extension developer. ;) Can you give some more details what you are trying to achieve? I'm only learning how to do basic actions. Playing around, that is. Currently it is planned to show a list of available forms and let the user select one. Then he would select the parent component for one or more new components to insert. Just an idea: Why not select the form and parent component, by right clicking on the parent component and start the wizard via a menu item in the popup menu? Neat, would save some dialog space and maybe one step. For usability there should be a menu item at the standard location, but that's another question. Thanks again, Marc -- Marc Santhoff m.santh...@web.de -- ___ Lazarus mailing list Lazarus@lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
Re: [Lazarus] help needed making an ide extension
On Thu, 13 Aug 2015 00:06:34 +0200 Marc Santhoff m.santh...@web.de wrote: [...] Good example. I do not fully understand the creation mechanism. I see an extra register procedure in frmexploremenu.pas that actually sets the menu entry. I thought a constructor of the extension class would be called. But since it is a modal form that is done by execution of the menu code. Instead there is a notify event FormCreate(), where is that one called? Is it done that way by convention? Did I miss some piece of documentation? It is set by the lfm, which is parsed in the forms constructor. [...] It opens all forms of the project. OK, not what I want. What strategy can be used to get a list of forms in the users project without having to open them all? If you need the list of all units with designer, you can simply search for lfm files. If you want only specific classes, you have to check each lfm. [...] Afterwards, will the new component created and have owner, parent and essential properties set and then added, like I would do in any other program creating components in code at runtime or is there another way (sth. like IDEDoCreateComponetntAndAdd(newcomponent.class))? Maybe such a function can be added to the IDEIntf. In principle making something like designer/designer.pp TDesigner.MouseUpOnControl AddComponent publicly available would suffice. It needs various parameters: ComponentClass ParentComponent Left,Top, Optional: Width,Height Optional: Name Would that suffice? Can you give some more details what you are trying to achieve? I'm only learning how to do basic actions. Playing around, that is. Currently it is planned to show a list of available forms and let the user select one. Then he would select the parent component for one or more new components to insert. Just an idea: Why not select the form and parent component, by right clicking on the parent component and start the wizard via a menu item in the popup menu? All done from a modal form, and if feasible it will evolve to some sort of multi step wizard or assistant dialog triggering complex actions. Mattias -- ___ Lazarus mailing list Lazarus@lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
Re: [Lazarus] help needed making an ide extension
On Wed, 12 Aug 2015 21:16:22 +0200 Marc Santhoff m.santh...@web.de wrote: [...] 1. Is it correct that to make an extension basically all I have to do is write the code that - adds a menu entry for starting the code - save it as a lazarus package and check register in ide (or the like ;) and that's the basis for doing something useful? Yes, see for example examples/exploremenu. 2. When I want the user to select a form for the ide expert to work on, a list of available forms is needed. Is iterating over all the projects files and getting the form of a file the right way to go? It depends on what you mean with available. For example a project can also access the forms of packages. Additionally if yes: The code there: http://wiki.lazarus.freepascal.org/Extending_the_IDE#Get_unit.2C_designer.2C_form_of_a_file looks OK, but doesn't it open all the files of a project? It opens all forms of the project. And does // get form aForm:=aDesigner.Form; give NIL if the file has no form? aDesigner will be nil. 3. How do I create a new component on a form? For doing so one would need at least a reference to the active form and second a reference to the active component to use as parent. Adding a component can be complex. See designer/designer.pp TDesigner.MouseUpOnControl AddComponent. Afterwards, will the new component created and have owner, parent and essential properties set and then added, like I would do in any other program creating components in code at runtime or is there another way (sth. like IDEDoCreateComponetntAndAdd(newcomponent.class))? Maybe such a function can be added to the IDEIntf. Can you give some more details what you are trying to achieve? If there is an example doing all of this stuff, please point me there. After browsing some intresting names in lazarus/examples I haven't found what's missing. Mattias -- ___ Lazarus mailing list Lazarus@lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
Re: [Lazarus] help needed making an ide extension
On Mi, 2015-08-12 at 23:17 +0200, Mattias Gaertner wrote: On Wed, 12 Aug 2015 21:16:22 +0200 Marc Santhoff m.santh...@web.de wrote: [...] 1. Is it correct that to make an extension basically all I have to do is write the code that - adds a menu entry for starting the code - save it as a lazarus package and check register in ide (or the like ;) and that's the basis for doing something useful? Yes, see for example examples/exploremenu. Good example. I do not fully understand the creation mechanism. I see an extra register procedure in frmexploremenu.pas that actually sets the menu entry. I thought a constructor of the extension class would be called. But since it is a modal form that is done by execution of the menu code. Instead there is a notify event FormCreate(), where is that one called? Is it done that way by convention? Did I miss some piece of documentation? 2. When I want the user to select a form for the ide expert to work on, a list of available forms is needed. Is iterating over all the projects files and getting the form of a file the right way to go? It depends on what you mean with available. For example a project can also access the forms of packages. Available means all forms the user has created in his own lazarus project. He will want to place components there and forms from foreign packages are r/o, me thinks. Except when actively working on an opened package. Hmm, you're right, not easy to distinguish which is which. Additionally if yes: The code there: http://wiki.lazarus.freepascal.org/Extending_the_IDE#Get_unit.2C_designer.2C_form_of_a_file looks OK, but doesn't it open all the files of a project? It opens all forms of the project. OK, not what I want. What strategy can be used to get a list of forms in the users project without having to open them all? And does // get form aForm:=aDesigner.Form; give NIL if the file has no form? aDesigner will be nil. OK. 3. How do I create a new component on a form? For doing so one would need at least a reference to the active form and second a reference to the active component to use as parent. Adding a component can be complex. See designer/designer.pp TDesigner.MouseUpOnControl AddComponent. Uff. Lots of safety belts, some tricky looking code for calculating bounds, but in general it answers my question. Seems to be necessary to inform the IDE about changing the form. Afterwards, will the new component created and have owner, parent and essential properties set and then added, like I would do in any other program creating components in code at runtime or is there another way (sth. like IDEDoCreateComponetntAndAdd(newcomponent.class))? Maybe such a function can be added to the IDEIntf. In principle making something like designer/designer.pp TDesigner.MouseUpOnControl AddComponent publicly available would suffice. Can you give some more details what you are trying to achieve? I'm only learning how to do basic actions. Playing around, that is. Currently it is planned to show a list of available forms and let the user select one. Then he would select the parent component for one or more new components to insert. All done from a modal form, and if feasible it will evolve to some sort of multi step wizard or assistant dialog triggering complex actions. Many thanks, Marc -- Marc Santhoff m.santh...@web.de -- ___ Lazarus mailing list Lazarus@lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus
[Lazarus] help needed making an ide extension
Hi, I'd like to try building an extension to Lazarus. After reading a lot of http://wiki.lazarus.freepascal.org/Extending_the_IDE#See_also I think I'm starting to understand how this can be done. But some questions are left open: 1. Is it correct that to make an extension basically all I have to do is write the code that - adds a menu entry for starting the code - save it as a lazarus package and check register in ide (or the like ;) and that's the basis for doing something useful? 2. When I want the user to select a form for the ide expert to work on, a list of available forms is needed. Is iterating over all the projects files and getting the form of a file the right way to go? Additionally if yes: The code there: http://wiki.lazarus.freepascal.org/Extending_the_IDE#Get_unit.2C_designer.2C_form_of_a_file looks OK, but doesn't it open all the files of a project? And does // get form aForm:=aDesigner.Form; give NIL if the file has no form? 3. How do I create a new component on a form? For doing so one would need at least a reference to the active form and second a reference to the active component to use as parent. Afterwards, will the new component created and have owner, parent and essential properties set and then added, like I would do in any other program creating components in code at runtime or is there another way (sth. like IDEDoCreateComponetntAndAdd(newcomponent.class))? If there is an example doing all of this stuff, please point me there. After browsing some intresting names in lazarus/examples I haven't found what's missing. TIA, Marc -- Marc Santhoff m.santh...@web.de -- ___ Lazarus mailing list Lazarus@lists.lazarus.freepascal.org http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus