[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/work/kviewshell-0.7/kviewshell
From:       Stefan Kebekus <kebekus () kde ! org>
Date:       2006-09-14 5:46:30
Message-ID: 1158212790.964315.14791.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 584141 by kebekus:

fixes problems with links in DVI files


 M  +10 -5     plugins/dvi/dviRenderer.cpp  
 M  +2 -2      plugins/pdf/pdfRenderer.cpp  
 M  +15 -0     shell/anchor.h  
 M  +11 -8     shell/dataModel.cpp  
 M  +26 -3     shell/dataModel.h  
 M  +3 -0      shell/documentWidget.cpp  
 M  +3 -0      shell/hyperlink.h  
 M  +2 -1      shell/kviewpart.cpp  
 M  +2 -0      shell/kvs_debug.h  
 M  +4 -0      shell/length.h  
 M  +11 -0     shell/pageNumber.h  
 M  +109 -14   shell/pageView.cpp  
 M  +0 -1      shell/pageView.h  


--- branches/work/kviewshell-0.7/kviewshell/plugins/dvi/dviRenderer.cpp \
#584140:584141 @@ -268,12 +268,13 @@
   QRegExp itemExp("item\\.(.*)");
   QRegExp citeExp("cite\\.(.*)");
 
-  // And finally add anchors to the links
+  // And finally add anchors to the links, if the links are local
   for (i = page->hyperLinkList.begin(); i != page->hyperLinkList.end(); i++)
   {
-    Anchor anchor = findAnchor((*i).linkText);
-    (*i).anchor = anchor;
-
+#warning TODO: remove link if anchor cannot be found
+    if ((*i).linkText[0] == '#') // is local link?
+      (*i).anchor = findAnchor((*i).linkText.mid(1));
+    
     // Also replace the targetnames created by the hyperref package,
     // with proper translatable names.
     QString temp = (*i).linkText;
@@ -926,8 +927,12 @@
   QMap<QString,Anchor>::Iterator it = anchorList.find(locallink);
   if (it != anchorList.end())
     return *it;
-  else
+  else {
+#ifdef DEBUG_DVIRENDERER
+    kdDebug(kvs::dvi) << QString("dviRenderer::findAnchor(%1): no anchor \
found.").arg(locallink) << endl; +#endif
     return Anchor();
+  }
 }
 
 #include "dviRenderer.moc"
--- branches/work/kviewshell-0.7/kviewshell/plugins/pdf/pdfRenderer.cpp \
#584140:584141 @@ -53,6 +53,7 @@
 #include "documentWidget.h"
 #include "documentInfoWidget_base.h"
 #include "hyperlink.h"
+#include "kvs_debug.h"
 #include "textBox.h"
 #include "pagetransition.h"
 #include "pdfRenderer.h"
@@ -182,9 +183,8 @@
             Length y;
             y.setLength_in_pixel((int)destination.top(), res);
             Anchor anchor(destination.pageNumber(), y);
-            //kdDebug() << "Anchor: url = " << destination.toString() << " (page = " \
                << destination.pageNumber() << ", y = " << destination.top() << ")" \
                << endl;
-            //kdDebug() << "Hyperlink: (" << area.x() << ", " << area.y() << ", " << \
area.width() << ", " << area.height() << ")" << endl;  Hyperlink \
hyperlink(area.bottom(), area, url, anchor); +	    //	    kdDebug(kvs::pdf) << \
"PdfRenderer::drawPage: hyperlink added " << hyperlink << endl;  \
page->hyperLinkList.push_back(hyperlink);  }
           else if (link->linkType() == Poppler::Link::Browse)
--- branches/work/kviewshell-0.7/kviewshell/shell/anchor.h #584140:584141
@@ -11,6 +11,8 @@
 #ifndef ANCHOR_H
 #define ANCHOR_H
 
+#include <qstring.h>
+
 #include "length.h"
 #include "pageNumber.h"
 
@@ -32,6 +34,16 @@
   /** \brief Constructs an anchor that points to an invalid page */
   Anchor() {page = 0;}
 
