From 219e3830e832440b144991f13dd256356aee2f47 Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Wed, 2 Aug 2017 17:20:03 +0000 Subject: [PATCH] tvplanit: Add editing of events to TVpMonthView by double-click git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@5990 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- components/tvplanit/source/vpcontactgrid.pas | 2 +- components/tvplanit/source/vpjsonds.pas | 9 +- components/tvplanit/source/vpmonthview.pas | 125 ++++++++++++++----- components/tvplanit/source/vptasklist.pas | 2 +- 4 files changed, 103 insertions(+), 35 deletions(-) diff --git a/components/tvplanit/source/vpcontactgrid.pas b/components/tvplanit/source/vpcontactgrid.pas index feaa2000c..03bd62b7b 100644 --- a/components/tvplanit/source/vpcontactgrid.pas +++ b/components/tvplanit/source/vpcontactgrid.pas @@ -1749,7 +1749,7 @@ begin Invalidate; end; -{$IF VP_LCL_SCALING} +{$IF VP_LCL_SCALING=1} procedure TVpContactGrid.ScaleFontsPPI(const AProportion: Double); begin inherited; diff --git a/components/tvplanit/source/vpjsonds.pas b/components/tvplanit/source/vpjsonds.pas index 2b08a5533..e57fa80b7 100644 --- a/components/tvplanit/source/vpjsonds.pas +++ b/components/tvplanit/source/vpjsonds.pas @@ -646,7 +646,7 @@ var cont: TVpContact; task: TvpTask; i, j: Integer; -// s: String; + s: String; stream: TStream; begin if FFilename = '' then @@ -710,9 +710,12 @@ begin stream := TFileStream.Create(FFilename, fmCreate); try + {$IF FPC_FULLVERSION < 030000} + s := json.FormatJSON; + stream.Write(s[1], Length(s)); + {$ELSE} json.DumpJSON(stream); -// s := json.FormatJSON; -// stream.Write(s[1], Length(s)); + {$ENDIF} finally stream.Free; end; diff --git a/components/tvplanit/source/vpmonthview.pas b/components/tvplanit/source/vpmonthview.pas index 3b423d637..5a3a52f15 100644 --- a/components/tvplanit/source/vpmonthview.pas +++ b/components/tvplanit/source/vpmonthview.pas @@ -172,7 +172,9 @@ type FMouseDate: TDateTime; { event variables } + FOnAddEvent: TVpOnAddNewEvent; FOwnerDrawCells: TVpOwnerDrawDayEvent; + FOwnerEditEvent: TVpEditEvent; FOnEventClick: TVpOnEventClick; FOnEventDblClick: TVpOnEventClick; @@ -207,6 +209,7 @@ type { internal methods } function GetDateAtCoord(APoint: TPoint): TDateTime; procedure mvPopulate; + procedure mvSpawnEventEditDialog(NewEvent: Boolean); procedure mvSpinButtonClick(Sender: TObject; Button: TUDBtnType); procedure mvSetDateByCoord(APoint: TPoint); procedure mvHookUp; @@ -308,9 +311,11 @@ type property WeekendAttributes: TVpMvWeekendAttr read FWeekendAttr write FWeekendAttr; property WeekStartsOn: TVpDayType read FWeekStartsOn write SetWeekStartsOn; {events} + property OnAddEvent: TVpOnAddNewEvent read FOnAddEvent write FOnAddEvent; property OnEventClick: TVpOnEventClick read FOnEventClick write FOnEventClick; property OnEventDblClick: TVpOnEventClick read FOnEventDblClick write FOnEventDblClick; property OnHoliday: TVpHolidayEvent read FOnHoliday write FOnHoliday; + property OnOwnerEditEvent: TVpEditEvent read FOwnerEditEvent write FOwnerEditEvent; end; @@ -321,7 +326,7 @@ uses DateUtils, {$ENDIF} SysUtils, LazUTF8, Dialogs, StrUtils, - VpMonthViewPainter; + VpMonthViewPainter, VpEvntEditDlg; (*****************************************************************************) { TVpMonthViewAttr } @@ -448,8 +453,8 @@ begin FTimeFormat := tf12Hour; FDateLabelFormat := 'mmmm yyyy'; FColumnWidth := 200; - FRightClickChangeDate := vpDefWVRClickChangeDate; -// mvVisibleEvents := 0; + FRightClickChangeDate := vpDefWVRClickChangeDate; +// mvVisibleEvents := 0; { set up fonts and colors } // FDayHeadAttributes.Font.Name := 'Tahoma'; wp: better use defaults @@ -653,6 +658,48 @@ begin end; {=====} +procedure TVpMonthView.mvSpawnEventEditDialog(NewEvent: Boolean); +var + AllowIt: Boolean; + EventDlg : TVpEventEditDialog; +begin + if DataStore = nil then Exit; + + if (not NewEvent) and (not mvActiveEvent.CanEdit) then begin + MessageDlg(RSCannotEditOverlayedEvent, mtInformation, [mbOk], 0); + exit; + end; + + AllowIt := false; + if Assigned(FOwnerEditEvent) then + FOwnerEditEvent(self, mvActiveEvent, DataStore.Resource, AllowIt) + else begin + EventDlg := TVpEventEditDialog.Create(nil); + try + EventDlg.DataStore := DataStore; + EventDlg.TimeFormat := FTimeFormat; + AllowIt := EventDlg.Execute(mvActiveEvent); + finally + EventDlg.Free; + end; + end; + + if AllowIt then begin + mvActiveEvent.Changed := true; + DataStore.PostEvents; + if Assigned(FOnAddEvent) then + FOnAddEvent(self, mvActiveEvent); + Invalidate; + end else begin + if NewEvent then begin + DataStore.Resource.Schedule.DeleteEvent(mvActiveEvent); + mvActiveEvent := nil; + end; + DataStore.PostEvents; + Invalidate; + end; +end; + procedure TVpMonthView.mvSpinButtonClick(Sender: TObject; Button: TUDBtnType); var M, D, Y: Word; @@ -863,9 +910,9 @@ begin { The mouse click landed inside the client area } MvSetDateByCoord(Point(Msg.XPos, Msg.YPos)); { Did the mouse click land on an event? } - if SelectEventAtCoord(Point(Msg.XPos, Msg.YPos)) - and (Assigned(FOnEventClick)) then - FOnEventClick(self, mvActiveEvent); + if SelectEventAtCoord(Point(Msg.XPos, Msg.YPos)) + and (Assigned(FOnEventClick)) then + FOnEventClick(self, mvActiveEvent); end; end; {=====} @@ -875,23 +922,41 @@ procedure TVpMonthView.WMLButtonDblClick(var Msg: TWMLButtonDblClk); {$ELSE} procedure TVpMonthView.WMLButtonDblClick(var Msg: TLMLButtonDblClk); {$ENDIF} -begin - inherited; - // if the mouse was pressed down in the client area, then select the - // cell. - if not focused then SetFocus; - - if (Msg.YPos > mvDayHeadHeight) then - begin - { The mouse click landed inside the client area } - MvSetDateByCoord(Point(Msg.XPos, Msg.YPos)); - { Did the mouse click land on an event? } - if SelectEventAtCoord(Point(Msg.XPos, Msg.YPos)) - and (Assigned(FOnEventDblClick)) then - FOnEventDblClick(self, mvActiveEvent); - end; -end; -{=====} +var + startTime, endTime: TDateTime; +begin + inherited; + // if the mouse was pressed down in the client area, then select the cell. + if not focused then SetFocus; + + if (Msg.YPos > mvDayHeadHeight) then + begin + { The mouse click landed inside the client area } + MvSetDateByCoord(Point(Msg.XPos, Msg.YPos)); + + { Did the mouse click land on an event? } + if Assigned(FOnEventDblClick) then begin + if SelectEventAtCoord(Point(Msg.XPos, Msg.YPos)) then + FOnEventDblClick(self, mvActiveEvent); + end else + if mvActiveEvent <> nil then + mvSpawnEventEditDialog(SelectEventAtCoord(Point(Msg.XPos, Msg.YPos))) + else + if (DataStore.Resource <> nil) then begin + { otherwise, we must want to create a new event } + startTime := trunc(Date) + 0.5; { default to 12:00 noon } + endTime := startTime + 30 / MinutesInDay; { StartTime + 30 minutes } + mvActiveEvent := DataStore.Resource.Schedule.AddEvent( + DataStore.GetNextID('Events'), + startTime, + endTime + ); + { edit this new event } + mvSpawnEventEditDialog(True); // true = new event + end; + end; +end; +{=====} {$IFNDEF LCL} procedure TVpMonthView.WMSetFocus(var Msg: TWMSetFocus); @@ -923,8 +988,8 @@ begin if not Assigned (PopupMenu) then begin if not focused then SetFocus; - if FRightClickChangeDate then - mvSetDateByCoord (Point (Msg.XPos, Msg.YPos)); + if FRightClickChangeDate then + mvSetDateByCoord (Point (Msg.XPos, Msg.YPos)); end; end; {=====} @@ -1097,7 +1162,7 @@ end; {=====} { - renamed from EditEventAtCoord and re-written} -function TVpMonthView.SelectEventAtCoord(Point: TPoint): Boolean; +function TVpMonthView.SelectEventAtCoord(Point: TPoint): Boolean; var I: Integer; begin @@ -1252,10 +1317,10 @@ begin end; procedure TVpMonthView.SetRightClickChangeDate(const v: Boolean); -begin - if v <> FRightClickChangeDate then - FRightClickChangeDate := v; -end; +begin + if v <> FRightClickChangeDate then + FRightClickChangeDate := v; +end; procedure TVpMonthView.SetWeekStartsOn(Value: TVpDayType); begin diff --git a/components/tvplanit/source/vptasklist.pas b/components/tvplanit/source/vptasklist.pas index 806a96ac2..6a07fc591 100644 --- a/components/tvplanit/source/vptasklist.pas +++ b/components/tvplanit/source/vptasklist.pas @@ -1248,7 +1248,7 @@ begin end; end; -{$IF VP_LCL_SCALING} +{$IF VP_LCL_SCALING=1} procedure TVpTaskList.ScaleFontsPPI(const AProportion: Double); begin inherited;