1e4289a54SKarsten Heimrich /* 2e4289a54SKarsten Heimrich * Copyright 2004-2007, Haiku, Inc. All Rights Reserved. 3e4289a54SKarsten Heimrich * Distributed under the terms of the MIT License. 4e4289a54SKarsten Heimrich * 5e4289a54SKarsten Heimrich * Authors: 6e4289a54SKarsten Heimrich * Andrew McCall <mccall@@digitalparadise.co.uk> 7e4289a54SKarsten Heimrich * Mike Berg <mike@berg-net.us> 8e4289a54SKarsten Heimrich * Julun <host.haiku@gmx.de> 9*1cae077aSStephan Aßmus * Philippe Saint-Pierre <stpere@gmail.com> 10e4289a54SKarsten Heimrich */ 11e4289a54SKarsten Heimrich 12e4289a54SKarsten Heimrich #include "DateTimeView.h" 13e4289a54SKarsten Heimrich #include "AnalogClock.h" 14e4289a54SKarsten Heimrich #include "CalendarView.h" 15e4289a54SKarsten Heimrich #include "DateTimeEdit.h" 16e4289a54SKarsten Heimrich #include "TimeMessages.h" 17*1cae077aSStephan Aßmus #include "DateTime.h" 18e4289a54SKarsten Heimrich 19e4289a54SKarsten Heimrich 20*1cae077aSStephan Aßmus #include <Button.h> 21e4289a54SKarsten Heimrich #include <CheckBox.h> 22e4289a54SKarsten Heimrich #include <Entry.h> 23e4289a54SKarsten Heimrich #include <File.h> 24e4289a54SKarsten Heimrich #include <FindDirectory.h> 25e4289a54SKarsten Heimrich #include <Message.h> 26e4289a54SKarsten Heimrich #include <Path.h> 27e4289a54SKarsten Heimrich #include <RadioButton.h> 28e4289a54SKarsten Heimrich #include <String.h> 29e4289a54SKarsten Heimrich #include <StringView.h> 30e4289a54SKarsten Heimrich #include <Window.h> 31*1cae077aSStephan Aßmus #include <time.h> 32e4289a54SKarsten Heimrich 33e4289a54SKarsten Heimrich 34e4289a54SKarsten Heimrich #ifdef HAIKU_TARGET_PLATFORM_HAIKU 35e4289a54SKarsten Heimrich # include <syscalls.h> 36e4289a54SKarsten Heimrich #else 37a22279faSAxel Dörfler extern "C" void _kset_tzfilename_(const char *name, size_t length, bool isGMT); 38e4289a54SKarsten Heimrich # define _kern_set_tzfilename _kset_tzfilename_ 39e4289a54SKarsten Heimrich #endif 40e4289a54SKarsten Heimrich 41e4289a54SKarsten Heimrich 42e4289a54SKarsten Heimrich DateTimeView::DateTimeView(BRect frame) 4385b69a94SKarsten Heimrich : BView(frame, "dateTimeView", B_FOLLOW_NONE, B_WILL_DRAW | B_NAVIGABLE_JUMP), 44e4289a54SKarsten Heimrich fGmtTime(NULL), 4585b69a94SKarsten Heimrich fUseGmtTime(false), 46*1cae077aSStephan Aßmus fInitialized(false), 47*1cae077aSStephan Aßmus fSystemTimeAtStart(system_time()) 48e4289a54SKarsten Heimrich { 49e4289a54SKarsten Heimrich _ReadRTCSettings(); 5085b69a94SKarsten Heimrich _InitView(); 51*1cae077aSStephan Aßmus 52*1cae077aSStephan Aßmus // record the current time to enable revert. 53*1cae077aSStephan Aßmus time(&fTimeAtStart); 54e4289a54SKarsten Heimrich } 55e4289a54SKarsten Heimrich 56e4289a54SKarsten Heimrich 57e4289a54SKarsten Heimrich DateTimeView::~DateTimeView() 58e4289a54SKarsten Heimrich { 59e4289a54SKarsten Heimrich _WriteRTCSettings(); 60e4289a54SKarsten Heimrich } 61e4289a54SKarsten Heimrich 62e4289a54SKarsten Heimrich 63e4289a54SKarsten Heimrich void 64e4289a54SKarsten Heimrich DateTimeView::AttachedToWindow() 65e4289a54SKarsten Heimrich { 66e4289a54SKarsten Heimrich if (Parent()) 67e4289a54SKarsten Heimrich SetViewColor(Parent()->ViewColor()); 68e4289a54SKarsten Heimrich 69e4289a54SKarsten Heimrich if (!fInitialized) { 70e4289a54SKarsten Heimrich fInitialized = true; 7185b69a94SKarsten Heimrich 7285b69a94SKarsten Heimrich fGmtTime->SetTarget(this); 7385b69a94SKarsten Heimrich fLocalTime->SetTarget(this); 7485b69a94SKarsten Heimrich fCalendarView->SetTarget(this); 75*1cae077aSStephan Aßmus fRevertButton->SetTarget(this); 76e4289a54SKarsten Heimrich } 77e4289a54SKarsten Heimrich } 78e4289a54SKarsten Heimrich 79e4289a54SKarsten Heimrich 80e4289a54SKarsten Heimrich void 81e4289a54SKarsten Heimrich DateTimeView::Draw(BRect /*updateRect*/) 82e4289a54SKarsten Heimrich { 83e4289a54SKarsten Heimrich rgb_color viewcolor = ViewColor(); 84e4289a54SKarsten Heimrich rgb_color dark = tint_color(viewcolor, B_DARKEN_4_TINT); 85e4289a54SKarsten Heimrich rgb_color light = tint_color(viewcolor, B_LIGHTEN_MAX_TINT); 86e4289a54SKarsten Heimrich 87e4289a54SKarsten Heimrich //draw a separator line 88e4289a54SKarsten Heimrich BRect bounds(Bounds()); 8985b69a94SKarsten Heimrich BPoint start(bounds.Width() / 2.0f, bounds.top + 5.0f); 9085b69a94SKarsten Heimrich BPoint end(bounds.Width() / 2.0, bounds.bottom - 5.0f); 91e4289a54SKarsten Heimrich 92e4289a54SKarsten Heimrich BeginLineArray(2); 93e4289a54SKarsten Heimrich AddLine(start, end, dark); 94e4289a54SKarsten Heimrich start.x++; 95e4289a54SKarsten Heimrich end.x++; 96e4289a54SKarsten Heimrich AddLine(start, end, light); 97e4289a54SKarsten Heimrich EndLineArray(); 98e4289a54SKarsten Heimrich 99e4289a54SKarsten Heimrich fTimeEdit->Draw(bounds); 100e4289a54SKarsten Heimrich fDateEdit->Draw(bounds); 101e4289a54SKarsten Heimrich } 102e4289a54SKarsten Heimrich 103e4289a54SKarsten Heimrich 104e4289a54SKarsten Heimrich void 105e4289a54SKarsten Heimrich DateTimeView::MessageReceived(BMessage *message) 106e4289a54SKarsten Heimrich { 107e4289a54SKarsten Heimrich int32 change; 108e4289a54SKarsten Heimrich switch(message->what) { 109e4289a54SKarsten Heimrich case B_OBSERVER_NOTICE_CHANGE: 110e4289a54SKarsten Heimrich message->FindInt32(B_OBSERVE_WHAT_CHANGE, &change); 111e4289a54SKarsten Heimrich switch(change) { 112e4289a54SKarsten Heimrich case H_TM_CHANGED: 113e4289a54SKarsten Heimrich _UpdateDateTime(message); 114e4289a54SKarsten Heimrich break; 115e4289a54SKarsten Heimrich 116e4289a54SKarsten Heimrich default: 117e4289a54SKarsten Heimrich BView::MessageReceived(message); 118e4289a54SKarsten Heimrich break; 119e4289a54SKarsten Heimrich } 120e4289a54SKarsten Heimrich break; 121e4289a54SKarsten Heimrich 122e4289a54SKarsten Heimrich case kDayChanged: 123e4289a54SKarsten Heimrich { 124e4289a54SKarsten Heimrich BMessage msg(*message); 125e4289a54SKarsten Heimrich msg.what = H_USER_CHANGE; 126e4289a54SKarsten Heimrich msg.AddBool("time", false); 127e4289a54SKarsten Heimrich Window()->PostMessage(&msg); 128*1cae077aSStephan Aßmus break; 129*1cae077aSStephan Aßmus } 130e4289a54SKarsten Heimrich 131e4289a54SKarsten Heimrich case kRTCUpdate: 132*1cae077aSStephan Aßmus fUseGmtTime = fGmtTime->Value() == B_CONTROL_ON; 133e4289a54SKarsten Heimrich _UpdateGmtSettings(); 134*1cae077aSStephan Aßmus CheckCanRevert(); 135*1cae077aSStephan Aßmus break; 136*1cae077aSStephan Aßmus 137*1cae077aSStephan Aßmus case kMsgRevert: 138*1cae077aSStephan Aßmus _Revert(); 139*1cae077aSStephan Aßmus fRevertButton->SetEnabled(false); 140e4289a54SKarsten Heimrich break; 141e4289a54SKarsten Heimrich 142e4289a54SKarsten Heimrich default: 143e4289a54SKarsten Heimrich BView::MessageReceived(message); 144e4289a54SKarsten Heimrich break; 145e4289a54SKarsten Heimrich } 146e4289a54SKarsten Heimrich } 147e4289a54SKarsten Heimrich 148e4289a54SKarsten Heimrich 149e4289a54SKarsten Heimrich void 150*1cae077aSStephan Aßmus DateTimeView::CheckCanRevert() 151*1cae077aSStephan Aßmus { 152*1cae077aSStephan Aßmus // check GMT vs Local setting 153*1cae077aSStephan Aßmus bool enable = fUseGmtTime != fOldUseGmtTime; 154*1cae077aSStephan Aßmus 155*1cae077aSStephan Aßmus // check for changed time 156*1cae077aSStephan Aßmus time_t unchangedNow = fTimeAtStart + _PrefletUptime(); 157*1cae077aSStephan Aßmus time_t changedNow; 158*1cae077aSStephan Aßmus time(&changedNow); 159*1cae077aSStephan Aßmus 160*1cae077aSStephan Aßmus enable = enable || (changedNow != unchangedNow); 161*1cae077aSStephan Aßmus 162*1cae077aSStephan Aßmus fRevertButton->SetEnabled(enable); 163*1cae077aSStephan Aßmus } 164*1cae077aSStephan Aßmus 165*1cae077aSStephan Aßmus 166*1cae077aSStephan Aßmus void 167*1cae077aSStephan Aßmus DateTimeView::_Revert() 168*1cae077aSStephan Aßmus { 169*1cae077aSStephan Aßmus // Set the clock and calendar as they were at launch time + 170*1cae077aSStephan Aßmus // time ellapsed since application launch. 171*1cae077aSStephan Aßmus 172*1cae077aSStephan Aßmus fUseGmtTime = fOldUseGmtTime; 173*1cae077aSStephan Aßmus _UpdateGmtSettings(); 174*1cae077aSStephan Aßmus 175*1cae077aSStephan Aßmus if (fUseGmtTime) 176*1cae077aSStephan Aßmus fGmtTime->SetValue(B_CONTROL_ON); 177*1cae077aSStephan Aßmus else 178*1cae077aSStephan Aßmus fLocalTime->SetValue(B_CONTROL_ON); 179*1cae077aSStephan Aßmus 180*1cae077aSStephan Aßmus time_t timeNow = fTimeAtStart + _PrefletUptime(); 181*1cae077aSStephan Aßmus struct tm result; 182*1cae077aSStephan Aßmus struct tm* timeInfo; 183*1cae077aSStephan Aßmus timeInfo = localtime_r(&timeNow, &result); 184*1cae077aSStephan Aßmus 185*1cae077aSStephan Aßmus BDateTime dateTime = BDateTime::CurrentDateTime(B_LOCAL_TIME); 186*1cae077aSStephan Aßmus BTime time = dateTime.Time(); 187*1cae077aSStephan Aßmus BDate date = dateTime.Date(); 188*1cae077aSStephan Aßmus time.SetTime(timeInfo->tm_hour, timeInfo->tm_min, timeInfo->tm_sec % 60); 189*1cae077aSStephan Aßmus date.SetDate(timeInfo->tm_year + 1900, timeInfo->tm_mon + 1, 190*1cae077aSStephan Aßmus timeInfo->tm_mday); 191*1cae077aSStephan Aßmus dateTime.SetTime(time); 192*1cae077aSStephan Aßmus dateTime.SetDate(date); 193*1cae077aSStephan Aßmus 194*1cae077aSStephan Aßmus set_real_time_clock(dateTime.Time_t()); 195*1cae077aSStephan Aßmus } 196*1cae077aSStephan Aßmus 197*1cae077aSStephan Aßmus 198*1cae077aSStephan Aßmus time_t 199*1cae077aSStephan Aßmus DateTimeView::_PrefletUptime() const 200*1cae077aSStephan Aßmus { 201*1cae077aSStephan Aßmus return (time_t)((system_time() - fSystemTimeAtStart) / 1000000); 202*1cae077aSStephan Aßmus } 203*1cae077aSStephan Aßmus 204*1cae077aSStephan Aßmus 205*1cae077aSStephan Aßmus void 206e4289a54SKarsten Heimrich DateTimeView::_InitView() 207e4289a54SKarsten Heimrich { 208e4289a54SKarsten Heimrich font_height fontHeight; 209e4289a54SKarsten Heimrich be_plain_font->GetHeight(&fontHeight); 21085b69a94SKarsten Heimrich float textHeight = fontHeight.descent + fontHeight.ascent 21185b69a94SKarsten Heimrich + fontHeight.leading + 6.0; // 6px border 212e4289a54SKarsten Heimrich 213e4289a54SKarsten Heimrich // left side 21485b69a94SKarsten Heimrich BRect bounds = Bounds(); 21585b69a94SKarsten Heimrich bounds.InsetBy(10.0, 10.0); 21685b69a94SKarsten Heimrich bounds.top += textHeight + 10.0; 217e4289a54SKarsten Heimrich 21885b69a94SKarsten Heimrich fCalendarView = new BCalendarView(bounds, "calendar"); 219e4289a54SKarsten Heimrich fCalendarView->SetWeekNumberHeaderVisible(false); 22085b69a94SKarsten Heimrich fCalendarView->ResizeToPreferred(); 221e4289a54SKarsten Heimrich fCalendarView->SetSelectionMessage(new BMessage(kDayChanged)); 222e4289a54SKarsten Heimrich fCalendarView->SetInvocationMessage(new BMessage(kDayChanged)); 223e4289a54SKarsten Heimrich 22485b69a94SKarsten Heimrich bounds.top -= textHeight + 10.0; 22585b69a94SKarsten Heimrich bounds.bottom = bounds.top + textHeight; 22685b69a94SKarsten Heimrich bounds.right = fCalendarView->Frame().right; 227e4289a54SKarsten Heimrich 22885b69a94SKarsten Heimrich fDateEdit = new TDateEdit(bounds, "dateEdit", 3); 22985b69a94SKarsten Heimrich AddChild(fDateEdit); 23085b69a94SKarsten Heimrich AddChild(fCalendarView); 23185b69a94SKarsten Heimrich 23285b69a94SKarsten Heimrich // right side, 2px extra for separator 23385b69a94SKarsten Heimrich bounds.OffsetBy(bounds.Width() + 22.0, 0.0); 23485b69a94SKarsten Heimrich fTimeEdit = new TTimeEdit(bounds, "timeEdit", 4); 235e4289a54SKarsten Heimrich AddChild(fTimeEdit); 236e4289a54SKarsten Heimrich 23785b69a94SKarsten Heimrich bounds = fCalendarView->Frame(); 23885b69a94SKarsten Heimrich bounds.OffsetBy(bounds.Width() + 22.0, 0.0); 239e4289a54SKarsten Heimrich 24085b69a94SKarsten Heimrich fClock = new TAnalogClock(bounds, "analogClock"); 241e4289a54SKarsten Heimrich AddChild(fClock); 242e4289a54SKarsten Heimrich 243e4289a54SKarsten Heimrich // clock radio buttons 24485b69a94SKarsten Heimrich bounds.top = fClock->Frame().bottom + 10.0; 24585b69a94SKarsten Heimrich BStringView *text = new BStringView(bounds, "clockSetTo", "Clock set to:"); 246e4289a54SKarsten Heimrich AddChild(text); 247e4289a54SKarsten Heimrich text->ResizeToPreferred(); 248e4289a54SKarsten Heimrich 24985b69a94SKarsten Heimrich bounds.left += 10.0f; 25085b69a94SKarsten Heimrich bounds.top = text->Frame().bottom; 25185b69a94SKarsten Heimrich fLocalTime = new BRadioButton(bounds, "localTime", "Local Time", 252e4289a54SKarsten Heimrich new BMessage(kRTCUpdate)); 253e4289a54SKarsten Heimrich AddChild(fLocalTime); 254e4289a54SKarsten Heimrich fLocalTime->ResizeToPreferred(); 255e4289a54SKarsten Heimrich 25685b69a94SKarsten Heimrich bounds.left = fLocalTime->Frame().right + 10.0; 25785b69a94SKarsten Heimrich fGmtTime = new BRadioButton(bounds, "greenwichMeanTime", "GMT", 25885b69a94SKarsten Heimrich new BMessage(kRTCUpdate)); 259e4289a54SKarsten Heimrich AddChild(fGmtTime); 260e4289a54SKarsten Heimrich fGmtTime->ResizeToPreferred(); 261e4289a54SKarsten Heimrich 26285b69a94SKarsten Heimrich if (fUseGmtTime) 263e4289a54SKarsten Heimrich fGmtTime->SetValue(B_CONTROL_ON); 26485b69a94SKarsten Heimrich else 26585b69a94SKarsten Heimrich fLocalTime->SetValue(B_CONTROL_ON); 26685b69a94SKarsten Heimrich 267*1cae077aSStephan Aßmus fOldUseGmtTime = fUseGmtTime; 268*1cae077aSStephan Aßmus 269*1cae077aSStephan Aßmus BRect rect = Bounds(); 270*1cae077aSStephan Aßmus 271*1cae077aSStephan Aßmus rect.left = 10; 272*1cae077aSStephan Aßmus rect.top = rect.bottom - 10; 273*1cae077aSStephan Aßmus 274*1cae077aSStephan Aßmus fRevertButton = new BButton(rect, "revert", "Revert", 275*1cae077aSStephan Aßmus new BMessage(kMsgRevert), B_FOLLOW_LEFT | B_FOLLOW_BOTTOM, B_WILL_DRAW); 276*1cae077aSStephan Aßmus 277*1cae077aSStephan Aßmus fRevertButton->ResizeToPreferred(); 278*1cae077aSStephan Aßmus fRevertButton->SetEnabled(false); 279*1cae077aSStephan Aßmus float buttonHeight = fRevertButton->Bounds().Height(); 280*1cae077aSStephan Aßmus fRevertButton->MoveBy(0, -buttonHeight); 281*1cae077aSStephan Aßmus AddChild(fRevertButton); 282*1cae077aSStephan Aßmus 28385b69a94SKarsten Heimrich ResizeTo(fClock->Frame().right + 10.0, fGmtTime->Frame().bottom + 10.0); 284e4289a54SKarsten Heimrich } 285e4289a54SKarsten Heimrich 286e4289a54SKarsten Heimrich 287e4289a54SKarsten Heimrich void 288e4289a54SKarsten Heimrich DateTimeView::_ReadRTCSettings() 289e4289a54SKarsten Heimrich { 290e4289a54SKarsten Heimrich BPath path; 291e4289a54SKarsten Heimrich if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) != B_OK) 292e4289a54SKarsten Heimrich return; 293e4289a54SKarsten Heimrich 294e4289a54SKarsten Heimrich path.Append("RTC_time_settings"); 295e4289a54SKarsten Heimrich 296e4289a54SKarsten Heimrich BEntry entry(path.Path()); 297e4289a54SKarsten Heimrich if (entry.Exists()) { 29885b69a94SKarsten Heimrich BFile file(&entry, B_READ_ONLY); 299e4289a54SKarsten Heimrich if (file.InitCheck() == B_OK) { 30085b69a94SKarsten Heimrich char buffer[6]; 30185b69a94SKarsten Heimrich file.Read(buffer, 6); 30285b69a94SKarsten Heimrich if (strncmp(buffer, "gmt", 3) == 0) 30385b69a94SKarsten Heimrich fUseGmtTime = true; 304e4289a54SKarsten Heimrich } 30585b69a94SKarsten Heimrich } else 30685b69a94SKarsten Heimrich _UpdateGmtSettings(); 307e4289a54SKarsten Heimrich } 308e4289a54SKarsten Heimrich 309e4289a54SKarsten Heimrich 310e4289a54SKarsten Heimrich void 311e4289a54SKarsten Heimrich DateTimeView::_WriteRTCSettings() 312e4289a54SKarsten Heimrich { 313e4289a54SKarsten Heimrich BPath path; 314e4289a54SKarsten Heimrich if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) != B_OK) 315e4289a54SKarsten Heimrich return; 316e4289a54SKarsten Heimrich 317e4289a54SKarsten Heimrich path.Append("RTC_time_settings"); 318e4289a54SKarsten Heimrich 319e4289a54SKarsten Heimrich BFile file(path.Path(), B_CREATE_FILE | B_ERASE_FILE | B_WRITE_ONLY); 320e4289a54SKarsten Heimrich if (file.InitCheck() == B_OK) { 32185b69a94SKarsten Heimrich if (fUseGmtTime) 322e4289a54SKarsten Heimrich file.Write("gmt", 3); 32385b69a94SKarsten Heimrich else 32485b69a94SKarsten Heimrich file.Write("local", 5); 325e4289a54SKarsten Heimrich } 326e4289a54SKarsten Heimrich } 327e4289a54SKarsten Heimrich 328e4289a54SKarsten Heimrich 329e4289a54SKarsten Heimrich void 330e4289a54SKarsten Heimrich DateTimeView::_UpdateGmtSettings() 331e4289a54SKarsten Heimrich { 332e4289a54SKarsten Heimrich _WriteRTCSettings(); 333e4289a54SKarsten Heimrich 334e4289a54SKarsten Heimrich BPath path; 335e4289a54SKarsten Heimrich if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) != B_OK) 336e4289a54SKarsten Heimrich return; 337e4289a54SKarsten Heimrich 338e4289a54SKarsten Heimrich path.Append("timezone"); 339e4289a54SKarsten Heimrich BEntry entry(path.Path(), true); 340e4289a54SKarsten Heimrich 341e4289a54SKarsten Heimrich if (!entry.Exists()) 342e4289a54SKarsten Heimrich return; 343e4289a54SKarsten Heimrich 344e4289a54SKarsten Heimrich entry.GetPath(&path); 345e4289a54SKarsten Heimrich 346e4289a54SKarsten Heimrich // take the existing timezone and set it's gmt use 34785b69a94SKarsten Heimrich _kern_set_tzfilename(path.Path(), B_PATH_NAME_LENGTH, fUseGmtTime); 348e4289a54SKarsten Heimrich } 349e4289a54SKarsten Heimrich 350e4289a54SKarsten Heimrich 351e4289a54SKarsten Heimrich void 352e4289a54SKarsten Heimrich DateTimeView::_UpdateDateTime(BMessage *message) 353e4289a54SKarsten Heimrich { 354e4289a54SKarsten Heimrich int32 day; 355e4289a54SKarsten Heimrich int32 month; 356e4289a54SKarsten Heimrich int32 year; 357e4289a54SKarsten Heimrich if (message->FindInt32("month", &month) == B_OK 358e4289a54SKarsten Heimrich && message->FindInt32("day", &day) == B_OK 359e4289a54SKarsten Heimrich && message->FindInt32("year", &year) == B_OK) 360e4289a54SKarsten Heimrich { 361e4289a54SKarsten Heimrich fDateEdit->SetDate(year, month, day); 362e4289a54SKarsten Heimrich fCalendarView->SetDate(year, month, day); 363e4289a54SKarsten Heimrich } 364e4289a54SKarsten Heimrich 365e4289a54SKarsten Heimrich int32 hour; 366e4289a54SKarsten Heimrich int32 minute; 367e4289a54SKarsten Heimrich int32 second; 368e4289a54SKarsten Heimrich if (message->FindInt32("hour", &hour) == B_OK 369e4289a54SKarsten Heimrich && message->FindInt32("minute", &minute) == B_OK 370e4289a54SKarsten Heimrich && message->FindInt32("second", &second) == B_OK) 371e4289a54SKarsten Heimrich { 372e4289a54SKarsten Heimrich fClock->SetTime(hour, minute, second); 37385b69a94SKarsten Heimrich fTimeEdit->SetTime(hour, minute, second); 374e4289a54SKarsten Heimrich } 375e4289a54SKarsten Heimrich } 376