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

📄 clockwindow.cpp

📁 一个基于BREW上的电子时钟程序,通过太阳历计算当前时间,并有闹铃和日志功能.
💻 CPP
字号:
//
//      ClockWindow.cpp
//
//      Copyright (C) 2006 Sophia Cradle Incorporated

#include "ClockWindow.hpp"
#include "SGRSoftkeyWindow.hpp"
#include "SGRSoftkeyToolbox.hpp"
#include "AlarmSettingDialog.hpp"
#include "pclock.hpp"
#include "VDialog.hpp"

#define CLOCKWINDOW_LABEL_SOFTKEY1				"廔椆"
#define CLOCKWINDOW_LABEL_SOFTKEY2				"愝掕"
#define CLOCKWINDOW_LABEL_SOFTKEY3				"愗懼"
#define CLOCKWINDOW_CLOCKUPDATE_DELAY			1000

ClockWindow::ClockWindow(SFRApplicationPtr parent, SFXRectangleConstRef rect, SFXWideStringConstRef cityName, SFXDateDurationConstRef timeDifference, Float64 longitude, Float64 latitude, Float64 height) static_throws : SFRPlainWindow(parent, rect), _calendarShowing(false), _clock(null), _astronomy(null), _calendar(null), _cityDialog(null), _simulation(false), _cityName(cityName), _timeDifference(timeDifference), _longitude(longitude), _latitude(latitude), _height(height)
{
	SGRSoftkeyWindowPtr softkey;

	SGRSoftkeyWindow::Initialize(this);
	_astronomyRect.SetSize(rect.GetWidth(), 130);	
	_clockRect.SetSize(rect.GetWidth(), rect.GetHeight() - _astronomyRect.GetHeight());
	_clockRect.SetOrigin(rect.GetOrigin());
	_astronomyRect.SetOrigin(rect.GetOrigin());
	_astronomyRect.SnapTop(_clockRect.GetBottom());
	_calendarRect = _astronomyRect;

	if (static_try()) {
		_clock = ::new ClockPane(this, _clockRect, _cityName, _timeDifference);
		if (_clock == null) {
			static_throw(SFERR_NO_MEMORY);
		}
		else {
			static_throw(*_clock);
		}
	}
	
	if (static_try()) {		// 昤夋僴儞僪儔偺搊榐
		static_throw(RegisterHandler(SFEVT_APP_RESUME, HANDLER_BEFORE, HANDLER_FUNCTION(OnAppResume)));
	}
    if (static_try()) {		// 僉乕 僀儀儞僩 僴儞僪儔偺搊榐
		static_throw(RegisterHandler(SFEVT_KEY, HANDLER_BEFORE, HANDLER_FUNCTION(OnKey)));
    }
	if (static_try()) {		// 僜僼僩 僉乕 僴儞僪儔偺搊榐
		static_throw(RegisterHandler(static_cast<SFCEventEnum>(SGRSoftkeyWindow::USEREVT_SOFTKEY), HANDLER_AFTER, HANDLER_FUNCTION(OnSoftkey)));
	}

	if (static_try()) {		// 僜僼僩 僉乕偺搊榐
		softkey = SGRSoftkeyWindow::GetInstance();
		if (softkey != null) {
			static_throw(softkey->Register(this, SGRSoftkeyWindow::SOFTKEY_1, CLOCKWINDOW_LABEL_SOFTKEY1));
			if (static_try()) {
				static_throw(softkey->Register(this, SGRSoftkeyWindow::SOFTKEY_2, CLOCKWINDOW_LABEL_SOFTKEY2));
			}
			if (static_try()) {
				static_throw(softkey->Register(this, SGRSoftkeyWindow::SOFTKEY_3, CLOCKWINDOW_LABEL_SOFTKEY3));
			}
			if (static_try()) {
				SetReference(softkey->Bind(this));
			}
		}
	}

	if (static_try()) {
		ShowAstronomy();
	}
	else {
		::delete _clock;
		_clock = null;
	}
}

ClockWindow::~ClockWindow(Void)
{
	SGRSoftkeyWindow::Terminate(this);
}

HANDLER_IMPLEMENT_VOIDRESUME(ClockWindow, OnAppResume, environment)
{
	unused(environment);

	if (_astronomy) {
		_astronomy->UpdateInformation();
	}
	return;
}

