]> git.saurik.com Git - wxWidgets.git/blobdiff - user/wxLayout/wxllist.cpp
Fixes and more functionality.
[wxWidgets.git] / user / wxLayout / wxllist.cpp
index 246fbb98e19970a3cd6ba73c2247252831180e2f..5357810c50b822d588a8099b01e3bc7e958ad392 100644 (file)
@@ -72,6 +72,7 @@ bool operator !=(wxPoint const &p1, wxPoint const &p2)
    return p1.x != p2.x || p1.y != p2.y;
 }
 
+
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 
 
    wxLayoutObjectText
@@ -87,6 +88,17 @@ wxLayoutObjectText::wxLayoutObjectText(const wxString &txt)
    m_Bottom = 0;
 }
 
+wxLayoutObject *
+wxLayoutObjectText::Copy(void)
+{
+   wxLayoutObjectText *obj = new wxLayoutObjectText(m_Text);
+   obj->m_Width = m_Width;
+   obj->m_Height = m_Height;
+   obj->m_Top = m_Top;
+   obj->m_Bottom = m_Bottom;
+   obj->SetUserData(m_UserData);
+   return obj;
+}
 
 wxPoint
 wxLayoutObjectText::GetSize(CoordType *top, CoordType *bottom) const
@@ -157,6 +169,15 @@ wxLayoutObjectIcon::wxLayoutObjectIcon(wxBitmap const &icon)
    m_Icon = new wxBitmap(icon);
 }
 
+wxLayoutObject *
+wxLayoutObjectIcon::Copy(void)
+{
+   wxLayoutObjectIcon *obj = new wxLayoutObjectIcon(new
+                                                    wxBitmap(*m_Icon));
+   obj->SetUserData(m_UserData);
+   return obj;
+}
+
 wxLayoutObjectIcon::wxLayoutObjectIcon(wxBitmap *icon)
 {
    m_Icon = icon;
@@ -199,6 +220,20 @@ wxLayoutObjectCmd::wxLayoutObjectCmd(int size, int family, int style, int
    m_ColourBG = bg;
 }
 
+wxLayoutObject *
+wxLayoutObjectCmd::Copy(void)
+{
+   wxLayoutStyleInfo si;
+   GetStyle(&si);
+   
+   wxLayoutObjectCmd *obj = new wxLayoutObjectCmd(
+      si.size, si.family, si.style, si.weight, si.underline,
+      m_ColourFG, m_ColourBG);
+   obj->SetUserData(m_UserData);
+   return obj;
+}
+
+
 wxLayoutObjectCmd::~wxLayoutObjectCmd()
 {
    delete m_font;
@@ -787,15 +822,38 @@ wxLayoutLine::GetWrapPosition(CoordType column)
                column--;
             }
          }while(offset != -1);
+         i--;  // move on to previous object
       }
       else
+      {
          column -= (**i).GetLength();
-      // This is both "else" and what has to be done after checking
-      // all positions of the text object:
-      i--;
-      offset = (**i).GetLength();
+         i--;
+      }
+      if( i != NULLIT)
+         offset = (**i).GetLength();
    }while(i != NULLIT);
-   return -1;
+   /* If we reached the begin of the list and have more than one
+      object, that one is longer than the margin, so break behind
+      it. */
+   CoordType pos = 0;
+   i = m_ObjectList.begin();
+   while(i != NULLIT && (**i).GetType() != WXLO_TYPE_TEXT)
+   {
+      pos += (**i).GetLength();
+      i++;
+   }
+   if(i == NULLIT) return -1;  //why should this happen?
+   pos += (**i).GetLength();
+   i++;
+   while(i != NULLIT && (**i).GetType() != WXLO_TYPE_TEXT)
+   {
+            pos += (**i).GetLength();
+            i++;
+   }
+   if(i == NULLIT) return -1;  //this is possible, if there is only one text object
+   // now we are at the second text object:
+   pos -= (**i).GetLength();
+   return pos; // in front of it
 }
    
 
@@ -809,7 +867,7 @@ wxLayoutList::wxLayoutList()
 {
    m_DefaultSetting = NULL;
    m_FirstLine = NULL;
-   InternalClear();
+   Clear();
 }
 
 wxLayoutList::~wxLayoutList()
@@ -818,17 +876,11 @@ wxLayoutList::~wxLayoutList()
 }
 
 void
-wxLayoutList::InternalClear(void)
+wxLayoutList::Empty(void)
 {
    while(m_FirstLine)
       m_FirstLine = m_FirstLine->DeleteLine(false);
 
-   if(m_DefaultSetting)
-   {
-      delete m_DefaultSetting;
-      m_DefaultSetting = NULL;
-   }
-
    m_CursorPos = wxPoint(0,0);
    m_CursorScreenPos = wxPoint(0,0);
    m_CursorSize = wxPoint(0,0);
@@ -836,6 +888,18 @@ wxLayoutList::InternalClear(void)
    m_CursorLine = m_FirstLine;
 }
 
+
+void
+wxLayoutList::InternalClear(void)
+{
+   Empty();
+   if(m_DefaultSetting)
+   {
+      delete m_DefaultSetting;
+      m_DefaultSetting = NULL;
+   }
+}
+
 void
 wxLayoutList::SetFont(int family, int size, int style, int weight,
                       int underline, wxColour const *fg,
@@ -906,7 +970,7 @@ wxLayoutList::MoveCursorTo(wxPoint const &p)
 {
    wxLayoutLine *line = m_FirstLine;
    while(line && line->GetLineNumber() != p.y)
-      ;
+      line = line->GetNextLine();
    if(line && line->GetLineNumber() == p.y) // found it
    {
       m_CursorPos.y = p.y;