]> git.saurik.com Git - wxWidgets.git/blobdiff - demos/poem/wxpoem.cpp
Minor corrections to make dist after reports
[wxWidgets.git] / demos / poem / wxpoem.cpp
index 9bdca453e93ca271a0c29136ff490535ddf8809d..ed88fd646a6a8a93660ed7b2443e1eeaf710498c 100644 (file)
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifdef __GNUG__
-#pragma implementation "wxpoem.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 
 #include "wxpoem.h"
 
-#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXX11__)
 #include "corner1.xpm"
 #include "corner2.xpm"
 #include "corner3.xpm"
 #include "corner4.xpm"
-#endif
+#include "wxpoem.xpm"
 
-#define         buf_size 10000
+#define         BUFFER_SIZE 10000
 #define         DEFAULT_POETRY_DAT "wxpoem"
 #define         DEFAULT_POETRY_IND "wxpoem"
 #define         DEFAULT_CHAR_HEIGHT 18
 #define         X_SIZE 30
 #define         Y_SIZE 20
 
-static wxChar   *poem_buffer;          // Storage for each poem
+static wxChar   *poem_buffer;                   // Storage for each poem
 static wxChar   line[150];                      // Storage for a line
-static wxChar   title[150];                     // Remember the title
-static wxChar   *search_string = NULL;          // The search string
 static int      pages[30];                      // For multipage poems -
                                                 // store the start of each page
 static long     last_poem_start = 0;            // Start of last found poem
@@ -83,35 +76,17 @@ static bool     index_ok = false;               // Index loaded ok
 static bool     paging = false;                 // Are we paging?
 static int      current_page = 0;               // Currently viewed page
 
-wxIcon          *Corner1 = NULL;
-wxIcon          *Corner2 = NULL;
-wxIcon          *Corner3 = NULL;
-wxIcon          *Corner4 = NULL;
-
-// Fonts
-wxFont          *NormalFont = NULL;
-wxFont          *BoldFont = NULL;
-wxFont          *ItalicFont = NULL;
-
-// Pens
-wxPen           *GreyPen = NULL;
-wxPen           *DarkGreyPen = NULL;
-wxPen           *WhitePen = NULL;
-
 // Backing bitmap
 wxBitmap        *backingBitmap = NULL;
 
-void            PoetryError(wxChar *, wxChar *caption=_T("wxPoem Error"));
-void            PoetryNotify(wxChar *Msg, wxChar *caption=_T("wxPoem"));
+void            PoetryError(const wxChar *, const wxChar *caption=_T("wxPoem Error"));
+void            PoetryNotify(const wxChar *Msg, const wxChar *caption=_T("wxPoem"));
 void            TryLoadIndex();
 bool            LoadPoem(wxChar *, long);
 int             GetIndex();
 int             LoadIndex(wxChar *);
 bool            Compile(void);
-void            WritePreferences();
-void            ReadPreferences();
 void            FindMax(int *max_thing, int thing);
-void            CreateFonts();
 
 #if wxUSE_CLIPBOARD
     #include "wx/dataobj.h"
@@ -127,11 +102,11 @@ IMPLEMENT_APP(MyApp)
 MainWindow *TheMainWindow = NULL;
 
 // Create the fonts
-void CreateFonts()
+void MainWindow::CreateFonts()
 {
-  NormalFont = wxTheFontList->FindOrCreateFont(pointSize, wxSWISS, wxNORMAL, wxNORMAL);
-  BoldFont =   wxTheFontList->FindOrCreateFont(pointSize, wxSWISS, wxNORMAL, wxBOLD);
-  ItalicFont = wxTheFontList->FindOrCreateFont(pointSize, wxSWISS, wxITALIC, wxNORMAL);
+    m_normalFont = wxTheFontList->FindOrCreateFont(pointSize, wxSWISS, wxNORMAL, wxNORMAL);
+    m_boldFont =   wxTheFontList->FindOrCreateFont(pointSize, wxSWISS, wxNORMAL, wxBOLD);
+    m_italicFont = wxTheFontList->FindOrCreateFont(pointSize, wxSWISS, wxITALIC, wxNORMAL);
 }
 
 BEGIN_EVENT_TABLE(MainWindow, wxFrame)
@@ -141,9 +116,31 @@ BEGIN_EVENT_TABLE(MainWindow, wxFrame)
 END_EVENT_TABLE()
 
 MainWindow::MainWindow(wxFrame *frame, wxWindowID id, const wxString& title,
-   const wxPoint& pos, const wxSize& size, long style):
-  wxFrame(frame, id, title, pos, size, style)
+     const wxPoint& pos, const wxSize& size, long style):
+     wxFrame(frame, id, title, pos, size, style)
 {
+    m_corners[0] = m_corners[1] = m_corners[2] = m_corners[3] = NULL;
+
+    ReadPreferences();
+    CreateFonts();
+
+    SetIcon(wxpoem_xpm);
+
+    m_corners[0] = new wxIcon( corner1_xpm );
+    m_corners[1] = new wxIcon( corner2_xpm );
+    m_corners[2] = new wxIcon( corner3_xpm );
+    m_corners[3] = new wxIcon( corner4_xpm );
+}
+
+MainWindow::~MainWindow()
+{
+    for (int i=0;i<4;i++)
+    {
+        if(m_corners[i])
+        {
+            delete m_corners[i];
+        }
+    }
 }
 
 // Read the poetry buffer, either for finding the size
@@ -166,48 +163,51 @@ void MainWindow::ScanBuffer(wxDC *dc, bool DrawIt, int *max_x, int *max_y)
 
     if (DrawIt)
     {
-      y = (*max_y - poem_height)/2;
-      width = *max_x;
-      height = *max_y;
+        y = (*max_y - poem_height)/2;
+        width = *max_x;
+        height = *max_y;
     }
 
     if (DrawIt && wxColourDisplay())
     {
-      dc->SetBrush(*wxLIGHT_GREY_BRUSH);
-      dc->SetPen(*GreyPen);
-      dc->DrawRectangle(0, 0, width, height);
-      dc->SetBackgroundMode(wxTRANSPARENT);
+        dc->SetBrush(*wxLIGHT_GREY_BRUSH);
+        dc->SetPen(*wxGREY_PEN);
+        dc->DrawRectangle(0, 0, width, height);
+        dc->SetBackgroundMode(wxTRANSPARENT);
     }
 
     // See what ACTUAL char height is
