]>
git.saurik.com Git - wxWidgets.git/blob - demos/poem/wxpoem.cpp
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: A small C++ program which displays a random poem on
4 // execution. It also allows search for poems containing a
6 // It requires winpoem.dat and creates winpoem.idx.
7 // Original version (WinPoem) written in 1994.
8 // This has not been rewritten in a long time so
9 // beware, inelegant code!
10 // Author: Julian Smart
13 // Copyright: (c) 1998 Julian Smart
14 // Licence: wxWindows licence
15 /////////////////////////////////////////////////////////////////////////////
18 #pragma implementation "wxpoem.h"
21 // For compilers that support precompilation, includes "wx.h".
22 #include "wx/wxprec.h"
36 #if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXX11__)
37 #include "corner1.xpm"
38 #include "corner2.xpm"
39 #include "corner3.xpm"
40 #include "corner4.xpm"
55 #define buf_size 10000
56 #define DEFAULT_POETRY_DAT "wxpoem"
57 #define DEFAULT_POETRY_IND "wxpoem"
58 #define DEFAULT_CHAR_HEIGHT 18
59 #define DEFAULT_FONT "Swiss"
60 #define DEFAULT_X_POS 0
61 #define DEFAULT_Y_POS 0
62 #define BORDER_SIZE 30
63 #define THIN_LINE_BORDER 10
64 #define THICK_LINE_BORDER 16
65 #define THICK_LINE_WIDTH 2
66 #define SHADOW_OFFSET 1
70 static wxChar
*poem_buffer
; // Storage for each poem
71 static wxChar line
[150]; // Storage for a line
72 static wxChar title
[150]; // Remember the title
73 static wxChar
*search_string
= NULL
; // The search string
74 static int pages
[30]; // For multipage poems -
75 // store the start of each page
76 static long last_poem_start
= 0; // Start of last found poem
77 static long last_find
= -1; // Point in file of last found
79 static bool search_ok
= FALSE
; // Search was successful
80 static bool same_search
= FALSE
; // Searching on same string
82 static long poem_index
[600]; // Index of poem starts
83 static long nitems
= 0; // Number of poems
84 static int char_height
= DEFAULT_CHAR_HEIGHT
; // Actual height
85 static int index_ptr
= -1; // Pointer into index
86 static int poem_height
, poem_width
; // Size of poem
87 static int XPos
; // Startup X position
88 static int YPos
; // Startup Y position
89 static int pointSize
= 12; // Font size
91 static wxChar
*index_filename
= NULL
; // Index filename
92 static wxChar
*data_filename
= NULL
; // Data filename
93 static wxChar error_buf
[300]; // Error message buffer
94 static bool loaded_ok
= FALSE
; // Poem loaded ok
95 static bool index_ok
= FALSE
; // Index loaded ok
97 static bool paging
= FALSE
; // Are we paging?
98 static int current_page
= 0; // Currently viewed page
100 wxIcon
*Corner1
= NULL
;
101 wxIcon
*Corner2
= NULL
;
102 wxIcon
*Corner3
= NULL
;
103 wxIcon
*Corner4
= NULL
;
106 wxFont
*NormalFont
= NULL
;
107 wxFont
*BoldFont
= NULL
;
108 wxFont
*ItalicFont
= NULL
;
111 wxPen
*GreyPen
= NULL
;
112 wxPen
*DarkGreyPen
= NULL
;
113 wxPen
*WhitePen
= NULL
;
116 wxBitmap
*backingBitmap
= NULL
;
118 void PoetryError(wxChar
*, wxChar
*caption
=_T("wxPoem Error"));
119 void PoetryNotify(wxChar
*Msg
, wxChar
*caption
=_T("wxPoem"));
121 bool LoadPoem(wxChar
*, long);
123 int LoadIndex(wxChar
*);
125 void WritePreferences();
126 void ReadPreferences();
127 void FindMax(int *max_thing
, int thing
);
130 void CopyToClipboard(HWND
, wxChar
*);
133 wxMenu
*popupMenu
= NULL
;
136 wxHelpController
*HelpController
= NULL
;
141 MainWindow
*TheMainWindow
= NULL
;
146 NormalFont
= wxTheFontList
->FindOrCreateFont(pointSize
, wxSWISS
, wxNORMAL
, wxNORMAL
);
147 BoldFont
= wxTheFontList
->FindOrCreateFont(pointSize
, wxSWISS
, wxNORMAL
, wxBOLD
);
148 ItalicFont
= wxTheFontList
->FindOrCreateFont(pointSize
, wxSWISS
, wxITALIC
, wxNORMAL
);
151 BEGIN_EVENT_TABLE(MainWindow
, wxFrame
)
152 EVT_CLOSE(MainWindow::OnCloseWindow
)
153 EVT_CHAR(MainWindow::OnChar
)
154 EVT_MENU(-1, MainWindow::OnPopup
)
157 MainWindow::MainWindow(wxFrame
*frame
, wxWindowID id
, const wxString
& title
,
158 const wxPoint
& pos
, const wxSize
& size
, long style
):
159 wxFrame(frame
, id
, title
, pos
, size
, style
)
163 MainWindow::~MainWindow()
165 // Note: this must be done before the main window/canvas are destroyed
166 // or we get an error (no parent window for menu item button)
171 // Read the poetry buffer, either for finding the size
172 // or for writing to a bitmap (not to the window directly,
173 // since that displays messily)
174 // If DrawIt is true, we draw, otherwise we just determine the
175 // size the window should be.
176 void MainWindow::ScanBuffer(wxDC
*dc
, bool DrawIt
, int *max_x
, int *max_y
)
178 int i
= pages
[current_page
];
185 bool page_break
= FALSE
;
192 y
= (*max_y
- poem_height
)/2;
197 if (DrawIt
&& wxColourDisplay())
199 dc
->SetBrush(*wxLIGHT_GREY_BRUSH
);
200 dc
->SetPen(*GreyPen
);
201 dc
->DrawRectangle(0, 0, width
, height
);
202 dc
->SetBackgroundMode(wxTRANSPARENT
);
205 // See what ACTUAL char height is
206 dc
->SetFont(* NormalFont
);
209 dc
->GetTextExtent(_T("X"), &xx
, &yy
);
210 char_height
= (int)yy
;
212 if (current_page
== 0)
214 else if (title
[0] != 0)
216 dc
->SetFont(* BoldFont
);
217 dc
->GetTextExtent(title
, &xx
, &yy
);
218 FindMax(&curr_width
, (int)xx
);
223 dc
->SetFont(* BoldFont
);
225 // Change text to BLACK!
226 dc
->SetTextForeground(* wxBLACK
);
227 dc
->DrawText(title
, x
, y
);
228 // Change text to WHITE!
229 dc
->SetTextForeground(* wxWHITE
);
230 dc
->DrawText(title
, x
-SHADOW_OFFSET
, y
-SHADOW_OFFSET
);
236 while (ch
!= 0 && !page_break
)
239 #if defined(__WXMSW__) || defined(__WXMAC__)
240 while (((ch
= poem_buffer
[i
]) != 13) && (ch
!= 0))
242 while (((ch
= poem_buffer
[i
]) != 10) && (ch
!= 0))
250 #if defined(__WXMSW__) || defined(__WXMAC__)
258 #if defined(__WXMSW__) || defined(__WXMAC__)
259 // Add another to skip the linefeed
262 // If a single newline on its own, put a space in
284 dc
->SetFont(* BoldFont
);
287 wxStrcpy(title
, line_ptr
);
288 wxStrcat(title
, _T(" (cont'd)"));
290 dc
->GetTextExtent(line_ptr
, &xx
, &yy
);
291 FindMax(&curr_width
, (int)xx
);
296 dc
->SetFont(* BoldFont
);
298 // Change text to BLACK!
299 dc
->SetTextForeground(* wxBLACK
);
300 dc
->DrawText(line_ptr
, x
, y
);
302 // Change text to WHITE!
303 dc
->SetTextForeground(* wxWHITE
);
304 dc
->DrawText(line_ptr
, x
-SHADOW_OFFSET
, y
-SHADOW_OFFSET
);
305 dc
->SetTextForeground(* wxWHITE
);
311 dc
->SetFont(* ItalicFont
);
313 dc
->GetTextExtent(line_ptr
, &xx
, &yy
);
314 FindMax(&curr_width
, (int)xx
);
319 dc
->SetTextForeground(* wxBLACK
);
320 dc
->DrawText(line_ptr
, x
, y
);
324 // Default: just ignore this line
331 dc
->SetFont(* NormalFont
);
333 dc
->GetTextExtent(line
, &xx
, &yy
);
334 FindMax(&curr_width
, (int)xx
);
338 int x
= (int)((width
- xx
)/2.0);
339 dc
->SetFont(* NormalFont
);
340 dc
->SetTextForeground(* wxBLACK
);
341 dc
->DrawText(line
, x
, y
);
351 wxChar
*cont
= _T("(cont'd)");
353 dc
->SetFont(* NormalFont
);
355 dc
->GetTextExtent(cont
, &xx
, &yy
);
356 FindMax(&curr_width
, (int)xx
);
359 int x
= (int)((width
- xx
)/2.0);
360 dc
->SetFont(* NormalFont
);
361 dc
->SetTextForeground(* wxBLACK
);
362 dc
->DrawText(cont
, x
, y
);
367 *max_x
= (int)curr_width
;
368 *max_y
= (int)(y
-char_height
);
371 pages
[current_page
+1] = i
;
377 // Draw dark grey thick border
378 if (wxColourDisplay())
380 dc
->SetBrush(*wxGREY_BRUSH
);
381 dc
->SetPen(*wxGREY_PEN
);
384 dc
->DrawRectangle(0, 0, THIN_LINE_BORDER
, height
);
386 dc
->DrawRectangle(THIN_LINE_BORDER
, 0, width
-THIN_LINE_BORDER
, THIN_LINE_BORDER
);
388 dc
->DrawRectangle(width
-THIN_LINE_BORDER
, THIN_LINE_BORDER
, width
, height
-THIN_LINE_BORDER
);
390 dc
->DrawRectangle(THIN_LINE_BORDER
, height
-THIN_LINE_BORDER
, width
-THIN_LINE_BORDER
, height
);
393 // Have grey background, plus 3-d border -
394 // One black rectangle.
395 // Inside this, left and top sides - dark grey. Bottom and right -
398 // Change pen to black
399 dc
->SetPen(*wxBLACK_PEN
);
400 dc
->DrawLine(THIN_LINE_BORDER
, THIN_LINE_BORDER
, width
-THIN_LINE_BORDER
, THIN_LINE_BORDER
);
401 dc
->DrawLine(width
-THIN_LINE_BORDER
, THIN_LINE_BORDER
, width
-THIN_LINE_BORDER
, height
-THIN_LINE_BORDER
);
402 dc
->DrawLine(width
-THIN_LINE_BORDER
, height
-THIN_LINE_BORDER
, THIN_LINE_BORDER
, height
-THIN_LINE_BORDER
);
403 dc
->DrawLine(THIN_LINE_BORDER
, height
-THIN_LINE_BORDER
, THIN_LINE_BORDER
, THIN_LINE_BORDER
);
405 // Right and bottom white lines - 'grey' (black!) if
406 // we're running on a mono display.
407 if (wxColourDisplay())
408 dc
->SetPen(*WhitePen
);
410 dc
->SetPen(*DarkGreyPen
);
412 dc
->DrawLine(width
-THICK_LINE_BORDER
, THICK_LINE_BORDER
,
413 width
-THICK_LINE_BORDER
, height
-THICK_LINE_BORDER
);
414 dc
->DrawLine(width
-THICK_LINE_BORDER
, height
-THICK_LINE_BORDER
,
415 THICK_LINE_BORDER
, height
-THICK_LINE_BORDER
);
417 // Left and top grey lines
418 dc
->SetPen(*DarkGreyPen
);
419 dc
->DrawLine(THICK_LINE_BORDER
, height
-THICK_LINE_BORDER
,
420 THICK_LINE_BORDER
, THICK_LINE_BORDER
);
421 dc
->DrawLine(THICK_LINE_BORDER
, THICK_LINE_BORDER
,
422 width
-THICK_LINE_BORDER
, THICK_LINE_BORDER
);
426 dc
->DrawIcon(* Corner1
, 0, 0);
427 dc
->DrawIcon(* Corner2
, int(width
-32), 0);
429 int y2
= height
- 32;
431 dc
->DrawIcon(* Corner3
, 0, y2
);
432 dc
->DrawIcon(* Corner4
, x2
, y2
);
437 // Get an index (randomly generated) and load the poem
438 void MainWindow::GetIndexLoadPoem(void)
441 index_ptr
= GetIndex();
444 loaded_ok
= LoadPoem(data_filename
, -1);
447 // Find the size of the poem and resize the window accordingly
448 void MainWindow::Resize(void)
450 wxClientDC
dc(canvas
);
453 ScanBuffer(& dc
, FALSE
, &poem_width
, &poem_height
);
454 int x
= poem_width
+ (2*BORDER_SIZE
);
455 int y
= poem_height
+ (2*BORDER_SIZE
);
459 // In case client size isn't what we set it to...
461 GetClientSize(&xx
, &yy
);
464 if (backingBitmap
) delete backingBitmap
;
465 backingBitmap
= new wxBitmap(x
, yy
);
466 memDC
.SelectObject(* backingBitmap
);
469 TheMainWindow
->ScanBuffer(&memDC
, TRUE
, &xx
, &yy
);
473 void FindMax(int *max_thing
, int thing
)
475 if (thing
> *max_thing
)
480 void MainWindow::NextPage(void)
493 void MainWindow::PreviousPage(void)
495 if (current_page
> 0)
502 // Search for a string
503 void MainWindow::Search(bool ask
)
507 if (ask
|| !search_string
)
509 wxString s
= wxGetTextFromUser( _T("Enter search string"), _T("Search"), (const wxChar
*) search_string
);
510 if (s
!= wxEmptyString
)
512 if (search_string
) delete[] search_string
;
513 search_string
= copystring(s
);
515 } else search_ok
= FALSE
;
523 if (search_string
&& search_ok
)
525 position
= DoSearch();
528 loaded_ok
= LoadPoem(data_filename
, position
);
534 PoetryNotify(_T("Search string not found."));
539 // Copy a string to the clipboard
541 void CopyToClipboard(HWND handle
, wxChar
*s
)
543 int length
= wxStrlen(s
);
544 HANDLE hGlobalMemory
= GlobalAlloc(GHND
, (DWORD
) length
+ 1);
547 #ifdef __WINDOWS_386__
548 LPSTR lpGlobalMemory
= MK_FP32(GlobalLock(hGlobalMemory
));
550 LPSTR lpGlobalMemory
= (LPSTR
)GlobalLock(hGlobalMemory
);
553 for (i
= 0; i
< length
; i
++)
571 lpGlobalMemory
[j
] = s
[i
];
576 GlobalUnlock(hGlobalMemory
);
577 OpenClipboard(handle
);
579 SetClipboardData(CF_TEXT
, hGlobalMemory
);
587 poem_buffer
= new wxChar
[buf_size
];
589 GreyPen
= new wxPen(_T("LIGHT GREY"), THICK_LINE_WIDTH
, wxSOLID
);
590 DarkGreyPen
= new wxPen(_T("GREY"), THICK_LINE_WIDTH
, wxSOLID
);
591 WhitePen
= new wxPen(_T("WHITE"), THICK_LINE_WIDTH
, wxSOLID
);
594 HelpController
= new wxHelpController();
595 HelpController
->Initialize(_T("wxpoem"));
602 // Seed the random number generator
605 (void)time(¤t_time
);
606 srand((unsigned int)current_time
);
611 TheMainWindow
= new MainWindow(NULL
, 500, _T("wxPoem"), wxPoint(XPos
, YPos
), wxSize(100, 100), wxCAPTION
|wxMINIMIZE_BOX
|wxSYSTEM_MENU
);
614 TheMainWindow
->SetIcon(Icon(_T("wxpoem")));
617 TheMainWindow
->canvas
= new MyCanvas(TheMainWindow
, 501, wxDefaultPosition
, wxDefaultSize
);
619 popupMenu
= new wxMenu
;
620 popupMenu
->Append(POEM_NEXT
, _T("Next poem/page"));
621 popupMenu
->Append(POEM_PREVIOUS
, _T("Previous page"));
622 popupMenu
->AppendSeparator();
623 popupMenu
->Append(POEM_SEARCH
, _T("Search"));
624 popupMenu
->Append(POEM_NEXT_MATCH
, _T("Next match"));
625 popupMenu
->Append(POEM_COPY
, _T("Copy to clipboard"));
626 popupMenu
->Append(POEM_MINIMIZE
, _T("Minimize"));
627 popupMenu
->AppendSeparator();
628 popupMenu
->Append(POEM_BIGGER_TEXT
, _T("Bigger text"));
629 popupMenu
->Append(POEM_SMALLER_TEXT
, _T("Smaller text"));
630 popupMenu
->AppendSeparator();
631 popupMenu
->Append(POEM_ABOUT
, _T("About wxPoem"));
632 popupMenu
->AppendSeparator();
633 popupMenu
->Append(POEM_EXIT
, _T("Exit"));
637 index_filename
= copystring(argv
[1]);
638 data_filename
= copystring(argv
[1]);
642 index_filename
= _T(DEFAULT_POETRY_IND
);
643 data_filename
= _T(DEFAULT_POETRY_DAT
);
648 Corner1
= new wxIcon(_T("icon_1"));
649 Corner2
= new wxIcon(_T("icon_2"));
650 Corner3
= new wxIcon(_T("icon_3"));
651 Corner4
= new wxIcon(_T("icon_4"));
653 #if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXX11__)
654 Corner1
= new wxIcon( corner1_xpm
);
655 Corner2
= new wxIcon( corner2_xpm
);
656 Corner3
= new wxIcon( corner3_xpm
);
657 Corner4
= new wxIcon( corner4_xpm
);
660 TheMainWindow
->GetIndexLoadPoem();
661 TheMainWindow
->Resize();
662 TheMainWindow
->Show(TRUE
);
670 delete backingBitmap
;
672 delete HelpController
;
683 // Causes crash since they're deleted by the global font list
690 delete[] poem_buffer
;
692 delete[] search_string
;
697 void MainWindow::OnCloseWindow(wxCloseEvent
& WXUNUSED(event
))
703 void MainWindow::OnChar(wxKeyEvent
& event
)
705 canvas
->OnChar(event
);
708 BEGIN_EVENT_TABLE(MyCanvas
, wxWindow
)
709 EVT_MOUSE_EVENTS(MyCanvas::OnMouseEvent
)
710 EVT_CHAR(MyCanvas::OnChar
)
711 EVT_PAINT(MyCanvas::OnPaint
)
714 // Define a constructor for my canvas
715 MyCanvas::MyCanvas(wxFrame
*frame
, wxWindowID id
, const wxPoint
& pos
, const wxSize
& size
):
716 wxWindow(frame
, id
, pos
, size
)
720 // Define the repainting behaviour
721 void MyCanvas::OnPaint(wxPaintEvent
& WXUNUSED(event
))
728 TheMainWindow
->GetClientSize(&xx
, &yy
);
730 dc
.DrawBitmap(* backingBitmap
, 0, 0);
733 memDC
.SelectObject(* backingBitmap
);
734 dc
.Blit(0, 0, backingBitmap
->GetWidth(), backingBitmap
->GetHeight(), &memDC
, 0, 0);
739 void MyCanvas::OnMouseEvent(wxMouseEvent
& event
)
741 static int startPosX
, startPosY
, startFrameX
, startFrameY
;
744 event
.GetPosition(&x
, &y
);
746 if (event
.RightDown())
748 // Versions from wxWin 1.67 are probably OK
749 PopupMenu(popupMenu
, (int)x
, (int)y
);
751 else if (event
.LeftDown())
753 this->CaptureMouse();
756 ClientToScreen(&x1
, &y1
);
759 GetParent()->GetPosition(&startFrameX
, &startFrameY
);
761 else if (event
.LeftUp())
762 this->ReleaseMouse();
763 else if (event
.Dragging() && event
.LeftIsDown())
767 ClientToScreen(&x1
, &y1
);
769 int dX
= x1
- startPosX
;
770 int dY
= y1
- startPosY
;
771 GetParent()->Move(startFrameX
+ dX
, startFrameY
+ dY
);
775 // Process characters
776 void MyCanvas::OnChar(wxKeyEvent
& event
)
778 switch (event
.KeyCode())
783 TheMainWindow
->Search(FALSE
);
788 TheMainWindow
->Search(TRUE
);
792 TheMainWindow
->NextPage();
795 TheMainWindow
->Close(TRUE
);
802 int LoadIndex(wxChar
*file_name
)
810 if (file_name
== NULL
)
813 wxSprintf(buf
, _T("%s.idx"), file_name
);
815 index_file
= wxFopen(buf
, _T("r"));
816 if (index_file
== NULL
)
819 wxFscanf(index_file
, _T("%ld"), &nitems
);
821 for (i
= 0; i
< nitems
; i
++)
823 wxFscanf(index_file
, _T("%ld"), &data
);
824 poem_index
[i
] = data
;
837 indexn
= (int)(rand() % nitems
);
839 if ((indexn
< 0) || (indexn
> nitems
))
840 { PoetryError(_T("No such poem!"));
848 void ReadPreferences()
851 wxGetResource(_T("wxPoem"), _T("FontSize"), &pointSize
);
852 wxGetResource(_T("wxPoem"), _T("X"), &XPos
);
853 wxGetResource(_T("wxPoem"), _T("Y"), &YPos
);
857 // Write preferences to disk
858 void WritePreferences()
861 TheMainWindow
->GetPosition(&XPos
, &YPos
);
863 wxWriteResource(_T("wxPoem"), _T("FontSize"), pointSize
);
864 wxWriteResource(_T("wxPoem"), _T("X"), XPos
);
865 wxWriteResource(_T("wxPoem"), _T("Y"), YPos
);
870 // Load a poem from given file, at given point in file.
871 // If position is > -1, use this for the position in the
872 // file, otherwise use index[index_ptr] to find the correct position.
873 bool LoadPoem(wxChar
*file_name
, long position
)
886 if (file_name
== NULL
)
888 wxSprintf(error_buf
, _T("Error in Poem loading."));
889 PoetryError(error_buf
);
893 wxSprintf(buf
, _T("%s.dat"), file_name
);
894 data_file
= wxFopen(buf
, _T("r"));
896 if (data_file
== NULL
)
898 wxSprintf(error_buf
, _T("Data file %s not found."), buf
);
899 PoetryError(error_buf
);
906 data
= poem_index
[index_ptr
];
908 fseek(data_file
, data
, SEEK_SET
);
912 while ((ch
!= EOF
) && (ch
!= '#'))
914 ch
= getc(data_file
);
915 // Add a linefeed so it will copy to the clipboard ok
927 wxSprintf(error_buf
, _T("%s"), _T("Poetry buffer exceeded."));
928 PoetryError(error_buf
);
933 poem_buffer
[i
-1] = 0;
938 long MainWindow::DoSearch(void)
948 long previous_poem_start
;
951 int search_length
= wxStrlen(search_string
);
955 find_start
= last_find
+ 1;
956 previous_poem_start
= last_poem_start
;
962 previous_poem_start
= -1;
966 wxSprintf(buf
, _T("%s.dat"), data_filename
);
968 file
= wxFopen(buf
, _T("r"));
969 if (! (data_filename
&& file
))
971 wxSprintf(error_buf
, _T("Poetry data file %s not found\n"), buf
);
972 PoetryError(error_buf
);
976 fseek(file
, find_start
, SEEK_SET
);
978 while ((ch
!= EOF
) && !found
)
981 ch
|= 0x0020; // Make lower case
983 // Only match if we're looking at a different poem
984 // (no point in displaying the same poem again)
985 if ((ch
== search_string
[i
]) && (last_poem_start
!= previous_poem_start
))
988 last_find
= ftell(file
);
989 if (i
== search_length
-1)
999 last_poem_start
= ftell(file
);
1008 return last_poem_start
;
1014 // Set up poetry filenames, preferences, load the index
1015 // Load index (or compile it if none found)
1018 index_ok
= (LoadIndex(index_filename
) != 0);
1019 if (!index_ok
|| (nitems
== 0))
1021 PoetryError(_T("Index file not found; will compile new one"), _T("wxPoem"));
1022 index_ok
= Compile();
1027 void PoetryError(wxChar
*msg
, wxChar
*caption
)
1029 wxMessageBox(msg
, caption
, wxOK
|wxICON_EXCLAMATION
);
1032 // Notification (change icon to something appropriate!)
1033 void PoetryNotify(wxChar
*Msg
, wxChar
*caption
)
1035 wxMessageBox(Msg
, caption
, wxOK
| wxICON_INFORMATION
);
1038 // Build up and save an index into the poetry data file, for
1039 // rapid random access
1049 wxSprintf(buf
, _T("%s.dat"), data_filename
);
1051 file
= wxFopen(buf
, _T("r"));
1052 if (! (data_filename
&& file
))
1054 wxSprintf(error_buf
, _T("Poetry data file %s not found\n"), buf
);
1055 PoetryError(error_buf
);
1062 poem_index
[nitems
] = 0;
1075 poem_index
[nitems
] = data
;
1082 wxSprintf(buf
, _T("%s.idx"), index_filename
);
1084 file
= wxFopen(buf
, _T("w"));
1085 if (! (data_filename
&& file
))
1087 wxSprintf(error_buf
, _T("Poetry index file %s cannot be created\n"), buf
);
1088 PoetryError(error_buf
);
1092 wxFprintf(file
, _T("%ld\n\n"), nitems
);
1093 for (j
= 0; j
< nitems
; j
++)
1094 wxFprintf(file
, _T("%ld\n"), poem_index
[j
]);
1097 PoetryNotify(_T("Poetry index compiled."));
1101 void MainWindow::OnPopup(wxCommandEvent
& event
)
1103 switch (event
.GetId())
1106 // Another poem/page
1107 TheMainWindow
->NextPage();
1111 TheMainWindow
->PreviousPage();
1114 // Search - with dialog
1115 TheMainWindow
->Search(TRUE
);
1117 case POEM_NEXT_MATCH
:
1118 // Search - without dialog (next match)
1119 TheMainWindow
->Search(FALSE
);
1122 TheMainWindow
->Iconize(TRUE
);
1126 // Copy current poem to the clipboard
1127 CopyToClipboard((HWND
) TheMainWindow
->GetHWND(), poem_buffer
);
1134 case POEM_BIGGER_TEXT
:
1138 TheMainWindow
->Resize();
1141 case POEM_SMALLER_TEXT
:
1147 TheMainWindow
->Resize();
1151 case POEM_HELP_CONTENTS
:
1154 HelpController
->LoadFile(_T("wxpoem"));
1155 HelpController
->DisplayContents();
1156 #endif // wxUSE_HELP
1161 (void)wxMessageBox(_T("wxPoem Version 1.1\nJulian Smart (c) 1995"),
1162 _T("About wxPoem"), wxOK
, TheMainWindow
);
1167 TheMainWindow
->Close(TRUE
);