void CalendarCell::update(const dbo::ptr<UserAccount>& user, const WDate& date) { date_ = date; user_ = user; clear(); dbo::Session& session = PlannerApplication::plannerApplication()->session; dbo::Transaction transaction(session); WString day; day += boost::lexical_cast<std::string>(date.day()); if (date.day() == 1) day += " " + WDate::longMonthName(date.month()); WText* header = new WText(day); header->setStyleClass("cell-header"); addWidget(header); typedef dbo::collection< dbo::ptr<Entry> > Entries; Entries entries = user->entriesInRange(date, date.addDays(1)); const unsigned maxEntries = 4; unsigned counter = 0; for (Entries::const_iterator i = entries.begin(); i != entries.end(); ++i, ++counter) { if (counter == maxEntries) { WText* extra = new WText(tr("calendar.cell.extra") .arg((int)(entries.size() - maxEntries))); extra->setStyleClass("cell-extra"); addWidget(extra); extra->clicked().preventPropagation(); extra->clicked().connect(this, &CalendarCell::showAllEntriesDialog); break; } WString format = EntryDialog::timeFormat; addWidget(new WText((*i)->start.toString(format) + "-" + (*i)->stop.toString(format) + ": " + (*i)->summary)); } transaction.commit(); }
WWidget* WCalendar::renderCell(WWidget* widget, const WDate& date) { WText* t = dynamic_cast<WText*>(widget); if (!t) { t = new WText(); t->setInline(false); t->setTextFormat(PlainText); } #ifndef WT_TARGET_JAVA char buf[30]; #else char *buf; #endif // WT_TARGET_JAVA Utils::itoa(date.day(), buf); t->setText(WString::fromUTF8(buf)); std::string styleClass; if (isInvalid(date)) styleClass += " Wt-cal-oor"; else if (date.month() != currentMonth()) styleClass += " Wt-cal-oom"; if (isSelected(date)) styleClass += " Wt-cal-sel"; WDate currentDate = WDate::currentDate(); if (date.day() == currentDate.day() && date.month() == currentDate.month() && date.year() == currentDate.year()) { if (!isSelected(date)) styleClass += " Wt-cal-now"; t->setToolTip(WString::tr("Wt.WCalendar.today")); } else t->setToolTip(""); t->setStyleClass(styleClass.c_str()); return t; }
void WCalendar::render(WFlags<RenderFlag> flags) { if (needRenderMonth_) { bool create = cellClickMapper_ == 0; #ifndef WT_TARGET_JAVA char buf[30]; #else char *buf; #endif // WT_TARGET_JAVA if (create) { // FIXME catch events only on container, and use 'tid' to identify // the cell -- in Ajax mode cellClickMapper_ = new WSignalMapper<Coordinate>(this); cellClickMapper_->mapped().connect(this, &WCalendar::cellClicked); cellDblClickMapper_ = new WSignalMapper<Coordinate>(this); cellDblClickMapper_->mapped().connect(this, &WCalendar::cellDblClicked); } int m = currentMonth_ - 1; if (monthEdit_->currentIndex() != m) monthEdit_->setCurrentIndex(m); int y = currentYear_; Utils::itoa(y, buf); if (yearEdit_->text().toUTF8() != buf) yearEdit_->setText(WString::fromUTF8(buf)); WDate todayd = WDate::currentDate(); date today(todayd.year(), todayd.month(), todayd.day()); // The first line contains the last day of the previous month. date d(currentYear_, currentMonth_, 1); d -= date_duration(1); greg_weekday gw = firstDayOfWeek_ % 7; d = previous_weekday(d, gw); for (unsigned i = 0; i < 6; ++i) { for (unsigned j = 0; j < 7; ++j) { Utils::itoa(i * 7 + j, buf); std::string cell = std::string("c") + buf; WDate date(d.year(), d.month(), d.day()); WWidget *w = impl_->resolveWidget(cell); WWidget *rw = renderCell(w, date); impl_->bindWidget(cell, rw); WInteractWidget* iw = dynamic_cast<WInteractWidget*>(rw->webWidget()); if (iw && iw != w) { if (clicked().isConnected() || (selectionMode_ == ExtendedSelection) || (selectionMode_ != ExtendedSelection && singleClickSelect_ && activated().isConnected())) cellClickMapper_ ->mapConnect(iw->clicked(), Coordinate(i, j)); if ((selectionMode_ != ExtendedSelection && !singleClickSelect_ && (activated().isConnected() || selectionChanged().isConnected()))) cellDblClickMapper_ ->mapConnect(iw->doubleClicked(), Coordinate(i, j)); } d += date_duration(1); } } needRenderMonth_ = false; } WCompositeWidget::render(flags); }