void WContainerWidget::updateDomChildren(DomElement& parent, WApplication *app) { if (!app->session()->renderer().preLearning() && !layout_) { if (parent.mode() == DomElement::ModeUpdate) parent.setWasEmpty(wasEmpty()); if (transientImpl_) { std::vector<int> orderedInserts; std::vector<WWidget *>& ac = transientImpl_->addedChildren_; for (unsigned i = 0; i < ac.size(); ++i) orderedInserts.push_back(Utils::indexOf(*children_, ac[i])); Utils::sort(orderedInserts); int addedCount = transientImpl_->addedChildren_.size(); int totalCount = children_->size(); int insertCount = 0; for (unsigned i = 0; i < orderedInserts.size(); ++i) { int pos = orderedInserts[i]; DomElement *c = (*children_)[pos]->createSDomElement(app); if (pos + (addedCount - insertCount) == totalCount) parent.addChild(c); else parent.insertChildAt(c, pos + firstChildIndex()); ++insertCount; } transientImpl_->addedChildren_.clear(); } } #ifndef WT_NO_LAYOUT if (flags_.test(BIT_LAYOUT_NEEDS_UPDATE)) { if (layout_) layoutImpl()->updateDom(parent); flags_.reset(BIT_LAYOUT_NEEDS_UPDATE); } #endif // WT_NO_LAYOUT }
DomElement *WTable::createRowDomElement(int row, bool withIds, WApplication *app) { DomElement *tr = DomElement::createNew(DomElement_TR); if (withIds) tr->setId(rows_[row]->id()); rows_[row]->updateDom(*tr, true); // because of the mix of addChild() and insertChildAt() tr->setWasEmpty(false); int spanCounter = 0; for (int col = 0; col < columnCount(); ++col) { WTableRow::TableData& d = itemAt(row, col); if (!d.overSpanned) { DomElement *td = d.cell->createSDomElement(app); /* * So, IE gets confused when doing appendChild() for TH followed by * insertCell(-1) for TD. But, we cannot insertChild() for element 0, * so we do TH with appendChild, and insertCell(col). */ if (col < headerColumnCount_ || row < headerRowCount_) tr->addChild(td); else tr->insertChildAt(td, col - spanCounter); for (int i = 0; i < d.cell->rowSpan(); ++i) for (int j = 0; j < d.cell->columnSpan(); ++j) if (i + j > 0) { itemAt(row + i, col + j).overSpanned = true; itemAt(row + i, col + j).cell->setRendered(false); } } else { spanCounter++; } } return tr; }
void WContainerWidget::updateDom(DomElement& element, bool all) { if (contentAlignmentChanged_ || all) { switch(contentAlignment_) { case AlignLeft: if (contentAlignmentChanged_) element.setProperty(PropertyStyleTextAlign, "left"); break; case AlignRight: element.setProperty(PropertyStyleTextAlign, "right"); break; case AlignCenter: element.setProperty(PropertyStyleTextAlign, "center"); break; case AlignJustify: element.setProperty(PropertyStyleTextAlign, "justify"); } /* * Welcome to CSS hell. * * Apparently, the text-align property only applies to inline elements. * To center non-inline children, the standard says to set its left and * right margin to 'auto'. * * I assume the same applies for aligning to the right ? */ for (unsigned i = 0; i < children().size(); ++i) { WWidget *child = children()[i]; if (!child->isInline()) { if (contentAlignment_ == AlignCenter) { if (!child->margin(Left).isAuto()) child->setMargin(WLength(), Left); if (!child->margin(Right).isAuto()) child->setMargin(WLength(), Right); } if (contentAlignment_ == AlignRight) { if (!child->margin(Left).isAuto()) child->setMargin(WLength(), Left); } } } contentAlignmentChanged_ = false; } if (paddingsChanged_ || all) { if (paddingsChanged_ || !padding_[0].isAuto() || !padding_[1].isAuto() || !padding_[2].isAuto() || !padding_[3].isAuto()) { if ((padding_[0] == padding_[1]) && (padding_[0] == padding_[2]) && (padding_[0] == padding_[3])) element.setProperty(PropertyStylePadding, padding_[0].cssText()); else element.setProperty(PropertyStylePadding, padding_[0].cssText() + " " + padding_[1].cssText() + " " + padding_[2].cssText() + " " + padding_[3].cssText()); } paddingsChanged_ = false; } WInteractWidget::updateDom(element, all); bool wasEmpty = (((addedChildren_ ? addedChildren_->size() : 0) == children_->size()) && (otherImpl_ ? (otherImpl_->scriptFunctions_ ? otherImpl_->scriptFunctions_->empty() : true) : true)); element.setWasEmpty(wasEmpty); if (addedChildren_) { for (unsigned i = 0; i < addedChildren_->size(); ++i) { DomElement *c = (*addedChildren_)[i]->webWidget()->createSDomElement(); element.addChild(c); } delete addedChildren_; addedChildren_ = 0; } }