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

📄 cityselectiondialog.cpp

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

#include "CitySelectionDialog.hpp"
#include "SGRSoftkeyWindow.hpp"
#include "SGRSoftkeyToolbox.hpp"
#include "pclock.hpp"
#include "CityInformation.hpp"

#define CITYSELECTIONDIALOG_LABEL_SOFTKEY1			"捛壛"
#define CITYSELECTIONDIALOG_LABEL_SOFTKEY2			"嶍彍"
#define CITYSELECTIONDIALOG_LABEL_SOFTKEY3			"慖戰"
#define CITYSELECTIONDIALOG_ERRORDIALOG_HEIGHT		220
#define CITYSELECTIONDIALOG_REMOVEDIALOG_HEIGHT		220

CitySelectionDialog::CitySelectionDialog(Void) static_throws : SFRTitleWindow(SFRApplication::GetInstance(), SGRSoftkeyToolbox::GetWindowPosition(), "搒巗偺愝掕"), _listBox(null), _additionDialog(null), _gpsDialog(null), _invalidTextControl(null)
{
	SInt16Const fontHeight(SFXGraphics::GetFontHeight(AEE_FONT_NORMAL));
	SFXRectangleConst displayRect(GetContentWorld());
	pclockPtr app(static_cast<pclockPtr>(SFRApplication::GetInstance()));
	CityInformationPtr cityInfo(app->GetCityInformationPointer());
	CityInformation::CITY city;
	SInt32 i;
	SGRSoftkeyWindowPtr softkey;

	SGRSoftkeyWindow::Initialize(this);
	_textRect.SetSize(displayRect.GetWidth(), fontHeight * 2);
	_textRect.SetOrigin(displayRect.GetOrigin());
	_listBoxRect = displayRect;
	_listBoxRect.Deflate(20, _textRect.GetHeight(), 20, 10);
	_textRect.Deflate(10, 0, 10, 0);

	_listBox = ::new SGRListboxControl(this, _listBoxRect);
	if (!_listBox) {
		static_throw(SFERR_NO_MEMORY);
	}
	else {
		static_throw(*_listBox);
	}
	if (!static_try()) {
		::delete _listBox;
		_listBox = null;
	}
	else {
		for (i = 0; i < cityInfo->GetSize(); ++i) {
			city = cityInfo->Get(i);
			static_throw(_listBox->Append(city._name));
			if (!static_try()) {
				break;
			}
		}
	}

	if (static_try()) {
		static_throw(RegisterHandler(SREVT_RESPONDER_RENDER, SRP16_RENDER_CONTENT, HANDLER_BEFORE, HANDLER_FUNCTION(OnContent)));
	}
	if (static_try()) {		// 儗僕儏乕儉
		static_throw(RegisterHandler(SFEVT_APP_RESUME, HANDLER_BEFORE, HANDLER_FUNCTION(OnResume)));
	}
	if (static_try()) {		// 僒僗儁儞僪
		static_throw(RegisterHandler(SFEVT_APP_SUSPEND, HANDLER_AFTER, HANDLER_FUNCTION(OnSuspend)));
	}
	if (static_try()) {
		static_throw(RegisterHandler(static_cast<SFCEventEnum>(SGRSoftkeyWindow::USEREVT_SOFTKEY), HANDLER_AFTER, HANDLER_FUNCTION(OnSoftkey)));
	}
	if (static_try()) {
		if ((softkey = SGRSoftkeyWindow::GetInstance()) != null) {
			static_throw(softkey->Register(this, SGRSoftkeyWindow::SOFTKEY_1, CITYSELECTIONDIALOG_LABEL_SOFTKEY1));
			if (static_try()) {
				static_throw(softkey->Register(this, SGRSoftkeyWindow::SOFTKEY_2, CITYSELECTIONDIALOG_LABEL_SOFTKEY2));
			}
			if (static_try()) {
				static_throw(softkey->Register(this, SGRSoftkeyWindow::SOFTKEY_3, CITYSELECTIONDIALOG_LABEL_SOFTKEY3));
			}
			if (static_try()) {
				SetReference(softkey->Bind(this));
			}
		}
	}

	if (_listBox) {
		_listBox->SetSelect(static_cast<SInt16>(cityInfo->Find(app->GetCurrentCity())));
		_listBox->SetStatusTarget(true);
	}

	SFXHelper::memset(&_gpsCallback, 0, sizeof(_gpsCallback));
	SFXHelper::memset(&_gpsInfo, 0, sizeof(_gpsInfo));
	CALLBACK_Init(&_gpsCallback, OnGPSNotifySPP, this);
}

