]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/ctrlcmn.cpp
Fix wxWrapSizer minimal size calculation.
[wxWidgets.git] / src / common / ctrlcmn.cpp
index e4e636b8860bf61165830fbdf7cf8cf8c952ab6c..c1b4fa67a7e915c439adff0f1569738d53122ac5 100644 (file)
@@ -303,15 +303,34 @@ wxString wxControlBase::DoEllipsizeSingleLine(const wxString& curLine, const wxD
                 // - the second one to remove, valid range [initialCharToRemove;endCharToRemove]
                 // - the third one to preserve, valid range [endCharToRemove+1;len-1] or the empty range if endCharToRemove==len-1
                 // NOTE: empty range != range [0;0] since the range [0;0] contains 1 character (the zero-th one)!
-                initialCharToRemove = len/2;
-                size_t endCharToRemove = len/2;     // index of the last character to remove; valid range is [0;len-1]
+                initialCharToRemove = len/2; // index of the last character to remove; valid range is [0;len-1]
+                size_t endCharToRemove = initialCharToRemove - 1; // initial removal range is empty
 
                 int removedPx = 0;
+                bool removeFromStart = true;
                 for ( ; removedPx < excessPx; )
                 {
-                    // try to remove the last character of the first part of the string
-                    if (initialCharToRemove > 0)
+                    const bool canRemoveFromStart = initialCharToRemove > 0;
+                    const bool canRemoveFromEnd = endCharToRemove < len - 1;
+
+                    if ( !canRemoveFromStart && !canRemoveFromEnd )
+                    {
+                        // we need to remove all the characters of the string!
+                        break;
+                    }
+
+                    // Remove from the beginning in even steps and from the end
+                    // in odd steps, unless we exhausted one side already:
+                    removeFromStart = !removeFromStart;
+                    if ( removeFromStart && !canRemoveFromStart )
+                        removeFromStart = false;
+                    else if ( !removeFromStart && !canRemoveFromEnd )
+                        removeFromStart = true;
+
+                    if ( removeFromStart )
                     {
+                        // try to remove the last character of the first part of the string
+
                         // width of the (initialCharToRemove-1)-th character
                         int widthPx;
                         if (initialCharToRemove >= 2)
@@ -325,12 +344,13 @@ wxString wxControlBase::DoEllipsizeSingleLine(const wxString& curLine, const wxD
                         // mark the (initialCharToRemove-1)-th character as removable
                         initialCharToRemove--;
                         removedPx += widthPx;
-                    }
 
-                    // try to remove the first character of the last part of the string
-                    if (endCharToRemove < len - 1 &&
-                        removedPx < excessPx)
+                        continue; // don't remove anything else
+                    }
+                    else // !removeFromStart
                     {
+                        // try to remove the first character of the last part of the string
+
                         // width of the (endCharToRemove+1)-th character
                         int widthPx = charOffsetsPx[endCharToRemove+1] -
                                       charOffsetsPx[endCharToRemove];
@@ -340,12 +360,8 @@ wxString wxControlBase::DoEllipsizeSingleLine(const wxString& curLine, const wxD
                         // mark the (endCharToRemove+1)-th character as removable
                         endCharToRemove++;
                         removedPx += widthPx;
-                    }
 
-                    if (initialCharToRemove == 0 && endCharToRemove == len-1)
-                    {
-                        // we need to remove all the characters of the string!
-                        break;
+                        continue; // don't remove anything else
                     }
                 }