Bug 41268

Summary: scrolling behavior in diff view
Product: [Applications] cervisia Reporter: Richard Tango-Lowy <richtl>
Component: generalAssignee: Stephan Binner <binner>
Status: RESOLVED FIXED    
Severity: normal    
Priority: NOR    
Version: 1.5rich1   
Target Milestone: ---   
Platform: Mandrake RPMs   
OS: Linux   
Latest Commit: Version Fixed In:
Sentry Crash Report:
Attachments: Current proposed patch (11/29/02)
Current proposed patch (12/01/02)

Description Richard Tango-Lowy 2002-04-18 23:54:36 UTC
(*** This bug was imported into bugs.kde.org ***)

Package:           cervisia
Version:           1.5rich1 (using KDE 3.0.0 )
Severity:          normal
Installed from:    Mandrake Linux 8.2 i586 - Cooker
Compiler:          gcc version 2.96 20000731 (Mandrake Linux 8.2 2.96-0.76mdk)
OS:                Linux (i686) release 2.4.18-6mdk
OS/Compiler notes: 

When I view diffs in the diffs dialog tabs are expanded to 25 spaces or so. Deeply nested code scrolls off right side of the viewable diff display and can't be seen.

Ex:

<?PHP
class foo extends bar {
                          function next_line_begins_way_out_here() {
                                                                      this_line_is_waaaay_out_to_the_right;
                          }
}

I only have one actual tab in my source.

(Submitted via bugs.kde.org)
(Called from KBugReport dialog)
Comment 1 Richard Tango-Lowy 2002-04-19 17:55:12 UTC
--=-zQDlIxUgzqO7ETfJiQrl
Content-Type: multipart/alternative; boundary="=-omyd6FoqDlshJzF/asAv"

--=-omyd6FoqDlshJzF/asAv
Content-Type: text/plain
Content-Transfer-Encoding: quoted-printable

Dumb user error.

Today I noticed I can (1) change the tabwidth from 8 to 4 (2) switch to
a smaller (and fixed) font. I was using a proportional font before and
it seemed to screw up the tabs.

You do have a hard limit on how far to the right the user can
horizontally scroll in the diff windows though. It would be best if I
could scroll as far to the right as I have code to scroll to.

Rich Tango-Lowy
--=20
ars Cognita   The Art of Knowledge
              ---------------------
              Richard Tango-Lowy
      richtl@arscognita.com
      603 424-6555

--=-omyd6FoqDlshJzF/asAv
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">
<HTML>
<HEAD>
  <META HTTP-EQUIV=3D"Content-Type" CONTENT=3D"text/html; CHARSET=3DUTF-8">
  <META NAME=3D"GENERATOR" CONTENT=3D"GtkHTML/1.0.1">
</HEAD>
<BODY>
Dumb user error.
<BR>

<BR>
Today I noticed I can (1) change the tabwidth from 8 to 4 (2) switch to a =
smaller (and fixed) font. I was using a proportional font before and it se=
emed to screw up the tabs.
<BR>

<BR>
You do have a hard limit on how far to the right the user can horizontally =
scroll in the diff windows though. It would be best if I could scroll as f=
ar to the right as I have code to scroll to.
<BR>

<BR>
Rich Tango-Lowy
<TABLE CELLSPACING=3D"0" CELLPADDING=3D"0" WIDTH=3D"100%">
<TR>
<TD>
<PRE>--=20
ars Cognita   The Art of Knowledge
              ---------------------
              Richard Tango-Lowy
      richtl@arscognita.com
      603 424-6555</PRE>
</TD>
</TR>
</TABLE>

</BODY>
</HTML>

--=-omyd6FoqDlshJzF/asAv--

--=-zQDlIxUgzqO7ETfJiQrl
Content-Type: application/pgp-signature; name=signature.asc
Content-Description: This is a digitally signed message part

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see http://www.gnupg.org

iD8DBQA8wFoAD6UgN81JgeMRAibFAKCS75Cn35pHnSKh4vuxN6xx0/cClgCgwNUH
o/Fvo2m5+7KtOqduB1KaeRs=
=IWae
-----END PGP SIGNATURE-----

