static void CustomizeTocInfoTip(LPNMTVGETINFOTIP nmit) { PageDestination *link = ((DocTocItem *)nmit->lParam)->GetLink(); ScopedMem<WCHAR> path(link ? link->GetDestValue() : nullptr); if (!path) return; CrashIf(!link); // /analyze claims that this could happen - it really can't CrashIf(link->GetDestType() != Dest_LaunchURL && link->GetDestType() != Dest_LaunchFile && link->GetDestType() != Dest_LaunchEmbedded); str::Str<WCHAR> infotip; RECT rcLine, rcLabel; HWND hTV = nmit->hdr.hwndFrom; // Display the item's full label, if it's overlong TreeView_GetItemRect(hTV, nmit->hItem, &rcLine, FALSE); TreeView_GetItemRect(hTV, nmit->hItem, &rcLabel, TRUE); if (rcLine.right + 2 < rcLabel.right) { WCHAR buf[INFOTIPSIZE+1] = { 0 }; // +1 just in case TVITEM item; item.hItem = nmit->hItem; item.mask = TVIF_TEXT; item.pszText = buf; item.cchTextMax = INFOTIPSIZE; TreeView_GetItem(hTV, &item); infotip.Append(item.pszText); infotip.Append(L"\r\n"); } if (Dest_LaunchEmbedded == link->GetDestType()) path.Set(str::Format(_TR("Attachment: %s"), path.Get())); infotip.Append(path); str::BufSet(nmit->pszText, nmit->cchTextMax, infotip.Get()); }
void DumpTocItem(BaseEngine *engine, DocTocItem *item, int level, int& idCounter) { for (; item; item = item->next) { ScopedMem<char> title(Escape(item->title, true)); for (int i = 0; i < level; i++) Out("\t"); Out("<Item Title=\"%s\"", title.Get()); if (item->pageNo) Out(" Page=\"%d\"", item->pageNo); if (item->id != ++idCounter) Out(" Id=\"%d\"", item->id); if (item->GetLink()) { PageDestination *dest = item->GetLink(); ScopedMem<char> target(Escape(dest->GetDestValue())); if (target) Out(" Target=\"%s\"", target.Get()); if (item->pageNo != dest->GetDestPageNo()) Out(" TargetPage=\"%d\"", dest->GetDestPageNo()); ScopedMem<char> rectStr(DestRectToStr(engine, dest)); if (rectStr) Out(" Target%s", rectStr.Get()); } if (!item->child) Out(" />\n"); else { if (item->open) Out(" Expanded=\"yes\""); Out(">\n"); DumpTocItem(engine, item->child, level + 1, idCounter); for (int i = 0; i < level; i++) Out("\t"); Out("</Item>\n"); } } }
void DumpPageContent(BaseEngine *engine, int pageNo, bool fullDump) { // ensure that the page is loaded engine->BenchLoadPage(pageNo); Out("\t<Page Number=\"%d\"\n", pageNo); if (engine->HasPageLabels()) { ScopedMem<char> label(Escape(engine->GetPageLabel(pageNo))); Out("\t\tLabel=\"%s\"\n", label.Get()); } RectI bbox = engine->PageMediabox(pageNo).Round(); Out("\t\tMediaBox=\"%d %d %d %d\"\n", bbox.x, bbox.y, bbox.dx, bbox.dy); RectI cbox = engine->PageContentBox(pageNo).Round(); if (cbox != bbox) Out("\t\tContentBox=\"%d %d %d %d\"\n", cbox.x, cbox.y, cbox.dx, cbox.dy); if (!engine->HasClipOptimizations(pageNo)) Out("\t\tHasClipOptimizations=\"no\"\n"); Out("\t>\n"); if (fullDump) { ScopedMem<char> text(Escape(engine->ExtractPageText(pageNo, L"\n"))); if (text) Out("\t\t<TextContent>\n%s\t\t</TextContent>\n", text.Get()); } Vec<PageElement *> *els = engine->GetElements(pageNo); if (els && els->Count() > 0) { Out("\t\t<PageElements>\n"); for (size_t i = 0; i < els->Count(); i++) { RectD rect = els->At(i)->GetRect(); Out("\t\t\t<Element Type=\"%s\"\n\t\t\t\tRect=\"%.0f %.0f %.0f %.0f\"\n", ElementTypeToStr(els->At(i)), rect.x, rect.y, rect.dx, rect.dy); PageDestination *dest = els->At(i)->AsLink(); if (dest) { if (dest->GetDestType() != Dest_None) Out("\t\t\t\tLinkType=\"%s\"\n", PageDestToStr(dest->GetDestType())); ScopedMem<char> value(Escape(dest->GetDestValue())); if (value) Out("\t\t\t\tLinkTarget=\"%s\"\n", value.Get()); if (dest->GetDestPageNo()) Out("\t\t\t\tLinkedPage=\"%d\"\n", dest->GetDestPageNo()); ScopedMem<char> rectStr(DestRectToStr(engine, dest)); if (rectStr) Out("\t\t\t\tLinked%s\n", rectStr.Get()); } ScopedMem<char> name(Escape(els->At(i)->GetValue())); if (name) Out("\t\t\t\tLabel=\"%s\"\n", name.Get()); Out("\t\t\t/>\n"); } Out("\t\t</PageElements>\n"); DeleteVecMembers(*els); } delete els; Out("\t</Page>\n"); }
EbookTocItem(WCHAR *title, PageDestination *dest) : DocTocItem(title, dest ? dest->GetDestPageNo() : 0), dest(dest) { }