summaryrefslogtreecommitdiffstats
path: root/kplato/kptcalendarlistdialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kplato/kptcalendarlistdialog.cpp')
-rw-r--r--kplato/kptcalendarlistdialog.cpp433
1 files changed, 433 insertions, 0 deletions
diff --git a/kplato/kptcalendarlistdialog.cpp b/kplato/kptcalendarlistdialog.cpp
new file mode 100644
index 00000000..496cc786
--- /dev/null
+++ b/kplato/kptcalendarlistdialog.cpp
@@ -0,0 +1,433 @@
+/* This file is part of the KDE project
+ Copyright (C) 2004 - 2005 Dag Andersen <[email protected]>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation;
+ version 2 of the License.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public License
+ along with this library; see the file COPYING.LIB. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+*/
+
+#include "kptcalendarlistdialog.h"
+#include "kptproject.h"
+#include "kptcalendar.h"
+#include "kptcommand.h"
+#include "kptpart.h"
+
+#include <tqpushbutton.h>
+#include <tqcombobox.h>
+#include <tqheader.h>
+#include <tqlabel.h>
+#include <tqtextedit.h>
+#include <tqlineedit.h>
+#include <tqdatetimeedit.h>
+#include <tqdatetime.h>
+#include <tqtabwidget.h>
+#include <tqtextbrowser.h>
+
+#include <tdelocale.h>
+
+#include <tdeabc/addressee.h>
+#include <tdeabc/addresseedialog.h>
+
+#include <kdebug.h>
+
+namespace KPlato
+{
+
+class CalendarListViewItem : public TDEListViewItem
+{
+public:
+ CalendarListViewItem(CalendarListDialogImpl &pan, TQListView *lv, Calendar *cal, Calendar *orig=0)
+ : TDEListViewItem(lv, cal->name()), panel(pan) {
+
+ calendar = cal;
+ original = orig;
+ state = None;
+ base = 0;
+ setRenameEnabled(0, false);
+ }
+ ~CalendarListViewItem() {
+ delete calendar;
+ }
+
+ enum State { None=0, New=1, Modified=2, Deleted=4 };
+
+ void setState(State s) { state |= s; }
+
+ Calendar *baseCalendar() {
+ if (state & Deleted) return 0;
+ return original ? original : calendar;
+ }
+ bool hasBaseCalendar(CalendarListViewItem *item) {
+ if (!base) return false;
+ return base == item || base->hasBaseCalendar(item);
+ }
+ KMacroCommand *buildCommand(Part *part, Project &p) {
+ KMacroCommand *macro=0;
+ if (state & New) {
+ if (macro == 0) macro = new KMacroCommand("");
+ //kdDebug()<<k_funcinfo<<"add: "<<calendar->name()<<" p="<<&p<<endl;
+ base ? calendar->setParent(base->baseCalendar()) : calendar->setParent(0);
+ macro->addCommand(new CalendarAddCmd(part, &p, calendar));
+ calendar = 0;
+ } else if (state & Modified) {
+ //kdDebug()<<k_funcinfo<<"modified: "<<calendar->name()<<endl;
+ if (original->name() != calendar->name()) {
+ if (macro == 0) macro = new KMacroCommand("");
+ macro->addCommand(new CalendarModifyNameCmd(part, original, calendar->name()));
+ }
+ Calendar *c = base ? base->baseCalendar() : 0;
+ if (c != original->parent()) {
+ if (macro == 0) macro = new KMacroCommand("");
+ macro->addCommand(new CalendarModifyParentCmd(part, original, c));
+ //kdDebug()<<k_funcinfo<<"Base modified: "<<c->name()<<endl;
+ }
+
+ //kdDebug()<<k_funcinfo<<"Check for days deleted: "<<calendar->name()<<endl;
+ TQPtrListIterator<CalendarDay> oit = original->days();
+ for (; oit.current(); ++oit) {
+ if (calendar->findDay(oit.current()->date()) == 0) {
+ if (macro == 0) macro = new KMacroCommand("");
+ macro->addCommand(new CalendarRemoveDayCmd(part, original, oit.current()->date()));
+ //kdDebug()<<k_funcinfo<<"Removed day"<<endl;
+ }
+ }
+
+ //kdDebug()<<k_funcinfo<<"Check for days added or modified: "<<calendar->name()<<endl;
+ TQPtrListIterator<CalendarDay> cit = calendar->days();
+ for (; cit.current(); ++cit) {
+ CalendarDay *day = original->findDay(cit.current()->date());
+ if (day == 0) {
+ if (macro == 0) macro = new KMacroCommand("");
+ // added
+ //kdDebug()<<k_funcinfo<<"Added day"<<endl;
+ macro->addCommand(new CalendarAddDayCmd(part, original, new CalendarDay(cit.current())));
+ } else if (*day != cit.current()) {
+ if (macro == 0) macro = new KMacroCommand("");
+ // modified
+ //kdDebug()<<k_funcinfo<<"Modified day"<<endl;
+ macro->addCommand(new CalendarModifyDayCmd(part, original, new CalendarDay(cit.current())));
+ }
+ }
+ //kdDebug()<<k_funcinfo<<"Check for weekdays modified: "<<calendar->name()<<endl;
+ CalendarDay *day = 0, *org = 0;
+ for (int i=0; i < 7; ++i) {
+ day = calendar->weekdays()->weekday(i);
+ org = original->weekdays()->weekday(i);
+ if (day && org) {
+ if (*org != *day) {
+ if (macro == 0) macro = new KMacroCommand("");
+ //kdDebug()<<k_funcinfo<<"Weekday["<<i<<"] modified"<<endl;
+ macro->addCommand(new CalendarModifyWeekdayCmd(part, original, i, new CalendarDay(day)));
+ }
+ } else if (day) {
+ // shouldn't happen: hmmm, add day to original??
+ kdError()<<k_funcinfo<<"Should always have 7 weekdays"<<endl;
+ } else if (org) {
+ // shouldn't happen: set org to default??
+ kdError()<<k_funcinfo<<"Should always have 7 weekdays"<<endl;
+ }
+ }
+ }
+ return macro;
+ }
+
+ Calendar *calendar;
+ Calendar *original;
+ CalendarListViewItem* base;
+ CalendarListDialogImpl &panel;
+ TQString oldText;
+
+protected:
+ virtual void cancelRename(int col) {
+ //kdDebug()<<k_funcinfo<<endl;
+ if (col == 0 && oldText.isEmpty()) {
+ return;
+ }
+ panel.renameStopped(this);
+ TDEListViewItem::cancelRename(col);
+ setRenameEnabled(col, false);
+ }
+private:
+ int state;
+};
+
+//----------------------------------------------------
+CalendarListDialog::CalendarListDialog(Project &p, TQWidget *parent, const char *name)
+ : KDialogBase( Swallow, i18n("Calendar's Settings"), Ok|Cancel, Ok, parent, name, true, true),
+ project(p)
+{
+ //kdDebug()<<k_funcinfo<<&p<<endl;
+ dia = new CalendarListDialogImpl(p, this);
+ TQPtrList<Calendar> list = p.calendars();
+ TQPtrListIterator<Calendar> it = list;
+ for (; it.current(); ++it) {
+ Calendar *c = new Calendar(it.current());
+ //c->setProject(&p);
+ new CalendarListViewItem(*dia, dia->calendarList, c, it.current());
+ }
+ dia->setBaseCalendars();
+
+ TQListViewItem *f = dia->calendarList->firstChild();
+ if (f) {
+ dia->calendarList->setSelected(f, true);
+ }
+ //kdDebug()<<"size="<<size().width()<<"x"<<size().height()<<" hint="<<sizeHint().width()<<"x"<<sizeHint().height()<<endl;
+ resize(TQSize(725, 388).expandedTo(minimumSizeHint()));
+
+ setMainWidget(dia);
+ enableButtonOK(false);
+
+ connect(dia, TQT_SIGNAL(enableButtonOk(bool)), TQT_SLOT(enableButtonOK(bool)));
+}
+
+KCommand *CalendarListDialog::buildCommand(Part *part) {
+ //kdDebug()<<k_funcinfo<<endl;
+ KMacroCommand *cmd = 0;
+ TQListViewItemIterator cit(dia->calendarList);
+ for (;cit.current(); ++cit) {
+ CalendarListViewItem *item = dynamic_cast<CalendarListViewItem *>(cit.current());
+ if (item) {
+ KMacroCommand *c = item->buildCommand(part, project);
+ if (c != 0) {
+ if (cmd == 0) cmd = new KMacroCommand("");
+ cmd->addCommand(c);
+ }
+ }
+ }
+ TQPtrListIterator<CalendarListViewItem> it = dia->deletedItems();
+ for (; it.current(); ++it) {
+ //kdDebug()<<k_funcinfo<<"deleted: "<<it.current()->calendar->name()<<endl;
+ if (it.current()->original) {
+ if (cmd == 0) cmd = new KMacroCommand("");
+ cmd->addCommand(new CalendarDeleteCmd(part, it.current()->original));
+ }
+ }
+ if (cmd) {
+ cmd->setName(i18n("Modify Calendars"));
+ }
+ return cmd;
+}
+
+void CalendarListDialog::slotOk() {
+ accept();
+}
+
+//--------------------------------------------------
+CalendarListDialogImpl::CalendarListDialogImpl (Project &p, TQWidget *parent)
+ : CalendarListDialogBase(parent),
+ project(p),
+ m_renameItem(0) {
+
+ calendarList->header()->setStretchEnabled(true, 0);
+ calendarList->setShowSortIndicator(true);
+ calendarList->setSorting(0);
+ calendarList->setDefaultRenameAction(TQListView::Accept);
+
+ m_deletedItems.setAutoDelete(true);
+ calendar->setEnabled(false);
+
+ slotSelectionChanged();
+
+ connect(calendar, TQT_SIGNAL(obligatedFieldsFilled(bool)), TQT_SLOT(slotEnableButtonOk(bool)));
+ connect(calendar, TQT_SIGNAL(applyClicked()), TQT_SLOT(slotCalendarModified()));
+
+ connect(bDelete, TQT_SIGNAL(clicked()), TQT_SLOT(slotDeleteClicked()));
+ connect(bAdd, TQT_SIGNAL(clicked()), TQT_SLOT(slotAddClicked()));
+ //connect(editName, TQT_SIGNAL(returnPressed()), TQT_SLOT(slotAddClicked()));
+
+ connect(calendarList, TQT_SIGNAL(selectionChanged()), TQT_SLOT(slotSelectionChanged()));
+ connect(calendarList, TQT_SIGNAL(doubleClicked(TQListViewItem*, const TQPoint&, int)), TQT_SLOT(slotListDoubleClicked(TQListViewItem*, const TQPoint&, int)));
+ connect(calendarList, TQT_SIGNAL(itemRenamed(TQListViewItem*, int)), TQT_SLOT(slotItemRenamed(TQListViewItem*, int)));
+
+ connect (baseCalendar, TQT_SIGNAL(activated(int)), TQT_SLOT(slotBaseCalendarActivated(int)));
+
+ // Internal rename stuff
+ connect(this, TQT_SIGNAL(renameStarted(TQListViewItem*, int)), TQT_SLOT(slotRenameStarted(TQListViewItem*, int)));
+ connect(this, TQT_SIGNAL(startRename(TQListViewItem*, int)), TQT_SLOT(slotStartRename(TQListViewItem*, int)));
+ connect(this, TQT_SIGNAL(selectionChanged()), TQT_SLOT(slotSelectionChanged()));
+}
+
+void CalendarListDialogImpl::setBaseCalendars() {
+ TQListViewItemIterator it(calendarList);
+ for (;it.current(); ++it) {
+ CalendarListViewItem *item = dynamic_cast<CalendarListViewItem *>(it.current());
+ if (item) {
+ item->base = findItem(item->calendar->parent());
+ }
+ }
+}
+
+void CalendarListDialogImpl::slotEnableButtonOk(bool on) {
+ emit enableButtonOk(on);
+}
+
+void CalendarListDialogImpl::slotBaseCalendarActivated(int id) {
+ CalendarListViewItem *item = dynamic_cast<CalendarListViewItem*>(calendarList->selectedItem());
+ if (item) {
+ item->base = baseCalendarList.at(id);
+ item->setState(CalendarListViewItem::Modified);
+ slotEnableButtonOk(true);
+ } else {
+ kdError()<<k_funcinfo<<"No CalendarListViewItem"<<endl;
+ }
+}
+
+void CalendarListDialogImpl::slotSelectionChanged() {
+ //kdDebug()<<k_funcinfo<<endl;
+ TQListViewItem *item = calendarList->selectedItem();
+ bDelete->setEnabled((bool)item);
+ bAdd->setEnabled(true);
+ slotSelectionChanged(item);
+}
+
+void CalendarListDialogImpl::slotSelectionChanged(TQListViewItem *listItem) {
+ //kdDebug()<<k_funcinfo<<endl;
+ baseCalendarList.clear();
+ baseCalendar->clear();
+ baseCalendar->setEnabled(false);
+ CalendarListViewItem *cal = dynamic_cast<CalendarListViewItem *>(listItem);
+ if (cal) {
+ setCalendar(cal->calendar);
+ baseCalendar->insertItem(i18n("None"));
+ baseCalendarList.append(0);
+ int me = 0, i = 0;
+ TQListViewItemIterator it(calendarList);
+ for (; it.current(); ++it) {
+ CalendarListViewItem *item = dynamic_cast<CalendarListViewItem*>(it.current());
+ if (item && cal != item && !item->hasBaseCalendar(cal)) {
+ baseCalendar->insertItem(item->text(0));
+ baseCalendarList.append(item);
+ i++;
+ if (item == cal->base) {
+ me = i;
+ //kdDebug()<<k_funcinfo<<"item="<<item<<": cal="<<cal->calendar->name()<<" has parent "<<cal->base->calendar->name()<<endl;
+ }
+ }
+ }
+ baseCalendar->setCurrentItem(me);
+ baseCalendar->setEnabled(true);
+ return;
+ }
+ calendar->clear();
+}
+void CalendarListDialogImpl::setCalendar(Calendar *cal) {
+ calendar->setCalendar(cal);
+ calendar->setEnabled(true);
+}
+
+void CalendarListDialogImpl::slotCalendarModified() {
+ CalendarListViewItem *item = dynamic_cast<CalendarListViewItem*>(calendarList->currentItem());
+ if (item) {
+ item->setState(CalendarListViewItem::Modified);
+ //kdDebug()<<k_funcinfo<<"("<<item->calendar<<")"<<endl;
+ }
+ emit calendarModified();
+}
+
+void CalendarListDialogImpl::slotDeleteClicked() {
+ CalendarListViewItem *item = static_cast<CalendarListViewItem*>(calendarList->selectedItem());
+ if (item) {
+ calendarList->takeItem(item);
+ item->setState(CalendarListViewItem::Deleted);
+ m_deletedItems.append(item);
+
+ emit enableButtonOk(true);
+ }
+}
+
+void CalendarListDialogImpl::slotAddClicked() {
+ Calendar *cal = new Calendar();
+ cal->setProject(&project);
+ CalendarListViewItem *item = new CalendarListViewItem(*this, calendarList, cal);
+ item->setState(CalendarListViewItem::New);
+
+ slotListDoubleClicked(item, TQPoint(), 0);
+
+}
+
+TQPtrList<CalendarListViewItem> &CalendarListDialogImpl::deletedItems() {
+ return m_deletedItems;
+}
+
+CalendarListViewItem *CalendarListDialogImpl::findItem(Calendar *cal) {
+ if (!cal)
+ return 0;
+ TQListViewItemIterator it(calendarList);
+ for (;it.current(); ++it) {
+ CalendarListViewItem *item = dynamic_cast<CalendarListViewItem *>(it.current());
+ if (item && (cal == item->original || cal == item->calendar)) {
+ //kdDebug()<<k_funcinfo<<"Found: "<<cal->name()<<endl;
+ return item;
+ }
+ }
+ return 0;
+}
+
+void CalendarListDialogImpl::slotItemRenamed(TQListViewItem *itm, int col) {
+ //kdDebug()<<k_funcinfo<<itm->text(0)<<endl;
+ itm->setRenameEnabled(col, false);
+ m_renameItem = 0;
+ CalendarListViewItem *item = static_cast<CalendarListViewItem*>(itm);
+ if (item->text(0).isEmpty()) {
+ item->setText(0, item->oldText); // keep the old name
+ }
+ if (item->text(0).isEmpty()) {
+ // Not allowed
+ //kdDebug()<<k_funcinfo<<"name empty"<<endl;
+ emit startRename(item, 0);
+ return;
+ }
+ if (item->text(0) != item->oldText) {
+ item->setState(CalendarListViewItem::Modified);
+ item->calendar->setName(item->text(0));
+ }
+ renameStopped(item);
+ slotEnableButtonOk(true);
+}
+
+// We don't get notified when rename is cancelled, this is called from the item
+void CalendarListDialogImpl::renameStopped(TQListViewItem */*item*/) {
+ //kdDebug()<<k_funcinfo<<(item?item->text(0):"")<<endl;
+ m_renameItem = 0;
+ emit selectionChanged();
+}
+
+void CalendarListDialogImpl::slotListDoubleClicked(TQListViewItem *item, const TQPoint&, int col) {
+ //kdDebug()<<k_funcinfo<<(item?item->text(0):"")<<endl;
+ if (m_renameItem)
+ return;
+ slotStartRename(item, col);
+}
+
+void CalendarListDialogImpl::slotRenameStarted(TQListViewItem */*item*/, int /*col*/) {
+ //kdDebug()<<k_funcinfo<<(item?item->text(0):"")<<endl;
+ if (calendarList->isRenaming()) {
+ bDelete->setEnabled(false);
+ bAdd->setEnabled(false);
+ }
+}
+
+void CalendarListDialogImpl::slotStartRename(TQListViewItem *item, int col) {
+ //kdDebug()<<k_funcinfo<<(item?item->text(0):"")<<endl;
+ static_cast<CalendarListViewItem*>(item)->oldText = item->text(col);
+ item->setRenameEnabled(col, true);
+ item->startRename(col);
+ m_renameItem = item;
+
+ emit renameStarted(item, col);
+}
+
+} //KPlato namespace
+
+#include "kptcalendarlistdialog.moc"