20#include "kptcalendarlistdialog.h"
21#include "kptproject.h"
22#include "kptcalendar.h"
23#include "kptcommand.h"
26#include <tqpushbutton.h>
27#include <tqcombobox.h>
30#include <tqtextedit.h>
31#include <tqlineedit.h>
32#include <tqdatetimeedit.h>
33#include <tqdatetime.h>
34#include <tqtabwidget.h>
35#include <tqtextbrowser.h>
39#include <tdeabc/addressee.h>
40#include <tdeabc/addresseedialog.h>
47class CalendarListViewItem :
public TDEListViewItem
50 CalendarListViewItem(CalendarListDialogImpl &pan, TQListView *lv, Calendar *cal, Calendar *orig=0)
51 : TDEListViewItem(lv, cal->name()), panel(pan) {
57 setRenameEnabled(0,
false);
59 ~CalendarListViewItem() {
63 enum State { None=0, New=1, Modified=2, Deleted=4 };
65 void setState(State s) { state |= s; }
67 Calendar *baseCalendar() {
68 if (state & Deleted)
return 0;
69 return original ? original : calendar;
71 bool hasBaseCalendar(CalendarListViewItem *item) {
72 if (!base)
return false;
73 return base == item || base->hasBaseCalendar(item);
75 KMacroCommand *buildCommand(Part *part, Project &p) {
76 KMacroCommand *macro=0;
78 if (macro == 0) macro =
new KMacroCommand(
"");
80 base ? calendar->setParent(base->baseCalendar()) : calendar->setParent(0);
81 macro->addCommand(
new CalendarAddCmd(part, &p, calendar));
83 }
else if (state & Modified) {
85 if (original->name() != calendar->name()) {
86 if (macro == 0) macro =
new KMacroCommand(
"");
87 macro->addCommand(
new CalendarModifyNameCmd(part, original, calendar->name()));
89 Calendar *c = base ? base->baseCalendar() : 0;
90 if (c != original->parent()) {
91 if (macro == 0) macro =
new KMacroCommand(
"");
92 macro->addCommand(
new CalendarModifyParentCmd(part, original, c));
97 TQPtrListIterator<CalendarDay> oit = original->days();
98 for (; oit.current(); ++oit) {
99 if (calendar->findDay(oit.current()->date()) == 0) {
100 if (macro == 0) macro =
new KMacroCommand(
"");
101 macro->addCommand(
new CalendarRemoveDayCmd(part, original, oit.current()->date()));
107 TQPtrListIterator<CalendarDay> cit = calendar->days();
108 for (; cit.current(); ++cit) {
109 CalendarDay *day = original->findDay(cit.current()->date());
111 if (macro == 0) macro =
new KMacroCommand(
"");
114 macro->addCommand(
new CalendarAddDayCmd(part, original,
new CalendarDay(cit.current())));
115 }
else if (*day != cit.current()) {
116 if (macro == 0) macro =
new KMacroCommand(
"");
119 macro->addCommand(
new CalendarModifyDayCmd(part, original,
new CalendarDay(cit.current())));
123 CalendarDay *day = 0, *org = 0;
124 for (
int i=0; i < 7; ++i) {
125 day = calendar->weekdays()->weekday(i);
126 org = original->weekdays()->weekday(i);
129 if (macro == 0) macro =
new KMacroCommand(
"");
131 macro->addCommand(
new CalendarModifyWeekdayCmd(part, original, i,
new CalendarDay(day)));
135 kdError()<<k_funcinfo<<
"Should always have 7 weekdays"<<endl;
138 kdError()<<k_funcinfo<<
"Should always have 7 weekdays"<<endl;
147 CalendarListViewItem* base;
148 CalendarListDialogImpl &panel;
152 virtual void cancelRename(
int col) {
154 if (col == 0 && oldText.isEmpty()) {
157 panel.renameStopped(
this);
158 TDEListViewItem::cancelRename(col);
159 setRenameEnabled(col,
false);
166CalendarListDialog::CalendarListDialog(
Project &p, TQWidget *parent,
const char *name)
167 : KDialogBase( Swallow, i18n(
"Calendar's Settings"), Ok|Cancel, Ok, parent, name, true, true),
171 dia =
new CalendarListDialogImpl(p,
this);
172 TQPtrList<Calendar> list = p.calendars();
173 TQPtrListIterator<Calendar> it = list;
174 for (; it.current(); ++it) {
175 Calendar *c =
new Calendar(it.current());
177 new CalendarListViewItem(*dia, dia->calendarList, c, it.current());
179 dia->setBaseCalendars();
181 TQListViewItem *f = dia->calendarList->firstChild();
183 dia->calendarList->setSelected(f,
true);
186 resize(TQSize(725, 388).expandedTo(minimumSizeHint()));
189 enableButtonOK(
false);
191 connect(dia, TQ_SIGNAL(enableButtonOk(
bool)), TQ_SLOT(enableButtonOK(
bool)));
194KCommand *CalendarListDialog::buildCommand(Part *part) {
196 KMacroCommand *cmd = 0;
197 TQListViewItemIterator cit(dia->calendarList);
198 for (;cit.current(); ++cit) {
199 CalendarListViewItem *item =
dynamic_cast<CalendarListViewItem *
>(cit.current());
201 KMacroCommand *c = item->buildCommand(part, project);
203 if (cmd == 0) cmd =
new KMacroCommand(
"");
208 TQPtrListIterator<CalendarListViewItem> it = dia->deletedItems();
209 for (; it.current(); ++it) {
211 if (it.current()->original) {
212 if (cmd == 0) cmd =
new KMacroCommand(
"");
213 cmd->addCommand(
new CalendarDeleteCmd(part, it.current()->original));
217 cmd->setName(i18n(
"Modify Calendars"));
222void CalendarListDialog::slotOk() {
227CalendarListDialogImpl::CalendarListDialogImpl (Project &p, TQWidget *parent)
228 : CalendarListDialogBase(parent),
232 calendarList->header()->setStretchEnabled(
true, 0);
233 calendarList->setShowSortIndicator(
true);
234 calendarList->setSorting(0);
235 calendarList->setDefaultRenameAction(TQListView::Accept);
237 m_deletedItems.setAutoDelete(
true);
238 calendar->setEnabled(
false);
240 slotSelectionChanged();
242 connect(calendar, TQ_SIGNAL(obligatedFieldsFilled(
bool)), TQ_SLOT(slotEnableButtonOk(
bool)));
243 connect(calendar, TQ_SIGNAL(applyClicked()), TQ_SLOT(slotCalendarModified()));
245 connect(bDelete, TQ_SIGNAL(clicked()), TQ_SLOT(slotDeleteClicked()));
246 connect(bAdd, TQ_SIGNAL(clicked()), TQ_SLOT(slotAddClicked()));
249 connect(calendarList, TQ_SIGNAL(selectionChanged()), TQ_SLOT(slotSelectionChanged()));
250 connect(calendarList, TQ_SIGNAL(doubleClicked(TQListViewItem*,
const TQPoint&,
int)), TQ_SLOT(slotListDoubleClicked(TQListViewItem*,
const TQPoint&,
int)));
251 connect(calendarList, TQ_SIGNAL(itemRenamed(TQListViewItem*,
int)), TQ_SLOT(slotItemRenamed(TQListViewItem*,
int)));
253 connect (baseCalendar, TQ_SIGNAL(activated(
int)), TQ_SLOT(slotBaseCalendarActivated(
int)));
256 connect(
this, TQ_SIGNAL(renameStarted(TQListViewItem*,
int)), TQ_SLOT(slotRenameStarted(TQListViewItem*,
int)));
257 connect(
this, TQ_SIGNAL(startRename(TQListViewItem*,
int)), TQ_SLOT(slotStartRename(TQListViewItem*,
int)));
258 connect(
this, TQ_SIGNAL(selectionChanged()), TQ_SLOT(slotSelectionChanged()));
261void CalendarListDialogImpl::setBaseCalendars() {
262 TQListViewItemIterator it(calendarList);
263 for (;it.current(); ++it) {
264 CalendarListViewItem *item =
dynamic_cast<CalendarListViewItem *
>(it.current());
266 item->base = findItem(item->calendar->parent());
271void CalendarListDialogImpl::slotEnableButtonOk(
bool on) {
272 emit enableButtonOk(on);
275void CalendarListDialogImpl::slotBaseCalendarActivated(
int id) {
276 CalendarListViewItem *item =
dynamic_cast<CalendarListViewItem*
>(calendarList->selectedItem());
278 item->base = baseCalendarList.at(
id);
279 item->setState(CalendarListViewItem::Modified);
280 slotEnableButtonOk(
true);
282 kdError()<<k_funcinfo<<
"No CalendarListViewItem"<<endl;
286void CalendarListDialogImpl::slotSelectionChanged() {
288 TQListViewItem *item = calendarList->selectedItem();
289 bDelete->setEnabled((
bool)item);
290 bAdd->setEnabled(
true);
291 slotSelectionChanged(item);
294void CalendarListDialogImpl::slotSelectionChanged(TQListViewItem *listItem) {
296 baseCalendarList.clear();
297 baseCalendar->clear();
298 baseCalendar->setEnabled(
false);
299 CalendarListViewItem *cal =
dynamic_cast<CalendarListViewItem *
>(listItem);
301 setCalendar(cal->calendar);
302 baseCalendar->insertItem(i18n(
"None"));
303 baseCalendarList.append(0);
305 TQListViewItemIterator it(calendarList);
306 for (; it.current(); ++it) {
307 CalendarListViewItem *item =
dynamic_cast<CalendarListViewItem*
>(it.current());
308 if (item && cal != item && !item->hasBaseCalendar(cal)) {
309 baseCalendar->insertItem(item->text(0));
310 baseCalendarList.append(item);
312 if (item == cal->base) {
318 baseCalendar->setCurrentItem(me);
319 baseCalendar->setEnabled(
true);
324void CalendarListDialogImpl::setCalendar(Calendar *cal) {
325 calendar->setCalendar(cal);
326 calendar->setEnabled(
true);
329void CalendarListDialogImpl::slotCalendarModified() {
330 CalendarListViewItem *item =
dynamic_cast<CalendarListViewItem*
>(calendarList->currentItem());
332 item->setState(CalendarListViewItem::Modified);
335 emit calendarModified();
338void CalendarListDialogImpl::slotDeleteClicked() {
339 CalendarListViewItem *item =
static_cast<CalendarListViewItem*
>(calendarList->selectedItem());
341 calendarList->takeItem(item);
342 item->setState(CalendarListViewItem::Deleted);
343 m_deletedItems.append(item);
345 emit enableButtonOk(
true);
349void CalendarListDialogImpl::slotAddClicked() {
350 Calendar *cal =
new Calendar();
351 cal->setProject(&project);
352 CalendarListViewItem *item =
new CalendarListViewItem(*
this, calendarList, cal);
353 item->setState(CalendarListViewItem::New);
355 slotListDoubleClicked(item, TQPoint(), 0);
359TQPtrList<CalendarListViewItem> &CalendarListDialogImpl::deletedItems() {
360 return m_deletedItems;
363CalendarListViewItem *CalendarListDialogImpl::findItem(Calendar *cal) {
366 TQListViewItemIterator it(calendarList);
367 for (;it.current(); ++it) {
368 CalendarListViewItem *item =
dynamic_cast<CalendarListViewItem *
>(it.current());
369 if (item && (cal == item->original || cal == item->calendar)) {
377void CalendarListDialogImpl::slotItemRenamed(TQListViewItem *itm,
int col) {
379 itm->setRenameEnabled(col,
false);
381 CalendarListViewItem *item =
static_cast<CalendarListViewItem*
>(itm);
382 if (item->text(0).isEmpty()) {
383 item->setText(0, item->oldText);
385 if (item->text(0).isEmpty()) {
388 emit startRename(item, 0);
391 if (item->text(0) != item->oldText) {
392 item->setState(CalendarListViewItem::Modified);
393 item->calendar->setName(item->text(0));
396 slotEnableButtonOk(
true);
400void CalendarListDialogImpl::renameStopped(TQListViewItem *) {
403 emit selectionChanged();
406void CalendarListDialogImpl::slotListDoubleClicked(TQListViewItem *item,
const TQPoint&,
int col) {
410 slotStartRename(item, col);
413void CalendarListDialogImpl::slotRenameStarted(TQListViewItem *,
int ) {
415 if (calendarList->isRenaming()) {
416 bDelete->setEnabled(
false);
417 bAdd->setEnabled(
false);
421void CalendarListDialogImpl::slotStartRename(TQListViewItem *item,
int col) {
423 static_cast<CalendarListViewItem*
>(item)->oldText = item->text(col);
424 item->setRenameEnabled(col,
true);
425 item->startRename(col);
428 emit renameStarted(item, col);
433#include "kptcalendarlistdialog.moc"
Project is the main node in a project, it contains child nodes and possibly sub-projects.