+  /** \brief Constructs an snchor that points to the top of a given
+      page
+
+      The class contains no code to make sure in any way that the page
+      number pg exists
+
+      @param pg number of the page
+  */
+  Anchor(const PageNumber& pg): page(pg), distance_from_top() {}
+
   /** \brief Constructs an snchor that points to a given position on a
       given page
 
@@ -55,6 +67,9 @@
 
   /** \brief Distance from the top of the page in inch */
   Length   distance_from_top;
+
+  /** \brief This method implements typecasts to QString */
+  operator QString() const { return QString("(page=%1, %2 from \
top)").arg(page.toQString()).arg(distance_from_top); }  };
 
 
--- branches/work/kviewshell-0.7/kviewshell/shell/dataModel.cpp #584140:584141
@@ -56,15 +56,18 @@
 
 void DataModel::setCurrentPageNumber(const PageNumber& pageNumber, bool weak)
 {
-  if (pageNumber != _currentPageNumber)
-  {
-    _currentPageNumber = pageNumber;
-    emit currentPageNumberChanged();
-    if (!weak)
-    {
+  if (pageNumber > numberOfPages()) {
+    kdError(kvs::shell) << "DataModel::setCurrentPageNumber called with pageNumber \
higher than the number of pages in the document" << endl; +    return;
+  }
+  
+  if (pageNumber == _currentPageNumber)
+    return;
+  
+  _currentPageNumber = pageNumber;
+  emit currentPageNumberChanged();
+  if (!weak)
       emit gotoCurrentPage();
-    }
-  }
 }
 
 
--- branches/work/kviewshell-0.7/kviewshell/shell/dataModel.h #584140:584141
@@ -49,14 +49,32 @@
   DataModel(QObject* parent = 0);
   virtual ~DataModel();
 
+  
+  /** @brief get the current page number
+   */
   PageNumber currentPageNumber();
+
+  /** @brief sets the current page number
+
+     This method sets the current page number. The signal
+     currentPageNumberChanged() will be emitted. The signal
+     gotoCurrentPage() might be emitted.
+
+     @param PageNumber The new page number; this number must not be
+     greater than numberOfPages(). If this number equals the
+     currentPageNumber(), this method exits immediately and nothing
+     happens.
+
+     @param weak This parameter decides if the signal
+     gotoCurrentPage() is emitted.
+  */
   void setCurrentPageNumber(const PageNumber&, bool weak = false);
 
   unsigned int numberOfPages();
   void setNumberOfPages(unsigned int);
-
+  
   /** @brief get the resolution currently used for drawing.
-
+      
      @returns the resolution of the display device. In
      principle. In fact, kviewshell implements zooming by calling the
      setResolution()-method with values that are not exactly the
@@ -182,11 +200,16 @@
 
 signals:
   void currentPageNumberChanged();
+
+  /** This signal might emitted when the method setCurrentPageNumber()
+      is called. It indicates that the current page number has changed
+      and that the display should be updated accordingly.
+   */
   void gotoCurrentPage();
   void numberOfPagesChanged();
   void layoutChanged();
 
-  /** This signal es emitted whenever the selected text changes.
+  /** This signal is emitted whenever the selected text changes.
       The argument is false if no text is selected, true otherwise.
 
       @ref deselectText
--- branches/work/kviewshell-0.7/kviewshell/shell/documentWidget.cpp #584140:584141
@@ -545,6 +545,9 @@
       {
         if (pageData->hyperLinkList[i].box.contains(inverseMap(e->pos())))
         {
+#ifdef DEBUG_DOCUMENTWIDGET
+          kdDebug(kvs::shell) << "DocumentWidget::mousePressEvent(): mouse pressed \
on hyperlink " << pageData->hyperLinkList[i].linkText << endl; +#endif
           emit localLink(pageData->hyperLinkList[i]);
           return;
         }
--- branches/work/kviewshell-0.7/kviewshell/shell/hyperlink.h #584140:584141
@@ -88,6 +88,9 @@
   should be set to invalid.
   */
   Anchor anchor;
+
+  /** \brief This method implements typecasts to QString */
+  operator QString() const { return QString("(name=%1, \
anchor=%2)").arg(linkText).arg(anchor); }  };
 
 
--- branches/work/kviewshell-0.7/kviewshell/shell/kviewpart.cpp #584140:584141
@@ -1874,7 +1874,8 @@
       args << "openURL";
       args << Link_Url.toString();
       kapp->kdeinitExec("kfmclient", args);
-    }
+    } else
+      kdError(kvs::shell) << "KMultiPage::handleLocalLink( ... ) with link to " << \
link << endl;  }
 }
 
--- branches/work/kviewshell-0.7/kviewshell/shell/kvs_debug.h #584140:584141
@@ -23,6 +23,8 @@
     djvu = 1223,
     dvi = 4300,
     fax = 1223,
+    pdf = 1223,
+    ps = 1223,
     shell = 1223
   };
 
--- branches/work/kviewshell-0.7/kviewshell/shell/length.h #584140:584141
@@ -13,6 +13,7 @@
 #define _length_h_
 
 #include <cmath>
+#include <qstring.h>
 
 class QString;
 
@@ -181,6 +182,9 @@
   It is fine to set ok to 0. */
   static float convertToMM(const QString &distance, bool *ok=0);
 
+  /** \brief This simple method implements typecasts to QString */
+  operator QString() const { return QString::number(length_in_mm, 'f', 2)+"mm"; }
+
  private:
   /** Length in millimeters */
   double length_in_mm;
--- branches/work/kviewshell-0.7/kviewshell/shell/pageNumber.h #584140:584141
@@ -11,6 +11,7 @@
 #define PAGENUMBER_H
 
 #include <qglobal.h>
+#include <qstring.h>
 
 
 /** \brief Class to represent a page number
@@ -55,6 +56,16 @@
   */
   bool isValid() const {return (pgNum != invalidPage);}
 
+  /** \brief This simple method represents the page number as a string
+
+  We do not implement a typecast here, because otherwise there would
+  be too many ambiguous typecasts that one would have to sort out
+  manually.
+
+  @returns the page number as a string or 'invalid'
+  */
+  QString toQString() const { return isValid() ? QString::number(pgNum) : "invalid"; \
}; +
  private:
   /** \brief Single number that represents the page number */
   Q_UINT16 pgNum;
--- branches/work/kviewshell-0.7/kviewshell/shell/pageView.cpp #584140:584141
@@ -970,16 +970,10 @@
   // 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);
+    gotoAnchor(startPage);
 }
 
 
-bool PageView::gotoPage(const PageNumber& page)
-{
-  return gotoPage(page, 0, true);
-}
-
-
 bool PageView::gotoPage(const PageNumber& page, int y, bool isLink)
 {
   kdDebug(kvs::shell) << "PageView::gotoPage()" << endl;
@@ -1140,10 +1134,111 @@
 
 void PageView::gotoAnchor(const Anchor& a)
 {
-  if (!a.page.isValid())
+  kdDebug(kvs::shell) << "PageView::gotoAnchor()" << endl;
+
+  //  gotoPage(a.page, (int)(a.distance_from_top.getLength_in_inch() * \
dataModel->resolution() + 0.5), true); +
+  if (!a.page.isValid()) {
+    kdError(kvs::shell) << "PageView::gotoAnchor() call when anchor had invalid \
pageNumber." << endl;  return;
+  }
+  if (dataModel->numberOfPages() == 0) {
+    kdError(kvs::shell) << "PageView::gotoAnchor() called with numberOfPages == 0" \
<< endl; +    return;
+  }
+  if (numberOfWidgets() == 0) {
+    kdError(kvs::shell) << "PageView::gotoAnchor() called, but widgetList is empty" \
<< endl; +    return;
+  }
 