CitySelectionDialog::~CitySelectionDialog(Void)
{
	CALLBACK_Cancel(&_gpsCallback);
	SGRSoftkeyWindow::Terminate(this);
}

HANDLER_IMPLEMENT_VOIDRENDER(CitySelectionDialog, OnContent, graphics)
{
	graphics->ClearRectangle(GetContentWorld());
	graphics->DrawText("搒巗傪慖戰偟偰偔偩偝偄 :", _textRect, SFXRGBColor(0, 0, 0, 0), IDF_ALIGN_LEFT | IDF_ALIGN_MIDDLE);
}

HANDLER_IMPLEMENT_VOIDEVENT(CitySelectionDialog, OnSoftkey, event)
{
	SInt32 result(SUCCESS), index(0);
	SFXRectangle display, rect;
	SFRMultiDialogPtr dialog;
	SFRMultiDialog::ParamRec param;
	pclockPtr app(static_cast<pclockPtr>(SFRApplication::GetInstance()));
	CityInformationPtr cityInfo(app->GetCityInformationPointer());
	CityInformation::CITY city;
	SGRSoftkeyWindowPtr softkey(null);

	switch (event.GetP16()) {
	case SGRSoftkeyWindow::SOFTKEY_1:
		// 怴偟偄搒巗偺捛壛
		// 埵抲忣曬傪庢摼拞偱偁傞巪傪昞帵
		display.Set(SGRSoftkeyToolbox::GetWindowPosition());
		rect.SetSize(display.GetWidth() - 20, SFXGraphics::GetFontHeight(AEE_FONT_NORMAL) * 2);
		rect.SnapLeftTop(display.GetLeftTop());
		rect.Offset((display.GetWidth() - rect.GetWidth()) / 2, (display.GetHeight() - rect.GetHeight()) / 2);
		_gpsDialog = ::new SFRMessageDialog(rect, "埵抲忣曬庢摼拞...", "");
		if (!_gpsDialog) {
			static_throw(SFERR_NO_MEMORY);
		}
		else {
			static_throw(*_gpsDialog);
		}
		if (!static_try()) {
			::delete _gpsDialog;
			_gpsDialog = null;
		}
		else {
			static_throw(_gpsDialog->RegisterHandler(SFEVT_KEY, HANDLER_BEFORE, HANDLER_FUNCTION(OnNoButtonDialogKey)));
		}
		if (static_try()) {
			SGRSoftkeyWindow::Initialize(_gpsDialog);
			static_throw(_gpsDialog->RegisterHandler(static_cast<SFCEventEnum>(SGRSoftkeyWindow::USEREVT_SOFTKEY), HANDLER_BEFORE, HANDLER_FUNCTION(OnNoButtonDialogSoftkey)));
		}
		softkey = SGRSoftkeyWindow::GetInstance();
		if (softkey && static_try()) {
			_gpsDialog->SetReference(softkey->Bind(_gpsDialog));
		}
		if (_gpsDialog) {
			SFRApplication::GetInstance()->Invoke(SFXEvent(SREVT_RESPONDER_RENDER, SRP16_RENDER_INVOKE, true));
		}
		// GPS 偺婲摦
		_posDet = SFBPosDet::NewInstance();
		if (_posDet == null) {
			OnGPS(false);
		}
		else {
			SFXHelper::memset(&_gpsCallback, 0, sizeof(_gpsCallback));
			SFXHelper::memset(&_gpsInfo, 0, sizeof(_gpsInfo));
			CALLBACK_Init(&_gpsCallback, OnGPSNotifySPP, this);
			result = _posDet->GetGPSInfo(AEEGPS_GETINFO_LOCATION | AEEGPS_GETINFO_ALTITUDE, AEEGPS_ACCURACY_LEVEL6, &_gpsInfo, &_gpsCallback);
			if (result != SUCCESS) {
				// GPS 偺婲摦偵幐攕
				CALLBACK_Cancel(&_gpsCallback);
				_posDet.Release();
				OnGPS(false);
			}
		}
		break;
	case SGRSoftkeyWindow::SOFTKEY_2:
		// 搒巗忣曬偺嶍彍
		if (cityInfo->GetSize() <= 1) {
			// 嵟掅 1 偮偼昁梫
			param.text = "搒巗忣曬偼彮側偔偲傕 1 偮偼昁梫偱偡丅";
			param.ok = "Ok";
			param.cancel = "";
			param.another = "";
			param.focus = SFRMultiDialog::FOCUS_OK;
			param.image = SFBShell::GetInstance()->LoadResImage(PCLOCK_RESOURCE_FILENAME, CANCEL);
			dialog = ::new SFRMultiDialog(SGRSoftkeyToolbox::GetDialogPosition(SFRMultiDialog::GetMargin(), CITYSELECTIONDIALOG_ERRORDIALOG_HEIGHT), "僄儔乕", param);
			if (!dialog) {
				static_throw(SFERR_NO_MEMORY);
			}
			else {
				static_throw(*dialog);
			}
			if (!static_try()) {
				::delete dialog;
				dialog = null;
			}
			else {
				SGRSoftkeyToolbox::OpenStandardDialog(dialog, HANDLER_FUNCTION(OnRemoveErrorDialog));
			}
		}
		else {
			// 嶍彍偺妋擣
			if (_listBox) {
				index = _listBox->GetSelect();
				city = cityInfo->Get(index);
				param.text = "\"" + city._name + "\" 傪嶍彍偟傑偡丅傛傠偟偄偱偡偐?";
				param.ok = "偼偄";
				param.cancel = "偄偄偊";
				param.another = "";
				param.focus = SFRMultiDialog::FOCUS_CANCEL;
				param.image = SFBShell::GetInstance()->LoadResImage(PCLOCK_RESOURCE_FILENAME, ACCEPT);
				dialog = ::new SFRMultiDialog(SGRSoftkeyToolbox::GetDialogPosition(SFRMultiDialog::GetMargin(), CITYSELECTIONDIALOG_REMOVEDIALOG_HEIGHT), "妋擣", param);
				if (!dialog) {
					static_throw(SFERR_NO_MEMORY);
				}
				else {
					static_throw(*dialog);
				}
				if (!static_try()) {
					::delete dialog;
					dialog = null;
				}
				else {
					SGRSoftkeyToolbox::OpenStandardDialog(dialog, HANDLER_FUNCTION(OnRemoveDialog));
				}
			}
		}
		break;
	}
}

// GPS 廔椆屻偺張棟
// valid = true 偺応崌丄GPS偺忣曬傪巊偭偰僟僀傾儘僌傪弶婜壔
Void CitySelectionDialog::OnGPS(Bool valid)
{
	Float64 longitude_f, latitude_f;
	SInt32 val, height_i;
	SFXWideString longitude_s, latitude_s, height_s;
	pclockPtr app(static_cast<pclockPtr>(SFRApplication::GetInstance()));

	if (_gpsDialog) {
		if (_gpsDialog->GetIndexForward() == 0) {
			SGRSoftkeyWindow::Terminate(_gpsDialog);
			_gpsDialog->DialogHandler();
			_gpsDialog = null;
		}
		else {
			app->SetRemoveDialog(_gpsDialog);
			_gpsDialog = null;
		}
	}

	if (valid) {

⌨️ 快捷键说明

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