LibreOffice Module vcl (master)  1
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  * Licensed to the Apache Software Foundation (ASF) under one or more
12  * contributor license agreements. See the NOTICE file distributed
13  * with this work for additional information regarding copyright
14  * ownership. The ASF licenses this file to you under the Apache
15  * License, Version 2.0 (the "License"); you may not use this file
16  * except in compliance with the License. You may obtain a copy of
17  * the License at .
18  */
23 #include <vcl/dllapi.h>
26 #include <vcl/ctrl.hxx>
27 #include <memory>
28 #include <set>
30 class MouseEvent;
31 class TrackingEvent;
32 class KeyEvent;
33 class HelpEvent;
36 /*************************************************************************
38 Description
39 ============
41 class Calendar
43 This class allows for the selection of a date. The displayed date range is
44 the one specified by the Date class. We display as many months as we have
45 space in the control. The user can switch between months using a ContextMenu
46 (clicking on the month's name) or via two ScrollButtons in-between the months.
48 --------------------------------------------------------------------------
50 WinBits
52 WB_BORDER We draw a border around the window.
53 WB_TABSTOP Keyboard control is possible. We get the focus, when
54  the user clicks in the Control.
56 --------------------------------------------------------------------------
58 We set and get the selected date by SetCurDate()/GetCurDate().
59 If the user selects a date Select() is called. If the user double clicks
60 DoubleClick() is called.
62 --------------------------------------------------------------------------
64 CalcWindowSizePixel() calculates the window size in pixel that is needed
65 to display a certain number of months.
67 --------------------------------------------------------------------------
69 SetSaturdayColor() and SetSundayColor() set a special color for Saturdays
70 and Sundays.
71 AddDateInfo() marks special days. With that we can set e.g. public holidays
72 to another color or encircle them (for e.g. appointments).
73 If we do not supply a year in the date, the day is used in EVERY year.
75 AddDateInfo() can also add text for every date, which is displayed if the
76 BalloonHelp is enabled.
77 In order to not have to supply all years with the relevant data, we call
78 the RequestDateInfo() handler if a new year is displayed. We can then query
79 the year in the handler with GetRequestYear().
81 --------------------------------------------------------------------------
83 In order to display a ContextMenu for a date, we need to override the
84 Command handler. GetDate() can infer the date from the mouse's position.
85 If we use the keyboard, the current date should be use.
87 If a ContextMenu is displayed, the baseclass' handler must not be called.
89 --------------------------------------------------------------------------
91 SetNoSelection() deselects everything.
92 SetCurDate() does not select the current date, but only defines the focus
93 rectangle.
94 GetSelectDateCount()/GetSelectDate() query the selected range.
95 IsDateSelected() queries for the status of a date.
97 The SelectionChanging() handler is being called while a user selects a
98 date. In it, we can change the selected range. E.g. if we want to limit
99 or extend the selected range. The selected range is realised via SelectDate()
100 and SelectDateRange() and queried with GetSelectDateCount()/GetSelectDate().
102 IsSelectLeft() returns the direction of the selection:
103 sal_True is a selection to the left or up
104 sal_False is a selection to the right or down
106 --------------------------------------------------------------------------
108 If the DateRange area changes and we want to take over the selection, we
109 should only do this is if IsScrollDateRangeChanged() returns sal_True.
110 This method returns sal_True if the area change was triggered by using the
111 ScrollButtons and sal_False if it was triggered by Resize(), other method
112 calls or by ending a selection.
114 *************************************************************************/
116 typedef std::set<sal_Int32> IntDateSet;
118 class Calendar final : public Control
119 {
120  std::unique_ptr<IntDateSet> mpSelectTable;
121  std::unique_ptr<IntDateSet> mpOldSelectTable;
122  OUString maDayTexts[31];
123  OUString maDayText;
124  OUString maWeekText;
128  OUString maDayOfWeekText;
129  long mnDayOfWeekAry[7];
138  sal_Int32 mnDayCount;
145  long mnLines;
149  sal_Int16 mnFirstYear;
150  sal_Int16 mnLastYear;
151  bool mbCalc:1,
152  mbFormat:1,
153  mbDrag:1,
154  mbMenuDown:1,
155  mbSpinDown:1,
156  mbPrevIn:1,
157  mbNextIn:1;
162  using Window::ImplInit;
163  void ImplInit( WinBits nWinStyle );
164  void ImplInitSettings();
166  virtual void ApplySettings(vcl::RenderContext& rRenderContext) override;
168  void ImplFormat();
169  using Window::ImplHitTest;
170  sal_uInt16 ImplHitTest( const Point& rPos, Date& rDate ) const;
171  void ImplDrawSpin(vcl::RenderContext& rRenderContext);
172  void ImplDrawDate(vcl::RenderContext& rRenderContext, long nX, long nY,
173  sal_uInt16 nDay, sal_uInt16 nMonth, sal_Int16 nYear,
174  bool bOther, sal_Int32 nToday);
175  void ImplDraw(vcl::RenderContext& rRenderContext);
176  void ImplUpdateDate( const Date& rDate );
177  void ImplUpdateSelection( IntDateSet* pOld );
178  void ImplMouseSelect( const Date& rDate, sal_uInt16 nHitTest );
179  void ImplUpdate( bool bCalcNew = false );
180  using Window::ImplScroll;
181  void ImplScroll( bool bPrev );
182  void ImplShowMenu( const Point& rPos, const Date& rDate );
183  void ImplTracking( const Point& rPos, bool bRepeat );
184  void ImplEndTracking( bool bCancel );
185  DayOfWeek ImplGetWeekStart() const;
187  virtual Size GetOptimalSize() const override;
188 public:
189  Calendar( vcl::Window* pParent, WinBits nWinStyle );
190  virtual ~Calendar() override;
191  virtual void dispose() override;
193  virtual void MouseButtonDown( const MouseEvent& rMEvt ) override;
194  virtual void Tracking( const TrackingEvent& rMEvt ) override;
195  virtual void KeyInput( const KeyEvent& rKEvt ) override;
196  virtual void Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect ) override;
197  virtual void Resize() override;
198  virtual void GetFocus() override;
199  virtual void LoseFocus() override;
200  virtual void RequestHelp( const HelpEvent& rHEvt ) override;
201  virtual void Command( const CommandEvent& rCEvt ) override;
202  virtual void StateChanged( StateChangedType nStateChange ) override;
203  virtual void DataChanged( const DataChangedEvent& rDCEvt ) override;
205  void Select();
207  Date GetFirstSelectedDate() const;
209  void SetCurDate( const Date& rNewDate );
210  void SetFirstDate( const Date& rNewFirstDate );
211  const Date& GetFirstDate() const { return maFirstDate; }
212  Date GetLastDate() const { return GetFirstDate() + mnDayCount; }
213  Date GetFirstMonth() const;
214  Date GetLastMonth() const;
215  sal_uInt16 GetMonthCount() const;
216  bool GetDate( const Point& rPos, Date& rDate ) const;
217  tools::Rectangle GetDateRect( const Date& rDate ) const;
219  void EndSelection();
221  Size CalcWindowSizePixel() const;
223  void SetSelectHdl( const Link<Calendar*,void>& rLink ) { maSelectHdl = rLink; }
224  void SetActivateHdl( const Link<Calendar*,void>& rLink ) { maActivateHdl = rLink; }
225 };
229 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
void ImplDrawDate(vcl::RenderContext &rRenderContext, long nX, long nY, sal_uInt16 nDay, sal_uInt16 nMonth, sal_Int16 nYear, bool bOther, sal_Int32 nToday)
Definition: calendar.cxx:519
virtual void LoseFocus() override
Definition: calendar.cxx:1136
bool mbMenuDown
Definition: calendar.hxx:151
bool mbFormat
Definition: calendar.hxx:151
tools::Rectangle maNextRect
Definition: calendar.hxx:127
void ImplDraw(vcl::RenderContext &rRenderContext)
Definition: calendar.cxx:594
bool mbDrag
Definition: calendar.hxx:151
Date maOldCurDate
Definition: calendar.hxx:135
const Date & GetFirstDate() const
Definition: calendar.hxx:211
Link< Calendar *, void > maActivateHdl
Definition: calendar.hxx:159
long mnWeekDayOffY
Definition: calendar.hxx:140
sal_Int16 mnFirstYear
Definition: calendar.hxx:149
virtual ~Calendar() override
Definition: calendar.cxx:143
void ImplUpdate(bool bCalcNew=false)
Definition: calendar.cxx:839
std::unique_ptr< IntDateSet > mpOldSelectTable
Definition: calendar.hxx:121
virtual void ApplySettings(vcl::RenderContext &rRenderContext) override
Definition: calendar.cxx:112
void ImplUpdateDate(const Date &rDate)
Definition: calendar.cxx:771
virtual void DataChanged(const DataChangedEvent &rDCEvt) override
Definition: calendar.cxx:1246
Size CalcWindowSizePixel() const
Definition: calendar.cxx:1492
void ImplUpdateSelection(IntDateSet *pOld)
Definition: calendar.cxx:783
CalendarWrapper maCalendarWrapper
Definition: calendar.hxx:125
void ImplInitSettings()
Definition: calendar.cxx:121
virtual void Paint(vcl::RenderContext &rRenderContext, const tools::Rectangle &rRect) override
Definition: calendar.cxx:1125
Definition: window.hxx:310
OUString maWeekText
Definition: calendar.hxx:124
sal_Int64 WinBits
bool GetDate(const Point &rPos, Date &rDate) const
Definition: calendar.cxx:1366
void ImplShowMenu(const Point &rPos, const Date &rDate)
Definition: calendar.cxx:871
Color maSelColor
Definition: calendar.hxx:136
tools::Rectangle GetDateRect(const Date &rDate) const
Definition: calendar.cxx:1379
virtual void GetFocus() override
Definition: calendar.cxx:1130
long mnLines
Definition: calendar.hxx:145
sal_uInt16 ImplHitTest(const Point &rPos, Date &rDate) const
Definition: calendar.cxx:326
sal_Int32 mnDayCount
Definition: calendar.hxx:138
bool mbPrevIn
Definition: calendar.hxx:151
virtual Size GetOptimalSize() const override
Definition: calendar.cxx:1509
virtual void MouseButtonDown(const MouseEvent &rMEvt) override
Definition: calendar.cxx:1001
OUString maDayTexts[31]
Definition: calendar.hxx:122
Date GetFirstMonth() const
Definition: calendar.cxx:1335
void SetActivateHdl(const Link< Calendar *, void > &rLink)
Definition: calendar.hxx:224
long mnMonthPerLine
Definition: calendar.hxx:144
virtual void Tracking(const TrackingEvent &rMEvt) override
Definition: calendar.cxx:1050
long mnDayHeight
Definition: calendar.hxx:147
bool mbSpinDown
Definition: calendar.hxx:151
Date maOldFirstDate
Definition: calendar.hxx:133
void ImplMouseSelect(const Date &rDate, sal_uInt16 nHitTest)
Definition: calendar.cxx:806
void ImplScroll(bool bPrev)
Definition: calendar.cxx:858
std::unique_ptr< IntDateSet > mpSelectTable
Definition: calendar.hxx:120
tools::Rectangle maPrevRect
Definition: calendar.hxx:126
Calendar(vcl::Window *pParent, WinBits nWinStyle)
Definition: calendar.cxx:130
sal_uInt16 GetMonthCount() const
Definition: calendar.cxx:1358
OUString maDayText
Definition: calendar.hxx:123
void ImplFormat()
Definition: calendar.cxx:190
Some things multiple-inherit from VclAbstractDialog and OutputDevice, so we need to use virtual inher...
Definition: outdev.hxx:302
bool mbNextIn
Definition: calendar.hxx:151
virtual void Resize() override
Definition: calendar.cxx:1142
void SetSelectHdl(const Link< Calendar *, void > &rLink)
Definition: calendar.hxx:223
long mnDaysOffY
Definition: calendar.hxx:141
void ImplDrawSpin(vcl::RenderContext &rRenderContext)
Definition: calendar.cxx:501
Date maFirstDate
Definition: calendar.hxx:132
virtual void KeyInput(const KeyEvent &rKEvt) override
Definition: calendar.cxx:1060
DayOfWeek ImplGetWeekStart() const
Definition: calendar.cxx:155
long mnDayOfWeekAry[7]
Definition: calendar.hxx:129
Date maOldFormatLastDate
Definition: calendar.hxx:131
void SetCurDate(const Date &rNewDate)
Definition: calendar.cxx:1276
void ImplInit(WinBits nWinStyle)
Definition: calendar.cxx:67
WinBits mnWinStyle
Definition: calendar.hxx:148
long mnDaysOffX
Definition: calendar.hxx:139
long mnMonthWidth
Definition: calendar.hxx:143
long mnMonthHeight
Definition: calendar.hxx:142
virtual void dispose() override
This is intended to be used to clear any locally held references to other Window-subclass objects...
Definition: calendar.cxx:148
Definition: ctrl.hxx:33
OUString maDayOfWeekText
Definition: calendar.hxx:128
Date GetLastMonth() const
Definition: calendar.cxx:1348
void ImplTracking(const Point &rPos, bool bRepeat)
Definition: calendar.cxx:925
Date maOldFormatFirstDate
Definition: calendar.hxx:130
void ImplEndTracking(bool bCancel)
Definition: calendar.cxx:944
Color maOtherColor
Definition: calendar.hxx:137
void SetFirstDate(const Date &rNewFirstDate)
Definition: calendar.cxx:1326
virtual void RequestHelp(const HelpEvent &rHEvt) override
Definition: calendar.cxx:1148
Date GetFirstSelectedDate() const
Definition: calendar.cxx:1265
Date maCurDate
Definition: calendar.hxx:134
long mnDayWidth
Definition: calendar.hxx:146
Date GetLastDate() const
Definition: calendar.hxx:212
Link< Calendar *, void > maSelectHdl
Definition: calendar.hxx:158
void ImplInitSettings()
Definition: ctrl.cxx:428
bool mbCalc
Definition: calendar.hxx:151
sal_Int16 mnLastYear
Definition: calendar.hxx:150
std::set< sal_Int32 > IntDateSet
Definition: calendar.hxx:34
void EndSelection()
Definition: calendar.cxx:1479
void Select()
Definition: calendar.cxx:1260
virtual void StateChanged(StateChangedType nStateChange) override
Definition: calendar.cxx:1238
virtual void Command(const CommandEvent &rCEvt) override
Definition: calendar.cxx:1193