-  gotoPage(a.page, (int)(a.distance_from_top.getLength_in_inch() * \
dataModel->resolution() + 0.5), true); +  PageNumber page = a.page;
+  int y = (int)(a.distance_from_top.getLength_in_inch() * dataModel->resolution() + \
0.5); +#warning FIX THIS
+  bool isLink = true;  
+
+  if (isLink)
+    dataModel->history()->add(page, y);
+  
+  DocumentWidget* _pageWidget;
+  
+  // If we are in overview viewmode
+  if (dataModel->preferences()->viewMode() == KVSPrefs::EnumViewMode::Overview) {
+    unsigned int visiblePages = dataModel->preferences()->overviewModeColumns() * \
dataModel->preferences()->overviewModeRows(); +    // Pagenumber of the first \
visibile Page in the current tableau +    unsigned int firstPage = \
pageWidget(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.
+    bool newTableu = false;
+    if (firstPage != tableauStartPage) { // widgets need to be updated
+      newTableu = true;
+      if ((dataModel->numberOfPages() - tableauStartPage + 1 < visiblePages) || \
(numberOfWidgets() < 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 < numberOfWidgets(); i++) {
+          _pageWidget = pageWidget(i);
+          if (_pageWidget != 0)
+            _pageWidget->setPageNumber(tableauStartPage + i);
+        }
+        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
+    // QScrollview, so that we better call setCurrentPage() ourselves.
+    _pageWidget = pageWidget(page % visiblePages);
+
+    if (newTableu) {
+      // If we have switched to a new tableu, we don't want smooth scrolling
+      moveViewportToWidget(_pageWidget, y, false);
+    } else
+      moveViewportToWidget(_pageWidget, y);
+    return;
+  } else if (numberOfWidgets() == 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 = pageWidget(0);
+
+    // Paranoia security check
+    if (_pageWidget == 0) {
+      kdError(kvs::shell) << "PageView::gotoAnchor() called with widgetList.size() \
== 1, but widgetList[0] == 0" << endl; +      return;
+    }
+
+    _pageWidget->setPageNumber(page);
+    layoutPages();
+    moveViewportToWidget(_pageWidget, y, false);
+  } 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 (numberOfWidgets() < page) {
+      kdError(kvs::shell) << "PageView::gotoAnchor() called with widgetList.size()=" \
<< numberOfWidgets() << ", and page=" << page << endl; +      return;
+    }
+    _pageWidget = pageWidget(page-1);
+    if (_pageWidget == 0) {
+      kdError(kvs::shell) << "PageView::gotoAnchor() called with widgetList.size() > \
1, but widgetList[page] == 0" << endl; +      return;
+    }
+
+    moveViewportToWidget(_pageWidget, y);
+  }
+
+  if (isLink && y != 0)
+    _pageWidget->flash(y);
+
+  return;
 }
 
 
@@ -1155,7 +1250,7 @@
     np = dataModel->currentPageNumber() - nrCols*nrRows;
   }
 
-  gotoPage(np);
+  gotoAnchor(np);
 }
 
 
@@ -1163,19 +1258,19 @@
 {
   PageNumber np = QMIN(dataModel->currentPageNumber() + nrCols*nrRows, \
dataModel->numberOfPages());  
-  gotoPage(np);
+  gotoAnchor(np);
 }
 
 
 void PageView::firstPage()
 {
-  gotoPage(1);
+  gotoAnchor(Anchor(1));
 }
 
 
 void PageView::lastPage()
 {
-  gotoPage(dataModel->numberOfPages());
+  gotoAnchor(Anchor(dataModel->numberOfPages()));
 }
 
 
@@ -1431,7 +1526,7 @@
 
 void PageView::gotoCurrentPage()
 {
-  gotoPage(dataModel->currentPageNumber());
+  gotoAnchor(Anchor(dataModel->currentPageNumber()));
 }
 
 #include "pageView.moc"
--- branches/work/kviewshell-0.7/kviewshell/shell/pageView.h #584140:584141
@@ -53,7 +53,6 @@
 
     // These two will probably end up private
     bool gotoPage(const PageNumber& page, int y, bool isLink = true);
-    bool gotoPage(const PageNumber& page);
 
     /** Make the selection visible */
     void gotoSelection(const TextSelection&);


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic