X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a6f28223ee2e8afe7c94fa288859458b99ace7dd..4f2511d706e5274a34e1521e11c1b95fed735b42:/demos/poem/wxpoem.cpp diff --git a/demos/poem/wxpoem.cpp b/demos/poem/wxpoem.cpp index 9bdca453e9..ed88fd646a 100644 --- a/demos/poem/wxpoem.cpp +++ b/demos/poem/wxpoem.cpp @@ -14,10 +14,6 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "wxpoem.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -31,14 +27,13 @@ #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 @@ -53,10 +48,8 @@ #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(¤t_time); - srand((unsigned int)current_time); + (void)time(¤t_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; + } }