tvplanit: Add hint support to MonthView.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5155 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2016-09-11 21:43:26 +00:00
parent cf011258e6
commit 274284fc51
9 changed files with 202 additions and 38 deletions

View File

@@ -43,6 +43,10 @@ msgstr "Fre"
msgid "&Reminder" msgid "&Reminder"
msgstr "E&rinnerung" msgstr "E&rinnerung"
#: vpsr.rsallday
msgid "All day"
msgstr ""
#: vpsr.rsalldayevent #: vpsr.rsalldayevent
msgid "&All Day Event" msgid "&All Day Event"
msgstr "G&anztägiges Ereignis" msgstr "G&anztägiges Ereignis"

View File

@@ -49,6 +49,10 @@ msgstr "Ven"
msgid "&Reminder" msgid "&Reminder"
msgstr "&Rappel" msgstr "&Rappel"
#: vpsr.rsallday
msgid "All day"
msgstr ""
#: vpsr.rsalldayevent #: vpsr.rsalldayevent
msgid "&All Day Event" msgid "&All Day Event"
msgstr "&Événement d'une journée" msgstr "&Événement d'une journée"

View File

@@ -43,6 +43,10 @@ msgstr "Vr"
msgid "&Reminder" msgid "&Reminder"
msgstr "He&rinnering" msgstr "He&rinnering"
#: vpsr.rsallday
msgid "All day"
msgstr ""
#: vpsr.rsalldayevent #: vpsr.rsalldayevent
msgid "&All Day Event" msgid "&All Day Event"
msgstr "Hele D&ag Gebeurtenis" msgstr "Hele D&ag Gebeurtenis"

View File

@@ -33,6 +33,10 @@ msgstr ""
msgid "&Reminder" msgid "&Reminder"
msgstr "" msgstr ""
#: vpsr.rsallday
msgid "All day"
msgstr ""
#: vpsr.rsalldayevent #: vpsr.rsalldayevent
msgid "&All Day Event" msgid "&All Day Event"
msgstr "" msgstr ""

View File

@@ -43,6 +43,10 @@ msgstr "Пт."
msgid "&Reminder" msgid "&Reminder"
msgstr "Напоминание" msgstr "Напоминание"
#: vpsr.rsallday
msgid "All day"
msgstr ""
#: vpsr.rsalldayevent #: vpsr.rsalldayevent
msgid "&All Day Event" msgid "&All Day Event"
msgstr "Событие на весь день" msgstr "Событие на весь день"

View File

