diff options
author | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2013-01-26 13:17:19 -0600 |
---|---|---|
committer | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2013-01-26 13:17:19 -0600 |
commit | 00b4f54142276b0e2272ca56e48558551ab7b2b0 (patch) | |
tree | 1d1054b59fc2e76d0c2bae00126bdf65d9318865 /kviewshell/kmultipage.cpp | |
parent | c7549e238d15850306158ae153fc99126c84ab9d (diff) | |
download | tdegraphics-00b4f54142276b0e2272ca56e48558551ab7b2b0.tar.gz tdegraphics-00b4f54142276b0e2272ca56e48558551ab7b2b0.zip |
Rename a number of libraries and executables to avoid conflicts with KDE4
Diffstat (limited to 'kviewshell/kmultipage.cpp')
-rw-r--r-- | kviewshell/kmultipage.cpp | 1976 |
1 files changed, 0 insertions, 1976 deletions
diff --git a/kviewshell/kmultipage.cpp b/kviewshell/kmultipage.cpp deleted file mode 100644 index 4d544df9..00000000 --- a/kviewshell/kmultipage.cpp +++ /dev/null @@ -1,1976 +0,0 @@ -#include <config.h> - -#include <kaction.h> -#include <kapplication.h> -#include <kdebug.h> -#include <kfiledialog.h> -#include <kiconloader.h> -#include <kio/job.h> -#include <klocale.h> -#include <kmessagebox.h> -#include <kprinter.h> -#include <kstdaction.h> -#include <tqobject.h> -#include <tqlayout.h> -#include <tqpaintdevicemetrics.h> -#include <tqprogressdialog.h> -#include <tqsplitter.h> -#include <tqurl.h> -#include <tqtoolbox.h> -#include <tqvbox.h> - -#include "documentWidget.h" -#include "marklist.h" -#include "tableOfContents.h" -#include "kprintDialogPage_pageoptions.h" -#include "kvsprefs.h" -#include "kmultipage.h" -#include "pageNumber.h" -#include "renderedDocumentPagePrinter.h" -#include "searchWidget.h" -#include "textBox.h" -#include "zoomlimits.h" - - -//#define DEBUG_KMULTIPAGE - -KMultiPage::KMultiPage(TQWidget *parentWidget, const char *widgetName, TQObject *parent, const char *name) - : DCOPObject("kmultipage"), KParts::ReadOnlyPart(parent, name) -{ - // For reasons which I don't understand, the initialization of the - // DCOPObject above does not work properly, the name is ignored. It - // works fine if we repeat the name here. -- Stefan Kebekus - // This is because of the virtual inheritance. Get rid of it (but it's BC, and this is a lib...) -- DF - setObjId("kmultipage"); - - parentWdg = parentWidget; - lastCurrentPage = 0; - timer_id = -1; - searchInProgress = false; - - TQVBox* verticalBox = new TQVBox(parentWidget); - verticalBox->setFocusPolicy(TQ_StrongFocus); - setWidget(verticalBox); - - splitterWidget = new TQSplitter(verticalBox, widgetName); - splitterWidget->setOpaqueResize(false); - splitterWidget->setSizePolicy(TQSizePolicy::MinimumExpanding, TQSizePolicy::MinimumExpanding); - - // Create SideBar - sideBar = new TQToolBox(splitterWidget, "sidebar"); - - // Create ContentsList - tableOfContents = new TableOfContents(sideBar); - sideBar->addItem(tableOfContents, TQIconSet(SmallIcon("contents")), i18n("Contents")); - - connect(tableOfContents, TQT_SIGNAL(gotoPage(const Anchor&)), this, TQT_SLOT(gotoPage(const Anchor&))); - - // Create MarkList - _markList = new MarkList(sideBar, "marklist"); - sideBar->addItem(_markList, TQIconSet(SmallIcon("thumbnail")), i18n("Thumbnails")); - - // Restore state of the sidebar - sideBar->setCurrentItem(sideBar->item(KVSPrefs::sideBarItem())); - - splitterWidget->setResizeMode(sideBar, TQSplitter::KeepSize); - - connect(_markList, TQT_SIGNAL(selected(const PageNumber&)), this, TQT_SLOT(gotoPage(const PageNumber&))); - - _scrollView = new PageView(splitterWidget, widgetName); - - // Create Search Panel - searchWidget = new SearchWidget(verticalBox); - searchWidget->hide(); - connect(searchWidget, TQT_SIGNAL(findNextText()), this, TQT_SLOT(findNextText())); - connect(searchWidget, TQT_SIGNAL(findPrevText()), this, TQT_SLOT(findPrevText())); - - sideBar->setMinimumWidth(80); - sideBar->setMaximumWidth(300); - - connect(_scrollView, TQT_SIGNAL(currentPageChanged(const PageNumber&)), this, TQT_SLOT(setCurrentPageNumber(const PageNumber&))); - connect(_scrollView, TQT_SIGNAL(viewSizeChanged(const TQSize&)), scrollView(), TQT_SLOT(calculateCurrentPageNumber())); - connect(_scrollView, TQT_SIGNAL(wheelEventReceived(TQWheelEvent *)), this, TQT_SLOT(wheelEvent(TQWheelEvent*))); - - connect(this, TQT_SIGNAL(enableMoveTool(bool)), _scrollView, TQT_SLOT(slotEnableMoveTool(bool))); - - splitterWidget->setCollapsible(sideBar, false); - splitterWidget->setSizes(KVSPrefs::guiLayout()); - - connect(searchWidget, TQT_SIGNAL(searchEnabled(bool)), this, TQT_SIGNAL(searchEnabled(bool))); - connect(searchWidget, TQT_SIGNAL(stopSearch()), this, TQT_SLOT(stopSearch())); -} - - -KMultiPage::~KMultiPage() -{ - writeSettings(); - - if (timer_id != -1) - killTimer(timer_id); - - delete pageCache; -} - -void KMultiPage::readSettings() -{ -} - -void KMultiPage::writeSettings() -{ - // Save TOC layout - tableOfContents->writeSettings(); - - KVSPrefs::setGuiLayout(splitterWidget->sizes()); - // Save state of the sidebar - KVSPrefs::setSideBarItem(sideBar->indexOf(sideBar->currentItem())); - KVSPrefs::writeConfig(); -} - -TQString KMultiPage::name_of_current_file() -{ - return m_file; -} - -bool KMultiPage::is_file_loaded(const TQString& filename) -{ - return (filename == m_file); -} - -void KMultiPage::slotSave_defaultFilename() -{ - slotSave(); -} - -void KMultiPage::slotSave() -{ - // Try to guess the proper ending... - TQString formats; - TQString ending; - int rindex = m_file.findRev("."); - if (rindex == -1) { - ending = TQString(); - formats = TQString(); - } else { - ending = m_file.mid(rindex); // e.g. ".dvi" - formats = fileFormats().grep(ending).join("\n"); - } - - TQString fileName = KFileDialog::getSaveFileName(TQString(), formats, 0, i18n("Save File As")); - - if (fileName.isEmpty()) - return; - - // Add the ending to the filename. I hope the user likes it that - // way. - if (!ending.isEmpty() && fileName.find(ending) == -1) - fileName = fileName+ending; - - if (TQFile(fileName).exists()) { - int r = KMessageBox::warningContinueCancel (0, i18n("The file %1\nexists. Shall I overwrite that file?").arg(fileName), - i18n("Overwrite File"), i18n("Overwrite")); - if (r == KMessageBox::Cancel) - return; - } - - TDEIO::Job *job = TDEIO::file_copy( KURL( m_file ), KURL( fileName ), 0600, true, false, true ); - connect( job, TQT_SIGNAL( result( TDEIO::Job * ) ), this, TQT_SLOT( slotIOJobFinished ( TDEIO::Job * ) ) ); - - return; -} - - -void KMultiPage::setFile(bool) -{ - return; -} - - -bool KMultiPage::closeURL() -{ -#ifdef DEBUG_KMULTIPAGE - kdDebug(1233) << "KMultiPage::closeURL()" << endl; -#endif - - if (renderer.isNull()) - return false; - - // Clear navigation history. - document_history.clear(); - - // Close the file. - renderer->setFile(TQString(), KURL()); - renderer->clear(); - - // Delete Page Widgets. - widgetList.setAutoDelete(true); - widgetList.resize(0); - widgetList.setAutoDelete(false); - - // Update ScrollView. - scrollView()->layoutPages(); - enableActions(false); - - // Clear Thumbnail List. - markList()->clear(); - - // Clear Table of Contents - tableOfContents->clear(); - - // Clear Status Bar - emit setStatusBarText(TQString()); - - return true; -} - -void KMultiPage::slotIOJobFinished ( TDEIO::Job *job ) -{ - if ( job->error() ) - job->showErrorDialog( 0L ); -} - -void KMultiPage::slotShowScrollbars(bool status) -{ - _scrollView->slotShowScrollbars(status); -} - -void KMultiPage::slotShowSidebar(bool show) -{ - if (show) - sideBar->show(); - else - sideBar->hide(); -} - -void KMultiPage::slotShowThumbnails(bool show) -{ - markList()->slotShowThumbnails(show); -} - -void KMultiPage::slotSetFullPage(bool fullpage) -{ - _scrollView->setFullScreenMode(fullpage); - if (fullpage) - slotShowSidebar(false); -} - -void KMultiPage::preferencesChanged() -{ - // We need to read the config options otherwise the KVSPrefs-object would - // not be syncronized between the kviewpart and the kmultipage. - KVSPrefs::self()->readConfig(); - - slotShowThumbnails(KVSPrefs::showThumbnails()); - - // if we are in overviewmode and the number of columns or rows has changed - if (scrollView()->overviewMode() && - (scrollView()->getNrColumns() != KVSPrefs::overviewModeColumns() || - scrollView()->getNrRows() != KVSPrefs::overviewModeRows())) - { - setViewMode(KVSPrefs::EnumViewMode::Overview); - } - - if (KVSPrefs::changeColors() && KVSPrefs::renderMode() == KVSPrefs::EnumRenderMode::Paper) - renderer->setAccessibleBackground(true, KVSPrefs::paperColor()); - else - renderer->setAccessibleBackground(false); - - renderModeChanged(); -} - -void KMultiPage::setViewMode(int mode) -{ -#ifdef DEBUG_KMULTIPAGE - kdDebug(1233) << "KMultiPage::setViewMode(" << mode << ")" << endl; -#endif - // Save the current page number because when we are changing the columns - // and rows in the scrollview the currently shown Page probably out of view. - PageNumber currentPage = currentPageNumber(); - - // Save viewMode for future uses of KViewShell - switch (mode) - { - case KVSPrefs::EnumViewMode::SinglePage: - KVSPrefs::setViewMode(KVSPrefs::EnumViewMode::SinglePage); - - // Don't do anything if the view mode is already set - if ((scrollView()->getNrColumns() == 1) && (scrollView()->getNrRows() == 1) && (scrollView()->isContinuous() == false)) - return; - - scrollView()->setNrColumns(1); - scrollView()->setNrRows(1); - scrollView()->setContinuousViewMode(false); - // We scroll the view to the top, so that top and not the bottom - // of the visible page is shown. - scrollView()->scrollTop(); - break; - case KVSPrefs::EnumViewMode::ContinuousFacing: - KVSPrefs::setViewMode(KVSPrefs::EnumViewMode::ContinuousFacing); - - // Don't do anything if the view mode is already set - if ((scrollView()->getNrColumns() == 2) && (scrollView()->getNrRows() == 1) && (scrollView()->isContinuous() == true)) - return; - - scrollView()->setNrColumns(2); - scrollView()->setNrRows(1); - scrollView()->setContinuousViewMode(true); - break; - case KVSPrefs::EnumViewMode::Overview: - KVSPrefs::setViewMode(KVSPrefs::EnumViewMode::Overview); - - // Don't do anything if the view mode is already set - if ((scrollView()->getNrColumns() == KVSPrefs::overviewModeColumns()) && (scrollView()->getNrRows() == KVSPrefs::overviewModeRows()) && (scrollView()->isContinuous() == false)) - return; - - scrollView()->setNrColumns(KVSPrefs::overviewModeColumns()); - scrollView()->setNrRows(KVSPrefs::overviewModeRows()); - scrollView()->setContinuousViewMode(false); - // We scroll the view to the top, so that top and not the bottom - // of the visible tableau is shown. - scrollView()->scrollTop(); - break; - default: //KVSPrefs::EnumViewMode::Continuous - KVSPrefs::setViewMode(KVSPrefs::EnumViewMode::Continuous); - - // Don't do anything if the view mode is already set - if ((scrollView()->getNrColumns() == 1) && (scrollView()->getNrRows() == 1) && (scrollView()->isContinuous() == true)) - return; - - scrollView()->setNrColumns(1); - scrollView()->setNrRows(1); - scrollView()->setContinuousViewMode(true); - } - generateDocumentWidgets(currentPage); - KVSPrefs::writeConfig(); - emit viewModeChanged(); -} - -void KMultiPage::initializePageCache() -{ - pageCache = new DocumentPageCache(); -} - -DocumentWidget* KMultiPage::createDocumentWidget() -{ - DocumentWidget* documentWidget = new DocumentWidget(scrollView()->viewport(), scrollView(), pageCache, "singlePageWidget"); - connect(documentWidget, TQT_SIGNAL(clearSelection()), this, TQT_SLOT(clearSelection())); - connect(this, TQT_SIGNAL(enableMoveTool(bool)), documentWidget, TQT_SLOT(slotEnableMoveTool(bool))); - return documentWidget; -} - - -void KMultiPage::generateDocumentWidgets(const PageNumber& _startPage) -{ - PageNumber startPage = _startPage; -#ifdef DEBUG_KMULTIPAGE - kdDebug(1233) << "KMultiPage::generateDocumentWidgets(" << startPage << ")" << endl; -#endif - - // Do nothing if no document is loaded. - if (getRenderer().isNull() || getRenderer()->isEmpty()) - return; - - // This function is only called with an invalid pagenumber, when - // the file has been loaded or reloaded. - bool reload = !startPage.isValid(); - - if (reload) - { - // Find the number of the current page, for later use. - startPage = currentPageNumber(); - } - - // Make sure that startPage is in the permissible range. - if (startPage < 1) - startPage = 1; - if (startPage > numberOfPages()) - startPage = numberOfPages(); - - unsigned int tableauStartPage = startPage; - - // Find out how many widgets are needed, and resize the widgetList accordingly. - widgetList.setAutoDelete(true); - TQ_UINT16 oldwidgetListSize = widgetList.size(); - if (numberOfPages() == 0) - widgetList.resize(0); - else - { - switch (KVSPrefs::viewMode()) - { - case KVSPrefs::EnumViewMode::SinglePage: - widgetList.resize(1); - break; - case KVSPrefs::EnumViewMode::Overview: - { - // Calculate the number of pages shown in overview mode. - unsigned int visiblePages = KVSPrefs::overviewModeColumns() * KVSPrefs::overviewModeRows(); - // Calculate the number of the first page in the tableau. - tableauStartPage = startPage - ((startPage - 1) % visiblePages); - // We cannot have more widgets then pages in the document. - visiblePages = TQMIN(visiblePages, numberOfPages() - tableauStartPage + 1); - if (widgetList.size() != visiblePages) - widgetList.resize(visiblePages); - break; - } - default: - // In KVS_Continuous and KVS_ContinuousFacing all pages in the document are shown. - widgetList.resize(numberOfPages()); - } - } - bool isWidgetListResized = (widgetList.size() != oldwidgetListSize); - widgetList.setAutoDelete(false); - - // If the widgetList is empty, there is nothing left to do. - if (widgetList.size() == 0) { - scrollView()->addChild(&widgetList); - return; - } - - // Allocate DocumentWidget structures so that all entries of - // widgetList point to a valid DocumentWidget. - DocumentWidget *documentWidget; - for(TQ_UINT16 i=0; i<widgetList.size(); i++) { - documentWidget = widgetList[i]; - if (documentWidget == 0) { - documentWidget = createDocumentWidget(); - - widgetList.insert(i, documentWidget); - documentWidget->show(); - - connect(documentWidget, TQT_SIGNAL(localLink(const TQString &)), this, TQT_SLOT(handleLocalLink(const TQString &))); - connect(documentWidget, TQT_SIGNAL(setStatusBarText(const TQString&)), this, TQT_SIGNAL(setStatusBarText(const TQString&)) ); - } - } - - // Set the page numbers for the newly allocated widgets. How this is - // done depends on the viewMode. - if (KVSPrefs::viewMode() == KVSPrefs::EnumViewMode::SinglePage) { - // In KVS_SinglePage mode, any number between 1 and the maximum - // number of pages is acceptable. If an acceptable value is found, - // nothing is done, and otherwise '1' is set as a default. - documentWidget = widgetList[0]; - if (documentWidget != 0) { // Paranoia safety check - documentWidget->setPageNumber(startPage); - documentWidget->update(); - } else - kdError(4300) << "Zero-Pointer in widgetList in KMultiPage::generateDocumentWidgets()" << endl; - } else { - // In all other modes, the widgets will be numbered continuously, - // starting from firstShownPage. - for(TQ_UINT16 i=0; i<widgetList.size(); i++) { - documentWidget = widgetList[i]; - if (documentWidget != 0) // Paranoia safety check - { - if (KVSPrefs::viewMode() == KVSPrefs::EnumViewMode::Overview) - documentWidget->setPageNumber(i+tableauStartPage); - else - documentWidget->setPageNumber(i+1); - } - else - kdError(4300) << "Zero-Pointer in widgetList in KMultiPage::generateDocumentWidgets()" << endl; - } - } - - // Make the changes in the widgetList known to the scrollview. so - // that the scrollview may update its contents. - scrollView()->addChild(&widgetList); - - // If the number of widgets has changed, or the viewmode has been changed the widget - // that displays the current page may not be visible anymore. Bring it back into focus. - if (isWidgetListResized || !reload) - gotoPage(startPage); -} - - -bool KMultiPage::gotoPage(const PageNumber& page) -{ - return gotoPage(page, 0, true); -} - - -bool KMultiPage::gotoPage(const PageNumber& page, int y, bool isLink) -{ -#ifdef DEBUG_KMULTIPAGE - kdDebug(1233) << "KMultiPage::gotoPage()" << endl; -#endif - - if (widgetList.size() == 0) { - kdError(4300) << "KMultiPage::gotoPage(" << page << ", y) called, but widgetList is empty" << endl; - return false; - } - - if (!page.isValid()) - { - kdDebug(1223) << "KMultiPage::gotoPage(" << page << ") invalid pageNumber." << endl; - return false; - } - - if (isLink) - document_history.add(page, y); - - DocumentWidget* pageWidget; - - // If we are in overview viewmode - if (KVSPrefs::viewMode() == KVSPrefs::EnumViewMode::Overview) - { - unsigned int visiblePages = KVSPrefs::overviewModeColumns() * KVSPrefs::overviewModeRows(); - // Pagenumber of the first visibile Page in the current tableau - unsigned int firstPage = ((DocumentWidget*)widgetList[0])->getPageNumber(); - // Pagenumber of the first page in the new tableau. - unsigned int tableauStartPage = page + 1 - (page % visiblePages); - // If these numbers arn't equal "page" is not in the current tableu. - if (firstPage != tableauStartPage) // widgets need to be updated - { - if ((numberOfPages() - tableauStartPage + 1 < visiblePages) || (widgetList.size() < visiblePages)) - { - // resize widgetList - // the pages are also set correctly by "generateDocumentWidgets" - generateDocumentWidgets(tableauStartPage); - } - else - { - // "page" is not shown in the scrollview, so we have to switch widgets. - // Here we don't need to resize the widgetList. - for (unsigned int i = 0; i < widgetList.size(); i++) - { - pageWidget = (DocumentWidget*)(widgetList[i]); - if (pageWidget != 0) - pageWidget->setPageNumber(tableauStartPage + i); - } - scrollView()->layoutPages(); - } - } - // move scrollview to "page". - // Make the widget pageWidget visible in the scrollview. Somehow this - // doesn't seem to trigger the signal contentsMoved in the - // TQScrollview, so that we better call setCurrentPage() ourselves. - pageWidget = (DocumentWidget*)(widgetList[page % visiblePages]); - - scrollView()->moveViewportToWidget(pageWidget, y); - - // Set current page number. - setCurrentPageNumber(page); - - return true; - } - else if (widgetList.size() == 1) - { - // If the widget list contains only a single element, then either - // the document contains only one page, or we are in "single page" - // view mode. In either case, we set the page number of the single - // widget to 'page' - pageWidget = (DocumentWidget*)(widgetList[0]); - - // Paranoia security check - if (pageWidget == 0) { - kdError(4300) << "KMultiPage::goto_Page() called with widgetList.size() == 1, but widgetList[0] == 0" << endl; - return false; - } - - if (pageCache->sizeOfPageInPixel(currentPageNumber()) == pageCache->sizeOfPageInPixel(page)) - { - // We are rendering the page before we switch the widget to the new page. - // To make a smooth transition. We only do this if the size of the current and new page are equal, - // otherwise we would have to render the page twice, if autozoom is enabled. - pageCache->getPage(page); - } - - pageWidget->setPageNumber(page); - scrollView()->layoutPages(); - scrollView()->moveViewportToWidget(pageWidget, y); - } else { - // There are multiple widgets, then we are either in the - // "Continuous" or in the "Continouous-Facing" view mode. In that - // case, we find the widget which is supposed to display page - // 'page' and move the scrollview to make it visible - - // Paranoia security checks - if (widgetList.size() < page) { - kdError(4300) << "KMultiPage::goto_Page(page,y ) called with widgetList.size()=" << widgetList.size() << ", and page=" << page << endl; - return false; - } - pageWidget = (DocumentWidget*)(widgetList[page-1]); - if (pageWidget == 0) { - kdError(4300) << "KMultiPage::goto_Page() called with widgetList.size() > 1, but widgetList[page] == 0" << endl; - return false; - } - - scrollView()->moveViewportToWidget(pageWidget, y); - } - - if (isLink && y != 0) - pageWidget->flash(y); - - // Set current page number. - setCurrentPageNumber(page); - return true; -} - - -void KMultiPage::handleLocalLink(const TQString &linkText) -{ -#ifdef DEBUG_SPECIAL - kdDebug(4300) << "hit: local link to " << linkText << endl; -#endif - - if (renderer.isNull()) { - kdError(4300) << "KMultiPage::handleLocalLink( " << linkText << " ) called, but renderer==0" << endl; - return; - } - - TQString locallink; - if (linkText[0] == '#' ) - locallink = linkText.mid(1); // Drop the '#' at the beginning - else - locallink = linkText; - - Anchor anch = renderer->findAnchor(locallink); - - if (anch.isValid()) - gotoPage(anch); - else { - if (linkText[0] != '#' ) { - // We could in principle use TDEIO::Netaccess::run() here, but - // it is perhaps not a very good idea to allow a DVI-file to - // specify arbitrary commands, such as "rm -rvf /". Using - // the kfmclient seems to be MUCH safer. - TQUrl DVI_Url(m_file); - TQUrl Link_Url(DVI_Url, linkText, true); - - TQStringList args; - args << "openURL"; - args << Link_Url.toString(); - kapp->tdeinitExec("kfmclient", args); - } - } -} - -void KMultiPage::setCurrentPageNumber(const PageNumber& page) -{ -#ifdef DEBUG_KMULTIPAGE - kdDebug(1233) << "KMultiPage::setCurrentPageNumber()" << endl; -#endif - - if (page != currentPageNumber()) - { - markList()->setCurrentPageNumber(page); - emit pageInfo(numberOfPages(), currentPageNumber()); - } -} - -PageNumber KMultiPage::currentPageNumber() -{ - return markList()->currentPageNumber(); -} - -void KMultiPage::doGoBack() -{ - HistoryItem *it = document_history.back(); - if (it != 0) - gotoPage(it->page, it->ypos, false); // Do not add a history item. - else - kdDebug(4300) << "Faulty return -- bad history buffer" << endl; - return; -} - - -void KMultiPage::doGoForward() -{ - HistoryItem *it = document_history.forward(); - if (it != 0) - gotoPage(it->page, it->ypos, false); // Do not add a history item. - else - kdDebug(4300) << "Faulty return -- bad history buffer" << endl; - return; -} - - -void KMultiPage::renderModeChanged() -{ - pageCache->clear(); - - generateDocumentWidgets(); - scrollView()->layoutPages(); - - for (TQ_UINT16 i=0; i < widgetList.size(); i++) - { - DocumentWidget* documentWidget = widgetList[i]; - if (documentWidget == 0) - continue; - - documentWidget->update(); - } - - markList()->repaintThumbnails(); -} - - -void KMultiPage::repaintAllVisibleWidgets() -{ -#ifdef DEBUG_KMULTIPAGE - kdDebug(1233) << "KMultiPage::repaintAllVisibleWidgets()" << endl; -#endif - - bool everResized = false; - - // Go through the list of widgets and resize them, if necessary - for(TQ_UINT16 i=0; i<widgetList.size(); i++) - { - DocumentWidget* documentWidget = widgetList[i]; - if (documentWidget == 0) - continue; - - // Resize, if necessary - TQSize pageSize = pageCache->sizeOfPageInPixel(documentWidget->getPageNumber()); - if (pageSize != documentWidget->pageSize()) - { - documentWidget->setPageSize(pageSize); - everResized = true; - } - } - - // If at least one widget was resized, all widgets should be - // re-aligned. This will automatically update all necessary - // widgets. - if (everResized == true) - scrollView()->layoutPages(true); -} - - -double KMultiPage::setZoom(double zoom) -{ -#ifdef DEBUG_KMULTIPAGE - kdDebug(1233) << "KMultiPage::setZoom(" << zoom << ")" << endl; -#endif - - if (zoom < ZoomLimits::MinZoom/1000.0) - zoom = ZoomLimits::MinZoom/1000.0; - if (zoom > ZoomLimits::MaxZoom/1000.0) - zoom = ZoomLimits::MaxZoom/1000.0; - - pageCache->setResolution(TQPaintDevice::x11AppDpiX()*zoom); - emit zoomChanged(); - return zoom; -} - - -void KMultiPage::print() -{ - // Paranoid safety checks - if (renderer.isNull()) - return; - if (renderer->isEmpty()) - return; - - // Allocate the printer structure - KPrinter *printer = getPrinter(); - if (printer == 0) - return; - - // initialize the printer using the print dialog - if ( printer->setup(parentWdg, i18n("Print %1").arg(m_file.section('/', -1))) ) { - // Now do the printing. - TQValueList<int> pageList = printer->pageList(); - if (pageList.isEmpty()) - printer->abort(); - else { - printer->setCreator("kviewshell"); - printer->setDocName(m_file); - RenderedDocumentPagePrinter rdpp(printer); - - // Obtain papersize information that is required to perform - // the resizing and centering, if this is wanted by the user. - Length paperWidth, paperHeight; - TQPaintDeviceMetrics pdm(printer); - paperWidth.setLength_in_mm(pdm.widthMM()); - paperHeight.setLength_in_mm(pdm.heightMM()); - - TQValueList<int>::ConstIterator it = pageList.begin(); - while (true) { - SimplePageSize paper_s(paperWidth, paperHeight); - - // Printing usually takes a while. This is to keep the GUI - // updated. - tqApp->processEvents(); - - TQPainter *paint = rdpp.getPainter(); - if (paint != 0) { - // Before drawing the page, we figure out the zoom-value, - // taking the "page sizes and placement" options from the - // printer dialog into account - double factual_zoom = 1.0; - - // Obtain pagesize information that is required to perform the - // resizing and centering, if this is wanted by the user. - SimplePageSize page_s = sizeOfPage(*it); - - paint->save(); - - // Rotate the page, if appropriate. By default, page - // rotation is enabled. This is also hardcoded into - // KPrintDialogPage_PageOptions.cpp - if ((page_s.isPortrait() != paper_s.isPortrait()) && (printer->option( "kde-kviewshell-rotatepage" ) != "false")) { - paint->rotate(-90); - paint->translate(-printer->resolution()*paperHeight.getLength_in_inch(), 0.0); - paper_s = paper_s.rotate90(); - } - - double suggested_zoom = page_s.zoomToFitInto(paper_s); - - // By default, "shrink page" and "expand page" are off. This - // is also hardcoded into KPrintDialogPage_PageOptions.cpp - if ((suggested_zoom < 1.0) && (printer->option( "kde-kviewshell-shrinkpage" ) == "true")) - factual_zoom = suggested_zoom; - if ((suggested_zoom > 1.0) && (printer->option( "kde-kviewshell-expandpage" ) == "true")) - factual_zoom = suggested_zoom; - - Length delX, delY; - // By default, "center page" is on. This is also hardcoded - // into KPrintDialogPage_PageOptions.cpp - if (printer->option( "kde-kviewshell-centerpage" ) != "false") { - delX = (paper_s.width() - page_s.width()*factual_zoom)/2.0; - delY = (paper_s.height() - page_s.height()*factual_zoom)/2.0; - } - - // Now draw the page. - rdpp.setPageNumber(*it); - - double resolution = factual_zoom*printer->resolution(); - - paint->translate(resolution*delX.getLength_in_inch(), resolution*delY.getLength_in_inch()); - renderer->drawPage(resolution, &rdpp); - paint->restore(); - } - ++it; - if ((it == pageList.end()) || (printer->aborted() == true)) - break; - - printer->newPage(); - } - // At this point the rdpp is destructed. The last page is then - // printed. - } - } - delete printer; -} - - -void KMultiPage::setRenderer(DocumentRenderer* _renderer) -{ - renderer = _renderer; - - // Initialize documentPageCache. - initializePageCache(); - pageCache->setRenderer(renderer); - - _markList->setPageCache(pageCache); - - // Clear widget list. - widgetList.resize(0); - - // Relay signals. - connect(renderer, TQT_SIGNAL(setStatusBarText(const TQString&)), this, TQT_SIGNAL(setStatusBarText(const TQString&))); - connect(pageCache, TQT_SIGNAL(paperSizeChanged()), this, TQT_SLOT(renderModeChanged())); - connect(pageCache, TQT_SIGNAL(textSelected(bool)), this, TQT_SIGNAL(textSelected(bool))); - connect(renderer, TQT_SIGNAL(documentIsChanged()), this, TQT_SLOT(renderModeChanged())); - connect(this, TQT_SIGNAL(zoomChanged()), this, TQT_SLOT(repaintAllVisibleWidgets())); -} - - -void KMultiPage::updateWidgetSize(const PageNumber& pageNumber) -{ - for(TQ_UINT16 i=0; i<widgetList.size(); i++) - { - DocumentWidget* documentWidget = widgetList[i]; - if (documentWidget == 0) - continue; - - if (documentWidget->getPageNumber() == pageNumber) - { - // Resize, if necessary - TQSize pageSize = pageCache->sizeOfPageInPixel(documentWidget->getPageNumber()); - if (pageSize != documentWidget->pageSize()) - { - documentWidget->setPageSize(pageSize); - scrollView()->layoutPages(); - } - // We have just one widget per page. - break; - } - } - - // Update marklist - markList()->updateWidgetSize(pageNumber); -} - - -PageNumber KMultiPage::widestPage() const -{ - Length maxWidth; - PageNumber pageNumber = 1; - - for (int i = 1; i <= numberOfPages(); i++) - { - Length width = pageCache->sizeOfPage(i).width(); - - if (width > maxWidth) - { - maxWidth = width; - pageNumber = i; - } - } - - return pageNumber; -} - -double KMultiPage::zoomForWidthColumns(unsigned int viewportWidth) const -{ - Length maxLeftColumnWidth; - Length maxRightColumnWidth; - Length maxWidth; - - PageNumber widestPageLeft; - PageNumber widestPageRight; - - for (int i = 1; i <= numberOfPages(); i++) - { - Length width = pageCache->sizeOfPage(i).width(); - - if ( i % 2 == 0) // page is in left column - { - if (width > maxLeftColumnWidth) - { - maxLeftColumnWidth = width; - widestPageLeft = i; - } - } - - if ( i % 2 == 1) // page is in right column - { - if (width > maxRightColumnWidth) - maxRightColumnWidth = width; - widestPageRight = i; - } - } - - double ratio = maxLeftColumnWidth / (maxLeftColumnWidth + maxRightColumnWidth); - - // This number is the amount of space the left column should occupy in the viewport. - unsigned int leftTargetWidth = (unsigned int)(ratio * viewportWidth); - - return pageCache->sizeOfPage(widestPageLeft).zoomForWidth(leftTargetWidth); -} - -double KMultiPage::calculateFitToHeightZoomValue() -{ - PageNumber pageNumber = 1; - - // See below, in the documentation of the method "calculatefitToWidthZoomLevel" - // for an explanation of the complicated calculation we are doing here. - int columns = scrollView()->getNrColumns(); - int rows = scrollView()->getNrRows(); - int continuousViewmode = scrollView()->isContinuous(); - bool fullScreenMode = scrollView()->fullScreenMode(); - - if (columns == 1 && rows == 1 && !continuousViewmode) // single page mode - { - pageNumber = currentPageNumber(); - if (!pageNumber.isValid()) - pageNumber = 1; - } - - int pageDistance = scrollView()->distanceBetweenPages(); - if (columns == 1 && rows == 1 && !continuousViewmode && fullScreenMode) - { - // In Single Page Fullscreen Mode we want to fit the page to the - // window without a margin around it. - pageDistance = 0; - } - - int targetViewportHeight = scrollView()->viewportSize(0,0).height(); - int targetPageHeight = (targetViewportHeight - rows*pageDistance)/rows; - int targetPageWidth = (int)(targetPageHeight * pageCache->sizeOfPage(pageNumber).aspectRatio() ); - int targetViewportWidth = targetPageWidth * columns + (columns+1)*pageDistance; - targetViewportHeight = scrollView()->viewportSize(targetViewportWidth, targetViewportHeight).height(); - targetPageHeight = (targetViewportHeight - rows*pageDistance)/rows; - - return pageCache->sizeOfPage(pageNumber).zoomForHeight(targetPageHeight); -} - - -double KMultiPage::calculateFitToWidthZoomValue() -{ - PageNumber pageNumber = 1; - - int columns = scrollView()->getNrColumns(); - int rows = scrollView()->getNrRows(); - int continuousViewmode = scrollView()->isContinuous(); - bool fullScreenMode = scrollView()->fullScreenMode(); - - if (columns == 1 && rows == 1 && !continuousViewmode) // single page mode - { - // To calculate the zoom level in single page mode we need the size - // of the current page. When a new document is opened this function - // is called while the currentPageNumber is invalid. We use the size - // of the first page of the document in this case. - pageNumber = currentPageNumber(); - if (!pageNumber.isValid()) - pageNumber = 1; - } - - if (columns == 1 && rows == 1 && continuousViewmode) // continuous viewmode - { - pageNumber = widestPage(); - if (!pageNumber.isValid()) - pageNumber = 1; - } - - // rows should be 1 for Single Page Viewmode, - // the number of Pages in Continuous Viewmode - // and number of Pages/2 in Continuous-Facing Viewmode - if (continuousViewmode) - rows = (int)(ceil(numberOfPages() / (double)columns)); - - int pageDistance = scrollView()->distanceBetweenPages(); - if (columns == 1 && rows == 1 && !continuousViewmode && fullScreenMode) - { - // In Single Page Fullscreen Mode we want to fit the page to the - // window without a margin around it. - pageDistance = 0; - } - // There is a slight complication here... if we just take the width - // of the viewport and scale the contents by a factor x so that it - // fits the viewport exactly, then, depending on chosen papersize - // (landscape, etc.), the contents may be higher than the viewport - // and the TQScrollview may or may not insert a scrollbar at the - // right. If the scrollbar appears, then the usable width of the - // viewport becomes smaller, and scaling by x does not really fit - // the (now smaller page) anymore. - - // Calculate the width and height of the view, disregarding the - // possible complications with scrollbars, e.g. assuming the maximal - // space is available. - - // width of the widget excluding possible scrollbars - int targetViewportWidth = scrollView()->viewportSize(0,0).width(); - - // maximal width of a single page - int targetPageWidth = (targetViewportWidth - (columns+1) * pageDistance) / columns; - - // maximal height of a single page - int targetPageHeight = (int)(targetPageWidth/pageCache->sizeOfPage(pageNumber).aspectRatio()); - // FIXME: this is only correct if all pages in the document have the same height - int targetViewportHeight = rows * targetPageHeight + (rows+1) * pageDistance; - - // Think again, this time use only the area which is really - // acessible (which, in case that targetWidth targetHeight don't fit - // the viewport, is really smaller because of the scrollbars). - targetViewportWidth = scrollView()->viewportSize(targetViewportWidth, targetViewportHeight).width(); - - if (columns == 2 && continuousViewmode) // continuous facing - { - // TODO Generalize this for more than 2 columns - return zoomForWidthColumns(targetViewportWidth - (columns+1) * pageDistance); - } - - // maximal width of a single page (now the scrollbars are taken into account) - targetPageWidth = (targetViewportWidth - (columns+1) * pageDistance) / columns; - - return pageCache->sizeOfPage(pageNumber).zoomForWidth(targetPageWidth); -} - - -void KMultiPage::prevPage() -{ - TQ_UINT8 cols = scrollView()->getNrColumns(); - TQ_UINT8 rows = scrollView()->getNrRows(); - - PageNumber np = 1; - if (cols*rows < currentPageNumber()) - { - np = currentPageNumber() - cols*rows; - } - - gotoPage(np); -} - - -void KMultiPage::nextPage() -{ - TQ_UINT8 cols = scrollView()->getNrColumns(); - TQ_UINT8 rows = scrollView()->getNrRows(); - - PageNumber np = TQMIN(currentPageNumber() + cols*rows, (TQ_UINT16)numberOfPages()); - - gotoPage(np); -} - - -void KMultiPage::firstPage() -{ - gotoPage(1); -} - - -void KMultiPage::lastPage() -{ - gotoPage(numberOfPages()); -} - - -void KMultiPage::scroll(TQ_INT32 deltaInPixel) -{ - TQScrollBar* scrollBar = scrollView()->verticalScrollBar(); - if (scrollBar == 0) { - kdError(4300) << "KMultiPage::scroll called without scrollBar" << endl; - return; - } - - if (deltaInPixel < 0) { - if (scrollBar->value() == scrollBar->minValue()) { - if ( (currentPageNumber() == 1) || (changePageDelayTimer.isActive()) ) - return; - - if (scrollView()->isContinuous()) - return; - - changePageDelayTimer.stop(); - prevPage(); - - scrollView()->setContentsPos(scrollView()->contentsX(), scrollBar->maxValue()); - return; - } - } - - if (deltaInPixel > 0) { - if (scrollBar->value() == scrollBar->maxValue()) { - if ( (currentPageNumber() == numberOfPages()) || (changePageDelayTimer.isActive()) ) - return; - - if (scrollView()->isContinuous()) - return; - - changePageDelayTimer.stop(); - nextPage(); - - scrollView()->setContentsPos(scrollView()->contentsX(), 0); - return; - } - } - - scrollBar->setValue(scrollBar->value() + deltaInPixel); - - if ( (scrollBar->value() == scrollBar->maxValue()) || (scrollBar->value() == scrollBar->minValue()) ) - changePageDelayTimer.start(200,true); - else - changePageDelayTimer.stop(); -} - - -void KMultiPage::scrollUp() -{ - TQScrollBar* scrollBar = scrollView()->verticalScrollBar(); - if (scrollBar == 0) - return; - - scroll(-scrollBar->lineStep()); -} - - -void KMultiPage::scrollDown() -{ - TQScrollBar* scrollBar = scrollView()->verticalScrollBar(); - if (scrollBar == 0) - return; - - scroll(scrollBar->lineStep()); -} - -void KMultiPage::scrollLeft() -{ - TQScrollBar* scrollBar = scrollView()->horizontalScrollBar(); - if (scrollBar) - scrollBar->subtractLine(); -} - - -void KMultiPage::scrollRight() -{ - TQScrollBar* scrollBar = scrollView()->horizontalScrollBar(); - if (scrollBar) - scrollBar->addLine(); -} - - -void KMultiPage::scrollUpPage() -{ - TQScrollBar* scrollBar = scrollView()->verticalScrollBar(); - if (scrollBar) - scrollBar->subtractPage(); -} - - -void KMultiPage::scrollDownPage() -{ - TQScrollBar* scrollBar = scrollView()->verticalScrollBar(); - if (scrollBar) - scrollBar->addPage(); -} - - -void KMultiPage::scrollLeftPage() -{ - TQScrollBar* scrollBar = scrollView()->horizontalScrollBar(); - if (scrollBar) - scrollBar->subtractPage(); -} - - -void KMultiPage::scrollRightPage() -{ - TQScrollBar* scrollBar = scrollView()->horizontalScrollBar(); - if (scrollBar) - scrollBar->addPage(); -} - - -void KMultiPage::readDown() -{ - PageView* sv = scrollView(); - - if (sv->atBottom()) - { - if (sv->isContinuous()) - return; - - if (currentPageNumber() == numberOfPages()) - return; - - nextPage(); - sv->setContentsPos(sv->contentsX(), 0); - } - else - sv->readDown(); -} - - -void KMultiPage::readUp() -{ - PageView* sv = scrollView(); - - if (sv->atTop()) - { - if (sv->isContinuous()) - return; - - if (currentPageNumber() == 1) - return; - - prevPage(); - sv->setContentsPos(sv->contentsX(), sv->contentsHeight()); - } - else - sv->readUp(); -} - - -void KMultiPage::jumpToReference(const TQString& reference) -{ - if (renderer.isNull()) - return; - - gotoPage(renderer->parseReference(reference)); -} - - -void KMultiPage::gotoPage(const Anchor &a) -{ - if (!a.page.isValid() || (renderer.isNull())) - return; - - gotoPage(a.page, (int)(a.distance_from_top.getLength_in_inch()*pageCache->getResolution() + 0.5), true); -} - - -void KMultiPage::gotoPage(const TextSelection& selection) -{ - if (selection.isEmpty()) - { - kdError(4300) << "KMultiPage::gotoPage(...) called with empty TextSelection." << endl; - return; - } - - RenderedDocumentPage* pageData = pageCache->getPage(selection.getPageNumber()); - - if (pageData == 0) { -#ifdef DEBUG_DOCUMENTWIDGET - kdDebug(4300) << "DocumentWidget::paintEvent: no documentPage generated" << endl; -#endif - return; - } - - switch (widgetList.size()) - { - case 0: - kdError(4300) << "KMultiPage::select() while widgetList is empty" << endl; - break; - case 1: - ((DocumentWidget*)widgetList[0])->select(selection); - break; - default: - if (widgetList.size() < currentPageNumber()) - kdError(4300) << "KMultiPage::select() while widgetList.size()=" << widgetList.size() << "and currentPageNumber()=" << currentPageNumber() << endl; - else - ((DocumentWidget*)widgetList[selection.getPageNumber() - 1])->select(selection); - } - - unsigned int y = pageData->textBoxList[selection.getSelectedTextStart()].box.top(); - gotoPage(selection.getPageNumber(), y, false); -} - - -void KMultiPage::doSelectAll() -{ - switch( widgetList.size() ) { - case 0: - kdError(4300) << "KMultiPage::doSelectAll() while widgetList is empty" << endl; - break; - case 1: - ((DocumentWidget *)widgetList[0])->selectAll(); - break; - default: - if (widgetList.size() < currentPageNumber()) - kdError(4300) << "KMultiPage::doSelectAll() while widgetList.size()=" << widgetList.size() << "and currentPageNumber()=" << currentPageNumber() << endl; - else - ((DocumentWidget *)widgetList[currentPageNumber()-1])->selectAll(); - } -} - - - -void KMultiPage::showFindTextDialog() -{ - if ((renderer.isNull()) || (renderer->supportsTextSearch() == false)) - return; - - searchWidget->show(); - searchWidget->setFocus(); -} - -void KMultiPage::stopSearch() -{ - if (searchInProgress) - { - // stop the search - searchInProgress = false; - } - else - searchWidget->hide(); -} - -void KMultiPage::findNextText() -{ -#ifdef KDVI_MULTIPAGE_DEBUG - kdDebug(4300) << "KMultiPage::findNextText() called" << endl; -#endif - - searchInProgress = true; - - // Used to remember if the documentPage we use is from the cache. - // If not we need to delete it manually to avoid a memory leak. - bool cachedPage = false; - - TQString searchText = searchWidget->getText(); - - if (searchText.isEmpty()) - { - kdError(4300) << "KMultiPage::findNextText() called when search text was empty" << endl; - return; - } - - bool case_sensitive = searchWidget->caseSensitive(); - - // Find the page and text position on the page where the search will - // start. If nothing is selected, we start at the beginning of the - // current page. Otherwise, start after the selected text. TODO: - // Optimize this to get a better 'user feeling' - TQ_UINT16 startingPage; - TQ_UINT16 startingTextItem; - - TextSelection userSelection = pageCache->selectedText(); - if (userSelection.isEmpty()) - { - startingPage = currentPageNumber(); - startingTextItem = 0; - } - else - { - startingPage = userSelection.getPageNumber(); - startingTextItem = userSelection.getSelectedTextEnd()+1; - } - - TextSelection foundSelection; - - RenderedDocumentPagePixmap* searchPage = 0; - - for(unsigned int i = 0; i < numberOfPages(); i++) - { - unsigned int pageNumber = (i + startingPage - 1) % numberOfPages() + 1; - - if (!searchInProgress) - { - // Interrupt the search - setStatusBarText(i18n("Search interrupted")); - if (!cachedPage) - delete searchPage; - return; - } - - if (i != 0) - { - setStatusBarText(i18n("Search page %1 of %2").arg(pageNumber).arg(numberOfPages())); - kapp->processEvents(); - } - - // Check if we already have a rendered version of the page in the cache. As we are only interested in the - // text we don't care about the page size. - if (pageCache->isPageCached(pageNumber)) - { - // If the last search page used was created locally, we need to destroy it - if (!cachedPage) - delete searchPage; - - searchPage = pageCache->getPage(pageNumber); - cachedPage = true; - } - else - { - // If the page is not in the cache we draw a small version of it, since this is faster. - - // We only create a new searchPage if we need to, otherwise reuse the existing one. - if (!searchPage || cachedPage) - searchPage = new RenderedDocumentPagePixmap(); - - cachedPage = false; - - searchPage->resize(1,1); - searchPage->setPageNumber(pageNumber); - renderer->getText(searchPage); - } - - // If there is no text in the current page, try the next one. - if (searchPage->textBoxList.size() == 0) - continue; - - foundSelection = searchPage->find(searchText, startingTextItem, case_sensitive); - - if (foundSelection.isEmpty()) - { - // In the next page, start search again at the beginning. - startingTextItem = 0; - clearSelection(); - - if (pageNumber == numberOfPages()) - { - int answ = KMessageBox::questionYesNo(scrollView(), - i18n("<qt>The search string <strong>%1</strong> could not be found by the " - "end of the document. Should the search be restarted from the beginning " - "of the document?</qt>").arg(searchText), - i18n("Text Not Found"), KStdGuiItem::cont(), KStdGuiItem::cancel()); - - if (answ != KMessageBox::Yes) - { - setStatusBarText(TQString()); - searchInProgress = false; - if (!cachedPage) - delete searchPage; - return; - } - } - } - else - { - pageCache->selectText(foundSelection); - gotoPage(pageCache->selectedText()); - setStatusBarText(TQString()); - searchInProgress = false; - if (!cachedPage) - delete searchPage; - return; - } - } - - KMessageBox::sorry(scrollView(), i18n("<qt>The search string <strong>%1</strong> could not be found.</qt>").arg(searchText)); - setStatusBarText(TQString()); - searchInProgress = false; - if (!cachedPage) - delete searchPage; -} - - -void KMultiPage::findPrevText() -{ -#ifdef KDVI_MULTIPAGE_DEBUG - kdDebug(4300) << "KMultiPage::findPrevText() called" << endl; -#endif - - searchInProgress = true; - - // Used to remember if the documentPage we use is from the cache. - // If not we need to delete it manually to avoid a memory leak. - bool cachedPage = false; - - TQString searchText = searchWidget->getText(); - - if (searchText.isEmpty()) - { - kdError(4300) << "KMultiPage::findPrevText() called when search text was empty" << endl; - return; - } - - bool case_sensitive = searchWidget->caseSensitive(); - - // Find the page and text position on the page where the search will - // start. If nothing is selected, we start at the beginning of the - // current page. Otherwise, start after the selected text. TODO: - // Optimize this to get a better 'user feeling' - unsigned int startingPage; - int startingTextItem; - - TextSelection userSelection = pageCache->selectedText(); - if (userSelection.isEmpty()) - { - startingPage = currentPageNumber(); - startingTextItem = -1; - } - else - { - startingPage = userSelection.getPageNumber(); - startingTextItem = userSelection.getSelectedTextStart()-1; - } - - TextSelection foundSelection; - - RenderedDocumentPagePixmap* searchPage = 0; - - for(unsigned int i = 0; i < numberOfPages(); i++) - { - int pageNumber = startingPage - i; - if (pageNumber <= 0) - pageNumber += numberOfPages(); - - if (!searchInProgress) - { - // Interrupt the search - setStatusBarText(i18n("Search interrupted")); - if (!cachedPage) - delete searchPage; - return; - } - - if (i != 0) - { - setStatusBarText(i18n("Search page %1 of %2").arg(pageNumber).arg(numberOfPages())); - kapp->processEvents(); - } - - // Check if we already have a rendered version of the page in the cache. As we are only interested in the - // text we don't care about the page size. - if (pageCache->isPageCached(pageNumber)) - { - // If the last search page used was created locally, we need to destroy it - if (!cachedPage) - delete searchPage; - - searchPage = pageCache->getPage(pageNumber); - cachedPage = true; - } - else - { - // If the page is not in the cache we draw a small version of it, since this is faster. - - // We only create a new searchPage if we need to, otherwise reuse the existing one. - if (!searchPage || cachedPage) - searchPage = new RenderedDocumentPagePixmap(); - - cachedPage = false; - - searchPage->resize(1,1); - searchPage->setPageNumber(pageNumber); - renderer->getText(searchPage); - } - - // If there is no text in the current page, try the next one. - if (searchPage->textBoxList.size() == 0) - continue; - - foundSelection = searchPage->findRev(searchText, startingTextItem, case_sensitive); - - if (foundSelection.isEmpty()) - { - // In the next page, start search again at the beginning. - startingTextItem = -1; - clearSelection(); - - if (pageNumber == 1) - { - int answ = KMessageBox::questionYesNo(scrollView(), - i18n("<qt>The search string <strong>%1</strong> could not be found by the " - "beginning of the document. Should the search be restarted from the end " - "of the document?</qt>").arg(searchText), - i18n("Text Not Found"), KStdGuiItem::cont(), KStdGuiItem::cancel()); - - if (answ != KMessageBox::Yes) - { - setStatusBarText(TQString()); - searchInProgress = false; - if (!cachedPage) - delete searchPage; - return; - } - } - } - else - { - pageCache->selectText(foundSelection); - gotoPage(pageCache->selectedText()); - setStatusBarText(TQString()); - searchInProgress = false; - if (!cachedPage) - delete searchPage; - return; - } - } - - KMessageBox::sorry(scrollView(), i18n("<qt>The search string <strong>%1</strong> could not be found.</qt>").arg(searchText)); - setStatusBarText(TQString()); - searchInProgress = false; - if (!cachedPage) - delete searchPage; -} - - -void KMultiPage::clearSelection() -{ - PageNumber page = pageCache->selectedText().getPageNumber(); - - if (!page.isValid()) - return; - - // Clear selection - pageCache->deselectText(); - - // Now we need to update the widget which contained the selection - switch(widgetList.size()) - { - case 0: - kdError(4300) << "KMultiPage::clearSelection() while widgetList is empty" << endl; - break; - case 1: - widgetList[0]->update(); - break; - default: - for (unsigned int i = 0; i < widgetList.size(); i++) - { - DocumentWidget* pageWidget = (DocumentWidget*)widgetList[i]; - if (pageWidget->getPageNumber() == page) - { - pageWidget->update(); - break; - } - } - } -} - -void KMultiPage::copyText() -{ - pageCache->selectedText().copyText(); -} - -void KMultiPage::timerEvent( TQTimerEvent * ) -{ -#ifdef KMULTIPAGE_DEBUG - kdDebug(4300) << "Timer Event " << endl; -#endif - reload(); -} - - -void KMultiPage::reload() -{ -#ifdef KMULTIPAGE_DEBUG - kdDebug(4300) << "Reload file " << m_file << endl; -#endif - - if (renderer.isNull()) { - kdError() << "KMultiPage::reload() called, but no renderer was set" << endl; - return; - } - - if (renderer->isValidFile(m_file)) { - pageCache->clear(); - pageCache->deselectText(); - document_history.clear(); - emit setStatusBarText(i18n("Reloading file %1").arg(m_file)); - TQ_INT32 pg = currentPageNumber(); - - killTimer(timer_id); - timer_id = -1; - bool r = renderer->setFile(m_file, m_url); - - generateDocumentWidgets(); - - // Set Table of Contents - tableOfContents->setContents(renderer->getBookmarks()); - - // Adjust number of widgets in the thumbnail sidebar - markList()->clear(); - markList()->setNumberOfPages(numberOfPages(), KVSPrefs::showThumbnails()); - - setCurrentPageNumber(pg); - setFile(r); - emit setStatusBarText(TQString()); - } else { - if (timer_id == -1) - timer_id = startTimer(1000); - } -} - - -bool KMultiPage::openFile() -{ - if (renderer.isNull()) { - kdError(4300) << "KMultiPage::openFile() called when no renderer was set" << endl; - return false; - } - - pageCache->deselectText(); - document_history.clear(); - pageCache->clear(); - emit setStatusBarText(i18n("Loading file %1").arg(m_file)); - - bool r = renderer->setFile(m_file, m_url); - - if (r) { - setCurrentPageNumber(1); - generateDocumentWidgets(); - - // Set number of widgets in the thumbnail sidebar - markList()->clear(); - markList()->setNumberOfPages(numberOfPages(), KVSPrefs::showThumbnails()); - - TQString reference = url().ref(); - if (!reference.isEmpty()) - gotoPage(renderer->parseReference(reference)); - - // Set Table of Contents - tableOfContents->setContents(renderer->getBookmarks()); - } else - m_file = TQString(); - - - setFile(r); - - // Clear Statusbar - emit setStatusBarText(TQString()); - return r; -} - - -bool KMultiPage::openURL(const TQString &filename, const KURL &base_url) -{ - m_file = filename; - m_url = base_url; - - bool success = openFile(); - if (success) - setCurrentPageNumber(1); - - return success; -} - - -void KMultiPage::enableActions(bool fileLoaded) -{ - Q_UNUSED(fileLoaded); -} - -void KMultiPage::wheelEvent(TQWheelEvent *e) -{ - TQScrollBar *sb = scrollView()->verticalScrollBar(); - if (sb == 0) - return; - - // Zoom in/out - if (e->state() & ControlButton) - { - if (e->delta() < 0) - emit zoomOut(); - else - emit zoomIn(); - return; - } - - TQ_INT32 pxl = -(e->delta()*sb->lineStep())/60; - if (pxl == 0) - { - if (e->delta() > 0) - pxl = -1; - else - pxl = 1; - } - - // Faster scrolling - if (e->state() & ShiftButton) - pxl *= 10; - - scroll(pxl); -} - - -KPrinter *KMultiPage::getPrinter(bool enablePageSizeFeatures) -{ - // Allocate a new KPrinter structure, if necessary - KPrinter *printer = new KPrinter(true); - if (printer == 0) { - kdError(1223) << "KMultiPage::getPrinter(..): Cannot allocate new KPrinter structure" << endl; - return 0; - } - - // Allocate a new KPrintDialogPage structure and add it to the - // printer, if the kmultipage implementation requests that - if (enablePageSizeFeatures == true) { - KPrintDialogPage_PageOptions *pageOptions = new KPrintDialogPage_PageOptions(); - if (pageOptions == 0) { - kdError(1223) << "KMultiPage::getPrinter(..): Cannot allocate new KPrintDialogPage_PageOptions structure" << endl; - delete printer; - return 0; - } - printer->addDialogPage( pageOptions ); - } - - // Feed the printer with useful defaults and information. - printer->setPageSelection( KPrinter::ApplicationSide ); - printer->setCurrentPage( currentPageNumber() ); - printer->setMinMax( 1, numberOfPages() ); - printer->setFullPage( true ); - - // If pages are marked, give a list of marked pages to the - // printer. We try to be smart and optimize the list by using ranges - // ("5-11") wherever possible. The user will be tankful for - // that. Complicated? Yeah, but that's life. - TQValueList<int> selectedPageNo = selectedPages(); - if (selectedPageNo.isEmpty() == true) - printer->setOption( "kde-range", "" ); - else { - int commaflag = 0; - TQString range; - TQValueList<int>::ConstIterator it = selectedPageNo.begin(); - do{ - int val = *it; - if (commaflag == 1) - range += TQString(", "); - else - commaflag = 1; - int endval = val; - if (it != selectedPageNo.end()) { - TQValueList<int>::ConstIterator jt = it; - jt++; - do{ - int val2 = *jt; - if (val2 == endval+1) - endval++; - else - break; - jt++; - } while( jt != selectedPageNo.end() ); - it = jt; - } else - it++; - if (endval == val) - range += TQString("%1").arg(val); - else - range += TQString("%1-%2").arg(val).arg(endval); - } while (it != selectedPageNo.end() ); - printer->setOption( "kde-range", range ); - } - - return printer; -} - -void KMultiPage::doExportText() -{ - // Generate a suggestion for a reasonable file name - TQString suggestedName = url().filename(); - suggestedName = suggestedName.left(suggestedName.find(".")) + ".txt"; - - TQString fileName = KFileDialog::getSaveFileName(suggestedName, i18n("*.txt|Plain Text (Latin 1) (*.txt)"), scrollView(), i18n("Export File As")); - - if (fileName.isEmpty()) - return; - - TQFileInfo finfo(fileName); - if (finfo.exists()) - { - int r = KMessageBox::warningContinueCancel (scrollView(), - i18n("The file %1\nexists. Do you want to overwrite that file?").arg(fileName), - i18n("Overwrite File"), i18n("Overwrite")); - - if (r == KMessageBox::Cancel) - return; - } - - TQFile textFile(fileName); - textFile.open(IO_WriteOnly); - TQTextStream stream(&textFile); - - TQProgressDialog progress(i18n("Exporting to text..."), i18n("Abort"), renderer->totalPages(), - scrollView(), "export_text_progress", true); - progress.setMinimumDuration(300); - - RenderedDocumentPagePixmap dummyPage; - dummyPage.resize(1, 1); - - for(unsigned int page = 1; page <= renderer->totalPages(); page++) - { - progress.setProgress(page); - tqApp->processEvents(); - - if (progress.wasCancelled()) - break; - - dummyPage.setPageNumber(page); - // We gracefully ignore any errors (bad file, etc.) - renderer->getText(&dummyPage); - - for(unsigned int i = 0; i < dummyPage.textBoxList.size(); i++) - { - // We try to detect newlines - if (i > 0) - { - // Like all our textalgorithmns this currently assumes left to right text. - // TODO: make this more generic. But we first would need to guess the corrent - // orientation. - if (dummyPage.textBoxList[i].box.top() > dummyPage.textBoxList[i-1].box.bottom() && - dummyPage.textBoxList[i].box.x() < dummyPage.textBoxList[i-1].box.x()) - { - stream << "\n"; - } - } - stream << dummyPage.textBoxList[i].text; - } - - // Send newline after each page. - stream << "\n"; - } - - // Switch off the progress dialog, etc. - progress.setProgress(renderer->totalPages()); - return; -} - -void KMultiPage::slotEnableMoveTool(bool enable) -{ - emit enableMoveTool(enable); -} - -#include "kmultipage.moc" |