From 69d85497fd4aca0c7b200ab6faea27c28d8e35b1 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Sat, 4 May 2013 21:17:47 -0400 Subject: [PATCH] Fix update issues in BStringColumn. In some cases, BStringColumn wouldn't properly detect that an update was needed, and would consequently fail to truncate a string as needed with a column resize. --- headers/private/interface/ColumnTypes.h | 7 ++++--- src/kits/interface/ColumnTypes.cpp | 24 ++++++++++++++++++------ 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/headers/private/interface/ColumnTypes.h b/headers/private/interface/ColumnTypes.h index c9fc5882df..6e581fd7ba 100644 --- a/headers/private/interface/ColumnTypes.h +++ b/headers/private/interface/ColumnTypes.h @@ -60,10 +60,11 @@ class BStringField : public BField void SetString (const char* string); const char* String () const; void SetClippedString (const char* string); + bool HasClippedString () const; const char* ClippedString (); void SetWidth (float); float Width (); - + private: float fWidth; BString fString; @@ -109,7 +110,7 @@ class BDateField : public BField time_t Seconds (); time_t UnixTime (); - private: + private: struct tm fTime; time_t fUnixTime; time_t fSeconds; @@ -235,7 +236,7 @@ class BBitmapColumn : public BTitledColumn virtual int CompareFields (BField* field1, BField* field2); virtual bool AcceptsField (const BField* field) const; }; - + //===================================================================== // Column to display BIntegerField objects as a graph. diff --git a/src/kits/interface/ColumnTypes.cpp b/src/kits/interface/ColumnTypes.cpp index 432476f23e..65ffb99746 100644 --- a/src/kits/interface/ColumnTypes.cpp +++ b/src/kits/interface/ColumnTypes.cpp @@ -159,6 +159,13 @@ BStringField::SetClippedString(const char* val) } +bool +BStringField::HasClippedString() const +{ + return !fClippedString.IsEmpty(); +} + + const char* BStringField::ClippedString() { @@ -182,17 +189,22 @@ BStringColumn::DrawField(BField* _field, BRect rect, BView* parent) { float width = rect.Width() - (2 * kTEXT_MARGIN); BStringField* field = static_cast(_field); - bool clipNeeded = width < field->Width(); + float fieldWidth = field->Width(); + bool updateNeeded = width != fieldWidth; - if (clipNeeded) { + if (updateNeeded) { BString out_string(field->String()); - - parent->TruncateString(&out_string, fTruncate, width + 2); - field->SetClippedString(out_string.String()); + float preferredWidth = parent->StringWidth(out_string.String()); + if (width < preferredWidth) { + parent->TruncateString(&out_string, fTruncate, width + 2); + field->SetClippedString(out_string.String()); + } else + field->SetClippedString(""); field->SetWidth(width); } - DrawString(clipNeeded ? field->ClippedString() : field->String(), parent, rect); + DrawString(field->HasClippedString() ? field->ClippedString() + : field->String(), parent, rect); }