--=-zQDlIxUgzqO7ETfJiQrl--
Comment 2 Stephan Binner 2002-11-17 11:04:59 UTC
Subject: kdesdk/cervisia

CVS commit by binner: 

Changed handling of tabulators in to be diffed lines.
CCMAIL: 41268-done@bugs.kde.org


  M +11 -9     diffview.cpp   1.14

Comment 3 Stephan Binner 2002-11-25 17:39:55 UTC
Reopening because assumed fix was reverted. 
Comment 4 Christian Loose 2002-11-29 22:16:52 UTC
Created attachment 550 [details]
Current proposed patch (11/29/02)
Comment 5 Christian Loose 2002-12-08 12:58:38 UTC
Created attachment 585 [details]
Current proposed patch (12/01/02)
Comment 6 Christian Loose 2002-12-12 22:30:03 UTC
Subject: KDE_3_1_BRANCH: kdesdk/cervisia

CVS commit by cloose: 

backport from HEAD:
Fix the too small scroll area of diff view when
tabs in source code.

CCMAIL: 41268-done@bugs.kde.org


  M +5 -0      ChangeLog   1.22.2.3
  M +21 -6     diffview.cpp   1.15.2.1
  M +2 -0      diffview.h   1.4.2.1


--- kdesdk/cervisia/ChangeLog  #1.22.2.2:1.22.2.3
@@ -1,2 +1,7 @@
+2002-12-12  Christian Loose <christian.loose@hamburg.de>
+
+        * Fix the too small scroll area of diff view when
+          tabs in source code
+
 2002-12-05  Christian Loose <christian.loose@hamburg.de>
 

--- kdesdk/cervisia/diffview.cpp  #1.15:1.15.2.1
@@ -18,4 +18,5 @@
 #include <qscrollbar.h>
 #include <qpixmap.h>
+#include <qregexp.h>
 #include <qstyle.h>
 
@@ -70,4 +71,7 @@ DiffView::DiffView( bool withlinenos, bo
     textwidth = 0;
 
+    config->setGroup("General");
+    m_tabWidth = config->readUnsignedNumEntry("TabWidth", 8);
+
     items.setAutoDelete(true);
     linenos = withlinenos;
@@ -157,6 +161,20 @@ void DiffView::addLine(const QString &li
     QFont f(font());
     f.setBold(true);
-    QFontMetrics fm(f);
-    textwidth = QMAX(textwidth, fm.width(line));
+    QFontMetrics fmbold(f);
+    QFontMetrics fm(font());
+
+
+    // calculate textwidth based on 'line' where tabs are expanded
+    //
+    // *Please note*
+    // For some fonts, e.g. "Clean", is fm.maxWidth() greater than
+    // fmbold.maxWidth().
+    QString copy(line);
+    int numTabs = copy.contains('\t', false);
+    copy.replace( QRegExp("\t"), "");
+
+    uint tabSize   = m_tabWidth * QMAX(fm.maxWidth(), fmbold.maxWidth());
+    uint copyWidth = QMAX(fm.width(copy), fmbold.width(copy));
+    textwidth = QMAX(textwidth, copyWidth + numTabs * tabSize);
 
     DiffViewItem *item = new DiffViewItem;
@@ -282,9 +300,6 @@ QSize DiffView::sizeHint() const
 void DiffView::paintCell(QPainter *p, int row, int col)
 {
-    KConfig *config = CervisiaPart::config();
-    config->setGroup("General");
-    uint tabWidth = config->readUnsignedNumEntry("TabWidth", 8);
     QFontMetrics fm(font());
-    p->setTabStops(tabWidth * fm.maxWidth());
+    p->setTabStops(m_tabWidth * fm.maxWidth());
 
     DiffViewItem *item = items.at(row);

--- kdesdk/cervisia/diffview.h  #1.4:1.4.2.1
@@ -86,4 +86,6 @@ private:
     QColor diffInsertColor;
     QColor diffDeleteColor;
+
+    unsigned int    m_tabWidth;
 };