-    dc->SetFont(* NormalFont);
-    long xx;
-    long yy;
+    if(m_normalFont)
+        dc->SetFont(*m_normalFont);
+    wxCoord xx;
+    wxCoord yy;
     dc->GetTextExtent(_T("X"), &xx, &yy);
     char_height = (int)yy;
 
     if (current_page == 0)
-      title[0] = 0;
-    else if (title[0] != 0)
     {
-       dc->SetFont(* BoldFont);
-       dc->GetTextExtent(title, &xx, &yy);
-       FindMax(&curr_width, (int)xx);
-
-       if (DrawIt)
-       {
-         int x = (width - xx)/2;
-         dc->SetFont(* BoldFont);
-
-         // Change text to BLACK!
-         dc->SetTextForeground(* wxBLACK);
-         dc->DrawText(title, x, y);
-         // Change text to WHITE!
-         dc->SetTextForeground(* wxWHITE);
-         dc->DrawText(title, x-SHADOW_OFFSET, y-SHADOW_OFFSET);
-       }
-       y += char_height;
-       y += char_height;
+        m_title = wxEmptyString;
+    }
+    else if (!m_title.empty())
+    {
+        dc->SetFont(* m_boldFont);
+        dc->GetTextExtent(m_title, &xx, &yy);
+        FindMax(&curr_width, (int)xx);
+
+        if (DrawIt)
+        {
+            int x = (width - xx)/2;
+            dc->SetFont(* m_boldFont);
+
+            // Change text to BLACK!
+            dc->SetTextForeground(* wxBLACK);
+            dc->DrawText(m_title, x, y);
+            // Change text to WHITE!
+            dc->SetTextForeground(* wxWHITE);
+            dc->DrawText(m_title, x-SHADOW_OFFSET, y-SHADOW_OFFSET);
+        }
+        y += char_height;
+        y += char_height;
     }
 
     while (ch != 0 && !page_break)
@@ -219,7 +219,7 @@ void MainWindow::ScanBuffer(wxDC *dc, bool DrawIt, int *max_x, int *max_y)
         while (((ch = poem_buffer[i]) != 10) && (ch != 0))
 #endif
         {
-            line[j] = ch;
+            line[j] = (wxChar)ch;
             j ++;
             i ++;
         }
@@ -239,85 +239,85 @@ void MainWindow::ScanBuffer(wxDC *dc, bool DrawIt, int *max_x, int *max_y)
             // If a single newline on its own, put a space in
             if (j == 0)
             {
-              line[j] = ' ';
-              j ++;
-              line[j] = 0;
+                line[j] = ' ';
+                j ++;
+                line[j] = 0;
             }
         }
 
         if (j > 0)
         {
-          line[j] = 0;
-          if (line[0] == '@')
-          {
-            switch (line[1])
+            line[j] = 0;
+            if (line[0] == '@')
             {
-              case 'P':
-                paging = true;
-                page_break = true;
-                break;
-
-              case 'T':
-                dc->SetFont(* BoldFont);
-                line_ptr = line+3;
-
-                wxStrcpy(title, line_ptr);
-                wxStrcat(title, _T(" (cont'd)"));
-
-                dc->GetTextExtent(line_ptr, &xx, &yy);
-                FindMax(&curr_width, (int)xx);
-
-                if (DrawIt)
+                switch (line[1])
                 {
-                  int x = (width - xx)/2;
-                  dc->SetFont(* BoldFont);
-
-                  // Change text to BLACK!
-                  dc->SetTextForeground(* wxBLACK);
-                  dc->DrawText(line_ptr, x, y);
-
-                  // Change text to WHITE!
-                  dc->SetTextForeground(* wxWHITE);
-                  dc->DrawText(line_ptr, x-SHADOW_OFFSET, y-SHADOW_OFFSET);
-                  dc->SetTextForeground(* wxWHITE);
+                    case 'P':
+                        paging = true;
+                        page_break = true;
+                        break;
+
+                    case 'T':
+                        dc->SetFont(* m_boldFont);
+                        line_ptr = line+3;
+
+                        m_title = line_ptr;
+                        m_title << _T(" (cont'd)");
+
+                        dc->GetTextExtent(line_ptr, &xx, &yy);
+                        FindMax(&curr_width, (int)xx);
+
+                        if (DrawIt)
+                        {
+                            int x = (width - xx)/2;
+                            dc->SetFont(* m_boldFont);
+
+                            // Change text to BLACK!
+                            dc->SetTextForeground(* wxBLACK);
+                            dc->DrawText(line_ptr, x, y);
+
+                            // Change text to WHITE!
+                            dc->SetTextForeground(* wxWHITE);
+                            dc->DrawText(line_ptr, x-SHADOW_OFFSET, y-SHADOW_OFFSET);
+                            dc->SetTextForeground(* wxWHITE);
+                        }
+                        break;
+
+                    case 'A':
+                        line_ptr = line+3;
+                        dc->SetFont(* m_italicFont);
+
+                        dc->GetTextExtent(line_ptr, &xx, &yy);
+                        FindMax(&curr_width, (int)xx);
+
+                        if (DrawIt)
+                        {
+                            int x = (width - xx)/2;
+                            dc->SetTextForeground(* wxBLACK);
+                            dc->DrawText(line_ptr, x, y);
+                        }
+                        break;
+
+                    // Default: just ignore this line
+                    default:
+                    y -= char_height;
                 }
-                break;
-
-              case 'A':
-                line_ptr = line+3;
-                dc->SetFont(* ItalicFont);
+            }
+            else
+            {
+                dc->SetFont(* m_normalFont);
 
-                dc->GetTextExtent(line_ptr, &xx, &yy);
+                dc->GetTextExtent(line, &xx, &yy);
                 FindMax(&curr_width, (int)xx);
 
                 if (DrawIt)
                 {
-                  int x = (width - xx)/2;
-                  dc->SetTextForeground(* wxBLACK);
-                  dc->DrawText(line_ptr, x, y);
+                    int x = (int)((width - xx)/2.0);
+                    dc->SetFont(* m_normalFont);
+                    dc->SetTextForeground(* wxBLACK);
+                    dc->DrawText(line, x, y);
                 }
-                break;
-
-              // Default: just ignore this line
-              default:
-                y -= char_height;
             }
-           }
-           else
-           {
-              dc->SetFont(* NormalFont);
-
-              dc->GetTextExtent(line, &xx, &yy);
-              FindMax(&curr_width, (int)xx);
-
-              if (DrawIt)
-              {
-                int x = (int)((width - xx)/2.0);
-                dc->SetFont(* NormalFont);
-                dc->SetTextForeground(* wxBLACK);
-                dc->DrawText(line, x, y);
-              }
-           }
         }
         y += char_height;
     }
@@ -325,89 +325,87 @@ void MainWindow::ScanBuffer(wxDC *dc, bool DrawIt, int *max_x, int *max_y)
     // Write (cont'd)
     if (page_break)
     {
-       wxChar *cont = _T("(cont'd)");
-
-       dc->SetFont(* NormalFont);
-
-       dc->GetTextExtent(cont, &xx, &yy);
-       FindMax(&curr_width, (int)xx);
-       if (DrawIt)
-       {
-         int x = (int)((width - xx)/2.0);
-         dc->SetFont(* NormalFont);
-         dc->SetTextForeground(* wxBLACK);
-         dc->DrawText(cont, x, y);
-       }
-       y += 2*char_height;
+        const wxChar *cont = _T("(cont'd)");
+
+        dc->SetFont(* m_normalFont);
+
+        dc->GetTextExtent(cont, &xx, &yy);
+        FindMax(&curr_width, (int)xx);
+        if (DrawIt)
+        {
+            int x = (int)((width - xx)/2.0);
+            dc->SetFont(* m_normalFont);
+            dc->SetTextForeground(* wxBLACK);
+            dc->DrawText(cont, x, y);
+        }
+        y += 2*char_height;
     }
 
     *max_x = (int)curr_width;
     *max_y = (int)(y-char_height);
 
     if (page_break)
-      pages[current_page+1] = i;
+        pages[current_page+1] = i;
     else
-      paging = false;
+        paging = false;
 
     if (DrawIt)
     {
-      // Draw dark grey thick border
-      if (wxColourDisplay())
-      {
-        dc->SetBrush(*wxGREY_BRUSH);
-        dc->SetPen(*wxGREY_PEN);
-
-        // Left side
-        dc->DrawRectangle(0, 0, THIN_LINE_BORDER, height);
-        // Top side
-        dc->DrawRectangle(THIN_LINE_BORDER, 0, width-THIN_LINE_BORDER, THIN_LINE_BORDER);
-        // Right side
-        dc->DrawRectangle(width-THIN_LINE_BORDER, THIN_LINE_BORDER, width, height-THIN_LINE_BORDER);
-        // Bottom side
-        dc->DrawRectangle(THIN_LINE_BORDER, height-THIN_LINE_BORDER, width-THIN_LINE_BORDER, height);
-      }
-      // Draw border
-      // Have grey background, plus 3-d border -
-      // One black rectangle.
-      // Inside this, left and top sides - dark grey. Bottom and right -
-      // white.
-
-      // Change pen to black
-      dc->SetPen(*wxBLACK_PEN);
-      dc->DrawLine(THIN_LINE_BORDER, THIN_LINE_BORDER, width-THIN_LINE_BORDER, THIN_LINE_BORDER);
-      dc->DrawLine(width-THIN_LINE_BORDER, THIN_LINE_BORDER, width-THIN_LINE_BORDER, height-THIN_LINE_BORDER);
-      dc->DrawLine(width-THIN_LINE_BORDER, height-THIN_LINE_BORDER, THIN_LINE_BORDER, height-THIN_LINE_BORDER);
-      dc->DrawLine(THIN_LINE_BORDER, height-THIN_LINE_BORDER, THIN_LINE_BORDER, THIN_LINE_BORDER);
-
-      // Right and bottom white lines - 'grey' (black!) if
-      // we're running on a mono display.
-      if (wxColourDisplay())
-        dc->SetPen(*WhitePen);
-      else
-        dc->SetPen(*DarkGreyPen);
-
-      dc->DrawLine(width-THICK_LINE_BORDER, THICK_LINE_BORDER,
-                   width-THICK_LINE_BORDER, height-THICK_LINE_BORDER);
-      dc->DrawLine(width-THICK_LINE_BORDER, height-THICK_LINE_BORDER,
-                   THICK_LINE_BORDER, height-THICK_LINE_BORDER);
-
-      // Left and top grey lines
-      dc->SetPen(*DarkGreyPen);
-      dc->DrawLine(THICK_LINE_BORDER, height-THICK_LINE_BORDER,
-                   THICK_LINE_BORDER, THICK_LINE_BORDER);
-      dc->DrawLine(THICK_LINE_BORDER, THICK_LINE_BORDER,
-                   width-THICK_LINE_BORDER, THICK_LINE_BORDER);
-
-//#ifdef __WXMSW__
-      // Draw icons
-      dc->DrawIcon(* Corner1, 0, 0);
-      dc->DrawIcon(* Corner2, int(width-32), 0);
-
-      int y2 = height - 32;
-      int x2 = (width-32);
-      dc->DrawIcon(* Corner3, 0, y2);
-      dc->DrawIcon(* Corner4, x2, y2);
-//#endif
+        // Draw dark grey thick border
+        if (wxColourDisplay())
+        {
+            dc->SetBrush(*wxGREY_BRUSH);
+            dc->SetPen(*wxGREY_PEN);
+
+            // Left side
+            dc->DrawRectangle(0, 0, THIN_LINE_BORDER, height);
+            // Top side
+            dc->DrawRectangle(THIN_LINE_BORDER, 0, width-THIN_LINE_BORDER, THIN_LINE_BORDER);
+            // Right side
+            dc->DrawRectangle(width-THIN_LINE_BORDER, THIN_LINE_BORDER, width, height-THIN_LINE_BORDER);
+            // Bottom side
+            dc->DrawRectangle(THIN_LINE_BORDER, height-THIN_LINE_BORDER, width-THIN_LINE_BORDER, height);
+        }
+        // Draw border
+        // Have grey background, plus 3-d border -
+        // One black rectangle.
+        // Inside this, left and top sides - dark grey. Bottom and right -
+        // white.
+
+        // Change pen to black
+        dc->SetPen(*wxBLACK_PEN);
+        dc->DrawLine(THIN_LINE_BORDER, THIN_LINE_BORDER, width-THIN_LINE_BORDER, THIN_LINE_BORDER);
+        dc->DrawLine(width-THIN_LINE_BORDER, THIN_LINE_BORDER, width-THIN_LINE_BORDER, height-THIN_LINE_BORDER);
+        dc->DrawLine(width-THIN_LINE_BORDER, height-THIN_LINE_BORDER, THIN_LINE_BORDER, height-THIN_LINE_BORDER);
+        dc->DrawLine(THIN_LINE_BORDER, height-THIN_LINE_BORDER, THIN_LINE_BORDER, THIN_LINE_BORDER);
+
+        // Right and bottom white lines - 'grey' (black!) if
+        // we're running on a mono display.
+        if (wxColourDisplay())
+            dc->SetPen(*wxWHITE_PEN);
+        else
+            dc->SetPen(*wxBLACK_PEN);
+
+        dc->DrawLine(width-THICK_LINE_BORDER, THICK_LINE_BORDER,
+                     width-THICK_LINE_BORDER, height-THICK_LINE_BORDER);
+        dc->DrawLine(width-THICK_LINE_BORDER, height-THICK_LINE_BORDER,
+                     THICK_LINE_BORDER, height-THICK_LINE_BORDER);
+
+        // Left and top grey lines
+        dc->SetPen(*wxBLACK_PEN);
+        dc->DrawLine(THICK_LINE_BORDER, height-THICK_LINE_BORDER,
+                     THICK_LINE_BORDER, THICK_LINE_BORDER);
+        dc->DrawLine(THICK_LINE_BORDER, THICK_LINE_BORDER,
+                     width-THICK_LINE_BORDER, THICK_LINE_BORDER);
+
+        // Draw icons
+        dc->DrawIcon(* m_corners[0], 0, 0);
+        dc->DrawIcon(* m_corners[1], int(width-32), 0);
+
+        int y2 = height - 32;
+        int x2 = (width-32);
+        dc->DrawIcon(* m_corners[2], 0, y2);
+        dc->DrawIcon(* m_corners[3], x2, y2);
     }
 }
 
@@ -415,10 +413,10 @@ void MainWindow::ScanBuffer(wxDC *dc, bool DrawIt, int *max_x, int *max_y)
 void MainWindow::GetIndexLoadPoem(void)
 {
     if (index_ok)
-      index_ptr = GetIndex();
+        index_ptr = GetIndex();
 
     if (index_ptr > -1)
-      loaded_ok = LoadPoem(data_filename, -1);
+        loaded_ok = LoadPoem(data_filename, -1);
 }
 
 // Find the size of the poem and resize the window accordingly
@@ -443,170 +441,140 @@ void MainWindow::Resize(void)
     memDC.SelectObject(* backingBitmap);
 
     memDC.Clear();
-    TheMainWindow->ScanBuffer(&memDC, true, &xx, &yy);
+    ScanBuffer(&memDC, true, &xx, &yy);
 }
 
 // Which is more?
 void FindMax(int *max_thing, int thing)
 {
-  if (thing > *max_thing)
-    *max_thing = thing;
+    if (thing > *max_thing)
+        *max_thing = thing;
 }
 
 // Next page/poem
 void MainWindow::NextPage(void)
 {
-  if (paging)
-    current_page ++;
-  else
-  {
-    current_page = 0;
-    GetIndexLoadPoem();
-  }
-  Resize();
+    if (paging)
+        current_page ++;
+    else
+    {
+        current_page = 0;
+        GetIndexLoadPoem();
+    }
+    Resize();
 }
 
 // Previous page
 void MainWindow::PreviousPage(void)
 {
-  if (current_page > 0)
-  {
-    current_page --;
-    Resize();
-  }
+    if (current_page > 0)
+    {
+        current_page --;
+        Resize();
+    }
 }
 
 // Search for a string
 void MainWindow::Search(bool ask)
 {
-  long position;
+    long position;
 
-  if (ask || !search_string)
-  {
-    wxString s = wxGetTextFromUser( _T("Enter search string"), _T("Search"), (const wxChar*) search_string);
-    if (s != wxEmptyString)
+    if (ask || m_searchString.empty())
     {
-      s.MakeLower();
-      if (search_string) delete[] search_string;
-      search_string = copystring(s);
-      search_ok = true;
-    } else search_ok = false;
-  }
-  else
-  {
-    same_search = true;
-    search_ok = true;
-  }
-
-  if (search_string && search_ok)
-  {
-    position = DoSearch();
-    if (position > -1)
-    {
-       loaded_ok = LoadPoem(data_filename, position);
-       Resize();
+        wxString s = wxGetTextFromUser( _T("Enter search string"), _T("Search"), m_searchString);
+        if (!s.empty())
+        {
+            s.MakeLower();
+            m_searchString = s;
+            search_ok = true;
+        }
+        else
+        {
+            search_ok = false;
+        }
     }
     else
     {
-      last_poem_start = 0;
-      PoetryNotify(_T("Search string not found."));
+        same_search = true;
+        search_ok = true;
+    }
+
+    if (!m_searchString.empty() && search_ok)
+    {
+        position = DoSearch();
+        if (position > -1)
+        {
+            loaded_ok = LoadPoem(data_filename, position);
+            Resize();
+        }
+        else
+        {
+            last_poem_start = 0;
+            PoetryNotify(_T("Search string not found."));
+        }
     }
-  }
 }
 
 bool MyApp::OnInit()
 {
-  poem_buffer = new wxChar[buf_size];
-
-  GreyPen = new wxPen(_T("LIGHT GREY"), THICK_LINE_WIDTH, wxSOLID);
-  DarkGreyPen = new wxPen(_T("GREY"), THICK_LINE_WIDTH, wxSOLID);
-  WhitePen = new wxPen(_T("WHITE"), THICK_LINE_WIDTH, wxSOLID);
-
-  CreateFonts();
+    poem_buffer = new wxChar[BUFFER_SIZE];
 
-  ReadPreferences();
-
-  // Seed the random number generator
+    // Seed the random number generator
 #ifdef __WXWINCE__
-  srand((unsigned) CeGetRandomSeed());
+    srand((unsigned) CeGetRandomSeed());
 #else
-  time_t current_time;
+    time_t current_time;
 
-  (void)time(&current_time);
-  srand((unsigned int)current_time);
+    (void)time(&current_time);
+    srand((unsigned int)current_time);
 #endif
 
 //    randomize();
-  pages[0] = 0;
-
-  TheMainWindow = new MainWindow(NULL,
-                                 wxID_ANY,
-                                 _T("wxPoem"),
-                                 wxPoint(XPos, YPos),
-                                 wxDefaultSize,
-                                 wxCAPTION|wxMINIMIZE_BOX|wxSYSTEM_MENU|wxCLOSE_BOX|wxFULL_REPAINT_ON_RESIZE
-                                 );
+    pages[0] = 0;
 
-  TheMainWindow->SetIcon(wxICON(wxpoem));
+    TheMainWindow = new MainWindow(NULL,
+                                   wxID_ANY,
+                                   _T("wxPoem"),
+                                   wxPoint(XPos, YPos),
+                                   wxDefaultSize,
+                                   wxCAPTION|wxMINIMIZE_BOX|wxSYSTEM_MENU|wxCLOSE_BOX|wxFULL_REPAINT_ON_RESIZE
+                                   );
 
-  TheMainWindow->canvas = new MyCanvas(TheMainWindow, 501, wxDefaultPosition, wxDefaultSize);
+    TheMainWindow->canvas = new MyCanvas(TheMainWindow);
 
-  if (argc > 1)
-  {
-    index_filename = copystring(argv[1]);
-    data_filename = copystring(argv[1]);
-  }
-  else
-  {
-    index_filename = _T(DEFAULT_POETRY_IND);
-    data_filename = _T(DEFAULT_POETRY_DAT);
-  }
-  TryLoadIndex();
-
-#ifdef __WXMSW__
-  Corner1 = new wxIcon(_T("icon_1"));
-  Corner2 = new wxIcon(_T("icon_2"));
-  Corner3 = new wxIcon(_T("icon_3"));
-  Corner4 = new wxIcon(_T("icon_4"));
-#endif
-#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXX11__)
-  Corner1 = new wxIcon( corner1_xpm );
-  Corner2 = new wxIcon( corner2_xpm );
-  Corner3 = new wxIcon( corner3_xpm );
-  Corner4 = new wxIcon( corner4_xpm );
-#endif
+    if (argc > 1)
+    {
+        index_filename = wxStrcpy(new wxChar[wxStrlen(argv[1]) + 1], argv[1]);
+        data_filename = wxStrcpy(new wxChar[wxStrlen(argv[1]) + 1], argv[1]);
+    }
+    else
+    {
+        index_filename = _T(DEFAULT_POETRY_IND);
+        data_filename = _T(DEFAULT_POETRY_DAT);
+    }
+    TryLoadIndex();
 
-  TheMainWindow->GetIndexLoadPoem();
-  TheMainWindow->Resize();
-  TheMainWindow->Show(true);
+    TheMainWindow->GetIndexLoadPoem();
+    TheMainWindow->Resize();
+    TheMainWindow->Show(true);
 
-  return true;
+    return true;
 }
 
 int MyApp::OnExit()
 {
-  if (backingBitmap)
-    delete backingBitmap;
-  delete GreyPen;
-  delete DarkGreyPen;
-  delete WhitePen;
-
-  delete Corner1;
-  delete Corner2;
-  delete Corner3;
-  delete Corner4;
-
-  delete[] poem_buffer;
-  if (search_string)
-    delete[] search_string;
-
-  return 0;
+    if (backingBitmap)
+        delete backingBitmap;
+
+    delete[] poem_buffer;
+
+    return 0;
 }
 
 void MainWindow::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
 {
-  WritePreferences();
-  this->Destroy();
+    WritePreferences();
+    this->Destroy();
 }
 
 void MainWindow::OnChar(wxKeyEvent& event)
