]> git.saurik.com Git - wxWidgets.git/blame - utils/tex2rtf/src/tex2rtf.cpp
corrected Cygwin instructions
[wxWidgets.git] / utils / tex2rtf / src / tex2rtf.cpp
CommitLineData
9a29912f
JS
1/////////////////////////////////////////////////////////////////////////////
2// Name: tex2rtf.cpp
3// Purpose: Converts Latex to linear/WinHelp RTF, HTML, wxHelp.
4// Author: Julian Smart
b63b07a8
RL
5// Modified by: Wlodzimiez ABX Skiba 2003/2004 Unicode support
6// Ron Lee
9a29912f
JS
7// Created: 7.9.93
8// RCS-ID: $Id$
9// Copyright: (c) Julian Smart
10// Licence: wxWindows licence
11/////////////////////////////////////////////////////////////////////////////
12
13#ifdef __GNUG__
14#pragma implementation
15#endif
16
17// For compilers that support precompilation, includes "wx.h".
18#include "wx/wxprec.h"
19
20#ifdef __BORLANDC__
21#pragma hdrstop
22#endif
23
24#ifndef WX_PRECOMP
ea172e69
MB
25 #ifndef NO_GUI
26 #include "wx/menu.h"
27 #include "wx/textctrl.h"
28 #include "wx/filedlg.h"
29 #include "wx/msgdlg.h"
30 #endif
9a29912f
JS
31#endif
32
33#ifndef NO_GUI
e5486aff
WS
34 #include "wx/timer.h"
35 #include "wx/help.h"
36 #include "wx/cshelp.h"
37 #include "wx/helphtml.h"
38 #ifdef __WXMSW__
39 #include "wx/msw/helpchm.h"
40 #else
41 #include "wx/html/helpctrl.h"
42 #endif
43#endif // !NO_GUI
9a29912f 44
9a29912f
JS
45#if wxUSE_IOSTREAMH
46#include <iostream.h>
47#include <fstream.h>
48#else
49#include <iostream>
50#include <fstream>
51#endif
9a29912f
JS
52
53#include <ctype.h>
54#include <stdlib.h>
55#include "tex2any.h"
56#include "tex2rtf.h"
57#include "rtfutils.h"
56d34922 58#include "symbols.h"
9a29912f 59
7658b9eb 60#if (defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXX11__)) && !defined(NO_GUI)
9a29912f
JS
61#include "tex2rtf.xpm"
62#endif
63
ea172e69
MB
64#if !WXWIN_COMPATIBILITY_2_4
65static inline wxChar* copystring(const wxChar* s)
66 { return wxStrcpy(new wxChar[wxStrlen(s) + 1], s); }
67#endif
68
56d34922 69const float versionNo = TEX2RTF_VERSION_NUMBER;
9a29912f
JS
70
71TexChunk *currentMember = NULL;
b63b07a8 72bool startedSections = false;
6c155d33 73wxChar *contentsString = NULL;
b63b07a8
RL
74bool suppressNameDecoration = false;
75bool OkToClose = true;
9a29912f 76int passNumber = 1;
6a205442 77unsigned long errorCount = 0;
9a29912f
JS
78
79#ifndef NO_GUI
ffaaaacb 80
6c155d33
JS
81extern wxChar *BigBuffer;
82extern wxChar *TexFileRoot;
83extern wxChar *TexBibName; // Bibliography output file name
84extern wxChar *TexTmpBibName; // Temporary bibliography output file name
71599f0a
GT
85extern wxList ColourTable;
86extern TexChunk *TopLevel;
3924dd22 87
ffaaaacb 88#if wxUSE_HELP
e5486aff 89wxHelpControllerBase *HelpInstance = NULL;
ffaaaacb 90#endif // wxUSE_HELP
9a29912f
JS
91
92#ifdef __WXMSW__
6c155d33
JS
93static wxChar *ipc_buffer = NULL;
94static wxChar Tex2RTFLastStatus[100];
9a29912f 95Tex2RTFServer *TheTex2RTFServer = NULL;
e5486aff
WS
96#endif // __WXMSW__
97
98#endif // !NO_GUI
9a29912f 99
6c155d33 100wxChar *bulletFile = NULL;
9a29912f
JS
101
102FILE *Contents = NULL; // Contents page
103FILE *Chapters = NULL; // Chapters (WinHelp RTF) or rest of file (linear RTF)
104FILE *Sections = NULL;
105FILE *Subsections = NULL;
106FILE *Subsubsections = NULL;
107FILE *Popups = NULL;
108FILE *WinHelpContentsFile = NULL;
109
6c155d33
JS
110wxChar *InputFile = NULL;
111wxChar *OutputFile = NULL;
112wxChar *MacroFile = copystring(_T("tex2rtf.ini"));
9a29912f 113
6c155d33
JS
114wxChar *FileRoot = NULL;
115wxChar *ContentsName = NULL; // Contents page from last time around
116wxChar *TmpContentsName = NULL; // Current contents page
117wxChar *TmpFrameContentsName = NULL; // Current frame contents page
118wxChar *WinHelpContentsFileName = NULL; // WinHelp .cnt file
119wxChar *RefFileName = NULL; // Reference file name
9a29912f 120
6c155d33 121wxChar *RTFCharset = copystring(_T("ansi"));
9a29912f
JS
122
123#ifdef __WXMSW__
124int BufSize = 100; // Size of buffer in K
125#else
126int BufSize = 500;
127#endif
128
129bool Go(void);
130void ShowOptions(void);
131
6c155d33 132wxChar wxTex2RTFBuffer[1500];
c4c794e1 133
aed3314d 134#ifdef NO_GUI
b63b07a8 135 IMPLEMENT_APP_CONSOLE(MyApp)
9a29912f 136#else
b63b07a8
RL
137 wxMenuBar *menuBar = NULL;
138 MyFrame *frame = NULL;
139 // DECLARE_APP(MyApp)
140 IMPLEMENT_APP(MyApp)
141#endif
9a29912f
JS
142
143// `Main program' equivalent, creating windows and returning main app frame
144bool MyApp::OnInit()
9a29912f
JS
145{
146 // Use default list of macros defined in tex2any.cc
147 DefineDefaultMacros();
6c155d33 148 AddMacroDef(ltHARDY, _T("hardy"), 0);
9a29912f 149
6c155d33
JS
150 FileRoot = new wxChar[300];
151 ContentsName = new wxChar[300];
152 TmpContentsName = new wxChar[300];
153 TmpFrameContentsName = new wxChar[300];
154 WinHelpContentsFileName = new wxChar[300];
155 RefFileName = new wxChar[300];
9a29912f 156
b63b07a8 157 ColourTable.DeleteContents(true);
71599f0a 158
9a29912f 159 int n = 1;
ffaaaacb 160
9a29912f
JS
161 // Read input/output files
162 if (argc > 1)
163 {
164 if (argv[1][0] != '-')
165 {
166 InputFile = argv[1];
167 n ++;
168
169 if (argc > 2)
170 {
171 if (argv[2][0] != '-')
172 {
173 OutputFile = argv[2];
174 n ++;
175 }
176 }
177 }
178 }
179
180#ifdef NO_GUI
181 if (!InputFile || !OutputFile)
182 {
219f4a6d 183 wxSTD cout << "Tex2RTF: input or output file is missing.\n";
9a29912f
JS
184 ShowOptions();
185 exit(1);
186 }
187#endif
b63b07a8 188
9a29912f
JS
189 if (InputFile)
190 {
191 TexPathList.EnsureFileAccessible(InputFile);
192 }
193 if (!InputFile || !OutputFile)
b63b07a8 194 isInteractive = true;
9a29912f 195
f6bcfd97
BP
196 int i;
197 for (i = n; i < argc;)
9a29912f 198 {
6c155d33 199 if (wxStrcmp(argv[i], _T("-winhelp")) == 0)
9a29912f
JS
200 {
201 i ++;
202 convertMode = TEX_RTF;
b63b07a8 203 winHelp = true;
9a29912f
JS
204 }
205#ifndef NO_GUI
6c155d33 206 else if (wxStrcmp(argv[i], _T("-interactive")) == 0)
9a29912f
JS
207 {
208 i ++;
b63b07a8 209 isInteractive = true;
9a29912f
JS
210 }
211#endif
6c155d33 212 else if (wxStrcmp(argv[i], _T("-sync")) == 0) // Don't yield
9a29912f
JS
213 {
214 i ++;
b63b07a8 215 isSync = true;
9a29912f 216 }
6c155d33 217 else if (wxStrcmp(argv[i], _T("-rtf")) == 0)
9a29912f
JS
218 {
219 i ++;
220 convertMode = TEX_RTF;
221 }
6c155d33 222 else if (wxStrcmp(argv[i], _T("-html")) == 0)
9a29912f
JS
223 {
224 i ++;
225 convertMode = TEX_HTML;
226 }
6c155d33 227 else if (wxStrcmp(argv[i], _T("-xlp")) == 0)
9a29912f
JS
228 {
229 i ++;
230 convertMode = TEX_XLP;
231 }
6c155d33 232 else if (wxStrcmp(argv[i], _T("-twice")) == 0)
9a29912f
JS
233 {
234 i ++;
b63b07a8 235 runTwice = true;
9a29912f 236 }
6c155d33 237 else if (wxStrcmp(argv[i], _T("-macros")) == 0)
9a29912f
JS
238 {
239 i ++;
240 if (i < argc)
241 {
242 MacroFile = copystring(argv[i]);
243 i ++;
244 }
245 }
6c155d33 246 else if (wxStrcmp(argv[i], _T("-bufsize")) == 0)
9a29912f
JS
247 {
248 i ++;
249 if (i < argc)
250 {
6c155d33 251 BufSize = wxAtoi(argv[i]);
9a29912f
JS
252 i ++;
253 }
254 }
6c155d33 255 else if (wxStrcmp(argv[i], _T("-charset")) == 0)
9a29912f
JS
256 {
257 i ++;
258 if (i < argc)
259 {
6c155d33 260 wxChar *s = argv[i];
9a29912f 261 i ++;
6c155d33
JS
262 if (wxStrcmp(s, _T("ansi")) == 0 || wxStrcmp(s, _T("pc")) == 0 || wxStrcmp(s, _T("mac")) == 0 ||
263 wxStrcmp(s, _T("pca")) == 0)
9a29912f
JS
264 RTFCharset = copystring(s);
265 else
266 {
6c155d33 267 OnError(_T("Incorrect argument for -charset"));
b63b07a8 268 return false;
9a29912f
JS
269 }
270 }
271 }
6c155d33 272 else if (wxStrcmp(argv[i], _T("-checkcurleybraces")) == 0)
fad535ee
GT
273 {
274 i ++;
b63b07a8 275 checkCurleyBraces = true;
fad535ee 276 }
6c155d33 277 else if (wxStrcmp(argv[i], _T("-checksyntax")) == 0)
fad535ee
GT
278 {
279 i ++;
b63b07a8 280 checkSyntax = true;
fad535ee 281 }
9a29912f
JS
282 else
283 {
63ad540d 284 wxString buf;
6c155d33
JS
285 buf.Printf(_T("Invalid switch %s.\n"), argv[i]);
286 OnError((wxChar *)buf.c_str());
9a29912f
JS
287#ifdef NO_GUI
288 ShowOptions();
289 exit(1);
290#endif
b63b07a8 291 return false;
9a29912f
JS
292 }
293 }
294
295#if defined(__WXMSW__) && !defined(NO_GUI)
296 wxDDEInitialize();
297 Tex2RTFLastStatus[0] = 0; // DDE connection return value
298 TheTex2RTFServer = new Tex2RTFServer;
6c155d33 299 TheTex2RTFServer->Create(_T("TEX2RTF"));
9a29912f
JS
300#endif
301
9a29912f
JS
302 TexInitialize(BufSize);
303 ResetContentsLevels(0);
304
305#ifndef NO_GUI
306
307 if (isInteractive)
308 {
6c155d33 309 wxChar buf[100];
9a29912f
JS
310
311 // Create the main frame window
b63b07a8 312 frame = new MyFrame(NULL, wxID_ANY, _T("Tex2RTF"), wxDefaultPosition, wxSize(400, 300));
9a29912f
JS
313 frame->CreateStatusBar(2);
314
315 // Give it an icon
316 // TODO: uncomment this when we have tex2rtf.xpm
317 frame->SetIcon(wxICON(tex2rtf));
318
319 if (InputFile)
320 {
b63b07a8 321 wxSnprintf(buf, sizeof(buf), _T("Tex2RTF [%s]"), wxFileNameFromPath(InputFile));
9a29912f
JS
322 frame->SetTitle(buf);
323 }
324
325 // Make a menubar
326 wxMenu *file_menu = new wxMenu;
6c155d33
JS
327 file_menu->Append(TEX_GO, _T("&Go"), _T("Run converter"));
328 file_menu->Append(TEX_SET_INPUT, _T("Set &Input File"), _T("Set the LaTeX input file"));
329 file_menu->Append(TEX_SET_OUTPUT, _T("Set &Output File"), _T("Set the output file"));
9a29912f 330 file_menu->AppendSeparator();
6c155d33
JS
331 file_menu->Append(TEX_VIEW_LATEX, _T("View &LaTeX File"), _T("View the LaTeX input file"));
332 file_menu->Append(TEX_VIEW_OUTPUT, _T("View Output &File"), _T("View output file"));
333 file_menu->Append(TEX_SAVE_FILE, _T("&Save log file"), _T("Save displayed text into file"));
9a29912f 334 file_menu->AppendSeparator();
6c155d33 335 file_menu->Append(TEX_QUIT, _T("E&xit"), _T("Exit Tex2RTF"));
9a29912f
JS
336
337 wxMenu *macro_menu = new wxMenu;
338
6c155d33
JS
339 macro_menu->Append(TEX_LOAD_CUSTOM_MACROS, _T("&Load Custom Macros"), _T("Load custom LaTeX macro file"));
340 macro_menu->Append(TEX_VIEW_CUSTOM_MACROS, _T("View &Custom Macros"), _T("View custom LaTeX macros"));
9a29912f
JS
341
342 wxMenu *mode_menu = new wxMenu;
343
6c155d33
JS
344 mode_menu->Append(TEX_MODE_RTF, _T("Output linear &RTF"), _T("Wordprocessor-compatible RTF"));
345 mode_menu->Append(TEX_MODE_WINHELP, _T("Output &WinHelp RTF"), _T("WinHelp-compatible RTF"));
346 mode_menu->Append(TEX_MODE_HTML, _T("Output &HTML"), _T("HTML World Wide Web hypertext file"));
347 mode_menu->Append(TEX_MODE_XLP, _T("Output &XLP"), _T("wxHelp hypertext help file"));
9a29912f 348
fad535ee
GT
349 wxMenu *options_menu = new wxMenu;
350
c22b322f 351 options_menu->Append(TEX_OPTIONS_CURLEY_BRACE, _T("Curley brace matching"), _T("Checks for mismatched curley braces"),true);
b63b07a8 352 options_menu->Append(TEX_OPTIONS_SYNTAX_CHECKING, _T("Syntax checking"), _T("Syntax checking for common errors"),true);
fad535ee 353
c22b322f 354 options_menu->Check(TEX_OPTIONS_CURLEY_BRACE, checkCurleyBraces);
fad535ee
GT
355 options_menu->Check(TEX_OPTIONS_SYNTAX_CHECKING, checkSyntax);
356
9a29912f
JS
357 wxMenu *help_menu = new wxMenu;
358
6c155d33
JS
359 help_menu->Append(TEX_HELP, _T("&Help"), _T("Tex2RTF Contents Page"));
360 help_menu->Append(TEX_ABOUT, _T("&About Tex2RTF"), _T("About Tex2RTF"));
9a29912f
JS
361
362 menuBar = new wxMenuBar;
6c155d33
JS
363 menuBar->Append(file_menu, _T("&File"));
364 menuBar->Append(macro_menu, _T("&Macros"));
365 menuBar->Append(mode_menu, _T("&Conversion Mode"));
366 menuBar->Append(options_menu, _T("&Options"));
367 menuBar->Append(help_menu, _T("&Help"));
9a29912f
JS
368
369 frame->SetMenuBar(menuBar);
b63b07a8 370 frame->textWindow = new wxTextCtrl(frame, wxID_ANY, _T(""), wxDefaultPosition, wxDefaultSize, wxTE_READONLY|wxTE_MULTILINE);
9a29912f 371
6c155d33 372 (*frame->textWindow) << _T("Welcome to Tex2RTF.\n");
ffaaaacb 373// ShowOptions();
9a29912f 374
ffaaaacb 375#if wxUSE_HELP
e5486aff
WS
376#if wxUSE_MS_HTML_HELP && !defined(__WXUNIVERSAL__)
377 HelpInstance = new wxCHMHelpController;
378#else
379 HelpInstance = new wxHtmlHelpController;
380#endif
6c155d33 381 HelpInstance->Initialize(_T("tex2rtf"));
ffaaaacb 382#endif // wxUSE_HELP
9a29912f
JS
383
384 /*
385 * Read macro/initialisation file
386 *
387 */
ffaaaacb 388
6c155d33
JS
389 wxString path = TexPathList.FindValidPath(MacroFile);
390 if (path != _T(""))
391 ReadCustomMacros((wxChar *)path.c_str());
9a29912f 392
6c155d33 393 wxStrcpy(buf, _T("In "));
9a29912f
JS
394
395 if (winHelp && (convertMode == TEX_RTF))
6c155d33 396 wxStrcat(buf, _T("WinHelp RTF"));
9a29912f 397 else if (!winHelp && (convertMode == TEX_RTF))
6c155d33
JS
398 wxStrcat(buf, _T("linear RTF"));
399 else if (convertMode == TEX_HTML) wxStrcat(buf, _T("HTML"));
400 else if (convertMode == TEX_XLP) wxStrcat(buf, _T("XLP"));
401 wxStrcat(buf, _T(" mode."));
9a29912f 402 frame->SetStatusText(buf, 1);
ffaaaacb 403
b63b07a8
RL
404 frame->Show(true);
405 return true;
9a29912f
JS
406 }
407 else
408#endif // NO_GUI
409 {
410 /*
411 * Read macro/initialisation file
412 *
413 */
ffaaaacb 414
6c155d33
JS
415 wxString path = TexPathList.FindValidPath(MacroFile);
416 if (path != _T(""))
417 ReadCustomMacros((wxChar*)path.c_str());
9a29912f
JS
418
419 Go();
3924dd22
GT
420 if (runTwice)
421 {
422 Go();
423 }
9a29912f 424#ifdef NO_GUI
b63b07a8 425 return true;
9a29912f 426#else
00827094 427 OnExit(); // Do cleanup since OnExit won't be called now
b63b07a8 428 return false;
9a29912f
JS
429#endif
430 }
9a29912f
JS
431}
432
c4c794e1 433#ifndef NO_GUI
9a29912f
JS
434int MyApp::OnExit()
435{
ddc4f3b5 436 wxNode *node = CustomMacroList.GetFirst();
9a29912f
JS
437 while (node)
438 {
ddc4f3b5 439 CustomMacro *macro = (CustomMacro *)node->GetData();
9a29912f
JS
440 delete macro;
441 delete node;
ddc4f3b5 442 node = CustomMacroList.GetFirst();
9a29912f
JS
443 }
444 MacroDefs.BeginFind();
f6fe5318
MB
445 wxHashTable::Node* mNode = MacroDefs.Next();
446 while (mNode)
9a29912f 447 {
f6fe5318 448 TexMacroDef* def = (TexMacroDef*) mNode->GetData();
9a29912f 449 delete def;
f6fe5318 450 mNode = MacroDefs.Next();
9a29912f
JS
451 }
452 MacroDefs.Clear();
453#ifdef __WXMSW__
454 delete TheTex2RTFServer;
23016fdd 455 wxDDECleanUp();
9a29912f 456#endif
ffaaaacb
VZ
457
458#if wxUSE_HELP
9a29912f 459 delete HelpInstance;
ffaaaacb 460#endif // wxUSE_HELP
9a29912f 461
71599f0a
GT
462 if (BigBuffer)
463 {
464 delete BigBuffer;
465 BigBuffer = NULL;
466 }
467 if (currentArgData)
468 {
469 delete currentArgData;
470 currentArgData = NULL;
471 }
472 if (TexFileRoot)
473 {
474 delete TexFileRoot;
475 TexFileRoot = NULL;
476 }
477 if (TexBibName)
478 {
479 delete TexBibName;
480 TexBibName = NULL;
481 }
482 if (TexTmpBibName)
483 {
484 delete TexTmpBibName;
485 TexTmpBibName = NULL;
486 }
487 if (FileRoot)
488 {
489 delete FileRoot;
490 FileRoot = NULL;
491 }
492 if (ContentsName)
493 {
494 delete ContentsName;
495 ContentsName = NULL;
496 }
497 if (TmpContentsName)
498 {
499 delete TmpContentsName;
500 TmpContentsName = NULL;
501 }
502 if (TmpFrameContentsName)
503 {
504 delete TmpFrameContentsName;
505 TmpFrameContentsName = NULL;
506 }
507 if (WinHelpContentsFileName)
508 {
509 delete WinHelpContentsFileName;
510 WinHelpContentsFileName = NULL;
511 }
ad781c23 512 if (RefFileName)
71599f0a 513 {
ad781c23
GD
514 delete RefFileName;
515 RefFileName = NULL;
71599f0a
GT
516 }
517 if (TopLevel)
518 {
519 delete TopLevel;
520 TopLevel = NULL;
521 }
522 if (MacroFile)
523 {
524 delete MacroFile;
525 MacroFile = NULL;
526 }
527 if (RTFCharset)
528 {
529 delete RTFCharset;
530 RTFCharset = NULL;
531 }
532
3924dd22
GT
533 delete [] PageStyle;
534 delete [] BibliographyStyleString;
535 delete [] DocumentStyleString;
536 delete [] bitmapMethod;
537 delete [] backgroundColourString;
538 delete [] ContentsNameString;
539 delete [] AbstractNameString;
540 delete [] GlossaryNameString;
541 delete [] ReferencesNameString;
542 delete [] FiguresNameString;
543 delete [] TablesNameString;
544 delete [] FigureNameString;
545 delete [] TableNameString;
546 delete [] IndexNameString;
547 delete [] ChapterNameString;
548 delete [] SectionNameString;
549 delete [] SubsectionNameString;
550 delete [] SubsubsectionNameString;
551 delete [] UpNameString;
552 if (winHelpTitle)
553 delete[] winHelpTitle;
554
9a29912f
JS
555 // TODO: this simulates zero-memory leaks!
556 // Otherwise there are just too many...
12a44087 557#ifndef __WXGTK__
fad535ee 558#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
9a29912f 559 wxDebugContext::SetCheckpoint();
fad535ee 560#endif
12a44087 561#endif
9a29912f
JS
562
563 return 0;
564}
c4c794e1 565#endif
9a29912f
JS
566void ShowOptions(void)
567{
6c155d33 568 wxChar buf[100];
b63b07a8 569 wxSnprintf(buf, sizeof(buf), _T("Tex2RTF version %.2f"), versionNo);
9a29912f 570 OnInform(buf);
6c155d33
JS
571 OnInform(_T("Usage: tex2rtf [input] [output] [switches]\n"));
572 OnInform(_T("where valid switches are"));
610c6ded 573#ifndef NO_GUI
6c155d33 574 OnInform(_T(" -interactive"));
610c6ded 575#endif
6c155d33
JS
576 OnInform(_T(" -bufsize <size in K>"));
577 OnInform(_T(" -charset <pc | pca | ansi | mac> (default ansi)"));
578 OnInform(_T(" -twice"));
579 OnInform(_T(" -sync"));
580 OnInform(_T(" -checkcurleybraces"));
581 OnInform(_T(" -checksyntax"));
582 OnInform(_T(" -macros <filename>"));
583 OnInform(_T(" -winhelp"));
584 OnInform(_T(" -rtf"));
585 OnInform(_T(" -html"));
586 OnInform(_T(" -xlp\n"));
9a29912f
JS
587}
588
589#ifndef NO_GUI
590
591BEGIN_EVENT_TABLE(MyFrame, wxFrame)
592 EVT_CLOSE(MyFrame::OnCloseWindow)
593 EVT_MENU(TEX_QUIT, MyFrame::OnExit)
594 EVT_MENU(TEX_GO, MyFrame::OnGo)
595 EVT_MENU(TEX_SET_INPUT, MyFrame::OnSetInput)
596 EVT_MENU(TEX_SET_OUTPUT, MyFrame::OnSetOutput)
597 EVT_MENU(TEX_SAVE_FILE, MyFrame::OnSaveFile)
598 EVT_MENU(TEX_VIEW_LATEX, MyFrame::OnViewLatex)
599 EVT_MENU(TEX_VIEW_OUTPUT, MyFrame::OnViewOutput)
600 EVT_MENU(TEX_VIEW_CUSTOM_MACROS, MyFrame::OnShowMacros)
601 EVT_MENU(TEX_LOAD_CUSTOM_MACROS, MyFrame::OnLoadMacros)
602 EVT_MENU(TEX_MODE_RTF, MyFrame::OnModeRTF)
603 EVT_MENU(TEX_MODE_WINHELP, MyFrame::OnModeWinHelp)
604 EVT_MENU(TEX_MODE_HTML, MyFrame::OnModeHTML)
605 EVT_MENU(TEX_MODE_XLP, MyFrame::OnModeXLP)
c22b322f 606 EVT_MENU(TEX_OPTIONS_CURLEY_BRACE, MyFrame::OnOptionsCurleyBrace)
fad535ee 607 EVT_MENU(TEX_OPTIONS_SYNTAX_CHECKING, MyFrame::OnOptionsSyntaxChecking)
9a29912f
JS
608 EVT_MENU(TEX_HELP, MyFrame::OnHelp)
609 EVT_MENU(TEX_ABOUT, MyFrame::OnAbout)
610END_EVENT_TABLE()
611
612// My frame constructor
613MyFrame::MyFrame(wxFrame *frame, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size):
614 wxFrame(frame, id, title, pos, size)
615{}
616
6c155d33 617void MyFrame::OnCloseWindow(wxCloseEvent& WXUNUSED(event))
9a29912f
JS
618{
619 if (!stopRunning && !OkToClose)
620 {
b63b07a8
RL
621 stopRunning = true;
622 runTwice = false;
9a29912f
JS
623 return;
624 }
625 else if (OkToClose)
626 {
9a29912f
JS
627 this->Destroy();
628 }
629}
630
6c155d33 631void MyFrame::OnExit(wxCommandEvent& WXUNUSED(event))
9a29912f 632{
71599f0a
GT
633 Close();
634// this->Destroy();
9a29912f
JS
635}
636
6c155d33 637void MyFrame::OnGo(wxCommandEvent& WXUNUSED(event))
9a29912f 638{
f6bcfd97 639 passNumber = 1;
63ad540d 640 errorCount = 0;
b63b07a8
RL
641 menuBar->EnableTop(0, false);
642 menuBar->EnableTop(1, false);
643 menuBar->EnableTop(2, false);
644 menuBar->EnableTop(3, false);
9a29912f 645 textWindow->Clear();
b63b07a8 646 Tex2RTFYield(true);
9a29912f
JS
647 Go();
648
04b9c5bb
GT
649 if (stopRunning)
650 {
6c155d33 651 SetStatusText(_T("Build aborted!"));
04b9c5bb 652 wxString errBuf;
6c155d33
JS
653 errBuf.Printf(_T("\nErrors encountered during this pass: %lu\n"), errorCount);
654 OnInform((wxChar *)errBuf.c_str());
04b9c5bb
GT
655 }
656
657
658 if (runTwice && !stopRunning)
9a29912f 659 {
b63b07a8 660 Tex2RTFYield(true);
9a29912f
JS
661 Go();
662 }
b63b07a8
RL
663 menuBar->EnableTop(0, true);
664 menuBar->EnableTop(1, true);
665 menuBar->EnableTop(2, true);
666 menuBar->EnableTop(3, true);
9a29912f
JS
667}
668
6c155d33 669void MyFrame::OnSetInput(wxCommandEvent& WXUNUSED(event))
9a29912f 670{
b63b07a8 671 ChooseInputFile(true);
9a29912f
JS
672}
673
6c155d33 674void MyFrame::OnSetOutput(wxCommandEvent& WXUNUSED(event))
9a29912f 675{
b63b07a8 676 ChooseOutputFile(true);
9a29912f
JS
677}
678
6c155d33 679void MyFrame::OnSaveFile(wxCommandEvent& WXUNUSED(event))
9a29912f 680{
6c155d33
JS
681 wxString s = wxFileSelector(_T("Save text to file"), _T(""), _T(""), _T("txt"), _T("*.txt"));
682 if (s != _T(""))
9a29912f
JS
683 {
684 textWindow->SaveFile(s);
6c155d33 685 wxChar buf[350];
b63b07a8 686 wxSnprintf(buf, sizeof(buf), _T("Saved text to %s"), (const wxChar*) s.c_str());
9a29912f
JS
687 frame->SetStatusText(buf, 0);
688 }
689}
690
6c155d33 691void MyFrame::OnViewOutput(wxCommandEvent& WXUNUSED(event))
9a29912f
JS
692{
693 ChooseOutputFile();
694 if (OutputFile && wxFileExists(OutputFile))
695 {
696 textWindow->LoadFile(OutputFile);
6c155d33 697 wxChar buf[300];
9a29912f 698 wxString str(wxFileNameFromPath(OutputFile));
b63b07a8 699 wxSnprintf(buf, sizeof(buf), _T("Tex2RTF [%s]"), (const wxChar*) str.c_str());
9a29912f
JS
700 frame->SetTitle(buf);
701 }
702}
703
6c155d33 704void MyFrame::OnViewLatex(wxCommandEvent& WXUNUSED(event))
9a29912f
JS
705{
706 ChooseInputFile();
707 if (InputFile && wxFileExists(InputFile))
708 {
709 textWindow->LoadFile(InputFile);
6c155d33 710 wxChar buf[300];
9a29912f 711 wxString str(wxFileNameFromPath(OutputFile));
b63b07a8 712 wxSnprintf(buf, sizeof(buf), _T("Tex2RTF [%s]"), (const wxChar*) str.c_str());
9a29912f
JS
713 frame->SetTitle(buf);
714 }
715}
716
6c155d33 717void MyFrame::OnLoadMacros(wxCommandEvent& WXUNUSED(event))
9a29912f
JS
718{
719 textWindow->Clear();
6c155d33
JS
720 wxString s = wxFileSelector(_T("Choose custom macro file"), wxPathOnly(MacroFile), wxFileNameFromPath(MacroFile), _T("ini"), _T("*.ini"));
721 if (s != _T("") && wxFileExists(s))
9a29912f
JS
722 {
723 MacroFile = copystring(s);
6c155d33 724 ReadCustomMacros((wxChar *)s.c_str());
9a29912f
JS
725 ShowCustomMacros();
726 }
727}
728
6c155d33 729void MyFrame::OnShowMacros(wxCommandEvent& WXUNUSED(event))
9a29912f
JS
730{
731 textWindow->Clear();
b63b07a8 732 Tex2RTFYield(true);
9a29912f
JS
733 ShowCustomMacros();
734}
735
6c155d33 736void MyFrame::OnModeRTF(wxCommandEvent& WXUNUSED(event))
9a29912f
JS
737{
738 convertMode = TEX_RTF;
b63b07a8 739 winHelp = false;
9a29912f
JS
740 InputFile = NULL;
741 OutputFile = NULL;
6c155d33 742 SetStatusText(_T("In linear RTF mode."), 1);
9a29912f
JS
743}
744
6c155d33 745void MyFrame::OnModeWinHelp(wxCommandEvent& WXUNUSED(event))
9a29912f
JS
746{
747 convertMode = TEX_RTF;
b63b07a8 748 winHelp = true;
9a29912f
JS
749 InputFile = NULL;
750 OutputFile = NULL;
6c155d33 751 SetStatusText(_T("In WinHelp RTF mode."), 1);
9a29912f
JS
752}
753
6c155d33 754void MyFrame::OnModeHTML(wxCommandEvent& WXUNUSED(event))
9a29912f
JS
755{
756 convertMode = TEX_HTML;
b63b07a8 757 winHelp = false;
9a29912f
JS
758 InputFile = NULL;
759 OutputFile = NULL;
6c155d33 760 SetStatusText(_T("In HTML mode."), 1);
9a29912f
JS
761}
762
6c155d33 763void MyFrame::OnModeXLP(wxCommandEvent& WXUNUSED(event))
9a29912f
JS
764{
765 convertMode = TEX_XLP;
766 InputFile = NULL;
767 OutputFile = NULL;
6c155d33 768 SetStatusText(_T("In XLP mode."), 1);
9a29912f
JS
769}
770
6c155d33 771void MyFrame::OnOptionsCurleyBrace(wxCommandEvent& WXUNUSED(event))
fad535ee
GT
772{
773 checkCurleyBraces = !checkCurleyBraces;
774 if (checkCurleyBraces)
775 {
6c155d33 776 SetStatusText(_T("Checking curley braces: YES"), 1);
fad535ee
GT
777 }
778 else
779 {
6c155d33 780 SetStatusText(_T("Checking curley braces: NO"), 1);
fad535ee
GT
781 }
782}
783
784
6c155d33 785void MyFrame::OnOptionsSyntaxChecking(wxCommandEvent& WXUNUSED(event))
fad535ee
GT
786{
787 checkSyntax = !checkSyntax;
788 if (checkSyntax)
789 {
6c155d33 790 SetStatusText(_T("Checking syntax: YES"), 1);
fad535ee
GT
791 }
792 else
793 {
6c155d33 794 SetStatusText(_T("Checking syntax: NO"), 1);
fad535ee
GT
795 }
796}
797
798
6c155d33 799void MyFrame::OnHelp(wxCommandEvent& WXUNUSED(event))
9a29912f 800{
ffaaaacb 801#if wxUSE_HELP
9a29912f
JS
802 HelpInstance->LoadFile();
803 HelpInstance->DisplayContents();
ffaaaacb 804#endif // wxUSE_HELP
9a29912f
JS
805}
806
6c155d33 807void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
9a29912f 808{
6c155d33 809 wxChar buf[300];
9a29912f 810#ifdef __WIN32__
6c155d33 811 wxChar *platform = _T(" (32-bit)");
9a29912f
JS
812#else
813#ifdef __WXMSW__
6c155d33 814 wxChar *platform = _T(" (16-bit)");
9a29912f 815#else
6c155d33 816 wxChar *platform = _T("");
9a29912f
JS
817#endif
818#endif
b63b07a8 819 wxSnprintf(buf, sizeof(buf), _T("Tex2RTF Version %.2f%s\nLaTeX to RTF, WinHelp, and HTML Conversion\n\n(c) Julian Smart, George Tasker and others, 1999-2002"), versionNo, platform);
6c155d33 820 wxMessageBox(buf, _T("About Tex2RTF"));
9a29912f
JS
821}
822
823void ChooseInputFile(bool force)
824{
825 if (force || !InputFile)
826 {
6c155d33
JS
827 wxString s = wxFileSelector(_T("Choose LaTeX input file"), wxPathOnly(InputFile), wxFileNameFromPath(InputFile), _T("tex"), _T("*.tex"));
828 if (s != _T(""))
9a29912f
JS
829 {
830 // Different file, so clear index entries.
831 ClearKeyWordTable();
832 ResetContentsLevels(0);
833 passNumber = 1;
63ad540d
GT
834 errorCount = 0;
835
9a29912f
JS
836 InputFile = copystring(s);
837 wxString str = wxFileNameFromPath(InputFile);
63ad540d 838 wxString buf;
6c155d33
JS
839 buf.Printf(_T("Tex2RTF [%s]"), str.c_str());
840 frame->SetTitle((wxChar *)buf.c_str());
9a29912f
JS
841 OutputFile = NULL;
842 }
843 }
844}
845
846void ChooseOutputFile(bool force)
847{
6c155d33
JS
848 wxChar extensionBuf[10];
849 wxChar wildBuf[10];
850 wxStrcpy(wildBuf, _T("*."));
aed0ed3c 851 wxString path;
9a29912f
JS
852 if (OutputFile)
853 path = wxPathOnly(OutputFile);
854 else if (InputFile)
855 path = wxPathOnly(InputFile);
ffaaaacb 856
9a29912f
JS
857 switch (convertMode)
858 {
859 case TEX_RTF:
860 {
6c155d33
JS
861 wxStrcpy(extensionBuf, _T("rtf"));
862 wxStrcat(wildBuf, _T("rtf"));
9a29912f
JS
863 break;
864 }
865 case TEX_XLP:
866 {
6c155d33
JS
867 wxStrcpy(extensionBuf, _T("xlp"));
868 wxStrcat(wildBuf, _T("xlp"));
9a29912f
JS
869 break;
870 }
871 case TEX_HTML:
872 {
6c155d33
JS
873 wxStrcpy(extensionBuf, _T("html"));
874 wxStrcat(wildBuf, _T("html"));
9a29912f
JS
875 break;
876 }
877 }
878 if (force || !OutputFile)
879 {
6c155d33 880 wxString s = wxFileSelector(_T("Choose output file"), path, wxFileNameFromPath(OutputFile),
9a29912f 881 extensionBuf, wildBuf);
6c155d33 882 if (s != _T(""))
9a29912f
JS
883 OutputFile = copystring(s);
884 }
885}
886#endif
887
888bool Go(void)
889{
890#ifndef NO_GUI
891 ChooseInputFile();
892 ChooseOutputFile();
893#endif
894
04b9c5bb 895 if (!InputFile || !OutputFile || stopRunning)
b63b07a8 896 return false;
9a29912f
JS
897
898#ifndef NO_GUI
899 if (isInteractive)
900 {
6c155d33 901 wxChar buf[300];
9a29912f
JS
902 wxString str = wxFileNameFromPath(InputFile);
903
b63b07a8 904 wxSnprintf(buf, sizeof(buf), _T("Tex2RTF [%s]"), (const wxChar*) str);
9a29912f
JS
905 frame->SetTitle(buf);
906 }
907
908 wxStartTimer();
909#endif
910
911 // Find extension-less filename
6c155d33 912 wxStrcpy(FileRoot, OutputFile);
9a29912f
JS
913 StripExtension(FileRoot);
914
915 if (truncateFilenames && convertMode == TEX_HTML)
916 {
917 // Truncate to five characters. This ensures that
918 // we can generate DOS filenames such as thing999. But 1000 files
919 // may not be enough, of course...
6c155d33 920 wxChar* sName = wxFileNameFromPath( FileRoot); // this Julian's method is non-destructive reference
9a29912f
JS
921
922 if(sName)
6c155d33 923 if(wxStrlen( sName) > 5)
9a29912f
JS
924 sName[5] = '\0'; // that should do!
925 }
ffaaaacb 926
b63b07a8
RL
927 wxSnprintf(ContentsName, 300, _T("%s.con"), FileRoot);
928 wxSnprintf(TmpContentsName, 300, _T("%s.cn1"), FileRoot);
929 wxSnprintf(TmpFrameContentsName, 300, _T("%s.frc"), FileRoot);
930 wxSnprintf(WinHelpContentsFileName, 300, _T("%s.cnt"), FileRoot);
931 wxSnprintf(RefFileName, 300, _T("%s.ref"), FileRoot);
9a29912f
JS
932
933 TexPathList.EnsureFileAccessible(InputFile);
934 if (!bulletFile)
935 {
6c155d33
JS
936 wxString s = TexPathList.FindValidPath(_T("bullet.bmp"));
937 if (s != _T(""))
9a29912f
JS
938 {
939 wxString str = wxFileNameFromPath(s);
940 bulletFile = copystring(str);
941 }
942 }
943
ad781c23
GD
944 if (wxFileExists(RefFileName))
945 ReadTexReferences(RefFileName);
ffaaaacb 946
b63b07a8 947 bool success = false;
9a29912f
JS
948
949 if (InputFile && OutputFile)
950 {
2b5f62a0 951 if (!wxFileExists(InputFile))
9a29912f 952 {
6c155d33 953 OnError(_T("Cannot open input file!"));
9a29912f 954 TexCleanUp();
b63b07a8 955 return false;
9a29912f
JS
956 }
957#ifndef NO_GUI
958 if (isInteractive)
959 {
63ad540d 960 wxString buf;
6c155d33
JS
961 buf.Printf(_T("Working, pass %d...Click CLOSE to abort"), passNumber);
962 frame->SetStatusText((wxChar *)buf.c_str());
9a29912f
JS
963 }
964#endif
b63b07a8 965 OkToClose = false;
6c155d33 966 OnInform(_T("Reading LaTeX file..."));
9a29912f
JS
967 TexLoadFile(InputFile);
968
04b9c5bb 969 if (stopRunning)
e4941e3d 970 {
b63b07a8
RL
971 OkToClose = true;
972 return false;
e4941e3d 973 }
04b9c5bb 974
9a29912f
JS
975 switch (convertMode)
976 {
977 case TEX_RTF:
978 {
979 success = RTFGo();
980 break;
981 }
982 case TEX_XLP:
983 {
984 success = XLPGo();
985 break;
986 }
987 case TEX_HTML:
988 {
989 success = HTMLGo();
990 break;
991 }
992 }
993 }
994 if (stopRunning)
995 {
6c155d33 996 OnInform(_T("*** Aborted by user."));
b63b07a8
RL
997 success = false;
998 stopRunning = false;
999 OkToClose = true;
9a29912f
JS
1000 }
1001
1002 if (success)
1003 {
ad781c23 1004 WriteTexReferences(RefFileName);
9a29912f 1005 TexCleanUp();
b63b07a8 1006 startedSections = false;
9a29912f 1007
63ad540d 1008 wxString buf;
9a29912f
JS
1009#ifndef NO_GUI
1010 long tim = wxGetElapsedTime();
6c155d33
JS
1011 buf.Printf(_T("Finished PASS #%d in %ld seconds.\n"), passNumber, (long)(tim/1000.0));
1012 OnInform((wxChar *)buf.c_str());
63ad540d
GT
1013
1014 if (errorCount)
1015 {
6c155d33
JS
1016 buf.Printf(_T("Errors encountered during this pass: %lu\n"), errorCount);
1017 OnInform((wxChar *)buf.c_str());
63ad540d
GT
1018 }
1019
9a29912f
JS
1020 if (isInteractive)
1021 {
6c155d33
JS
1022 buf.Printf(_T("Done, %d %s."), passNumber, (passNumber > 1) ? _T("passes") : _T("pass"));
1023 frame->SetStatusText((wxChar *)buf.c_str());
9a29912f
JS
1024 }
1025#else
6c155d33
JS
1026 buf.Printf(_T("Done, %d %s."), passNumber, (passNumber > 1) ? _T("passes") : _T("pass"));
1027 OnInform((wxChar *)buf.c_str());
63ad540d
GT
1028 if (errorCount)
1029 {
6c155d33
JS
1030 buf.Printf(_T("Errors encountered during this pass: %lu\n"), errorCount);
1031 OnInform((wxChar *)buf.c_str());
63ad540d 1032 }
9a29912f
JS
1033#endif
1034 passNumber ++;
63ad540d 1035 errorCount = 0;
b63b07a8
RL
1036 OkToClose = true;
1037 return true;
9a29912f
JS
1038 }
1039
1040 TexCleanUp();
b63b07a8 1041 startedSections = false;
9a29912f 1042
8efab359 1043#ifndef NO_GUI
6c155d33 1044 frame->SetStatusText(_T("Aborted by user."));
8efab359 1045#endif // GUI
fad535ee 1046
6c155d33 1047 OnInform(_T("Sorry, unsuccessful."));
b63b07a8
RL
1048 OkToClose = true;
1049 return false;
9a29912f
JS
1050}
1051
6c155d33 1052void OnError(const wxChar *msg)
9a29912f 1053{
b63b07a8 1054 wxString msg_string = msg;
63ad540d
GT
1055 errorCount++;
1056
9a29912f 1057#ifdef NO_GUI
b63b07a8 1058 wxSTD cerr << "Error: " << msg_string.mb_str() << "\n";
219f4a6d 1059 wxSTD cerr.flush();
9a29912f 1060#else
3f8e5072 1061 if (isInteractive && frame)
6c155d33 1062 (*frame->textWindow) << _T("Error: ") << msg << _T("\n");
9a29912f
JS
1063 else
1064#ifdef __UNIX__
1065 {
b63b07a8 1066 wxSTD cerr << "Error: " << msg_string.mb_str() << "\n";
219f4a6d 1067 wxSTD cerr.flush();
9a29912f
JS
1068 }
1069#endif
63ad540d 1070
9a29912f 1071#ifdef __WXMSW__
11611a62 1072 wxLogError(msg);
9a29912f 1073#endif
b63b07a8 1074 Tex2RTFYield(true);
9a29912f
JS
1075#endif // NO_GUI
1076}
1077
6c155d33 1078void OnInform(const wxChar *msg)
9a29912f 1079{
b63b07a8 1080 wxString msg_string = msg;
9a29912f 1081#ifdef NO_GUI
b63b07a8 1082 wxSTD cout << msg_string.mb_str() << "\n";
219f4a6d 1083 wxSTD cout.flush();
9a29912f 1084#else
3f8e5072 1085 if (isInteractive && frame)
6c155d33 1086 (*frame->textWindow) << msg << _T("\n");
fad535ee
GT
1087/* This whole block of code is just wrong I think. It would behave
1088 completely wrong under anything other than MSW due to the ELSE
4fe30bce
WS
1089 with no statement, and the cout calls would fail under MSW, as
1090 the code in this block is compiled if !NO_GUI This code has been
1091 here since v1.1 of this file too. - gt
9a29912f
JS
1092 else
1093#ifdef __WXMSW__
1094 {
b63b07a8 1095 wxSTD cout << msg_string.mb_str() << "\n";
219f4a6d 1096 wxSTD cout.flush();
9a29912f
JS
1097 }
1098#endif
1099#ifdef __WXMSW__
1100 {}
1101#endif
fad535ee 1102*/
9a29912f
JS
1103 if (isInteractive)
1104 {
b63b07a8 1105 Tex2RTFYield(true);
9a29912f
JS
1106 }
1107#endif // NO_GUI
1108}
1109
1110void OnMacro(int macroId, int no_args, bool start)
1111{
1112 switch (convertMode)
1113 {
1114 case TEX_RTF:
1115 {
1116 RTFOnMacro(macroId, no_args, start);
1117 break;
1118 }
1119 case TEX_XLP:
1120 {
1121 XLPOnMacro(macroId, no_args, start);
1122 break;
1123 }
1124 case TEX_HTML:
1125 {
1126 HTMLOnMacro(macroId, no_args, start);
1127 break;
1128 }
1129 }
1130}
1131
1132bool OnArgument(int macroId, int arg_no, bool start)
1133{
1134 switch (convertMode)
1135 {
1136 case TEX_RTF:
1137 {
1138 return RTFOnArgument(macroId, arg_no, start);
6c155d33 1139 // break;
9a29912f
JS
1140 }
1141 case TEX_XLP:
1142 {
1143 return XLPOnArgument(macroId, arg_no, start);
6c155d33 1144 // break;
9a29912f
JS
1145 }
1146 case TEX_HTML:
1147 {
1148 return HTMLOnArgument(macroId, arg_no, start);
6c155d33 1149 // break;
9a29912f
JS
1150 }
1151 }
b63b07a8 1152 return true;
9a29912f
JS
1153}
1154
1155/*
1156 * DDE Stuff
1157 */
1158#if defined(__WXMSW__) && !defined(NO_GUI)
1159
1160/*
1161 * Server
1162 */
1163
1164wxConnectionBase *Tex2RTFServer::OnAcceptConnection(const wxString& topic)
1165{
6c155d33 1166 if (topic == _T("TEX2RTF"))
9a29912f
JS
1167 {
1168 if (!ipc_buffer)
6c155d33 1169 ipc_buffer = new wxChar[1000];
ffaaaacb 1170
9a29912f
JS
1171 return new Tex2RTFConnection(ipc_buffer, 4000);
1172 }
1173 else
1174 return NULL;
1175}
1176
1177 /*
1178 * Connection
1179 */
ffaaaacb 1180
6c155d33 1181Tex2RTFConnection::Tex2RTFConnection(wxChar *buf, int size):wxDDEConnection(buf, size)
9a29912f
JS
1182{
1183}
1184
1185Tex2RTFConnection::~Tex2RTFConnection(void)
1186{
1187}
1188
6c155d33 1189bool SplitCommand(wxChar *data, wxChar *firstArg, wxChar *secondArg)
9a29912f
JS
1190{
1191 firstArg[0] = 0;
1192 secondArg[0] = 0;
1193 int i = 0;
b63b07a8 1194 bool stop = false;
9a29912f
JS
1195 // Find first argument (command name)
1196 while (!stop)
1197 {
1198 if (data[i] == ' ' || data[i] == 0)
b63b07a8 1199 stop = true;
9a29912f
JS
1200 else
1201 {
1202 firstArg[i] = data[i];
1203 i ++;
1204 }
1205 }
1206 firstArg[i] = 0;
1207 if (data[i] == ' ')
1208 {
1209 // Find second argument
1210 i ++;
1211 int j = 0;
1212 while (data[i] != 0)
1213 {
1214 secondArg[j] = data[i];
1215 i ++;
1216 j ++;
1217 }
1218 secondArg[j] = 0;
1219 }
b63b07a8 1220 return true;
9a29912f
JS
1221}
1222
6c155d33 1223bool Tex2RTFConnection::OnExecute(const wxString& WXUNUSED(topic), wxChar *data, int WXUNUSED(size), wxIPCFormat WXUNUSED(format))
9a29912f 1224{
6c155d33 1225 wxStrcpy(Tex2RTFLastStatus, _T("OK"));
9a29912f 1226
6c155d33
JS
1227 wxChar firstArg[50];
1228 wxChar secondArg[300];
9a29912f
JS
1229 if (SplitCommand(data, firstArg, secondArg))
1230 {
6c155d33
JS
1231 bool hasArg = (wxStrlen(secondArg) > 0);
1232 if (wxStrcmp(firstArg, _T("INPUT")) == 0 && hasArg)
9a29912f
JS
1233 {
1234 if (InputFile) delete[] InputFile;
1235 InputFile = copystring(secondArg);
1236 if (frame)
1237 {
6c155d33 1238 wxChar buf[100];
9a29912f 1239 wxString str = wxFileNameFromPath(InputFile);
b63b07a8 1240 wxSnprintf(buf, sizeof(buf), _T("Tex2RTF [%s]"), (const wxChar*) str);
9a29912f
JS
1241 frame->SetTitle(buf);
1242 }
1243 }
6c155d33 1244 else if (wxStrcmp(firstArg, _T("OUTPUT")) == 0 && hasArg)
9a29912f
JS
1245 {
1246 if (OutputFile) delete[] OutputFile;
1247 OutputFile = copystring(secondArg);
1248 }
6c155d33 1249 else if (wxStrcmp(firstArg, _T("GO")) == 0)
9a29912f 1250 {
6c155d33 1251 wxStrcpy(Tex2RTFLastStatus, _T("WORKING"));
9a29912f 1252 if (!Go())
6c155d33 1253 wxStrcpy(Tex2RTFLastStatus, _T("CONVERSION ERROR"));
9a29912f 1254 else
6c155d33 1255 wxStrcpy(Tex2RTFLastStatus, _T("OK"));
9a29912f 1256 }
6c155d33 1257 else if (wxStrcmp(firstArg, _T("EXIT")) == 0)
9a29912f 1258 {
e3065973 1259 if (frame) frame->Close();
9a29912f 1260 }
6c155d33 1261 else if (wxStrcmp(firstArg, _T("MINIMIZE")) == 0 || wxStrcmp(firstArg, _T("ICONIZE")) == 0)
9a29912f
JS
1262 {
1263 if (frame)
b63b07a8 1264 frame->Iconize(true);
9a29912f 1265 }
6c155d33 1266 else if (wxStrcmp(firstArg, _T("SHOW")) == 0 || wxStrcmp(firstArg, _T("RESTORE")) == 0)
9a29912f
JS
1267 {
1268 if (frame)
1269 {
b63b07a8
RL
1270 frame->Iconize(false);
1271 frame->Show(true);
9a29912f
JS
1272 }
1273 }
1274 else
1275 {
1276 // Try for a setting
b63b07a8 1277 wxStrcpy(Tex2RTFLastStatus, RegisterSetting(firstArg, secondArg, false));
9a29912f 1278#ifndef NO_GUI
6c155d33 1279 if (frame && wxStrcmp(firstArg, _T("conversionMode")) == 0)
9a29912f 1280 {
6c155d33
JS
1281 wxChar buf[100];
1282 wxStrcpy(buf, _T("In "));
9a29912f
JS
1283
1284 if (winHelp && (convertMode == TEX_RTF))
6c155d33 1285 wxStrcat(buf, _T("WinHelp RTF"));
9a29912f 1286 else if (!winHelp && (convertMode == TEX_RTF))
6c155d33
JS
1287 wxStrcat(buf, _T("linear RTF"));
1288 else if (convertMode == TEX_HTML) wxStrcat(buf, _T("HTML"));
1289 else if (convertMode == TEX_XLP) wxStrcat(buf, _T("XLP"));
1290 wxStrcat(buf, _T(" mode."));
9a29912f
JS
1291 frame->SetStatusText(buf, 1);
1292 }
1293#endif
1294 }
1295 }
b63b07a8 1296 return true;
9a29912f
JS
1297}
1298
6c155d33 1299wxChar *Tex2RTFConnection::OnRequest(const wxString& WXUNUSED(topic), const wxString& WXUNUSED(item), int *WXUNUSED(size), wxIPCFormat WXUNUSED(format))
9a29912f
JS
1300{
1301 return Tex2RTFLastStatus;
1302}
1303
1304#endif
1305
c4c794e1 1306#ifndef NO_GUI
17867d61 1307#ifndef __WXGTK__
dd107c50 1308//void wxObject::Dump(wxSTD ostream& str)
7cf496bf
RS
1309//{
1310// if (GetClassInfo() && GetClassInfo()->GetClassName())
1311// str << GetClassInfo()->GetClassName();
1312// else
1313// str << "unknown object class";
1314//}
1315#endif
17867d61 1316#endif