// 僜僼僩 僉乕偺僴儞僪儔
HANDLER_IMPLEMENT_VOIDEVENT(ClockWindow, OnSoftkey, event)
{
	SFRTextMenuPtr menu;
	SFCError error(SFERR_NO_ERROR);

	switch (event.GetP16()) {
	case SGRSoftkeyWindow::SOFTKEY_1:
		SFRApplication::Terminate();
		break;
	case SGRSoftkeyWindow::SOFTKEY_2:
		// 娐嫬愝掕儊僯儏乕偺嶌惉
		menu = ::new SFRTextMenu(SGRSoftkeyToolbox::GetMenuPosition(SOFTKEY2_OPERATION_LIMIT), "儊僯儏乕", null, 0);
		if (menu == null) {
			static_throw(SFERR_NO_MEMORY);
		}
		else {
			static_throw(*menu);
		}
		if (!static_try()) {
			::delete menu;
			menu = null;
		}
		else {
			// 崁栚偺惗惉
			error = menu->AppendItem("搒巗偺愝掕", AVK_1, 0xFBF6);
			if (error == SFERR_NO_ERROR) {
				error = menu->AppendItem("傾儔乕儉偺愝掕", AVK_2, 0xFCF6);
			}
			if (error == SFERR_NO_ERROR) {
				error = menu->AppendItem("僶乕僕儑儞忣曬", AVK_3, 0x40F7);
			}
			if (error == SFERR_NO_ERROR) {
				error = SGRSoftkeyToolbox::OpenStandardMenu(menu, HANDLER_FUNCTION(OnSoftkey2Menu));
			}
		}
		break;
	case SGRSoftkeyWindow::SOFTKEY_3:	// 僜僼僩 僉乕 3 偺擖椡傪僶僀僷僗
		if (_calendarShowing && _calendar) {
			// 僇儗儞僟乕昞帵拞偱僔儈儏儗乕僔儑儞傪峴偭偰偄側偄偲偒偼丄帪寁偺峏怴傪堦帪拞抐
			if (!_simulation && _clock) {
				_clock->DelayUpdate(CLOCKWINDOW_CLOCKUPDATE_DELAY);
			}
			_calendar->Invoke(SFXEvent(SFEVT_KEY, AVK_SOFT3, 0));
		}
		break;
	}
}

// 僇儗儞僟乕傪攋婞偟偰楋傪昞帵
Void ClockWindow::ShowAstronomy(Void) static_throws
{
	SFXDate cursor, localDate, today;
	Bool _lastSimulation(_simulation);

	_simulation = false;
	_astronomy = ::new AstronomyPane(this, _astronomyRect, _timeDifference, _longitude, _latitude, _height);
	if (_astronomy == null) {
		static_throw(SFERR_NO_MEMORY);
	}
	else {
		static_throw(*_astronomy);
	}
	if (!static_try()) {
		::delete _astronomy;
		_astronomy = null;
	}
	else {
		if (_calendar) {
			cursor = _calendar->GetCursor();
			localDate = SFXDate::CurrentUTCDate() + _timeDifference;
			today.Set(localDate.GetYear(), localDate.GetMonth(), localDate.GetDay(), 0, 0, 0);
			if (cursor != today) {
				// 僇儗儞僟乕偺僇乕僜儖偑崱擔埲奜偺擔晅傪巜偟偰偄傟偽丄僔儈儏儗乕僔儑儞傪峴偆
				_simulation = true;
				_simulationDate.Set(cursor.GetYear(), cursor.GetMonth(), cursor.GetDay(), 12, 0, 0);
				_simulationDate -= _timeDifference;
			}
			// 昞帵偝傟偰偄傞僇儗儞僟乕傪攋婞
			_calendar->Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE, SRP16_TERMINATE_INVOKE, true));
			_calendar = null;
		}
		_calendarShowing = false;
		if (_simulation) {
			_astronomy->UpdateInformation(_simulationDate);
			_clock->SetSimulation(_simulationDate);
		}
		else {
			_astronomy->UpdateInformation();
			if (_lastSimulation) {
				// 捈慜傑偱僔儈儏儗乕僔儑儞傪峴偭偰偄偨応崌偼夝彍偡傞
				_clock->CancelSimulation();
			}
		}
	}
	SetStatusTarget(true);
}

// 楋傪攋婞偟偰僇儗儞僟乕傪昞帵
Void ClockWindow::ShowCalendar(Void) static_throws
{
	_calendar = ::new CalendarPane(this, _calendarRect);
	if (_calendar == null) {
		static_throw(SFERR_NO_MEMORY);
	}
	else {
		static_throw(*_calendar);
	}
	if (!static_try()) {
		::delete _calendar;
		_calendar = null;
	}
	else {
		_calendar->SetTimeDifference(_timeDifference);
		if (_simulation) {
			// 僔儈儏儗乕僔儑儞拞偼丄僇乕僜儖偺僨僼僅儖僩傪僔儈儏儗乕僔儑儞拞偺擔晅偵崌傢偣傞
			_calendar->SetCursor(_simulationDate + _timeDifference);
		}
		if (_astronomy) {
			// 昞帵偝傟偰偄傞揤暥忣曬傪攋婞
			_astronomy->Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE, SRP16_TERMINATE_INVOKE, true));
			_astronomy = null;
		}
		_calendarShowing = true;
		_calendar->SetStatusTarget(true);
	}
}

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

	// 僇儗儞僟乕昞帵拞偱僔儈儏儗乕僔儑儞傪峴偭偰偄側偄偲偒偼丄帪寁偺峏怴傪堦帪拞抐
	if (_calendarShowing && !_simulation) {
		if (_clock) {
			_clock->DelayUpdate(CLOCKWINDOW_CLOCKUPDATE_DELAY);
		}
	}

	switch (event.GetP16()) {
	case AVK_SELECT:
		if (_calendarShowing) {
			ShowAstronomy();
		}
		else {
			ShowCalendar();
		}
		result = true;
		break;
	case AVK_CLR:
		if (!_calendarShowing) {
			// 僇儗儞僟乕偑昞帵偝傟偰偄側偄応崌
			if (_simulation) {
				// 僔儈儏儗乕僔儑儞拞偵僋儕傾 僉乕偑墴偝傟偨応崌偼丄僔儈儏儗乕僔儑儞傪廔椆偡傞
				_simulation = false;
				if (_clock) {
					_clock->CancelSimulation();
				}
				if (_astronomy) {
					_astronomy->UpdateInformation();
				}
				InvalidateContent();
			}
			result = true;	// 僋儕傾 僉乕偱傾僾儕偑廔椆偡傞偺傪杊偖
		}
	}

	return result;
}

