]> git.saurik.com Git - wxWidgets.git/blobdiff - user/wxLayout/wxllist.cpp
Added wxFrame::OnCreateStatusBar and ToolBar
[wxWidgets.git] / user / wxLayout / wxllist.cpp
index 925fad2d926bdc8466c681b3e4ed69b9f11398d5..529807c1c201274a319d683c17687d060c8077f2 100644 (file)
 #pragma implementation "wxllist.h"
 #endif
 
+// these two lines are for use in M:
+//#include "Mpch.h"
+//#include "gui/wxllist.h"
+
 #include   "wxllist.h"
-#include   "iostream"
 
-#define   VAR(x)   cerr << #x"=" << x << endl;
-#define   DBG_POINT(p)   cerr << #p << ": " << p.x << ',' << p.y << endl
-#define   TRACE(f)   cerr << #f":" << endl;
+#ifndef USE_PCH
+#  include   "iostream.h"
+
+#  include   <wx/dc.h>
+#  include   <wx/postscrp.h>
+#  include   <wx/print.h>
+#endif
 
-#ifdef WXDEBUG
+#define   BASELINESTRETCH   12
+
+#ifdef WXLAYOUT_DEBUG
 static const char *_t[] = { "invalid", "text", "cmd", "icon",
-                             "linebreak"};
+                            "linebreak"};
 
 void
 wxLayoutObjectBase::Debug(void)
@@ -40,11 +49,19 @@ wxLayoutObjectBase::Debug(void)
    cerr << _t[GetType()] << ": size=" << GetSize(&bl).x << ","
         << GetSize(&bl).y << " bl=" << bl; 
 }
+
+#  define   WXL_VAR(x)   cerr << #x"=" << x << endl;
+#  define   WXL_DBG_POINT(p)   cerr << #p << ": " << p.x << ',' << p.y << endl
+#  define   WXL_TRACE(f)   cerr << #f":" << endl;
+#else 
+#  define   WXL_VAR(x)   
+#  define   WXL_DBG_POINT(p)   
+#  define   WXL_TRACE(f)   
 #endif
 
 //-------------------------- wxLayoutObjectText
 
-wxLayoutObjectText::wxLayoutObjectText(const wxString &txt)
+wxLayoutObjectText::wxLayoutObjectText(const String &txt)
 {
    m_Text = txt;
    m_Width = 0;
@@ -61,23 +78,23 @@ wxLayoutObjectText::GetSize(CoordType *baseLine) const
 
 void
 wxLayoutObjectText::Draw(wxDC &dc, wxPoint position, CoordType baseLine,
-                    bool draw)
+                         bool draw)
 {
    long descent = 0l;
-   dc.GetTextExtent(m_Text,&m_Width, &m_Height, &descent);
+   dc.GetTextExtent(Str(m_Text),&m_Width, &m_Height, &descent);
    //FIXME: wxGTK does not set descent to a descent value yet.
    if(descent == 0)
       descent = (2*m_Height)/10;  // crude fix
    m_BaseLine = m_Height - descent;
    position.y += baseLine-m_BaseLine;
    if(draw)
-      dc.DrawText(m_Text,position.x,position.y);
-#   ifdef   WXDEBUG
+      dc.DrawText(Str(m_Text),position.x,position.y);
+#   ifdef   WXLAYOUT_DEBUG
 //   dc.DrawRectangle(position.x, position.y, m_Width, m_Height);
 #   endif
 }
 
-#ifdef WXDEBUG
+#ifdef WXLAYOUT_DEBUG
 void
 wxLayoutObjectText::Debug(void)
 {
@@ -89,13 +106,13 @@ wxLayoutObjectText::Debug(void)
 //-------------------------- wxLayoutObjectIcon
 
 wxLayoutObjectIcon::wxLayoutObjectIcon(wxIcon *icon)
+                  : m_Icon(icon)
 {
-   m_Icon = icon;
 }
 
 void
 wxLayoutObjectIcon::Draw(wxDC &dc, wxPoint position, CoordType baseLine,
-                    bool draw)
+                         bool draw)
 {
    position.y += baseLine - m_Icon->GetHeight();
    if(draw)
@@ -114,8 +131,8 @@ wxLayoutObjectIcon::GetSize(CoordType *baseLine) const
 
 
 wxLayoutObjectCmd::wxLayoutObjectCmd(int size, int family, int style, int
-                           weight, bool underline,
-                           wxColour const *fg, wxColour const *bg)
+                                     weight, bool underline,
+                                     wxColour const *fg, wxColour const *bg)
    
 {
    m_font = new wxFont(size,family,style,weight,underline);
@@ -152,7 +169,7 @@ wxLayoutObjectCmd::GetStyle(void) const
 
 void
 wxLayoutObjectCmd::Draw(wxDC &dc, wxPoint position, CoordType lineHeight,
-                   bool draw)
+                        bool draw)
 {
    wxASSERT(m_font);
    // this get called even when draw==false, so that recalculation
@@ -168,11 +185,14 @@ wxLayoutObjectCmd::Draw(wxDC &dc, wxPoint position, CoordType lineHeight,
 
 wxLayoutList::wxLayoutList()
 {
+   m_DefaultSetting = NULL;
    Clear();
 }
 
 wxLayoutList::~wxLayoutList()
 {
+   if(m_DefaultSetting)
+      delete m_DefaultSetting;
 }
 
 
@@ -192,14 +212,14 @@ wxLayoutList::SetFont(int family, int size, int style, int weight,
    if(size != -1)      m_FontPtSize = size;
    if(style != -1)     m_FontStyle = style;
    if(weight != -1)    m_FontWeight = weight;
-   if(underline != -1) m_FontUnderline = underline;
+   if(underline != -1) m_FontUnderline = underline != 0;
 
    if(fg != NULL)     m_ColourFG = fg;
    if(bg != NULL)     m_ColourBG = bg;
    
    Insert(
       new wxLayoutObjectCmd(m_FontPtSize,m_FontFamily,m_FontStyle,m_FontWeight,m_FontUnderline,
-                       m_ColourFG, m_ColourBG));
+                            m_ColourFG, m_ColourBG));
 }
 
 void
@@ -250,8 +270,11 @@ wxLayoutList::Draw(wxDC &dc, bool findObject, wxPoint const &findCoords)
    wxPoint position = wxPoint(0,0);
    wxPoint position_HeadOfLine;
    CoordType baseLine = m_FontPtSize;
-   CoordType baseLineSkip = (12 * baseLine)/10;
+   CoordType baseLineSkip = (BASELINESTRETCH * baseLine)/10;
 
+   // where to draw the cursor
+   wxPoint cursorPosition, cursorSize;
+   
    // we trace the objects' cursor positions so we can draw the cursor
    wxPoint cursor = wxPoint(0,0);
    // the cursor position inside the object
@@ -264,7 +287,44 @@ wxLayoutList::Draw(wxDC &dc, bool findObject, wxPoint const &findCoords)
    CoordType     objBaseLine = baseLine;
    wxLayoutObjectType type;
 