@@ -621,32 +589,32 @@ BEGIN_EVENT_TABLE(MyCanvas, wxWindow)
 END_EVENT_TABLE()
 
 // Define a constructor for my canvas
-MyCanvas::MyCanvas(wxFrame *frame, wxWindowID id, const wxPoint& pos, const wxSize& size):
wxWindow(frame, id, pos, size)
+MyCanvas::MyCanvas(wxFrame *frame):
         wxWindow(frame, wxID_ANY)
 {
-  popupMenu = new wxMenu;
-  popupMenu->Append(POEM_NEXT, _T("Next poem/page"));
-  popupMenu->Append(POEM_PREVIOUS, _T("Previous page"));
-  popupMenu->AppendSeparator();
-  popupMenu->Append(POEM_SEARCH, _T("Search"));
-  popupMenu->Append(POEM_NEXT_MATCH, _T("Next match"));
-  popupMenu->Append(POEM_COPY, _T("Copy to clipboard"));
-  popupMenu->Append(POEM_MINIMIZE, _T("Minimize"));
-  popupMenu->AppendSeparator();
-  popupMenu->Append(POEM_BIGGER_TEXT, _T("Bigger text"));
-  popupMenu->Append(POEM_SMALLER_TEXT, _T("Smaller text"));
-  popupMenu->AppendSeparator();
-  popupMenu->Append(POEM_ABOUT, _T("About wxPoem"));
-  popupMenu->AppendSeparator();
-  popupMenu->Append(POEM_EXIT, _T("Exit"));
+    m_popupMenu = new wxMenu;
+    m_popupMenu->Append(POEM_NEXT, _T("Next poem/page"));
+    m_popupMenu->Append(POEM_PREVIOUS, _T("Previous page"));
+    m_popupMenu->AppendSeparator();
+    m_popupMenu->Append(POEM_SEARCH, _T("Search"));
+    m_popupMenu->Append(POEM_NEXT_MATCH, _T("Next match"));
+    m_popupMenu->Append(POEM_COPY, _T("Copy to clipboard"));
+    m_popupMenu->Append(POEM_MINIMIZE, _T("Minimize"));
+    m_popupMenu->AppendSeparator();
+    m_popupMenu->Append(POEM_BIGGER_TEXT, _T("Bigger text"));
+    m_popupMenu->Append(POEM_SMALLER_TEXT, _T("Smaller text"));
+    m_popupMenu->AppendSeparator();
+    m_popupMenu->Append(POEM_ABOUT, _T("About wxPoem"));
+    m_popupMenu->AppendSeparator();
+    m_popupMenu->Append(POEM_EXIT, _T("Exit"));
 }
 
 MyCanvas::~MyCanvas()
 {
-  // Note: this must be done before the main window/canvas are destroyed
-  // or we get an error (no parent window for menu item button)
-  delete popupMenu;
-  popupMenu = NULL;
+    // Note: this must be done before the main window/canvas are destroyed
+    // or we get an error (no parent window for menu item button)
+    delete m_popupMenu;
+    m_popupMenu = NULL;
 }
 
 // Define the repainting behaviour
