示例#1
0
void WorksheetSubStreamHandler::handleObj(ObjRecord* record)
{
    if (!record) return;
    if (!d->sheet) return;

    const unsigned long id = record->m_object ? record->m_object->id() : -1;

    std::cout << "WorksheetSubStreamHandler::handleObj id=" << id << " type=" << (record->m_object ? record->m_object->type() : -1) << std::endl;

    d->lastOfficeArtObject = 0;

    bool handled = false;
    if (record->m_object && d->lastDrawingObject && record->m_object->applyDrawing(*(d->lastDrawingObject))) {
        handled = true;
        switch (record->m_object->type()) {
            case Object::Picture: {
                MsoDrawingBlibItem *drawing = d->globals->drawing(record->m_object->id());
                if(!drawing) {
                    std::cerr << "WorksheetSubStreamHandler: Skipping unknown object of type=" << record->m_object->type() << " with id=" << record->m_object->id() << std::endl;
                    return;
                }
                PictureObject* pic = dynamic_cast<PictureObject*>(record->m_object);
                Q_ASSERT(pic);
                pic->setFileName(drawing->m_picture.name);
                Cell *cell = d->sheet->cell(record->m_object->m_colL, record->m_object->m_rwT);
                cell->addPicture(pic);//(record->m_object, drawing->m_picture);
            } break;
            case Object::Chart: {
                d->charts.push_back(id);
            } break;
            case Object::Note: {
                // a NoteRecord will follow which picks that up.
                d->noteMap[id] = ++d->noteCount;
            } break;
            default:
                handled = false;
        }
    }
    if (!handled && d->lastDrawingObject) {
        //Q_ASSERT(!d->globals->drawing(record->m_object->id()));
        foreach (const MSO::OfficeArtSpgrContainerFileBlock& fb, d->lastDrawingObject->groupShape->rgfb) {
            if (fb.anon.is<MSO::OfficeArtSpgrContainer>()) {
                delete d->lastGroupObject;
                d->lastGroupObject = new MSO::OfficeArtSpgrContainer(*fb.anon.get<MSO::OfficeArtSpgrContainer>());
            } else {
                const MSO::OfficeArtSpContainer& o = *fb.anon.get<MSO::OfficeArtSpContainer>();
                if (o.clientAnchor) {
                    MSO::XlsOfficeArtClientAnchor* anchor = o.clientAnchor->anon.get<MSO::XlsOfficeArtClientAnchor>();
                    if (!anchor) {
                        qDebug() << "invalid client anchor";
                    } else {
                        Cell *cell = d->sheet->cell(anchor->colL, anchor->rwT);
                        OfficeArtObject* obj = new OfficeArtObject(o);
                        cell->addDrawObject(obj);
                        d->lastOfficeArtObject = obj;
                    }
                } else {
                    OfficeArtObject* obj = new OfficeArtObject(o);
                    d->sheet->addDrawObject(obj, d->lastGroupObject);
                    d->lastOfficeArtObject = obj;

                    if (d->lastGroupObject) {
                        if (!o.shapeProp.fChild) {
                            delete d->lastGroupObject; d->lastGroupObject = 0;
                        }
                    }
                }
            }
        }
    }