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

📄 calendarpane.cpp

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