-   VAR(findObject); VAR(findCoords.x); VAR(findCoords.y);
+   // used temporarily
+   wxLayoutObjectText *tobj = NULL;
+
+
+   // this is needed for printing to a printer:
+   // only interesting for printer/PS output
+   int pageWidth, pageHeight;   //GetSize() still needs int at the moment
+   struct
+   {
+      int top, bottom, left, right;
+   } margins;
+
+   if(
+#ifdef __WXMSW__
+      dc.IsKindOf(CLASSINFO(wxPrinterDC)) ||
+#endif
+      dc.IsKindOf(CLASSINFO(wxPostScriptDC)))
+   {
+      WXL_VAR(wxThePrintSetupData);
+      
+      dc.GetSize(&pageWidth, &pageHeight);
+      dc.StartDoc(_("Printing..."));
+      dc.StartPage();
+      margins.top = (1*pageHeight)/10;    // 10%
+      margins.bottom = (9*pageHeight)/10; // 90%
+      margins.left = (1*pageWidth)/10;
+      margins.right = (9*pageWidth)/10;
+   }
+   else
+   {
+      margins.top = 0; margins.left = 0;
+      margins.right = -1;
+      margins.bottom = -1;
+   }
+   position.y = margins.right;
+   position.x = margins.left;
+   
+   WXL_VAR(findObject); WXL_VAR(findCoords.x); WXL_VAR(findCoords.y);
    // if the cursorobject is a cmd, we need to find the first
    // printable object:
    while(cursorObject != end()
@@ -276,8 +336,15 @@ wxLayoutList::Draw(wxDC &dc, bool findObject, wxPoint const &findCoords)
 
    // setting up the default:
    dc.SetTextForeground( *wxBLACK );
+   dc.SetTextBackground( *wxWHITE );
+   dc.SetBackgroundMode( wxSOLID ); // to enable setting of text background
    dc.SetFont( *wxNORMAL_FONT );
 
+
+   //FIXME: who frees the brush, how long does it need to exist?
+   if(m_DefaultSetting)
+      m_DefaultSetting->Draw(dc,wxPoint(0,0),0,true);
+
    // we calculate everything for drawing a line, then rewind to the
    // begin of line and actually draw it
    i = begin();
@@ -311,39 +378,42 @@ wxLayoutList::Draw(wxDC &dc, bool findObject, wxPoint const &findCoords)
          if(type == WXLO_TYPE_TEXT) // special treatment
          {
             long descent = 0l; long width, height;
-            wxLayoutObjectText *tobj = (wxLayoutObjectText *)*i;
-            wxString  str = tobj->GetText();
-            VAR(m_CursorPosition.x); VAR(cursor.x);
+            tobj = (wxLayoutObjectText *)*i;
+            String  str = tobj->GetText();
+            WXL_VAR(m_CursorPosition.x); WXL_VAR(cursor.x);
             str = str.substr(0, cursorOffset);
-            VAR(str);
-            dc.GetTextExtent(str, &width,&height, &descent);
-            VAR(height);
-            VAR(width); VAR(descent);
-            dc.DrawLine(position.x+width,
-                        position.y+(baseLineSkip-height),
-                        position.x+width, position.y+baseLineSkip);
+            WXL_VAR(str);
+            dc.GetTextExtent(Str(str), &width,&height, &descent);
+            WXL_VAR(height);
+            WXL_VAR(width);
+            WXL_VAR(descent);
+            cursorPosition = wxPoint(position.x+width,
+                                      position.y+(baseLineSkip-height));
+            cursorSize = wxPoint(1, height);
+            //dc.DrawLine(position.x+width,
+            //            position.y+(baseLineSkip-height),
+            //            position.x+width, position.y+baseLineSkip);
          }
          else
          {
             if(type == WXLO_TYPE_LINEBREAK)
-                dc.DrawLine(0, position.y+baseLineSkip, 0, position.y+2*baseLineSkip);
+               //dc.DrawLine(0, position.y+baseLineSkip, 0,               position.y+2*baseLineSkip);
+            {
+               cursorPosition = wxPoint(0, position.y);
+               cursorSize = wxPoint(1,baseLineSkip);
+            }
             else
             {
-               if(size.x == 0)
-               {
-                  if(size.y == 0)
-                     dc.DrawLine(position.x, position.y, position.x, position.y+baseLineSkip);
-                  else
-                     dc.DrawLine(position.x, position.y, position.x, position.y+size.y);
-               }
-               else
-                  dc.DrawRectangle(position.x, position.y, size.x, size.y);
+               cursorPosition = wxPoint(position.x, position.y);
+               cursorSize = wxPoint(size.x > 0 ? size.x : 1,size.y > 0 ? size.y : baseLineSkip);
             }
          }
       }
 
       // calculate next object's position:
       position.x += size.x;