@@ -660,7 +628,7 @@ void MyCanvas::OnPaint(wxPaintEvent& WXUNUSED(event))
         TheMainWindow->GetClientSize(&xx, &yy);
 
         dc.DrawBitmap(* backingBitmap, 0, 0);
-#if 0        
+#if 0
         wxMemoryDC memDC;
         memDC.SelectObject(* backingBitmap);
         dc.Blit(0, 0, backingBitmap->GetWidth(), backingBitmap->GetHeight(), &memDC, 0, 0);
@@ -670,69 +638,72 @@ void MyCanvas::OnPaint(wxPaintEvent& WXUNUSED(event))
 
 void MyCanvas::OnMouseEvent(wxMouseEvent& event)
 {
-  static int startPosX, startPosY, startFrameX, startFrameY;
+    static int startPosX, startPosY, startFrameX, startFrameY;
 
-  long x, y;
-  event.GetPosition(&x, &y);
+    long x, y;
+    event.GetPosition(&x, &y);
 
-  if (event.RightDown())
-  {
-    // Versions from wxWin 1.67 are probably OK
-    PopupMenu(popupMenu, (int)x, (int)y );
-  }
-  else if (event.LeftDown())
-  {
-    this->CaptureMouse();
-    int x1 = (int)x;
-    int y1 = (int)y;
-    ClientToScreen(&x1, &y1);
-    startPosX = x1;
-    startPosY = y1;
-    GetParent()->GetPosition(&startFrameX, &startFrameY);
-  }
-  else if (event.LeftUp())
-  {
-    if (GetCapture() == this) this->ReleaseMouse();
-  }
-  else if (event.Dragging() && event.LeftIsDown())
-  {
-    int x1 = (int)x;
-    int y1 = (int)y;
-    ClientToScreen(&x1, &y1);
-
-    int dX = x1 - startPosX;
-    int dY = y1 - startPosY;
-    GetParent()->Move(startFrameX + dX, startFrameY + dY);
-  }
+    if (event.RightDown())
+    {
+        // Versions from wxWin 1.67 are probably OK
+        PopupMenu(m_popupMenu, (int)x, (int)y );
+    }
+    else if (event.LeftDown())
+    {
+        this->CaptureMouse();
+        int x1 = (int)x;
+        int y1 = (int)y;
+        ClientToScreen(&x1, &y1);
+        startPosX = x1;
+        startPosY = y1;
+        GetParent()->GetPosition(&startFrameX, &startFrameY);
+    }
+    else if (event.LeftUp())
+    {
+        if (GetCapture() == this) this->ReleaseMouse();
+    }
+    else if (event.Dragging() && event.LeftIsDown())
+    {
+        int x1 = (int)x;
+        int y1 = (int)y;
+        ClientToScreen(&x1, &y1);
+
+        int dX = x1 - startPosX;
+        int dY = y1 - startPosY;
+        GetParent()->Move(startFrameX + dX, startFrameY + dY);
+    }
 }
 
 // Process characters
 void MyCanvas::OnChar(wxKeyEvent& event)
 {
-  switch (event.GetKeyCode())
-  {
-    case 'n':
-    case 'N':
-      // Next match
-      TheMainWindow->Search(false);
-      break;
-    case 's':
-    case 'S':
-      // New search
-      TheMainWindow->Search(true);
-      break;
-    case WXK_SPACE:
-    case WXK_RIGHT:
-    case WXK_DOWN:
-      // Another poem
-      TheMainWindow->NextPage();
-      break;
-    case WXK_ESCAPE:
-      TheMainWindow->Close(true);
-    default:
-       break;
-   }
- }
+    switch (event.GetKeyCode())
+    {
+        case 'n':
+        case 'N':
+            // Next match
+            TheMainWindow->Search(false);
+            break;
+
+        case 's':
+        case 'S':
+            // New search
+            TheMainWindow->Search(true);
+            break;
+
+        case WXK_SPACE:
+        case WXK_RIGHT:
+        case WXK_DOWN:
+            // Another poem
+            TheMainWindow->NextPage();
+            break;
+
+        case WXK_ESCAPE:
+            TheMainWindow->Close(true);
+        default:
+            break;
+    }
+}
 
 // Load index file
 int LoadIndex(wxChar *file_name)
@@ -743,25 +714,25 @@ int LoadIndex(wxChar *file_name)
     wxChar buf[100];
 
     if (file_name == NULL)
-      return 0;
+        return 0;
 
     wxSprintf(buf, _T("%s.idx"), file_name);
 
     index_file = wxFopen(buf, _T("r"));
     if (index_file == NULL)
-      return 0;
+        return 0;
 
     wxFscanf(index_file, _T("%ld"), &nitems);
 
-      for (int i = 0; i < nitems; i++)
-      {
-      wxFscanf(index_file, _T("%ld"), &data);
+    for (int i = 0; i < nitems; i++)
+    {
+        wxFscanf(index_file, _T("%ld"), &data);
         poem_index[i] = data;
-      }
+    }
 
-      fclose(index_file);
+    fclose(index_file);
 
-      return 1;
+    return 1;
 }
 
 // Get index
@@ -778,25 +749,29 @@ int GetIndex()
 }
 
 // Read preferences
-void ReadPreferences()
+void MainWindow::ReadPreferences()
 {
+/* TODO: convert this code to use wxConfig
 #if wxUSE_RESOURCES
-  wxGetResource(_T("wxPoem"), _T("FontSize"), &pointSize);
-  wxGetResource(_T("wxPoem"), _T("X"), &XPos);
-  wxGetResource(_T("wxPoem"), _T("Y"), &YPos);
+    wxGetResource(_T("wxPoem"), _T("FontSize"), &pointSize);
+    wxGetResource(_T("wxPoem"), _T("X"), &XPos);
+    wxGetResource(_T("wxPoem"), _T("Y"), &YPos);
 #endif
+*/
 }
 
 // Write preferences to disk
