New in version 9.0.0


You can find information about existing projects upgrading in the article Upgrade project.

  • New global features

    • Integration with Visual Studio. You can install Nitisa as Visual Studio extension and use its project and form templates for even faster project creation. Form Builder is also integrated into Visual Studio in this case.
    • Integration with Linux operating systems. Platform classes have been added for Linux platforms. From now on you can use all power of Nitisa for developing applications targeted Linux operating system.

    New widgets

    Form Builder

    • Feature: overwrite include header file name on creating form prototype header file.
    • Feature: overwrite namespace on creating form prototype header file.
    • Feature: chose widgets visibility in form prototype header file.
    • Feature: generate widgets getters in form prototype header file.
    • Feature: settings can now be saved both globally and in form file.
    • Feature: form prototype constructor has got new(3rd) argument called class_name so you can set your form class name. By default it has the same value as the Name property you give your form in the Form Builder.
    • Feature: Form Editor is now highlighed when focused.
    • Feature: form can be exported as widget and be used as dialog box.
    • Feature: {type} placeholder in form name. You can use it to replace with Form or DialogBox depending on whether form is being exported as regular standalone form or as dialog box.
    • Improvement: inline text input properties in property editor are now properly scrolled when activating property after another property which has been scrolled.
    • Improvement: when a property editing modal dialog appears for most properties it activates first input widget and selects all in it to simplify and make faster property editing experience.
    • Improvement: Form Builder was re-created using Form Builder. Its forms can now be modified visually.
    • Fix: form's property called HasHasDialogFrame was changed to HasDialogFrame(extra Has has been removed).
    • Fix: form's ClientSize property was not exported in form prototype header file when it was not changed and thus form size was not correct. Now it is being exported all the time.
  • Fixed

    • Error in ForexChart widget when using automatical data range calculation appeared due to too big floating point values when converting time points to it.
    • Wrong scroll visibility property names in TreeView widget.
    • OnMouseLeave event was not called when detaching control from form in CForm class.
    • If there is modal control on form, only the control and its children can be hovered. UpdateHoveredControl() method of form implementation in CForm class has been adjusted.
    • Remove unnecessary check if control is on a form when assigning it to another control in UpDown and UpDownEx widgets.
    • FindDialog and ReplaceDialog widgets' Execute() method show search/replace interface in non-modal mode. It was shown in modal mode before.
    • Accessing non constant operator [] to get pixel data when constant image was drawing in Image widget.
    • Setting handle to empty at platform window destruction before calling form's listener corresponding method in CWindow class which sometimes caused incorrect renderer behaviour in multi form applications.
    • Top line(at the center of caption) on the GroupBox widget sometimes was barely visible.
    • Rendering of list items from Standard package caused by missing rounding of text position.
    • Using bitmasks in polygons rendering methods of Windows CRenderer and Android CRenderer OpenGL renderer classes.
    • Building rotation around Z-axis, perspective, and orthographic matrices in Matrix class.
    • Building rotation around Z-axis, perspective, and orthographic matrices in TMat4 template.
    • Building rotation around Z-axis matrix in TMat2 and TMat3 templates.
    • Building rotation around Z-axis tensors in rotate_z() template functions.
    • Updating PageControl widget when resized. Its header was not updated.
    • Form's parent is no longer set automatically to main form in CForm if main form is already created and set in the application as main one.
    • Accessing control font properties if there are no control font in widget in CControlPropertyList class.
    • Added missing header file include in SimpleXML component header file.
    • Added missing header files in package descriptions of most widgets from Charts package.
    • Showing resize/rotate marker in Form Builder for FormStyleSolid widget was removed.
    • Class name specified in constructor of Heightmap widget missed last t.
    • Size property of ScrollBar widget was exported and saved before Vertical one and it was resulted in wrong size if widget is in vertical mode.
    • Sometimes there was access to non-existing hovered item in CCustomTreeView class.
  • Removed

    • Property BackgroundColorInEditor from Container widget.
    • Method CleanupOnControlDetach() from form service interface IFormService and its default implementation in CFormService class.
    • Members IsMaximized, IsMinimized, and IsVisible from CREATE_PARAMS structure as they were redundant and can be completely replaced by State member.
  • Changed

    • Output and intermediate directories for the framework core and packages have been changed. Please see below how to change your projects settings accordingly.
    • Copy-paste feature of IWindow. Paste operation should be performed in PasteString notifications/events from now. This change was required to unify different behaviour on different operating systems. To archieve new behaviour following changes were made.
      • Method CopyStringToClipboard() of IWindow is no longer return a string and its result cannot be used for pasting.
      • Accordingly method CopyStringToClipboard() of IForm is no longer return a string and its result cannot be used for pasting.
      • Structure of MESSAGE_PASTE_STRING was added to send a text to be pasted to application and widgets.
      • Method OnPasteString() of IWindowListener was added which is called when pasting string becomes available after paste request. Implementations of this method then call corresponding PasteString notifications and events to distribute the event to paste initiaded widget.
      • Notification method NitifyOnPasteString() was added to IFormService and corresponding implementations.
      • Event OnPasteString() was added to IForm.
      • Notification method NitifyOnPasteString() was added to IControlService and corresponding implementations.
      • Event OnPasteString() was added to IControl.
      • Notification method NitifyOnPasteString() was added to IBuiltInControl and corresponding implementations.
  • Renamed

    • Method getDesciption() of interface IPackageEntity and all derived interfaces and implementing classes has been renamed to getDescription(added missing letter r).
    • Several key codes of the KEY enumeration have been renamed. Here they:
      • keyBack was renamed to keyBackspace.
      • keyCapital was renamed to keyCapsLock.
      • keyScroll was renamed to keyScrollLock.
      • keyOem1 was renamed to keySemicolon.
      • keyOem2 was renamed to keySlash.
      • keyOem3 was renamed to keyTilde.
      • keyOem4 was renamed to keyLeftBracket.
      • keyOem5 was renamed to keyBackSlash.
      • keyOem6 was renamed to keyRightBracket.
      • keyOem7 was renamed to keyApostrophe.
  • Added

    • Method Clear() to ValueListEditor widget.
    • Method setNamespace() to IPackageEntity interface and its implementations. It is used to overwrite namespace when creating form prototype header file in Form Builder if it is requested in settings.
    • Method getNamespace() to CPackageEntity class.
    • Enumeration EXPORT_PREFIX_TYPE to describe possible algorithms of state prefix generation.
    • Method getStatePrefixType() to IPropertyState interface and its implementations to read assigned at construction state prefix generation type.
    • Method getStatePrefix() to IPropertyState interface and its implementations to read assigned at construction state additional prefix.
    • const String &ns argument to constructors of CPackageEntity, CPackageComponent, CPackageControl, CPackageListItem, CPackageForm, CPackageRenderer, and CPackageStyle base package classes.
    • CPropertyState class has got new argument in constructor const EXPORT_PREFIX_TYPE state_prefix_type indicating how prefix for state name should be generated. It is added before argument const String &state_prefix.
    • CProperty class has got new protected method Prefix() which generates prefix depending on arguments.
    • const EXPORT_PREFIX_TYPE prefix_type argument to CPropertyEnum and CPropertyEnumState class which handles export of enumeration type properties.
    • getPanel() methods to StatusBar widget.
    • New constant called OutlineMask you may use to draw outline for your widgets if they are being managed by Form Builder and initially(when no content is set) aren't visible(there is nothing to draw).
    • New constant called DesignDPI containing default DPI value being used to design widgets.
    • New property OutlineInEditor to PaintBox widget to control its drawing when it is placed on the form in Form Builder.
    • New property OutlineInEditor to Container widget to control its drawing when it is placed on the form in Form Builder.
    • Global helper functions WindowStateItems(), WindowStateToString(), and StringToWindowState() for conversion between WINDOW_STATE enumeration and string.
    • Global helper functions WindowPositionItems(), WindowPositionToString(), and StringToWindowPosition() for conversion between WINDOW_POSITION enumeration and string.
    • Template function parent() to search parent of specified type into a control's hierarchy.
    • New function Log() which can be used to write debugging messages to a text file. New messages are being appended to the file end.
    • New functions Implode() which can be used to concatenate array of strings.
    • New function SearchWordStartForward() which can be used to search beginning of the next word in a string.
    • New function SearchWordEndForward() which can be used to search ending of the next word in a string.
    • New function SearchWordStartBackward() which can be used to search beginning of the previous word in a string.
    • New function SearchWordEndBackward() which can be used to search ending of the previous word in a string.
    • New function WordWrap() which can be used to split long string into lines with respect to words and specified maximum allowed line width.
    • New function WordBreak() which can be used to split long string into lines by breaking words if necessary with respect to specified maximum allowed line width.
    • Dialog box control types
      • IDialogBox interface describing dialog box minimum requirements and it's partial implementation in CDialogBox class.
      • IDialogBoxService interface describing minimum requirements from dialog box service and it's partial implementation in CDialogBoxService class.
      • Dialog box listener description in IDialogBoxListener interface to be able to be notified on some actions by dialog box.
      • CDialogBoxEventList class describing dialog box basic events and CDialogBoxPropertyList class describing it's basic properties for Form Builder.
      • New form's events void(*OnDialogBoxActivate)(IForm *sender, IDialogBox *control); and void(*OnDialogBoxDeactivate)(IForm *sender, IDialogBox *control); in form's interface IForm and it's basic implementation in CForm class. Also corresponding notifications void NotifyOnDialogBoxActivate(IDialogBox *control) and void NotifyOnDialogBoxDeactivate(IDialogBox *control) were added to form's service interface IFormService and it's basic implementation in CFormService.
      • Methods IDialogBox *getActiveDialogBox() and bool setActiveDialogBox(IDialogBox *value) to form's interface IForm and it's basic implementation in CForm class.
      • IPackageDialogBox interface describing package dialog box minimum requirements and it's partial implementation in CPackageDialogBox class.
    • Second argument IControl *control to ControlSetCaptureKeyboard() method of helper class CNotifier. This argument is the control getting keyboard capture.
    • Second argument IControl *control to ControlKillCaptureKeyboard() method of helper class CNotifier. This argument is the control losing keyboard capture.
    • Second argument IControl *control to ControlSetCaptureMouse() method of helper class CNotifier. This argument is the control getting mouse capture.
    • Second argument IControl *control to ControlKillCaptureMouse() method of helper class CNotifier. This argument is the control losing mouse capture.
    • Second argument IControl *control to ControlSetFocus() method of helper class CNotifier. This argument is the control getting keyboard focus.
    • Second argument IControl *control to ControlKillFocus() method of helper class CNotifier. This argument is the control losing keyboard focus.
    • Second argument IControl *control to ControlSetModal() method of helper class CNotifier. This argument is the control getting modal state.
    • Second argument IControl *control to ControlKillModal() method of helper class CNotifier. This argument is the control losing modal state.
    • Second argument IControl *control to MouseHoverControl() method of helper class CNotifier. This argument is the control below mouse pointer.
    • Second argument IControl *control to MouseLeaveControl() method of helper class CNotifier. This argument is the control was below mouse pointer.
    • Methods ControlActivate() and ControlDeactivate() to helper class CNotifier for sending notification about control activation and deactivation.
    • Methods ControlActivateDialogBox() and ControlDeactivateDialogBox() to helper class CNotifier for sending notification about activation and deactivation of dialog box.
    • Methods ControlShow() and ControlHide() to helper class CNotifier for sending notification about control becoming visible and invisible.
    • Methods ControlEnable() and ControlDisable() to helper class CNotifier for sending notification about control becoming enabled and disabled.
    • Methods ProcessControlDisable(), ProcessControlHide(), and ProcessControlDetach() to form interface IFormService and its default implementation in CFormService class. These methods process form state update during disabling, hiding, and detaching control belonging to a form. Corresponding calls have also been implemented in control's base implementation in CControl class.
    • Notifications NotifyOnDialogBoxActivate() and NotifyOnDialogBoxDeactivate() to IComponentService and its default implementataion class CComponentService. Also corresponding events OnDialogBoxActivate() and OnDialogBoxDeactivate() where added to IComponent and its default implementataion class CComponent.
    • Method isDialogBox() to IPackageControl interface and its base implementation in CPackageControl class.
    • Added argument const String &dialog_box to methods Export() of IEvent and IEventList interfaces and all theirs implementation. This argument contains dialog box class name when exporting as dialog box prototype in Form Builder and empty string otherwise.
    • Added argument const String &dialog_box to methods Export() of IPackageComponent and IPackageControl interfaces and all theirs implementation. This argument contains dialog box class name when exporting as dialog box prototype in Form Builder and empty string otherwise.
    • Getter isStaticTabOrder() and setter setStaticTabOrder() to IControl interface and its implementation in CControl class. This new property is used to prevent changing control and its children tab order automatically when adding it to a form and is used by modal dialog boxes.
    • All forms of all packages have got dialog box implementations. You can find them on the reference pages of forms. They are new classes named as CDialogBox***.
    • Property UseDialogBox has been added to ColorDialog, FindDialog, and ReplaceDialog widgets. The property allows to control how widget should be used: as dialog box or regular form(by default). Also event OnApply to notify about successful close of modal form or dialog box was added to ColorDialog widget.
    • ReleaseModal() method to IForm and form default implementation in CForm to handle passing modal state between controls.
    • isUseDialogBoxes() method to IApplication indicating whether application should try to use forms in form of dialog boxes instead or regular standalone ones.
    • Listener to ColorDialog widget. It can be assigned by setListener() method and get by getListener() method of widget class/interface. Listener is used to get notifications about certain actions of widget and is used by widget parents.
    • New argument listener to IPackageComponent and its implementations to provide ability to receive notifications about some actions performed by package components. This feature is widely used in Form Builder. Also the interface IPackageComponentListener describing the listener should be used was added.
    • New argument listener to IPackageControl and its implementations to provide ability to receive notifications about some actions performed by package controls. This feature is widely used in Form Builder. Also the interface IPackageControlListener describing the listener should be used was added.
    • Method isGlobal() to IApplication interface and all its implementations. Method is being used to indicate whether the application object controls entire application and automatically finish it when all forms and windows are closed.
    • Implementation of bool Save(const String &filename, ITexture *texture, const void *options) method of the Android CPicture class.
    • Method isWindowSupported() into IRenderer interface and corresponding implementation classes.
    • New methods getMinFilter(), getMagFilter(), setMinFilter(), and setMagFilter() into ITexture interface and corresponding implementation classes to control minifying and magnification filtering modes.
  • Improved

    • Class CPackageStyle is now derived from CPackageEntity as all the package base classes.
    • CEvent class can now use {namespace} placeholder in signatures. If you put it into a signature it will be replaced with namespace specified in associated package entity to which an event belongs.
    • All forms of all packages have been re-created with Form Builder and now have *.nfr form files.
    • All Render Helpers now return true if rendering happend and false otherwise.
    • setModalControl() of CForm, which is an implementation of IForm, now can handle changes of modal control automatically. It means untill you pass nullptr as an argument value, previous modal control will become modal again(if there is one). If you want to clear history of modal controls, you have to pass nullptr as argument.
    • Picker color change depending on its position on HSVPlane widget so the picker would be better visible in some areas.
    • New argument CREATE_PARAMS *params in CForm constructor can be used to overwrite default window creation parameters.
    • CREATE_PARAMS structure has got new constructor where parameters can be specified.
    • Parsing predefined formats in Scripting module by adding and using one more operator for detecting new line.
    • Creation of properties and events togather with component/controls/list item creation can be skipped now. You may use this feature if you want to create widget or list item from package dynamic library for some reeason.
      • Creation of properties and events can be skipped in calling of method Create() of the IPackageComponent if pass nullptr instead of one or both of the arguments. If both arguments are nullptr, then package also will not be informed about component creation.
      • Creation of properties and events can be skipped in calling of method Create() of the IPackageControl if pass nullptr instead of one or both of the arguments. If both arguments are nullptr, then package also will not be informed about control creation.
      • Creation of properties can be skipped in calling of method Create() of the IPackageListItem if pass nullptr instead of the argument.
    • Method SearchFiles() of CFileSystem class of Android platform can now also search directories if regular file system is used(not assets).
    • Global helper functions GetAnsiFileContent(), GetUTF8FileContent(), PutAnsiFileContent(), and PutUTF8FileContent() got possibility to use unicode file names on a Linux operating system.
    • Inclusion of all platform dependent header files has been finally removed from all header files(except for few which are mainly for internal usage only), even from header files of platform dependent classes implementations.