+      if(position.x > m_MaxX)
+         m_MaxX = position.x;
       
       // do we need to increase the line's height?
       if(size.y > baseLineSkip)
@@ -368,7 +438,16 @@ wxLayoutList::Draw(wxDC &dc, bool findObject, wxPoint const &findCoords)
          }
 
          if(! draw) // finished calculating sizes
-         {  // do this line again, this time drawing it
+         {
+            // if the this line needs to go onto a new page, we need
+            // to change pages before drawing it:
+            if(margins.bottom != -1 && position.y > margins.bottom)
+            {
+               dc.EndPage();
+               position_HeadOfLine.y = margins.top;
+               dc.StartPage();
+            }
+            // do this line again, this time drawing it
             position = position_HeadOfLine;
             draw = true;
             i = headOfLine;
@@ -378,26 +457,32 @@ wxLayoutList::Draw(wxDC &dc, bool findObject, wxPoint const &findCoords)
             draw = false;
       }
 
-      if(position.x+size.x > m_MaxX)
-         m_MaxX = position.x+size.x;
       // is it a linebreak?
       if(type == WXLO_TYPE_LINEBREAK || i == tail())
       {
-         position.x = 0;
+         position.x = margins.left;
          position.y += baseLineSkip;
          baseLine = m_FontPtSize;
-         baseLineSkip = (12 * baseLine)/10;
+         objBaseLine = baseLine; // not all objects set it
+         baseLineSkip = (BASELINESTRETCH * baseLine)/10;
          headOfLine = i;
          headOfLine++;
          position_HeadOfLine = position;
       }
       i++;
    }
+   dc.EndDoc();
+   // draw the cursor
+   if(m_Editable)
+   {
+      dc.DrawRectangle(cursorPosition.x, cursorPosition.y,
+                       cursorSize.x, cursorSize.y);
+   }
    m_MaxY = position.y;
    return foundObject;
 }
 
-#ifdef WXDEBUG
+#ifdef WXLAYOUT_DEBUG
 void
 wxLayoutList::Debug(void)
 {
@@ -440,51 +525,83 @@ wxLayoutList::Debug(void)
 
 /******************** editing stuff ********************/
 
+// don't change this, I know how to optimise this and will do it real 
+// soon (KB)
+
+/*
+ * FindObjectCursor:
+ * Finds the object belonging to a given cursor position cpos and
+ * returns an iterator to that object and stores the relative cursor
+ * position in offset.
+ *
+ * For linebreaks, the offset can be 0=before or 1=after.
+ *
+ * If the cpos coordinates don't exist, they are modified.
+ */
+
 wxLayoutObjectList::iterator 
-wxLayoutList::FindObjectCursor(wxPoint const &cpos, CoordType *offset)
+wxLayoutList::FindObjectCursor(wxPoint *cpos, CoordType *offset)
 {
-   wxPoint cursor = wxPoint(0,0);  // runs along the objects
+   wxPoint object = wxPoint(0,0);  // runs along the objects
    CoordType width;
    wxLayoutObjectList::iterator i;
 
-#ifdef WXDEBUG
-   cerr << "Looking for object at " << cpos.x << ',' << cpos.y <<
+#ifdef WXLAYOUT_DEBUG
+   cerr << "Looking for object at " << cpos->x << ',' << cpos->y <<
       endl;
 #endif
-   for(i = begin(); i != end() && cursor.y <= cpos.y; i++)
+   for(i = begin(); i != end() && object.y <= cpos->y; i++)
    {
-      width = 0;
-      if((*i)->GetType() == WXLO_TYPE_LINEBREAK)
+      width = (**i).CountPositions();
+      if(cpos->y == object.y) // a possible candidate
       {
-         if(cpos.y == cursor.y)
+         if((**i).GetType() ==WXLO_TYPE_LINEBREAK)
          {
-            --i;
-            if(offset)
-               *offset = (*i)->CountPositions();
+            if(cpos->x == object.x)
+            {
+               *offset = 0;
+               return i;
+            }
+            *offset=1;
+            cpos->x = object.x;
+            return i;
+         }
+         if(cpos->x >= object.x && cpos->x <= object.x+width) // overlap
+         {
+            if(offset) *offset = cpos->x-object.x;
+#ifdef WXLAYOUT_DEBUG
+            cerr << "   found object at " << object.x << ',' <<
+               object.y << ", type:" << _t[(*i)->GetType()] <<endl;
+#endif      
             return i;
          }
-         cursor.x = 0; cursor.y ++;
       }
-      else
-         cursor.x += (width = (*i)->CountPositions());
-      if(cursor.y == cpos.y && (cursor.x > cpos.x ||
-                                ((*i)->GetType() != WXLO_TYPE_CMD && cursor.x == cpos.x))
-         ) // found it ?   
+      // no overlap, increment coordinates
+      object.x += width;
+      if((**i).GetType() == WXLO_TYPE_LINEBREAK)
       {
-         if(offset)
-            *offset = cpos.x-(cursor.x-width);  // 0==cursor before
-         // the object
-#ifdef WXDEBUG
-         cerr << "   found object at " << cursor.x-width << ',' <<
-            cursor.y << ", type:" << _t[(*i)->GetType()] <<endl;
-#endif   
-         return i;
+         object.x = 0;
+         object.y++;
       }
    }
-#ifdef WXDEBUG
+#ifdef WXLAYOUT_DEBUG
    cerr << "   not found" << endl;
 #endif
-   return end(); // not found
+   // return last object, coordinates of that one:
+   i = tail();
+   if(i == end())
+      return i;
+   if((**i).GetType()==WXLO_TYPE_LINEBREAK)
+   {
+      if(offset)
+         *offset = (cpos->x > object.x) ? 1 : 0;
+      return i;
+   }
+   cpos->x = object.x; // would be the coordinate of next object
+   cpos->y = object.y;
+   cpos->x += width; // last object's width
+   if(*offset)  *offset = cpos->x-object.x;
+   return i; // not found
 }
 
 wxLayoutObjectList::iterator 
@@ -492,7 +609,7 @@ wxLayoutList::FindCurrentObject(CoordType *offset)
 {
    wxLayoutObjectList::iterator obj = end();
 
-   obj = FindObjectCursor(m_CursorPosition, offset);
+   obj = FindObjectCursor(&m_CursorPosition, offset);
    if(obj == end())  // not ideal yet
    {
       obj = tail();
@@ -569,7 +686,7 @@ wxLayoutList::MoveCursor(int dx, int dy)
    if(m_CursorPosition.x > lineLength)
       m_CursorPosition.x = lineLength;
       
-#ifdef   WXDEBUG
+#ifdef   WXLAYOUT_DEBUG
    i = FindCurrentObject(&offs);
    cerr << "Cursor: "
         << m_CursorPosition.x << ','
@@ -594,68 +711,71 @@ wxLayoutList::MoveCursor(int dx, int dy)
 void
 wxLayoutList::Delete(CoordType count)
 {
-   TRACE(Delete);
+   WXL_TRACE(Delete);
 
    if(!m_Editable)
       return;
 
-   VAR(count);
+   WXL_VAR(count);
 
-   CoordType offs, len;
+   CoordType offs;
    wxLayoutObjectList::iterator i;
       
    do
    {
       i  = FindCurrentObject(&offs);
+   startover: // ugly, but easiest way to do it
       if(i == end())
-         return;
-#ifdef WXDEBUG
-      cerr << "trying to delete: " << _t[(*i)->GetType()] << endl;
-#endif
+         return; // we cannot delete anything more
+
+      /* Here we need to treat linebreaks differently.
+         If offs==0 we are before the linebreak, otherwise behind.  */
       if((*i)->GetType() == WXLO_TYPE_LINEBREAK)
-         m_MaxLine--;
-      if((*i)->GetType() == WXLO_TYPE_TEXT)
+      {
+         if(offs == 0)
+         {
+            m_MaxLine--;
+            erase(i);
+            count--;
+            continue; // we're done
+         }
+         else // delete the object behind the linebreak
+         {
+            i++; // we increment and continue as normal
+            offs=0;
+            goto startover; 
+         }
+      }
+      else if((*i)->GetType() == WXLO_TYPE_TEXT)
       {
          wxLayoutObjectText *tobj = (wxLayoutObjectText *)*i;
-         len = tobj->CountPositions();
+         CoordType len = tobj->CountPositions();
          // If we find the end of a text object, this means that we
          // have to delete from the object following it.
-         if(offs == len)
+         if(len == offs)
          {
             i++;
-            if((*i)->GetType() == WXLO_TYPE_TEXT)
-            {
-               offs = 0;  // delete from begin of next string
-               tobj = (wxLayoutObjectText *)*i;
-               len = tobj->CountPositions();
-            }
-            else
-            {
-               erase(i);
-               return;
-            }
+            offs = 0;
+            goto startover;
          }
-         if(len <= count) // delete this object
+         else if(len <= count) // delete this object
          {
             count -= len;
             erase(i);
+            continue; 
          }
          else
          {
             len = count;
-            VAR(offs); VAR(len);
             tobj->GetText().erase(offs,len);
             return; // we are done
          }
       }
-      else // delete the object
+      else // all other objects: delete the object
       {
-         len = (*i)->CountPositions();
+         CoordType len = (*i)->CountPositions();
          erase(i); // after this, i is the iterator for the following object
-         if(count > len)
-            count -= len;
-         else
-            count = 0;
+         count = count > len ? count -= len : 0;
       }
    }
    while(count && i != end());      
@@ -668,46 +788,48 @@ wxLayoutList::Insert(wxLayoutObjectBase *obj)
    CoordType offs;
    wxLayoutObjectList::iterator i = FindCurrentObject(&offs);
 
-   TRACE(Insert(obj));
+   WXL_TRACE(Insert(obj));
 
    if(i == end())
       push_back(obj);
-   else
-   {      
-      // do we have to split a text object?
-      if((*i)->GetType() == WXLO_TYPE_TEXT && offs != 0 && offs != (*i)->CountPositions())
-      {
-         wxLayoutObjectText *tobj = (wxLayoutObjectText *) *i;
-#ifdef WXDEBUG
-         cerr << "text: '" << tobj->GetText() << "'" << endl;
-         VAR(offs);
+   else if(offs == 0)
+      insert(i,obj);
+   // do we have to split a text object?
+   else if((*i)->GetType() == WXLO_TYPE_TEXT && offs != (*i)->CountPositions())
+   {
+      wxLayoutObjectText *tobj = (wxLayoutObjectText *) *i;
+#ifdef WXLAYOUT_DEBUG
+      cerr << "text: '" << tobj->GetText() << "'" << endl;
+      WXL_VAR(offs);
 #endif
-         wxString left = tobj->GetText().substr(0,offs); // get part before cursor
-         VAR(left);
-         tobj->GetText() = tobj->GetText().substr(offs,(*i)->CountPositions()-offs); // keeps the right half
-         VAR(tobj->GetText());
-         insert(i,obj);
-         insert(i,new wxLayoutObjectText(left)); // inserts before
-      }
+      String left = tobj->GetText().substr(0,offs); // get part before cursor
+      WXL_VAR(left);
+      tobj->GetText() = tobj->GetText().substr(offs,(*i)->CountPositions()-offs); // keeps the right half
+      WXL_VAR(tobj->GetText());
+      insert(i,obj);
+      insert(i,new wxLayoutObjectText(left)); // inserts before
+   }
+   else
+   {
+     // all other cases, append after object:
+      wxLayoutObjectList::iterator j = i; // we want to apend after this object
+      j++;
+      if(j != end())
+         insert(j, obj);
       else
-      {
-         wxLayoutObjectList::iterator j = i; // we want to apend after this object
-         j++;
-         if(j != end())
-            insert(j, obj);
-         else
-            push_back(obj);
-      }  
+         push_back(obj);
    }
+   
    m_CursorPosition.x += obj->CountPositions();
    if(obj->GetType() == WXLO_TYPE_LINEBREAK)
       m_MaxLine++;
 }
 
 void
-wxLayoutList::Insert(wxString const &text)
+wxLayoutList::Insert(String const &text)
 {
-   TRACE(Insert(text));
+   wxLayoutObjectText *tobj = NULL;
+   WXL_TRACE(Insert(text));
 
    if(! m_Editable)
       return;
@@ -717,24 +839,25 @@ wxLayoutList::Insert(wxString const &text)
 
    if(i != end() && (*i)->GetType() == WXLO_TYPE_TEXT)
    {  // insert into an existing text object:
-      TRACE(inserting into existing object);
-      wxLayoutObjectText *tobj = (wxLayoutObjectText *)*i;
+      WXL_TRACE(inserting into existing object);
+      tobj = (wxLayoutObjectText *)*i ;
+      wxASSERT(tobj);
       tobj->GetText().insert(offs,text);
    }
-   else
+   else      // check whether the previous object is text:
    {
-      // check whether the previous object is text:
       wxLayoutObjectList::iterator j = i;
       j--;
-      TRACE(checking previous object);
+      WXL_TRACE(checking previous object);
       if(0 && j != end() && (*j)->GetType() == WXLO_TYPE_TEXT)
       {
-         wxLayoutObjectText *tobj = (wxLayoutObjectText *)*i;
+         tobj = (wxLayoutObjectText *)*i;
+         wxASSERT(tobj);
          tobj->GetText()+=text;
       }
       else  // insert a new text object
       {
-         TRACE(creating new object);
+         WXL_TRACE(creating new object);
          Insert(new wxLayoutObjectText(text));  //FIXME not too optimal, slow
          return;  // position gets incremented in Insert(obj)
       }
@@ -765,7 +888,8 @@ wxLayoutList::GetLineLength(wxLayoutObjectList::iterator i)
 }
 
 void
-wxLayoutList::Clear(void)
+wxLayoutList::Clear(int family, int size, int style, int weight,
+                    int underline, char const *fg, char const *bg)
 {
    wxLayoutObjectList::iterator i = begin();
 
@@ -773,17 +897,28 @@ wxLayoutList::Clear(void)
       erase(i);
 
    // set defaults
-   m_FontPtSize = 12;
+   m_FontPtSize = size;
    m_FontUnderline = false;
-   m_FontFamily = wxDEFAULT;
-   m_FontStyle = wxNORMAL;
-   m_FontWeight = wxNORMAL;
-   m_ColourFG = wxTheColourDatabase->FindColour("BLACK");
-   m_ColourBG = wxTheColourDatabase->FindColour("WHITE");
-
+   m_FontFamily = family;
+   m_FontStyle = style;
+   m_FontWeight = weight;
+   m_ColourFG = wxTheColourDatabase->FindColour(fg);
+   m_ColourBG = wxTheColourDatabase->FindColour(bg);
+
+   if(! m_ColourFG) m_ColourFG = wxBLACK;
+   if(! m_ColourBG) m_ColourBG = wxWHITE;
+   
    m_Position = wxPoint(0,0);
    m_CursorPosition = wxPoint(0,0);
    m_MaxLine = 0;
-   m_LineHeight = (12*m_FontPtSize)/10;
+   m_LineHeight = (BASELINESTRETCH*m_FontPtSize)/10;
    m_MaxX = 0; m_MaxY = 0;
+
+   
+   if(m_DefaultSetting)
+      delete m_DefaultSetting;
+   m_DefaultSetting = new
+      wxLayoutObjectCmd(m_FontPtSize,m_FontFamily,m_FontStyle,
+                        m_FontWeight,m_FontUnderline,
+                        m_ColourFG, m_ColourBG);
 }