-void WritePreferences()
+void MainWindow::WritePreferences()
 {
 #ifdef __WXMSW__
-  TheMainWindow->GetPosition(&XPos, &YPos);
+    TheMainWindow->GetPosition(&XPos, &YPos);
+/* TODO: convert this code to use wxConfig
 #if wxUSE_RESOURCES
-  wxWriteResource(_T("wxPoem"), _T("FontSize"), pointSize);
-  wxWriteResource(_T("wxPoem"), _T("X"), XPos);
-  wxWriteResource(_T("wxPoem"), _T("Y"), YPos);
+    wxWriteResource(_T("wxPoem"), _T("FontSize"), pointSize);
+    wxWriteResource(_T("wxPoem"), _T("X"), XPos);
+    wxWriteResource(_T("wxPoem"), _T("Y"), YPos);
 #endif
+*/
 #endif
 }
 
@@ -831,77 +806,77 @@ bool LoadPoem(wxChar *file_name, long position)
       return false;
     }
 
-      if (position > -1)
+    if (position > -1)
         data = position;
-      else
+    else
         data = poem_index[index_ptr];
 
-      fseek(data_file, data, SEEK_SET);
+    fseek(data_file, data, SEEK_SET);
 
-      int ch = 0;
-      int i = 0;
-      while ((ch != EOF) && (ch != '#'))
-      {
+    int ch = 0;
+    int i = 0;
+    while ((ch != EOF) && (ch != '#'))
+    {
         ch = getc(data_file);
         // Add a linefeed so it will copy to the clipboard ok
         if (ch == 10)
         {
-          poem_buffer[i] = 13;
-          i++;
+            poem_buffer[i] = 13;
+            i++;
         }
 
-        poem_buffer[i] = ch;
+        poem_buffer[i] = (wxChar)ch;
         i ++;
 
-        if (i == buf_size)
+        if (i == BUFFER_SIZE)
         {
-        wxSprintf(error_buf, _T("%s"), _T("Poetry buffer exceeded."));
-           PoetryError(error_buf);
-           return false;
+            wxSprintf(error_buf, _T("%s"), _T("Poetry buffer exceeded."));
+            PoetryError(error_buf);
+            return false;
         }
-      }
-      fclose(data_file);
-      poem_buffer[i-1] = 0;
-      return true;
+    }
+    fclose(data_file);
+    poem_buffer[i-1] = 0;
+    return true;
 }
 
 // Do the search
 long MainWindow::DoSearch(void)
 {
-    if (!search_string)
-      return false;
+    if (m_searchString.empty())
+        return false;
 
     FILE *file;
-    long i = 0;
+    size_t i = 0;
     int ch = 0;
     wxChar buf[100];
     long find_start;
     long previous_poem_start;
 
     bool found = false;
-    int search_length = wxStrlen(search_string);
+    size_t search_length = m_searchString.length();
 
     if (same_search)
     {
-      find_start = last_find + 1;
-      previous_poem_start = last_poem_start;
+        find_start = last_find + 1;
+        previous_poem_start = last_poem_start;
     }
     else
     {
-      find_start = 0;
-      last_poem_start = 0;
-      previous_poem_start = -1;
+        find_start = 0;
+        last_poem_start = 0;
+        previous_poem_start = -1;
     }
 
     if (data_filename)
-      wxSprintf(buf, _T("%s.dat"), data_filename);
+        wxSprintf(buf, _T("%s.dat"), data_filename);
 
     file = wxFopen(buf, _T("r"));
     if (! (data_filename && file))
     {
-      wxSprintf(error_buf, _T("Poetry data file %s not found\n"), buf);
-      PoetryError(error_buf);
-      return false;
+        wxSprintf(error_buf, _T("Poetry data file %s not found\n"), buf);
+        PoetryError(error_buf);
+        return false;
     }
 
     fseek(file, find_start, SEEK_SET);
@@ -913,57 +888,61 @@ long MainWindow::DoSearch(void)
 
         // Only match if we're looking at a different poem
         // (no point in displaying the same poem again)
-        if ((ch == search_string[i]) && (last_poem_start != previous_poem_start))
+        if ((m_searchString[i] == ch) && (last_poem_start != previous_poem_start))
         {
-          if (i == 0)
-            last_find = ftell(file);
-          if (i == search_length-1)
-            found = true;
-          i ++;
+            if (i == 0)
+                last_find = ftell(file);
+            if (i == search_length-1)
+                found = true;
+            i ++;
         }
         else
-          i = 0;
+        {
+            i = 0;
+        }
 
         if (ch == '#')
         {
             ch = getc(file);
-              last_poem_start = ftell(file);
+            last_poem_start = ftell(file);
         }
     }
     fclose(file);
     if (ch == EOF)
-      last_find = -1;
+    {
+        last_find = -1;
+    }
 
     if (found)
     {
-      return last_poem_start;
+        return last_poem_start;
     }
-    else
-      return -1;
+
+    return -1;
 }
 
 // Set up poetry filenames, preferences, load the index
 // Load index (or compile it if none found)
 void TryLoadIndex()
 {
-  index_ok = (LoadIndex(index_filename) != 0);
-  if (!index_ok || (nitems == 0))
-  {
-      PoetryError(_T("Index file not found; will compile new one"), _T("wxPoem"));
-      index_ok = Compile();
-  }
+    index_ok = (LoadIndex(index_filename) != 0);
+    if (!index_ok || (nitems == 0))
+    {
+        PoetryError(_T("Index file not found; will compile new one"), _T("wxPoem"));
+        index_ok = Compile();
+    }
 }
 
 // Error message
-void PoetryError(wxChar *msg, wxChar *caption)
+void PoetryError(const wxChar *msg, const wxChar *caption)
 {
-  wxMessageBox(msg, caption, wxOK|wxICON_EXCLAMATION);
+    wxMessageBox(msg, caption, wxOK|wxICON_EXCLAMATION);
 }
 
 // Notification (change icon to something appropriate!)
-void PoetryNotify(wxChar *Msg, wxChar *caption)
+void PoetryNotify(const wxChar *Msg, const wxChar *caption)
 {
-  wxMessageBox(Msg, caption, wxOK | wxICON_INFORMATION);
+    wxMessageBox(Msg, caption, wxOK | wxICON_INFORMATION);
 }
 
 // Build up and save an index into the poetry data file, for
@@ -976,14 +955,14 @@ bool Compile(void)
     wxChar buf[100];
 
     if (data_filename)
-      wxSprintf(buf, _T("%s.dat"), data_filename);
+        wxSprintf(buf, _T("%s.dat"), data_filename);
 
     file = wxFopen(buf, _T("r"));
     if (! (data_filename && file))
     {
-      wxSprintf(error_buf, _T("Poetry data file %s not found\n"), buf);
-      PoetryError(error_buf);
-      return false;
+        wxSprintf(error_buf, _T("Poetry data file %s not found\n"), buf);
+        PoetryError(error_buf);
+        return false;
     }
 
     nitems = 0;
@@ -993,7 +972,7 @@ bool Compile(void)
     nitems ++;
 
     // Do rest
-    
+
     do {
         ch = getc(file);
         if (ch == '#')
@@ -1013,14 +992,14 @@ bool Compile(void)
     file = wxFopen(buf, _T("w"));
     if (! (data_filename && file))
     {
-      wxSprintf(error_buf, _T("Poetry index file %s cannot be created\n"), buf);
-      PoetryError(error_buf);
-      return false;
+        wxSprintf(error_buf, _T("Poetry index file %s cannot be created\n"), buf);
+        PoetryError(error_buf);
+        return false;
     }
 
     wxFprintf(file, _T("%ld\n\n"), nitems);
     for (j = 0; j < nitems; j++)
-      wxFprintf(file, _T("%ld\n"), poem_index[j]);
+        wxFprintf(file, _T("%ld\n"), poem_index[j]);
 
     fclose(file);
     PoetryNotify(_T("Poetry index compiled."));
@@ -1029,82 +1008,72 @@ bool Compile(void)
 
 void MainWindow::OnPopup(wxCommandEvent& event)
 {
-  switch (event.GetId())
-  {
-     case POEM_NEXT:
-       // Another poem/page
-       TheMainWindow->NextPage();
-       break;
-     case POEM_PREVIOUS:
-       // Previous page
-       TheMainWindow->PreviousPage();
-       break;
-     case POEM_SEARCH:
-       // Search - with dialog
-       TheMainWindow->Search(true);
-       break;
-     case POEM_NEXT_MATCH:
-       // Search - without dialog (next match)
-       TheMainWindow->Search(false);
-       break;
-     case POEM_MINIMIZE:
-       TheMainWindow->Iconize(true);
-       break;
+    switch (event.GetId())
+    {
+        case POEM_NEXT:
+            // Another poem/page
+            TheMainWindow->NextPage();
+            break;
+        case POEM_PREVIOUS:
+            // Previous page
+            TheMainWindow->PreviousPage();
+            break;
+        case POEM_SEARCH:
+            // Search - with dialog
+            TheMainWindow->Search(true);
+            break;
+        case POEM_NEXT_MATCH:
+            // Search - without dialog (next match)
+            TheMainWindow->Search(false);
+            break;
+        case POEM_MINIMIZE:
+            TheMainWindow->Iconize(true);
+            break;
 #if wxUSE_CLIPBOARD
-     case POEM_COPY:
-       wxTheClipboard->UsePrimarySelection();
-       if (wxTheClipboard->Open())
-       {
-         static wxString s;
-         s = poem_buffer;
-         s.Replace( _T("@P"),_T(""));
-         s.Replace( _T("@A "),_T(""));
-         s.Replace( _T("@A"),_T(""));
-         s.Replace( _T("@T "),_T(""));
-         s.Replace( _T("@T"),_T(""));
-         wxTextDataObject *data = new wxTextDataObject( s.c_str() );
-         if (!wxTheClipboard->SetData( data ))
-           wxMessageBox(_T("Error while copying to the clipboard."));
-       }
-       else
-       {
-         wxMessageBox(_T("Error opening the clipboard."));
-       }
-       wxTheClipboard->Close();
-       break;
+        case POEM_COPY:
+            wxTheClipboard->UsePrimarySelection();
+            if (wxTheClipboard->Open())
+            {
+                static wxString s;
+                s = poem_buffer;
+                s.Replace( _T("@P"),wxEmptyString);
+                s.Replace( _T("@A "),wxEmptyString);
+                s.Replace( _T("@A"),wxEmptyString);
+                s.Replace( _T("@T "),wxEmptyString);
+                s.Replace( _T("@T"),wxEmptyString);
+                wxTextDataObject *data = new wxTextDataObject( s.c_str() );
+                if (!wxTheClipboard->SetData( data ))
+                    wxMessageBox(_T("Error while copying to the clipboard."));
+            }
+            else
+            {
+                wxMessageBox(_T("Error opening the clipboard."));
+            }
+            wxTheClipboard->Close();
+            break;
 #endif
-     case POEM_COMPILE:
-       // Compile index
-       Compile();
-       break;
-     case POEM_BIGGER_TEXT:
-     {
-       pointSize ++;
-       CreateFonts();
-       TheMainWindow->Resize();
-       break;
-     }
-     case POEM_SMALLER_TEXT:
-     {
-       if (pointSize > 2)
-       {
-         pointSize --;
-         CreateFonts();
-         TheMainWindow->Resize();
-       }
-       break;
-     }
-     case POEM_ABOUT:
-     {
-       (void)wxMessageBox(_T("wxPoem Version 1.1\nJulian Smart (c) 1995"),
-                          _T("About wxPoem"), wxOK, TheMainWindow);
-       break;
-     }
-     case POEM_EXIT:
-       // Exit
-       TheMainWindow->Close(true);
-       break;
-     default:
-       break;
-  }
+        case POEM_BIGGER_TEXT:
+            pointSize ++;
+            CreateFonts();
+            TheMainWindow->Resize();
+            break;
+        case POEM_SMALLER_TEXT:
+            if (pointSize > 2)
+            {
+                pointSize --;
+                CreateFonts();
+                TheMainWindow->Resize();
+            }
+            break;
+        case POEM_ABOUT:
+            (void)wxMessageBox(_T("wxPoem Version 1.1\nJulian Smart (c) 1995"),
+                               _T("About wxPoem"), wxOK, TheMainWindow);
+            break;
+        case POEM_EXIT:
+            // Exit
+            TheMainWindow->Close(true);
+            break;
+        default:
+            break;
+    }
 }