From f84a46fce6c1b7702ec1eaebd40e363b67253649 Mon Sep 17 00:00:00 2001
From: drw <drw>
Date: Wed, 25 Feb 2004 16:28:34 +0000
Subject: Added OPimRecurrenceBase & OPimRecurrenceWidget to libopiepim2

---
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 &amp; )</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
--
cgit v0.9.0.2