⛏️ index : haiku.git

/*
 * Copyright 2004-2007, Haiku, Inc. All Rights Reserved.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *		Mike Berg <mike@berg-net.us>
 *		Julun <host.haiku@gmx.de>
 */


#include "BaseView.h"

#include <DateTime.h>
#include <OS.h>

#include "TimeMessages.h"


TTimeBaseView::TTimeBaseView(const char* name)
	:
	BGroupView(name, B_VERTICAL, 0),
	fMessage(H_TIME_UPDATE)
{
	SetFlags(Flags() | B_PULSE_NEEDED);
}


TTimeBaseView::~TTimeBaseView()
{
}


void
TTimeBaseView::Pulse()
{
	if (IsWatched())
		_SendNotices();
}


void
TTimeBaseView::AttachedToWindow()
{
	SetViewUIColor(B_PANEL_BACKGROUND_COLOR);
	SetLowUIColor(ViewUIColor());
}


void
TTimeBaseView::ChangeTime(BMessage* message)
{
	bool isTime;
	if (message->FindBool("time", &isTime) != B_OK)
		return;

	BDateTime dateTime = BDateTime::CurrentDateTime(B_LOCAL_TIME);

	if (isTime) {
		BTime time = dateTime.Time();
		int32 hour;
		if (message->FindInt32("hour", &hour) != B_OK)
			hour  = time.Hour();

		int32 minute;
		if (message->FindInt32("minute", &minute) != B_OK)
			minute = time.Minute();

		int32 second;
		if (message->FindInt32("second", &second) != B_OK)
			second = time.Second();

		time.SetTime(hour, minute, second);
		dateTime.SetTime(time);
	} else {
		BDate date = dateTime.Date();
		int32 day;
		if (message->FindInt32("day", &day) != B_OK)
			day = date.Day();

		int32 year;
		if (message->FindInt32("year", &year) != B_OK)
			year = date.Year();

		int32 month;
		if (message->FindInt32("month", &month) != B_OK)
			month = date.Month();

		date.SetDate(year, month, day);
		dateTime.SetDate(date);
	}

	set_real_time_clock(dateTime.Time_t());
}


void
TTimeBaseView::_SendNotices()
{
	fMessage.MakeEmpty();

	BDate date = BDate::CurrentDate(B_LOCAL_TIME);
	fMessage.AddInt32("day", date.Day());
	fMessage.AddInt32("year", date.Year());
	fMessage.AddInt32("month", date.Month());

	BTime time = BTime::CurrentTime(B_LOCAL_TIME);
	fMessage.AddInt32("hour", time.Hour());
	fMessage.AddInt32("minute", time.Minute());
	fMessage.AddInt32("second", time.Second());

	SendNotices(H_TM_CHANGED, &fMessage);
}