Home > Products > SophiaFramework UNIVERSE > Tutorial > Scheduler > - 6 / 7 -

BREW Scheduler Supporting vCalendar - 6 / 7 -

Key Handlers

MainWindow

Within the MainWindow that draws the calendar, the current cursor position is saved in the SFXDate variable _cursor.

class MainWindow : public SFRPlainWindow {
private:
    SFXDate _currentDay; // current day
    
     ...
};

Key Handler

HANDLER_IMPLEMENT_BOOLEVENT(MainWindow, OnKey, event)
{
    Bool result(false);

    switch (event.GetP16()) {
        case AVK_SELECT: 			// If SELECT key is pressed
            ::new OneDayWindow(_currentDay);
            result = true;
            break;
        case AVK_LEFT:
            _currentDay.SubDay(1);  // Move day left
            InvalidateContent(); // A new area is registered
            result = true;
            break;
        case AVK_RIGHT:
            _currentDay.AddDay(1); // Move day right
            InvalidateContent(); // A new area is registered
            result = true;
            break;
        case AVK_UP:
            _currentDay.SubDay(7); // Move day up
            InvalidateContent(); // A new area is registered
            result = true;
            break;
        case AVK_DOWN:
            _currentDay.AddDay(7); // Move day down
            InvalidateContent(); // A new area is registered
            result = true;
            break;
    }
    return result;
}

OneDayWindow

OneDayWindow dispalys all the plans of a day.

In the first line, the "New" field is for creating new data, and from the 2nd line, times of the day and the contents of the associated summary fields are displayed.

SFMTYPEDEFCLASS(OneDayWindow)
class OneDayWindow : public SFRPlainWindow {
    SFMSEALCOPY(OneDayWindow)
private:
    SInt16 _displine;   // Head of displayed line 
    SInt16 _cursor;     // Cursor position
    SInt16 _maxline;    // Number of lines displayed 
    SFXDateConst _date; // Date of the current day
    SInt32 _index;      // Index of VCalendar at date of _date
    SInt32 _number;     // The number of VCalendar
public:
    OneDayWindow(SFXDateConstRef date) static_throws;
    virtual ~OneDayWindow(Void);
    HANDLER_DECLARE_VOIDRENDER(OnRenderContent) // drawing handler
    HANDLER_DECLARE_BOOLEVENT(OnKey) // key handler
};

* _cursor :create new window if is at 0, or diaplay the calendar data of the day if it is bigger than 0

Key Handler

HANDLER_IMPLEMENT_BOOLEVENT(OneDayWindow, OnKey, event)
{
    Bool result(false);
    switch (event.GetP16()) {
        case AVK_CLR: // Clear key pressed
            // Close window
            result = Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE,
                SRP16_TERMINATE_INVOKE, true));
            break;
        case AVK_SELECT:
            if (_cursor <= 0) { // If cursor is at 0
                ::new CreateWindow(_date); // Create new window
            } else { // Data that current cursor points to
                VCalendarFilePtr vcal =
                    SyncScheduler::GetVCalCollection()->Get(
                        _index + _displine + _cursor - 1);
                ::new ModifyWindow(_date, vcal); // create window
            }
            result = true;
            break;
        case AVK_DOWN:
            // If cursor is not at the bottom of data
            if (_cursor + _displine < _number) {
                // If cursor is not at the bottom of screen
                if (_cursor >= _maxline - 1) {
                    ++_displine; // Move displayed line down
                } else {
                    ++_cursor; // Move cursor down
                }
            }
            else { // If cursor is at the bottom of screen
                   // move cursor at the top of screen
                _displine = 0;
                _cursor = 0;
            }
            InvalidateContent(); // A new area is registered
            result = true;
            break;
        case AVK_UP:
            if (_cursor == 0) { 
                // If cursor is at the top of screen
                if (_displine > 0) { 
                    // If line displayed can be moved up
                    --_displine; // Move the line up
                }
                else { // if line displayed cannot be moved up
                       // move cursor at the bottom of screen
                    _cursor = (_number < _maxline - 1) ?
                            _number : _maxline - 1;
                    _displine = (_number > _maxline - 1) ?
                            (_number - _maxline + 1) : 0;
                }
            } else {
                --_cursor; // Move cursor up
            }
            InvalidateContent(); // A new area is registered
            result = true;
            break;
    }
    return result;
}

DataInputWindow

Both CreateWindow for inputting new data and ModifyWindow for modifying data inherit from DataInputWindow and their logic is shared with it.

SFMTYPEDEFCLASS(DataInputWindow)
class DataInputWindow : public SFRPlainWindow {
    SFMSEALCOPY(DataInputWindow)
protected:
    SFREditboxControlPtr _textHour;    // Text control to input hours
    SFREditboxControlPtr _textMinute;  // Text control to input minutes
    SFREditboxControlPtr _textContent; // Text control to input content
    SFRButtonControlPtr _buttonOk;     // For OK button
    SFRButtonControlPtr _buttonCancel; // For Cancel button
    SFRLabelControlPtr _labelDate;     // Date label
    SFRLabelControlPtr _labelHour;     // Hour label
    SFRLabelControlPtr _labelMinute;   // Minute label
    SInt16 _fontHeight;                // Height of font
    SFXDateConst _date;                // Date of today
public:
    DataInputWindow(SFXDateConstRef date) static_throws;
    virtual ~DataInputWindow(Void);
    virtual Void MakeData(SFXDateConstRef start,
        SFXAnsiStringConstRef summary) = 0;

    HANDLER_DECLARE_VOIDRENDER(OnRenderContent)    // Drawing handler 
    HANDLER_DECLARE_BOOLEVENT(OnKey)               // Key handler
    HANDLER_DECLARE_VOIDCONTROL(OnOkButtonControl) // Button handlers
    HANDLER_DECLARE_VOIDCONTROL(OnCancelButtonControl) 

};

SFMTYPEDEFCLASS(CreateWindow)
class CreateWindow : public DataInputWindow {
    SFMSEALCOPY(CreateWindow)
public:
    CreateWindow(SFXDateConstRef date);
    virtual Void MakeData(SFXDateConstRef start, SFXAnsiStringConstRef summary);
};

SFMTYPEDEFCLASS(ModifyWindow)
class ModifyWindow : public DataInputWindow {
    SFMSEALCOPY(ModifyWindow)
private:
    VCalendarFilePtr _vcal; // Save data for modifying
public:
    ModifyWindow(SFXDateConstRef date, VCalendarFilePtr vcal);
    virtual Void MakeData(SFXDateConstRef start, SFXAnsiStringConstRef summary);
};

Constructor

