📄 alarmsettingdialog.cpp
字号:
//
// AlarmSettingDialog.cpp
//
// Copyright (C) 2006 Sophia Cradle Incorporated
#include "AlarmSettingDialog.hpp"
#include "pclock.hpp"
#include "SGRSoftkeyWindow.hpp"
#include "SGRSoftkeyToolbox.hpp"
#define ALARMSETTINGDIALOG_LABEL_SOFTKEY1 "愝掕"
#define ALARMSETTINGDIALOG_LABEL_SOFTKEY2 "庢徚"
#define ALARMSETTINGDIALOG_LABEL_SOFTKEY3 "慖戰"
#define ALARMSETTINGDIALOG_ERRORDIALOG_HEIGHT 220
AlarmSettingDialog::AlarmSettingDialog(SFXDateDurationConstRef timeDifference) static_throws : SFRTitleWindow(SFRApplication::GetInstance(), SGRSoftkeyToolbox::GetWindowPosition(), "傾儔乕儉偺愝掕"), _onOff(null), _subject(null), _date(null), _hour(null), _minute(null), _dateDialog(null), _timeDifference(timeDifference)
{
SFXRectangle world(GetContentWorld());
SGRSoftkeyWindowPtr softkey;
SFXWideString comboText[] = {"OFF", "ON"};
pclockPtr app(static_cast<pclockPtr>(SFRApplication::GetInstance()));
pclock::AlarmInformationConst alarmInfo(app->GetAlarm());
Bool alarmOn;
SFXWideString subjectString, dateString;
SGRSoftkeyWindow::Initialize(this);
// 嵗昗寁嶼
world.Deflate(10, 10, 10, 10);
_onOffTextRect.Set(world);
_onOffTextRect.DivHeight(8);
_onOffControlRect.Set(_onOffTextRect);
_onOffControlRect.Offset(0, _onOffTextRect.GetHeight());
_subjectTextRect.Set(_onOffControlRect);
_subjectTextRect.Offset(0, _onOffControlRect.GetHeight());
_subjectControlRect.Set(_subjectTextRect);
_subjectControlRect.Offset(0, _subjectTextRect.GetHeight());
_dateTextRect.Set(_subjectControlRect);
_dateTextRect.Offset(0, _subjectControlRect.GetHeight());
_dateControlRect.Set(_dateTextRect);
_dateControlRect.Offset(0, _dateTextRect.GetHeight());
_timeTextRect.Set(_dateControlRect);
_timeTextRect.Offset(0, _dateTextRect.GetHeight());
_hourControlRect.Set(_timeTextRect);
_hourControlRect.Offset(0, _timeTextRect.GetHeight());
_onOffControlRect.SetWidth(120);
_onOffControlRect.Offset(10, 0);
_subjectControlRect.Deflate(10, 0, 30, 0);
_dateControlRect.SetWidth(120);
_dateControlRect.Offset(10, 0);
_hourControlRect.SetWidth(120);
_hourControlRect.Offset(10, 0);
_hourControlRect.DivWidth(4);
_hourTextRect.Set(_hourControlRect);
_hourTextRect.Offset(_hourControlRect.GetWidth(), 0);
_minuteControlRect.Set(_hourTextRect);
_minuteControlRect.Offset(_hourTextRect.GetWidth(), 0);
_minuteTextRect.Set(_minuteControlRect);
_minuteTextRect.Offset(_minuteControlRect.GetWidth(), 0);
// 傾儔乕儉偺惓摉惈傪妋擣
if (alarmInfo._date <= SFXDate::CurrentUTCDate()) {
alarmOn = false;
subjectString.Clear();
_alarmLocalDate = SFXDate::CurrentUTCDate() + _timeDifference;
_alarmLocalDate.Set(_alarmLocalDate.GetYear(), _alarmLocalDate.GetMonth(), _alarmLocalDate.GetDay(), _alarmLocalDate.GetHour(), 0, 0);
_alarmLocalDate.AddHour(1);
dateString = SFXWideString::Format("%04hd擭%02hd寧%02hd擔", _alarmLocalDate.GetYear(), _alarmLocalDate.GetMonth(), _alarmLocalDate.GetDay());
}
else if (!app->IsAlarmActive()) {
alarmOn = false;
subjectString.Set(alarmInfo._subject);
_alarmLocalDate = alarmInfo._date + _timeDifference;
dateString = SFXWideString::Format("%04hd擭%02hd寧%02hd擔", _alarmLocalDate.GetYear(), _alarmLocalDate.GetMonth(), _alarmLocalDate.GetDay());
}
else {
alarmOn = true;
subjectString.Set(alarmInfo._subject);
_alarmLocalDate = alarmInfo._date + _timeDifference;
dateString = SFXWideString::Format("%04hd擭%02hd寧%02hd擔", _alarmLocalDate.GetYear(), _alarmLocalDate.GetMonth(), _alarmLocalDate.GetDay());
}
// 儗僗億儞僟偺惗惉
if (static_try()) {
_onOff = ::new SFRComboboxControl(this, _onOffControlRect, comboText, lengthof(comboText));
if (!_onOff) {
static_throw(SFERR_NO_MEMORY);
}
else {
static_throw(*_onOff);
}
}
if (!static_try()) {
::delete _onOff;
_onOff = null;
}
else {
_onOff->SetValue(alarmOn ? 1 : 0);
}
if (static_try()) {
_subject = ::new SFRBrewTextControl(this, _subjectControlRect, subjectString);
if (!_subject) {
static_throw(SFERR_NO_MEMORY);
}
else {
static_throw(*_subject);
}
if (!static_try()) {
::delete _subject;
_subject = null;
}
else {
_subject->SetStatusEnable(alarmOn);
}
}
if (static_try()) {
_date = ::new SFRButtonControl(this, _dateControlRect, dateString);
if (!_date) {
static_throw(SFERR_NO_MEMORY);
}
else {
static_throw(*_date);
}
if (!static_try()) {
::delete _date;
_date = null;
}
else {
_date->SetStatusEnable(alarmOn);
}
}
if (static_try()) {
_hour = ::new SGRNumberTextControl(this, _hourControlRect, 2, 0, 23, _alarmLocalDate.GetHour());
if (!_hour) {
static_throw(SFERR_NO_MEMORY);
}
else {
static_throw(*_hour);
}
if (!static_try()) {
::delete _hour;
_hour = null;
}
else {
_hour->SetStatusEnable(alarmOn);
}
}
if (static_try()) {
_minute = ::new SGRNumberTextControl(this, _minuteControlRect, 2, 0, 59, _alarmLocalDate.GetMinute());
if (!_minute) {
static_throw(SFERR_NO_MEMORY);
}
else {
static_throw(*_minute);
}
if (!static_try()) {
::delete _minute;
_minute = null;
}
else {
_minute->SetStatusEnable(alarmOn);
}
}
// 僴儞僪儔偺搊榐
if (static_try()) {
static_throw(RegisterHandler(SREVT_RESPONDER_RENDER, SRP16_RENDER_CONTENT, HANDLER_BEFORE, HANDLER_FUNCTION(OnContent)));
}
if (static_try()) {
static_throw(RegisterHandler(SFEVT_KEY, HANDLER_AFTER, HANDLER_FUNCTION(OnKey)));
}
if (static_try()) {
static_throw(RegisterHandler(static_cast<SFCEventEnum>(SGRSoftkeyWindow::USEREVT_SOFTKEY), HANDLER_AFTER, HANDLER_FUNCTION(OnSoftkey)));
}
if (static_try()) {
static_throw(_onOff->RegisterHandler(SREVT_CONTROL, HANDLER_BEFORE, HANDLER_FUNCTION(OnAlarmCombo)));
}
if (static_try()) {
static_throw(_date->RegisterHandler(SREVT_CONTROL, HANDLER_BEFORE, HANDLER_FUNCTION(OnDateButton)));
}
if (static_try()) {
static_throw(SFRToolbox::RegisterManipulateHandler(this));
}
if (static_try()) {
static_throw(RegisterHandler(SFEVT_KEY, AVK_SELECT, HANDLER_AFTER, HANDLER_FUNCTION(OnSelect)));
}
if (static_try()) {
#if TARGET_VERSION_GE(3, 1, 0)
static_throw(RegisterHandler(SFEVT_CTL_TEXT_MODECHANGED, 0x8001, HANDLER_AFTER, HANDLER_FUNCTION(OnDone)));
#else
static_throw(RegisterHandler(SFEVT_CTL_TEXT_MODECHANGED, HANDLER_AFTER, HANDLER_FUNCTION(OnDone)));
#endif
}
// 僜僼僩 僉乕偺搊榐
if ((softkey = SGRSoftkeyWindow::GetInstance()) != null) {
static_throw(softkey->Register(this, SGRSoftkeyWindow::SOFTKEY_1, ALARMSETTINGDIALOG_LABEL_SOFTKEY1));
if (static_try()) {
static_throw(softkey->Register(this, SGRSoftkeyWindow::SOFTKEY_2, ALARMSETTINGDIALOG_LABEL_SOFTKEY2));
}
if (static_try()) {
static_throw(softkey->Register(this, SGRSoftkeyWindow::SOFTKEY_3, ALARMSETTINGDIALOG_LABEL_SOFTKEY3));
}
if (static_try()) {
SetReference(softkey->Bind(this));
}
}
if (_onOff) {
_onOff->SetStatusFocus(true);
}
}
AlarmSettingDialog::~AlarmSettingDialog(Void)
{
SGRSoftkeyWindow::Terminate(this);
}
HANDLER_IMPLEMENT_VOIDRENDER(AlarmSettingDialog, OnContent, graphics)
{
graphics->ClearRectangle(GetContentWorld());
graphics->DrawText("傾儔乕儉 ON/OFF", _onOffTextRect, SFXRGBColor(0, 0, 0, 0), IDF_ALIGN_LEFT | IDF_ALIGN_MIDDLE);
graphics->DrawText("審柤", _subjectTextRect, SFXRGBColor(0, 0, 0, 0), IDF_ALIGN_LEFT | IDF_ALIGN_MIDDLE);
graphics->DrawText("擔晅", _dateTextRect, SFXRGBColor(0, 0, 0, 0), IDF_ALIGN_LEFT | IDF_ALIGN_MIDDLE);
graphics->DrawText("帪崗", _timeTextRect, SFXRGBColor(0, 0, 0, 0), IDF_ALIGN_LEFT | IDF_ALIGN_MIDDLE);
graphics->DrawText("帪", _hourTextRect, SFXRGBColor(0, 0, 0, 0), IDF_ALIGN_LEFT | IDF_ALIGN_MIDDLE);
graphics->DrawText("暘", _minuteTextRect, SFXRGBColor(0, 0, 0, 0), IDF_ALIGN_LEFT | IDF_ALIGN_MIDDLE);
}
HANDLER_IMPLEMENT_BOOLEVENT(AlarmSettingDialog, OnKey, event)
{
Bool result(false);
// 僼僅乕僇僗偺堏摦
switch (event.GetP16()) {
case AVK_UP:
FocusUp();
result = true;
break;
case AVK_LEFT:
FocusUp();
result = true;
break;
case AVK_DOWN:
FocusDown();
result = true;
break;
case AVK_RIGHT:
FocusDown();
result = true;
break;
case AVK_CLR:
// 僋儕傾 僉乕偼僜僼僩 僉乕 2 (庢徚) 偲摨偠埖偄
result = Invoke(SFXEvent(static_cast<SFCEventEnum>(SGRSoftkeyWindow::USEREVT_SOFTKEY), SGRSoftkeyWindow::SOFTKEY_2, 0));
break;
}
return result;
}
// 僙儗僋僩 僉乕 僴儞僪儔
HANDLER_IMPLEMENT_BOOLVOID(AlarmSettingDialog, OnSelect)
{
SFRControlPtr control;
Bool result(false);
if ((control = static_cast<SFRControlPtr>(GetFocus())) != null) {
if (control->GetAttribute() == ATTRIBUTE_BREWTEXTCONTROL) {
control->SetStatusTarget(true);
#if defined TARGET_ENVIRONMENT_PHYSICAL
result = control->Invoke(SFXEvent(SFEVT_KEY, AVK_SELECT, 0));
#else
result = true;
#endif
}
}
return result;
}
// 僥僉僗僩 僐儞僩儘乕儖擖椡廔椆僴儞僪儔
HANDLER_IMPLEMENT_VOIDVOID(AlarmSettingDialog, OnDone)
{
#if defined TARGET_ENVIRONMENT_PHYSICAL
SFRControlPtr control;
if ((control = static_cast<SFRControlPtr>(GetFocus())) != null) {
if (control->GetAttribute() == ATTRIBUTE_BREWTEXTCONTROL) {
control->SetStatusTarget(false);
}
}
#endif
}
// 傾儔乕儉 ON/OFF 僐儞儃儃僢僋僗偺僀儀儞僩 僴儞僪儔
HANDLER_IMPLEMENT_VOIDCONTROL(AlarmSettingDialog, OnAlarmCombo, result, control)
{
unused(control);
Bool alarmOn(false);
if (result != SRP16_ESCAPE) {
alarmOn = (_onOff->GetValue() == 1);
if (_subject) {
_subject->SetStatusEnable(alarmOn);
}
if (_date) {
_date->SetStatusEnable(alarmOn);
}
if (_hour) {
_hour->SetStatusEnable(alarmOn);
}
if (_minute) {
_minute->SetStatusEnable(alarmOn);
}
if (_subject && alarmOn) {
_subject->SetStatusFocus(true);
}
}
}
// 擔晅慖戰儃僞儞偺僀儀儞僩 僴儞僪儔
HANDLER_IMPLEMENT_VOIDCONTROL(AlarmSettingDialog, OnDateButton, result, control)
{
unused(result);
unused(control);
if (static_try()) {
_dateDialog = ::new DateSelectionDialog(_alarmLocalDate, _timeDifference);
if (!_dateDialog) {
static_throw(SFERR_NO_MEMORY);
}
else {
static_throw(*_dateDialog);
}
if (!static_try()) {
::delete _dateDialog;
_dateDialog = null;
}
}
if (static_try()) {
static_throw(_dateDialog->RegisterHandler(SREVT_WINDOW, HANDLER_AFTER, HANDLER_FUNCTION(OnDateSelectionDialog)));
}
}
HANDLER_IMPLEMENT_VOIDEVENT(AlarmSettingDialog, OnDateSelectionDialog, event)
{
if (event.GetP16() == SRP16_OK && _dateDialog) {
_alarmLocalDate = _dateDialog->GetCursor();
_dateDialog->Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE, SRP16_TERMINATE_INVOKE, true));
if (_date) {
_date->SetTitle(SFXWideString::Format("%04hd擭%02hd寧%02hd擔", _alarmLocalDate.GetYear(), _alarmLocalDate.GetMonth(), _alarmLocalDate.GetDay()));
InvalidateContent();
}
}
}
HANDLER_IMPLEMENT_VOIDEVENT(AlarmSettingDialog, OnSoftkey, event)
{
pclockPtr app(static_cast<pclockPtr>(SFRApplication::GetInstance()));
pclock::AlarmInformation alarmInfo;
SFXDate localDate;
Bool alarmOn(false), result(false);
SFRMultiDialogPtr dialog(null);
SFRMultiDialog::ParamRec param;
switch (event.GetP16()) {
case SGRSoftkeyWindow::SOFTKEY_1:
// 僞僀儅乕愝掕
if (_onOff) {
alarmOn = (_onOff->GetValue() == 1);
}
if (!alarmOn && app->IsAlarmActive()) {
result = app->CancelAlarm();
if (!result) {
// 傾儔乕儉偺夝彍偵幐攕偟偨
param.text = "傾儔乕儉偑夝彍偱偒傑偣傫偱偟偨丅";
param.ok = "Ok";
param.cancel = "";
param.another = "";
param.focus = SFRMultiDialog::FOCUS_OK;
param.image = SFBShell::GetInstance()->LoadResImage(PCLOCK_RESOURCE_FILENAME, CANCEL);
}
}
else {
if (_subject && _hour && _minute) {
alarmInfo._subject.Set(_subject->GetText());
localDate.Set(_alarmLocalDate.GetYear(), _alarmLocalDate.GetMonth(), _alarmLocalDate.GetDay(), static_cast<UInt16>(_hour->GetValue()), static_cast<UInt16>(_minute->GetValue()), 0);
alarmInfo._date = localDate - _timeDifference;
if (alarmInfo._date <= SFXDate::CurrentUTCDate()) {
// 夁嫀偺帪崗傪愝掕偟傛偆偲偟偰偄傞
param.text = "夁嫀偺擔帪傪愝掕偡傞偙偲偼偱偒傑偣傫丅";
param.ok = "Ok";
param.cancel = "";
param.another = "";
param.focus = SFRMultiDialog::FOCUS_OK;
param.image = SFBShell::GetInstance()->LoadResImage(PCLOCK_RESOURCE_FILENAME, CANCEL);
result = false;
}
else {
result = app->SetAlarm(alarmInfo);
if (!result) {
param.text = "傾儔乕儉偑愝掕偱偒傑偣傫偱偟偨丅";
param.ok = "Ok";
param.cancel = "";
param.another = "";
param.focus = SFRMultiDialog::FOCUS_OK;
param.image = SFBShell::GetInstance()->LoadResImage(PCLOCK_RESOURCE_FILENAME, CANCEL);
}
}
}
}
if (!result) {
dialog = ::new SFRMultiDialog(SGRSoftkeyToolbox::GetDialogPosition(SFRMultiDialog::GetMargin(), ALARMSETTINGDIALOG_ERRORDIALOG_HEIGHT), "僄儔乕", param);
if (dialog) {
static_throw(*dialog);
}
if (!static_try()) {
::delete dialog;
dialog = null;
}
else {
SGRSoftkeyToolbox::OpenStandardDialog(dialog, HANDLER_FUNCTION(OnErrorDialog));
}
}
else {
Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE, SRP16_TERMINATE_INVOKE, true));
}
break;
case SGRSoftkeyWindow::SOFTKEY_2:
// 乽庢徚乿慖戰
Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE, SRP16_TERMINATE_INVOKE, true));
break;
}
}
HANDLER_IMPLEMENT_VOIDDIALOG(AlarmSettingDialog, OnErrorDialog, result, dialog)
{
unused(result);
SGRSoftkeyToolbox::CloseStandardDialog(dialog);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -