SophiaFramework UNIVERSE 5.3 |
Root(SFZRoot) is the responder designed to be placed at the highest position of the responder tree.
Bound with the distributer(SFYDistributer) and the renderer(SFYRenderer), the root can send an event to the responder tree and draw it.
An application class inheriting from SFYApplication contains the default root bound with the distributer(SFYDistributer) and the renderer(SFYRenderer).
Though you can define more than one root by constructing new responder trees explicitly, the above default root is enough in the applet development using SFYApplication. You don't have to define your own root in almost all cases.
About SFZRoot | |
---|---|
There is no need to define and implement the user-defined root by inheriting from SFZRoot since enough functions as the root responder has already been implemented in SFZRoot. In general, SFZRoot is used as it is in the applet development. |
Table 9.7. Type of concrete root
Class name | Description |
---|---|
SFZRoot | General purpose root to place a window, dialog, or menu. |
IMPORTANT | |
---|---|
In the concrete root, the SFYResponder::SetDistributer, SFYResponder::SetRenderer, SFYResponder::SetState, and SFYResponder::SetRealBound functions must be always called. Other functions are optionally called. |
SFZRoot is the general purpose root to place a window, dialog, or menu.
In the applet develoment using an application class inheriting from SFYApplication, you don't have to declare the root explicitly since the default root(SFZRoot) has already been contained by SFYApplication.
When an application class inheriting from SFCApplication is used or another responder tree is necessary, you have to declare the root explicitly.
Following is the code to define and implement an application class, which will support the GUI framework, by inheriting directly from SFCApplication. In SFYApplication, almost the same code is defined and implemented.
Note | |
---|---|
The SFYApplication class has the option function that the saved bitmap to restore the device screen is released at suspend time. In the following, the implementaion of this function is omitted to simplify the code. For more details, see the internal implementation of the SFYApplication::HandleEvent function. |
Example 9.44. Declaration
SFMTYPEDEFCLASS(USRApplication) class USRApplication: public SFCApplication { SFMSEALCOPY(USRApplication) private: SFZRootSmp _root; // root SFYDistributer _distributer; // distributer SFYRenderer _renderer; // renderer SFXBaseEditorPtr _editor; // text input control editor ... private: explicit USRApplication(Void) static_throws; virtual ~USRApplication(Void); virtual Bool HandleEvent(SFXEventConstRef event); virtual Bool HandleRender(SFXEventConstRef event); SFCError Make(Void); Bool Do(SFXEventConstRef event); Void Dispose(Void); };
Example 9.45. Implementation 1
SFCError USRApplication::Make(Void) { SFCError error(SFERR_NO_ERROR); // initialization // create the instance of the text input control editor if ((_editor = ::new SFXEditor) != null) { // initialize the distributer error = _distributer.Initialize(); if (error == SFERR_NO_ERROR) { // initialize the renderer // * responder space will be set to the device screen error = _renderer.Initialize(); if (error == SFERR_NO_ERROR) { // create the root if ((_root = SFZRoot::NewInstance(&error)) != null) { // bind the root with the distributer _root->SetDistributer(&_distributer); // bind the root with the renderer _root->SetRenderer(&_renderer); // set the root's real region to the responder space _root->SetRealBound(_root->GetSuitableBound()); // set the root's state to "visible" + "active" + "enable" + "focus" together _root->SetState(true, true, true, true); } } } } else { error = SFERR_NO_MEMORY; } return error; } Bool USRApplication::Do(SFXEventConstRef event) { // here describe the handling of the event dispatched from the BREW environment SFCError error; Bool result(false); // boot up the distributer to distribute the event using the tracer // first of all, the SFYDistributer instance bound with the root will receive the event // then, the event will be distributed to the responders in the responder tree according to the dispatching rules of the tracer // * _root is the root(SFZRoot) if ((error = _root->Distribute(event, &result)) == SFERR_NO_ERROR) { if (event.GetType() != SFEVT_APP_STOP && event.GetType() != SFEVT_APP_SUSPEND)) { // if redrawing is necessary if (IsRenderable()) { // if the screen can be redrawn (i.e., if no highest priority event handler is registered) // boot up the renderer to redraw the responder tree below the root error = _root->Render(); } } } if (error != SFERR_NO_ERROR) { // call HandleError() in case the fatal error such as insufficient memory during the initialization of the distributer or the renderer occurs if (HandleError(event, error)) { result = true; } } return result; // return "true" if the event has been handled, otherwise return "false" } Void USRApplication::Dispose(Void) { // finalization: execute these in the order below // destroy the instance of the text input control editor ::delete _editor; // release the responder tree _root.Release(); // terminate the renderer _renderer.Terminate(); // terminate the distributer _distributer.Terminate(); return; }
Responder space | |
---|---|
Responder space is a rectangular region inside the device screen, where a responder tree bound with a renderer will be drawn. The responder space is set with the SFYRenderer::Initialize function to initialize the renderer. After this initialization, the responder space cannot be expanded nor reduced dynamically. By default, the responder space is set to a rectangular region of all device screen. |
The USRApplication::Make function, the USRApplication::Do function, and the USRApplication::Dispose function in the above example code are called in the constructor, the event handler, and the destructor respectively as follows:
Example 9.46. Implementation 2
// constructor USRApplication::USRApplication(Void) { if (static_try()) { static_throw(Make()); // describe other initialization } } // event handler Bool USRApplication::HandleEvent(SFXEventConstRef event) { SFCError error; Bool result(false); result = Do(event); // describe other processing return result; } // handler for drawing full screen Bool USRApplication::HandleRender(SFXEventConstRef event) { // here describe full screen redrawing SFCError error; Bool result(false); if (SFCApplication::HandleRender(event)) { // redraw the device screen // redraw the responder tree below the root // *1. if possible, redraw using the bitmap to restore the device screen // *2. start up the renderer by calling "Render(true)" if the bitmap to restore the device screen is not available in a timing such as receiving the SFEVT_APP_START event // *3. in case of "Render(true)", all visible responders' drawing handlers will be called error = _root->Render((event.GetType() == SFEVT_APP_START) || (_root->Recover() != SFERR_NO_ERROR)); if (error == SFERR_NO_ERROR) { result = true; } else { // call HandleError() when fatal error such as insufficient memory during initialization of renderer HandleError(event, error); } } return result; } // destructor USRApplication::~USRApplication(Void) { Dispose(); // describe other finalization }
Copyright(c) 2002 - 2024 Sophia Cradle Incorporated All Rights Reserved. |