📄 pclock.cpp
字号:
//
// pclock.cpp
//
// Copyright (C) 2006 Sophia Cradle Incorporated
#include "pclock.hpp"
#include "SGRSoftkeyWindow.hpp"
#include "SGRSoftkeyToolbox.hpp"
#define PCLOCK_CONFIG_FILENAME "config.cfg"
#define PCLOCK_CURRENTCITY_TAG 0
#define PCLOCK_ALARM_SUBJECT_TAG 1
#define PCLOCK_ALARM_DATE_TAG 2
#define PCLOCK_ALARM_SOUNDFILE "alarm.qcp"
#define PCLOCK_ALARMDIALOG_HEIGHT 220
// 僽乕僩 儘乕僟
SFCApplet::FactorySPP SFCApplet::Boot(AEECLSID id, SFXAnsiStringPtr license)
{
*license = "heap://U3TDGVKUPSNWQC6T2X9Z9RFYIWC2Y9R6YCSMT0PV0Y4Y3SCRFWCY9UG96XHT7TQZ9U7RET7RDYFUGXNXHR9R7VDTPLVJOUHXHT2WGY3T5WQUQVHX7WPW6SDS0GX8ROYLW3TIT9XKXQVKXKUIR9UPZ1VIU8T6XAEU6THR7SDYIUEU3XH1Y7RGUES0S8U3R8VCT9XPRHVQUKTKCTAU9WIRQ2XBT5R5S5W94BY7T5RQW2U8WHVFS7Y8RHW9XHWAVNUGUGWKT6V4VLTOW1S1Y6T9JR0T4CXNWNSN9XLSQ8T1V0SIT7Y9Y2RCU2XORFXCSIU4U5TQ6XGX7Z8S9YOU2X9U1WOV4YGTAVOJWJVK1XG6";
return (id == AEECLSID_PCLOCK) ? (&pclock::Factory) : (null);
}
// 僼傽僋僩儕娭悢
SFCInvokerPtr pclock::Factory(Void)
{
return ::new pclock;
}
// 僐儞僗僩儔僋僞
pclock::pclock(Void) static_throws : _clockWindow(null), _alarmFlag(false), _toRemoveDialog(null)
{
// 偙偙偱奺庬僴儞僪儔偺搊榐傪峴偄傑偡丅
if (static_try()) {
static_throw(RegisterHandler(SFEVT_APP_START, HANDLER_BEFORE, HANDLER_FUNCTION(OnAppStart)));
}
if (static_try()) {
static_throw(RegisterHandler(SFEVT_APP_STOP, HANDLER_AFTER, HANDLER_FUNCTION(OnAppStop)));
}
if (static_try()) {
static_throw(RegisterHandler(SFEVT_APP_RESUME, HANDLER_BEFORE, HANDLER_FUNCTION(OnAppResume)));
}
if (static_try()) {
static_throw(RegisterHandler(SFEVT_APP_SUSPEND, HANDLER_AFTER, HANDLER_FUNCTION(OnAppSuspend)));
}
if (static_try()) {
static_throw(RegisterHandler(SFEVT_KEY, HANDLER_AFTER, HANDLER_FUNCTION(OnKey)));
}
if (static_try()) {
// 傾儔乕儉偺僀儀儞僩 僴儞僪儔傪搊榐
static_throw(RegisterHandler(SFEVT_ALARM, HANDLER_BEFORE, HANDLER_FUNCTION(OnAlarm)));
}
return;
}
// 僨僗僩儔僋僞
pclock::~pclock(Void)
{
return;
}
// 傾僾儕奐巒僴儞僪儔
HANDLER_IMPLEMENT_VOIDSTART(pclock, OnAppStart, environment)
{
// 枹巊梡曄悢偺儚乕僯儞僌傪夞旔偟傑偡丅
unused(environment);
// 偙偙偵傾僾儕奐巒帪偺張棟傪婰弎偟傑偡丅
SGRSoftkeyWindowPtr softkey;
SFXConfig config;
SInt32 index;
CityInformation::CITY city;
SFXDateConst defaultDate(2001, 1, 1, 0, 0, 0);
UInt32 sec(0);
// AEE_FONT_NORMAL 偱昤夋偡傞僼僅儞僩傪曄峏
#if TARGET_VERSION_GE(3, 1, 0)
SFXGraphics::RegisterFont(AEE_FONT_NORMAL, KDDI_FONT_FIXED16X16);
#elif TARGET_VERSION_GE(2, 1, 0)
SFXGraphics::RegisterFont(AEE_FONT_NORMAL, AEECLSID_KDDI_SMALL_FONT);
#endif
// 搒巗忣曬偵娭偟偰
config.Load(PCLOCK_CONFIG_FILENAME);
index = _cityInfo.Find(config.ReadSFXWideString(PCLOCK_CURRENTCITY_TAG, "搶嫗"));
city = (index == -1) ? _cityInfo.Get(0) : _cityInfo.Get(index);
_currentCity.Set(city._name);
// 傾儔乕儉偺愝掕偵娭偟偰
_alarmInfo._userCode = 0;
_alarmInfo._subject = config.ReadSFXWideString(PCLOCK_ALARM_SUBJECT_TAG, "");
sec = config.ReadUInt32(PCLOCK_ALARM_DATE_TAG, 0);
_alarmInfo._date.Set((sec > 0) ? sec : defaultDate.ToUInt32());
// 僜僼僩 僉乕偺嶌惉
softkey = :: new SGRSoftkeyWindow(this);
if (softkey == null) {
static_throw(SFERR_NO_MEMORY);
}
else {
static_throw(*softkey);
}
if (!static_try()) {
::delete softkey;
}
_clockWindow = ::new ClockWindow(this, SGRSoftkeyToolbox::GetWindowPosition(), city._name, city._timeDifference, city._longitude, city._latitude, city._height);
if (_clockWindow == null) {
static_throw(SFERR_NO_MEMORY);
}
else {
static_throw(*_clockWindow);
}
if (!static_try()) {
::delete _clockWindow;
}
// 傾儔乕儉偵傛傞婲摦
if (_alarmFlag) {
TellAlarm();
}
return;
}
// 傾僾儕廔椆僴儞僪儔
HANDLER_IMPLEMENT_VOIDSTOP(pclock, OnAppStop, quitable)
{
// 枹巊梡曄悢偺儚乕僯儞僌傪夞旔偟傑偡丅
unused(quitable);
// 偙偙偵傾僾儕廔椆帪偺張棟傪婰弎偟傑偡丅
SFXConfig config;
// 搒巗忣曬偵娭偟偰
config.Load(PCLOCK_CONFIG_FILENAME);
config.WriteSFXWideString(PCLOCK_CURRENTCITY_TAG, _currentCity);
config.Save();
// 壒惡嵞惗屻偺屻巒枛
if (_mediaQCP != null) {
_mediaQCP->Stop();
_mediaQCP.Release();
}
SFBShell::GetInstance()->CancelTimer(null, this);
return;
}
// 傾僾儕嵞奐僴儞僪儔
HANDLER_IMPLEMENT_VOIDRESUME(pclock, OnAppResume, environment)
{
// 枹巊梡曄悢偺儚乕僯儞僌傪夞旔偟傑偡丅
unused(environment);
// 偙偙偵傾僾儕嵞奐帪偺張棟傪婰弎偟傑偡丅
return;
}
// 傾僾儕拞抐僴儞僪儔
HANDLER_IMPLEMENT_VOIDSUSPEND(pclock, OnAppSuspend, reason, info)
{
// 枹巊梡曄悢偺儚乕僯儞僌傪夞旔偟傑偡丅
unused(reason);
unused(info);
// 偙偙偵傾僾儕拞抐帪偺張棟傪婰弎偟傑偡丅
SFBShell::GetInstance()->CancelTimer(null, this);
if (_mediaQCP != null) {
_mediaQCP->Stop();
_mediaQCP.Release();
}
return;
}
// 僉乕 僴儞僪儔
HANDLER_IMPLEMENT_BOOLEVENT(pclock, OnKey, event)
{
// 偙偙偵僉乕偑墴偝傟偨偲偒偺張棟傪婰弎偟傑偡丅
unused(event);
return false;
}
// 怴偨偵慖戰偝傟偨搒巗忣曬傪傾僾儕慡懱偵斀塮偝偣傞
Void pclock::SetCurrentCity(SInt32 index)
{
CityInformation::CITY city((index == -1) ? _cityInfo.Get(0) : _cityInfo.Get(index));
_currentCity.Set(city._name);
if (_clockWindow) {
_clockWindow->SetCity(city._name, city._timeDifference, city._longitude, city._latitude, city._height);
}
}
// 傾儔乕儉傪愝掕偡傞
// 傾儔乕儉偼暘扨埵偱偟偐愝掕偱偒側偄偺偱丄僞僀儅乕偲暪梡偡傞
Bool pclock::SetAlarm(AlarmInformationConstRef info)
{
SFBShellSmp shell(SFBShell::GetInstance());
SFXDate updateDate, currentDate;
SFXDateDuration duration;
if (shell->AlarmsActive()) {
shell->CancelAlarm(AEECLSID_PCLOCK, _alarmInfo._userCode);
}
_alarmInfo = info;
_alarmInfo._userCode = 0;
currentDate = SFXDate::CurrentUTCDate();
updateDate.Set(currentDate.GetYear(), currentDate.GetMonth(), currentDate.GetDay(), currentDate.GetHour(), currentDate.GetMinute(), 0);
updateDate.AddMinute(1);
duration = updateDate - currentDate;
// 帪崗偑偪傚偆偳 0 昩偵側傞偺傪懸偮
shell->SetTimer(duration.ToSInt32() * 1000, OnTimerSPP, this);
return true;
}
// 傾儔乕儉 僴儞僪儔
HANDLER_IMPLEMENT_BOOLEVENT(pclock, OnAlarm, event)
{
unused(event);
SFBShellSmp shell(SFBShell::GetInstance());
if (shell->ActiveApplet() == AEECLSID_PCLOCK) {
// 尰嵼婲摦拞
TellAlarm();
}
else if (shell->CanStartApplet(AEECLSID_PCLOCK)) {
// 崱偼婲摦偟偰偄側偄偑丄婲摦壜擻偱偁傞応崌
_alarmFlag = true;
shell->StartApplet(AEECLSID_PCLOCK);
}
return true;
}
// 傾儔乕儉偱愝掕偝傟偨帪崗偵側偭偨偙偲傪捠抦偡傞
Void pclock::TellAlarm(Void)
{
SFRMultiDialogPtr dialog(null);
SFRMultiDialog::ParamRec param;
_alarmFlag = false;
_mediaQCP = SFBMediaQCP::NewInstance();
if (_mediaQCP != null) {
_mediaData.clsData = MMD_FILE_NAME;
_mediaData.pData = SFXHelper::strdup(PCLOCK_ALARM_SOUNDFILE);
_mediaData.dwSize = 0;
_mediaQCP->SetMediaData(&_mediaData);
_mediaQCP->Play();
}
param.text = _alarmInfo._subject + " 偺帪娫偱偡丅";
param.ok = "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(), PCLOCK_ALARMDIALOG_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(OnAlarmDialog));
}
}
// 傾儔乕儉傪夝彍偡傞
Bool pclock::CancelAlarm(Void)
{
SFBShellSmp shell(SFBShell::GetInstance());
shell->CancelTimer(null, this);
if (!shell->AlarmsActive()) {
return true;
}
else {
return shell->CancelAlarm(AEECLSID_PCLOCK, _alarmInfo._userCode) == SUCCESS;
}
}
// 帪崗偑偪傚偆偳 0 昩偵側偭偨偲偒偵傾儔乕儉傪愝掕偡傞
Void pclock::OnTimer(Void)
{
SFBShellSmp shell(SFBShell::GetInstance());
SFXDateDuration duration;
SFXConfig config;
SInt32 minute;
duration = _alarmInfo._date - SFXDate::CurrentUTCDate();
minute = duration.ToSInt32() / 60;
if (minute == 0) {
// 傾儔乕儉傪愝掕偡傞娫傕側偔丄帪娫偵側偭偨
TellAlarm();
}
else {
if (shell->SetAlarm(AEECLSID_PCLOCK, _alarmInfo._userCode, minute) == SUCCESS) {
config.Load(PCLOCK_CONFIG_FILENAME);
config.WriteSFXWideString(PCLOCK_ALARM_SUBJECT_TAG, _alarmInfo._subject);
config.WriteUInt32(PCLOCK_ALARM_DATE_TAG, _alarmInfo._date.ToUInt32());
config.Save();
}
}
}
HANDLER_IMPLEMENT_VOIDDIALOG(pclock, OnAlarmDialog, result, dialog)
{
unused(result);
if (_mediaQCP != null) {
_mediaQCP->Stop();
_mediaQCP.Release();
}
SGRSoftkeyToolbox::CloseStandardDialog(dialog);
if (_toRemoveDialog) {
SGRSoftkeyWindow::Terminate(_toRemoveDialog);
_toRemoveDialog->DialogHandler();
_toRemoveDialog = null;
}
}
// 愝掕偝傟偰偄傞傾儔乕儉帪崗傪暥帤楍偵曄姺
SFXWideString pclock::GetAlarmDate(SFXDateDurationConstRef timeDifference)
{
SFXWideString result;
SFXDate alarmLocalDate;
if (IsAlarmActive()) {
alarmLocalDate = _alarmInfo._date + timeDifference;
result = SFXWideString::Format("%hd/%02hd/%02hd %02hd:%02hd", alarmLocalDate.GetYear(), alarmLocalDate.GetMonth(), alarmLocalDate.GetDay(), alarmLocalDate.GetHour(), alarmLocalDate.GetMinute());
}
else {
result = "NONE";
}
return result;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -