[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: koffice/kspread
From: Robert Knight <robertknight () gmail ! com>
Date: 2006-01-31 23:13:57
Message-ID: 1138749237.956931.12767.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 504407 by knight:
Fix crash when entering invalid cell or range references into formula editor.
M +27 -7 kspread_editors.cc
M +22 -0 kspread_util.cc
M +7 -1 kspread_util.h
M +3 -2 region.h
M +21 -0 selection.cc
--- trunk/koffice/kspread/kspread_editors.cc #504406:504407
@@ -36,6 +36,7 @@
#include <qtimer.h>
#include <qlabel.h>
#include <qvbox.h>
+#include <qvaluelist.h>
#include <private/qrichtext_p.h>
//#include <klineedit.h>
@@ -116,6 +117,8 @@
QFont editorFont = textEdit()->currentFont();
QFont font;
+ uint oldRangeCount = d->rangeCount;
+
d->rangeCount = 0;
QValueList<QColor> colors = d->canvas->choice()->colors();
for (uint i = 0; i < d->tokens.count(); ++i)
@@ -166,6 +169,10 @@
break;
}
}
+
+ if (oldRangeCount != d->rangeCount)
+ d->rangeChanged = true;
+
return 0;
}
@@ -656,7 +663,6 @@
bool lastWasASemicolon = false;
d->currentToken = 0;
uint rangeCount = d->highlighter->rangeCount();
- int rangeCountDiff = rangeCount - d->rangeCount;
d->rangeCount = rangeCount;
Token token;
@@ -726,7 +732,7 @@
// triggered by keyboard action?
if (!d->updatingChoice)
{
- if (rangeCountDiff != 0 || d->highlighter->rangeChanged())
+ if (d->highlighter->rangeChanged())
{
d->highlighter->resetRangeChanged();
@@ -738,17 +744,31 @@
d->canvas->choice()->clear();
Region tmpRegion;
Region::ConstIterator it;
+
+ //A list of regions which have already been highlighted on the spreadsheet.
+ //This is so that we don't end up highlighting the same region twice in two \
different + //colours.
+ QValueList<Region> alreadyUsedRegions;
+
for (uint i = 0; i < tokens.count(); ++i)
{
Token token = tokens[i];
Token::Type type = token.type();
if (type == Token::Cell || type == Token::Range)
{
- it = Region(d->canvas->view(), token.text()).constBegin();
- if (d->canvas->choice()->isEmpty())
- d->canvas->choice()->initialize((*it)->rect(), (*it)->sheet());
- else
- d->canvas->choice()->extend((*it)->rect(), (*it)->sheet());
+ Region region(d->canvas->view(), token.text());
+ it = region.constBegin();
+
+ //if (!alreadyUsedRegions.contains(region))
+ {
+
+ if (d->canvas->choice()->isEmpty())
+ d->canvas->choice()->initialize((*it)->rect(), (*it)->sheet());
+ else
+ d->canvas->choice()->extend((*it)->rect(), (*it)->sheet());
+
+ alreadyUsedRegions.append(region);
+ }
}
}
--- trunk/koffice/kspread/kspread_util.cc #504406:504407
@@ -350,6 +350,28 @@
_pos = QPoint( x, y );
}
+bool util_isPointValid( QPoint point )
+{
+ if ( point.x() >= 0
+ && point.y() >= 0
+ && point.x() <= KS_colMax
+ && point.y() <= KS_rowMax
+ )
+ return true;
+ else
+ return false;
+}
+
+bool util_isRectValid( QRect rect )
+{
+ if ( util_isPointValid( rect.topLeft() )
+ && util_isPointValid( rect.bottomRight() )
+ )
+ return true;
+ else
+ return false;
+}
+
Point::Point( const QString & str, Map * map,
Sheet * sheet )
{
--- trunk/koffice/kspread/kspread_util.h #504406:504407
@@ -36,6 +36,9 @@
class KLocale;
+bool util_isPointValid(QPoint point);
+bool util_isRectValid(QRect rect);
+
namespace KSpread
{
class Cell;
@@ -61,7 +64,7 @@
_rowFixed = c._rowFixed;
}
- bool isValid() const { return ( _pos.x() >= 0 && ( _sheet != 0 || \
_sheetName.isEmpty() ) ); } + bool isValid() const { return ( \
util_isPointValid(pos()) && ( _sheet != 0 || _sheetName.isEmpty() ) ); } bool \
isSheetKnown() const { return ( ! _sheetName.isEmpty() && _sheet != 0 ); }
Cell* cell() const;
@@ -104,6 +107,7 @@
*/
void setRowFixed(bool rowFixed);
bool rowFixed() const;
+
private:
Sheet* _sheet;
@@ -298,6 +302,8 @@
bool util_isRowSelected(const QRect &selection);
bool util_isRowOrColumnSelected( const QRect &selection );
+
+
bool util_validateSheetName(const QString &name);
QDomElement util_createElement( const QString & tagName, const QFont & font, \
QDomDocument & doc );
--- trunk/koffice/kspread/region.h #504406:504407
@@ -29,6 +29,7 @@
#include <koffice_export.h>
#include "kspread_global.h"
+#include "kspread_util.h"
namespace KSpread
{
@@ -358,7 +359,7 @@
virtual ~Point();
virtual Type type() const { return Element::Point; }
- virtual bool isValid() const { return !m_point.isNull(); }
+ virtual bool isValid() const { return (!m_point.isNull() && \
util_isPointValid(pos())); } virtual bool isColumn() const { return false; }
virtual bool isRow() const { return false; }
@@ -398,7 +399,7 @@
virtual ~Range();
virtual Type type() const { return Element::Range; }
- virtual bool isValid() const { return !m_range.isNull(); }
+ virtual bool isValid() const { return !m_range.isNull() && \
util_isRectValid(rect()); } virtual bool isColumn() const { return \
(m_range.normalize().top() == 1 && m_range.normalize().bottom() == KS_rowMax); } \
virtual bool isRow() const { return (m_range.normalize().left() == 1 && \
m_range.normalize().right() == KS_colMax); }
--- trunk/koffice/kspread/selection.cc #504406:504407
@@ -28,6 +28,7 @@
#include "kspread_editors.h"
#include "kspread_sheet.h"
#include "kspread_view.h"
+#include "kspread_util.h"
#include "selection.h"
@@ -111,6 +112,9 @@
void Selection::initialize(const QPoint& point, Sheet* sheet)
{
+ if (!util_isPointValid(point))
+ return;
+
if (!sheet)
{
if (d->sheet)
@@ -173,6 +177,9 @@
void Selection::initialize(const QRect& range, Sheet* sheet)
{
+ if (!util_isRectValid(range) || ( range == QRect(0,0,1,1) ))
+ return;
+
if (!sheet)
{
if (d->sheet)
@@ -215,6 +222,8 @@
// if the range was inserted
clearSubRegion();
}
+
+
Element* element = *(cells().begin() += d->activeSubRegionStart);
// we end up with one element in the subregion
d->activeSubRegionLength = 1;
@@ -242,6 +251,9 @@
void Selection::initialize(const Region& region, Sheet* sheet)
{
+ if (!region.isValid())
+ return;
+
if (!sheet)
{
if (d->sheet)
@@ -417,6 +429,9 @@
void Selection::extend(const QPoint& point, Sheet* sheet)
{
+ if (!util_isPointValid(point))
+ return;
+
if (!sheet)
{
if (d->sheet)
@@ -463,6 +478,9 @@
void Selection::extend(const QRect& range, Sheet* sheet)
{
+ if (!util_isRectValid(range))
+ return;
+
if (!sheet)
{
if (d->sheet)
@@ -525,6 +543,9 @@
void Selection::extend(const Region& region)
{
+ if (!region.isValid())
+ return;
+
uint count = cells().count();
ConstIterator end(region.constEnd());
for (ConstIterator it = region.constBegin(); it != end; ++it)
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic