⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 alarmsettingdialog.cpp

📁 一个基于BREW上的电子时钟程序,通过太阳历计算当前时间,并有闹铃和日志功能.
💻 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 + -