📄 calendarpane.cpp
字号:
//
// CalendarPane.cpp
//
// Copyright (C) 2006 Sophia Cradle Incorporated
#include "CalendarPane.hpp"
CalendarPane::CalendarPane(SFRResponderPtr responder, SFXRectangleConstRef rect, SGRCalendarControl::YearFormatEnum yearFormat, SGRCalendarControl::MonthFormatEnum monthFormat, SGRCalendarControl::DayFormatEnum dayFormat, Bool beginMonday) static_throws : SFRPane(responder, rect, SFXMargin(0, 0, 0, 0)), _calendar(null)
{
if (static_try()) {
_calendar = ::new SGRCalendarControl(this, GetContentWorld(), yearFormat, monthFormat, dayFormat, beginMonday);
if (_calendar == null) {
static_throw(SFERR_NO_MEMORY);
}
else {
static_throw(*_calendar);
}
}
if (!static_try()) {
::delete _calendar;
_calendar = null;
}
else {
static_throw(RegisterHandler(SFEVT_KEY, HANDLER_BEFORE, HANDLER_FUNCTION(OnKey)));
_calendar->SetStatusTarget(true);
}
SetAutoUpdateTimer();
}
CalendarPane::~CalendarPane(Void)
{
SFBShellSmp shell(SFBShell::GetInstance());
shell->CancelTimer(null, this);
}
HANDLER_IMPLEMENT_BOOLEVENT(CalendarPane, OnKey, event)
{
SFXDate cursor;
SFXDate maxDate(0x7FFFFFFF);
Bool result(false);
switch (event.GetP16()) {
case AVK_SOFT3:
// 僜僼僩 僉乕偺 3 偼丄慜偺寧傊堏摦
cursor = _calendar->GetCursor();
if (cursor >= SFXDate(1981, 2, 1, 0, 0, 0)) {
cursor.SubMonth(1);
}
_calendar->SetCursor(cursor);
_calendar->InvalidateContent();
result = true;
break;
case AVK_SOFT4:
// 僜僼僩 僉乕偺 4 偼丄師偺寧傊堏摦
cursor = _calendar->GetCursor();
maxDate.Set(maxDate.GetYear(), 1, 1, 0, 0, 0);
maxDate.SubMonth(1);
if (cursor < maxDate) {
cursor.AddMonth(1);
}
_calendar->SetCursor(cursor);
_calendar->InvalidateContent();
result = true;
break;
case AVK_0:
case AVK_1:
case AVK_2:
case AVK_3:
case AVK_4:
case AVK_5:
case AVK_6:
case AVK_7:
case AVK_8:
case AVK_9:
case AVK_STAR:
case AVK_POUND:
case AVK_CLR:
// 僥儞僉乕偲僋儕傾 僉乕偼乽崱擔傊堏摦乿
_calendar->SetCursor(SFXDate::CurrentUTCDate() + _calendar->GetTimeDifference());
_calendar->InvalidateContent();
result = true;
break;
}
return result;
}
// 擔晅帺摦峏怴
Void CalendarPane::AutoUpdateSPP(VoidPtr data)
{
CalendarPanePtr p(static_cast<CalendarPanePtr>(data));
SFRApplication::GetInstance()->Invoke(SFXEvent(SREVT_RESPONDER_RENDER, SRP16_RENDER_INVOKE, true));
p->SetAutoUpdateTimer();
}
// 堦掕帪娫偛偲偵僇儗儞僟乕傪峏怴 (乽崱擔乿偺惍崌惈傪偲傞偨傔)
Void CalendarPane::SetAutoUpdateTimer(Void)
{
SFXDate currentDate, nextUpdate;
SFXDateDuration sec;
SFBShellSmp shell(SFBShell::GetInstance());
if (!_calendar) {
return;
}
shell->CancelTimer(AutoUpdateSPP, this);
currentDate = SFXDate::CurrentUTCDate() + _calendar->GetTimeDifference();
nextUpdate.Set(currentDate.GetYear(), currentDate.GetMonth(), currentDate.GetDay(), currentDate.GetHour(), 0, 0);
nextUpdate.AddHour(1);
sec = nextUpdate - currentDate;
shell->SetTimer(sec.ToSInt32() * 1000, AutoUpdateSPP, this);
}
HANDLER_IMPLEMENT_VOIDRESUME(CalendarPane, OnAppResume, environment)
{
unused(environment);
InvalidateContent();
SetAutoUpdateTimer();
return;
}
HANDLER_IMPLEMENT_VOIDSUSPEND(CalendarPane, OnAppSuspend, reason, info)
{
SFBShellSmp shell(SFBShell::GetInstance());
unused(reason);
unused(info);
shell->CancelTimer(null, this);
return;
}
// 乽崱擔乿偺偨傔偵丄帪嵎傪愝掕偡傞 (寁嶼偼慡偰 UTC 儀乕僗偱峴偆偨傔)
Void CalendarPane::SetTimeDifference(SFXDateDurationConstRef difference)
{
if (_calendar) {
_calendar->SetTimeDifference(difference);
SetAutoUpdateTimer();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -