(*** 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)
--=-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--
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
Reopening because assumed fix was reverted.
Created attachment 550 [details] Current proposed patch (11/29/02)
Created attachment 585 [details] Current proposed patch (12/01/02)
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; };