#include "wx/wx.h"
#endif
-#include "wx/help.h"
-
#include "wxpoem.h"
#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXX11__)
#include "corner2.xpm"
#include "corner3.xpm"
#include "corner4.xpm"
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-#ifdef __WINDOWS__
-#include <windows.h>
-#ifdef DrawText
-#undef DrawText
-#endif
+#include "wxpoem.xpm"
#endif
#define buf_size 10000
static long last_poem_start = 0; // Start of last found poem
static long last_find = -1; // Point in file of last found
// search string
-static bool search_ok = FALSE; // Search was successful
-static bool same_search = FALSE; // Searching on same string
+static bool search_ok = false; // Search was successful
+static bool same_search = false; // Searching on same string
static long poem_index[600]; // Index of poem starts
static long nitems = 0; // Number of poems
static wxChar *index_filename = NULL; // Index filename
static wxChar *data_filename = NULL; // Data filename
static wxChar error_buf[300]; // Error message buffer
-static bool loaded_ok = FALSE; // Poem loaded ok
-static bool index_ok = FALSE; // Index loaded ok
+static bool loaded_ok = false; // Poem loaded ok
+static bool index_ok = false; // Index loaded ok
-static bool paging = FALSE; // Are we paging?
+static bool paging = false; // Are we paging?
static int current_page = 0; // Currently viewed page
wxIcon *Corner1 = NULL;
void ReadPreferences();
void FindMax(int *max_thing, int thing);
void CreateFonts();
-#ifdef __WXMSW__
-void CopyToClipboard(HWND, wxChar *);
-#endif
-wxMenu *popupMenu = NULL;
+#if wxUSE_CLIPBOARD
+ #include "wx/dataobj.h"
+ #include "wx/clipbrd.h"
+#endif
-#if wxUSE_HELP
- wxHelpController *HelpController = NULL;
-#endif // wxUSE_HELP
+#ifdef __WXWINCE__
+ STDAPI_(__int64) CeGetRandomSeed();
+#endif
IMPLEMENT_APP(MyApp)
BEGIN_EVENT_TABLE(MainWindow, wxFrame)
EVT_CLOSE(MainWindow::OnCloseWindow)
EVT_CHAR(MainWindow::OnChar)
- EVT_MENU(-1, MainWindow::OnPopup)
+ EVT_MENU(wxID_ANY, MainWindow::OnPopup)
END_EVENT_TABLE()
MainWindow::MainWindow(wxFrame *frame, wxWindowID id, const wxString& title,
{
}
-MainWindow::~MainWindow()
-{
- // 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;
-}
-
// Read the poetry buffer, either for finding the size
// or for writing to a bitmap (not to the window directly,
// since that displays messily)
{
int i = pages[current_page];
int ch = -1;
- int x = 10;
int y = 0;
int j;
wxChar *line_ptr;
int curr_width = 0;
- bool page_break = FALSE;
+ bool page_break = false;
int width = 0;
int height = 0;
if (DrawIt)
{
- x = (width - xx)/2;
+ int x = (width - xx)/2;
dc->SetFont(* BoldFont);
// Change text to BLACK!
while (((ch = poem_buffer[i]) != 10) && (ch != 0))
#endif
{
- line[j] = ch;
+ line[j] = (wxChar)ch;
j ++;
i ++;
}
switch (line[1])
{
case 'P':
- paging = TRUE;
- page_break = TRUE;
+ paging = true;
+ page_break = true;
break;
case 'T':
if (DrawIt)
{
- x = (width - xx)/2;
+ int x = (width - xx)/2;
dc->SetFont(* BoldFont);
// Change text to BLACK!
if (DrawIt)
{
- x = (width - xx)/2;
+ int x = (width - xx)/2;
dc->SetTextForeground(* wxBLACK);
dc->DrawText(line_ptr, x, y);
}
if (page_break)
pages[current_page+1] = i;
else
- paging = FALSE;
+ paging = false;
if (DrawIt)
{
wxClientDC dc(canvas);
// Get the poem size
- ScanBuffer(& dc, FALSE, &poem_width, &poem_height);
+ ScanBuffer(& dc, false, &poem_width, &poem_height);
int x = poem_width + (2*BORDER_SIZE);
int y = poem_height + (2*BORDER_SIZE);
memDC.SelectObject(* backingBitmap);
memDC.Clear();
- TheMainWindow->ScanBuffer(&memDC, TRUE, &xx, &yy);
+ TheMainWindow->ScanBuffer(&memDC, true, &xx, &yy);
}
// Which is more?
wxString s = wxGetTextFromUser( _T("Enter search string"), _T("Search"), (const wxChar*) search_string);
if (s != wxEmptyString)
{
+ s.MakeLower();
if (search_string) delete[] search_string;
- search_string = copystring(s);
- search_ok = TRUE;
- } else search_ok = FALSE;
+ search_string = wxStrcpy(new wxChar[wxStrlen(s.c_str()) + 1], s.c_str());
+ search_ok = true;
+ } else search_ok = false;
}
else
{
- same_search = TRUE;
- search_ok = TRUE;
+ same_search = true;
+ search_ok = true;
}
if (search_string && search_ok)
}
}
-// Copy a string to the clipboard
-#ifdef __WXMSW__
-void CopyToClipboard(HWND handle, wxChar *s)
-{
- int length = wxStrlen(s);
- HANDLE hGlobalMemory = GlobalAlloc(GHND, (DWORD) length + 1);
- if (hGlobalMemory)
- {
-#ifdef __WINDOWS_386__
- LPSTR lpGlobalMemory = MK_FP32(GlobalLock(hGlobalMemory));
-#else
- LPSTR lpGlobalMemory = (LPSTR)GlobalLock(hGlobalMemory);
-#endif
- int i, j = 0;
- for (i = 0; i < length; i ++)
- {
- if (s[i] == '@')
- {
- i++;
- switch (s[i])
- {
- case 'P':
- break;
- case 'T':
- case 'A':
- default:
- i ++;
- break;
- }
- }
- else
- {
- lpGlobalMemory[j] = s[i];
- j ++;
- }
- }
-
- GlobalUnlock(hGlobalMemory);
- OpenClipboard(handle);
- EmptyClipboard();
- SetClipboardData(CF_TEXT, hGlobalMemory);
- CloseClipboard();
- }
-}
-#endif
-
bool MyApp::OnInit()
{
poem_buffer = new wxChar[buf_size];
DarkGreyPen = new wxPen(_T("GREY"), THICK_LINE_WIDTH, wxSOLID);
WhitePen = new wxPen(_T("WHITE"), THICK_LINE_WIDTH, wxSOLID);
-#if wxUSE_HELP
- HelpController = new wxHelpController();
- HelpController->Initialize(_T("wxpoem"));
-#endif // wxUSE_HELP
-
CreateFonts();
ReadPreferences();
// Seed the random number generator
+#ifdef __WXWINCE__
+ srand((unsigned) CeGetRandomSeed());
+#else
time_t current_time;
(void)time(¤t_time);
srand((unsigned int)current_time);
+#endif
// randomize();
pages[0] = 0;
- TheMainWindow = new MainWindow(NULL, 500, _T("wxPoem"), wxPoint(XPos, YPos), wxSize(100, 100), wxCAPTION|wxMINIMIZE_BOX|wxSYSTEM_MENU|wxCLOSE_BOX);
+ TheMainWindow = new MainWindow(NULL,
+ wxID_ANY,
+ _T("wxPoem"),
+ wxPoint(XPos, YPos),
+ wxDefaultSize,
+ wxCAPTION|wxMINIMIZE_BOX|wxSYSTEM_MENU|wxCLOSE_BOX|wxFULL_REPAINT_ON_RESIZE
+ );
-#ifdef wx_x
- TheMainWindow->SetIcon(Icon(_T("wxpoem")));
-#endif
+ TheMainWindow->SetIcon(wxICON(wxpoem));
TheMainWindow->canvas = new MyCanvas(TheMainWindow, 501, wxDefaultPosition, wxDefaultSize);
- 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"));
-
if (argc > 1)
{
- index_filename = copystring(argv[1]);
- data_filename = copystring(argv[1]);
+ index_filename = wxStrcpy(new wxChar[wxStrlen(argv[1]) + 1], argv[1]);
+ data_filename = wxStrcpy(new wxChar[wxStrlen(argv[1]) + 1], argv[1]);
}
else
{
TheMainWindow->GetIndexLoadPoem();
TheMainWindow->Resize();
- TheMainWindow->Show(TRUE);
+ TheMainWindow->Show(true);
- return TRUE;
+ return true;
}
int MyApp::OnExit()
{
if (backingBitmap)
delete backingBitmap;
-#if wxUSE_HELP
- delete HelpController;
-#endif // wxUSE_HELP
delete GreyPen;
delete DarkGreyPen;
delete WhitePen;
delete Corner3;
delete Corner4;
- // Causes crash since they're deleted by the global font list
-#if 0
- delete NormalFont;
- delete BoldFont;
- delete ItalicFont;
-#endif
-
delete[] poem_buffer;
if (search_string)
delete[] search_string;
MyCanvas::MyCanvas(wxFrame *frame, wxWindowID id, const wxPoint& pos, const wxSize& size):
wxWindow(frame, id, pos, size)
{
+ 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"));
+}
+
+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;
}
// Define the repainting behaviour
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);
GetParent()->GetPosition(&startFrameX, &startFrameY);
}
else if (event.LeftUp())
- this->ReleaseMouse();
+ {
+ if (GetCapture() == this) this->ReleaseMouse();
+ }
else if (event.Dragging() && event.LeftIsDown())
{
int x1 = (int)x;
case 'n':
case 'N':
// Next match
- TheMainWindow->Search(FALSE);
+ TheMainWindow->Search(false);
break;
case 's':
case 'S':
// New search
- TheMainWindow->Search(TRUE);
+ TheMainWindow->Search(true);
break;
case WXK_SPACE:
+ case WXK_RIGHT:
+ case WXK_DOWN:
// Another poem
TheMainWindow->NextPage();
break;
- case 27:
- TheMainWindow->Close(TRUE);
+ case WXK_ESCAPE:
+ TheMainWindow->Close(true);
default:
break;
}
long data;
FILE *index_file;
- int i = 0;
wxChar buf[100];
if (file_name == NULL)
wxFscanf(index_file, _T("%ld"), &nitems);
- for (i = 0; i < nitems; i++)
+ for (int i = 0; i < nitems; i++)
{
wxFscanf(index_file, _T("%ld"), &data);
poem_index[i] = data;
// Get index
int GetIndex()
{
- int indexn = 0;
-
- indexn = (int)(rand() % nitems);
+ int indexn = (int)(rand() % nitems);
if ((indexn < 0) || (indexn > nitems))
{ PoetryError(_T("No such poem!"));
// file, otherwise use index[index_ptr] to find the correct position.
bool LoadPoem(wxChar *file_name, long position)
{
- int ch = 0;
- int i = 0;
// int j = 0;
// int indexn = 0;
wxChar buf[100];
long data;
FILE *data_file;
- paging = FALSE;
+ paging = false;
current_page = 0;
if (file_name == NULL)
{
wxSprintf(error_buf, _T("Error in Poem loading."));
PoetryError(error_buf);
- return FALSE;
+ return false;
}
wxSprintf(buf, _T("%s.dat"), file_name);
{
wxSprintf(error_buf, _T("Data file %s not found."), buf);
PoetryError(error_buf);
- return FALSE;
+ return false;
}
if (position > -1)
fseek(data_file, data, SEEK_SET);
- ch = 0;
- i = 0;
+ int ch = 0;
+ int i = 0;
while ((ch != EOF) && (ch != '#'))
{
ch = getc(data_file);
i++;
}
- poem_buffer[i] = ch;
+ poem_buffer[i] = (wxChar)ch;
i ++;
if (i == buf_size)
{
wxSprintf(error_buf, _T("%s"), _T("Poetry buffer exceeded."));
PoetryError(error_buf);
- return FALSE;
+ return false;
}
}
fclose(data_file);
poem_buffer[i-1] = 0;
- return TRUE;
+ return true;
}
// Do the search
long MainWindow::DoSearch(void)
{
if (!search_string)
- return FALSE;
+ return false;
FILE *file;
long i = 0;
long find_start;
long previous_poem_start;
- bool found = FALSE;
+ bool found = false;
int search_length = wxStrlen(search_string);
if (same_search)
{
wxSprintf(error_buf, _T("Poetry data file %s not found\n"), buf);
PoetryError(error_buf);
- return FALSE;
+ return false;
}
fseek(file, find_start, SEEK_SET);
while ((ch != EOF) && !found)
{
ch = getc(file);
- ch |= 0x0020; // Make lower case
+ ch = wxTolower(ch); // Make lower case
// Only match if we're looking at a different poem
// (no point in displaying the same poem again)
if (i == 0)
last_find = ftell(file);
if (i == search_length-1)
- found = TRUE;
+ found = true;
i ++;
}
else
bool Compile(void)
{
FILE *file;
- long i = 0;
int j;
- int ch = 0;
+ int ch;
wxChar buf[100];
if (data_filename)
{
wxSprintf(error_buf, _T("Poetry data file %s not found\n"), buf);
PoetryError(error_buf);
- return FALSE;
+ return false;
}
nitems = 0;
nitems ++;
// Do rest
- while (ch != EOF)
- {
+
+ do {
ch = getc(file);
- i ++;
if (ch == '#')
{
ch = getc(file);
poem_index[nitems] = data;
nitems ++;
}
- }
+ } while (ch != EOF);
fclose(file);
if (index_filename)
{
wxSprintf(error_buf, _T("Poetry index file %s cannot be created\n"), buf);
PoetryError(error_buf);
- return FALSE;
+ return false;
}
wxFprintf(file, _T("%ld\n\n"), nitems);
fclose(file);
PoetryNotify(_T("Poetry index compiled."));
- return TRUE;
+ return true;
}
void MainWindow::OnPopup(wxCommandEvent& event)
break;
case POEM_SEARCH:
// Search - with dialog
- TheMainWindow->Search(TRUE);
+ TheMainWindow->Search(true);
break;
case POEM_NEXT_MATCH:
// Search - without dialog (next match)
- TheMainWindow->Search(FALSE);
+ TheMainWindow->Search(false);
break;
case POEM_MINIMIZE:
- TheMainWindow->Iconize(TRUE);
+ TheMainWindow->Iconize(true);
break;
-#ifdef __WXMSW__
+#if wxUSE_CLIPBOARD
case POEM_COPY:
- // Copy current poem to the clipboard
- CopyToClipboard((HWND) TheMainWindow->GetHWND(), poem_buffer);
+ 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;
#endif
case POEM_COMPILE:
}
break;
}
- case POEM_HELP_CONTENTS:
- {
-#if wxUSE_HELP
- HelpController->LoadFile(_T("wxpoem"));
- HelpController->DisplayContents();
-#endif // wxUSE_HELP
- break;
- }
case POEM_ABOUT:
{
(void)wxMessageBox(_T("wxPoem Version 1.1\nJulian Smart (c) 1995"),
}
case POEM_EXIT:
// Exit
- TheMainWindow->Close(TRUE);
+ TheMainWindow->Close(true);
break;
default:
break;