summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/tinykate/libkate/document/katedocument.cpp6
1 files changed, 3 insertions, 3 deletions
diff --git a/noncore/apps/tinykate/libkate/document/katedocument.cpp b/noncore/apps/tinykate/libkate/document/katedocument.cpp
index 0d84bcf..10bc976 100644
--- a/noncore/apps/tinykate/libkate/document/katedocument.cpp
+++ b/noncore/apps/tinykate/libkate/document/katedocument.cpp
@@ -1,1932 +1,1932 @@
1/*************************************************************************** 1/***************************************************************************
2 katedocument.cpp - description 2 katedocument.cpp - description
3 ------------------- 3 -------------------
4 begin : Mon Jan 15 2001 4 begin : Mon Jan 15 2001
5 copyright : (C) 2001 by Christoph "Crossfire" Cullmann 5 copyright : (C) 2001 by Christoph "Crossfire" Cullmann
6 (C) 2002 by Joseph Wenninger 6 (C) 2002 by Joseph Wenninger
7 email : crossfire@babylon2k.de 7 email : crossfire@babylon2k.de
8 jowenn@kde.org 8 jowenn@kde.org
9 9
10***************************************************************************/ 10***************************************************************************/
11 11
12/*************************************************************************** 12/***************************************************************************
13 * * 13 * *
14 * This program is free software; you can redistribute it and/or modify * 14 * This program is free software; you can redistribute it and/or modify *
15 * it under the terms of the GNU General Public License as published by * 15 * it under the terms of the GNU General Public License as published by *
16 * the Free Software Foundation; either version 2 of the License, or * 16 * the Free Software Foundation; either version 2 of the License, or *
17 * (at your option) any later version. * 17 * (at your option) any later version. *
18 * * 18 * *
19 ***************************************************************************/ 19 ***************************************************************************/
20 20
21/* 21/*
22 Copyright (C) 1998, 1999 Jochen Wilhelmy 22 Copyright (C) 1998, 1999 Jochen Wilhelmy
23 digisnap@cs.tu-berlin.de 23 digisnap@cs.tu-berlin.de
24 24
25 This library is free software; you can redistribute it and/or 25 This library is free software; you can redistribute it and/or
26 modify it under the terms of the GNU Library General Public 26 modify it under the terms of the GNU Library General Public
27 License as published by the Free Software Foundation; either 27 License as published by the Free Software Foundation; either
28 version 2 of the License, or (at your option) any later version. 28 version 2 of the License, or (at your option) any later version.
29 29
30 This library is distributed in the hope that it will be useful, 30 This library is distributed in the hope that it will be useful,
31 but WITHOUT ANY WARRANTY; without even the implied warranty of 31 but WITHOUT ANY WARRANTY; without even the implied warranty of
32 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 32 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
33 Library General Public License for more details. 33 Library General Public License for more details.
34 34
35 You should have received a copy of the GNU Library General Public License 35 You should have received a copy of the GNU Library General Public License
36 along with this library; see the file COPYING.LIB. If not, write to 36 along with this library; see the file COPYING.LIB. If not, write to
37 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 37 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
38 Boston, MA 02111-1307, USA. 38 Boston, MA 02111-1307, USA.
39*/ 39*/
40 40
41#include "katedocument.h" 41#include "katedocument.h"
42 42
43 43
44#include <qfileinfo.h> 44#include <qfileinfo.h>
45#include <qdatetime.h> 45#include <qdatetime.h>
46 46
47#include <kmessagebox.h> 47#include <kmessagebox.h>
48#include <klocale.h> 48#include <klocale.h>
49#include <qpe/config.h> 49#include <qpe/config.h>
50#include <qstring.h> 50#include <qstring.h>
51 51
52#include <sys/time.h> 52#include <sys/time.h>
53#include <unistd.h> 53#include <unistd.h>
54 54
55#include <stdio.h> 55#include <stdio.h>
56 56
57#include <qtimer.h> 57#include <qtimer.h>
58#include <qobject.h> 58#include <qobject.h>
59#include <qapplication.h> 59#include <qapplication.h>
60#include <qclipboard.h> 60#include <qclipboard.h>
61#include <qfont.h> 61#include <qfont.h>
62#include <qpainter.h> 62#include <qpainter.h>
63#include <qfile.h> 63#include <qfile.h>
64#include <qtextstream.h> 64#include <qtextstream.h>
65#include <qtextcodec.h> 65#include <qtextcodec.h>
66#include <kglobal.h> 66#include <kglobal.h>
67 67
68#include <klocale.h> 68#include <klocale.h>
69//#include <kcharsets.h> 69//#include <kcharsets.h>
70#include <kdebug.h> 70#include <kdebug.h>
71//#include <kinstance.h> 71//#include <kinstance.h>
72 72
73#include <kglobalsettings.h> 73#include <kglobalsettings.h>
74//#include <kaction.h> 74//#include <kaction.h>
75//#include <kstdaction.h> 75//#include <kstdaction.h>
76 76
77#include "../view/kateview.h" 77#include "../view/kateview.h"
78#include "katebuffer.h" 78#include "katebuffer.h"
79#include "katetextline.h" 79#include "katetextline.h"
80 80
81#include "katecmd.h" 81#include "katecmd.h"
82 82
83KateAction::KateAction(Action a, PointStruc &cursor, int len, const QString &text) 83KateAction::KateAction(Action a, PointStruc &cursor, int len, const QString &text)
84 : action(a), cursor(cursor), len(len), text(text) { 84 : action(a), cursor(cursor), len(len), text(text) {
85} 85}
86 86
87KateActionGroup::KateActionGroup(PointStruc &aStart, int type) 87KateActionGroup::KateActionGroup(PointStruc &aStart, int type)
88 : start(aStart), action(0L), undoType(type) { 88 : start(aStart), action(0L), undoType(type) {
89} 89}
90 90
91KateActionGroup::~KateActionGroup() { 91KateActionGroup::~KateActionGroup() {
92 KateAction *current, *next; 92 KateAction *current, *next;
93 93
94 current = action; 94 current = action;
95 while (current) { 95 while (current) {
96 next = current->next; 96 next = current->next;
97 delete current; 97 delete current;
98 current = next; 98 current = next;
99 } 99 }
100} 100}
101 101
102void KateActionGroup::insertAction(KateAction *a) { 102void KateActionGroup::insertAction(KateAction *a) {
103 a->next = action; 103 a->next = action;
104 action = a; 104 action = a;
105} 105}
106 106
107const char * KateActionGroup::typeName(int type) 107const char * KateActionGroup::typeName(int type)
108{ 108{
109 // return a short text description of the given undo group type suitable for a menu 109 // return a short text description of the given undo group type suitable for a menu
110 // not the lack of i18n's, the caller is expected to handle translation 110 // not the lack of i18n's, the caller is expected to handle translation
111 switch (type) { 111 switch (type) {
112 case ugPaste : return "Paste Text"; 112 case ugPaste : return "Paste Text";
113 case ugDelBlock : return "Selection Overwrite"; 113 case ugDelBlock : return "Selection Overwrite";
114 case ugIndent : return "Indent"; 114 case ugIndent : return "Indent";
115 case ugUnindent : return "Unindent"; 115 case ugUnindent : return "Unindent";
116 case ugComment : return "Comment"; 116 case ugComment : return "Comment";
117 case ugUncomment : return "Uncomment"; 117 case ugUncomment : return "Uncomment";
118 case ugReplace : return "Text Replace"; 118 case ugReplace : return "Text Replace";
119 case ugSpell : return "Spell Check"; 119 case ugSpell : return "Spell Check";
120 case ugInsChar : return "Typing"; 120 case ugInsChar : return "Typing";
121 case ugDelChar : return "Delete Text"; 121 case ugDelChar : return "Delete Text";
122 case ugInsLine : return "New Line"; 122 case ugInsLine : return "New Line";
123 case ugDelLine : return "Delete Line"; 123 case ugDelLine : return "Delete Line";
124 } 124 }
125 return ""; 125 return "";
126} 126}
127 127
128const int KateDocument::maxAttribs = 32; 128const int KateDocument::maxAttribs = 32;
129 129
130QStringList KateDocument::searchForList = QStringList(); 130QStringList KateDocument::searchForList = QStringList();
131QStringList KateDocument::replaceWithList = QStringList(); 131QStringList KateDocument::replaceWithList = QStringList();
132 132
133uint KateDocument::uniqueID = 0; 133uint KateDocument::uniqueID = 0;
134 134
135QPtrDict<KateDocument::KateDocPrivate>* KateDocument::d_ptr = 0; 135QPtrDict<KateDocument::KateDocPrivate>* KateDocument::d_ptr = 0;
136 136
137 137
138KateDocument::KateDocument(bool bSingleViewMode, bool bBrowserView, 138KateDocument::KateDocument(bool bSingleViewMode, bool bBrowserView,
139 QWidget *parentWidget, const char *widgetName, 139 QWidget *parentWidget, const char *widgetName,
140 QObject *, const char *) 140 QObject *, const char *)
141 : Kate::Document (), 141 : Kate::Document (),
142 myFont(KGlobalSettings::generalFont()), myFontBold(KGlobalSettings::generalFont()), myFontItalic(KGlobalSettings::generalFont()), myFontBI(KGlobalSettings::generalFont()), 142 myFont(KGlobalSettings::generalFont()), myFontBold(KGlobalSettings::generalFont()), myFontItalic(KGlobalSettings::generalFont()), myFontBI(KGlobalSettings::generalFont()),
143 myFontMetrics (myFont), myFontMetricsBold (myFontBold), myFontMetricsItalic (myFontItalic), myFontMetricsBI (myFontBI), 143 myFontMetrics (myFont), myFontMetricsBold (myFontBold), myFontMetricsItalic (myFontItalic), myFontMetricsBI (myFontBI),
144 hlManager(HlManager::self ()) 144 hlManager(HlManager::self ())
145{ 145{
146 146
147 d(this)->hlSetByUser = false; 147 d(this)->hlSetByUser = false;
148 PreHighlightedTill=0; 148 PreHighlightedTill=0;
149 RequestPreHighlightTill=0; 149 RequestPreHighlightTill=0;
150 150
151 m_bSingleViewMode=bSingleViewMode; 151 m_bSingleViewMode=bSingleViewMode;
152 m_bBrowserView = bBrowserView; 152 m_bBrowserView = bBrowserView;
153 153
154 m_url = QString::null; 154 m_url = QString::null;
155 155
156 // NOTE: QFont::CharSet doesn't provide all the charsets KDE supports 156 // NOTE: QFont::CharSet doesn't provide all the charsets KDE supports
157 // (esp. it doesn't distinguish between UTF-8 and iso10646-1) 157 // (esp. it doesn't distinguish between UTF-8 and iso10646-1)
158 158
159 myEncoding = QString::fromLatin1(QTextCodec::codecForLocale()->name()); 159 myEncoding = QString::fromLatin1(QTextCodec::codecForLocale()->name());
160 160
161 maxLength = -1; 161 maxLength = -1;
162 162
163 setFont (KGlobalSettings::generalFont()); 163 setFont (KGlobalSettings::generalFont());
164 164
165 myDocID = uniqueID; 165 myDocID = uniqueID;
166 uniqueID++; 166 uniqueID++;
167 167
168 myDocName = QString (""); 168 myDocName = QString ("");
169 fileInfo = new QFileInfo (); 169 fileInfo = new QFileInfo ();
170 170
171 myCmd = new KateCmd (this); 171 myCmd = new KateCmd (this);
172 172
173 connect(this,SIGNAL(modifiedChanged ()),this,SLOT(slotModChanged ())); 173 connect(this,SIGNAL(modifiedChanged ()),this,SLOT(slotModChanged ()));
174 174
175 buffer = new KWBuffer; 175 buffer = new KWBuffer;
176 connect(buffer, SIGNAL(linesChanged(int)), this, SLOT(slotBufferChanged())); 176 connect(buffer, SIGNAL(linesChanged(int)), this, SLOT(slotBufferChanged()));
177// connect(buffer, SIGNAL(textChanged()), this, SIGNAL(textChanged())); 177// connect(buffer, SIGNAL(textChanged()), this, SIGNAL(textChanged()));
178 connect(buffer, SIGNAL(needHighlight(long,long)),this,SLOT(slotBufferHighlight(long,long))); 178 connect(buffer, SIGNAL(needHighlight(long,long)),this,SLOT(slotBufferHighlight(long,long)));
179 179
180 colors[0] = KGlobalSettings::baseColor(); 180 colors[0] = KGlobalSettings::baseColor();
181 colors[1] = KGlobalSettings::highlightColor(); 181 colors[1] = KGlobalSettings::highlightColor();
182 182
183 m_attribs = new Attribute[maxAttribs]; 183 m_attribs = new Attribute[maxAttribs];
184 184
185 m_highlight = 0L; 185 m_highlight = 0L;
186 tabChars = 8; 186 tabChars = 8;
187 187
188 m_singleSelection = false; 188 m_singleSelection = false;
189 189
190 newDocGeometry = false; 190 newDocGeometry = false;
191 readOnly = false; 191 readOnly = false;
192 newDoc = false; 192 newDoc = false;
193 193
194 modified = false; 194 modified = false;
195 195
196 undoList.setAutoDelete(true); 196 undoList.setAutoDelete(true);
197 undoState = 0; 197 undoState = 0;
198 undoSteps = 50; 198 undoSteps = 50;
199 199
200 pseudoModal = 0L; 200 pseudoModal = 0L;
201 clear(); 201 clear();
202 202
203 setHighlight(0); //calls updateFontData() 203 setHighlight(0); //calls updateFontData()
204 // if the user changes the highlight with the dialog, notify the doc 204 // if the user changes the highlight with the dialog, notify the doc
205 connect(hlManager,SIGNAL(changed()),SLOT(hlChanged())); 205 connect(hlManager,SIGNAL(changed()),SLOT(hlChanged()));
206 206
207 newDocGeometry = false; 207 newDocGeometry = false;
208 208
209 readConfig(); 209 readConfig();
210 210
211 setReadOnly(false); 211 setReadOnly(false);
212} 212}
213 213
214void KateDocument::setDontChangeHlOnSave() 214void KateDocument::setDontChangeHlOnSave()
215{ 215{
216 d(this)->hlSetByUser = true; 216 d(this)->hlSetByUser = true;
217} 217}
218 218
219void KateDocument::setFont (QFont font) 219void KateDocument::setFont (QFont font)
220{ 220{
221 kdDebug()<<"Kate:: setFont"<<endl; 221 kdDebug()<<"Kate:: setFont"<<endl;
222 int oldwidth=myFontMetrics.width('W'); //Quick & Dirty Hack (by JoWenn) //Remove in KDE 3.0 222 int oldwidth=myFontMetrics.width('W'); //Quick & Dirty Hack (by JoWenn) //Remove in KDE 3.0
223 myFont = font; 223 myFont = font;
224 myFontBold = QFont (font); 224 myFontBold = QFont (font);
225 myFontBold.setBold (true); 225 myFontBold.setBold (true);
226 226
227 myFontItalic = QFont (font); 227 myFontItalic = QFont (font);
228 myFontItalic.setItalic (true); 228 myFontItalic.setItalic (true);
229 229
230 myFontBI = QFont (font); 230 myFontBI = QFont (font);
231 myFontBI.setBold (true); 231 myFontBI.setBold (true);
232 myFontBI.setItalic (true); 232 myFontBI.setItalic (true);
233 233
234 myFontMetrics = CachedFontMetrics (myFont); 234 myFontMetrics = CachedFontMetrics (myFont);
235 myFontMetricsBold = CachedFontMetrics (myFontBold); 235 myFontMetricsBold = CachedFontMetrics (myFontBold);
236 myFontMetricsItalic = CachedFontMetrics (myFontItalic); 236 myFontMetricsItalic = CachedFontMetrics (myFontItalic);
237 myFontMetricsBI = CachedFontMetrics (myFontBI); 237 myFontMetricsBI = CachedFontMetrics (myFontBI);
238 int newwidth=myFontMetrics.width('W'); //Quick & Dirty Hack (by JoWenn) //Remove in KDE 3.0 238 int newwidth=myFontMetrics.width('W'); //Quick & Dirty Hack (by JoWenn) //Remove in KDE 3.0
239 maxLength=maxLength*(float)newwidth/(float)oldwidth; //Quick & Dirty Hack (by JoWenn) //Remove in KDE 3.0 239 maxLength=maxLength*(float)newwidth/(float)oldwidth; //Quick & Dirty Hack (by JoWenn) //Remove in KDE 3.0
240 240
241 updateFontData(); 241 updateFontData();
242 updateViews(); //Quick & Dirty Hack (by JoWenn) //Remove in KDE 3.0 242 updateViews(); //Quick & Dirty Hack (by JoWenn) //Remove in KDE 3.0
243 243
244} 244}
245 245
246long KateDocument::needPreHighlight(long till) 246long KateDocument::needPreHighlight(long till)
247{ 247{
248 int max=numLines()-1; 248 int max=numLines()-1;
249 if (till>max) 249 if (till>max)
250 { 250 {
251 till=max; 251 till=max;
252 } 252 }
253 if (PreHighlightedTill>=till) return -1; 253 if (PreHighlightedTill>=till) return -1;
254 254
255 long tmp=RequestPreHighlightTill; 255 long tmp=RequestPreHighlightTill;
256 if (RequestPreHighlightTill<till) 256 if (RequestPreHighlightTill<till)
257 { 257 {
258 RequestPreHighlightTill=till; 258 RequestPreHighlightTill=till;
259 if (tmp<=PreHighlightedTill) QTimer::singleShot(10,this,SLOT(doPreHighlight())); 259 if (tmp<=PreHighlightedTill) QTimer::singleShot(10,this,SLOT(doPreHighlight()));
260 } 260 }
261 return RequestPreHighlightTill; 261 return RequestPreHighlightTill;
262} 262}
263 263
264void KateDocument::doPreHighlight() 264void KateDocument::doPreHighlight()
265{ 265{
266 int from = PreHighlightedTill; 266 int from = PreHighlightedTill;
267 int till = PreHighlightedTill+200; 267 int till = PreHighlightedTill+200;
268 int max = numLines()-1; 268 int max = numLines()-1;
269 if (till > max) 269 if (till > max)
270 { 270 {
271 till = max; 271 till = max;
272 } 272 }
273 PreHighlightedTill = till; 273 PreHighlightedTill = till;
274 updateLines(from,till); 274 updateLines(from,till);
275 emit preHighlightChanged(PreHighlightedTill); 275 emit preHighlightChanged(PreHighlightedTill);
276 if (PreHighlightedTill<RequestPreHighlightTill) 276 if (PreHighlightedTill<RequestPreHighlightTill)
277 QTimer::singleShot(10,this,SLOT(doPreHighlight())); 277 QTimer::singleShot(10,this,SLOT(doPreHighlight()));
278} 278}
279 279
280KateDocument::~KateDocument() 280KateDocument::~KateDocument()
281{ 281{
282 m_highlight->release(); 282 m_highlight->release();
283 283
284 if ( !m_bSingleViewMode ) 284 if ( !m_bSingleViewMode )
285 { 285 {
286 m_views.setAutoDelete( true ); 286 m_views.setAutoDelete( true );
287 m_views.clear(); 287 m_views.clear();
288 m_views.setAutoDelete( false ); 288 m_views.setAutoDelete( false );
289 } 289 }
290 delete_d(this); 290 delete_d(this);
291} 291}
292 292
293void KateDocument::openURL(const QString &filename) 293void KateDocument::openURL(const QString &filename)
294{ 294{
295 295
296 m_file=filename; 296 m_file=filename;
297 fileInfo->setFile (m_file); 297 fileInfo->setFile (m_file);
298 setMTime(); 298 setMTime();
299 299
300 if (!fileInfo->exists() || !fileInfo->isReadable()) 300 if (!fileInfo->exists() || !fileInfo->isReadable())
301 { 301 {
302 qDebug("File doesn't exit or couldn't be read"); 302 qDebug("File doesn't exit or couldn't be read");
303 return false; 303 return ;
304 } 304 }
305 305
306 buffer->clear(); 306 buffer->clear();
307#warning fixme 307#warning fixme
308// buffer->insertFile(0, m_file, KGlobal::charsets()->codecForName(myEncoding)); 308// buffer->insertFile(0, m_file, KGlobal::charsets()->codecForName(myEncoding));
309 qDebug("Telling buffer to open file"); 309 qDebug("Telling buffer to open file");
310 buffer->insertFile(0, m_file, QTextCodec::codecForLocale()); 310 buffer->insertFile(0, m_file, QTextCodec::codecForLocale());
311 311
312 setMTime(); 312 setMTime();
313 313
314 if (myWordWrap) 314 if (myWordWrap)
315 wrapText (myWordWrapAt); 315 wrapText (myWordWrapAt);
316 316
317 int hl = hlManager->wildcardFind( m_file ); 317 int hl = hlManager->wildcardFind( m_file );
318 318
319 setHighlight(hl); 319 setHighlight(hl);
320 320
321 updateLines(); 321 updateLines();
322 updateViews(); 322 updateViews();
323 323
324 emit fileNameChanged(); 324 emit fileNameChanged();
325 325
326 return true; 326 return ;
327} 327}
328 328
329bool KateDocument::saveFile() 329bool KateDocument::saveFile()
330{ 330{
331 QFile f( m_file ); 331 QFile f( m_file );
332 if ( !f.open( IO_WriteOnly ) ) 332 if ( !f.open( IO_WriteOnly ) )
333 return false; // Error 333 return false; // Error
334 334
335 QTextStream stream(&f); 335 QTextStream stream(&f);
336 336
337 stream.setEncoding(QTextStream::RawUnicode); // disable Unicode headers 337 stream.setEncoding(QTextStream::RawUnicode); // disable Unicode headers
338#warning fixme 338#warning fixme
339// stream.setCodec(KGlobal::charsets()->codecForName(myEncoding)); 339// stream.setCodec(KGlobal::charsets()->codecForName(myEncoding));
340 stream.setCodec(QTextCodec::codecForLocale()); // this line sets the mapper to the correct codec 340 stream.setCodec(QTextCodec::codecForLocale()); // this line sets the mapper to the correct codec
341 341
342 int maxLine = numLines(); 342 int maxLine = numLines();
343 int line = 0; 343 int line = 0;
344 while(true) 344 while(true)
345 { 345 {
346 stream << getTextLine(line)->getString(); 346 stream << getTextLine(line)->getString();
347 line++; 347 line++;
348 if (line >= maxLine) break; 348 if (line >= maxLine) break;
349 349
350 if (eolMode == KateDocument::eolUnix) stream << "\n"; 350 if (eolMode == KateDocument::eolUnix) stream << "\n";
351 else if (eolMode == KateDocument::eolDos) stream << "\r\n"; 351 else if (eolMode == KateDocument::eolDos) stream << "\r\n";
352 else if (eolMode == KateDocument::eolMacintosh) stream << '\r'; 352 else if (eolMode == KateDocument::eolMacintosh) stream << '\r';
353 }; 353 };
354 f.close(); 354 f.close();
355 355
356 fileInfo->setFile (m_file); 356 fileInfo->setFile (m_file);
357 setMTime(); 357 setMTime();
358 358
359 if (!(d(this)->hlSetByUser)) 359 if (!(d(this)->hlSetByUser))
360 { 360 {
361 int hl = hlManager->wildcardFind( m_file ); 361 int hl = hlManager->wildcardFind( m_file );
362 362
363 setHighlight(hl); 363 setHighlight(hl);
364 } 364 }
365 emit fileNameChanged (); 365 emit fileNameChanged ();
366 366
367 return (f.status() == IO_Ok); 367 return (f.status() == IO_Ok);
368} 368}
369 369
370KTextEditor::View *KateDocument::createView( QWidget *parent, const char *name ) 370KTextEditor::View *KateDocument::createView( QWidget *parent, const char *name )
371{ 371{
372 return new KateView( this, parent, name); 372 return new KateView( this, parent, name);
373} 373}
374 374
375QString KateDocument::textLine( int line ) const 375QString KateDocument::textLine( int line ) const
376{ 376{
377 TextLine::Ptr l = getTextLine( line ); 377 TextLine::Ptr l = getTextLine( line );
378 if ( !l ) 378 if ( !l )
379 return QString(); 379 return QString();
380 380
381 return l->getString(); 381 return l->getString();
382} 382}
383 383
384void KateDocument::replaceLine(const QString& s,int line) 384void KateDocument::replaceLine(const QString& s,int line)
385{ 385{
386 remove_Line(line,false); 386 remove_Line(line,false);
387 insert_Line(s,line,true); 387 insert_Line(s,line,true);
388} 388}
389 389
390void KateDocument::insertLine( const QString &str, int l ) { 390void KateDocument::insertLine( const QString &str, int l ) {
391 insert_Line(str,l,true); 391 insert_Line(str,l,true);
392} 392}
393 393
394void KateDocument::insert_Line(const QString& s,int line, bool update) 394void KateDocument::insert_Line(const QString& s,int line, bool update)
395{ 395{
396 kdDebug(13020)<<"KateDocument::insertLine "<<s<<QString("%1").arg(line)<<endl; 396 kdDebug(13020)<<"KateDocument::insertLine "<<s<<QString(" %1").arg(line)<<endl;
397 TextLine::Ptr TL=new TextLine(); 397 TextLine::Ptr TL=new TextLine();
398 TL->append(s.unicode(),s.length()); 398 TL->append(s.unicode(),s.length());
399 buffer->insertLine(line,TL); 399 buffer->insertLine(line,TL);
400 if (update) 400 if (update)
401 { 401 {
402 newDocGeometry=true; 402 newDocGeometry=true;
403 updateLines(line); 403 updateLines(line);
404 updateViews(); 404 updateViews();
405 } 405 }
406} 406}
407 407
408void KateDocument::insertAt( const QString &s, int line, int col, bool ) 408void KateDocument::insertAt( const QString &s, int line, int col, bool )
409{ 409{
410 VConfig c; 410 VConfig c;
411 c.view = 0; // ### FIXME 411 c.view = 0; // ### FIXME
412 c.cursor.x = col; 412 c.cursor.x = col;
413 c.cursor.y = line; 413 c.cursor.y = line;
414 c.cXPos = 0; // ### FIXME 414 c.cXPos = 0; // ### FIXME
415 c.flags = 0; // ### FIXME 415 c.flags = 0; // ### FIXME
416 insert( c, s ); 416 insert( c, s );
417} 417}
418 418
419void KateDocument::removeLine( int line ) { 419void KateDocument::removeLine( int line ) {
420 remove_Line(line,true); 420 remove_Line(line,true);
421} 421}
422 422
423void KateDocument::remove_Line(int line,bool update) 423void KateDocument::remove_Line(int line,bool update)
424{ 424{
425 kdDebug(13020)<<"KateDocument::removeLine "<<QString("%1").arg(line)<<endl; 425 kdDebug(13020)<<"KateDocument::removeLine "<<QString("%1").arg(line)<<endl;
426 buffer->removeLine(line); 426 buffer->removeLine(line);
427// newDocGeometry=true; 427// newDocGeometry=true;
428// if line==0) 428// if line==0)
429 if (update) 429 if (update)
430 { 430 {
431 updateLines(line); 431 updateLines(line);
432 updateViews(); 432 updateViews();
433 } 433 }
434} 434}
435 435
436int KateDocument::length() const 436int KateDocument::length() const
437{ 437{
438 return text().length(); 438 return text().length();
439} 439}
440 440
441void KateDocument::setSelection( int , int , int , int ) 441void KateDocument::setSelection( int , int , int , int )
442{ 442{
443} 443}
444 444
445bool KateDocument::hasSelection() const 445bool KateDocument::hasSelection() const
446{ 446{
447 return (selectEnd >= selectStart); 447 return (selectEnd >= selectStart);
448} 448}
449 449
450QString KateDocument::selection() const 450QString KateDocument::selection() const
451{ 451{
452 uint flags = 0; 452 uint flags = 0;
453 TextLine::Ptr textLine; 453 TextLine::Ptr textLine;
454 int len, z, start, end, i; 454 int len, z, start, end, i;
455 455
456 len = 1; 456 len = 1;
457 if (!(flags & KateView::cfVerticalSelect)) { 457 if (!(flags & KateView::cfVerticalSelect)) {
458 for (z = selectStart; z <= selectEnd; z++) { 458 for (z = selectStart; z <= selectEnd; z++) {
459 textLine = getTextLine(z); 459 textLine = getTextLine(z);
460 len += textLine->numSelected(); 460 len += textLine->numSelected();
461 if (textLine->isSelected()) len++; 461 if (textLine->isSelected()) len++;
462 } 462 }
463 QString s; 463 QString s;
464 len = 0; 464 len = 0;
465 for (z = selectStart; z <= selectEnd; z++) { 465 for (z = selectStart; z <= selectEnd; z++) {
466 textLine = getTextLine(z); 466 textLine = getTextLine(z);
467 end = 0; 467 end = 0;
468 do { 468 do {
469 start = textLine->findUnselected(end); 469 start = textLine->findUnselected(end);
470 end = textLine->findSelected(start); 470 end = textLine->findSelected(start);
471 for (i = start; i < end; i++) { 471 for (i = start; i < end; i++) {
472 s[len] = textLine->getChar(i); 472 s[len] = textLine->getChar(i);
473 len++; 473 len++;
474 } 474 }
475 } while (start < end); 475 } while (start < end);
476 if (textLine->isSelected()) { 476 if (textLine->isSelected()) {
477 s[len] = '\n'; 477 s[len] = '\n';
478 len++; 478 len++;
479 } 479 }
480 } 480 }
481// s[len] = '\0'; 481// s[len] = '\0';
482 return s; 482 return s;
483 } else { 483 } else {
484 for (z = selectStart; z <= selectEnd; z++) { 484 for (z = selectStart; z <= selectEnd; z++) {
485 textLine = getTextLine(z); 485 textLine = getTextLine(z);
486 len += textLine->numSelected() + 1; 486 len += textLine->numSelected() + 1;
487 } 487 }
488 QString s; 488 QString s;
489 len = 0; 489 len = 0;
490 for (z = selectStart; z <= selectEnd; z++) { 490 for (z = selectStart; z <= selectEnd; z++) {
491 textLine = getTextLine(z); 491 textLine = getTextLine(z);
492 end = 0; 492 end = 0;
493 do { 493 do {
494 start = textLine->findUnselected(end); 494 start = textLine->findUnselected(end);
495 end = textLine->findSelected(start); 495 end = textLine->findSelected(start);
496 for (i = start; i < end; i++) { 496 for (i = start; i < end; i++) {
497 s[len] = textLine->getChar(i); 497 s[len] = textLine->getChar(i);
498 len++; 498 len++;
499 } 499 }
500 } while (start < end); 500 } while (start < end);
501 s[len] = '\n'; 501 s[len] = '\n';
502 len++; 502 len++;
503 } 503 }
504// s[len] = '\0'; // the final \0 is not counted in length() 504// s[len] = '\0'; // the final \0 is not counted in length()
505 return s; 505 return s;
506 } 506 }
507} 507}
508 508
509int KateDocument::numLines() const 509int KateDocument::numLines() const
510{ 510{
511 return buffer->count(); 511 return buffer->count();
512} 512}
513 513
514 514
515TextLine::Ptr KateDocument::getTextLine(int line) const 515TextLine::Ptr KateDocument::getTextLine(int line) const
516{ 516{
517 // This is a hack to get this stuff working. 517 // This is a hack to get this stuff working.
518 return buffer->line(line); 518 return buffer->line(line);
519} 519}
520 520
521int KateDocument::textLength(int line) { 521int KateDocument::textLength(int line) {
522 TextLine::Ptr textLine = getTextLine(line); 522 TextLine::Ptr textLine = getTextLine(line);
523 if (!textLine) return 0; 523 if (!textLine) return 0;
524 return textLine->length(); 524 return textLine->length();
525} 525}
526 526
527void KateDocument::setTabWidth(int chars) { 527void KateDocument::setTabWidth(int chars) {
528 if (tabChars == chars) return; 528 if (tabChars == chars) return;
529 if (chars < 1) chars = 1; 529 if (chars < 1) chars = 1;
530 if (chars > 16) chars = 16; 530 if (chars > 16) chars = 16;
531 tabChars = chars; 531 tabChars = chars;
532 updateFontData(); 532 updateFontData();
533 533
534 maxLength = -1; 534 maxLength = -1;
535 for (int i=0; i < buffer->count(); i++) 535 for (int i=0; i < buffer->count(); i++)
536 { 536 {
537 TextLine::Ptr textLine = buffer->line(i); 537 TextLine::Ptr textLine = buffer->line(i);
538 int len = textWidth(textLine,textLine->length()); 538 int len = textWidth(textLine,textLine->length());
539 if (len > maxLength) { 539 if (len > maxLength) {
540 maxLength = len; 540 maxLength = len;
541 longestLine = textLine; 541 longestLine = textLine;
542 } 542 }
543 } 543 }
544} 544}
545 545
546void KateDocument::setReadOnly(bool m) { 546void KateDocument::setReadOnly(bool m) {
547 KTextEditor::View *view; 547 KTextEditor::View *view;
548 548
549 if (m != readOnly) { 549 if (m != readOnly) {
550 readOnly = m; 550 readOnly = m;
551// if (readOnly) recordReset(); 551// if (readOnly) recordReset();
552 for (view = m_views.first(); view != 0L; view = m_views.next() ) { 552 for (view = m_views.first(); view != 0L; view = m_views.next() ) {
553 emit static_cast<KateView *>( view )->newStatus(); 553 emit static_cast<KateView *>( view )->newStatus();
554 } 554 }
555 } 555 }
556} 556}
557 557
558bool KateDocument::isReadOnly() const { 558bool KateDocument::isReadOnly() const {
559 return readOnly; 559 return readOnly;
560} 560}
561 561
562void KateDocument::setNewDoc( bool m ) 562void KateDocument::setNewDoc( bool m )
563{ 563{
564// KTextEditor::View *view; 564// KTextEditor::View *view;
565 565
566 if ( m != newDoc ) 566 if ( m != newDoc )
567 { 567 {
568 newDoc = m; 568 newDoc = m;
569//// if (readOnly) recordReset(); 569//// if (readOnly) recordReset();
570// for (view = m_views.first(); view != 0L; view = m_views.next() ) { 570// for (view = m_views.first(); view != 0L; view = m_views.next() ) {
571// emit static_cast<KateView *>( view )->newStatus(); 571// emit static_cast<KateView *>( view )->newStatus();
572// } 572// }
573 } 573 }
574} 574}
575 575
576bool KateDocument::isNewDoc() const { 576bool KateDocument::isNewDoc() const {
577 return newDoc; 577 return newDoc;
578} 578}
579 579
580void KateDocument::setModified(bool m) { 580void KateDocument::setModified(bool m) {
581 KTextEditor::View *view; 581 KTextEditor::View *view;
582 582
583 if (m != modified) { 583 if (m != modified) {
584 modified = m; 584 modified = m;
585 for (view = m_views.first(); view != 0L; view = m_views.next() ) { 585 for (view = m_views.first(); view != 0L; view = m_views.next() ) {
586 emit static_cast<KateView *>( view )->newStatus(); 586 emit static_cast<KateView *>( view )->newStatus();
587 } 587 }
588 emit modifiedChanged (); 588 emit modifiedChanged ();
589 } 589 }
590} 590}
591 591
592bool KateDocument::isModified() const { 592bool KateDocument::isModified() const {
593 return modified; 593 return modified;
594} 594}
595 595
596void KateDocument::readConfig() 596void KateDocument::readConfig()
597{ 597{
598 KConfig *config = KGlobal::config(); 598 KConfig *config = KGlobal::config();
599 config->setGroup("Kate Document"); 599 config->setGroup("Kate Document");
600 600
601 myWordWrap = config->readBoolEntry("Word Wrap On", false); 601 myWordWrap = config->readBoolEntry("Word Wrap On", false);
602 myWordWrapAt = config->readNumEntry("Word Wrap At", 80); 602 myWordWrapAt = config->readNumEntry("Word Wrap At", 80);
603 if (myWordWrap) 603 if (myWordWrap)
604 wrapText (myWordWrapAt); 604 wrapText (myWordWrapAt);
605 605
606 setTabWidth(config->readNumEntry("TabWidth", 8)); 606 setTabWidth(config->readNumEntry("TabWidth", 8));
607 setUndoSteps(config->readNumEntry("UndoSteps", 50)); 607 setUndoSteps(config->readNumEntry("UndoSteps", 50));
608 m_singleSelection = config->readBoolEntry("SingleSelection", false); 608 m_singleSelection = config->readBoolEntry("SingleSelection", false);
609 myEncoding = config->readEntry("Encoding", QString::fromLatin1(QTextCodec::codecForLocale()->name())); 609 myEncoding = config->readEntry("Encoding", QString::fromLatin1(QTextCodec::codecForLocale()->name()));
610 setFont (config->readFontEntry("Font", &myFont)); 610 setFont (config->readFontEntry("Font", &myFont));
611 611
612 colors[0] = config->readColorEntry("Color Background", &colors[0]); 612 colors[0] = config->readColorEntry("Color Background", &colors[0]);
613 colors[1] = config->readColorEntry("Color Selected", &colors[1]); 613 colors[1] = config->readColorEntry("Color Selected", &colors[1]);
614 614
615 config->sync(); 615 config->sync();
616} 616}
617 617
618void KateDocument::writeConfig() 618void KateDocument::writeConfig()
619{ 619{
620 KConfig *config = KGlobal::config(); 620 KConfig *config = KGlobal::config();
621 config->setGroup("Kate Document"); 621 config->setGroup("Kate Document");
622#if 0 622#if 0
623 cofig->writeEntry("Word Wrap On", myWordWrap); 623 cofig->writeEntry("Word Wrap On", myWordWrap);
624 config->writeEntry("Word Wrap At", myWordWrapAt); 624 config->writeEntry("Word Wrap At", myWordWrapAt);
625 config->writeEntry("TabWidth", tabChars); 625 config->writeEntry("TabWidth", tabChars);
626 config->writeEntry("UndoSteps", undoSteps); 626 config->writeEntry("UndoSteps", undoSteps);
627 config->writeEntry("SingleSelection", m_singleSelection); 627 config->writeEntry("SingleSelection", m_singleSelection);
628 config->writeEntry("Encoding", myEncoding); 628 config->writeEntry("Encoding", myEncoding);
629 config->writeEntry("Font", myFont); 629 config->writeEntry("Font", myFont);
630 config->writeEntry("Color Background", colors[0]); 630 config->writeEntry("Color Background", colors[0]);
631 config->writeEntry("Color Selected", colors[1]); 631 config->writeEntry("Color Selected", colors[1]);
632#endif 632#endif
633 config->sync(); 633 config->sync();
634} 634}
635 635
636void KateDocument::readSessionConfig(KConfig *config) 636void KateDocument::readSessionConfig(KConfig *config)
637{ 637{
638 m_url = config->readEntry("URL"); // ### doesn't this break the encoding? (Simon) 638 m_url = config->readEntry("URL"); // ### doesn't this break the encoding? (Simon)
639 setHighlight(hlManager->nameFind(config->readEntry("Highlight"))); 639 setHighlight(hlManager->nameFind(config->readEntry("Highlight")));
640 // anders: restore bookmarks if possible 640 // anders: restore bookmarks if possible
641 QValueList<int> l = config->readIntListEntry("Bookmarks"); 641 QValueList<int> l = config->readIntListEntry("Bookmarks");
642 if ( l.count() ) { 642 if ( l.count() ) {
643 for (uint i=0; i < l.count(); i++) { 643 for (uint i=0; i < l.count(); i++) {
644 if ( numLines() < l[i] ) break; 644 if ( numLines() < l[i] ) break;
645 getTextLine( l[i] )->addMark( Bookmark ); 645 getTextLine( l[i] )->addMark( Bookmark );
646 } 646 }
647 } 647 }
648} 648}
649 649
650void KateDocument::writeSessionConfig(KConfig *config) 650void KateDocument::writeSessionConfig(KConfig *config)
651{ 651{
652#if 0 652#if 0
653 config->writeEntry("URL", m_url); // ### encoding?? (Simon) 653 config->writeEntry("URL", m_url); // ### encoding?? (Simon)
654 config->writeEntry("Highlight", m_highlight->name()); 654 config->writeEntry("Highlight", m_highlight->name());
655 // anders: save bookmarks 655 // anders: save bookmarks
656 QList<Kate::Mark> l = marks(); 656 QList<Kate::Mark> l = marks();
657 QValueList<int> ml; 657 QValueList<int> ml;
658 for (uint i=0; i < l.count(); i++) { 658 for (uint i=0; i < l.count(); i++) {
659 if ( l.at(i)->type == 1) // only save bookmarks 659 if ( l.at(i)->type == 1) // only save bookmarks
660 ml << l.at(i)->line; 660 ml << l.at(i)->line;
661 } 661 }
662 if ( ml.count() ) 662 if ( ml.count() )
663 config->writeEntry("Bookmarks", ml); 663 config->writeEntry("Bookmarks", ml);
664#endif 664#endif
665} 665}
666 666
667 667
668void KateDocument::setHighlight(int n) { 668void KateDocument::setHighlight(int n) {
669 Highlight *h; 669 Highlight *h;
670 670
671// hlNumber = n; 671// hlNumber = n;
672 672
673 h = hlManager->getHl(n); 673 h = hlManager->getHl(n);
674 if (h == m_highlight) { 674 if (h == m_highlight) {
675 updateLines(); 675 updateLines();
676 } else { 676 } else {
677 if (m_highlight != 0L) m_highlight->release(); 677 if (m_highlight != 0L) m_highlight->release();
678 h->use(); 678 h->use();
679 m_highlight = h; 679 m_highlight = h;
680 makeAttribs(); 680 makeAttribs();
681 } 681 }
682 PreHighlightedTill=0; 682 PreHighlightedTill=0;
683 RequestPreHighlightTill=0; 683 RequestPreHighlightTill=0;
684 emit(highlightChanged()); 684 emit(highlightChanged());
685} 685}
686 686
687void KateDocument::makeAttribs() { 687void KateDocument::makeAttribs() {
688 qDebug("KateDocument::makeAttribs()"); 688 qDebug("KateDocument::makeAttribs()");
689 m_numAttribs = hlManager->makeAttribs(m_highlight, m_attribs, maxAttribs); 689 m_numAttribs = hlManager->makeAttribs(m_highlight, m_attribs, maxAttribs);
690 updateFontData(); 690 updateFontData();
691 updateLines(); 691 updateLines();
692} 692}
693 693
694void KateDocument::updateFontData() { 694void KateDocument::updateFontData() {
695 int maxAscent, maxDescent; 695 int maxAscent, maxDescent;
696 int tabWidth; 696 int tabWidth;
697 KateView *view; 697 KateView *view;
698 698
699 maxAscent = myFontMetrics.ascent(); 699 maxAscent = myFontMetrics.ascent();
700 maxDescent = myFontMetrics.descent(); 700 maxDescent = myFontMetrics.descent();
701 tabWidth = myFontMetrics.width(' '); 701 tabWidth = myFontMetrics.width(' ');
702 702
703 fontHeight = maxAscent + maxDescent + 1; 703 fontHeight = maxAscent + maxDescent + 1;
704 fontAscent = maxAscent; 704 fontAscent = maxAscent;
705 m_tabWidth = tabChars*tabWidth; 705 m_tabWidth = tabChars*tabWidth;
706 706
707 for (view = views.first(); view != 0L; view = views.next() ) { 707 for (view = views.first(); view != 0L; view = views.next() ) {
708 view->myViewInternal->drawBuffer->resize(view->width(),fontHeight); 708 view->myViewInternal->drawBuffer->resize(view->width(),fontHeight);
709 view->tagAll(); 709 view->tagAll();
710 view->updateCursor(); 710 view->updateCursor();
711 } 711 }
712} 712}
713 713
714void KateDocument::hlChanged() { //slot 714void KateDocument::hlChanged() { //slot
715 makeAttribs(); 715 makeAttribs();
716 updateViews(); 716 updateViews();
717} 717}
718 718
719 719
720void KateDocument::addView(KTextEditor::View *view) { 720void KateDocument::addView(KTextEditor::View *view) {
721 views.append( static_cast<KateView *>( view ) ); 721 views.append( static_cast<KateView *>( view ) );
722 KTextEditor::Document::addView( view ); 722 KTextEditor::Document::addView( view );
723 connect( static_cast<KateView *>( view ), SIGNAL( destroyed() ), this, SLOT( slotViewDestroyed() ) ); 723 connect( static_cast<KateView *>( view ), SIGNAL( destroyed() ), this, SLOT( slotViewDestroyed() ) );
724} 724}
725 725
726void KateDocument::removeView(KTextEditor::View *view) { 726void KateDocument::removeView(KTextEditor::View *view) {
727// if (undoView == view) recordReset(); 727// if (undoView == view) recordReset();
728 disconnect( static_cast<KateView *>( view ), SIGNAL( destroyed() ), this, SLOT( slotViewDestroyed() ) ); 728 disconnect( static_cast<KateView *>( view ), SIGNAL( destroyed() ), this, SLOT( slotViewDestroyed() ) );
729 views.removeRef( static_cast<KateView *>( view ) ); 729 views.removeRef( static_cast<KateView *>( view ) );
730 KTextEditor::Document::removeView( view ); 730 KTextEditor::Document::removeView( view );
731} 731}
732 732
733void KateDocument::slotViewDestroyed() 733void KateDocument::slotViewDestroyed()
734{ 734{
735 views.removeRef( static_cast<const KateView *>( sender() ) ); 735 views.removeRef( static_cast<const KateView *>( sender() ) );
736} 736}
737 737
738bool KateDocument::ownedView(KateView *view) { 738bool KateDocument::ownedView(KateView *view) {
739 // do we own the given view? 739 // do we own the given view?
740 return (views.containsRef(view) > 0); 740 return (views.containsRef(view) > 0);
741} 741}
742 742
743bool KateDocument::isLastView(int numViews) { 743bool KateDocument::isLastView(int numViews) {
744 return ((int) views.count() == numViews); 744 return ((int) views.count() == numViews);
745} 745}
746 746
747int KateDocument::textWidth(const TextLine::Ptr &textLine, int cursorX) { 747int KateDocument::textWidth(const TextLine::Ptr &textLine, int cursorX) {
748 int x; 748 int x;
749 int z; 749 int z;
750 QChar ch; 750 QChar ch;
751 Attribute *a; 751 Attribute *a;
752 752
753 x = 0; 753 x = 0;
754 for (z = 0; z < cursorX; z++) { 754 for (z = 0; z < cursorX; z++) {
755 ch = textLine->getChar(z); 755 ch = textLine->getChar(z);
756 a = &m_attribs[textLine->getAttr(z)]; 756 a = &m_attribs[textLine->getAttr(z)];
757 757
758 if (ch == '\t') 758 if (ch == '\t')
759 x += m_tabWidth - (x % m_tabWidth); 759 x += m_tabWidth - (x % m_tabWidth);
760 else if (a->bold && a->italic) 760 else if (a->bold && a->italic)
761 x += myFontMetricsBI.width(ch); 761 x += myFontMetricsBI.width(ch);
762 else if (a->bold) 762 else if (a->bold)
763 x += myFontMetricsBold.width(ch); 763 x += myFontMetricsBold.width(ch);
764 else if (a->italic) 764 else if (a->italic)
765 x += myFontMetricsItalic.width(ch); 765 x += myFontMetricsItalic.width(ch);
766 else 766 else
767 x += myFontMetrics.width(ch); 767 x += myFontMetrics.width(ch);
768 } 768 }
769 return x; 769 return x;
770} 770}
771 771
772int KateDocument::textWidth(PointStruc &cursor) { 772int KateDocument::textWidth(PointStruc &cursor) {
773 if (cursor.x < 0) 773 if (cursor.x < 0)
774 cursor.x = 0; 774 cursor.x = 0;
775 if (cursor.y < 0) 775 if (cursor.y < 0)
776 cursor.y = 0; 776 cursor.y = 0;
777 if (cursor.y >= numLines()) 777 if (cursor.y >= numLines())
778 cursor.y = lastLine(); 778 cursor.y = lastLine();
779 return textWidth(getTextLine(cursor.y),cursor.x); 779 return textWidth(getTextLine(cursor.y),cursor.x);
780} 780}
781 781
782int KateDocument::textWidth(bool wrapCursor, PointStruc &cursor, int xPos) { 782int KateDocument::textWidth(bool wrapCursor, PointStruc &cursor, int xPos) {
783 int len; 783 int len;
784 int x, oldX; 784 int x, oldX;
785 int z; 785 int z;
786 QChar ch; 786 QChar ch;
787 Attribute *a; 787 Attribute *a;
788 788
789 if (cursor.y < 0) cursor.y = 0; 789 if (cursor.y < 0) cursor.y = 0;
790 if (cursor.y > lastLine()) cursor.y = lastLine(); 790 if (cursor.y > lastLine()) cursor.y = lastLine();
791 TextLine::Ptr textLine = getTextLine(cursor.y); 791 TextLine::Ptr textLine = getTextLine(cursor.y);
792 len = textLine->length(); 792 len = textLine->length();
793 793
794 x = oldX = z = 0; 794 x = oldX = z = 0;
795 while (x < xPos && (!wrapCursor || z < len)) { 795 while (x < xPos && (!wrapCursor || z < len)) {
796 oldX = x; 796 oldX = x;
797 ch = textLine->getChar(z); 797 ch = textLine->getChar(z);
798 a = &m_attribs[textLine->getAttr(z)]; 798 a = &m_attribs[textLine->getAttr(z)];
799 799
800 if (ch == '\t') 800 if (ch == '\t')
801 x += m_tabWidth - (x % m_tabWidth); 801 x += m_tabWidth - (x % m_tabWidth);
802 else if (a->bold && a->italic) 802 else if (a->bold && a->italic)
803 x += myFontMetricsBI.width(ch); 803 x += myFontMetricsBI.width(ch);
804 else if (a->bold) 804 else if (a->bold)
805 x += myFontMetricsBold.width(ch); 805 x += myFontMetricsBold.width(ch);
806 else if (a->italic) 806 else if (a->italic)
807 x += myFontMetricsItalic.width(ch); 807 x += myFontMetricsItalic.width(ch);
808 else 808 else
809 x += myFontMetrics.width(ch); 809 x += myFontMetrics.width(ch);
810 810
811 z++; 811 z++;
812 } 812 }
813 if (xPos - oldX < x - xPos && z > 0) { 813 if (xPos - oldX < x - xPos && z > 0) {
814 z--; 814 z--;
815 x = oldX; 815 x = oldX;
816 } 816 }
817 cursor.x = z; 817 cursor.x = z;
818 return x; 818 return x;
819} 819}
820 820
821 821
822int KateDocument::textPos(const TextLine::Ptr &textLine, int xPos) { 822int KateDocument::textPos(const TextLine::Ptr &textLine, int xPos) {
823 int x, oldX; 823 int x, oldX;
824 int z; 824 int z;
825 QChar ch; 825 QChar ch;
826 Attribute *a; 826 Attribute *a;
827 827
828 x = oldX = z = 0; 828 x = oldX = z = 0;
829 while (x < xPos) { // && z < len) { 829 while (x < xPos) { // && z < len) {
830 oldX = x; 830 oldX = x;
831 ch = textLine->getChar(z); 831 ch = textLine->getChar(z);
832 a = &m_attribs[textLine->getAttr(z)]; 832 a = &m_attribs[textLine->getAttr(z)];
833 833
834 if (ch == '\t') 834 if (ch == '\t')
835 x += m_tabWidth - (x % m_tabWidth); 835 x += m_tabWidth - (x % m_tabWidth);
836 else if (a->bold && a->italic) 836 else if (a->bold && a->italic)
837 x += myFontMetricsBI.width(ch); 837 x += myFontMetricsBI.width(ch);
838 else if (a->bold) 838 else if (a->bold)
839 x += myFontMetricsBold.width(ch); 839 x += myFontMetricsBold.width(ch);
840 else if (a->italic) 840 else if (a->italic)
841 x += myFontMetricsItalic.width(ch); 841 x += myFontMetricsItalic.width(ch);
842 else 842 else
843 x += myFontMetrics.width(ch); 843 x += myFontMetrics.width(ch);
844 844
845 z++; 845 z++;
846 } 846 }
847 if (xPos - oldX < x - xPos && z > 0) { 847 if (xPos - oldX < x - xPos && z > 0) {
848 z--; 848 z--;
849 // newXPos = oldX; 849 // newXPos = oldX;
850 }// else newXPos = x; 850 }// else newXPos = x;
851 return z; 851 return z;
852} 852}
853 853
854int KateDocument::textWidth() { 854int KateDocument::textWidth() {
855 return int(maxLength + 8); 855 return int(maxLength + 8);
856} 856}
857 857
858int KateDocument::textHeight() { 858int KateDocument::textHeight() {
859 return numLines()*fontHeight; 859 return numLines()*fontHeight;
860} 860}
861 861
862void KateDocument::insert(VConfig &c, const QString &s) { 862void KateDocument::insert(VConfig &c, const QString &s) {
863 int pos; 863 int pos;
864 QChar ch; 864 QChar ch;
865 QString buf; 865 QString buf;
866 866
867 if (s.isEmpty()) return; 867 if (s.isEmpty()) return;
868 868
869 recordStart(c, KateActionGroup::ugPaste); 869 recordStart(c, KateActionGroup::ugPaste);
870 870
871 pos = 0; 871 pos = 0;
872 if (!(c.flags & KateView::cfVerticalSelect)) { 872 if (!(c.flags & KateView::cfVerticalSelect)) {
873 do { 873 do {
874 ch = s[pos]; 874 ch = s[pos];
875 if (ch.isPrint() || ch == '\t') { 875 if (ch.isPrint() || ch == '\t') {
876 buf += ch; // append char to buffer 876 buf += ch; // append char to buffer
877 } else if (ch == '\n') { 877 } else if (ch == '\n') {
878 recordAction(KateAction::newLine, c.cursor); // wrap contents behind cursor to new line 878 recordAction(KateAction::newLine, c.cursor); // wrap contents behind cursor to new line
879 recordInsert(c, buf); // append to old line 879 recordInsert(c, buf); // append to old line
880// c.cursor.x += buf.length(); 880// c.cursor.x += buf.length();
881 buf.truncate(0); // clear buffer 881 buf.truncate(0); // clear buffer
882 c.cursor.y++; 882 c.cursor.y++;
883 c.cursor.x = 0; 883 c.cursor.x = 0;
884 } 884 }
885 pos++; 885 pos++;
886 } while (pos < (int) s.length()); 886 } while (pos < (int) s.length());
887 } else { 887 } else {
888 int xPos; 888 int xPos;
889 889
890 xPos = textWidth(c.cursor); 890 xPos = textWidth(c.cursor);
891 do { 891 do {
892 ch = s[pos]; 892 ch = s[pos];
893 if (ch.isPrint() || ch == '\t') { 893 if (ch.isPrint() || ch == '\t') {
894 buf += ch; 894 buf += ch;
895 } else if (ch == '\n') { 895 } else if (ch == '\n') {
896 recordInsert(c, buf); 896 recordInsert(c, buf);
897 c.cursor.x += buf.length(); 897 c.cursor.x += buf.length();
898 buf.truncate(0); 898 buf.truncate(0);
899 c.cursor.y++; 899 c.cursor.y++;
900 if (c.cursor.y >= numLines()) 900 if (c.cursor.y >= numLines())
901 recordAction(KateAction::insLine, c.cursor); 901 recordAction(KateAction::insLine, c.cursor);
902 c.cursor.x = textPos(getTextLine(c.cursor.y), xPos); 902 c.cursor.x = textPos(getTextLine(c.cursor.y), xPos);
903 } 903 }
904 pos++; 904 pos++;
905 } while (pos < (int) s.length()); 905 } while (pos < (int) s.length());
906 } 906 }
907 recordInsert(c, buf); 907 recordInsert(c, buf);
908 c.cursor.x += buf.length(); 908 c.cursor.x += buf.length();
909 recordEnd(c); 909 recordEnd(c);
910} 910}
911 911
912void KateDocument::insertFile(VConfig &c, QIODevice &dev) 912void KateDocument::insertFile(VConfig &c, QIODevice &dev)
913{ 913{
914 recordStart(c, KateActionGroup::ugPaste); 914 recordStart(c, KateActionGroup::ugPaste);
915 915
916 QString buf; 916 QString buf;
917 QChar ch, last; 917 QChar ch, last;
918 918
919 QTextStream stream( &dev ); 919 QTextStream stream( &dev );
920 920
921 while ( !stream.atEnd() ) { 921 while ( !stream.atEnd() ) {
922 stream >> ch; 922 stream >> ch;
923 923
924 if (ch.isPrint() || ch == '\t') { 924 if (ch.isPrint() || ch == '\t') {
925 buf += ch; 925 buf += ch;
926 } else if (ch == '\n' || ch == '\r') { 926 } else if (ch == '\n' || ch == '\r') {
927 if (last != '\r' || ch != '\n') { 927 if (last != '\r' || ch != '\n') {
928 recordAction(KateAction::newLine, c.cursor); 928 recordAction(KateAction::newLine, c.cursor);
929 recordInsert(c, buf); 929 recordInsert(c, buf);
930 buf.truncate(0); 930 buf.truncate(0);
931 c.cursor.y++; 931 c.cursor.y++;
932 c.cursor.x = 0; 932 c.cursor.x = 0;
933 } 933 }
934 last = ch; 934 last = ch;
935 } 935 }
936 } 936 }
937 937
938 recordInsert(c, buf); 938 recordInsert(c, buf);
939 recordEnd(c); 939 recordEnd(c);
940} 940}
941 941
942int KateDocument::currentColumn(PointStruc &cursor) { 942int KateDocument::currentColumn(PointStruc &cursor) {
943 return getTextLine(cursor.y)->cursorX(cursor.x,tabChars); 943 return getTextLine(cursor.y)->cursorX(cursor.x,tabChars);
944} 944}
945 945
946bool KateDocument::insertChars(VConfig &c, const QString &chars) { 946bool KateDocument::insertChars(VConfig &c, const QString &chars) {
947 int z, pos, l; 947 int z, pos, l;
948 bool onlySpaces; 948 bool onlySpaces;
949 QChar ch; 949 QChar ch;
950 QString buf; 950 QString buf;
951 951
952 TextLine::Ptr textLine = getTextLine(c.cursor.y); 952 TextLine::Ptr textLine = getTextLine(c.cursor.y);
953 953
954 pos = 0; 954 pos = 0;
955 onlySpaces = true; 955 onlySpaces = true;
956 for (z = 0; z < (int) chars.length(); z++) { 956 for (z = 0; z < (int) chars.length(); z++) {
957 ch = chars[z]; 957 ch = chars[z];
958 if (ch == '\t' && c.flags & KateView::cfReplaceTabs) { 958 if (ch == '\t' && c.flags & KateView::cfReplaceTabs) {
959 l = tabChars - (textLine->cursorX(c.cursor.x, tabChars) % tabChars); 959 l = tabChars - (textLine->cursorX(c.cursor.x, tabChars) % tabChars);
960 while (l > 0) { 960 while (l > 0) {
961 buf.insert(pos, ' '); 961 buf.insert(pos, ' ');
962 pos++; 962 pos++;
963 l--; 963 l--;
964 } 964 }
965 } else if (ch.isPrint() || ch == '\t') { 965 } else if (ch.isPrint() || ch == '\t') {
966 buf.insert(pos, ch); 966 buf.insert(pos, ch);
967 pos++; 967 pos++;
968 if (ch != ' ') onlySpaces = false; 968 if (ch != ' ') onlySpaces = false;
969 if (c.flags & KateView::cfAutoBrackets) { 969 if (c.flags & KateView::cfAutoBrackets) {
970 if (ch == '(') buf.insert(pos, ')'); 970 if (ch == '(') buf.insert(pos, ')');
971 if (ch == '[') buf.insert(pos, ']'); 971 if (ch == '[') buf.insert(pos, ']');
972 if (ch == '{') buf.insert(pos, '}'); 972 if (ch == '{') buf.insert(pos, '}');
973 } 973 }
974 } 974 }
975 } 975 }
976 //pos = cursor increment 976 //pos = cursor increment
977 977
978 //return false if nothing has to be inserted 978 //return false if nothing has to be inserted
979 if (buf.isEmpty()) return false; 979 if (buf.isEmpty()) return false;
980 980
981 //auto deletion of the marked text occurs not very often and can therefore 981 //auto deletion of the marked text occurs not very often and can therefore
982 // be recorded separately 982 // be recorded separately
983 if (c.flags &KateView:: cfDelOnInput) delMarkedText(c); 983 if (c.flags &KateView:: cfDelOnInput) delMarkedText(c);
984 984
985 recordStart(c, KateActionGroup::ugInsChar); 985 recordStart(c, KateActionGroup::ugInsChar);
986 recordReplace(c/*.cursor*/, (c.flags & KateView::cfOvr) ? buf.length() : 0, buf); 986 recordReplace(c/*.cursor*/, (c.flags & KateView::cfOvr) ? buf.length() : 0, buf);
987 c.cursor.x += pos; 987 c.cursor.x += pos;
988 988
989 if (myWordWrap && myWordWrapAt > 0) { 989 if (myWordWrap && myWordWrapAt > 0) {
990 int line; 990 int line;
991 const QChar *s; 991 const QChar *s;
992// int pos; 992// int pos;
993 PointStruc actionCursor; 993 PointStruc actionCursor;
994 994
995 line = c.cursor.y; 995 line = c.cursor.y;
996 do { 996 do {
997 textLine = getTextLine(line); 997 textLine = getTextLine(line);
998 s = textLine->getText(); 998 s = textLine->getText();
999 l = textLine->length(); 999 l = textLine->length();
1000 for (z = myWordWrapAt; z < l; z++) if (!s[z].isSpace()) break; //search for text to wrap 1000 for (z = myWordWrapAt; z < l; z++) if (!s[z].isSpace()) break; //search for text to wrap
1001 if (z >= l) break; // nothing more to wrap 1001 if (z >= l) break; // nothing more to wrap
1002 pos = myWordWrapAt; 1002 pos = myWordWrapAt;
1003 for (; z >= 0; z--) { //find wrap position 1003 for (; z >= 0; z--) { //find wrap position
1004 if (s[z].isSpace()) { 1004 if (s[z].isSpace()) {
1005 pos = z + 1; 1005 pos = z + 1;
1006 break; 1006 break;
1007 } 1007 }
1008 } 1008 }
1009 //pos = wrap position 1009 //pos = wrap position
1010 1010
1011 if (line == c.cursor.y && pos <= c.cursor.x) { 1011 if (line == c.cursor.y && pos <= c.cursor.x) {
1012 //wrap cursor 1012 //wrap cursor
1013 c.cursor.y++; 1013 c.cursor.y++;
1014 c.cursor.x -= pos; 1014 c.cursor.x -= pos;
1015 } 1015 }
1016 1016
1017 if (line == lastLine() || (getTextLine(line+1)->length() == 0) ) { 1017 if (line == lastLine() || (getTextLine(line+1)->length() == 0) ) {
1018 //at end of doc: create new line 1018 //at end of doc: create new line
1019 actionCursor.x = pos; 1019 actionCursor.x = pos;
1020 actionCursor.y = line; 1020 actionCursor.y = line;
1021 recordAction(KateAction::newLine,actionCursor); 1021 recordAction(KateAction::newLine,actionCursor);
1022 } else { 1022 } else {
1023 //wrap 1023 //wrap
1024 actionCursor.y = line + 1; 1024 actionCursor.y = line + 1;
1025 if (!s[l - 1].isSpace()) { //add space in next line if necessary 1025 if (!s[l - 1].isSpace()) { //add space in next line if necessary
1026 actionCursor.x = 0; 1026 actionCursor.x = 0;
1027 recordInsert(actionCursor, " "); 1027 recordInsert(actionCursor, " ");
1028 } 1028 }
1029 actionCursor.x = textLine->length() - pos; 1029 actionCursor.x = textLine->length() - pos;
1030 recordAction(KateAction::wordWrap, actionCursor); 1030 recordAction(KateAction::wordWrap, actionCursor);
1031 } 1031 }
1032 line++; 1032 line++;
1033 } while (true); 1033 } while (true);
1034 } 1034 }
1035 recordEnd(c); 1035 recordEnd(c);
1036 return true; 1036 return true;
1037} 1037}
1038 1038
1039QString tabString(int pos, int tabChars) { 1039QString tabString(int pos, int tabChars) {
1040 QString s; 1040 QString s;
1041 while (pos >= tabChars) { 1041 while (pos >= tabChars) {
1042 s += '\t'; 1042 s += '\t';
1043 pos -= tabChars; 1043 pos -= tabChars;
1044 } 1044 }
1045 while (pos > 0) { 1045 while (pos > 0) {
1046 s += ' '; 1046 s += ' ';
1047 pos--; 1047 pos--;
1048 } 1048 }
1049 return s; 1049 return s;
1050} 1050}
1051 1051
1052void KateDocument::newLine(VConfig &c) { 1052void KateDocument::newLine(VConfig &c) {
1053 1053
1054 //auto deletion of marked text is done by the view to have a more 1054 //auto deletion of marked text is done by the view to have a more
1055 // "low level" KateDocument::newLine method 1055 // "low level" KateDocument::newLine method
1056 recordStart(c, KateActionGroup::ugInsLine); 1056 recordStart(c, KateActionGroup::ugInsLine);
1057 1057
1058 if (!(c.flags & KateView::cfAutoIndent)) { 1058 if (!(c.flags & KateView::cfAutoIndent)) {
1059 recordAction(KateAction::newLine,c.cursor); 1059 recordAction(KateAction::newLine,c.cursor);
1060 c.cursor.y++; 1060 c.cursor.y++;
1061 c.cursor.x = 0; 1061 c.cursor.x = 0;
1062 } else { 1062 } else {
1063 TextLine::Ptr textLine = getTextLine(c.cursor.y); 1063 TextLine::Ptr textLine = getTextLine(c.cursor.y);
1064 int pos = textLine->firstChar(); 1064 int pos = textLine->firstChar();
1065 if (c.cursor.x < pos) c.cursor.x = pos; // place cursor on first char if before 1065 if (c.cursor.x < pos) c.cursor.x = pos; // place cursor on first char if before
1066 1066
1067 int y = c.cursor.y; 1067 int y = c.cursor.y;
1068 while ((y > 0) && (pos < 0)) { // search a not empty text line 1068 while ((y > 0) && (pos < 0)) { // search a not empty text line
1069 textLine = getTextLine(--y); 1069 textLine = getTextLine(--y);
1070 pos = textLine->firstChar(); 1070 pos = textLine->firstChar();
1071 } 1071 }
1072 recordAction(KateAction::newLine, c.cursor); 1072 recordAction(KateAction::newLine, c.cursor);
1073 c.cursor.y++; 1073 c.cursor.y++;
1074 c.cursor.x = 0; 1074 c.cursor.x = 0;
1075 if (pos > 0) { 1075 if (pos > 0) {
1076 pos = textLine->cursorX(pos, tabChars); 1076 pos = textLine->cursorX(pos, tabChars);
1077// if (getTextLine(c.cursor.y)->length() > 0) { 1077// if (getTextLine(c.cursor.y)->length() > 0) {
1078 QString s = tabString(pos, (c.flags & KateView::cfSpaceIndent) ? 0xffffff : tabChars); 1078 QString s = tabString(pos, (c.flags & KateView::cfSpaceIndent) ? 0xffffff : tabChars);
1079 recordInsert(c.cursor, s); 1079 recordInsert(c.cursor, s);
1080 pos = s.length(); 1080 pos = s.length();
1081// } 1081// }
1082// recordInsert(c.cursor, QString(textLine->getText(), pos)); 1082// recordInsert(c.cursor, QString(textLine->getText(), pos));
1083 c.cursor.x = pos; 1083 c.cursor.x = pos;
1084 } 1084 }
1085 } 1085 }
1086 1086
1087 recordEnd(c); 1087 recordEnd(c);
1088} 1088}
1089 1089
1090void KateDocument::killLine(VConfig &c) { 1090void KateDocument::killLine(VConfig &c) {
1091 1091
1092 recordStart(c, KateActionGroup::ugDelLine); 1092 recordStart(c, KateActionGroup::ugDelLine);
1093 c.cursor.x = 0; 1093 c.cursor.x = 0;
1094 recordDelete(c.cursor, 0xffffff); 1094 recordDelete(c.cursor, 0xffffff);
1095 if (c.cursor.y < lastLine()) { 1095 if (c.cursor.y < lastLine()) {
1096 recordAction(KateAction::killLine, c.cursor); 1096 recordAction(KateAction::killLine, c.cursor);
1097 } 1097 }
1098 recordEnd(c); 1098 recordEnd(c);
1099} 1099}
1100 1100
1101void KateDocument::backspace(VConfig &c) { 1101void KateDocument::backspace(VConfig &c) {
1102 1102
1103 if (c.cursor.x <= 0 && c.cursor.y <= 0) return; 1103 if (c.cursor.x <= 0 && c.cursor.y <= 0) return;
1104 1104
1105 if (c.cursor.x > 0) { 1105 if (c.cursor.x > 0) {
1106 recordStart(c, KateActionGroup::ugDelChar); 1106 recordStart(c, KateActionGroup::ugDelChar);
1107 if (!(c.flags & KateView::cfBackspaceIndents)) { 1107 if (!(c.flags & KateView::cfBackspaceIndents)) {
1108 // ordinary backspace 1108 // ordinary backspace
1109 c.cursor.x--; 1109 c.cursor.x--;
1110 recordDelete(c.cursor, 1); 1110 recordDelete(c.cursor, 1);
1111 } else { 1111 } else {
1112 // backspace indents: erase to next indent position 1112 // backspace indents: erase to next indent position
1113 int l = 1; // del one char 1113 int l = 1; // del one char
1114 1114
1115 TextLine::Ptr textLine = getTextLine(c.cursor.y); 1115 TextLine::Ptr textLine = getTextLine(c.cursor.y);
1116 int pos = textLine->firstChar(); 1116 int pos = textLine->firstChar();
1117 if (pos < 0 || pos >= c.cursor.x) { 1117 if (pos < 0 || pos >= c.cursor.x) {
1118 // only spaces on left side of cursor 1118 // only spaces on left side of cursor
1119 // search a line with less spaces 1119 // search a line with less spaces
1120 int y = c.cursor.y; 1120 int y = c.cursor.y;
1121 while (y > 0) { 1121 while (y > 0) {
1122 textLine = getTextLine(--y); 1122 textLine = getTextLine(--y);
1123 pos = textLine->firstChar(); 1123 pos = textLine->firstChar();
1124 if (pos >= 0 && pos < c.cursor.x) { 1124 if (pos >= 0 && pos < c.cursor.x) {
1125 l = c.cursor.x - pos; // del more chars 1125 l = c.cursor.x - pos; // del more chars
1126 break; 1126 break;
1127 } 1127 }
1128 } 1128 }
1129 } 1129 }
1130 // break effectively jumps here 1130 // break effectively jumps here
1131 c.cursor.x -= l; 1131 c.cursor.x -= l;
1132 recordDelete(c.cursor, l); 1132 recordDelete(c.cursor, l);
1133 } 1133 }
1134 } else { 1134 } else {
1135 // c.cursor.x == 0: wrap to previous line 1135 // c.cursor.x == 0: wrap to previous line
1136 recordStart(c, KateActionGroup::ugDelLine); 1136 recordStart(c, KateActionGroup::ugDelLine);
1137 c.cursor.y--; 1137 c.cursor.y--;
1138 c.cursor.x = getTextLine(c.cursor.y)->length(); 1138 c.cursor.x = getTextLine(c.cursor.y)->length();
1139 recordAction(KateAction::delLine,c.cursor); 1139 recordAction(KateAction::delLine,c.cursor);
1140 } 1140 }
1141 recordEnd(c); 1141 recordEnd(c);
1142} 1142}
1143 1143
1144 1144
1145void KateDocument::del(VConfig &c) { 1145void KateDocument::del(VConfig &c) {
1146 TextLine::Ptr textLine = getTextLine(c.cursor.y); 1146 TextLine::Ptr textLine = getTextLine(c.cursor.y);
1147 int len = (c.flags & KateView::cfRemoveSpaces) ? textLine->lastChar() : textLine->length(); 1147 int len = (c.flags & KateView::cfRemoveSpaces) ? textLine->lastChar() : textLine->length();
1148 if (c.cursor.x < len/*getTextLine(c.cursor.y)->length()*/) { 1148 if (c.cursor.x < len/*getTextLine(c.cursor.y)->length()*/) {
1149 // delete one character 1149 // delete one character
1150 recordStart(c, KateActionGroup::ugDelChar); 1150 recordStart(c, KateActionGroup::ugDelChar);
1151 recordDelete(c.cursor, 1); 1151 recordDelete(c.cursor, 1);
1152 recordEnd(c); 1152 recordEnd(c);
1153 } else { 1153 } else {
1154 if (c.cursor.y < lastLine()) { 1154 if (c.cursor.y < lastLine()) {
1155 // wrap next line to this line 1155 // wrap next line to this line
1156 textLine->truncate(c.cursor.x); // truncate spaces 1156 textLine->truncate(c.cursor.x); // truncate spaces
1157 recordStart(c, KateActionGroup::ugDelLine); 1157 recordStart(c, KateActionGroup::ugDelLine);
1158 recordAction(KateAction::delLine,c.cursor); 1158 recordAction(KateAction::delLine,c.cursor);
1159 recordEnd(c); 1159 recordEnd(c);
1160 } 1160 }
1161 } 1161 }
1162} 1162}
1163 1163
1164void KateDocument::clear() { 1164void KateDocument::clear() {
1165 PointStruc cursor; 1165 PointStruc cursor;
1166 KateView *view; 1166 KateView *view;
1167 1167
1168 setPseudoModal(0L); 1168 setPseudoModal(0L);
1169 cursor.x = cursor.y = 0; 1169 cursor.x = cursor.y = 0;
1170 for (view = views.first(); view != 0L; view = views.next() ) { 1170 for (view = views.first(); view != 0L; view = views.next() ) {
1171 view->updateCursor(cursor); 1171 view->updateCursor(cursor);
1172 view->tagAll(); 1172 view->tagAll();
1173 } 1173 }
1174 1174
1175 eolMode = KateDocument::eolUnix; 1175 eolMode = KateDocument::eolUnix;
1176 1176
1177 buffer->clear(); 1177 buffer->clear();
1178 longestLine = buffer->line(0); 1178 longestLine = buffer->line(0);
1179 1179
1180 maxLength = 0; 1180 maxLength = 0;
1181 1181
1182 select.x = -1; 1182 select.x = -1;
1183 1183
1184 selectStart = 0xffffff; 1184 selectStart = 0xffffff;
1185 selectEnd = 0; 1185 selectEnd = 0;
1186 oldMarkState = false; 1186 oldMarkState = false;
1187 1187
1188 setModified(false); 1188 setModified(false);
1189 1189
1190 undoList.clear(); 1190 undoList.clear();
1191 currentUndo = 0; 1191 currentUndo = 0;
1192 newUndo(); 1192 newUndo();
1193} 1193}
1194 1194
1195void KateDocument::cut(VConfig &c) { 1195void KateDocument::cut(VConfig &c) {
1196 1196
1197 if (selectEnd < selectStart) return; 1197 if (selectEnd < selectStart) return;
1198 1198
1199 copy(c.flags); 1199 copy(c.flags);
1200 delMarkedText(c); 1200 delMarkedText(c);
1201} 1201}
1202 1202
1203void KateDocument::copy(int flags) { 1203void KateDocument::copy(int flags) {
1204 1204
1205 if (selectEnd < selectStart) return; 1205 if (selectEnd < selectStart) return;
1206 1206
1207 QString s = markedText(flags); 1207 QString s = markedText(flags);
1208 if (!s.isEmpty()) { 1208 if (!s.isEmpty()) {
1209//#if defined(_WS_X11_) 1209//#if defined(_WS_X11_)
1210 if (m_singleSelection) 1210 if (m_singleSelection)
1211 disconnect(QApplication::clipboard(), SIGNAL(dataChanged()), this, 0); 1211 disconnect(QApplication::clipboard(), SIGNAL(dataChanged()), this, 0);
1212//#endif 1212//#endif
1213 QApplication::clipboard()->setText(s); 1213 QApplication::clipboard()->setText(s);
1214//#if defined(_WS_X11_) 1214//#if defined(_WS_X11_)
1215 if (m_singleSelection) { 1215 if (m_singleSelection) {
1216 connect(QApplication::clipboard(), SIGNAL(dataChanged()), 1216 connect(QApplication::clipboard(), SIGNAL(dataChanged()),
1217 this, SLOT(clipboardChanged())); 1217 this, SLOT(clipboardChanged()));
1218 } 1218 }
1219//#endif 1219//#endif
1220 } 1220 }
1221} 1221}
1222 1222
1223void KateDocument::paste(VConfig &c) { 1223void KateDocument::paste(VConfig &c) {
1224 QString s = QApplication::clipboard()->text(); 1224 QString s = QApplication::clipboard()->text();
1225 if (!s.isEmpty()) { 1225 if (!s.isEmpty()) {
1226 insert(c, s); 1226 insert(c, s);
1227 } 1227 }
1228} 1228}
1229 1229
1230void KateDocument::toggleRect(int start, int end, int x1, int x2) { 1230void KateDocument::toggleRect(int start, int end, int x1, int x2) {
1231 int z, line; 1231 int z, line;
1232 bool t; 1232 bool t;
1233 1233
1234 if (x1 > x2) { 1234 if (x1 > x2) {
1235 z = x1; 1235 z = x1;
1236 x1 = x2; 1236 x1 = x2;
1237 x2 = z; 1237 x2 = z;
1238 } 1238 }
1239 if (start > end) { 1239 if (start > end) {
1240 z = start; 1240 z = start;
1241 start = end; 1241 start = end;
1242 end = z; 1242 end = z;
1243 } 1243 }
1244 1244
1245 t = false; 1245 t = false;
1246 for (line = start; line < end; line++) { 1246 for (line = start; line < end; line++) {
1247 int x, oldX, s, e, newX1, newX2; 1247 int x, oldX, s, e, newX1, newX2;
1248 QChar ch; 1248 QChar ch;
1249 Attribute *a; 1249 Attribute *a;
1250 1250
1251 TextLine::Ptr textLine = getTextLine(line); 1251 TextLine::Ptr textLine = getTextLine(line);
1252 1252
1253 //--- speed optimization 1253 //--- speed optimization
1254 //s = textPos(textLine, x1, newX1); 1254 //s = textPos(textLine, x1, newX1);
1255 x = oldX = z = 0; 1255 x = oldX = z = 0;
1256 while (x < x1) { // && z < len) { 1256 while (x < x1) { // && z < len) {
1257 oldX = x; 1257 oldX = x;
1258 ch = textLine->getChar(z); 1258 ch = textLine->getChar(z);
1259 a = &m_attribs[textLine->getAttr(z)]; 1259 a = &m_attribs[textLine->getAttr(z)];
1260 1260
1261 if (ch == '\t') 1261 if (ch == '\t')
1262 x += m_tabWidth - (x % m_tabWidth); 1262 x += m_tabWidth - (x % m_tabWidth);
1263 else if (a->bold && a->italic) 1263 else if (a->bold && a->italic)
1264 x += myFontMetricsBI.width(ch); 1264 x += myFontMetricsBI.width(ch);
1265 else if (a->bold) 1265 else if (a->bold)
1266 x += myFontMetricsBold.width(ch); 1266 x += myFontMetricsBold.width(ch);
1267 else if (a->italic) 1267 else if (a->italic)
1268 x += myFontMetricsItalic.width(ch); 1268 x += myFontMetricsItalic.width(ch);
1269 else 1269 else
1270 x += myFontMetrics.width(ch); 1270 x += myFontMetrics.width(ch);
1271 1271
1272 z++; 1272 z++;
1273 } 1273 }
1274 s = z; 1274 s = z;
1275 if (x1 - oldX < x - x1 && z > 0) { 1275 if (x1 - oldX < x - x1 && z > 0) {
1276 s--; 1276 s--;
1277 newX1 = oldX; 1277 newX1 = oldX;
1278 } else newX1 = x; 1278 } else newX1 = x;
1279 //e = textPos(textLine, x2, newX2); 1279 //e = textPos(textLine, x2, newX2);
1280 while (x < x2) { // && z < len) { 1280 while (x < x2) { // && z < len) {
1281 oldX = x; 1281 oldX = x;
1282 ch = textLine->getChar(z); 1282 ch = textLine->getChar(z);
1283 a = &m_attribs[textLine->getAttr(z)]; 1283 a = &m_attribs[textLine->getAttr(z)];
1284 1284
1285 if (ch == '\t') 1285 if (ch == '\t')
1286 x += m_tabWidth - (x % m_tabWidth); 1286 x += m_tabWidth - (x % m_tabWidth);
1287 else if (a->bold && a->italic) 1287 else if (a->bold && a->italic)
1288 x += myFontMetricsBI.width(ch); 1288 x += myFontMetricsBI.width(ch);
1289 else if (a->bold) 1289 else if (a->bold)
1290 x += myFontMetricsBold.width(ch); 1290 x += myFontMetricsBold.width(ch);
1291 else if (a->italic) 1291 else if (a->italic)
1292 x += myFontMetricsItalic.width(ch); 1292 x += myFontMetricsItalic.width(ch);
1293 else 1293 else
1294 x += myFontMetrics.width(ch); 1294 x += myFontMetrics.width(ch);
1295 1295
1296 z++; 1296 z++;
1297 } 1297 }
1298 e = z; 1298 e = z;
1299 if (x2 - oldX < x - x2 && z > 0) { 1299 if (x2 - oldX < x - x2 && z > 0) {
1300 e--; 1300 e--;
1301 newX2 = oldX; 1301 newX2 = oldX;
1302 } else newX2 = x; 1302 } else newX2 = x;
1303 //--- 1303 //---
1304 1304
1305 if (e > s) { 1305 if (e > s) {
1306 textLine->toggleSelect(s, e); 1306 textLine->toggleSelect(s, e);
1307 tagLineRange(line, newX1, newX2); 1307 tagLineRange(line, newX1, newX2);
1308 t = true; 1308 t = true;
1309 } 1309 }
1310 } 1310 }
1311 if (t) { 1311 if (t) {
1312 end--; 1312 end--;
1313// tagLines(start, end); 1313// tagLines(start, end);
1314 1314
1315 if (start < selectStart) selectStart = start; 1315 if (start < selectStart) selectStart = start;
1316 if (end > selectEnd) selectEnd = end; 1316 if (end > selectEnd) selectEnd = end;
1317 emit selectionChanged(); 1317 emit selectionChanged();
1318 } 1318 }
1319} 1319}
1320 1320
1321void KateDocument::selectTo(VConfig &c, PointStruc &cursor, int cXPos) { 1321void KateDocument::selectTo(VConfig &c, PointStruc &cursor, int cXPos) {
1322 //c.cursor = old cursor position 1322 //c.cursor = old cursor position
1323 //cursor = new cursor position 1323 //cursor = new cursor position
1324 1324
1325 if (c.cursor.x != select.x || c.cursor.y != select.y) { 1325 if (c.cursor.x != select.x || c.cursor.y != select.y) {
1326 //new selection 1326 //new selection
1327 1327
1328 if (!(c.flags & KateView::cfKeepSelection)) deselectAll(); 1328 if (!(c.flags & KateView::cfKeepSelection)) deselectAll();
1329// else recordReset(); 1329// else recordReset();
1330 1330
1331 anchor = c.cursor; 1331 anchor = c.cursor;
1332 aXPos = c.cXPos; 1332 aXPos = c.cXPos;
1333 } 1333 }
1334 1334
1335 if (!(c.flags & KateView::cfVerticalSelect)) { 1335 if (!(c.flags & KateView::cfVerticalSelect)) {
1336 //horizontal selections 1336 //horizontal selections
1337 int x, y, sXPos; 1337 int x, y, sXPos;
1338 int ex, ey, eXPos; 1338 int ex, ey, eXPos;
1339 bool sel; 1339 bool sel;
1340 1340
1341 if (cursor.y > c.cursor.y || (cursor.y == c.cursor.y && cursor.x > c.cursor.x)) { 1341 if (cursor.y > c.cursor.y || (cursor.y == c.cursor.y && cursor.x > c.cursor.x)) {
1342 x = c.cursor.x; 1342 x = c.cursor.x;
1343 y = c.cursor.y; 1343 y = c.cursor.y;
1344 sXPos = c.cXPos; 1344 sXPos = c.cXPos;
1345 ex = cursor.x; 1345 ex = cursor.x;
1346 ey = cursor.y; 1346 ey = cursor.y;
1347 eXPos = cXPos; 1347 eXPos = cXPos;
1348 sel = true; 1348 sel = true;
1349 } else { 1349 } else {
1350 x = cursor.x; 1350 x = cursor.x;
1351 y = cursor.y; 1351 y = cursor.y;
1352 sXPos = cXPos; 1352 sXPos = cXPos;
1353 ex = c.cursor.x; 1353 ex = c.cursor.x;
1354 ey = c.cursor.y; 1354 ey = c.cursor.y;
1355 eXPos = c.cXPos; 1355 eXPos = c.cXPos;
1356 sel = false; 1356 sel = false;
1357 } 1357 }
1358 1358
1359// tagLines(y, ye); 1359// tagLines(y, ye);
1360 if (y < ey) { 1360 if (y < ey) {
1361 //tagLineRange(y, sXPos, 0xffffff); 1361 //tagLineRange(y, sXPos, 0xffffff);
1362 tagLines(y, ey -1); 1362 tagLines(y, ey -1);
1363 tagLineRange(ey, 0, eXPos); 1363 tagLineRange(ey, 0, eXPos);
1364 } else tagLineRange(y, sXPos, eXPos); 1364 } else tagLineRange(y, sXPos, eXPos);
1365 1365
1366 if (y < selectStart) selectStart = y; 1366 if (y < selectStart) selectStart = y;
1367 if (ey > selectEnd) selectEnd = ey; 1367 if (ey > selectEnd) selectEnd = ey;
1368 1368
1369 TextLine::Ptr textLine = getTextLine(y); 1369 TextLine::Ptr textLine = getTextLine(y);
1370 1370
1371 if (c.flags & KateView::cfXorSelect) { 1371 if (c.flags & KateView::cfXorSelect) {
1372 //xor selection with old selection 1372 //xor selection with old selection
1373 while (y < ey) { 1373 while (y < ey) {
1374 textLine->toggleSelectEol(x); 1374 textLine->toggleSelectEol(x);
1375 x = 0; 1375 x = 0;
1376 y++; 1376 y++;
1377 textLine = getTextLine(y); 1377 textLine = getTextLine(y);
1378 } 1378 }
1379 textLine->toggleSelect(x, ex); 1379 textLine->toggleSelect(x, ex);
1380 } else { 1380 } else {
1381 //set selection over old selection 1381 //set selection over old selection
1382 1382
1383 if (anchor.y > y || (anchor.y == y && anchor.x > x)) { 1383 if (anchor.y > y || (anchor.y == y && anchor.x > x)) {
1384 if (anchor.y < ey || (anchor.y == ey && anchor.x < ex)) { 1384 if (anchor.y < ey || (anchor.y == ey && anchor.x < ex)) {
1385 sel = !sel; 1385 sel = !sel;
1386 while (y < anchor.y) { 1386 while (y < anchor.y) {
1387 textLine->selectEol(sel, x); 1387 textLine->selectEol(sel, x);
1388 x = 0; 1388 x = 0;
1389 y++; 1389 y++;
1390 textLine = getTextLine(y); 1390 textLine = getTextLine(y);
1391 } 1391 }
1392 textLine->select(sel, x, anchor.x); 1392 textLine->select(sel, x, anchor.x);
1393 x = anchor.x; 1393 x = anchor.x;
1394 } 1394 }
1395 sel = !sel; 1395 sel = !sel;
1396 } 1396 }
1397 while (y < ey) { 1397 while (y < ey) {
1398 textLine->selectEol(sel, x); 1398 textLine->selectEol(sel, x);
1399 x = 0; 1399 x = 0;
1400 y++; 1400 y++;
1401 textLine = getTextLine(y); 1401 textLine = getTextLine(y);
1402 } 1402 }
1403 textLine->select(sel, x, ex); 1403 textLine->select(sel, x, ex);
1404 } 1404 }
1405 } else { 1405 } else {
1406 //vertical (block) selections 1406 //vertical (block) selections
1407// int ax, sx, ex; 1407// int ax, sx, ex;
1408 1408
1409// ax = textWidth(anchor); 1409// ax = textWidth(anchor);
1410// sx = textWidth(start); 1410// sx = textWidth(start);
1411// ex = textWidth(end); 1411// ex = textWidth(end);
1412 1412
1413 toggleRect(c.cursor.y + 1, cursor.y + 1, aXPos, c.cXPos); 1413 toggleRect(c.cursor.y + 1, cursor.y + 1, aXPos, c.cXPos);
1414 toggleRect(anchor.y, cursor.y + 1, c.cXPos, cXPos); 1414 toggleRect(anchor.y, cursor.y + 1, c.cXPos, cXPos);
1415 } 1415 }
1416 select = cursor; 1416 select = cursor;
1417 optimizeSelection(); 1417 optimizeSelection();
1418 emit selectionChanged(); 1418 emit selectionChanged();
1419} 1419}
1420 1420
1421 1421
1422void KateDocument::selectAll() { 1422void KateDocument::selectAll() {
1423 int z; 1423 int z;
1424 TextLine::Ptr textLine; 1424 TextLine::Ptr textLine;
1425 1425
1426 select.x = -1; 1426 select.x = -1;
1427 1427
1428// if (selectStart != 0 || selectEnd != lastLine()) recordReset(); 1428// if (selectStart != 0 || selectEnd != lastLine()) recordReset();
1429 1429
1430 selectStart = 0; 1430 selectStart = 0;
1431 selectEnd = lastLine(); 1431 selectEnd = lastLine();
1432 1432
1433 tagLines(selectStart,selectEnd); 1433 tagLines(selectStart,selectEnd);
1434 1434
1435 for (z = selectStart; z < selectEnd; z++) { 1435 for (z = selectStart; z < selectEnd; z++) {
1436 textLine = getTextLine(z); 1436 textLine = getTextLine(z);
1437 textLine->selectEol(true,0); 1437 textLine->selectEol(true,0);
1438 } 1438 }
1439 textLine = getTextLine(z); 1439 textLine = getTextLine(z);
1440 textLine->select(true,0,textLine->length()); 1440 textLine->select(true,0,textLine->length());
1441 emit selectionChanged(); 1441 emit selectionChanged();
1442} 1442}
1443 1443
1444void KateDocument::deselectAll() { 1444void KateDocument::deselectAll() {
1445 select.x = -1; 1445 select.x = -1;
1446 if (selectEnd < selectStart) return; 1446 if (selectEnd < selectStart) return;
1447 1447
1448// recordReset(); 1448// recordReset();
1449 1449
1450 tagLines(selectStart,selectEnd); 1450 tagLines(selectStart,selectEnd);
1451 1451
1452 for (int z = selectStart; z <= selectEnd; z++) { 1452 for (int z = selectStart; z <= selectEnd; z++) {
1453 TextLine::Ptr textLine = getTextLine(z); 1453 TextLine::Ptr textLine = getTextLine(z);
1454 textLine->selectEol(false,0); 1454 textLine->selectEol(false,0);
1455 } 1455 }
1456 selectStart = 0xffffff; 1456 selectStart = 0xffffff;
1457 selectEnd = 0; 1457 selectEnd = 0;
1458 emit selectionChanged(); 1458 emit selectionChanged();
1459} 1459}
1460 1460
1461void KateDocument::invertSelection() { 1461void KateDocument::invertSelection() {
1462 TextLine::Ptr textLine; 1462 TextLine::Ptr textLine;
1463 1463
1464 select.x = -1; 1464 select.x = -1;
1465 1465
1466// if (selectStart != 0 || selectEnd != lastLine()) recordReset(); 1466// if (selectStart != 0 || selectEnd != lastLine()) recordReset();
1467 1467
1468 selectStart = 0; 1468 selectStart = 0;
1469 selectEnd = lastLine(); 1469 selectEnd = lastLine();
1470 1470
1471 tagLines(selectStart,selectEnd); 1471 tagLines(selectStart,selectEnd);
1472 1472
1473 for (int z = selectStart; z < selectEnd; z++) { 1473 for (int z = selectStart; z < selectEnd; z++) {
1474 textLine = getTextLine(z); 1474 textLine = getTextLine(z);
1475 textLine->toggleSelectEol(0); 1475 textLine->toggleSelectEol(0);
1476 } 1476 }
1477 textLine = getTextLine(selectEnd); 1477 textLine = getTextLine(selectEnd);
1478 textLine->toggleSelect(0,textLine->length()); 1478 textLine->toggleSelect(0,textLine->length());
1479 optimizeSelection(); 1479 optimizeSelection();
1480 emit selectionChanged(); 1480 emit selectionChanged();
1481} 1481}
1482 1482
1483void KateDocument::selectWord(PointStruc &cursor, int flags) { 1483void KateDocument::selectWord(PointStruc &cursor, int flags) {
1484 int start, end, len; 1484 int start, end, len;
1485 1485
1486 TextLine::Ptr textLine = getTextLine(cursor.y); 1486 TextLine::Ptr textLine = getTextLine(cursor.y);
1487 len = textLine->length(); 1487 len = textLine->length();
1488 start = end = cursor.x; 1488 start = end = cursor.x;
1489 while (start > 0 && m_highlight->isInWord(textLine->getChar(start - 1))) start--; 1489 while (start > 0 && m_highlight->isInWord(textLine->getChar(start - 1))) start--;
1490 while (end < len && m_highlight->isInWord(textLine->getChar(end))) end++; 1490 while (end < len && m_highlight->isInWord(textLine->getChar(end))) end++;
1491 if (end <= start) return; 1491 if (end <= start) return;
1492 if (!(flags & KateView::cfKeepSelection)) deselectAll(); 1492 if (!(flags & KateView::cfKeepSelection)) deselectAll();
1493// else recordReset(); 1493// else recordReset();
1494 1494
1495 textLine->select(true, start, end); 1495 textLine->select(true, start, end);
1496 1496
1497 anchor.x = start; 1497 anchor.x = start;
1498 select.x = end; 1498 select.x = end;
1499 anchor.y = select.y = cursor.y; 1499 anchor.y = select.y = cursor.y;
1500 tagLines(cursor.y, cursor.y); 1500 tagLines(cursor.y, cursor.y);
1501 if (cursor.y < selectStart) selectStart = cursor.y; 1501 if (cursor.y < selectStart) selectStart = cursor.y;
1502 if (cursor.y > selectEnd) selectEnd = cursor.y; 1502 if (cursor.y > selectEnd) selectEnd = cursor.y;
1503 emit selectionChanged(); 1503 emit selectionChanged();
1504} 1504}
1505 1505
1506void KateDocument::selectLength(PointStruc &cursor, int length, int flags) { 1506void KateDocument::selectLength(PointStruc &cursor, int length, int flags) {
1507 int start, end; 1507 int start, end;
1508 1508
1509 TextLine::Ptr textLine = getTextLine(cursor.y); 1509 TextLine::Ptr textLine = getTextLine(cursor.y);
1510 start = cursor.x; 1510 start = cursor.x;
1511 end = start + length; 1511 end = start + length;
1512 if (end <= start) return; 1512 if (end <= start) return;
1513 if (!(flags & KateView::cfKeepSelection)) deselectAll(); 1513 if (!(flags & KateView::cfKeepSelection)) deselectAll();
1514 1514
1515 textLine->select(true, start, end); 1515 textLine->select(true, start, end);
1516 1516
1517 anchor.x = start; 1517 anchor.x = start;
1518 select.x = end; 1518 select.x = end;
1519 anchor.y = select.y = cursor.y; 1519 anchor.y = select.y = cursor.y;
1520 tagLines(cursor.y, cursor.y); 1520 tagLines(cursor.y, cursor.y);
1521 if (cursor.y < selectStart) selectStart = cursor.y; 1521 if (cursor.y < selectStart) selectStart = cursor.y;
1522 if (cursor.y > selectEnd) selectEnd = cursor.y; 1522 if (cursor.y > selectEnd) selectEnd = cursor.y;
1523 emit selectionChanged(); 1523 emit selectionChanged();
1524} 1524}
1525 1525
1526void KateDocument::doIndent(VConfig &c, int change) { 1526void KateDocument::doIndent(VConfig &c, int change) {
1527 1527
1528 c.cursor.x = 0; 1528 c.cursor.x = 0;
1529 1529
1530 recordStart(c, (change < 0) ? KateActionGroup::ugUnindent 1530 recordStart(c, (change < 0) ? KateActionGroup::ugUnindent
1531 : KateActionGroup::ugIndent); 1531 : KateActionGroup::ugIndent);
1532 1532
1533 if (selectEnd < selectStart) { 1533 if (selectEnd < selectStart) {
1534 // single line 1534 // single line
1535 optimizeLeadingSpace(c.cursor.y, c.flags, change); 1535 optimizeLeadingSpace(c.cursor.y, c.flags, change);
1536 } else { 1536 } else {
1537 // entire selection 1537 // entire selection
1538 TextLine::Ptr textLine; 1538 TextLine::Ptr textLine;
1539 int line, z; 1539 int line, z;
1540 QChar ch; 1540 QChar ch;
1541 1541
1542 if (c.flags & KateView::cfKeepIndentProfile && change < 0) { 1542 if (c.flags & KateView::cfKeepIndentProfile && change < 0) {
1543 // unindent so that the existing indent profile doesn´t get screwed 1543 // unindent so that the existing indent profile doesn´t get screwed
1544 // if any line we may unindent is already full left, don't do anything 1544 // if any line we may unindent is already full left, don't do anything
1545 for (line = selectStart; line <= selectEnd; line++) { 1545 for (line = selectStart; line <= selectEnd; line++) {
1546 textLine = getTextLine(line); 1546 textLine = getTextLine(line);
1547 if (textLine->isSelected() || textLine->numSelected()) { 1547 if (textLine->isSelected() || textLine->numSelected()) {
1548 for (z = 0; z < tabChars; z++) { 1548 for (z = 0; z < tabChars; z++) {
1549 ch = textLine->getChar(z); 1549 ch = textLine->getChar(z);
1550 if (ch == '\t') break; 1550 if (ch == '\t') break;
1551 if (ch != ' ') { 1551 if (ch != ' ') {
1552 change = 0; 1552 change = 0;
1553 goto jumpOut; 1553 goto jumpOut;
1554 } 1554 }
1555 } 1555 }
1556 } 1556 }
1557 } 1557 }
1558 jumpOut:; 1558 jumpOut:;
1559 } 1559 }
1560 1560
1561 for (line = selectStart; line <= selectEnd; line++) { 1561 for (line = selectStart; line <= selectEnd; line++) {
1562 textLine = getTextLine(line); 1562 textLine = getTextLine(line);
1563 if (textLine->isSelected() || textLine->numSelected()) { 1563 if (textLine->isSelected() || textLine->numSelected()) {
1564 optimizeLeadingSpace(line, c.flags, change); 1564 optimizeLeadingSpace(line, c.flags, change);
1565 } 1565 }
1566 } 1566 }
1567 } 1567 }
1568 // recordEnd now removes empty undo records 1568 // recordEnd now removes empty undo records
1569 recordEnd(c.view, c.cursor, c.flags | KateView::cfPersistent); 1569 recordEnd(c.view, c.cursor, c.flags | KateView::cfPersistent);
1570} 1570}
1571 1571
1572/* 1572/*
1573 Optimize the leading whitespace for a single line. 1573 Optimize the leading whitespace for a single line.
1574 If change is > 0, it adds indentation units (tabChars) 1574 If change is > 0, it adds indentation units (tabChars)
1575 if change is == 0, it only optimizes 1575 if change is == 0, it only optimizes
1576 If change is < 0, it removes indentation units 1576 If change is < 0, it removes indentation units
1577 This will be used to indent, unindent, and optimal-fill a line. 1577 This will be used to indent, unindent, and optimal-fill a line.
1578 If excess space is removed depends on the flag cfKeepExtraSpaces 1578 If excess space is removed depends on the flag cfKeepExtraSpaces
1579 which has to be set by the user 1579 which has to be set by the user
1580*/ 1580*/
1581void KateDocument::optimizeLeadingSpace(int line, int flags, int change) { 1581void KateDocument::optimizeLeadingSpace(int line, int flags, int change) {
1582 int len; 1582 int len;
1583 int chars, space, okLen; 1583 int chars, space, okLen;
1584 QChar ch; 1584 QChar ch;
1585 int extra; 1585 int extra;
1586 QString s; 1586 QString s;
1587 PointStruc cursor; 1587 PointStruc cursor;
1588 1588
1589 TextLine::Ptr textLine = getTextLine(line); 1589 TextLine::Ptr textLine = getTextLine(line);
1590 len = textLine->length(); 1590 len = textLine->length();
1591 space = 0; // length of space at the beginning of the textline 1591 space = 0; // length of space at the beginning of the textline
1592 okLen = 0; // length of space which does not have to be replaced 1592 okLen = 0; // length of space which does not have to be replaced
1593 for (chars = 0; chars < len; chars++) { 1593 for (chars = 0; chars < len; chars++) {
1594 ch = textLine->getChar(chars); 1594 ch = textLine->getChar(chars);
1595 if (ch == ' ') { 1595 if (ch == ' ') {
1596 space++; 1596 space++;
1597 if (flags & KateView::cfSpaceIndent && okLen == chars) okLen++; 1597 if (flags & KateView::cfSpaceIndent && okLen == chars) okLen++;
1598 } else if (ch == '\t') { 1598 } else if (ch == '\t') {
1599 space += tabChars - space % tabChars; 1599 space += tabChars - space % tabChars;
1600 if (!(flags & KateView::cfSpaceIndent) && okLen == chars) okLen++; 1600 if (!(flags & KateView::cfSpaceIndent) && okLen == chars) okLen++;
1601 } else break; 1601 } else break;
1602 } 1602 }
1603 1603
1604 space += change*tabChars; // modify space width 1604 space += change*tabChars; // modify space width
1605 // if line contains only spaces it will be cleared 1605 // if line contains only spaces it will be cleared
1606 if (space < 0 || chars == len) space = 0; 1606 if (space < 0 || chars == len) space = 0;
1607 1607
1608 extra = space % tabChars; // extra spaces which don´t fit the indentation pattern 1608 extra = space % tabChars; // extra spaces which don´t fit the indentation pattern
1609 if (flags & KateView::cfKeepExtraSpaces) chars -= extra; 1609 if (flags & KateView::cfKeepExtraSpaces) chars -= extra;
1610 1610
1611 if (flags & KateView::cfSpaceIndent) { 1611 if (flags & KateView::cfSpaceIndent) {
1612 space -= extra; 1612 space -= extra;
1613 ch = ' '; 1613 ch = ' ';
1614 } else { 1614 } else {
1615 space /= tabChars; 1615 space /= tabChars;
1616 ch = '\t'; 1616 ch = '\t';
1617 } 1617 }
1618 1618
1619 // don´t replace chars which are already ok 1619 // don´t replace chars which are already ok
1620 cursor.x = QMIN(okLen, QMIN(chars, space)); 1620 cursor.x = QMIN(okLen, QMIN(chars, space));
1621 chars -= cursor.x; 1621 chars -= cursor.x;
1622 space -= cursor.x; 1622 space -= cursor.x;
1623 if (chars == 0 && space == 0) return; //nothing to do 1623 if (chars == 0 && space == 0) return; //nothing to do
1624 1624
1625 s.fill(ch, space); 1625 s.fill(ch, space);
1626 1626
1627//printf("chars %d insert %d cursor.x %d\n", chars, insert, cursor.x); 1627//printf("chars %d insert %d cursor.x %d\n", chars, insert, cursor.x);
1628 cursor.y = line; 1628 cursor.y = line;
1629 recordReplace(cursor, chars, s); 1629 recordReplace(cursor, chars, s);
1630} 1630}
1631 1631
1632void KateDocument::doComment(VConfig &c, int change) 1632void KateDocument::doComment(VConfig &c, int change)
1633{ 1633{
1634 c.flags |=KateView:: cfPersistent; 1634 c.flags |=KateView:: cfPersistent;
1635 1635
1636 recordStart(c, (change < 0) ? KateActionGroup::ugUncomment 1636 recordStart(c, (change < 0) ? KateActionGroup::ugUncomment
1637 : KateActionGroup::ugComment); 1637 : KateActionGroup::ugComment);
1638 1638
1639 QString startComment = m_highlight->getCommentStart(); 1639 QString startComment = m_highlight->getCommentStart();
1640 QString startLineComment = m_highlight->getCommentSingleLineStart(); 1640 QString startLineComment = m_highlight->getCommentSingleLineStart();
1641 QString endComment = m_highlight->getCommentEnd(); 1641 QString endComment = m_highlight->getCommentEnd();
1642 1642
1643 int startCommentLen = startComment.length(); 1643 int startCommentLen = startComment.length();
1644 int startLineCommentLen = startLineComment.length(); 1644 int startLineCommentLen = startLineComment.length();
1645 int endCommentLen = endComment.length(); 1645 int endCommentLen = endComment.length();
1646 1646
1647 if (change > 0) 1647 if (change > 0)
1648 { 1648 {
1649 if ( !hasMarkedText() ) 1649 if ( !hasMarkedText() )
1650 { 1650 {
1651 if (startLineComment != "") 1651 if (startLineComment != "")
1652 { 1652 {
1653 // Add a start comment mark 1653 // Add a start comment mark
1654 c.cursor.x = 0; 1654 c.cursor.x = 0;
1655 recordReplace(c.cursor, 0, startLineComment); 1655 recordReplace(c.cursor, 0, startLineComment);
1656 } 1656 }
1657 else if ((startComment != "") && (endComment != "")) 1657 else if ((startComment != "") && (endComment != ""))
1658 { 1658 {
1659 // Add a start comment mark 1659 // Add a start comment mark
1660 c.cursor.x = 0; 1660 c.cursor.x = 0;
1661 recordReplace(c.cursor, 0, startComment); 1661 recordReplace(c.cursor, 0, startComment);
1662 1662
1663 // Add an end comment mark 1663 // Add an end comment mark
1664 TextLine* textline = getTextLine(c.cursor.y); 1664 TextLine* textline = getTextLine(c.cursor.y);
1665 c.cursor.x = textline->length(); 1665 c.cursor.x = textline->length();
1666 recordReplace(c.cursor, 0, endComment); 1666 recordReplace(c.cursor, 0, endComment);
1667 c.cursor.x = 0; 1667 c.cursor.x = 0;
1668 } 1668 }
1669 } 1669 }
1670 else if ((startComment != "") && (endComment != "")) 1670 else if ((startComment != "") && (endComment != ""))
1671 { 1671 {
1672 QString marked (c.view->markedText ()); 1672 QString marked (c.view->markedText ());
1673 int preDeleteLine = -1, preDeleteCol = -1; 1673 int preDeleteLine = -1, preDeleteCol = -1;
1674 c.view->getCursorPosition (&preDeleteLine, &preDeleteCol); 1674 c.view->getCursorPosition (&preDeleteLine, &preDeleteCol);
1675 1675
1676 if (marked.length() > 0) 1676 if (marked.length() > 0)
1677 c.view->keyDelete (); 1677 c.view->keyDelete ();
1678 1678
1679 int line = -1, col = -1; 1679 int line = -1, col = -1;
1680 c.view->getCursorPosition (&line, &col); 1680 c.view->getCursorPosition (&line, &col);
1681 1681
1682 c.view->insertText (startComment + marked + endComment); 1682 c.view->insertText (startComment + marked + endComment);
1683 } 1683 }
1684 } 1684 }
1685 else 1685 else
1686 { 1686 {
1687 if ( !hasMarkedText() ) 1687 if ( !hasMarkedText() )
1688 { 1688 {
1689 TextLine* textline = getTextLine(c.cursor.y); 1689 TextLine* textline = getTextLine(c.cursor.y);
1690 1690
1691 if(textline->startingWith(startLineComment)) 1691 if(textline->startingWith(startLineComment))
1692 { 1692 {
1693 // Remove start comment mark 1693 // Remove start comment mark
1694 c.cursor.x = 0; 1694 c.cursor.x = 0;
1695 recordReplace(c.cursor, startLineCommentLen, ""); 1695 recordReplace(c.cursor, startLineCommentLen, "");
1696 } 1696 }
1697 else if (textline->startingWith(startComment) && textline->endingWith(endComment)) 1697 else if (textline->startingWith(startComment) && textline->endingWith(endComment))
1698 { 1698 {
1699 // Remove start comment mark 1699 // Remove start comment mark
1700 c.cursor.x = 0; 1700 c.cursor.x = 0;
1701 recordReplace(c.cursor, startCommentLen, ""); 1701 recordReplace(c.cursor, startCommentLen, "");
1702 1702
1703 // Remove end comment mark 1703 // Remove end comment mark
1704 if(endComment != "") 1704 if(endComment != "")
1705 { 1705 {
1706 c.cursor.x = textline->length() - endCommentLen; 1706 c.cursor.x = textline->length() - endCommentLen;
1707 recordReplace(c.cursor, endCommentLen, ""); 1707 recordReplace(c.cursor, endCommentLen, "");
1708 c.cursor.x = 0; 1708 c.cursor.x = 0;
1709 } 1709 }
1710 } 1710 }
1711 } 1711 }
1712 else 1712 else
1713 { 1713 {
1714 QString marked (c.view->markedText ()); 1714 QString marked (c.view->markedText ());
1715 int preDeleteLine = -1, preDeleteCol = -1; 1715 int preDeleteLine = -1, preDeleteCol = -1;
1716 c.view->getCursorPosition (&preDeleteLine, &preDeleteCol); 1716 c.view->getCursorPosition (&preDeleteLine, &preDeleteCol);
1717 1717
1718 int start = marked.find (startComment); 1718 int start = marked.find (startComment);
1719 int end = marked.findRev (endComment); 1719 int end = marked.findRev (endComment);
1720 1720
1721 if ((start > -1) && (end > -1)) 1721 if ((start > -1) && (end > -1))
1722 { 1722 {
1723 marked.remove (start, startCommentLen); 1723 marked.remove (start, startCommentLen);
1724 marked.remove (end-startCommentLen, endCommentLen); 1724 marked.remove (end-startCommentLen, endCommentLen);
1725 1725
1726 c.view->keyDelete (); 1726 c.view->keyDelete ();
1727 1727
1728 int line = -1, col = -1; 1728 int line = -1, col = -1;
1729 c.view->getCursorPosition (&line, &col); 1729 c.view->getCursorPosition (&line, &col);
1730 c.view->insertText (marked); 1730 c.view->insertText (marked);
1731 } 1731 }
1732 } 1732 }
1733 } 1733 }
1734 1734
1735 recordEnd(c.view, c.cursor, c.flags | KateView::cfPersistent); 1735 recordEnd(c.view, c.cursor, c.flags | KateView::cfPersistent);
1736} 1736}
1737 1737
1738 1738
1739QString KateDocument::text() const 1739QString KateDocument::text() const
1740{ 1740{
1741 QString s; 1741 QString s;
1742 1742
1743 for (int i=0; i < buffer->count(); i++) 1743 for (int i=0; i < buffer->count(); i++)
1744 { 1744 {
1745 TextLine::Ptr textLine = buffer->line(i); 1745 TextLine::Ptr textLine = buffer->line(i);
1746 s.insert(s.length(), textLine->getText(), textLine->length()); 1746 s.insert(s.length(), textLine->getText(), textLine->length());
1747 if ( (i < (buffer->count()-1)) ) 1747 if ( (i < (buffer->count()-1)) )
1748 s.append('\n'); 1748 s.append('\n');
1749 } 1749 }
1750 1750
1751 return s; 1751 return s;
1752} 1752}
1753 1753
1754QString KateDocument::getWord(PointStruc &cursor) { 1754QString KateDocument::getWord(PointStruc &cursor) {
1755 int start, end, len; 1755 int start, end, len;
1756 1756
1757 TextLine::Ptr textLine = getTextLine(cursor.y); 1757 TextLine::Ptr textLine = getTextLine(cursor.y);
1758 len = textLine->length(); 1758 len = textLine->length();
1759 start = end = cursor.x; 1759 start = end = cursor.x;
1760 while (start > 0 && m_highlight->isInWord(textLine->getChar(start - 1))) start--; 1760 while (start > 0 && m_highlight->isInWord(textLine->getChar(start - 1))) start--;
1761 while (end < len && m_highlight->isInWord(textLine->getChar(end))) end++; 1761 while (end < len && m_highlight->isInWord(textLine->getChar(end))) end++;
1762 len = end - start; 1762 len = end - start;
1763 return QString(&textLine->getText()[start], len); 1763 return QString(&textLine->getText()[start], len);
1764} 1764}
1765 1765
1766void KateDocument::setText(const QString &s) { 1766void KateDocument::setText(const QString &s) {
1767 int pos; 1767 int pos;
1768 QChar ch; 1768 QChar ch;
1769 1769
1770 clear(); 1770 clear();
1771 1771
1772 int line=1; 1772 int line=1;
1773 1773
1774 TextLine::Ptr textLine = buffer->line(0); 1774 TextLine::Ptr textLine = buffer->line(0);
1775 for (pos = 0; pos <= (int) s.length(); pos++) { 1775 for (pos = 0; pos <= (int) s.length(); pos++) {
1776 ch = s[pos]; 1776 ch = s[pos];
1777 if (ch.isPrint() || ch == '\t') { 1777 if (ch.isPrint() || ch == '\t') {
1778 textLine->append(&ch, 1); 1778 textLine->append(&ch, 1);
1779 } else if (ch == '\n') 1779 } else if (ch == '\n')
1780 { 1780 {
1781 textLine = new TextLine(); 1781 textLine = new TextLine();
1782 buffer->insertLine (line, textLine); 1782 buffer->insertLine (line, textLine);
1783 line++; 1783 line++;
1784 } 1784 }
1785 } 1785 }
1786 updateLines(); 1786 updateLines();
1787} 1787}
1788 1788
1789 1789
1790QString KateDocument::markedText(int flags) { 1790QString KateDocument::markedText(int flags) {
1791 TextLine::Ptr textLine; 1791 TextLine::Ptr textLine;
1792 int len, z, start, end, i; 1792 int len, z, start, end, i;
1793 1793
1794 len = 1; 1794 len = 1;
1795 if (!(flags & KateView::cfVerticalSelect)) { 1795 if (!(flags & KateView::cfVerticalSelect)) {
1796 for (z = selectStart; z <= selectEnd; z++) { 1796 for (z = selectStart; z <= selectEnd; z++) {
1797 textLine = getTextLine(z); 1797 textLine = getTextLine(z);
1798 len += textLine->numSelected(); 1798 len += textLine->numSelected();
1799 if (textLine->isSelected()) len++; 1799 if (textLine->isSelected()) len++;
1800 } 1800 }
1801 QString s; 1801 QString s;
1802 len = 0; 1802 len = 0;
1803 for (z = selectStart; z <= selectEnd; z++) { 1803 for (z = selectStart; z <= selectEnd; z++) {
1804 textLine = getTextLine(z); 1804 textLine = getTextLine(z);
1805 end = 0; 1805 end = 0;
1806 do { 1806 do {
1807 start = textLine->findUnselected(end); 1807 start = textLine->findUnselected(end);
1808 end = textLine->findSelected(start); 1808 end = textLine->findSelected(start);
1809 for (i = start; i < end; i++) { 1809 for (i = start; i < end; i++) {
1810 s[len] = textLine->getChar(i); 1810 s[len] = textLine->getChar(i);
1811 len++; 1811 len++;
1812 } 1812 }
1813 } while (start < end); 1813 } while (start < end);
1814 if (textLine->isSelected()) { 1814 if (textLine->isSelected()) {
1815 s[len] = '\n'; 1815 s[len] = '\n';
1816 len++; 1816 len++;
1817 } 1817 }
1818 } 1818 }
1819// s[len] = '\0'; 1819// s[len] = '\0';
1820 return s; 1820 return s;
1821 } else { 1821 } else {
1822 for (z = selectStart; z <= selectEnd; z++) { 1822 for (z = selectStart; z <= selectEnd; z++) {
1823 textLine = getTextLine(z); 1823 textLine = getTextLine(z);
1824 len += textLine->numSelected() + 1; 1824 len += textLine->numSelected() + 1;
1825 } 1825 }
1826 QString s; 1826 QString s;
1827 len = 0; 1827 len = 0;
1828 for (z = selectStart; z <= selectEnd; z++) { 1828 for (z = selectStart; z <= selectEnd; z++) {
1829 textLine = getTextLine(z); 1829 textLine = getTextLine(z);
1830 end = 0; 1830 end = 0;
1831 do { 1831 do {
1832 start = textLine->findUnselected(end); 1832 start = textLine->findUnselected(end);
1833 end = textLine->findSelected(start); 1833 end = textLine->findSelected(start);
1834 for (i = start; i < end; i++) { 1834 for (i = start; i < end; i++) {
1835 s[len] = textLine->getChar(i); 1835 s[len] = textLine->getChar(i);
1836 len++; 1836 len++;
1837 } 1837 }
1838 } while (start < end); 1838 } while (start < end);
1839 s[len] = '\n'; 1839 s[len] = '\n';
1840 len++; 1840 len++;
1841 } 1841 }
1842// s[len] = '\0'; // the final \0 is not counted in length() 1842// s[len] = '\0'; // the final \0 is not counted in length()
1843 return s; 1843 return s;
1844 } 1844 }
1845} 1845}
1846 1846
1847void KateDocument::delMarkedText(VConfig &c/*, bool undo*/) { 1847void KateDocument::delMarkedText(VConfig &c/*, bool undo*/) {
1848 int end = 0; 1848 int end = 0;
1849 1849
1850 if (selectEnd < selectStart) return; 1850 if (selectEnd < selectStart) return;
1851 1851
1852 // the caller may have already started an undo record for the current action 1852 // the caller may have already started an undo record for the current action
1853// if (undo) 1853// if (undo)
1854 1854
1855 //auto deletion of the marked text occurs not very often and can therefore 1855 //auto deletion of the marked text occurs not very often and can therefore
1856 // be recorded separately 1856 // be recorded separately
1857 recordStart(c, KateActionGroup::ugDelBlock); 1857 recordStart(c, KateActionGroup::ugDelBlock);
1858 1858
1859 for (c.cursor.y = selectEnd; c.cursor.y >= selectStart; c.cursor.y--) { 1859 for (c.cursor.y = selectEnd; c.cursor.y >= selectStart; c.cursor.y--) {
1860 TextLine::Ptr textLine = getTextLine(c.cursor.y); 1860 TextLine::Ptr textLine = getTextLine(c.cursor.y);
1861 1861
1862 c.cursor.x = textLine->length(); 1862 c.cursor.x = textLine->length();
1863 do { 1863 do {
1864 end = textLine->findRevUnselected(c.cursor.x); 1864 end = textLine->findRevUnselected(c.cursor.x);
1865 if (end == 0) break; 1865 if (end == 0) break;
1866 c.cursor.x = textLine->findRevSelected(end); 1866 c.cursor.x = textLine->findRevSelected(end);
1867 recordDelete(c.cursor, end - c.cursor.x); 1867 recordDelete(c.cursor, end - c.cursor.x);
1868 } while (true); 1868 } while (true);
1869 end = c.cursor.x; 1869 end = c.cursor.x;
1870 c.cursor.x = textLine->length(); 1870 c.cursor.x = textLine->length();
1871 if (textLine->isSelected()) recordAction(KateAction::delLine,c.cursor); 1871 if (textLine->isSelected()) recordAction(KateAction::delLine,c.cursor);
1872 } 1872 }
1873 c.cursor.y++; 1873 c.cursor.y++;
1874 /*if (end < c.cursor.x)*/ c.cursor.x = end; 1874 /*if (end < c.cursor.x)*/ c.cursor.x = end;
1875 1875
1876 selectEnd = -1; 1876 selectEnd = -1;
1877 select.x = -1; 1877 select.x = -1;
1878 1878
1879 /*if (undo)*/ recordEnd(c); 1879 /*if (undo)*/ recordEnd(c);
1880} 1880}
1881 1881
1882void KateDocument::tagLineRange(int line, int x1, int x2) { 1882void KateDocument::tagLineRange(int line, int x1, int x2) {
1883 int z; 1883 int z;
1884 1884
1885 for (z = 0; z < (int) views.count(); z++) { 1885 for (z = 0; z < (int) views.count(); z++) {
1886 views.at(z)->tagLines(line, line, x1, x2); 1886 views.at(z)->tagLines(line, line, x1, x2);
1887 } 1887 }
1888} 1888}
1889 1889
1890void KateDocument::tagLines(int start, int end) { 1890void KateDocument::tagLines(int start, int end) {
1891 int z; 1891 int z;
1892 1892
1893 for (z = 0; z < (int) views.count(); z++) { 1893 for (z = 0; z < (int) views.count(); z++) {
1894 views.at(z)->tagLines(start, end, 0, 0xffffff); 1894 views.at(z)->tagLines(start, end, 0, 0xffffff);
1895 } 1895 }
1896} 1896}
1897 1897
1898void KateDocument::tagAll() { 1898void KateDocument::tagAll() {
1899 int z; 1899 int z;
1900 1900
1901 for (z = 0; z < (int) views.count(); z++) { 1901 for (z = 0; z < (int) views.count(); z++) {
1902 views.at(z)->tagAll(); 1902 views.at(z)->tagAll();
1903 } 1903 }
1904} 1904}
1905 1905
1906void KateDocument::updateLines(int startLine, int endLine, int flags, int cursorY) { 1906void KateDocument::updateLines(int startLine, int endLine, int flags, int cursorY) {
1907 TextLine::Ptr textLine; 1907 TextLine::Ptr textLine;
1908 int line, last_line; 1908 int line, last_line;
1909 int ctxNum, endCtx; 1909 int ctxNum, endCtx;
1910// kdDebug(13020)<<"******************KateDocument::updateLines Checkpoint 1"<<endl; 1910// kdDebug(13020)<<"******************KateDocument::updateLines Checkpoint 1"<<endl;
1911 if (buffer->line(startLine)==0) {kdDebug(13020)<<"********************No buffer for line " << startLine << " found**************"<<endl; return;}; 1911 if (buffer->line(startLine)==0) {kdDebug(13020)<<"********************No buffer for line " << startLine << " found**************"<<endl; return;};
1912// kdDebug(13020)<<"KateDocument::updateLines Checkpoint 2"<<endl; 1912// kdDebug(13020)<<"KateDocument::updateLines Checkpoint 2"<<endl;
1913 last_line = lastLine(); 1913 last_line = lastLine();
1914// if (endLine >= last_line) endLine = last_line; 1914// if (endLine >= last_line) endLine = last_line;
1915 1915
1916 line = startLine; 1916 line = startLine;
1917 ctxNum = 0; 1917 ctxNum = 0;
1918 if (line > 0) ctxNum = getTextLine(line - 1)->getContext(); 1918 if (line > 0) ctxNum = getTextLine(line - 1)->getContext();
1919 do { 1919 do {
1920// kdDebug(13020)<<QString("**************Working on line: %1").arg(line)<<endl; 1920// kdDebug(13020)<<QString("**************Working on line: %1").arg(line)<<endl;
1921 textLine = getTextLine(line); 1921 textLine = getTextLine(line);
1922 if (textLine==0) kdDebug(13020)<<"****updateLines()>> error textLine==0"<<endl; 1922 if (textLine==0) kdDebug(13020)<<"****updateLines()>> error textLine==0"<<endl;
1923 if (line <= endLine && line != cursorY) { 1923 if (line <= endLine && line != cursorY) {
1924 if (flags & KateView::cfRemoveSpaces) textLine->removeSpaces(); 1924 if (flags & KateView::cfRemoveSpaces) textLine->removeSpaces();
1925 updateMaxLength(textLine); 1925 updateMaxLength(textLine);
1926 } 1926 }
1927 endCtx = textLine->getContext(); 1927 endCtx = textLine->getContext();
1928 qDebug("DOHIGHLIGHT"); 1928 qDebug("DOHIGHLIGHT");
1929 ctxNum = m_highlight->doHighlight(ctxNum,textLine); 1929 ctxNum = m_highlight->doHighlight(ctxNum,textLine);
1930 textLine->setContext(ctxNum); 1930 textLine->setContext(ctxNum);
1931 line++; 1931 line++;
1932 } while ((buffer->line(line)!=0) && (line <= endLine || endCtx != ctxNum)); 1932 } while ((buffer->line(line)!=0) && (line <= endLine || endCtx != ctxNum));