File indexing completed on 2024-04-28 04:20:57

0001 /* SPDX-FileCopyrightText: 2003-2010 Jesper K. Pedersen <blackie@kde.org>
0002 
0003    SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #include "ViewHandler.h"
0007 
0008 #include <KLocalizedString>
0009 #include <QLocale>
0010 #include <math.h>
0011 
0012 using namespace DateBar;
0013 
0014 /**
0015  * \class DateBar::ViewHandler
0016  * \brief Base class for classes handling logic regarding individual bars in the datebar.
0017  *
0018  * A major part of the date bar is figuring out which date interval a given bar represent, this class is taking care of this.
0019  */
0020 
0021 /**
0022  * Indicate that the first unit in the bar represent the date given as parameter
0023  */
0024 void ViewHandler::init(const Utilities::FastDateTime &startDate)
0025 {
0026     m_startDate = startDate;
0027 }
0028 
0029 /**
0030  * Returns whether this unit is a major unit (like January in year view, or Monday in week view)
0031  * This information is used to draw a longer line in the date bar for the given unit.
0032  */
0033 bool DateBar::ViewHandler::isMajorUnit(int)
0034 {
0035     // included for documentation
0036     return true;
0037 }
0038 
0039 /**
0040  * Returns whether this is a mid unit (like 30 minute in hour view)
0041  * This information is used to draw a slightly longer line in the date bar for the given unit.
0042  */
0043 bool ViewHandler::isMidUnit(int /*unit*/)
0044 {
0045     return false;
0046 }
0047 
0048 /**
0049  * Returns the text to be shown for the given unit. This method will only be call for major units.
0050  */
0051 QString DateBar::ViewHandler::text(int)
0052 {
0053     // Included for documentation.
0054     return QString();
0055 }
0056 
0057 /**
0058  * Returns the length of one unit (to be shown at the right of the date bar)
0059  */
0060 QString DateBar::ViewHandler::unitText() const
0061 {
0062     // Included for documentation.
0063     return QString();
0064 }
0065 
0066 /**
0067  * Return the date for the beginning of the unit given as the first argument. If the second optional argument is
0068  * given, then this is used as the date for the first unit, otherwise the date given to \ref init will be used as offset.
0069  */
0070 Utilities::FastDateTime DateBar::ViewHandler::date(int, Utilities::FastDateTime)
0071 {
0072     // Included for documentation.
0073     return Utilities::FastDateTime();
0074 }
0075 
0076 void DecadeViewHandler::init(const Utilities::FastDateTime &startDate)
0077 {
0078     Utilities::FastDateTime date = Utilities::FastDateTime(QDate(startDate.date().year(), 1, 1), QTime(0, 0, 0));
0079     ViewHandler::init(date);
0080 }
0081 
0082 bool DecadeViewHandler::isMajorUnit(int unit)
0083 {
0084     return date(unit).date().year() % 10 == 0;
0085 }
0086 
0087 bool DecadeViewHandler::isMidUnit(int unit)
0088 {
0089     return date(unit).date().year() % 5 == 0;
0090 }
0091 
0092 QString DecadeViewHandler::text(int unit)
0093 {
0094     return QString::number(date(unit).date().year());
0095 }
0096 
0097 Utilities::FastDateTime DecadeViewHandler::date(int unit, Utilities::FastDateTime reference)
0098 {
0099     if (reference.isNull())
0100         reference = m_startDate;
0101     return reference.addMonths(12 * unit);
0102 }
0103 
0104 QString DecadeViewHandler::unitText() const
0105 {
0106     return i18n("1 Year");
0107 }
0108 
0109 void YearViewHandler::init(const Utilities::FastDateTime &startDate)
0110 {
0111     Utilities::FastDateTime date = Utilities::FastDateTime(QDate(startDate.date().year(), startDate.date().month(), 1), QTime(0, 0, 0));
0112     ViewHandler::init(date);
0113 }
0114 
0115 bool YearViewHandler::isMajorUnit(int unit)
0116 {
0117     return date(unit).date().month() == 1;
0118 }
0119 
0120 bool YearViewHandler::isMidUnit(int unit)
0121 {
0122     return date(unit).date().month() == 7;
0123 }
0124 
0125 QString YearViewHandler::text(int unit)
0126 {
0127     return QString::number(date(unit).date().year());
0128 }
0129 
0130 Utilities::FastDateTime YearViewHandler::date(int unit, Utilities::FastDateTime reference)
0131 {
0132     if (reference.isNull())
0133         reference = m_startDate;
0134     return reference.addMonths(unit);
0135 }
0136 
0137 QString YearViewHandler::unitText() const
0138 {
0139     return i18n("1 Month");
0140 }
0141 
0142 void MonthViewHandler::init(const Utilities::FastDateTime &startDate)
0143 {
0144     QDate date = startDate.date().addDays(-startDate.date().dayOfWeek() + 1); // Wind to monday
0145     ViewHandler::init(Utilities::FastDateTime(date, QTime(0, 0, 0)));
0146 }
0147 
0148 bool MonthViewHandler::isMajorUnit(int unit)
0149 {
0150     return date(unit).date().day() <= 7;
0151 }
0152 
0153 QString MonthViewHandler::text(int unit)
0154 {
0155     static int lastunit = 99999;
0156     static int printedLast = false;
0157     if (unit < lastunit)
0158         printedLast = true;
0159     QString str;
0160     if (!printedLast)
0161         str = QLocale().toString(date(unit).date(), QLocale::ShortFormat);
0162     printedLast = !printedLast;
0163     lastunit = unit;
0164     return str;
0165 }
0166 
0167 Utilities::FastDateTime MonthViewHandler::date(int unit, Utilities::FastDateTime reference)
0168 {
0169     if (reference.isNull())
0170         reference = m_startDate;
0171     return reference.addDays(7 * unit);
0172 }
0173 
0174 QString MonthViewHandler::unitText() const
0175 {
0176     return i18n("1 Week");
0177 }
0178 
0179 void WeekViewHandler::init(const Utilities::FastDateTime &startDate)
0180 {
0181     ViewHandler::init(Utilities::FastDateTime(startDate.date(), QTime(0, 0, 0)));
0182 }
0183 
0184 bool WeekViewHandler::isMajorUnit(int unit)
0185 {
0186     return date(unit).date().dayOfWeek() == 1;
0187 }
0188 
0189 QString WeekViewHandler::text(int unit)
0190 {
0191     return QLocale().toString(date(unit).date(), QLocale::ShortFormat);
0192 }
0193 
0194 Utilities::FastDateTime WeekViewHandler::date(int unit, Utilities::FastDateTime reference)
0195 {
0196     if (reference.isNull())
0197         reference = m_startDate;
0198     return reference.addDays(unit);
0199 }
0200 
0201 QString WeekViewHandler::unitText() const
0202 {
0203     return i18n("1 Day");
0204 }
0205 
0206 void DayViewHandler::init(const Utilities::FastDateTime &startDate)
0207 {
0208     Utilities::FastDateTime date = startDate;
0209     if (date.time().hour() % 2)
0210         date = date.addSecs(60 * 60);
0211 
0212     ViewHandler::init(Utilities::FastDateTime(date.date(), QTime(date.time().hour(), 0, 0)));
0213 }
0214 
0215 bool DayViewHandler::isMajorUnit(int unit)
0216 {
0217     int h = date(unit).time().hour();
0218     return h == 0 || h == 12;
0219 }
0220 
0221 bool DayViewHandler::isMidUnit(int unit)
0222 {
0223     int h = date(unit).time().hour();
0224     return h == 6 || h == 18;
0225 }
0226 
0227 QString DayViewHandler::text(int unit)
0228 {
0229     if (date(unit).time().hour() == 0)
0230         return QLocale().toString(date(unit).date(), QLocale::ShortFormat);
0231     else
0232         return date(unit).toString(QString::fromLatin1("h:00"));
0233 }
0234 
0235 Utilities::FastDateTime DayViewHandler::date(int unit, Utilities::FastDateTime reference)
0236 {
0237     if (reference.isNull())
0238         reference = m_startDate;
0239     return reference.addSecs(2 * 60 * 60 * unit);
0240 }
0241 
0242 QString DayViewHandler::unitText() const
0243 {
0244     return i18n("2 Hours");
0245 }
0246 
0247 void HourViewHandler::init(const Utilities::FastDateTime &startDate)
0248 {
0249     ViewHandler::init(Utilities::FastDateTime(startDate.date(),
0250                                               QTime(startDate.time().hour(), 10 * (int)floor(startDate.time().minute() / 10.0), 0)));
0251 }
0252 
0253 bool HourViewHandler::isMajorUnit(int unit)
0254 {
0255     return date(unit).time().minute() == 0;
0256 }
0257 
0258 bool HourViewHandler::isMidUnit(int unit)
0259 {
0260     int min = date(unit).time().minute();
0261     return min == 30;
0262 }
0263 
0264 QString HourViewHandler::text(int unit)
0265 {
0266     return date(unit).toString(QString::fromLatin1("h:00"));
0267 }
0268 
0269 Utilities::FastDateTime HourViewHandler::date(int unit, Utilities::FastDateTime reference)
0270 {
0271     if (reference.isNull())
0272         reference = m_startDate;
0273     return reference.addSecs(60 * 10 * unit);
0274 }
0275 
0276 QString HourViewHandler::unitText() const
0277 {
0278     return i18n("10 Minutes");
0279 }
0280 
0281 void TenMinuteViewHandler::init(const Utilities::FastDateTime &startDate)
0282 {
0283     ViewHandler::init(Utilities::FastDateTime(startDate.date(),
0284                                               QTime(startDate.time().hour(), 10 * (int)floor(startDate.time().minute() / 10.0), 0)));
0285 }
0286 
0287 bool TenMinuteViewHandler::isMajorUnit(int unit)
0288 {
0289     return (date(unit).time().minute() % 10) == 0;
0290 }
0291 
0292 bool TenMinuteViewHandler::isMidUnit(int unit)
0293 {
0294     int min = date(unit).time().minute();
0295     return (min % 10) == 5;
0296 }
0297 
0298 QString TenMinuteViewHandler::text(int unit)
0299 {
0300     return date(unit).toString(QString::fromLatin1("h:mm"));
0301 }
0302 
0303 Utilities::FastDateTime TenMinuteViewHandler::date(int unit, Utilities::FastDateTime reference)
0304 {
0305     if (reference.isNull())
0306         reference = m_startDate;
0307     return reference.addSecs(60 * unit);
0308 }
0309 
0310 QString TenMinuteViewHandler::unitText() const
0311 {
0312     return i18n("1 Minute");
0313 }
0314 
0315 void MinuteViewHandler::init(const Utilities::FastDateTime &startDate)
0316 {
0317     ViewHandler::init(Utilities::FastDateTime(startDate.date(),
0318                                               QTime(startDate.time().hour(),
0319                                                     startDate.time().minute(), 0)));
0320 }
0321 
0322 bool MinuteViewHandler::isMajorUnit(int unit)
0323 {
0324     return date(unit).time().second() == 0;
0325 }
0326 
0327 bool MinuteViewHandler::isMidUnit(int unit)
0328 {
0329     int sec = date(unit).time().second();
0330     return sec == 30;
0331 }
0332 
0333 QString MinuteViewHandler::text(int unit)
0334 {
0335     return date(unit).toString(QString::fromLatin1("h:mm"));
0336 }
0337 
0338 Utilities::FastDateTime MinuteViewHandler::date(int unit, Utilities::FastDateTime reference)
0339 {
0340     if (reference.isNull())
0341         reference = m_startDate;
0342     return reference.addSecs(10 * unit);
0343 }
0344 
0345 QString MinuteViewHandler::unitText() const
0346 {
0347     return i18n("10 Seconds");
0348 }
0349 
0350 // vi:expandtab:tabstop=4 shiftwidth=4: