void ReportSectionDetail::initFromXML(QDomNode & section) {
    QDomNodeList nl = section.childNodes();
    QDomNode node;
    QString n;

    // some code to handle old style defs
    QString o_name = "unnamed";
    QString o_column = QString::null;
    bool old_head = FALSE;
    QDomNode o_head;
    bool old_foot = FALSE;
    QDomNode o_foot;

    for(int i = 0; i < nl.count(); i++) {
        node = nl.item(i);
        n = node.nodeName();
        if(n == "name") {
            o_name = node.firstChild().nodeValue();
            setTitle(o_name);
        } else if(n == "pagebreak") {
          QDomElement eThis = node.toElement();
          if(eThis.attribute("when") == "at end")
            setPageBreak(BreakAtEnd);
        } else if(n == "group") {
            ReportSectionDetailGroup * rsdg = new ReportSectionDetailGroup("unnamed", this, this);
            QDomNodeList gnl = node.childNodes();
            QDomNode gnode;
            bool show_head = FALSE;
            bool show_foot = FALSE;
            for(int gi = 0; gi < gnl.count(); gi++) {
                gnode = gnl.item(gi);
                if(gnode.nodeName() == "name") {
                    rsdg->setTitle(gnode.firstChild().nodeValue());
                } else if(gnode.nodeName() == "column") {
                    rsdg->setColumn(gnode.firstChild().nodeValue());
                } else if(gnode.nodeName() == "pagebreak") {
                  QDomElement elemThis = gnode.toElement();
                  QString n = elemThis.attribute("when");
                  if("after foot" == n)
                    rsdg->setPageBreak(ReportSectionDetailGroup::BreakAfterGroupFooter);
                } else if(gnode.nodeName() == "head") {
                    rsdg->getGroupHead()->initFromXML(gnode);
                    rsdg->showGroupHead(TRUE);
                    show_head = TRUE;
                } else if(gnode.nodeName() == "foot") {
                    rsdg->getGroupFoot()->initFromXML(gnode);
                    rsdg->showGroupFoot(TRUE);
                    show_foot = TRUE;
                } else {
                    qDebug("encountered unknown element while parsing group element: %s", gnode.nodeName().latin1());
                }
            }
            insertSection(groupSectionCount(), rsdg);
            rsdg->showGroupHead(show_head);
            rsdg->showGroupFoot(show_foot);
        } else if(n == "grouphead") {
            o_head = node;
            old_head = TRUE;
        } else if(n == "groupfoot") {
            o_foot = node;
            old_foot = TRUE;
        } else if(n == "detail") {
            // need to pull out the query key values
            QDomNode key = node.namedItem("key");
            if(key.isNull()) {
                qDebug("Did not find a key element while parsing detail section");
            } else {
                QDomNodeList knl = key.childNodes();
                QDomNode knode;
                for(int ki = 0; ki < knl.count(); ki++) {
                    knode = knl.item(ki);
                    if(knode.nodeName() == "query") {
                        setQuery(knode.firstChild().nodeValue());
                    } else if(knode.nodeName() == "column") {
                        o_column = knode.firstChild().nodeValue();
                    } else {
                        qDebug("encountered unknown element while parsing key element: %s", knode.nodeName().latin1());
                    }
                }
            }
            _detail->initFromXML(node);
        } else {
            // unknown element
            qDebug("while parsing section encountered and unknown element: %s", n.latin1());
        }
    }

    if(old_head || old_foot) {
        ReportSectionDetailGroup * rsdg = new ReportSectionDetailGroup(o_name, this, this);

        rsdg->setColumn(o_column);
        if(old_head)
            rsdg->getGroupHead()->initFromXML(o_head);
        if(old_foot)
            rsdg->getGroupFoot()->initFromXML(o_foot);

        // if we encountered this situation then we shouldn't have
        // any other sections but to be sure we will just tack this one
        // onto the end
        insertSection(groupSectionCount(), rsdg);

        rsdg->showGroupHead(old_head);
        rsdg->showGroupFoot(old_foot);
    }
}
void SectionEditor::btnEdit_clicked()
{
    if (m_reportSectionDetail) {
        int idx = lbGroups->currentRow();
        if (idx < 0) return;
        ReportSectionDetailGroup * rsdg = m_reportSectionDetail->groupSection(idx);
        DetailGroupSectionDialog * dgsd = new DetailGroupSectionDialog(this);

        dgsd->cbColumn->clear();
        QStringList keys = m_reportDesigner->fieldKeys();
        QStringList names = m_reportDesigner->fieldNames();
        for (int i = 0; i < keys.count(); ++i) {
            dgsd->cbColumn->insertItem( i, names.value(i), keys.at(i));
        }
        dgsd->cbColumn->setCurrentIndex(keys.indexOf(rsdg->column()));

        dgsd->cbSort->clear();
        dgsd->cbSort->addItem(i18n("Ascending"), "ascending");
        dgsd->cbSort->addItem(i18n("Descending"), "descending");

        if (rsdg->sort() == Qt::AscendingOrder) {
            dgsd->cbSort->setCurrentIndex(dgsd->cbSort->findData("ascending"));
        }
        else {
            dgsd->cbSort->setCurrentIndex(dgsd->cbSort->findData("descending"));
        }

        dgsd->breakAfterFooter->setChecked(rsdg->pageBreak() == ReportSectionDetailGroup::BreakAfterGroupFooter);
        dgsd->cbHead->setChecked(rsdg->groupHeaderVisible());
        dgsd->cbFoot->setChecked(rsdg->groupFooterVisible());

        bool exitLoop = false;
        while (!exitLoop) {
            if (dgsd->exec() == QDialog::Accepted) {
                QString column = dgsd->cbColumn->itemData(dgsd->cbColumn->currentIndex()).toString();
                bool showgh = dgsd->cbHead->isChecked();
                bool showgf = dgsd->cbFoot->isChecked();
                bool breakafterfoot = dgsd->breakAfterFooter->isChecked();

                if (column != rsdg->column() && m_reportSectionDetail->indexOfSection(column) != -1) {
                    QMessageBox::warning(this, i18n("Error Encountered"),
                                         i18n("Unable to add a new group because its name would not be unique"));
                } else {
                    lbGroups->item(idx)->setText(dgsd->cbColumn->currentText());
                    rsdg->setColumn(column);
                    rsdg->setGroupHeaderVisible(showgh);
                    rsdg->setGroupFooterVisible(showgf);
                    if (breakafterfoot)
                        rsdg->setPageBreak(ReportSectionDetailGroup::BreakAfterGroupFooter);
                    else
                        rsdg->setPageBreak(ReportSectionDetailGroup::BreakNone);

                    if (dgsd->cbSort->itemData(dgsd->cbSort->currentIndex()).toString() == "ascending") {
                        rsdg->setSort(Qt::AscendingOrder);
                    }
                    else {
                        rsdg->setSort(Qt::DescendingOrder);
                    }
                    exitLoop = true;
                }
            } else {
                exitLoop = true;
            }
        }

        if (dgsd) delete dgsd;
    }
}