Migration from previous version

Due to minor changes in classes describing package base entities you have to add following changes in you custom events, custom properties and package entities(components, controls, list items, forms, renderers, and styles):

  • When using framework core and packages' properties before string additional state prefix(const String &state_prefix argument) use EXPORT_PREFIX_TYPE enumeration value. Most probably eptNamespaceParent you need everywhere.
  • When using standard enumeration type properties additionally to string prefix use EXPORT_PREFIX_TYPE enumeration value. Most probably eptNamespaceParent you need everywhere.
  • Remove storing namespace from your package class implementation and use constructor of corresponding entity and its getNamespace() method instead.
  • Whereever you hardcoded namespace in your custom properties, use Prefix() method instead.
  • In order to correct working of the namespace overwrite feature of the Form Builder for your custom widgets, you need to replace direct hardcoded namespace in signatures of events with {namespace} placeholder(without ::).
  • If you used space state prefix in some state properties of your widgets to avoid automatical adding namespace and widget class prefix, you have to use empty state prefix and eptNone state prefix type from now on.

Instead of removed CleanupOnControlDetach() method of IFormService use its ProcessControlDetach() method.

If you have your own components or controls with custom implementation of Export() method of IPackageComponent or IPackageControl, you should add and take into consideration new argument const String &dialog_box containing class name of dialog box when exporting as dialog box in Form Builder. You may need to change exporting logic a little depending on whether exporting is being done to dialog box or regular form prototype(but most probably no changes will be required except for adding one more argument to Export() method.

For all your custom widgets which create list items and child widgets via CreateListItem() method of IPackageComponent and IPackageControl or CreateChild() method of IPackageControl, you should add one more argument, which is a listener, as described in the interfaces. When listener is provided, use its methods for notification of caller about successful creation of list item or child control. Also add check if item and child arguments are not empty before writing values to them. From now on they can be and will be empty in some cases. If your widget shows any modal form before creation list item or child widget(for example, to select list item type to be created and set its default properties) it is also recommended to implement this custom form as dialog box and use dialog box when Application->isUseDialogBoxes() returns true. See more about dialog boxes here.

As the output directories for the core and packages have been changed, you have to change settings for your projects accordingly. The change is related to Library Directories property of your projects. In previous releases it should have pointed to the directories inside the directory where you unpacked downloaded framework source code. For example, for Debug project configuration and x64 project platform it was like C:\Nitisa-8.0.2\x64\Debug assuming you had unpacked the downloaded file into C:\Nitisa-8.0.2 directory. Starting from these release the library directory is C:\Nitisa-9.0.0\bin\Windows\x64\Debug. Where C:\Nitisa-9.0.0 is a folder with unpacked framework source code. bin is predefined name for output binaries of Nitisa projects. Windows means target OS. In case of Android OS it should be Android, and so on. x64 is a project target platform and Debug is a project target configuration.

If you are using Nitisa extension for Visual Studio and want to migrate your old projects to it, you need to change library path to $(ALLUSERSPROFILE)\Nitisa\9.0.0\Windows\x64\Debug. Where $(ALLUSERSPROFILE) is predefined Visual Studio macros expanding usually to C:\ProgramData directory. After it the Nitisa is the directory called the same as the framework name and the 9.0.0 is the farmework version. Meaning of the other folders you know from previous paragraph. Additionally you have to change include pathes. As you might know in standalone installation they are like C:\Nitisa-9.0.0 and C:\Nitisa-9.0.0\Packages. In case of extension they should be $(MSBuildExtensionsPath)\Nitisa\9.0.0 and $(MSBuildExtensionsPath)\Nitisa\9.0.0\Packages respectfully.

In your own built-in controls you have to add NotifyOnPasteString() method as described in IBuiltInControl interface and either left it empty just returning false or implement corresponding string pasting feature if your built-in control supports one.
Whereever you call window's or form's CopyStringFromClipboard() method, change its implementation as it now returns bool value instead of string. Perform actual pasting as described below.
In your own controls supporting copy-pasting you have to add NotifyOnPasteString() method to control's service accordingly to IControlService interface and implement pasting string passed in parameter there. If you use built-in controls supporting the feature you may redirect that notification to it by calling it's corresponding method(has the same name).

Wherever you use KEY enumeration codes keyBack, keyCapital, keyScroll, keyOem1, keyOem2, keyOem3, keyOem4, keyOem5, keyOem6, keyOem7 rename them to keyBackspace, keyCapsLock, keyScrollLock, keySemicolon, keySlash, keyTilde, keyLeftBracket, keyBackSlash, keyRightBracket, keyApostrophe respectfully.

Instead of removed IsMaximized, IsMinimized, and IsVisible members from CREATE_PARAMS structure use its State member. For maximized window use wsMaximized state; for minimized window use wsMinimized state; for invisible window use wsHidden state.

As all platform dependent header files have been removed from include parts of all header files you have to include them into your own header or source files if you are using platform dependent functions/types/ and so on. For example, if you have #include "Standard/Platform/Windows/Window.h" in you source file and you are using some Windows functions there, you have to add #include <Windows.h> as well now.