DataInputWindow::DataInputWindow(SFXDateConstRef date)
: SFRPlainWindow(SFRApplication::GetInstance(), 
SyncScheduler::CalculateWindowPosition()), _date(date) static_throws
{

// Registration of soft key
    SoftkeyWindowPtr softkey;

    SoftkeyWindow::Initialize(this);
    if (static_try()) {
        // Registration of drawing handler
        static_throw(RegisterHandler(SREVT_RESPONDER_RENDER, 
        SRP16_RENDER_CONTENT,HANDLER_BEFORE, 
        HANDLER_FUNCTION(OnRenderContent)));
        if (static_try()) {
            // Registration of key handler
            static_throw(RegisterHandler(SFEVT_KEY, 
            HANDLER_AFTER, HANDLER_FUNCTION(OnKey)));
            if (static_try()) {
                //static_throw(RegisterHandler(static_cast
                <SFCEventEnum>(SoftkeyWindow::USEREVT_SOFTKEY), 
                HANDLER_AFTER, HANDLER_FUNCTION(OnSoftkey)));
                if (static_try()) {
                    if ((softkey = SoftkeyWindow::GetInstance()) 
                    != null) {
                        static_throw(softkey->Register(this, 
                        SoftkeyWindow::SOFTKEY_1, LABEL_SOFTKEY1));
                        if (static_try()) {
                            static_throw(softkey->Register(this, 
                            SoftkeyWindow::SOFTKEY_2, LABEL_SOFTKEY2));
                            if (static_try()) {
                                static_throw(softkey->Register(this, 
                                SoftkeyWindow::SOFTKEY_3, 
                                LABEL_SOFTKEY3));
                                if (static_try()) {
                                    SetReference(softkey->Bind(this));
                                    _fontHeight = SFXGraphics::
                                    GetFontHeight(AEE_FONT_NORMAL);
                                    SFXRectangleConst screenRect
                                    (GetContentWorld());
                                    SFXRectangle rect
                                    (MENU_SIDE_MARGIN, MENU_TOP_MARGIN,
                                    screenRect.GetRight() 
                                    - MENU_SIDE_MARGIN, _fontHeight);

                                    // Make label
                                    _labelDate = ::new SFRLabelControl
                                    (this, rect, date.Format
                                    ("YYYY/MM/DD"));
                                    rect.AddY(_fontHeight + 
                                    MENU_SPACE);
                                    rect.SetSize(MENU_BOX_WIDTH, 
                                    _fontHeight + TEXTBOX_REVISING);
                                    // Make text control for hour input
                                    _textHour = ::new SFREditboxControl
                                    (this, rect, SFXWideString::
                                    EmptyInstance());
                                    rect.AddX(MENU_BOX_WIDTH);
                                    // Make label
                                    _labelHour = ::new SFRLabelControl
                                    (this, rect, "H");
                                    rect.AddX(rect.GetWidth());
                                    // Make Text control for 
                                    // minutes input
                                    _textMinute=::new SFREditboxControl
                                    (this, rect, SFXWideString::
                                    EmptyInstance());
                                    rect.AddX(MENU_BOX_WIDTH);
                                    // Make label
                                    _labelMinute=::new SFRLabelControl
                                    (this, rect, "M");
                                    rect.SetX(MENU_SIDE_MARGIN);
                                    rect.AddY(_fontHeight + 
                                    MENU_SPACE + TEXTBOX_REVISING);
                                    rect.SetSize(screenRect.GetRight() 
                                    - 2 * MENU_SIDE_MARGIN, screenRect.
                                    GetBottom() - 4 * MENU_SPACE - 3 * 
                                    _fontHeight - MENU_TOP_MARGIN);
                                    // Make Text control for 
                                    // inputting content
                                    _textContent = ::new 
                                    SFREditboxControl(this, rect, 
                                    SFXWideString::EmptyInstance());
                                    rect.Set(MENU_SIDE_MARGIN, 
                                    screenRect.GetBottom() -MENU_SPACE 
                                    - _fontHeight, MENU_BUTTON_WIDTH, 
                                    _fontHeight);
                                    // Make OK button
                                    _buttonOk =::new SFRButtonControl
                                    (this, rect, "OK");
                                    rect.AddX(MENU_SPACE + 
                                    MENU_BUTTON_WIDTH);
                                    // Make cancel button
                                    _buttonCancel=::new 
                                    SFRButtonControl
                                    (this, rect, "CANCEL");

                                    if (static_try()) {
                                        // The select key is processed 
                                        // by the default handler.(For 
                                        // the text control) 
                                        static_throw(RegisterHandler
                                        (SFEVT_KEY, AVK_SELECT, 
                                        HANDLER_AFTER,HANDLER_FUNCTION
                                        (SelectHandler)));
                                        if (static_try()) {
                                            if (_textHour != null && 
                                            _textMinute != null && 
                                            _textContent != null) {
                                                // Setting the maximum 
                                                // character number
                                                _textHour->
                                                SetMaxSize(2);
                                                _textMinute->
                                                SetMaxSize(2);
                                                _textContent->
                                                SetMaxSize(255);
                                                // Focus is set. 
                                                _textHour->
                                                SetStatusFocus(true);
                                                if (static_try()) {
                                                    if (_buttonOk != 
                                                    null) {
                                                        // Register  
                                                        // button hand
                                            static_throw(_buttonOk->
                                            RegisterHandler(
                                            SREVT_CONTROL, 
                                            HANDLER_BEFORE,
                                            HANDLER_FUNCTION
                                            (OnOkButtonControl)));
                                            if (static_try()) {
                                            if (_buttonCancel != null) 
                                            {
                                            // Registration of 
                                            // button handler
                                            static_throw(
                                            _buttonCancel->
                                            RegisterHandler(
                                            SREVT_CONTROL, 
                                            HANDLER_BEFORE,
                                            HANDLER_FUNCTION(
                                            OnCancelButtonControl)));
                                            }
                                            else {
                                            static_throw(
                                            SFERR_NO_MEMORY);
                                                            }
                                                        }
                                                    }
                                                    else {
                                                        static_throw
                                                    (SFERR_NO_MEMORY);
                                                    }
                                                }
                                            }
                                            else {
                                                static_throw
                                                (SFERR_NO_MEMORY);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return;
}

Additional Processing on ModifyWindow

ModifyWindow::ModifyWindow(SFXDateConstRef date, VCalendarFilePtr vcal)
    : DataInputWindow(date), // Call parent constructor
      _vcal(vcal) // Data for modifying
{
    SFXDate start = _vcal->GetStartDate();
    // Set initial value of the hour text control
    _textHour->SetText(SFXWideString::Format("%d", start.GetHour()));
    // Set initial value of the minute text control
    _textMinute->SetText(SFXWideString::Format("%02d", 
                                               start.GetMinute()));
    // Set initial value of the content text control
    _textContent->SetText(_vcal->GetSummary());
    return;
}

Handler for OK Button

HANDLER_IMPLEMENT_VOIDCONTROL(DataInputWindow, OnOkButtonControl, result, control)
{
	unused(control);
    unused(result);
    
    SFXDate start(_date);
    
    // Convert the string Hour to integer value
    SInt16 hour = static_cast<SInt16>(_textHour->GetText().AsSInt32());
    if (hour < 0 || hour >= 24) { // Check Hour
        hour = 0;
    }
    start.SetHour(hour);

    // Convert the string Minute to integer value
    SInt16 minute = static_cast<SInt16>(_textMinute->GetText().AsSInt32());
    if (minute < 0 || minute >= 60) { // Check Minute
        minute = 0;
    }
    start.SetMinute(minute);
    start.SetSecond(0); // Seconds is assumed to be 0

    // Get Content string
    SFXAnsiString summary(static_cast<SFXAnsiString>(
        _textContent->GetText()));

    // Make data
    MakeData(start, summary);

    // Get OneDayWindow
    SFRResponderPtr oneDayWindow = GetNext();

    // Close this window and the background window
    Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE, SRP16_TERMINATE_INVOKE, true));
    oneDayWindow->Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE,
        SRP16_TERMINATE_INVOKE, true));
    return;
}

MakeData() of CreateWindow

Void CreateWindow::MakeData(SFXDateConstRef start, SFXAnsiStringConstRef summary)
{
    VCalendarFilePtr vcal = ::new VCalendarFile("1.0", start, start, summary);
    if (vcal != null) {
        SyncScheduler::GetVCalCollection()->Append(vcal);
    }
    return;
}

MakeData() of ModifyWindow

Void ModifyWindow::MakeData(SFXDateConstRef start, SFXAnsiStringConstRef summary)
{
    if (_vcal != null) {
        _vcal->Set(start, start, start ,summary); // modify
        SyncScheduler::GetVCalCollection()->Update(_vcal);
    }
    return;
}

Update() of VCalCollection

Void VCalCollection::Update(VCalendarFilePtr vcalendar)
{
    _list.Remove(_list.IndexOf(vcalendar));
    Append(vcalendar);
    vcalendar->SetFlag("m");
    return;
}

Go back  1   2   3   4   5   6   Apdx   Next page