253 lines
5.5 KiB
C++
253 lines
5.5 KiB
C++
// Calendar Control version 2.5
|
|
// by Al.V. Sarikov.
|
|
// Kherson, Ukraine, 2006.
|
|
// E-mail: avix@ukrpost.net.
|
|
// Home page: http://avix.pp.ru.
|
|
|
|
// Updated for Haiku and removed all stuff that is not needed and refactored by jan__64 2009
|
|
|
|
// Control which allows to work with dates:
|
|
// enter date to text field and choose it from calendar.
|
|
|
|
// Distributed under BSD license (see LICENSE file).
|
|
|
|
#define __LANG_ENGLISH // to compile english version
|
|
|
|
#include "CalendarControl.h"
|
|
|
|
#define myButtonMessage 'DCBP'
|
|
|
|
#include "DateTextView.cpp"
|
|
#include "MonthWindow.cpp"
|
|
|
|
#include <AppFileInfo.h>
|
|
#include <FindDirectory.h>
|
|
#include <File.h>
|
|
#include <Path.h>
|
|
#include <Point.h>
|
|
#include <ControlLook.h>
|
|
|
|
|
|
CalendarControl::CalendarControl(BPoint p, const char* name, int day, int month, int year, uint32 flags, uint32 look)
|
|
:BControl(BRect(100,100,200,200),name, NULL, NULL, B_FOLLOW_LEFT | B_FOLLOW_TOP, B_WILL_DRAW)
|
|
{
|
|
|
|
uint32 divider=look & CC_ALL_DIVIDERS;
|
|
|
|
myDateTextView = new DateTextView(day,month,year,flags,divider);
|
|
myButton = new CalendarButton(BRect(70,0,85,15), "CalendarButton", "", new BMessage(myButtonMessage), B_FOLLOW_LEFT | B_FOLLOW_TOP, B_WILL_DRAW);
|
|
myOrigin = p;
|
|
|
|
AddChild(myDateTextView);
|
|
myDateTextView->MoveTo(3,3);
|
|
ResizeTo(myDateTextView->Bounds().Width()+6,myDateTextView->Bounds().Height()+7);
|
|
|
|
AddChild(myButton);
|
|
|
|
myButton->ResizeTo(Bounds().Height()*0.7,Bounds().Height()-1);
|
|
myButton->MoveTo(Bounds().right+1, Bounds().top);
|
|
ResizeBy(myButton->Bounds().Width()+1, 0);
|
|
}
|
|
|
|
|
|
CalendarControl::~CalendarControl()
|
|
{
|
|
RemoveChild(myDateTextView);
|
|
delete myDateTextView;
|
|
RemoveChild(myButton);
|
|
delete myButton;
|
|
}
|
|
|
|
|
|
void CalendarControl::AttachedToWindow(void)
|
|
{
|
|
BControl::AttachedToWindow();
|
|
|
|
myButton->SetTarget(this);
|
|
|
|
if(Parent()!=NULL)
|
|
view_color=Parent()->ViewColor();
|
|
else
|
|
view_color.red=view_color.green=view_color.blue=view_color.alpha=255;
|
|
|
|
SetViewColor(view_color); // function of CalendarControl class
|
|
|
|
// MakeButton(); // for BeOS interface is called only from here,
|
|
MoveTo(myOrigin);
|
|
}
|
|
|
|
|
|
void CalendarControl::Draw(BRect r)
|
|
{
|
|
BRect bounds(Bounds());
|
|
bounds.bottom--;
|
|
bounds.right = myButton->Frame().left - 1;
|
|
|
|
rgb_color base = ui_color(B_PANEL_BACKGROUND_COLOR);
|
|
|
|
bool active = myDateTextView->IsFocus() && Window()->IsActive();
|
|
uint32 flags = 0;
|
|
if (!IsEnabled())
|
|
flags |= BControlLook::B_DISABLED;
|
|
if (active)
|
|
flags |= BControlLook::B_FOCUSED;
|
|
be_control_look->DrawTextControlBorder((BView*)this, bounds, r, base, flags, 15);
|
|
}
|
|
|
|
|
|
void CalendarControl::KeyDown(const char *bytes, int32 numBytes)
|
|
{
|
|
BControl::KeyDown(bytes, numBytes);
|
|
if(bytes[0]==B_TAB) Draw(Bounds());
|
|
}
|
|
|
|
|
|
void CalendarControl::MakeFocus(bool focused)
|
|
{
|
|
myDateTextView->MakeFocus(focused);
|
|
}
|
|
|
|
|
|
void CalendarControl::MessageReceived(BMessage *msg)
|
|
{
|
|
switch(msg->what)
|
|
{
|
|
case myButtonMessage:
|
|
{
|
|
if(IsEnabled())
|
|
{
|
|
MakeFocus(true);
|
|
int day, month, year;
|
|
int first_year, last_year;
|
|
GetDate(&day, &month, &year);
|
|
GetYearRange(&first_year, &last_year);
|
|
new MonthWindow(ConvertToScreen(BPoint(Bounds().left+1,Bounds().bottom+1)),
|
|
new BMessenger(this), day, month, year, first_year, last_year);
|
|
}
|
|
break;
|
|
}
|
|
case 'MVME': // message has come from window with calendar
|
|
{
|
|
int32 day, month, year;
|
|
msg->FindInt32("day",&day);
|
|
msg->FindInt32("month",&month);
|
|
msg->FindInt32("year",&year);
|
|
SetDate((int)day, (int)month, (int)year);
|
|
break;
|
|
}
|
|
default:
|
|
BControl::MessageReceived(msg);
|
|
}
|
|
}
|
|
|
|
|
|
void CalendarControl::SetEnabled(bool enabled)
|
|
{
|
|
if(enabled==IsEnabled()) return;
|
|
BControl::SetEnabled(enabled);
|
|
myButton->SetEnabled(enabled);
|
|
myDateTextView->SetEnabled(enabled);
|
|
Invalidate();
|
|
}
|
|
|
|
|
|
void CalendarControl::SetViewColor(rgb_color color)
|
|
{
|
|
view_color=color;
|
|
BControl::SetViewColor(view_color);
|
|
Draw(Bounds());
|
|
Invalidate();
|
|
}
|
|
|
|
|
|
void CalendarControl::SetViewColor(uchar red, uchar green,
|
|
uchar blue, uchar alpha)
|
|
{
|
|
rgb_color color={red, green, blue, alpha};
|
|
SetViewColor(color);
|
|
}
|
|
|
|
|
|
void CalendarControl::WindowActivated(bool active)
|
|
{
|
|
myWindowActive = active; // true if window where control is placed is active
|
|
Draw(Bounds());
|
|
}
|
|
|
|
|
|
const char* CalendarControl::Text() const
|
|
{
|
|
return myDateTextView->Text();
|
|
}
|
|
|
|
|
|
void CalendarControl::GetDate(int *day, int *month, int *year)
|
|
{
|
|
myDateTextView->GetDate(day,month,year);
|
|
}
|
|
|
|
|
|
void CalendarControl::SetDate(int day, int month, int year)
|
|
{
|
|
myDateTextView->SetDate(day,month,year);
|
|
}
|
|
|
|
|
|
void CalendarControl::SetDate(const char *tdate)
|
|
{
|
|
myDateTextView->SetDate(tdate);
|
|
}
|
|
|
|
|
|
void CalendarControl::GetYearRange(int *first_year, int *last_year)
|
|
{
|
|
myDateTextView->GetYearRange(first_year, last_year);
|
|
}
|
|
|
|
|
|
uint32 CalendarControl::GetLook()
|
|
{
|
|
return (myDateTextView->GetDivider());
|
|
}
|
|
|
|
|
|
void CalendarControl::SetLook(uint32 look)
|
|
{
|
|
myDateTextView->SetDivider(look & CC_ALL_DIVIDERS);
|
|
}
|
|
|
|
|
|
uint32 CalendarControl::GetFlags()
|
|
{
|
|
return myDateTextView->GetDateFlags();
|
|
}
|
|
|
|
|
|
void CalendarControl::SetFlags(uint32 flags)
|
|
{
|
|
myDateTextView->SetDateFlags(flags);
|
|
}
|
|
|
|
|
|
BTextView *CalendarControl::TextView(void) const
|
|
{
|
|
return (BTextView *)myDateTextView;
|
|
}
|
|
|
|
|
|
void CalendarButton::Draw(BRect update)
|
|
{
|
|
BButton::Draw(update);
|
|
BRect rect = Bounds();
|
|
rect.InsetBy(2.0,4.0);
|
|
uint32 flags = 0;
|
|
rgb_color base = ui_color(B_PANEL_TEXT_COLOR);
|
|
float tint = B_NO_TINT;
|
|
if(!IsEnabled())
|
|
{
|
|
tint = B_LIGHTEN_MAX_TINT;
|
|
flags |= BControlLook::B_DISABLED;
|
|
}
|
|
be_control_look->DrawArrowShape(this, rect, update, base, 3, flags, tint);
|
|
}
|