// 僜僼僩 僉乕 2 偱昞帵偝傟傞儊僯儏乕偺僴儞僪儔
HANDLER_IMPLEMENT_VOIDMENU(ClockWindow, OnSoftkey2Menu, result, menu)
{
	AlarmSettingDialogPtr alarmDialog(null);
	VDialogPtr versionDialog(null);

	switch (result) {
	case SOFTKEY2_OPERATION_CITY:	// 搒巗忣曬偺愝掕
		SGRSoftkeyToolbox::CloseStandardMenu(menu);
		_cityDialog = ::new CitySelectionDialog;
		if (_cityDialog == null) {
			static_throw(SFERR_NO_MEMORY);
		}
		else {
			static_throw(*_cityDialog);
		}
		if (!static_try()) {
			::delete _cityDialog;
			_cityDialog = null;
		}
		if (_cityDialog && static_try()) {
			static_throw(_cityDialog->RegisterHandler(SFEVT_KEY, HANDLER_BEFORE, HANDLER_FUNCTION(OnCityDialogKey)));
		}
		break;
	case SOFTKEY2_OPERATION_ALARM:	// 傾儔乕儉偺愝掕
		SGRSoftkeyToolbox::CloseStandardMenu(menu);
		alarmDialog = ::new AlarmSettingDialog(_timeDifference);
		if (!alarmDialog) {
			static_throw(SFERR_NO_MEMORY);
		}
		else {
			static_throw(*alarmDialog);
		}
		if (!static_try()) {
			::delete alarmDialog;
			alarmDialog = null;
		}
		break;
	case SOFTKEY2_OPERATION_VERSION:	// 僶乕僕儑儞忣曬
		SGRSoftkeyToolbox::CloseStandardMenu(menu);
		versionDialog = ::new VDialog;
		if (!versionDialog) {
			static_throw(SFERR_NO_MEMORY);
		}
		else {
			static_throw(*versionDialog);
		}
		if (!static_try()) {
			::delete versionDialog;
			versionDialog = null;
		}
		break;
	case SRP16_ESCAPE:
	case SRP16_CANCEL:
		SGRSoftkeyToolbox::CloseStandardMenu(menu);
		break;
	}
}

// 搒巗忣曬傪帪寁傗楋丄僇儗儞僟乕偵斀塮偝偣傞
Void ClockWindow::SetCity(SFXWideStringConstRef cityName, SFXDateDurationConstRef timeDifference, Float64 longitude, Float64 latitude, Float64 height)
{
	SFXDate oldLocalSimulationDate;

	if (_simulation) {
		oldLocalSimulationDate = _simulationDate + _timeDifference;
	}

	_cityName.Set(cityName);
	_timeDifference.Set(timeDifference);
	_longitude = longitude;
	_latitude = latitude;
	_height = height;

	if (_simulation) {
		_simulationDate = oldLocalSimulationDate - _timeDifference;
	}

	if (_clock) {
		_clock->SetCityName(_cityName);
		_clock->SetTimeDifference(_timeDifference);
		if (_simulation) {
			_clock->SetSimulation(_simulationDate);
		}
	}
	if (_calendar) {
		_calendar->SetTimeDifference(_timeDifference);
		_calendar->InvalidateContent();
	}
	if (_astronomy) {
		_astronomy->SetObserverPosition(_longitude, _latitude, _height);
		_astronomy->SetTimeDifference(_timeDifference);
		if (_simulation) {
			_astronomy->UpdateInformation(_simulationDate);
		}
		else {
			_astronomy->UpdateInformation();
		}
	}
}

// 儕僗僩偑慖戰偝傟偨偲偒偺僴儞僪儔
HANDLER_IMPLEMENT_BOOLEVENT(ClockWindow, OnCityDialogKey, event)
{
	pclockPtr app(static_cast<pclockPtr>(SFRApplication::GetInstance()));
	SInt32 index(0);
	Bool result(false);

	switch (event.GetP16()) {
	case AVK_SELECT:
		if (_cityDialog) {
			index = _cityDialog->GetSelect();
			_cityDialog->Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE, SRP16_TERMINATE_INVOKE, true));
			_cityDialog = null;
			app->SetCurrentCity(index);
			result = true;
		}
		break;
	}

	return result;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -