00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "PDFPortraitView.h"
00020 #include "PDFView.h"
00021 #include "controller.h"
00022 #include "PDFViewerLog.h"
00023 #include <gdk/gdkkeysyms.h>
00024 #include <liberipc/eripcviewer.h>
00025
00026
00027 CPDFPortraitView::CPDFPortraitView(void)
00028 : view(NULL)
00029 , nStart(-1)
00030 , nEnd(-1)
00031 , nOffset(100)
00032 , bReady(gFalse)
00033 {
00034 }
00035
00036 CPDFPortraitView::~CPDFPortraitView(void)
00037 {
00038 }
00039
00041
00042
00043 void CPDFPortraitView::init()
00044 {
00045 list.clear();
00046 if (view->isPageMode())
00047 {
00048
00049 }
00050 else if (view->isContinousMode())
00051 {
00052
00053
00054
00055 double z = layout.initPagesPosition(view->ctrl);
00056 view->ctrl->settings.setZoom(z);
00057 }
00058 setReady(gFalse);
00059 }
00060
00061 void CPDFPortraitView::clear()
00062 {
00063 list.clear();
00064 layout.clear();
00065 }
00066
00068
00069 gboolean CPDFPortraitView::buttonPressCbk(GdkEventButton *event)
00070 {
00071 if (!isReady())
00072 {
00073 PV_LOGPRINTF("Not allow to handle mouse event now!");
00074 return FALSE;
00075 }
00076
00077 int x = (int)event->x;
00078 int y = (int)event->y;
00079 if (y >= view->ctrl->settings.getScreenHeight()) return FALSE;
00080
00081 if (view->isPanEnable())
00082 {
00083
00084 view->initPan(x, y);
00085 }
00086 else if (view->isZoomInEnable() ||
00087 view->isZoomOutEnable())
00088 {
00089 view->initZoomRect(x, y);
00090 }
00091 else if (view->isScribbleEnable())
00092 {
00093
00094 int ox, oy;
00095 int px, py;
00096 int pn = hitTest(x, y, ox, oy);
00097
00098
00099 getPageScreenPosition(pn, px, py);
00100 view->ctrl->scbMgr.onScribblePress(pn, view->ctrl, px, py, x, y, ox, oy);
00101 }
00102 else if (view->isEraseEnable())
00103 {
00104 int ox, oy;
00105 int pn = hitTest(x, y, ox, oy);
00106
00107 if (view->isPageMode())
00108 {
00109 x = layout.getVirtualScreen().left;
00110 y = layout.getVirtualScreen().top;
00111 }
00112 else
00113 {
00114 rectangle rect;
00115 layout.getPageRect(pn, rect);
00116 x = rect.left - view->ctrl->settings.getScreenX();
00117 y = rect.top - view->ctrl->settings.getScreenY();
00118 }
00119 view->ctrl->scbMgr.onErasePress(pn, view->ctrl,
00120 x, y, ox, oy);
00121 }
00122
00123 return FALSE;
00124 }
00125
00126 gboolean CPDFPortraitView::buttonReleaseCbk(GdkEventButton *event)
00127 {
00128 if (!isReady())
00129 {
00130 PV_LOGPRINTF("Not allow to handle mouse event now!");
00131 return FALSE;
00132 }
00133
00134 int x = (int)event->x;
00135 int y = (int)event->y;
00136 if (y >= view->ctrl->settings.getScreenHeight()) return FALSE;
00137
00138 if (view->isScribbleEnable())
00139 {
00140
00141 int ox, oy;
00142 int px, py;
00143
00144
00145 int pn = hitTest(x, y, ox, oy);
00146
00147
00148 getPageScreenPosition(pn, px, py);
00149 view->ctrl->scbMgr.onScribbleRelease(pn, view->ctrl, px, py, x, y, ox, oy);
00150 return FALSE;
00151 }
00152 else if (view->isEraseEnable())
00153 {
00154 int ox, oy;
00155 int pn = hitTest(x, y, ox, oy);
00156 if (view->isPageMode())
00157 {
00158 x = layout.getVirtualScreen().left;
00159 y = layout.getVirtualScreen().top;
00160 }
00161 else
00162 {
00163 rectangle rect;
00164 layout.getPageRect(pn, rect);
00165 x = rect.left - view->ctrl->settings.getScreenX();
00166 y = rect.top - view->ctrl->settings.getScreenY();
00167 }
00168 view->ctrl->scbMgr.onEraseRelease(pn, view->ctrl, x, y, ox, oy);
00169 return FALSE;
00170 }
00171
00172
00173 if (view->isSmallOffset(x, y))
00174 {
00175 PV_LOGPRINTF("Small Offset!");
00176 if (view->isPageMode())
00177 {
00178 if (doLinkPageMode(x, y))
00179 return FALSE;
00180 }
00181 else
00182 {
00183 if (doLinkContinousMode(x, y))
00184 return FALSE;
00185 }
00186 PV_LOGPRINTF("Seems no link!");
00187 }
00188 if (view->isPanEnable())
00189 {
00190
00191 int deltaX = view->panPt.x - x;
00192 int deltaY = view->panPt.y - y;
00193 if (view->isPageMode())
00194 {
00195 view->ctrl->settings.moveScreenX(-deltaX);
00196 view->ctrl->settings.moveScreenY(-deltaY);
00197 }
00198 else
00199 {
00200 view->ctrl->settings.moveScreenX(deltaX);
00201 view->ctrl->settings.moveScreenY(deltaY);
00202 }
00203 validatePosition();
00204 displayPage(view->ctrl->settings.getCurrentPage(), ScrollToPosition);
00205 return FALSE;
00206 }
00207 else if (view->isZoomInEnable())
00208 {
00209 view->adjustZoomRect(x, y);
00210 zoomFromRect(view->zoomRect.left,
00211 view->zoomRect.top,
00212 view->zoomRect.right,
00213 view->zoomRect.bottom);
00214
00215 }
00216 else if (view->isZoomOutEnable())
00217 {
00218 view->adjustZoomRect(x, y);
00219 zoomToRect(view->zoomRect.left,
00220 view->zoomRect.top,
00221 view->zoomRect.right,
00222 view->zoomRect.bottom);
00223 }
00224 return FALSE;
00225 }
00226
00227 gboolean CPDFPortraitView::motionNotifyCbk(GdkEventMotion *event)
00228 {
00229 if (!isReady())
00230 {
00231 PV_LOGPRINTF("Not allow to handle mouse event now!");
00232 return FALSE;
00233 }
00234
00235 int x = (int)event->x;
00236 int y = (int)event->y;
00237 if (y >= view->ctrl->settings.getScreenHeight())
00238 {
00239 PV_LOGPRINTF("Not allow to handle mouse event now!");
00240 return FALSE;
00241 }
00242
00243 if (view->isPanEnable())
00244 {
00245 return FALSE;
00246 }
00247 else if (view->isZoomInEnable() ||
00248 view->isZoomOutEnable())
00249 {
00250 view->adjustZoomRect(x, y);
00251 }
00252 else if (view->isScribbleEnable())
00253 {
00254
00255 int ox, oy;
00256 int px, py;
00257 int pn = hitTest(x, y, ox, oy);
00258
00259
00260 getPageScreenPosition(pn, px, py);
00261 view->ctrl->scbMgr.onScribbleMove(pn, view->ctrl, px, py,
00262 x, y, ox, oy);
00263 }
00264 else if (view->isEraseEnable())
00265 {
00266 int ox, oy;
00267 int pn = hitTest(x, y, ox, oy);
00268 getPageScreenPosition(pn, x, y);
00269 view->ctrl->scbMgr.onEraseMove(pn, view->ctrl,
00270 x, y, ox, oy);
00271 }
00272 return FALSE;
00273 }
00274
00275 gboolean CPDFPortraitView::keyPressCbk(GdkEventKey *event)
00276 {
00277 if (event->time == 0)
00278 {
00279 onPageRendered(event->state);
00280 return FALSE;
00281 }
00282
00283 switch (event->keyval)
00284 {
00285 case GDK_Home:
00286 displayPage(1);
00287 break;
00288 case GDK_F5:
00289 view->quit();
00290 break;
00291 case GDK_Page_Up:
00292 view->ctrl->settings.setRenderDir(RenderPrev);
00293 if (view->ctrl->settings.getCurrentPage() <= 1)
00294 {
00295 displayPage(1, ScrollToPrevPage);
00296 }
00297 else
00298 {
00299 displayPage(view->ctrl->settings.getCurrentPage() - 1, ScrollToPrevPage);
00300 }
00301 break;
00302 case GDK_Page_Down:
00303 view->ctrl->settings.setRenderDir(RenderNext);
00304 if (view->ctrl->settings.getCurrentPage() >= view->ctrl->core->getNumPages())
00305 {
00306 displayPage(view->ctrl->settings.getCurrentPage(), ScrollToNextPage);
00307 }
00308 else
00309 {
00310 displayPage(view->ctrl->settings.getCurrentPage() + 1, ScrollToNextPage);
00311 }
00312 break;
00313 case GDK_F1:
00314 view->ctrl->settings.setRenderDir(RenderNext);
00315 if (view->ctrl->settings.getCurrentPage() + JumpWidth > view->ctrl->core->getNumPages())
00316 {
00317 displayPage(view->ctrl->core->getNumPages());
00318 }
00319 else
00320 {
00321 displayPage(view->ctrl->settings.getCurrentPage() + JumpWidth, ScrollToNextPages);
00322 }
00323 break;
00324 case GDK_F2:
00325 view->ctrl->settings.setRenderDir(RenderPrev);
00326 if ((view->ctrl->settings.getCurrentPage() - JumpWidth) < 1)
00327 {
00328 displayPage(1);
00329 }
00330 else
00331 {
00332 displayPage(view->ctrl->settings.getCurrentPage() - JumpWidth, ScrollToPrevPages);
00333 }
00334 break;
00335 default:
00336 view->ctrl->channels.busy_off();
00337 break;
00338 }
00339 return FALSE;
00340
00341 }
00342
00343 gboolean CPDFPortraitView::deleteCbk(GdkEvent *event)
00344 {
00345 return TRUE;
00346 }
00347
00348 void CPDFPortraitView::getPageScreenPosition(const int pn, int & x, int & y)
00349 {
00350 if (view->isPageMode())
00351 {
00352 x = layout.getVirtualScreen().left;
00353 y = layout.getVirtualScreen().top;
00354 }
00355 else
00356 {
00357 rectangle rect;
00358 layout.getPageRect(pn, rect);
00359 x = rect.left - view->ctrl->settings.getScreenX();
00360 y = rect.top - view->ctrl->settings.getScreenY();
00361 }
00362 }
00363
00364 void CPDFPortraitView::onPageRendered(const int pageNumber)
00365 {
00366
00367 if (list.remove(pageNumber))
00368 {
00369 if (list.isEmpty())
00370 {
00371 drawPages(nStart, nEnd);
00372 }
00373 }
00374 }
00375
00376 void CPDFPortraitView::ipcCbk(gint * fd, GdkInputCondition id)
00377 {
00378 char szBuffer[IPC_BUF_MAX];
00379 int nBuf = IPC_BUF_MAX;
00380 erIpcCmd_t command;
00381 erServerChannel_t channel = view->ctrl->channels.erIpcChannel;
00382 erIpcGetMessage(channel, szBuffer, &nBuf);
00383 if (vwrParseCommand(szBuffer, &command) >= 0)
00384 {
00385 switch (command.cc)
00386 {
00387 case ccVwrJumpToPage:
00388 {
00389 int pg = atoi(command.arg[1]);
00390
00391
00392 if (pg < view->ctrl->settings.getCurrentPage())
00393 {
00394 if (pg <= 1)
00395 {
00396 view->ctrl->settings.setRenderDir(RenderNext);
00397 }
00398 else
00399 {
00400 view->ctrl->settings.setRenderDir(RenderPrev);
00401 }
00402 }
00403 else if (pg > view->ctrl->settings.getCurrentPage())
00404 {
00405 if (pg >= view->ctrl->core->getNumPages())
00406 {
00407 view->ctrl->settings.setRenderDir(RenderPrev);
00408 }
00409 else
00410 {
00411 view->ctrl->settings.setRenderDir(RenderNext);
00412 }
00413 }
00414
00415 displayPage(pg);
00416 break;
00417 }
00418 case ccVwrToolbar:
00419 {
00420
00421 if (!isReady())
00422 {
00423 PV_TBPRINTF("Not allow to handle it during rendering!");
00424 return;
00425 }
00426 PV_TBPRINTF("Received toolbar message!");
00427
00428 int iconID = atoi(command.arg[0]);
00429 int state = atoi(command.arg[1]);
00430 if (view->ctrl->channels.onReceiveToolbarMsg(iconID, state))
00431 {
00432 view->ctrl->channels.setToolbarUpdateType(dmQTyping);
00433 view->ctrl->channels.redrawToolbar();
00434 }
00435
00436 if (iconID == iconID_zoomfit)
00437 {
00438 if (view->isPageMode())
00439 {
00440 zoomFitPageMode();
00441 }
00442 else if (view->isContinousMode())
00443 {
00444 zoomFitContinousMode();
00445 }
00446 }
00447 else if (iconID == iconID_portrait_landscape ||
00448 iconID == iconID_landscape_portrait)
00449 {
00450 view->ctrl->channels.setRotateState(RotateDirty);
00451 if (view->isPageMode())
00452 {
00453 view->rotatePageMode(-90);
00454 }
00455 else
00456 {
00457 view->rotateContinousMode(-90);
00458 }
00459 }
00460 else if (iconID == iconID_page_mode ||
00461 iconID == iconID_continuous_mode)
00462 {
00463 switchMode();
00464 }
00465 else if (iconID == iconID_zoomback)
00466 {
00467 zoomBack();
00468 }
00469 else if (iconID == iconID_back)
00470 {
00471 backward();
00472 }
00473 else if (iconID == iconID_forward)
00474 {
00475 forward();
00476 }
00477 else if (view->ctrl->scbMgr.isEraseDirty())
00478 {
00479 if (view->ctrl->channels.isScribbleIcon(iconID) ||
00480 iconID == iconID_pan ||
00481 iconID == iconID_zoomin)
00482 {
00483
00484 view->ctrl->scbMgr.setEraseDirty(gFalse);
00485 view->ctrl->channels.setToolbarUpdateType(dmQFull);
00486 if (iconID == iconID_zoomin)
00487 {
00488 view->ctrl->channels.setZoomIn(3);
00489 }
00490 view->displayPage(view->ctrl->settings.getCurrentPage(), ScrollRedraw);
00491 }
00492 }
00493 break;
00494 }
00495 case ccVwrToolbarSync:
00496 {
00497
00498 if (view->ctrl->channels.getToolbarUpdateType() == dmQTyping)
00499 {
00500 PV_TBPRINTF("Toolbar sync typing!");
00501 view->refreshDeviceScreen(dmQTyping, gFalse);
00502 view->ctrl->channels.setToolbarDirty(gFalse);
00503 view->ctrl->channels.setToolbarUpdateType(dmQUndefined);
00504 }
00505 else if (view->ctrl->channels.getToolbarUpdateType() == dmQFull)
00506 {
00507 PV_TBPRINTF("Toolbar sync full update!");
00508 --view->ctrl->updateReq;
00509 if (view->ctrl->updateReq <= 0)
00510 {
00511 view->refreshDeviceScreen(dmQFull);
00512 view->ctrl->updateReq = 0;
00513 }
00514 view->ctrl->channels.setToolbarDirty(gFalse);
00515 view->ctrl->channels.setToolbarUpdateType(dmQUndefined);
00516 }
00517 PV_TBPRINTF("Receive toolbar sync %d!", view->ctrl->updateReq);
00518 break;
00519 }
00520 case ccVwrPagebarSync:
00521 {
00522 --view->ctrl->updateReq;
00523 if (view->ctrl->updateReq <= 0)
00524 {
00525 view->refreshDeviceScreen(dmQFull);
00526 view->ctrl->updateReq = 0;
00527 }
00528 PV_TBPRINTF("Receive pageBar sync %d!", view->ctrl->updateReq );
00529 break;
00530 }
00531 default:
00532 break;
00533 }
00534 }
00535 }
00536
00538
00539
00540
00541 void CPDFPortraitView::displayPage(const int pageNumber, const ContinousModeScroll scroll)
00542 {
00543
00544 if (pageNumber <= 0 ||
00545 pageNumber > view->ctrl->core->getNumPages())
00546 {
00547 PV_ERRORPRINTF("Invalid page number %d!", pageNumber);
00548 view->ctrl->channels.busy_off();
00549 return;
00550 }
00551
00552
00553 setReady(gFalse);
00554
00555 if (view->isPageMode())
00556 {
00557
00558 view->ctrl->settings.setCurrentPage(pageNumber);
00559
00560
00561 displayPages(pageNumber, pageNumber);
00562 }
00563 else if (view->isContinousMode())
00564 {
00565
00566 int start = pageNumber, end = pageNumber;
00567 getPagesRange(start, end, pageNumber, scroll);
00568
00569
00570 PV_LOGPRINTF("Visible page range [%d, %d] current page %d", start, end,
00571 view->ctrl->settings.getCurrentPage());
00572
00573
00574 displayPages(start, end);
00575 }
00576 }
00577
00579
00581 void CPDFPortraitView::displayPages(const int start, const int end)
00582 {
00583
00584 view->ctrl->channels.busy_blink();
00585
00586
00587 nStart = start, nEnd = end;
00588
00589
00590 GBool bRendering = gFalse;
00591
00592
00593 list.clear();
00594
00595
00596 for(int i = start; i <= end; ++i)
00597 {
00598 if (i >= 1 && i <= view->ctrl->core->getNumPages())
00599 {
00600 CPageInfo info;
00601 info.pageNumber = i;
00602 info.pageZoom = view->ctrl->calZoom(i);
00603 info.rotate = view->ctrl->settings.getRotate();
00604 CPageInfo * page = view->ctrl->pageList.checkPage(info);
00605 if (NULL == page)
00606 {
00607 TodoItem * item = new TodoItem;
00608 item->pageNumber = info.pageNumber;
00609 item->rotate = info.rotate;
00610 item->zoom = info.pageZoom;
00611 item->timeStamp = view->ctrl->getTimeStamp();
00612 if (view->ctrl->thread.isInRendering(item))
00613 {
00614 bRendering = gTrue;
00615 item->timeStamp = 0;
00616 }
00617 list.add(item);
00618 }
00619 }
00620 }
00621
00622
00623 if (list.isEmpty())
00624 {
00625 drawPages(start, end);
00626 }
00627 else
00628 {
00629 if (bRendering)
00630 {
00631 list.issueItems(view);
00632 }
00633 else
00634 {
00635 list.renderItems(view);
00636 }
00637 }
00638 }
00639
00641
00642 void CPDFPortraitView::zoomBack()
00643 {
00644 if (!view->ctrl->settings.zoomBack())
00645 {
00646 return;
00647 }
00648
00649 init();
00650
00651 displayPage(view->ctrl->settings.getCurrentPage(), ScrollToPosition);
00652 }
00653
00654 void CPDFPortraitView::backward()
00655 {
00656
00657 HistoryItemPtr ptr = view->ctrl->settings.goBackward();
00658 if (ptr)
00659 {
00660 displayPage(view->ctrl->settings.getCurrentPage(), ScrollToPage);
00661 }
00662 }
00663
00664 void CPDFPortraitView::forward()
00665 {
00666
00667 HistoryItemPtr ptr = view->ctrl->settings.goForward();
00668 if (ptr)
00669 {
00670 displayPage(view->ctrl->settings.getCurrentPage(), ScrollToPage);
00671 }
00672 }
00673
00674 void CPDFPortraitView::drawPages(const int start, const int end)
00675 {
00676
00677 updatePagebar();
00678
00679
00680 CPageInfo * page = view->ctrl->pageList.getPage(view->ctrl->settings.getCurrentPage());
00681 updateToolbar(page);
00682
00683 #if (PV_PROFILE_ON)
00684 int t1 = view->ctrl->getHighTimeStamp();
00685 #endif
00686
00687
00688 view->ctrl->gtkMgr.clearBkground();
00689
00690 for(int i = start; i <= end; ++i)
00691 {
00692
00693 page = view->ctrl->pageList.getPage(i);
00694 if (page)
00695 {
00696 drawPageImage(page);
00697 }
00698 }
00699
00700
00701 XSync(view->ctrl->gtkMgr.display, gTrue);
00702
00703 #if (PV_PROFILE_ON)
00704 int t2 = view->ctrl->getHighTimeStamp();
00705 PV_DUMP("\ndrawImage and XSync time %d\n", t2 - t1);
00706 #endif
00707
00708
00709 if (view->ctrl->updateReq <= 0)
00710 {
00711 view->refreshDeviceScreen(dmQFull);
00712 view->ctrl->updateReq = 0;
00713 }
00714
00715
00716 setReady();
00717
00718
00719 view->issueNewRequests();
00720 }
00721
00723
00724
00725
00726 void CPDFPortraitView::getPagesRange(int & start, int & end, const int pageNumber, const ContinousModeScroll scroll)
00727 {
00728 rectangle rect;
00729 if (scroll == ScrollToPage)
00730 {
00731 layout.getPageRect(pageNumber,rect);
00732 rect.bottom = rect.top + view->ctrl->settings.getScreenHeight();
00733 view->ctrl->settings.setScreenY(rect.top);
00734 view->ctrl->settings.setCurrentPage(layout.getPagesVisible(start, end, rect));
00735 return;
00736 }
00737
00738 if (scroll == ScrollToNextPage)
00739 {
00740 view->ctrl->settings.moveScreenY(view->ctrl->settings.getScreenHeight() - PageRepeat);
00741 validatePosition();
00742 view->ctrl->settings.getScreenRect(rect);
00743 view->ctrl->settings.setCurrentPage(layout.getPagesVisible(start, end, rect));
00744 return;
00745 }
00746
00747 if (scroll == ScrollToPrevPage)
00748 {
00749 view->ctrl->settings.moveScreenY(PageRepeat - view->ctrl->settings.getScreenHeight());
00750 validatePosition();
00751 view->ctrl->settings.getScreenRect(rect);
00752 view->ctrl->settings.setCurrentPage(layout.getPagesVisible(start, end, rect));
00753 return;
00754 }
00755
00756 if (scroll == ScrollToPosition)
00757 {
00758
00759 validatePosition();
00760 view->ctrl->settings.getScreenRect(rect);
00761
00762
00763 int n = layout.getPagesVisible(start, end, rect);
00764 if (n < view->ctrl->settings.getCurrentPage())
00765 {
00766 view->ctrl->settings.setRenderDir(RenderPrev);
00767 }
00768 else
00769 {
00770 view->ctrl->settings.setRenderDir(RenderNext);
00771 }
00772 view->ctrl->settings.setCurrentPage(n);
00773 return;
00774 }
00775
00776 if (scroll == ScrollToNextPages)
00777 {
00778 view->ctrl->settings.moveScreenY(view->ctrl->settings.getScreenHeight() * JumpWidth);
00779 validatePosition();
00780 view->ctrl->settings.getScreenRect(rect);
00781 view->ctrl->settings.setCurrentPage(layout.getPagesVisible(start, end, rect));
00782 return;
00783 }
00784
00785 if (scroll == ScrollToPrevPages)
00786 {
00787 view->ctrl->settings.moveScreenY(- JumpWidth * view->ctrl->settings.getScreenHeight());
00788 validatePosition();
00789 view->ctrl->settings.getScreenRect(rect);
00790 view->ctrl->settings.setCurrentPage(layout.getPagesVisible(start, end, rect));
00791 return;
00792 }
00793
00794 if (scroll == ScrollRedraw)
00795 {
00796 start = nStart; end = nEnd;
00797 }
00798 }
00799
00800 void CPDFPortraitView::drawPageImage(CPageInfo *page)
00801 {
00802
00803 page->timestamp = view->ctrl->getTimeStamp();
00804
00805
00806 int x = view->ctrl->settings.getScreenX();
00807 int y = view->ctrl->settings.getScreenY();
00808
00809
00810 if (view->isPageMode())
00811 {
00812 if (page->bitmap->getWidth() <= view->ctrl->settings.getScreenWidth() ||
00813 view->ctrl->settings.getZoom() == ZoomPage)
00814 {
00815 x = ((view->ctrl->settings.getScreenWidth() - page->bitmap->getWidth()) >> 1);
00816 view->ctrl->settings.setScreenX(x);
00817 }
00818 layout.updatePageRect(x, y, page->bitmap->getWidth(), page->bitmap->getHeight());
00819 }
00820 else if (view->isContinousMode())
00821 {
00822 rectangle rect;
00823 layout.getPageRect(page->pageNumber, rect);
00824 x = rect.left - view->ctrl->settings.getScreenX();
00825 y = rect.top - view->ctrl->settings.getScreenY();
00826 }
00827
00828
00829 view->ctrl->gtkMgr.drawImage(page->bitmap,
00830 0, 0,
00831 x, y,
00832 page->bitmap->getWidth(), page->bitmap->getHeight(),
00833 view->isContinousMode());
00834
00835
00836 drawScribble(x, y, page->pageNumber);
00837 }
00838
00839 void CPDFPortraitView::updateToolbar(CPageInfo *page)
00840 {
00841 GBool bDirty = gFalse;
00842
00843
00844 rectangle rect;
00845 int w = page->bitmap->getWidth();
00846 int h = page->bitmap->getHeight();
00847 layout.getVirtualScreen(rect);
00848 if (view->isPageMode() &&
00849 w <= view->ctrl->settings.getScreenWidth() &&
00850 h <= view->ctrl->settings.getScreenHeight() &&
00851 view->ctrl->settings.getScreenX() >= 0 &&
00852 view->ctrl->settings.getScreenY() >= 0 &&
00853 view->ctrl->settings.getScreenX() + w <= view->ctrl->settings.getScreenWidth() &&
00854 view->ctrl->settings.getScreenY() + h <= view->ctrl->settings.getScreenHeight())
00855 {
00856 if (view->ctrl->channels.getPanState() != iconState_grey)
00857 {
00858 bDirty = gTrue;
00859 view->ctrl->channels.setPanState(iconState_grey);
00860 }
00861 }
00862 else if (view->isContinousMode() &&
00863 rect.right - rect.left <= view->ctrl->settings.getScreenWidth() &&
00864 rect.bottom - rect.top <= view->ctrl->settings.getScreenHeight() &&
00865 view->ctrl->channels.getPanState() != iconState_grey)
00866 {
00867 bDirty = gTrue;
00868 view->ctrl->channels.setPanState(iconState_grey);
00869 }
00870 else
00871 {
00872 if (view->ctrl->channels.getPanState() == iconState_grey)
00873 {
00874 bDirty = gTrue;
00875 view->ctrl->channels.setPanState(iconState_normal);
00876 }
00877 }
00878
00879
00880 double z = page->calZoom();
00881 if (z >= view->ctrl->core->getZoomMax(page->pageNumber))
00882 {
00883 if (view->ctrl->channels.getZoomInState() != iconState_grey)
00884 {
00885 bDirty = gTrue;
00886 view->ctrl->channels.setZoomIn(iconState_grey);
00887 }
00888 }
00889 else
00890 {
00891 if (view->ctrl->channels.getZoomInState() == iconState_grey ||
00892 view->ctrl->channels.getZoomInState() == iconState_selected)
00893 {
00894 bDirty = gTrue;
00895 view->ctrl->channels.setZoomIn(iconState_normal);
00896 }
00897 else if (view->ctrl->channels.getZoomInState() == 3)
00898 {
00899 view->ctrl->channels.setZoomIn(iconState_selected);
00900 }
00901 }
00902
00903
00904 if (view->ctrl->channels.getZoombackState() != view->ctrl->settings.getZoomBackState())
00905 {
00906 bDirty = gTrue;
00907 view->ctrl->channels.setZoombackState(view->ctrl->settings.getZoomBackState());
00908 }
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931 if (view->ctrl->channels.getRotateState() != PortraitToLandscape)
00932 {
00933 bDirty = gTrue;
00934 view->ctrl->channels.setRotateState(PortraitToLandscape);
00935 }
00936
00937
00938 if (view->ctrl->channels.getContinousState() == iconState_normal &&
00939 view->isContinousMode())
00940 {
00941 bDirty = gTrue;
00942 view->ctrl->channels.setContinousState(3);
00943 }
00944 else if (view->ctrl->channels.getContinousState() == 3 &&
00945 view->isPageMode())
00946 {
00947 bDirty = gTrue;
00948 view->ctrl->channels.setContinousState(iconState_normal);
00949 }
00950
00951
00952 if (view->ctrl->channels.getBackwardState() == iconState_grey &&
00953 view->ctrl->settings.canGoBack())
00954 {
00955 bDirty = gTrue;
00956 view->ctrl->channels.setBackwardState(iconState_normal);
00957 }
00958 else if (view->ctrl->channels.getBackwardState() == iconState_normal &&
00959 !view->ctrl->settings.canGoBack())
00960 {
00961 bDirty = gTrue;
00962 view->ctrl->channels.setBackwardState(iconState_grey);
00963 }
00964
00965
00966 if (view->ctrl->channels.getForwardState() == iconState_grey &&
00967 view->ctrl->settings.canGoForward())
00968 {
00969 bDirty = gTrue;
00970 view->ctrl->channels.setForwardState(iconState_normal);
00971 }
00972 else if (view->ctrl->channels.getForwardState() == iconState_normal &&
00973 !view->ctrl->settings.canGoForward())
00974 {
00975 bDirty = gTrue;
00976 view->ctrl->channels.setForwardState(iconState_grey);
00977 }
00978
00979
00980 if (bDirty)
00981 {
00982 view->ctrl->channels.setToolbarDirty();
00983 view->ctrl->channels.setToolbarUpdateType(dmQFull);
00984 view->ctrl->updateReq++;
00985 PV_LOGPRINTF("updateReq %d", view->ctrl->updateReq);
00986 view->ctrl->channels.redrawToolbar();
00987 }
00988 else
00989 {
00990 view->ctrl->channels.setToolbarDirty(gFalse);
00991 view->ctrl->channels.setToolbarUpdateType(dmQUndefined);
00992 }
00993 }
00994
00995 void CPDFPortraitView::updatePagebar()
00996 {
00997
00998 view->ctrl->updateReq++;
00999 PV_LOGPRINTF("updateReq %d", view->ctrl->updateReq);
01000 view->ctrl->channels.pagebar_set_current_page(view->ctrl->settings.getCurrentPage());
01001
01002 }
01003
01005
01006
01007
01008
01009
01010
01011 void CPDFPortraitView::zoomFromRect(int left, int top, int right, int bottom)
01012 {
01013 rectangle rect;
01014 rect.left = left; rect.top = top; rect.right = right; rect.bottom = bottom;
01015 rect.normalize();
01016 if (view->isPageMode())
01017 {
01018 zoomFromRectPageMode(rect);
01019 }
01020 else if (view->isContinousMode())
01021 {
01022 zoomFromRectContinousMode(rect);
01023 }
01024 }
01025
01026 void CPDFPortraitView::zoomFromRectPageMode(rectangle & rect)
01027 {
01028
01029 double ratio = 1.0, max = 1.0, z = 1.0, tmp = 1.0;
01030
01031
01032 CPageInfo * page = view->ctrl->pageList.getPage(view->ctrl->settings.getCurrentPage());
01033 max = view->ctrl->core->getZoomMax(page->pageNumber);
01034 z = page->calZoom();
01035 ratio = view->calRatio(rect);
01036
01037
01038
01039 tmp = z * ratio;
01040 if (tmp >= max)
01041 {
01042 view->ctrl->settings.setNewZoom(max);
01043 ratio = max / z;
01044 }
01045 else if (tmp <= ZoomMin)
01046 {
01047 view->ctrl->settings.setNewZoom(ZoomMin);
01048 ratio = ZoomMin / z;
01049 }
01050 else
01051 {
01052 view->ctrl->settings.setNewZoom(tmp);
01053 }
01054
01055
01056 adjustPositionPageMode(rect, ratio);
01057
01058
01059 displayPage(view->ctrl->settings.getCurrentPage());
01060 }
01061
01063
01064
01065
01066
01067 void CPDFPortraitView::zoomFromRectContinousMode(rectangle &rect)
01068 {
01069
01070 double ratio = 1.0, max = 1.0, min = 99999.0, z = 1.0, tmp = 1.0;
01071
01072
01073 layout.screenToVirtualScreen(view->ctrl, rect);
01074
01075
01076 int pn = nStart;
01077 CPageInfo * page = NULL;
01078 while (pn <= nEnd)
01079 {
01080 tmp = view->ctrl->core->getZoomMax(pn);
01081 if (max < tmp) max = tmp;
01082
01083
01084 page = view->ctrl->pageList.getPage(pn);
01085 tmp = page->calZoom();
01086 if (min > tmp) min = tmp;
01087 ++pn;
01088 }
01089 z = min;
01090 ratio = view->calRatio(rect);
01091
01092
01093
01094 tmp = z * ratio;
01095 if (tmp >= max)
01096 {
01097 view->ctrl->settings.setNewZoom(max);
01098 ratio = max / z;
01099 }
01100 else if (tmp <= ZoomMin)
01101 {
01102 view->ctrl->settings.setNewZoom(ZoomMin);
01103 ratio = ZoomMin / z;
01104 }
01105 else
01106 {
01107 view->ctrl->settings.setNewZoom(tmp);
01108 }
01109
01110
01111 init();
01112
01113
01114 adjustPositionContinousMode(rect, ratio);
01115
01116
01117 displayPage(view->ctrl->settings.getCurrentPage(), ScrollToPosition);
01118 }
01119
01120 void CPDFPortraitView::zoomToRect(int left, int top, int right, int bottom)
01121 {
01122
01123
01124
01125
01126
01127
01128
01129
01130
01131
01132
01133
01134
01135
01136
01137
01138
01139
01140
01141
01142
01143
01144
01145
01146
01147
01148
01149
01150
01151
01152
01153
01154
01155
01156
01157
01158
01159
01160
01161
01162
01163
01164 }
01165
01167
01168 void CPDFPortraitView::adjustPositionPageMode( const rectangle & oldRect, double ratio)
01169 {
01170
01171 int offsetX = 0, offsetY = 0;
01172 point oldCenter, newCenter;
01173 oldCenter.x = (oldRect.left + oldRect.right) / 2;
01174 oldCenter.y = (oldRect.top + oldRect.bottom) / 2;
01175 offsetX = oldCenter.x - view->ctrl->settings.getScreenX();
01176 offsetY = oldCenter.y - view->ctrl->settings.getScreenY();
01177
01178
01179 rectangle newRect;
01180 int width = (int)((double)(oldRect.right - oldRect.left) * ratio);
01181 int height = (int)((double)(oldRect.bottom - oldRect.top) * ratio);
01182 newRect.left = (view->ctrl->settings.getScreenWidth() - width) / 2;
01183 newRect.right = newRect.left + width;
01184 newRect.top = (view->ctrl->settings.getScreenHeight() - height) /2;
01185 newRect.bottom = newRect.top + height;
01186
01187
01188 newCenter.x = (newRect.left + newRect.right) / 2;
01189 if (SmallNone != view->lessThreshold(oldRect))
01190 {
01191 newCenter.y = oldCenter.y - (int)((double)offsetY * ratio);
01192 }
01193 else
01194 {
01195 newCenter.y = (newRect.top + newRect.bottom) / 2;
01196 newCenter.y -= (int)((double)offsetY * ratio);
01197 }
01198
01199 view->ctrl->settings.setScreenX(newCenter.x - (int)((double)offsetX * ratio));
01200 view->ctrl->settings.setScreenY(newCenter.y);
01201 }
01202
01204
01205 void CPDFPortraitView::adjustPositionContinousMode(const rectangle & oldRect, double ratio)
01206 {
01207
01208 int x = 0, y = 0, offset = 0;
01209 point oldCenter, newCenter;
01210 oldCenter.x = (oldRect.left + oldRect.right) / 2;
01211 oldCenter.y = (oldRect.top + oldRect.bottom) / 2;
01212 offset = oldCenter.y - view->ctrl->settings.getScreenY();
01213 x = (int)((double)oldCenter.x * ratio);
01214 y = (int)((double)oldCenter.y * ratio);
01215
01216
01217 newCenter.x = x - view->ctrl->settings.getScreenWidth() / 2;
01218 if (SmallNone == view->lessThreshold(oldRect))
01219 {
01220 newCenter.y = y - view->ctrl->settings.getScreenHeight() / 2;
01221 }
01222 else
01223 {
01224 newCenter.y = y - offset;
01225 }
01226
01227
01228 view->ctrl->settings.setScreenX(newCenter.x);
01229 view->ctrl->settings.setScreenY(newCenter.y);
01230 }
01231
01233
01234
01235 void CPDFPortraitView::validatePosition()
01236 {
01237 rectangle rect;
01238 int w = 0;
01239 layout.getVirtualScreen(rect);
01240 if (view->isContinousMode())
01241 {
01242 w = rect.right - rect.left;
01243 if (view->ctrl->settings.getScreenY() < rect.top + Margin)
01244 {
01245 view->ctrl->settings.setScreenY(rect.top + Margin);
01246 }
01247 else if (view->ctrl->settings.getScreenY() >
01248 rect.bottom - view->ctrl->settings.getScreenHeight() - Margin)
01249 {
01250 view->ctrl->settings.setScreenY(rect.bottom - view->ctrl->settings.getScreenHeight() - Margin);
01251 }
01252
01253 if (w > view->ctrl->settings.getScreenWidth())
01254 {
01255 if (view->ctrl->settings.getScreenX() < rect.left + Margin)
01256 {
01257 view->ctrl->settings.setScreenX(rect.left + Margin);
01258 }
01259 else if (view->ctrl->settings.getScreenX() + view->ctrl->settings.getScreenWidth() > rect.right - Margin)
01260 {
01261 view->ctrl->settings.setScreenX(rect.right - view->ctrl->settings.getScreenWidth() - Margin);
01262 }
01263 }
01264 else
01265 {
01266 view->ctrl->settings.setScreenX((w - view->ctrl->settings.getScreenWidth()) / 2);
01267 }
01268 }
01269 else if (view->isPageMode())
01270 {
01271
01272 w = rect.right - rect.left;
01273 int h = rect.bottom - rect.top;
01274 if ( h > view->ctrl->settings.getScreenHeight())
01275 {
01276 if (view->ctrl->settings.getScreenY() < view->ctrl->settings.getScreenHeight() - h + Margin)
01277 {
01278 view->ctrl->settings.setScreenY(view->ctrl->settings.getScreenHeight() - h + Margin);
01279 }
01280 else if (view->ctrl->settings.getScreenY() > -Margin)
01281 {
01282 view->ctrl->settings.setScreenY(-Margin);
01283 }
01284 }
01285 else
01286 {
01287 view->ctrl->settings.setScreenY((view->ctrl->settings.getScreenHeight() - h) /2 );
01288 }
01289
01290 if (w > view->ctrl->settings.getScreenWidth())
01291 {
01292 if (view->ctrl->settings.getScreenX() < view->ctrl->settings.getScreenWidth() - w + Margin)
01293 {
01294 view->ctrl->settings.setScreenX(view->ctrl->settings.getScreenWidth() - w + Margin);
01295 }
01296 else if (view->ctrl->settings.getScreenX() > -Margin)
01297 {
01298 view->ctrl->settings.setScreenX(-Margin);
01299 }
01300 }
01301 else
01302 {
01303 view->ctrl->settings.setScreenX((view->ctrl->settings.getScreenWidth() - w) / 2);
01304 }
01305 }
01306 }
01307
01308 void CPDFPortraitView::switchMode()
01309 {
01310
01311 if (view->isPageMode())
01312 {
01313
01314 view->setContinousMode();
01315
01316
01317 init();
01318
01319
01320 rectangle rect;
01321 layout.getPageRect(view->ctrl->settings.getCurrentPage(), rect);
01322 int x = view->ctrl->settings.getScreenX();
01323 view->ctrl->settings.setScreenX(rect.left - x);
01324 }
01325 else if (view->isContinousMode())
01326 {
01327
01328 view->setPageMode();
01329
01330
01331 view->ctrl->settings.setScreenY(0);
01332 rectangle rect;
01333 layout.getPageRect(view->ctrl->settings.getCurrentPage(), rect);
01334 int x = view->ctrl->settings.getScreenX();
01335 view->ctrl->settings.setScreenX(rect.left - x);
01336 }
01337
01338
01339 view->ctrl->settings.disableZoomBack();
01340
01341 displayPage(view->ctrl->settings.getCurrentPage());
01342 }
01343
01345
01346 void CPDFPortraitView::zoomFitPageMode()
01347 {
01348
01349 view->ctrl->settings.setNewZoom(ZoomPage);
01350 view->ctrl->settings.setScreenX(0);
01351 view->ctrl->settings.setScreenY(0);
01352 displayPage(view->ctrl->settings.getCurrentPage());
01353 }
01354
01356
01357 void CPDFPortraitView::zoomFitContinousMode()
01358 {
01359
01360 double oldZoom = view->ctrl->calZoom(view->ctrl->settings.getCurrentPage());
01361 view->ctrl->settings.setZoom(ZoomPage);
01362 double newZoom = view->ctrl->calZoom(view->ctrl->settings.getCurrentPage());
01363 view->ctrl->settings.setZoom(oldZoom);
01364 view->ctrl->settings.setNewZoom(newZoom);
01365 double ratio = newZoom / oldZoom;
01366
01367
01368 rectangle rect;
01369 rect.left = 0; rect.right = view->ctrl->settings.getScreenWidth();
01370 rect.top = view->ctrl->settings.getScreenY();
01371 rect.bottom = view->ctrl->settings.getScreenY();
01372
01373
01374 init();
01375
01376
01377 adjustPositionContinousMode(rect, ratio);
01378
01379
01380 displayPage(view->ctrl->settings.getCurrentPage(), ScrollToPosition);
01381 }
01382
01384
01385 int CPDFPortraitView::hitTest(const int x, const int y, int & ox, int & oy)
01386 {
01387 if (view->isPageMode())
01388 {
01389 if (layout.hitTest(x, y))
01390 {
01391
01392 ox = x - view->ctrl->settings.getScreenX();
01393 oy = y - view->ctrl->settings.getScreenY();
01394 return view->ctrl->settings.getCurrentPage();
01395 }
01396 }
01397 else
01398 {
01399 if (nStart > 0 && nEnd > 0 && list.isEmpty())
01400 {
01401
01402 ox = x + view->ctrl->settings.getScreenX();
01403 oy = y + view->ctrl->settings.getScreenY();
01404 int pn = layout.hitTest(ox, oy, nStart, nEnd);
01405 if (pn > 0)
01406 {
01407 rectangle rect;
01408 layout.getPageRect(pn, rect);
01409 ox -= rect.left;
01410 oy -= rect.top;
01411 return pn;
01412 }
01413 else
01414 {
01415 return -1;
01416 }
01417
01418 }
01419 }
01420 return -1;
01421 }
01422
01423 GBool CPDFPortraitView::doLinkPageMode(const int x, const int y)
01424 {
01425 return view->doLink(view->ctrl->settings.getCurrentPage(),
01426 x - view->ctrl->settings.getScreenX(),
01427 y - view->ctrl->settings.getScreenY());
01428 }
01429
01430
01431 GBool CPDFPortraitView::doLinkContinousMode(const int x, const int y)
01432 {
01433 point pt; pt.x = x; pt.y = y;
01434 layout.screenToVirtualScreen(view->ctrl, pt);
01435 int pn = layout.hitTest(pt.x, pt.y, nStart, nEnd);
01436 if (pn < 0) return gFalse;
01437 rectangle rect;
01438 layout.getPageRect(pn, rect);
01439 return view->doLink(pn, pt.x - rect.left, pt.y - rect.top);
01440 }
01441
01443
01444
01445 void CPDFPortraitView::drawScribble(const int x, const int y, const int pn)
01446 {
01447 view->ctrl->scbMgr.drawScribblePage(pn,
01448 view->ctrl, x, y);
01449 }