@@ -38,7 +38,7 @@ uses
{$ELSE} {$ELSE}
Windows, Messages, Windows, Messages,
{$ENDIF} {$ENDIF}
Classes, Graphics, Controls, ComCtrls, ExtCtrls, Classes, Graphics, Controls, ComCtrls, ExtCtrls, Forms,
VpBase, VpBaseDS, VpMisc, VpData, VpSR, VpConst, VpCanvasUtils, Menus; VpBase, VpBaseDS, VpMisc, VpData, VpSR, VpConst, VpCanvasUtils, Menus;
type type
@@ -139,30 +139,22 @@ type
FDate: TDateTime; FDate: TDateTime;
FDefaultPopup: TPopupMenu; FDefaultPopup: TPopupMenu;
FRightClickChangeDate: Boolean; FRightClickChangeDate: Boolean;
FHintWindow: THintWindow;
FMouseDate: TDateTime;
{ event variables } { event variables }
FOwnerDrawCells: TVpOwnerDrawDayEvent; FOwnerDrawCells: TVpOwnerDrawDayEvent;
FOnEventClick: TVpOnEventClick; FOnEventClick: TVpOnEventClick;
FOnEventDblClick: TVpOnEventClick; FOnEventDblClick: TVpOnEventClick;
{ internal variables } { internal variables }
// mvDayNumberHeight : Integer;
// mvEventTextHeight : Integer;
mvLoaded: Boolean; mvLoaded: Boolean;
// mvInLinkHandler : Boolean;
// mvRowHeight : Integer;
// mvLineHeight : Integer;
// mvColWidth : Integer;
mvDayHeadHeight: Integer; mvDayHeadHeight: Integer;
mvSpinButtons: TUpDown; mvSpinButtons: TUpDown;
mvEventArray: TVpEventArray; mvEventArray: TVpEventArray;
mvMonthDayArray: TVpMonthdayArray; mvMonthDayArray: TVpMonthdayArray;
mvActiveEvent: TVpEvent; mvActiveEvent: TVpEvent;
mvActiveEventRec: TRect; mvActiveEventRec: TRect;
// mvEventList : TList;
// mvCreatingEditor : Boolean;
// mvPainting : Boolean;
// mvVScrollDelta : Integer;
// mvHotPoint : TPoint;
// mvVisibleEvents : Integer;
{ property methods } { property methods }
procedure SetDrawingStyle(Value: TVpDrawingStyle); procedure SetDrawingStyle(Value: TVpDrawingStyle);
@@ -182,6 +174,7 @@ type
procedure SetDate(Value: TDateTime); procedure SetDate(Value: TDateTime);
procedure SetRightClickChangeDate(const v: Boolean); procedure SetRightClickChangeDate(const v: Boolean);
procedure SetWeekStartsOn(Value: TVpDayType); procedure SetWeekStartsOn(Value: TVpDayType);
{ internal methods } { internal methods }
procedure mvHookUp; procedure mvHookUp;
procedure mvPenChanged(Sender: TObject); procedure mvPenChanged(Sender: TObject);
@@ -201,10 +194,16 @@ type
procedure WMLButtonDown(var Msg: TLMLButtonDown); message LM_LBUTTONDOWN; procedure WMLButtonDown(var Msg: TLMLButtonDown); message LM_LBUTTONDOWN;
procedure WMLButtonDblClick(var Msg: TLMLButtonDblClk); message LM_LBUTTONDBLCLK; procedure WMLButtonDblClick(var Msg: TLMLButtonDblClk); message LM_LBUTTONDBLCLK;
{$ENDIF} {$ENDIF}
{ - renamed from EditEventAtCoord and re-written} { - renamed from EditEventAtCoord and re-written}
function SelectEventAtCoord(Point: TPoint): Boolean; function SelectEventAtCoord(Point: TPoint): Boolean;
procedure mvSetDateByCoord(Point: TPoint); procedure mvSetDateByCoord(APoint: TPoint);
function GetDateAtCoord(APoint: TPoint): TDateTime;
procedure KeyDown(var Key: Word; Shift: TShiftState); override; procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure MouseMove(Shift: TShiftState; X,Y: Integer); override;
procedure MouseEnter; override;
procedure MouseLeave; override;
{ message handlers } { message handlers }
{$IFNDEF LCL} {$IFNDEF LCL}
procedure WMSize(var Msg: TWMSize); message WM_SIZE; procedure WMSize(var Msg: TWMSize); message WM_SIZE;
@@ -217,6 +216,12 @@ type
procedure WMSetFocus(var Msg: TLMSetFocus); message LM_SETFOCUS; procedure WMSetFocus(var Msg: TLMSetFocus); message LM_SETFOCUS;
procedure WMRButtonDown(var Msg: TLMRButtonDown); message LM_RBUTTONDOWN; procedure WMRButtonDown(var Msg: TLMRButtonDown); message LM_RBUTTONDOWN;
{$ENDIF} {$ENDIF}
{ Hints }
procedure ShowHintWindow(APoint: TPoint; ADate: TDateTime);
procedure HideHintWindow;
{ Popup menu }
procedure PopupToday(Sender: TObject); procedure PopupToday(Sender: TObject);
procedure PopupNextMonth(Sender: TObject); procedure PopupNextMonth(Sender: TObject);
procedure PopupPrevMonth(Sender: TObject); procedure PopupPrevMonth(Sender: TObject);
@@ -226,6 +231,8 @@ type
public public
constructor Create(AOwner: TComponent); override; constructor Create(AOwner: TComponent); override;
destructor Destroy; override; destructor Destroy; override;
function BuildEventString(AEvent: TVpEvent;
AShowEventTime, AStartTimeOnly: Boolean): String;
procedure LoadLanguage; procedure LoadLanguage;
procedure Invalidate; override; procedure Invalidate; override;
procedure LinkHandler(Sender: TComponent; procedure LinkHandler(Sender: TComponent;
@@ -277,7 +284,8 @@ type
implementation implementation
uses uses
SysUtils, LazUTF8, Forms, Dialogs, VpMonthViewPainter; SysUtils, LazUTF8, Dialogs, StrUtils,
VpMonthViewPainter;
(*****************************************************************************) (*****************************************************************************)
@@ -480,6 +488,53 @@ begin
inherited; inherited;
end; end;
function TVpMonthView.BuildEventString(AEvent: TVpEvent;
AShowEventTime, AStartTimeOnly: Boolean): String;
var
timefmt: String;
timeStr: String;
descrStr: String;
grp: TVpResourceGroup;
res: TVpResource;
begin
Result := '';
if (AEvent = nil) or (Datastore = nil) or (Datastore.Resource = nil) then
exit;
timeStr := '';
descrStr := '';
if AShowEventTime then
begin
if AEvent.AllDayEvent then
timeStr := RSAllDay
else begin
timefmt := IfThen(TimeFormat = tf24Hour, 'hh:nn', 'hh:nn AM/PM');
timeStr := FormatDateTime(timefmt, AEvent.StartTime);
if not AStartTimeOnly then
timeStr := timeStr + ' - ' + FormatDateTime(timeFmt, AEvent.EndTime);
end;
end;
if AEvent.IsOverlayed then
begin
res := Datastore.Resources.GetResource(AEvent.ResourceID);
grp := Datastore.Resource.Group;
if (grp <> nil) then
descrStr := Format('[%s]%s', [
IfThen(odResource in grp.ShowDetails, res.Description, res.Description),
IfThen(odEventDescription in grp.ShowDetails, ' ' + AEvent.Description)
]);
end else
descrStr := AEvent.Description;
if (timeStr <> '') and (descrStr <> '') then
Result := timeStr + ': ' + descrStr
else if (timeStr <> '') then
Result := timeStr
else
Result := descrStr;
end;
procedure TVpMonthView.LoadLanguage; procedure TVpMonthView.LoadLanguage;
begin begin
FDefaultPopup.Items.Clear; FDefaultPopup.Items.Clear;
@@ -855,6 +910,63 @@ begin
end; end;
{=====} {=====}
procedure TVpMonthView.ShowHintWindow(APoint: TPoint; ADate: TDateTime);
const
MaxWidth = 400;
var
txt, s: String;
i: Integer;
event: TVpEvent;
list: TList;
R: TRect;
begin
if (ADate = 0) or ((Datastore = nil) or (Datastore.Resource = nil)) then
begin
HideHintWindow;
exit;
end;
// Collect all events of this day and add them separated by line feeds to
// the hint string (txt).
txt := '';
list := TList.Create;
try
Datastore.Resource.Schedule.EventsByDate(ADate, List);
for i:=0 to list.Count-1 do begin
event := TVpEvent(list[i]);
s := BuildEventString(event, true, false);
txt := IfThen(txt = '', s, txt + LineEnding + s);
end;
finally
list.Free;
end;
// If we have any events then we put the current date at the top.
if txt <> '' then begin
txt := FormatDateTime('dddddd', ADate) + LineEnding + LineEnding + txt;
if ADate = SysUtils.Date then
txt := RSToday + LineEnding + txt;
end;
if (txt <> '') and not (csDesigning in ComponentState) then
begin
// Build and show the hint window
if FHintWindow = nil then
FHintWindow := THintWindow.Create(nil);
APoint := ClientToScreen(APoint);
R := FHintWindow.CalcHintRect(MaxWidth, txt, nil);
OffsetRect(R, APoint.X - WidthOf(R), APoint.Y);
FHintWindow.ActivateHint(R, txt);
end else
// Hide the hint window
HideHintWindow;
end;
procedure TVpMonthView.HideHintWindow;
begin
FreeAndNil(FHintWindow);
end;
procedure TVpMonthView.InitializeDefaultPopup; procedure TVpMonthView.InitializeDefaultPopup;
var var
NewItem : TMenuItem; NewItem : TMenuItem;
@@ -863,7 +975,7 @@ begin
NewItem := TMenuItem.Create(Self); NewItem := TMenuItem.Create(Self);
NewItem.Caption := RSToday; NewItem.Caption := RSToday;
NewItem.OnClick := PopupToday; NewItem.OnClick := PopupToday;
FDefaultPopup.Items.Add (NewItem); FDefaultPopup.Items.Add(NewItem);
end; end;
NewItem := TMenuItem.Create(Self); NewItem := TMenuItem.Create(Self);
@@ -874,14 +986,14 @@ begin
NewItem := TMenuItem.Create(Self); NewItem := TMenuItem.Create(Self);
NewItem.Caption := RSNextMonth; NewItem.Caption := RSNextMonth;
NewItem.OnClick := PopupNextMonth; NewItem.OnClick := PopupNextMonth;
FDefaultPopup.Items.Add (NewItem); FDefaultPopup.Items.Add(NewItem);
end; end;
if RSPrevMonth <> '' then begin if RSPrevMonth <> '' then begin
NewItem := TMenuItem.Create(Self); NewItem := TMenuItem.Create(Self);
NewItem.Caption := RSPrevMonth; NewItem.Caption := RSPrevMonth;
NewItem.OnClick := PopupPrevMonth; NewItem.OnClick := PopupPrevMonth;
FDefaultPopup.Items.Add (NewItem); FDefaultPopup.Items.Add(NewItem);
end; end;
NewItem := TMenuItem.Create(Self); NewItem := TMenuItem.Create(Self);
@@ -892,14 +1004,14 @@ begin
NewItem := TMenuItem.Create(Self); NewItem := TMenuItem.Create(Self);
NewItem.Caption := RSNextYear; NewItem.Caption := RSNextYear;
NewItem.OnClick := PopupNextYear; NewItem.OnClick := PopupNextYear;
FDefaultPopup.Items.Add (NewItem); FDefaultPopup.Items.Add(NewItem);
end; end;
if RSPrevYear <> '' then begin if RSPrevYear <> '' then begin
NewItem := TMenuItem.Create(Self); NewItem := TMenuItem.Create(Self);
NewItem.Caption := RSPrevYear; NewItem.Caption := RSPrevYear;
NewItem.OnClick := PopupPrevYear; NewItem.OnClick := PopupPrevYear;
FDefaultPopup.Items.Add (NewItem); FDefaultPopup.Items.Add(NewItem);
end; end;
end; end;
{=====} {=====}
@@ -970,16 +1082,29 @@ begin
end; end;
{=====} {=====}
procedure TVpMonthView.mvSetDateByCoord(Point: TPoint); procedure TVpMonthView.mvSetDateByCoord(APoint: TPoint);
var var
I: Integer; I: Integer;
begin begin
for I := 0 to pred(Length(mvMonthdayArray)) do for I := 0 to pred(Length(mvMonthdayArray)) do
if PointInRect(Point, mvMonthdayArray[I].Rec) then begin if PointInRect(APoint, mvMonthdayArray[I].Rec) then begin
Date := mvMonthdayArray[I].Date; Date := mvMonthdayArray[I].Date;
break; break;
end; end;
end; end;
function TVpMonthView.GetDateAtCoord(APoint: TPoint): TDateTime;
var
i: Integer;
begin
for i:=0 to High(mvMonthDayArray) do
if PointInRect(APoint, mvMonthDayArray[i].Rec) then begin
Result := mvMonthDayArray[i].Date;
exit;
end;
Result := 0;
end;
{=====} {=====}
procedure TVpMonthView.KeyDown(var Key: Word; Shift: TShiftState); procedure TVpMonthView.KeyDown(var Key: Word; Shift: TShiftState);
@@ -1054,7 +1179,30 @@ begin
end; end;
end; end;
end; end;
{=====}
procedure TVpMonthView.MouseEnter;
begin
FMouseDate := 0;
end;
procedure TVpMonthView.MouseLeave;
begin
HideHintWindow;
end;
procedure TVpMonthView.MouseMove(Shift: TShiftState; X, Y: Integer);
var
day: TDateTime;
begin
inherited MouseMove(Shift, X, Y);
day := GetDateAtCoord(Point(X, Y));
if FMouseDate <> day then begin
Application.CancelHint;
ShowHintWindow(Point(X, Y), day);
FMouseDate := day;
end;
end;
procedure TVpMonthView.SetRightClickChangeDate(const v: Boolean); procedure TVpMonthView.SetRightClickChangeDate(const v: Boolean);
begin begin
if v <> FRightClickChangeDate then if v <> FRightClickChangeDate then

View File

@@ -59,7 +59,7 @@ type
implementation implementation
uses uses
LazUtf8, LazUtf8, StrUtils,
VpCanvasUtils, VpMisc; VpCanvasUtils, VpMisc;
type type
@@ -650,17 +650,8 @@ begin
else else
TextRect.Right := TextRect.Left + mvColWidth; TextRect.Right := TextRect.Left + mvColWidth;
{ format the display text } { Construct the display text }
if FMonthView.ShowEventTime then begin Str := FMonthView.BuildEventString(TVpEvent(EventList[j]), FMonthView.ShowEventTime, true);
if (FMonthView.TimeFormat = tf24Hour) then
Str := FormatDateTime('hh:nn',
TVpEvent(EventList.List^[j]).StartTime)
else
Str := FormatDateTime('hh:nn AM/PM',
TVpEvent(EventList.List^[j]).StartTime);
Str := Str + ' - ' + TVpEvent(EventList.List^[j]).Description;
end else
Str := TVpEvent(EventList.List^[j]).Description;
{ set the event font } { set the event font }
RenderCanvas.Font.Assign(FMonthView.EventFont); RenderCanvas.Font.Assign(FMonthView.EventFont);

View File

@@ -139,6 +139,8 @@ resourcestring
RSPrevMonth = 'Previous month'; RSPrevMonth = 'Previous month';
RSPrevYear = 'Previous year'; RSPrevYear = 'Previous year';
RSAllDay = 'All day';
{WARNINGS} {WARNINGS}
RSPermanent = 'This operation cannot be undone!'; RSPermanent = 'This operation cannot be undone!';

View File

@@ -943,9 +943,12 @@ begin
if txt <> '' then if txt <> '' then
txt := txt + LineEnding; txt := txt + LineEnding;
txt := txt + Format('%s - %s', [ if AEvent.AllDayEvent then
FormatDateTime('hh:nn', AEvent.StartTime), txt := txt + 'All day'
FormatDateTime('hh:nn', AEvent.EndTime)]); else
txt := txt + Format('%s - %s', [
FormatDateTime('hh:nn', AEvent.StartTime),
FormatDateTime('hh:nn', AEvent.EndTime)]);
if showDetails then begin if showDetails then begin
txt := txt + LineEnding + LineEnding + 'Event:' + LineEnding + AEvent.Description; txt := txt + LineEnding + LineEnding + 'Event:' + LineEnding + AEvent.Description;