author | drw <drw> | 2004-02-25 16:28:34 (UTC) |
---|---|---|
committer | drw <drw> | 2004-02-25 16:28:34 (UTC) |
commit | f84a46fce6c1b7702ec1eaebd40e363b67253649 (patch) (side-by-side diff) | |
tree | 8ce368593373f66cd3e5b090ee222a7cc7835739 /libopie2/opiepim/ui | |
parent | 25e87d9ccc92b7a4c12518532576f55b11726b26 (diff) | |
download | opie-f84a46fce6c1b7702ec1eaebd40e363b67253649.zip opie-f84a46fce6c1b7702ec1eaebd40e363b67253649.tar.gz opie-f84a46fce6c1b7702ec1eaebd40e363b67253649.tar.bz2 |
Added OPimRecurrenceBase & OPimRecurrenceWidget to libopiepim2
-rw-r--r-- | libopie2/opiepim/ui/.cvsignore | 8 | ||||
-rw-r--r-- | libopie2/opiepim/ui/opimrecurrencebase.ui | 713 | ||||
-rw-r--r-- | libopie2/opiepim/ui/opimrecurrencewidget.cpp | 634 | ||||
-rw-r--r-- | libopie2/opiepim/ui/opimrecurrencewidget.h | 93 | ||||
-rw-r--r-- | libopie2/opiepim/ui/ui.pro | 8 |
5 files changed, 1454 insertions, 2 deletions
diff --git a/libopie2/opiepim/ui/.cvsignore b/libopie2/opiepim/ui/.cvsignore new file mode 100644 index 0000000..fc84516 --- a/dev/null +++ b/libopie2/opiepim/ui/.cvsignore @@ -0,0 +1,8 @@ +Makefile* +opimrecurrencebase.cpp +opimrecurrencebase.h +obj +moc* +*moc +*.o +~* diff --git a/libopie2/opiepim/ui/opimrecurrencebase.ui b/libopie2/opiepim/ui/opimrecurrencebase.ui new file mode 100644 index 0000000..d70acb9 --- a/dev/null +++ b/libopie2/opiepim/ui/opimrecurrencebase.ui @@ -0,0 +1,713 @@ +<!DOCTYPE UI><UI> +<class>OPimRecurrenceBase</class> +<comment>********************************************************************* +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of Qtopia Environment. +** +** This file may be distributed and/or modified under the terms of the +** GNU General Public License version 2 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +** See http://www.trolltech.com/gpl/ for GPL licensing information. +** +** Contact info@trolltech.com if any conditions of this licensing are +** not clear to you. +** +** $Id$ +** +*********************************************************************</comment> +<widget> + <class>QDialog</class> + <property stdset="1"> + <name>name</name> + <cstring>OPimRecurrenceBase</cstring> + </property> + <property stdset="1"> + <name>geometry</name> + <rect> + <x>0</x> + <y>0</y> + <width>246</width> + <height>309</height> + </rect> + </property> + <property stdset="1"> + <name>caption</name> + <string>Repeating Event </string> + </property> + <property> + <name>layoutMargin</name> + </property> + <property> + <name>layoutSpacing</name> + </property> + <vbox> + <property stdset="1"> + <name>margin</name> + <number>5</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>1</number> + </property> + <widget> + <class>QButtonGroup</class> + <property stdset="1"> + <name>name</name> + <cstring>fraType</cstring> + </property> + <property stdset="1"> + <name>frameShape</name> + <enum>NoFrame</enum> + </property> + <property stdset="1"> + <name>frameShadow</name> + <enum>Sunken</enum> + </property> + <property stdset="1"> + <name>title</name> + <string></string> + </property> + <property stdset="1"> + <name>exclusive</name> + <bool>true</bool> + </property> + <property> + <name>layoutMargin</name> + </property> + <property> + <name>layoutSpacing</name> + </property> + <hbox> + <property stdset="1"> + <name>margin</name> + <number>5</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>1</number> + </property> + <widget> + <class>QToolButton</class> + <property stdset="1"> + <name>name</name> + <cstring>cmdNone</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>None</string> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + </widget> + <widget> + <class>QToolButton</class> + <property stdset="1"> + <name>name</name> + <cstring>cmdDay</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Day</string> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + </widget> + <widget> + <class>QToolButton</class> + <property stdset="1"> + <name>name</name> + <cstring>cmdWeek</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>text</name> + <string>Week</string> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + </widget> + <widget> + <class>QToolButton</class> + <property stdset="1"> + <name>name</name> + <cstring>cmdMonth</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>text</name> + <string>Month</string> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + </widget> + <widget> + <class>QToolButton</class> + <property stdset="1"> + <name>name</name> + <cstring>cmdYear</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Year</string> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + </widget> + </hbox> + </widget> + <widget> + <class>QLayoutWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>Layout4</cstring> + </property> + <hbox> + <property stdset="1"> + <name>margin</name> + <number>0</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>6</number> + </property> + <widget> + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>lblEvery</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Every:</string> + </property> + </widget> + <widget> + <class>QSpinBox</class> + <property stdset="1"> + <name>name</name> + <cstring>spinFreq</cstring> + </property> + <property stdset="1"> + <name>minValue</name> + <number>1</number> + </property> + </widget> + <widget> + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>lblFreq</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>text</name> + <string>Frequency</string> + </property> + </widget> + </hbox> + </widget> + <widget> + <class>QLayoutWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>Layout8</cstring> + </property> + <hbox> + <property stdset="1"> + <name>margin</name> + <number>0</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>6</number> + </property> + <widget> + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>lblEnd</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>0</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>text</name> + <string>End On:</string> + </property> + </widget> + <widget> + <class>QToolButton</class> + <property stdset="1"> + <name>name</name> + <cstring>cmdEnd</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>No End Date</string> + </property> + </widget> + <widget> + <class>QCheckBox</class> + <property stdset="1"> + <name>name</name> + <cstring>chkNoEnd</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>No End Date</string> + </property> + </widget> + </hbox> + </widget> + <widget> + <class>QButtonGroup</class> + <property stdset="1"> + <name>name</name> + <cstring>fraExtra</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>7</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>frameShape</name> + <enum>Box</enum> + </property> + <property stdset="1"> + <name>title</name> + <string>Repeat On</string> + </property> + <property> + <name>layoutMargin</name> + </property> + <property> + <name>layoutSpacing</name> + </property> + <hbox> + <property stdset="1"> + <name>margin</name> + <number>5</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>1</number> + </property> + <widget> + <class>QToolButton</class> + <property stdset="1"> + <name>name</name> + <cstring>cmdExtra1</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Mon</string> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + </widget> + <widget> + <class>QToolButton</class> + <property stdset="1"> + <name>name</name> + <cstring>cmdExtra2</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Tue</string> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + </widget> + <widget> + <class>QToolButton</class> + <property stdset="1"> + <name>name</name> + <cstring>cmdExtra3</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Wed</string> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + </widget> + <widget> + <class>QToolButton</class> + <property stdset="1"> + <name>name</name> + <cstring>cmdExtra4</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Thu</string> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + </widget> + <widget> + <class>QToolButton</class> + <property stdset="1"> + <name>name</name> + <cstring>cmdExtra5</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Fri</string> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + </widget> + <widget> + <class>QToolButton</class> + <property stdset="1"> + <name>name</name> + <cstring>cmdExtra6</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Sat</string> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + </widget> + <widget> + <class>QToolButton</class> + <property stdset="1"> + <name>name</name> + <cstring>cmdExtra7</cstring> + </property> + <property stdset="1"> + <name>text</name> + <string>Sun</string> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + <property stdset="1"> + <name>toggleButton</name> + <bool>true</bool> + </property> + </widget> + </hbox> + </widget> + <widget> + <class>QFrame</class> + <property stdset="1"> + <name>name</name> + <cstring>Frame3</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>7</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>frameShape</name> + <enum>Box</enum> + </property> + <property stdset="1"> + <name>frameShadow</name> + <enum>Sunken</enum> + </property> + <property> + <name>layoutMargin</name> + </property> + <property> + <name>layoutSpacing</name> + </property> + <vbox> + <property stdset="1"> + <name>margin</name> + <number>5</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>1</number> + </property> + <widget> + <class>QLayoutWidget</class> + <property stdset="1"> + <name>name</name> + <cstring>Layout6</cstring> + </property> + <property> + <name>layoutSpacing</name> + </property> + <hbox> + <property stdset="1"> + <name>margin</name> + <number>0</number> + </property> + <property stdset="1"> + <name>spacing</name> + <number>0</number> + </property> + <widget> + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>lblRepeat</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>3</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>text</name> + <string>Every</string> + </property> + <property stdset="1"> + <name>alignment</name> + <set>AlignTop|AlignLeft</set> + </property> + <property> + <name>hAlign</name> + </property> + <property> + <name>vAlign</name> + </property> + </widget> + <widget> + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>lblVar1</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>text</name> + <string>Var1</string> + </property> + <property stdset="1"> + <name>alignment</name> + <set>AlignTop|AlignLeft</set> + </property> + <property> + <name>hAlign</name> + </property> + <property> + <name>vAlign</name> + </property> + </widget> + <widget> + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>lblVar2</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>4</hsizetype> + <vsizetype>1</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>text</name> + <string>Var 2</string> + </property> + <property stdset="1"> + <name>alignment</name> + <set>AlignTop|AlignRight</set> + </property> + <property> + <name>hAlign</name> + </property> + <property> + <name>vAlign</name> + </property> + </widget> + </hbox> + </widget> + <widget> + <class>QLabel</class> + <property stdset="1"> + <name>name</name> + <cstring>lblWeekVar</cstring> + </property> + <property stdset="1"> + <name>sizePolicy</name> + <sizepolicy> + <hsizetype>1</hsizetype> + <vsizetype>7</vsizetype> + </sizepolicy> + </property> + <property stdset="1"> + <name>text</name> + <string>WeekVar</string> + </property> + <property stdset="1"> + <name>alignment</name> + <set>AlignTop|AlignHCenter</set> + </property> + <property> + <name>hAlign</name> + </property> + <property> + <name>vAlign</name> + </property> + </widget> + </vbox> + </widget> + </vbox> +</widget> +<connections> + <connection> + <sender>chkNoEnd</sender> + <signal>toggled(bool)</signal> + <receiver>cmdEnd</receiver> + <slot>setDisabled(bool)</slot> + </connection> + <connection> + <sender>chkNoEnd</sender> + <signal>toggled(bool)</signal> + <receiver>OPimRecurrenceBase</receiver> + <slot>slotNoEnd(bool)</slot> + </connection> + <connection> + <sender>spinFreq</sender> + <signal>valueChanged(int)</signal> + <receiver>lblVar1</receiver> + <slot>setNum(int)</slot> + </connection> + <connection> + <sender>spinFreq</sender> + <signal>valueChanged(int)</signal> + <receiver>OPimRecurrenceBase</receiver> + <slot>setupRepeatLabel( int )</slot> + </connection> + <connection> + <sender>fraType</sender> + <signal>clicked(int)</signal> + <receiver>OPimRecurrenceBase</receiver> + <slot>slotSetRType( int )</slot> + </connection> + <connection> + <sender>fraExtra</sender> + <signal>clicked(int)</signal> + <receiver>OPimRecurrenceBase</receiver> + <slot>slotMonthLabel( int )</slot> + </connection> + <connection> + <sender>fraExtra</sender> + <signal>clicked(int)</signal> + <receiver>OPimRecurrenceBase</receiver> + <slot>slotWeekLabel()</slot> + </connection> + <slot access="public">setupRepeatLabel( const QString & )</slot> + <slot access="public">setupRepeatLabel( int )</slot> + <slot access="public">slotMonthLabel( int )</slot> + <slot access="public">slotNoEnd(bool)</slot> + <slot access="public">slotSetRType( int )</slot> + <slot access="public">slotWeekLabel()</slot> +</connections> +</UI> diff --git a/libopie2/opiepim/ui/opimrecurrencewidget.cpp b/libopie2/opiepim/ui/opimrecurrencewidget.cpp new file mode 100644 index 0000000..569bdd5 --- a/dev/null +++ b/libopie2/opiepim/ui/opimrecurrencewidget.cpp @@ -0,0 +1,634 @@ +#include <qapplication.h> +#include <qlabel.h> +#include <qpopupmenu.h> +#include <qspinbox.h> + +#include <qpe/timestring.h> + +#include "opimrecurrencewidget.h" + +// Global Templates for use in setting up the repeat label... +// the problem is these strings get initialized before QPEApplication can install the translator -zecke +namespace { +QString strDayTemplate; +QString strYearTemplate; +QString strMonthDateTemplate; +QString strMonthDayTemplate; +QString strWeekTemplate; +QString dayLabel[7]; +} + +/* + * static linkage to not polute the symbol table... + * The problem is that const and static linkage are resolved prior to installing a translator + * leading to that the above strings are translted but to the original we delay the init of these strings... + * -zecke + */ +static void fillStrings() { + strDayTemplate = QObject::tr("Every"); + strYearTemplate = QObject::tr("%1 %2 every "); + strMonthDateTemplate = QObject::tr("The %1 every "); + strMonthDayTemplate = QObject::tr("The %1 %2 of every"); + strWeekTemplate = QObject::tr("Every "); + dayLabel[0] = QObject::tr("Monday"); + dayLabel[1] = QObject::tr("Tuesday"); + dayLabel[2] = QObject::tr("Wednesday"); + dayLabel[3] = QObject::tr("Thursday"); + dayLabel[4] = QObject::tr("Friday"); + dayLabel[5] = QObject::tr("Saturday"); + dayLabel[6] = QObject::tr("Sunday"); +} + +static QString numberPlacing( int x ); // return the proper word format for + // x (1st, 2nd, etc) +static int week( const QDate &dt ); // what week in the month is dt? + +/** + * Constructs the Widget + * @param startOnMonday Does the week start on monday + * @param newStart The start date of the recurrence + * @param parent The parent widget + * @param name the name of object + * @param modal if the dialog should be modal + * @param fl Additional window flags + */ +OPimRecurrenceWidget::OPimRecurrenceWidget( bool startOnMonday, + const QDate& newStart, + QWidget* parent, + const char* name, + bool modal, + WFlags fl ) + : OPimRecurrenceBase( parent, name, modal, fl ), + start( newStart ), + currInterval( None ), + startWeekOnMonday( startOnMonday ) +{ + if (strDayTemplate.isEmpty() ) + fillStrings(); + + init(); + fraType->setButton( currInterval ); + chkNoEnd->setChecked( TRUE ); + setupNone(); +} + +/** + * Different constructor + * @param startOnMonday Does the week start on monday? + * @param rp Already set OPimRecurrence object + * @param startDate The start date + * @param parent The parent widget + * @param name The name of the object + * @param modal + * @param fl The flags for window + */ +OPimRecurrenceWidget::OPimRecurrenceWidget( bool startOnMonday, + const OPimRecurrence& rp, const QDate& startDate, + QWidget* parent, const char* name, + bool modal, WFlags fl) + : OPimRecurrenceBase( parent, name, modal, fl ), + start( startDate ), + end( rp.endDate() ), + startWeekOnMonday( startOnMonday ) +{ + if (strDayTemplate.isEmpty() ) + fillStrings(); + // do some stuff with the repeat pattern + init(); + setRecurrence( rp ); +} + +OPimRecurrenceWidget::~OPimRecurrenceWidget() { +} + +/** + * set the start date + * @param date the new start date + */ +void OPimRecurrenceWidget::setStartDate( const QDate& date ) { + setRecurrence( recurrence(), date ); +} +/** + * set the recurrence + * @param rp The OPimRecurrence object with the new recurrence rules + */ +void OPimRecurrenceWidget::setRecurrence( const OPimRecurrence& rp ) { + setRecurrence( rp, start ); +} + +/** + * overloaded method taking OPimRecurrence and a new start date + * @param rp Recurrence rule + * @param date The new start date + */ +void OPimRecurrenceWidget::setRecurrence( const OPimRecurrence& rp, const QDate& date ) { + start = date; + end = rp.endDate(); + switch ( rp.type() ) { + default: + case OPimRecurrence::NoRepeat: + currInterval = None; + setupNone(); + break; + case OPimRecurrence::Daily: + currInterval = Day; + setupDaily(); + break; + case OPimRecurrence::Weekly: + currInterval = Week; + setupWeekly(); + int day, buttons; + for ( day = 0x01, buttons = 0; buttons < 7; + day = day << 1, buttons++ ) { + if ( rp.days() & day ) { + if ( startWeekOnMonday ) + fraExtra->setButton( buttons ); + else { + if ( buttons == 7 ) + fraExtra->setButton( 0 ); + else + fraExtra->setButton( buttons + 1 ); + } + } + } + slotWeekLabel(); + break; + case OPimRecurrence::MonthlyDay: + currInterval = Month; + setupMonthly(); + fraExtra->setButton( 0 ); + slotMonthLabel( 0 ); + break; + case OPimRecurrence::MonthlyDate: + currInterval = Month; + setupMonthly(); + fraExtra->setButton( 1 ); + slotMonthLabel( 1 ); + break; + case OPimRecurrence::Yearly: + currInterval = Year; + setupYearly(); + break; + } + fraType->setButton( currInterval ); + spinFreq->setValue( rp.frequency() ); + if ( !rp.hasEndDate() ) { + cmdEnd->setText( tr("No End Date") ); + chkNoEnd->setChecked( TRUE ); + } else + cmdEnd->setText( TimeString::shortDate( end ) ); +} + +/** + * the user selected recurrence rule. + * @return The recurrence rule. + */ +OPimRecurrence OPimRecurrenceWidget::recurrence()const { + QListIterator<QToolButton> it( listRTypeButtons ); + QListIterator<QToolButton> itExtra( listExtra ); + OPimRecurrence rpTmp; + int i; + for ( i = 0; *it; ++it, i++ ) { + if ( (*it)->isOn() ) { + switch ( i ) { + case None: + rpTmp.setType( OPimRecurrence::NoRepeat ); + break; + case Day: + rpTmp.setType( OPimRecurrence::Daily ); + break; + case Week:{ + rpTmp.setType( OPimRecurrence::Weekly ); + int day; + int day2 = 0; + for ( day = 1; *itExtra; ++itExtra, day = day << 1 ) { + if ( (*itExtra)->isOn() ) { + if ( startWeekOnMonday ) + day2 |= day; + else { + if ( day == 1 ) + day2 |= Event::SUN; + else + day2 |= day >> 1; + } + } + } + rpTmp.setDays( day2 ); + } + break; + case Month: + if ( cmdExtra1->isOn() ) + rpTmp.setType( OPimRecurrence::MonthlyDay ); + else if ( cmdExtra2->isOn() ) + rpTmp.setType( OPimRecurrence::MonthlyDate ); + // figure out the montly day... + rpTmp.setPosition( week( start ) ); + break; + case Year: + rpTmp.setType( OPimRecurrence::Yearly ); + break; + } + break; // no need to keep looking! + } + } + rpTmp.setFrequency(spinFreq->value() ); + rpTmp.setHasEndDate( !chkNoEnd->isChecked() ); + if ( rpTmp.hasEndDate() ) { + rpTmp.setEndDate( end ); + } + // timestamp it... +// rpTmp.setCreateTime( ); current DateTime is already set -zecke + return rpTmp; +} + +/** + * Return the end date of the recurrence. This is only + * valid if the recurrence rule does contain an enddate + */ +QDate OPimRecurrenceWidget::endDate()const { + return end; +} +void OPimRecurrenceWidget::slotSetRType(int rtype) { + // now call the right function based on the type... + currInterval = static_cast<repeatButtons>(rtype); + switch ( currInterval ) { + case None: + setupNone(); + break; + case Day: + setupDaily(); + break; + case Week: + setupWeekly(); + slotWeekLabel(); + break; + case Month: + setupMonthly(); + cmdExtra2->setOn( TRUE ); + slotMonthLabel( 1 ); + break; + case Year: + setupYearly(); + break; + } +} +void OPimRecurrenceWidget::endDateChanged(int y, int m, int d) { + end.setYMD( y, m, d ); + if ( end < start ) + end = start; + cmdEnd->setText( TimeString::shortDate( end ) ); + repeatPicker->setDate( end.year(), end.month(), end.day() ); +} +void OPimRecurrenceWidget::slotNoEnd( bool unused) { + // if the item was toggled, then go ahead and set it to the maximum date + if ( unused ) { + end.setYMD( 3000, 12, 31 ); + cmdEnd->setText( tr("No End Date") ); + } else { + end = start; + cmdEnd->setText( TimeString::shortDate(end) ); + } +} +void OPimRecurrenceWidget::setupRepeatLabel( const QString& s) { + lblVar1->setText( s ); +} +void OPimRecurrenceWidget::setupRepeatLabel( int x) { + // change the spelling based on the value of x + QString strVar2; + + if ( x > 1 ) + lblVar1->show(); + else + lblVar1->hide(); + + switch ( currInterval ) { + case None: + break; + case Day: + if ( x > 1 ) + strVar2 = tr( "days" ); + else + strVar2 = tr( "day" ); + break; + case Week: + if ( x > 1 ) + strVar2 = tr( "weeks" ); + else + strVar2 = tr( "week" ); + break; + case Month: + if ( x > 1 ) + strVar2 = tr( "months" ); + else + strVar2 = tr( "month" ); + break; + case Year: + if ( x > 1 ) + strVar2 = tr( "years" ); + else + strVar2 = tr( "year" ); + break; + } + if ( !strVar2.isNull() ) + lblVar2->setText( strVar2 ); +} +void OPimRecurrenceWidget::slotWeekLabel() { + QString str; + QListIterator<QToolButton> it( listExtra ); + unsigned int i; + unsigned int keepMe; + bool bNeedCarriage = FALSE; + // don't do something we'll regret!!! + if ( currInterval != Week ) + return; + + if ( startWeekOnMonday ) + keepMe = start.dayOfWeek() - 1; + else + keepMe = start.dayOfWeek() % 7; + + QStringList list; + for ( i = 0; *it; ++it, i++ ) { + // a crazy check, if you are repeating weekly, the current day + // must be selected!!! + if ( i == keepMe && !( (*it)->isOn() ) ) + (*it)->setOn( TRUE ); + if ( (*it)->isOn() ) { + if ( startWeekOnMonday ) + list.append( dayLabel[i] ); + else { + if ( i == 0 ) + list.append( dayLabel[6] ); + else + list.append( dayLabel[i - 1] ); + } + } + } + QStringList::Iterator itStr; + for ( i = 0, itStr = list.begin(); itStr != list.end(); ++itStr, i++ ) { + if ( i == 3 ) + bNeedCarriage = TRUE; + else + bNeedCarriage = FALSE; + if ( str.isNull() ) + str = *itStr; + else if ( i == list.count() - 1 ) { + if ( i < 2 ) + str += tr(" and ") + *itStr; + else { + if ( bNeedCarriage ) + str += tr( ",\nand " ) + *itStr; + else + str += tr( ", and " ) + *itStr; + } + } else { + if ( bNeedCarriage ) + str += ",\n" + *itStr; + else + str += ", " + *itStr; + } + } + str = str.prepend( tr("on ") ); + + lblWeekVar->setText( str ); +} +void OPimRecurrenceWidget::slotMonthLabel(int type) { + QString str; + if ( currInterval != Month || type > 1 ) + return; + if ( type == 1 ) + str = strMonthDateTemplate.arg( numberPlacing(start.day()) ); + else + str = strMonthDayTemplate.arg( numberPlacing(week(start))) + .arg( dayLabel[start.dayOfWeek() - 1] ); + lblRepeat->setText( str ); +} +void OPimRecurrenceWidget::slotChangeStartOfWeek( bool onMonday ) { + startWeekOnMonday = onMonday; + // we need to make this unintrusive as possible... + int saveSpin = spinFreq->value(); + char days = 0; + int day; + QListIterator<QToolButton> itExtra( listExtra ); + for ( day = 1; *itExtra; ++itExtra, day = day << 1 ) { + if ( (*itExtra)->isOn() ) { + if ( !startWeekOnMonday ) + days |= day; + else { + if ( day == 1 ) + days |= OPimRecurrence::SUN; + else + days |= day >> 1; + } + } + } + setupWeekly(); + spinFreq->setValue( saveSpin ); + int buttons; + for ( day = 0x01, buttons = 0; buttons < 7; + day = day << 1, buttons++ ) { + if ( days & day ) { + if ( startWeekOnMonday ) + fraExtra->setButton( buttons ); + else { + if ( buttons == 7 ) + fraExtra->setButton( 0 ); + else + fraExtra->setButton( buttons + 1 ); + } + } + } + slotWeekLabel(); +} +void OPimRecurrenceWidget::setupNone() { + lblRepeat->setText( tr("No Repeat") ); + lblVar1->hide(); + lblVar2->hide(); + hideExtras(); + cmdEnd->hide(); + lblFreq->hide(); + lblEvery->hide(); + lblFreq->hide(); + spinFreq->hide(); + lblEnd->hide(); + lblWeekVar->hide(); +} +void OPimRecurrenceWidget::setupDaily() { + hideExtras(); + lblWeekVar->hide(); + spinFreq->setValue( 1 ); + lblFreq->setText( tr("day(s)") ); + lblVar2->show(); + showRepeatStuff(); + lblRepeat->setText( strDayTemplate ); + setupRepeatLabel( 1 ); +} +void OPimRecurrenceWidget::setupWeekly() { +// reshow the buttons... + fraExtra->setTitle( tr("Repeat On") ); + fraExtra->setExclusive( FALSE ); + fraExtra->show(); + if ( startWeekOnMonday ) { + cmdExtra1->setText( tr("Mon") ); + cmdExtra2->setText( tr("Tue") ); + cmdExtra3->setText( tr("Wed") ); + cmdExtra4->setText( tr("Thu") ); + cmdExtra5->setText( tr("Fri") ); + cmdExtra6->setText( tr("Sat") ); + cmdExtra7->setText( tr("Sun") ); + } else { + cmdExtra1->setText( tr("Sun") ); + cmdExtra2->setText( tr("Mon") ); + cmdExtra3->setText( tr("Tue") ); + cmdExtra4->setText( tr("Wed") ); + cmdExtra5->setText( tr("Thu") ); + cmdExtra6->setText( tr("Fri") ); + cmdExtra7->setText( tr("Sat") ); + } + // I hope clustering these improve performance.... + cmdExtra1->setOn( FALSE ); + cmdExtra2->setOn( FALSE ); + cmdExtra3->setOn( FALSE ); + cmdExtra4->setOn( FALSE ); + cmdExtra5->setOn( FALSE ); + cmdExtra6->setOn( FALSE ); + cmdExtra7->setOn( FALSE ); + + cmdExtra1->show(); + cmdExtra2->show(); + cmdExtra3->show(); + cmdExtra4->show(); + cmdExtra5->show(); + cmdExtra6->show(); + cmdExtra7->show(); + + lblWeekVar->show(); + spinFreq->setValue( 1 ); + // might as well set the day too... + if ( startWeekOnMonday ) { + fraExtra->setButton( start.dayOfWeek() - 1 ); + } else { + fraExtra->setButton( start.dayOfWeek() % 7 ); + } + lblFreq->setText( tr("week(s)") ); + lblVar2->show(); + showRepeatStuff(); + setupRepeatLabel( 1 ); +} +void OPimRecurrenceWidget::setupMonthly() { + hideExtras(); + lblWeekVar->hide(); + fraExtra->setTitle( tr("Repeat By") ); + fraExtra->setExclusive( TRUE ); + fraExtra->show(); + cmdExtra1->setText( tr("Day") ); + cmdExtra1->show(); + cmdExtra2->setText( tr("Date") ); + cmdExtra2->show(); + spinFreq->setValue( 1 ); + lblFreq->setText( tr("month(s)") ); + lblVar2->show(); + showRepeatStuff(); + setupRepeatLabel( 1 ); +} +void OPimRecurrenceWidget::setupYearly() { +hideExtras(); + lblWeekVar->hide(); + spinFreq->setValue( 1 ); + lblFreq->setText( tr("year(s)") ); + lblFreq->show(); + lblFreq->show(); + showRepeatStuff(); + lblVar2->show(); + QString strEvery = strYearTemplate.arg( start.monthName(start.month()) ).arg( numberPlacing(start.day()) ); + lblRepeat->setText( strEvery ); + setupRepeatLabel( 1 ); + +} +void OPimRecurrenceWidget::init() { + QPopupMenu *m1 = new QPopupMenu( this ); + repeatPicker = new DateBookMonth( m1, 0, TRUE ); + m1->insertItem( repeatPicker ); + cmdEnd->setPopup( m1 ); + cmdEnd->setPopupDelay( 0 ); + + QObject::connect( repeatPicker, SIGNAL(dateClicked(int, int, int)), + this, SLOT(endDateChanged(int, int, int)) ); + QObject::connect( qApp, SIGNAL(weekChanged(bool)), + this, SLOT(slotChangeStartOfWeek(bool)) ); + + listRTypeButtons.setAutoDelete( TRUE ); + listRTypeButtons.append( cmdNone ); + listRTypeButtons.append( cmdDay ); + listRTypeButtons.append( cmdWeek ); + listRTypeButtons.append( cmdMonth ); + listRTypeButtons.append( cmdYear ); + + listExtra.setAutoDelete( TRUE ); + listExtra.append( cmdExtra1 ); + listExtra.append( cmdExtra2 ); + listExtra.append( cmdExtra3 ); + listExtra.append( cmdExtra4 ); + listExtra.append( cmdExtra5 ); + listExtra.append( cmdExtra6 ); + listExtra.append( cmdExtra7 ); +} +void OPimRecurrenceWidget::hideExtras() { + // hide the extra buttons... + fraExtra->hide(); + chkNoEnd->hide(); + QListIterator<QToolButton> it( listExtra ); + for ( ; *it; ++it ) { + (*it)->hide(); + (*it)->setOn( FALSE ); + } +} +void OPimRecurrenceWidget::showRepeatStuff() { + cmdEnd->show(); + chkNoEnd->show(); + lblFreq->show(); + lblEvery->show(); + lblFreq->show(); + spinFreq->show(); + lblEnd->show(); + lblRepeat->setText( tr("Every") ); +} + + +static int week( const QDate &start ) +{ + // figure out the week... + int stop = start.day(), + sentinel = start.dayOfWeek(), + dayOfWeek = QDate( start.year(), start.month(), 1 ).dayOfWeek(), + week = 1, + i; + for ( i = 1; i < stop; i++ ) { + if ( dayOfWeek++ == sentinel ) + week++; + if ( dayOfWeek > 7 ) + dayOfWeek = 0; + } + return week; +} + +static QString numberPlacing( int x ) +{ + // I hope this works in other languages besides english... + QString str = QString::number( x ); + switch ( x % 10 ) { + case 1: + str += QWidget::tr( "st" ); + break; + case 2: + str += QWidget::tr( "nd" ); + break; + case 3: + str += QWidget::tr( "rd" ); + break; + default: + str += QWidget::tr( "th" ); + break; + } + return str; +} diff --git a/libopie2/opiepim/ui/opimrecurrencewidget.h b/libopie2/opiepim/ui/opimrecurrencewidget.h new file mode 100644 index 0000000..3f28565 --- a/dev/null +++ b/libopie2/opiepim/ui/opimrecurrencewidget.h @@ -0,0 +1,93 @@ +/* + * GPL and based on the widget from TT + */ + +#ifndef OPIE_PIM_RECURRENCE_WIDGET_H +#define OPIE_PIM_RECURRENCE_WIDGET_H + +#include <opie2/opimrecurrence.h> + +#include <qpe/datebookmonth.h> + +#include <qlist.h> +#include <qtoolbutton.h> +#include <qcheckbox.h> +#include <qdatetime.h> +#include <qbuttongroup.h> + +#include "opimrecurrencebase.h" + +using namespace Opie; + +/** + * A widget to let the user select rules for recurrences. + * This widget can take care of weekly, monthly, daily and yearly recurrence + * It is used inside todolist and datebook. + * + * + * @short Widget of selecting Recurrance + * @author Trolltech, Holger Freyther + * @version 0.9 + */ +class OPimRecurrenceWidget : public OPimRecurrenceBase { + Q_OBJECT +public: + OPimRecurrenceWidget( bool startOnMonday, + const QDate& start, QWidget* parent = 0, + const char* name = 0, bool modal = TRUE, + WFlags fl = 0 ); + OPimRecurrenceWidget( bool startOnMonday, + const OPimRecurrence& rp, const QDate& start, + QWidget* parent = 0, const char* name =0, + bool modal = TRUE, WFlags = 0 ); + ~OPimRecurrenceWidget(); + OPimRecurrence recurrence()const; + QDate endDate()const; + +public slots: + void slotSetRType( int ); + /** + * set the new end date + */ + void endDateChanged( int, int, int ); + /** + * enable/disable end date + */ + void slotNoEnd( bool unused ); + void setStartDate( const QDate& ); + void setRecurrence( const OPimRecurrence& recur, const QDate& start ); + void setRecurrence( const OPimRecurrence& recur ); + +private slots: + void setupRepeatLabel( const QString& ); + void setupRepeatLabel( int ); + void slotWeekLabel(); + void slotMonthLabel( int ); + void slotChangeStartOfWeek( bool onMonday ); + +private: + void setupNone(); + void setupDaily(); + void setupWeekly(); + void setupMonthly(); + void setupYearly(); + + enum repeatButtons { None, Day, Week, Month, Year }; + void init(); + void hideExtras(); + void showRepeatStuff(); + + QList<QToolButton> listRTypeButtons; + QList<QToolButton> listExtra; + QDate start; // only used in one spot... + QDate end; + repeatButtons currInterval; + bool startWeekOnMonday : 1; + DateBookMonth *repeatPicker; + + class Private; + Private *d; + +}; + +#endif diff --git a/libopie2/opiepim/ui/ui.pro b/libopie2/opiepim/ui/ui.pro index db19bca..530bd9f 100644 --- a/libopie2/opiepim/ui/ui.pro +++ b/libopie2/opiepim/ui/ui.pro @@ -1,3 +1,7 @@ -HEADERS += ui/opimmainwindow.h +HEADERS += ui/opimmainwindow.h \ + ui/opimrecurrencewidget.h -SOURCES += ui/opimmainwindow.cpp +SOURCES += ui/opimmainwindow.cpp \ + ui/opimrecurrencewidget.cpp + +INTERFACES += ui/opimrecurrencebase.ui
\ No newline at end of file |