|
| RecurrenceWidget (QWidget *parent=0, const char *name=0) |
|
| ~RecurrenceWidget () |
|
bool | acceptDrops () const |
|
QString | accessibleDescription () const |
|
QString | accessibleName () const |
|
QList< QAction * > | actions () const |
|
void | activateWindow () |
|
void | addAction (QAction *action) |
|
void | addActions (QList< QAction * > actions) |
|
void | adjustSize () |
|
bool | autoFillBackground () const |
|
Qt::BackgroundMode | backgroundMode () const |
|
QPoint | backgroundOffset () const |
|
BackgroundOrigin | backgroundOrigin () const |
|
QPalette::ColorRole | backgroundRole () const |
|
QSize | baseSize () const |
|
bool | blockSignals (bool block) |
|
QString | caption () const |
|
QObject * | child (const char *objName, const char *inheritsClass, bool recursiveSearch) const |
|
QWidget * | childAt (int x, int y, bool includeThis) const |
|
QWidget * | childAt (const QPoint &p, bool includeThis) const |
|
QWidget * | childAt (int x, int y) const |
|
QWidget * | childAt (const QPoint &p) const |
|
const QObjectList & | children () const |
|
QRect | childrenRect () const |
|
QRegion | childrenRegion () const |
|
const char * | className () const |
|
void | clearFocus () |
|
void | clearMask () |
|
bool | close (bool alsoDelete) |
|
bool | close () |
|
int | colorCount () const |
|
QColorGroup | colorGroup () const |
|
bool | connect (const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type) const |
|
void | constPolish () const |
|
QMargins | contentsMargins () const |
|
QRect | contentsRect () const |
|
QCursor | cursor () const |
|
void | deleteLater () |
|
int | depth () const |
|
void | destroyed (QObject *obj) |
|
bool | disconnect (const char *signal, const QObject *receiver, const char *method) |
|
bool | disconnect (const QObject *receiver, const char *method) |
|
void | drawText (const QPoint &p, const QString &s) |
|
void | drawText (int x, int y, const QString &s) |
|
void | dumpObjectInfo () |
|
void | dumpObjectTree () |
|
QList< QByteArray > | dynamicPropertyNames () const |
|
WId | effectiveWinId () const |
|
virtual Q_INVOKABLE QDate | endDate () const |
| Return the date the recurrence is set to end. More...
|
|
virtual Q_INVOKABLE QDateTime | endDateTime () const |
| Return the date and time the recurrence is set to end. More...
|
|
virtual Q_INVOKABLE bool | endDateVisible () const |
|
virtual Q_INVOKABLE QTime | endTime () const |
| Return the time of day the recurrence is set to end. More...
|
|
virtual Q_INVOKABLE bool | endTimeVisible () const |
|
void | ensurePolished () const |
|
void | erase (int x, int y, int w, int h) |
|
void | erase (const QRect &rect) |
|
void | erase (const QRegion &rgn) |
|
void | erase () |
|
virtual bool | eventFilter (QObject *watched, QEvent *event) |
|
T | findChild (const QString &name) const |
|
QList< T > | findChildren (const QString &name) const |
|
QList< T > | findChildren (const QRegExp ®Exp) const |
|
Qt::FocusPolicy | focusPolicy () const |
|
QWidget * | focusProxy () const |
|
QWidget * | focusWidget () const |
|
const QFont & | font () const |
|
QFontInfo | fontInfo () const |
|
QFontMetrics | fontMetrics () const |
|
QPalette::ColorRole | foregroundRole () const |
|
QRect | frameGeometry () const |
|
QSize | frameSize () const |
|
virtual Q_INVOKABLE int | frequency () const |
| Return the frequency (number of periods) the recurrence is set to run. More...
|
|
const QRect & | geometry () const |
|
virtual Q_INVOKABLE
RecurrenceChangePolicy | getChangePolicy () |
|
void | getContentsMargins (int *left, int *top, int *right, int *bottom) const |
|
virtual HDC | getDC () const |
|
void | grabGesture (Qt::GestureType gesture, QFlags< Qt::GestureFlag > flags) |
|
void | grabKeyboard () |
|
void | grabMouse () |
|
void | grabMouse (const QCursor &cursor) |
|
int | grabShortcut (const QKeySequence &key, Qt::ShortcutContext context) |
|
QGraphicsEffect * | graphicsEffect () const |
|
QGraphicsProxyWidget * | graphicsProxyWidget () const |
|
bool | hasEditFocus () const |
|
bool | hasFocus () const |
|
bool | hasMouse () const |
|
bool | hasMouseTracking () const |
|
int | height () const |
|
virtual int | heightForWidth (int w) const |
|
int | heightMM () const |
|
void | hide () |
|
const QPixmap * | icon () const |
|
void | iconify () |
|
QString | iconText () const |
|
bool | inherits (const char *className) const |
|
QInputContext * | inputContext () |
|
Qt::InputMethodHints | inputMethodHints () const |
|
virtual QVariant | inputMethodQuery (Qt::InputMethodQuery query) const |
|
void | insertAction (QAction *before, QAction *action) |
|
void | insertActions (QAction *before, QList< QAction * > actions) |
|
void | insertChild (QObject *object) |
|
void | installEventFilter (QObject *filterObj) |
|
bool | isA (const char *className) const |
|
bool | isActiveWindow () const |
|
bool | isAncestorOf (const QWidget *child) const |
|
bool | isDesktop () const |
|
bool | isDialog () const |
|
bool | isEnabled () const |
|
bool | isEnabledTo (QWidget *ancestor) const |
|
bool | isEnabledToTLW () const |
|
bool | isFullScreen () const |
|
bool | isHidden () const |
|
bool | isInputMethodEnabled () const |
|
bool | isMaximized () const |
|
bool | isMinimized () const |
|
bool | isModal () const |
|
virtual Q_INVOKABLE bool | isRecurring () const |
|
bool | isShown () const |
|
bool | isTopLevel () const |
|
bool | isUpdatesEnabled () const |
|
bool | isVisible () const |
|
bool | isVisibleTo (QWidget *ancestor) const |
|
bool | isVisibleToTLW () const |
|
bool | isWidgetType () const |
|
bool | isWindow () const |
|
bool | isWindowModified () const |
|
void | killTimer (int id) |
|
QLayout * | layout () const |
|
Qt::LayoutDirection | layoutDirection () const |
|
QLocale | locale () const |
|
int | logicalDpiX () const |
|
int | logicalDpiY () const |
|
void | lower () |
|
Qt::HANDLE | macCGHandle () const |
|
Qt::HANDLE | macQDHandle () const |
|
QPoint | mapFrom (QWidget *parent, const QPoint &pos) const |
|
QPoint | mapFromGlobal (const QPoint &pos) const |
|
QPoint | mapFromParent (const QPoint &pos) const |
|
QPoint | mapTo (QWidget *parent, const QPoint &pos) const |
|
QPoint | mapToGlobal (const QPoint &pos) const |
|
QPoint | mapToParent (const QPoint &pos) const |
|
QRegion | mask () const |
|
virtual Q_INVOKABLE int | max () const |
|
int | maximumHeight () const |
|
QSize | maximumSize () const |
|
int | maximumWidth () const |
|
virtual bool | maxVisible () const |
|
virtual const QMetaObject * | metaObject () const |
|
int | minimumHeight () const |
|
QSize | minimumSize () const |
|
virtual QSize | minimumSizeHint () const |
|
int | minimumWidth () const |
|
virtual Q_INVOKABLE
RecurrencePeriod | minPeriod () const |
|
virtual Q_INVOKABLE bool | modified () const |
|
void | move (int x, int y) |
|
void | move (const QPoint &) |
|
void | moveToThread (QThread *targetThread) |
|
const char * | name () const |
|
const char * | name (const char *defaultName) const |
|
QWidget * | nativeParentWidget () const |
|
QWidget * | nextInFocusChain () const |
|
QRect | normalGeometry () const |
|
int | numColors () const |
|
QString | objectName () const |
|
void | overrideWindowFlags (QFlags< Qt::WindowType > flags) |
|
bool | ownCursor () const |
|
bool | ownFont () const |
|
bool | ownPalette () const |
|
virtual QPaintEngine * | paintEngine () const |
|
bool | paintingActive () const |
|
const QPalette & | palette () const |
|
QObject * | parent () const |
|
virtual Q_INVOKABLE int | parentId () const |
|
virtual Q_INVOKABLE QString | parentType () const |
|
QWidget * | parentWidget () const |
|
QWidget * | parentWidget (bool sameWindow) const |
|
virtual Q_INVOKABLE
RecurrencePeriod | period () const |
|
virtual Q_INVOKABLE QString | periodCode () const |
|
int | physicalDpiX () const |
|
int | physicalDpiY () const |
|
QPlatformWindow * | platformWindow () const |
|
QPlatformWindowFormat | platformWindowFormat () const |
|
void | polish () |
|
QPoint | pos () const |
|
QWidget * | previousInFocusChain () const |
|
QVariant | property (const char *name) const |
|
void | raise () |
|
void | recreate (QWidget *parent, QFlags< Qt::WindowType > f, const QPoint &p, bool showIt) |
|
QRect | rect () const |
|
virtual void | releaseDC (HDC hdc) const |
|
void | releaseKeyboard () |
|
void | releaseMouse () |
|
void | releaseShortcut (int id) |
|
void | removeAction (QAction *action) |
|
void | removeChild (QObject *object) |
|
void | removeEventFilter (QObject *obj) |
|
void | render (QPaintDevice *target, const QPoint &targetOffset, const QRegion &sourceRegion, QFlags< QWidget::RenderFlag > renderFlags) |
|
void | render (QPainter *painter, const QPoint &targetOffset, const QRegion &sourceRegion, QFlags< QWidget::RenderFlag > renderFlags) |
|
void | repaint (const QRegion &rgn, bool b) |
|
void | repaint (const QRect &rect) |
|
void | repaint () |
|
void | repaint (int x, int y, int w, int h) |
|
void | repaint (bool b) |
|
void | repaint (const QRegion &rgn) |
|
void | repaint (const QRect &r, bool b) |
|
void | repaint (int x, int y, int w, int h, bool b) |
|
void | reparent (QWidget *parent, const QPoint &p, bool showIt) |
|
void | reparent (QWidget *parent, QFlags< Qt::WindowType > f, const QPoint &p, bool showIt) |
|
void | resize (int w, int h) |
|
void | resize (const QSize &) |
|
bool | restoreGeometry (const QByteArray &geometry) |
|
void | retranslateUi (QWidget *RecurrenceWidget) |
|
void | retranslateUi (QWidget *RecurrenceWidget) |
|
QByteArray | saveGeometry () const |
|
void | scroll (int dx, int dy) |
|
void | scroll (int dx, int dy, const QRect &r) |
|
void | setAcceptDrops (bool on) |
|
void | setAccessibleDescription (const QString &description) |
|
void | setAccessibleName (const QString &name) |
|
void | setActiveWindow () |
|
void | setAttribute (Qt::WidgetAttribute attribute, bool on) |
|
void | setAutoFillBackground (bool enabled) |
|
void | setBackgroundColor (const QColor &color) |
|
void | setBackgroundMode (Qt::BackgroundMode widgetBackground, Qt::BackgroundMode paletteBackground) |
|
void | setBackgroundOrigin (BackgroundOrigin background) |
|
void | setBackgroundPixmap (const QPixmap &pixmap) |
|
void | setBackgroundRole (QPalette::ColorRole role) |
|
void | setBaseSize (const QSize &) |
|
void | setBaseSize (int basew, int baseh) |
|
void | setCaption (const QString &c) |
|
void | setContentsMargins (int left, int top, int right, int bottom) |
|
void | setContentsMargins (const QMargins &margins) |
|
void | setCursor (const QCursor &) |
|
void | setDisabled (bool disable) |
|
void | setEditFocus (bool enable) |
|
void | setEnabled (bool) |
|
void | setEraseColor (const QColor &color) |
|
void | setErasePixmap (const QPixmap &pixmap) |
|
void | setFixedHeight (int h) |
|
void | setFixedSize (const QSize &s) |
|
void | setFixedSize (int w, int h) |
|
void | setFixedWidth (int w) |
|
void | setFocus () |
|
void | setFocus (Qt::FocusReason reason) |
|
void | setFocusPolicy (Qt::FocusPolicy policy) |
|
void | setFocusProxy (QWidget *w) |
|
void | setFont (const QFont &) |
|
void | setFont (const QFont &f, bool b) |
|
void | setForegroundRole (QPalette::ColorRole role) |
|
void | setGeometry (const QRect &) |
|
void | setGeometry (int x, int y, int w, int h) |
|
void | setGraphicsEffect (QGraphicsEffect *effect) |
|
void | setHidden (bool hidden) |
|
void | setIcon (const QPixmap &i) |
|
void | setIconText (const QString &it) |
|
void | setInputContext (QInputContext *context) |
|
void | setInputMethodEnabled (bool enabled) |
|
void | setInputMethodHints (QFlags< Qt::InputMethodHint > hints) |
|
void | setKeyCompression (bool b) |
|
void | setLayout (QLayout *layout) |
|
void | setLayoutDirection (Qt::LayoutDirection direction) |
|
void | setLocale (const QLocale &locale) |
|
void | setMask (const QRegion ®ion) |
|
void | setMask (const QBitmap &bitmap) |
|
void | setMaximumHeight (int maxh) |
|
void | setMaximumSize (int maxw, int maxh) |
|
void | setMaximumSize (const QSize &) |
|
void | setMaximumWidth (int maxw) |
|
void | setMinimumHeight (int minh) |
|
void | setMinimumSize (int minw, int minh) |
|
void | setMinimumSize (const QSize &) |
|
void | setMinimumWidth (int minw) |
|
void | setMouseTracking (bool enable) |
|
void | setName (const char *name) |
|
void | setObjectName (const QString &name) |
|
void | setPalette (const QPalette &) |
|
void | setPalette (const QPalette &p, bool b) |
|
void | setPaletteBackgroundColor (const QColor &color) |
|
void | setPaletteBackgroundPixmap (const QPixmap &pixmap) |
|
void | setPaletteForegroundColor (const QColor &color) |
|
void | setParent (QObject *parent) |
|
void | setParent (QWidget *parent, QFlags< Qt::WindowType > f) |
|
void | setParent (QWidget *parent) |
|
void | setPlatformWindow (QPlatformWindow *window) |
|
void | setPlatformWindowFormat (const QPlatformWindowFormat &format) |
|
bool | setProperty (const char *name, const QVariant &value) |
|
void | setShortcutAutoRepeat (int id, bool enable) |
|
void | setShortcutEnabled (int id, bool enable) |
|
void | setShown (bool shown) |
|
void | setSizeIncrement (const QSize &) |
|
void | setSizeIncrement (int w, int h) |
|
void | setSizePolicy (QSizePolicy::Policy hor, QSizePolicy::Policy ver, bool hfw) |
|
void | setSizePolicy (QSizePolicy) |
|
void | setSizePolicy (QSizePolicy::Policy horizontal, QSizePolicy::Policy vertical) |
|
void | setStatusTip (const QString &) |
|
void | setStyle (QStyle *style) |
|
QStyle * | setStyle (const QString &style) |
|
void | setStyleSheet (const QString &styleSheet) |
|
void | setToolTip (const QString &) |
|
void | setUpdatesEnabled (bool enable) |
|
void | setupUi (QWidget *widget) |
|
void | setupUi (QWidget *RecurrenceWidget) |
|
virtual void | setVisible (bool visible) |
|
void | setWhatsThis (const QString &) |
|
void | setWindowFilePath (const QString &filePath) |
|
void | setWindowFlags (QFlags< Qt::WindowType > type) |
|
void | setWindowIcon (const QIcon &icon) |
|
void | setWindowIconText (const QString &) |
|
void | setWindowModality (Qt::WindowModality windowModality) |
|
void | setWindowModified (bool) |
|
void | setWindowOpacity (qreal level) |
|
void | setWindowRole (const QString &role) |
|
void | setWindowState (QFlags< Qt::WindowState > windowState) |
|
void | setWindowSurface (QWindowSurface *surface) |
|
void | setWindowTitle (const QString &) |
|
void | show () |
|
void | showFullScreen () |
|
void | showMaximized () |
|
void | showMinimized () |
|
void | showNormal () |
|
bool | signalsBlocked () const |
|
QSize | size () const |
|
virtual QSize | sizeHint () const |
|
QSize | sizeIncrement () const |
|
QSizePolicy | sizePolicy () const |
|
void | stackUnder (QWidget *w) |
|
virtual Q_INVOKABLE QDate | startDate () const |
|
virtual Q_INVOKABLE QDateTime | startDateTime () const |
|
virtual bool | startDateVisible () const |
|
virtual Q_INVOKABLE QTime | startTime () const |
|
int | startTimer (int interval) |
|
virtual Q_INVOKABLE bool | startTimeVisible () const |
|
QString | statusTip () const |
|
virtual Q_INVOKABLE
RecurrencePeriod | stringToPeriod (QString p) const |
| Convert a string representation of the period to a RecurrencePeriod. More...
|
|
QStyle * | style () const |
|
QString | styleSheet () const |
|
bool | testAttribute (Qt::WidgetAttribute attribute) const |
|
QThread * | thread () const |
|
QString | toolTip () const |
|
QWidget * | topLevelWidget () const |
|
bool | underMouse () const |
|
void | ungrabGesture (Qt::GestureType gesture) |
|
void | unsetCursor () |
|
void | unsetFont () |
|
void | unsetLayoutDirection () |
|
void | unsetLocale () |
|
void | unsetPalette () |
|
void | update () |
|
void | update (int x, int y, int w, int h) |
|
void | update (const QRect &rect) |
|
void | update (const QRegion &rgn) |
|
void | updateGeometry () |
|
bool | updatesEnabled () const |
|
QRect | visibleRect () const |
|
QRegion | visibleRegion () const |
|
QString | whatsThis () const |
|
int | width () const |
|
int | widthMM () const |
|
QWidget * | window () const |
|
QString | windowFilePath () const |
|
Qt::WindowFlags | windowFlags () const |
|
QIcon | windowIcon () const |
|
QString | windowIconText () const |
|
Qt::WindowModality | windowModality () const |
|
qreal | windowOpacity () const |
|
QString | windowRole () const |
|
Qt::WindowStates | windowState () const |
|
QWindowSurface * | windowSurface () const |
|
QString | windowTitle () const |
|
Qt::WindowType | windowType () const |
|
WId | winId () const |
|
int | x () const |
|
int | x11Cells () const |
|
Qt::HANDLE | x11Colormap () const |
|
bool | x11DefaultColormap () const |
|
bool | x11DefaultVisual () const |
|
int | x11Depth () const |
|
Display * | x11Display () const |
|
const QX11Info & | x11Info () const |
|
Qt::HANDLE | x11PictureHandle () const |
|
int | x11Screen () const |
|
void * | x11Visual () const |
|
int | y () const |
|
The RecurrenceWidget gives the user a unified interface for telling the system how often certain events occur.
In general recurrences are stored in the recur table, but this is not required. Two basic values describe a recurrence:
-
The period is the time unit of measure (hour, day, month).
-
The frequency is the number of periods between recurrences.
A recurrence with the period set to W (= week) and frequency of 3 will repeat once every three weeks.
To add a new kind of recurring event or item, you need to change data in the database, stored procedures, triggers, and application code. We'll use Invoice in the examples here, with 'I' as the internal code value, even though invoices already use this mechanism (xTuple ERP 3.5.1 and later).
Add a column to the parent table to track the recurrence parent/child relationship. The column name must follow this pattern:
[tablename]_recurring_[tablename]_id , e.g. invchead_recurring_invchead_id
:
ALTER TABLE invchead ADD COLUMN invchead_recurring_invchead_id INTEGER;
COMMENT ON COLUMN invchead.invchead_recurring_invchead_id IS 'The first invchead record in the series if this is a recurring Invoice. If the invchead_recurring_invchead_id is the same as the invchead_id, this record is the first in the series.';
Add a RecurrenceWidget to the .ui for the window that will maintain data of this type (e.g. invoice.ui).
Initialize the widget in the window's constructor:
_recur->setParent(-1, 'I');
Update the widget again when the window gets an id for the object. This usually happens in either the set(), save(), or sSave() method for new objects, depending on the class, and in populate() when editing existing objects:
_recur->setParent(_invcheadid, 'I');
...
_recur->setParent(q.value("invchead_recurring_invchead_id").toInt(), "I");
Ask the user how to handle existing recurrences before saving the data and before starting a transaction. getChangePolicy will return RecurrenceWidget::NoPolicy) if the user chooses to cancel. Then when preparing to insert or update the main record, make sure to set the recurrence parentage. Finally, after the insert/update, save the recurrence and check for errors:
{
RecurrenceWidget::ChangePolicy cp = _recur->getChangePolicy();
return false;
XSqlQuery beginq("BEGIN;");
XSqlQuery qry;
...
if (_recur->isRecurring())
qry.bindValue(":invchead_recurring_invchead_id", _recur->parentId());
...
...
if (! _recur->save(true, cp, &errmsg))
{
rollbackq.exec();
systemError(this, errmsg, __FILE__, __LINE__);
return false;
}
...
XSqlQuery commitq("COMMIT;");
return true;
}
To maintain the recurrence relationships, there must be a function that copies an existing record based on its id and gives the copy a different timestamp or date. It must have a function signature like one of these:
-
copy[tablename](INTEGER, TIMESTAMP WITH TIME ZONE)
-
copy[tablename](INTEGER, TIMESTAMP WITHOUT TIME ZONE)
-
copy[tablename](INTEGER, DATE)
The copy function can take additional arguments as well, but they will be ignored by the recurrence maintenance functions. The data type of each argument must be listed in the recurtype table's recurtype_copyargs column (see below) so the appropriate casting can be done for the date or timestamp and an appropriate number of NULL arguments can be passed. The copy function must copy the
[tablename]_recurring_[tablename]_id column.
There can be a function to delete records of this type as well. If there is one, it must accept a single integer id of the record to delete.
Add a row to the recurtype table to describe how the recurrence stored procedures interact with the events/items of this type ('I' == Invoice).
INSERT INTO recurtype (recurtype_type, recurtype_table, recurtype_donecheck,
recurtype_schedcol, recurtype_limit,
recurtype_copyfunc, recurtype_copyargs, recurtype_delfunc
) VALUES ('I', 'invchead', 'invchead_posted',
'invchead_invcdate', NULL,
'copyinvoice', '{integer,date}', 'deleteinvoice');
If there isn't a delete function, set the recurtype_delfunc to NULL. Existing records will be deleted when necessary with an SQL DELETE statement.
The DELETE trigger on the table should clean up the recurrence information:
CREATE OR REPLACE FUNCTION _invcheadBeforeTrigger() RETURNS "trigger" AS $$
DECLARE
_recurid INTEGER;
_newparentid INTEGER;
BEGIN
IF (TG_OP = 'DELETE') THEN
-- after other stuff not having to do with recurrence
SELECT recur_id INTO _recurid
FROM recur
WHERE ((recur_parent_id=OLD.invchead_id)
AND (recur_parent_type='I'));
IF (_recurid IS NOT NULL) THEN
SELECT invchead_id INTO _newparentid
FROM invchead
WHERE ((invchead_recurring_invchead_id=OLD.invchead_id)
AND (invchead_id!=OLD.invchead_id))
ORDER BY invchead_invcdate
LIMIT 1;
IF (_newparentid IS NULL) THEN
DELETE FROM recur WHERE recur_id=_recurid;
ELSE
UPDATE recur SET recur_parent_id=_newparentid
WHERE recur_id=_recurid;
UPDATE invchead SET invchead_recurring_invchead_id=_newparentid
WHERE invchead_recurring_invchead_id=OLD.invchead_id
AND invchead_id!=OLD.invchead_id;
END IF;
END IF;
RETURN OLD;
END IF;
RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';
- Todo:
- Simplify this so the developer of a new recurring item/event doesn't have to work so hard. There should be a way to (1) have the recurrence widget update the [tablename]_recurring_[tablename]_id column when saving the recurrence (this would save a couple of lines) and (2) there should be a way to simplify or eliminate the code in the DELETE triggers. Some of this stuff really belongs in an AFTER trigger instead of a before trigger.
- See also
- _invcheadBeforeTrigger
-
copyInvoice
-
createRecurringItems
-
deleteInvoice
-
deleteOpenRecurringItems
-
invoice
-
openRecurringItems
-
recur
-
recurtype
-
splitRecurrence