void OnyxMainWindow::bookmarkModel(QStandardItemModel & model, QModelIndex & selected) { CRFileHistRecord * rec = view_->getDocView()->getCurrentFileHistRecord(); if ( !rec ) return; LVPtrVector<CRBookmark> & list( rec->getBookmarks() ); model.setColumnCount(2); int row = 0; for(int i = 0; i < list.length(); ++i) { // skip cites CRBookmark * bmk = list[i]; if (!bmk || (bmk->getType() == bmkt_comment || bmk->getType() == bmkt_correction)) continue; QString t =cr2qt(view_->getDocView()->getPageText(true, list[i]->getBookmarkPage())); t.truncate(100); QStandardItem *title = new QStandardItem(t); title->setData((int)list[i]); title->setEditable(false); model.setItem(row, 0, title); int pos = list[i]->getPercent(); QString str(tr("%1")); str = str.arg(pos); QStandardItem *page = new QStandardItem(str); page->setTextAlignment(Qt::AlignCenter); page->setEditable(false); model.setItem(row, 1, page); row++; } }
CRCitesMenu::CRCitesMenu(CRGUIWindowManager * wm, LVDocView * docview, int numItems, lvRect & rc) : CRFullScreenMenu( wm, MCMD_CITES_LIST, lString16(_("Citations")), numItems, rc ) , _docview(docview) { CRGUIAcceleratorTableRef acc = _wm->getAccTables().get("bookmarks"); if ( acc.isNull() ) acc = _wm->getAccTables().get("menu"); setAccelerators( acc ); setSkinName(lString16("#cites-list"), lString16("#bookmarks")); int mc = getSkin()->getMinItemCount(); if ( _pageItems < mc ) _pageItems = mc; CRFileHistRecord * rec = docview->getCurrentFileHistRecord(); LVPtrVector < CRBookmark > &bookmarks = rec->getBookmarks(); for ( int i=0; i < bookmarks.length(); i++ ) { CRBookmark * bmk = bookmarks[i]; if (!bmk || ((bmk->getType() != bmkt_comment && bmk->getType() != bmkt_correction))) continue; ldomXPointer p = docview->getDocument()->createXPointer( bmk->getStartPos() ); if ( p.isNull() ) continue; int page = docview->getBookmarkPage( p ); /// get bookmark position text if ( page<0 ) continue; CRBookmarkMenuItem * item = new CRBookmarkMenuItem( this, i, bmk, page ); addItem( item ); } #ifdef CR_POCKETBOOK citesDialog = this; #endif if (_items.length() == 0) createDefaultItem(); }
void RecentBooksDlg::ShowPage(int updown, int selectRow) { Device::forceFullScreenUpdate(); if(updown>0) { if(curPage+1>pageCount) curPage=0; curPage+=1; } else { if(curPage-1<=0) curPage=pageCount+1; curPage-=1; } setWindowTitle(titleMask + " (" + QString::number(curPage) + "/" + QString::number(pageCount) + ")"); int rc = m_docview->rowCount; int firstItem = m_docview->getDocView()->isDocumentOpened() ? 1 : 0; int startPos = ((curPage-1)*rc)+firstItem; LVPtrVector<CRFileHistRecord> & files = m_docview->getDocView()->getHistory()->getRecords(); for(int k=startPos, index=0; index<rc*2; ++k, index+=2) { if(k<files.length()) { CRFileHistRecord * book = files.get(k); lString16 title = book->getTitle(); lString16 author = book->getAuthor(); lString16 series = book->getSeries(); lString16 filename = book->getFileName(); if(title.empty()) title = filename; QString fileExt = cr2qt(filename); fileExt = fileExt.mid(fileExt.lastIndexOf(".")+1); int fileSize = book->getFileSize(); CRBookmark *bm = book->getLastPos(); int percent = bm->getPercent(); if(author.empty()) author = L"-"; if(title.empty()) title = L"-"; if(!series.empty()) series = L"(" + series + L")"; QTableWidgetItem *item = m_ui->tableWidget->item(index, 0); item->setText(cr2qt(title)); item = m_ui->tableWidget->item(index+1, 0); item->setText(cr2qt(author)+"\n"+cr2qt(series)); item = m_ui->tableWidget->item(index+1, 1); item->setText(crpercent(percent) + "\n" + fileExt+" / "+crFileSize(fileSize)); m_ui->tableWidget->showRow(index); m_ui->tableWidget->showRow(index+1); } else { m_ui->tableWidget->hideRow(index); m_ui->tableWidget->hideRow(index+1); } } // select first row if(m_ui->tableWidget->rowCount()>0) m_ui->tableWidget->selectRow(selectRow); }
BookmarkListDialog::BookmarkListDialog(QWidget *parent, CR3View * docView ) : QDialog(parent), m_ui(new Ui::BookmarkListDialog), _docview(docView) { m_ui->setupUi(this); addAction(m_ui->actionRemoveBookmark); addAction(m_ui->actionRemoveAllBookmarks); QAction *actionSelect = m_ui->actionSelectBookmark; actionSelect->setShortcut(Qt::Key_Select); addAction(actionSelect); int i = 0; m_ui->tableWidget->horizontalHeader()->setResizeMode( i++, QHeaderView::ResizeToContents); m_ui->tableWidget->horizontalHeader()->setResizeMode( i++, QHeaderView::Stretch ); m_ui->tableWidget->horizontalHeader()->setStretchLastSection(true); m_ui->tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft); CRFileHistRecord * rec = _docview->getDocView()->getCurrentFileHistRecord(); if (!rec) return; LVPtrVector<CRBookmark> & list( rec->getBookmarks() ); int curpercent = _docview->getDocView()->getPosPercent(); int bestdiff = -1; int bestindex = -1; int y = 0; for ( int i=0; i<list.length(); i++ ) { CRBookmark * bm = list[i]; if ( bm->getType() == bmkt_lastpos ) continue; int diff = bm->getPercent() - curpercent; if ( diff < 0 ) diff = -diff; if ( bestindex==-1 || diff < bestdiff ) { bestindex = i; bestdiff = diff; } m_ui->tableWidget->setRowCount(y+1); { int i=0; _list.append( bm ); m_ui->tableWidget->setItem( y, i++, new QTableWidgetItem(crpercent( bm->getPercent()))); m_ui->tableWidget->setItem( y, i++, new QTableWidgetItem(limit(cr2qt(bm->getPosText())))); m_ui->tableWidget->verticalHeader()->setResizeMode(y, QHeaderView::ResizeToContents); } y++; } if (bestindex>=0) m_ui->tableWidget->selectRow(bestindex); m_ui->tableWidget->resizeColumnsToContents(); m_ui->tableWidget->resizeRowsToContents(); }
CRBookmark * CRFileHistRecord::setShortcutBookmark( int shortcut, ldomXPointer ptr ) { if ( ptr.isNull() ) return NULL; CRBookmark * bmk = new CRBookmark( ptr ); bmk->setType( bmkt_pos ); bmk->setShortcut( shortcut ); for ( int i=0; i<_bookmarks.length(); i++ ) { if ( _bookmarks[i]->getShortcut() == shortcut ) { _bookmarks[i] = bmk; return bmk; } } _bookmarks.insert( 0, bmk ); return bmk; }
/// called on text virtual void OnText( const lChar16 * text, int len, lUInt32 flags ) { CR_UNUSED(flags); lString16 txt( text, len ); switch (state) { case in_start_point: _curr_bookmark->setStartPos( txt ); break; case in_end_point: _curr_bookmark->setEndPos( txt ); break; case in_header_txt: _curr_bookmark->setTitleText( txt ); break; case in_selection_txt: _curr_bookmark->setPosText( txt ); break; case in_comment_txt: _curr_bookmark->setCommentText( txt ); break; case in_author: _curr_file->setAuthor( txt ); break; case in_title: _curr_file->setTitle( txt ); break; case in_series: _curr_file->setSeries( txt ); break; case in_filename: _curr_file->setFileName( txt ); break; case in_filepath: _curr_file->setFilePath( txt ); break; case in_filesize: _curr_file->setFileSize( txt.atoi() ); break; default: break; } }
/// returns index of selected item, -1 if no item selected int CRBookmarkMenu::getSelectedItemIndex() { CRFileHistRecord * bookmarks = _docview->getCurrentFileHistRecord(); int curPage = _docview->getCurPage(); int n = bookmarks->getLastShortcutBookmark()+1; for ( int i=1; i<=n; i++ ) { CRBookmark * bm = bookmarks->getShortcutBookmark(i); int page = 0; if ( bm ) { ldomXPointer p = _docview->getDocument()->createXPointer( bm->getStartPos() ); if ( !p.isNull() ) { /// get page number by bookmark page = _docview->getBookmarkPage( p ); /// get bookmark position text if ( page>0 && page==curPage ) return i-1; } } } return -1; }
CRBookmarkMenu::CRBookmarkMenu(CRGUIWindowManager * wm, LVDocView * docview, int numItems, lvRect & rc, bool goToMode) : CRFullScreenMenu( wm, MCMD_BOOKMARK_LIST, lString16(_("Bookmarks")), numItems, rc ) , _docview(docview) { CRFileHistRecord * bookmarks = docview->getCurrentFileHistRecord(); CRGUIAcceleratorTableRef acc = _wm->getAccTables().get("bookmarks"); if ( acc.isNull() ) acc = _wm->getAccTables().get("menu"); setAccelerators( acc ); setSkinName(lString16("#bookmarks")); int mc = getSkin()->getMinItemCount(); if ( _pageItems < mc ) _pageItems = mc; int n = bookmarks->getLastShortcutBookmark()+1; n = (n + _pageItems - 1) / _pageItems * _pageItems; int minitems = (MIN_BOOKMARK_ITEMS + _pageItems - 1) / _pageItems * _pageItems; if ( n<minitems ) n = minitems; for ( int i=1; i<=n; i++ ) { CRBookmark * bm = bookmarks->getShortcutBookmark(i); int page = 0; if ( bm ) { ldomXPointer p = docview->getDocument()->createXPointer( bm->getStartPos() ); if ( !p.isNull() ) { /// get page number by bookmark page = docview->getBookmarkPage( p ); /// get bookmark position text if ( page<0 ) bm = NULL; } } CRBookmarkMenuItem * item = new CRBookmarkMenuItem( this, i, bm, page ); addItem( item ); } setMode( goToMode ); #ifdef CR_POCKETBOOK bmkDialog = this; #endif }
/// called on element attribute virtual void OnAttribute( const lChar16 * nsname, const lChar16 * attrname, const lChar16 * attrvalue ) { CR_UNUSED(nsname); if ( lStr_cmp(attrname, "type")==0 && state==in_bm ) { static const char * tnames[] = {"lastpos", "position", "comment", "correction"}; for ( int i=0; i<4; i++) { if ( lStr_cmp(attrvalue, tnames[i])==0 ) { _curr_bookmark->setType( (bmk_type)i ); return; } } } else if ( lStr_cmp(attrname, "shortcut")==0 && state==in_bm ) { int n = lString16( attrvalue ).atoi(); _curr_bookmark->setShortcut( n ); } else if ( lStr_cmp(attrname, "percent")==0 && state==in_bm ) { int n1=0, n2=0; int i=0; for ( ; attrvalue[i]>='0' && attrvalue[i]<='9'; i++) n1 = n1*10 + (attrvalue[i]-'0'); if ( attrvalue[i]=='.' ) { i++; if (attrvalue[i]>='0' && attrvalue[i]<='9') n2 = (attrvalue[i++]-'0')*10; if (attrvalue[i]>='0' && attrvalue[i]<='9') n2 = (attrvalue[i++]-'0'); } _curr_bookmark->setPercent( n1*100 + n2 ); } else if ( lStr_cmp(attrname, "timestamp")==0 && state==in_bm ) { time_t n1=0; int i=0; for ( ; attrvalue[i]>='0' && attrvalue[i]<='9'; i++) n1 = n1*10 + (attrvalue[i]-'0'); _curr_bookmark->setTimestamp( n1 ); } else if (lStr_cmp(attrname, "page")==0 && state==in_bm) { _curr_bookmark->setBookmarkPage(lString16( attrvalue ).atoi()); } }
/// called on closing virtual void OnTagClose( const lChar16 * nsname, const lChar16 * tagname ) { if ( lStr_cmp(nsname, "FictionBookMarks")==0 && state==in_fbm ) { state = in_xml; } else if ( lStr_cmp(tagname, "file")==0 && state==in_file ) { state = in_fbm; if ( _curr_file ) _hist->getRecords().add( _curr_file ); _curr_file = NULL; } else if ( lStr_cmp(tagname, "file-info")==0 && state==in_file_info ) { state = in_file; } else if ( lStr_cmp(tagname, "bookmark-list")==0 && state==in_bm_list ) { state = in_file; } else if ( lStr_cmp(tagname, "doc-title")==0 && state==in_title ) { state = in_file_info; } else if ( lStr_cmp(tagname, "doc-author")==0 && state==in_author ) { state = in_file_info; } else if ( lStr_cmp(tagname, "doc-series")==0 && state==in_series ) { state = in_file_info; } else if ( lStr_cmp(tagname, "doc-filename")==0 && state==in_filename ) { state = in_file_info; } else if ( lStr_cmp(tagname, "doc-filepath")==0 && state==in_filepath ) { state = in_file_info; } else if ( lStr_cmp(tagname, "doc-filesize")==0 && state==in_filesize ) { state = in_file_info; } else if ( lStr_cmp(tagname, "bookmark")==0 && state==in_bm ) { state = in_bm_list; if ( _curr_bookmark ) { if ( _curr_bookmark->getType() == bmkt_lastpos ) { _curr_file->setLastPos(_curr_bookmark); delete _curr_bookmark; } else { _curr_file->getBookmarks().add(_curr_bookmark); } _curr_bookmark = NULL; } } else if ( lStr_cmp(tagname, "start-point")==0 && state==in_start_point ) { state = in_bm; } else if ( lStr_cmp(tagname, "end-point")==0 && state==in_end_point ) { state = in_bm; } else if ( lStr_cmp(tagname, "header-text")==0 && state==in_header_txt ) { state = in_bm; } else if ( lStr_cmp(tagname, "selection-text")==0 && state==in_selection_txt ) { state = in_bm; } else if ( lStr_cmp(tagname, "comment-text")==0 && state==in_comment_txt ) { state = in_bm; } }
void V3DocViewWin::showAboutDialog() { _docview->savePosition(); CRFileHistRecord * hist = _docview->getCurrentFileHistRecord(); lString16 title = L"Cool Reader "; #ifndef PACKAGE_VERSION #define PACKAGE_VERSION CR_ENGINE_VERSION #endif title << Utf8ToUnicode(lString8(PACKAGE_VERSION)); lString8 txt; //========================================================= txt << "<table><col width=\"30%\"/><col width=\"70%\"/>\n"; CRPropRef props = _docview->getDocProps(); lString8 statusInfo; addPropLine( statusInfo, _("Current page"), lString16::itoa(_docview->getCurPage()+1) ); addPropLine( statusInfo, _("Total pages"), lString16::itoa(_docview->getPageCount()) ); addPropLine( statusInfo, _("Battery state"), _docview->getBatteryState()==-1 ? lString16(_("charging...")) : lString16::itoa(_docview->getBatteryState()) + L"%" ); addPropLine( statusInfo, _("Current Time"), _docview->getTimeString() ); // TODO: if ( hist ) { CRBookmark * lastpos = hist->getLastPos(); if ( lastpos ) { addPropLine( statusInfo, _("Current chapter"), lastpos->getTitleText() ); } } addInfoSection( txt, statusInfo, _("Status") ); lString8 fileInfo; addPropLine( fileInfo, _("Archive name"), props->getStringDef(DOC_PROP_ARC_NAME) ); addPropLine( fileInfo, _("Archive path"), props->getStringDef(DOC_PROP_ARC_PATH) ); addPropLine( fileInfo, _("Archive size"), props->getStringDef(DOC_PROP_ARC_SIZE) ); addPropLine( fileInfo, _("File name"), props->getStringDef(DOC_PROP_FILE_NAME) ); addPropLine( fileInfo, _("File path"), props->getStringDef(DOC_PROP_FILE_PATH) ); addPropLine( fileInfo, _("File size"), props->getStringDef(DOC_PROP_FILE_SIZE) ); addPropLine( fileInfo, _("File format"), props->getStringDef(DOC_PROP_FILE_FORMAT) ); addInfoSection( txt, fileInfo, _("File info") ); lString8 bookInfo; addPropLine( bookInfo, _("Title"), props->getStringDef(DOC_PROP_TITLE) ); addPropLine( bookInfo, _("Author(s)"), props->getStringDef(DOC_PROP_AUTHORS) ); addPropLine( bookInfo, _("Series name"), props->getStringDef(DOC_PROP_SERIES_NAME) ); addPropLine( bookInfo, _("Series number"), props->getStringDef(DOC_PROP_SERIES_NUMBER) ); addPropLine( bookInfo, _("Date"), getDocText( getDocView()->getDocument(), "/FictionBook/description/title-info/date", ", " ) ); addPropLine( bookInfo, _("Genres"), getDocText( getDocView()->getDocument(), "/FictionBook/description/title-info/genre", ", " ) ); addPropLine( bookInfo, _("Translator"), getDocText( getDocView()->getDocument(), "/FictionBook/description/title-info/translator", ", " ) ); addInfoSection( txt, bookInfo, _("Book info") ); lString8 docInfo; addPropLine( docInfo, _("Document author"), getDocAuthors( getDocView()->getDocument(), "/FictionBook/description/document-info/author", " " ) ); addPropLine( docInfo, _("Document date"), getDocText( getDocView()->getDocument(), "/FictionBook/description/document-info/date", " " ) ); addPropLine( docInfo, _("Document source URL"), getDocText( getDocView()->getDocument(), "/FictionBook/description/document-info/src-url", " " ) ); addPropLine( docInfo, _("OCR by"), getDocText( getDocView()->getDocument(), "/FictionBook/description/document-info/src-ocr", " " ) ); addPropLine( docInfo, _("Document version"), getDocText( getDocView()->getDocument(), "/FictionBook/description/document-info/version", " " ) ); addPropLine( docInfo, _("Change history"), getDocText( getDocView()->getDocument(), "/FictionBook/description/document-info/history", " " ) ); addInfoSection( txt, docInfo, _("Document info") ); lString8 pubInfo; addPropLine( pubInfo, _("Publication name"), getDocText( getDocView()->getDocument(), "/FictionBook/description/publish-info/book-name", " " ) ); addPropLine( pubInfo, _("Publisher"), getDocText( getDocView()->getDocument(), "/FictionBook/description/publish-info/publisher", " " ) ); addPropLine( pubInfo, _("Publisher city"), getDocText( getDocView()->getDocument(), "/FictionBook/description/publish-info/city", " " ) ); addPropLine( pubInfo, _("Publication year"), getDocText( getDocView()->getDocument(), "/FictionBook/description/publish-info/year", " " ) ); addPropLine( pubInfo, _("ISBN"), getDocText( getDocView()->getDocument(), "/FictionBook/description/publish-info/isbn", " " ) ); addInfoSection( txt, pubInfo, _("Publication info") ); addPropLine( txt, _("Custom info"), getDocText( getDocView()->getDocument(), "/FictionBook/description/custom-info", " " ) ); txt << "</table>\n"; //CRLog::trace(txt.c_str()); //========================================================= txt = CRViewDialog::makeFb2Xml(txt); CRViewDialog * dlg = new CRViewDialog( _wm, title, txt, lvRect(), true, true ); dlg->getDocView()->setVisiblePageCount(1); //int fs = _props->getIntDef( PROP_FILE_PROPS_FONT_SIZE, 26 ); //dlg->getDocView()->setFontSize(fs); _wm->activateWindow( dlg ); }
ChangeInfo * ChangeInfo::fromString(lString8 s) { lString8Collection rows(s, cs8("\n")); if (rows.length() < 3 || rows[0] != START_TAG || rows[rows.length() - 1] != END_TAG) return NULL; ChangeInfo * ci = new ChangeInfo(); CRBookmark bmk; for (int i=1; i<rows.length() - 1; i++) { lString8 row = rows[i]; int p = row.pos("="); if (p<1) continue; lString8 name = row.substr(0, p); lString8 value = row.substr(p + 1); if (name == ACTION_TAG) { ci->_deleted = (value == ACTION_DELETE_TAG); } else if (name == FILE_TAG) { ci->_fileName = decodeText(value); } else if (name == TYPE_TAG) { bmk.setType(value.atoi()); } else if (name == START_POS_TAG) { bmk.setStartPos(decodeText(value)); } else if (name == END_POS_TAG) { bmk.setEndPos(decodeText(value)); } else if (name == TIMESTAMP_TAG) { ci->_timestamp = value.atoi64() / 1000; bmk.setTimestamp(ci->_timestamp); } else if (name == PERCENT_TAG) { bmk.setPercent(value.atoi()); } else if (name == SHORTCUT_TAG) { bmk.setShortcut(value.atoi()); } else if (name == TITLE_TEXT_TAG) { bmk.setTitleText(decodeText(value)); } else if (name == POS_TEXT_TAG) { bmk.setPosText(decodeText(value)); } else if (name == COMMENT_TEXT_TAG) { bmk.setCommentText(decodeText(value)); } } if (bmk.isValid()) ci->_bookmark = new CRBookmark(bmk); if (ci->_fileName.empty() || ci->_timestamp == 0 || (!ci->_bookmark && !ci->_deleted)) { delete ci; return NULL; } return ci; }