/** \page codeNodes Code Nodes Overview of code nodes. \section function Functions and Methods ![](flFunction.png) Functions Fluid can generate C functions, C++ functions, and methods in classes. Functions can contain widgets to build windows and dialogs. *Code* nodes can be used to add more source code to a function. ### Parents ### To generate a function, the function node must be created at the top level or inside a declaration block. If added inside a class node, this node generates a method inside that class. ### Children ### Function nodes can contain code nodes and widget trees. The topmost node of a widget tree must be a window. If the function node has no children, only a forward declaration will be created in the header, but no source code will be generated. \image html flFunctionDialog.png "Function/Method Properties" \image latex flFunctionDialog.png "Function/Method Properties" ## Declaring a Function ## A function node at the top level or inside a declaration block generates a C or C++ function. The *Name* field contains the function name and all arguments. If the *Name* field is left empty, Fluid will generate a typical 'main()' function. ``` // .cxx int main(int argc, char **argv) { /* code generated by children */ w->show(argc, argv); /* <-- code generated if function has a child widget */ Fl::run(); } ``` If a function node has a name but no children, a forward declaration is generated in the header, but the implementation in the source file is omited. This is used to reference functions in other modules. ``` // .h void make_window(); ``` If the function contains one or more Code nodes, an implementation will also be generated. The default return type is `void`. Text in the *Return Type* field overrides the default type. ``` // .cxx void make_window() { /* code generated by children */ } ``` If the function contains a widget, a pointer to the first widget will be created. The default return type will match the type of the first widget, and a pointer to the widget will be returned. ``` // .h Fl_Window* make_window(); ``` ``` // .cxx Fl_Window* make_window() { Fl_Window* w; /* code generated by children: * w = new Fl_Window(...) */ return w; } ``` ### Options for Functions ### Choosing *static* in the pulldown menu will declare the function `static` in the source file. No prototype will be generated in the header. ``` // .cxx static Fl_Window* make_window() { ... ``` If the *C* option is checked, the function will be declared as a plain C function in the header file. The options *local* and *C* together are not supported. ``` // .h extern "C" { void my_plain_c_function(); } ``` ## Declaring a Method ## A function node inside a class node generates a C++ method. If a method node has no children, the declaration is generated in the header, but no implementation in the source file. ``` // .h class UserInterface { public: void make_window(); }; ``` If the method contains one or more Code nodes, an implementation will also be generated. ``` // .cxx void UserInterface::make_window() { printf("Hello, World!\n"); } ``` If the method contains at least on widget, a pointer to the topmost widget will be returned and the return type will be generated accordingly. ``` // .h class UserInterface { public: Fl_Double_Window* make_window(); }; ``` ``` // .cxx Fl_Double_Window* UserInterface::make_window() { Fl_Double_Window* w; /* code generated by children */ return w; } ``` ### Options for Methods ### Class access can be defined with the pulldown menu. It provides a choice of `private`, `protected`, and `public`. Fluid recognizes the keyword `static` or `virtual` at the beginning of the *return type* and will generate the declaration including the keyword, but will omit it in the implementation. The return type defaults still apply if there is no text after the keyword. ### Further Options ### Users can define a comment text in the *comment* field. The first line of the comment will be shown in the widget browser. The comment text will be generated in the source file ahead of thefunction. ``` // .cxx /* My multilen comment will be here */ Fl_Window* make_window() { ``` Fluid recognizes default values in the argument list and geneartes them in the declaration, but omits them in the implementation. A short function body can be appended in the *Name* field. With no child, this creates an inlined function in the header file. \section code C Source Code ![](flCode.png) Code ...write me. \section codeblock Code Block \section declaration Declaration \section declarationblock Declaration Block \section class Classes \section widgetclass Widget Class \section comment Comments \section inlineddata Inlined Data */