5#include "Stroika/Foundation/StroikaPreComp.h"
7#if qStroika_Foundation_Common_Platform_MacOS
13#include <LDialogBox.h>
14#include <LEditField.h>
19#include <LPlaceHolder.h>
21#include <LStdControl.h>
23#include <LTextButton.h>
25#include <PP_Messages.h>
26#include <PP_Resources.h>
27#include <TArrayIterator.h>
28#include <UAppleEventsMgr.h>
30#include <UMemoryMgr.h>
31#include <UModalDialogs.h>
32#include <URegistrar.h>
37#elif qStroika_FeatureSupported_XWindows
38#include <gtk/gtkoptionmenu.h>
44#include "Stroika/Frameworks/Led/Config.h"
45#include "Stroika/Frameworks/Led/StdDialogs.h"
46#if qStroika_Foundation_Common_Platform_Windows
47#include "Stroika/Frameworks/Led/Platform/Windows_FileRegistration.h"
49#include "Stroika/Frameworks/Led/StyledTextEmbeddedObjects.h"
51#if qStroika_Foundation_Common_Platform_Windows
52#include "LedItControlItem.h"
53#include "LedItInPlaceFrame.h"
54#include "LedItMainFrame.h"
55#elif qStroika_Foundation_Common_Platform_MacOS
56#include "FilteredFilePicker.h"
59#include "LedItDocument.h"
60#include "LedItResources.h"
64#include "LedItApplication.h"
66#if qStroika_FeatureSupported_XWindows
67#include "AboutBoxImage.xpm"
71using namespace Stroika::Frameworks::Led;
72using namespace Stroika::Frameworks::Led::Platform;
73using namespace Stroika::Frameworks::Led::StyledTextIO;
75#if qStroika_Foundation_Common_Platform_MacOS
76static Handle sDeepShitCheeseBuf = NULL;
78inline void DoStringyAlert (
short alertID,
const ConstStr255Param p0 = NULL,
const ConstStr255Param p1 = NULL,
79 const ConstStr255Param p2 = NULL,
const ConstStr255Param p3 = NULL)
81 if (sDeepShitCheeseBuf != NULL) {
82 ::DisposeHandle (sDeepShitCheeseBuf);
83 sDeepShitCheeseBuf = NULL;
85 if (::GetResource (
'ALRT', alertID) == nil) {
90 Led_CheckSomeLocalHeapRAMAvailable (4 * 1024);
96 ::ParamText (p0 == NULL ?
"\p" : p0, p1 == NULL ?
"\p" : p1, p2 == NULL ?
"\p" : p2, p3 == NULL ?
"\p" : p3);
98 ::CautionAlert (alertID, nil);
103const char kAppName[] =
"LedIt";
105#if qStroika_Foundation_Common_Platform_MacOS
107#define STANDARD_LEDITAPPLICATION_MACOS_CATCHERS() \
110 HandleMacOSException (err); \
114 HandleBadAllocException (); \
116 catch (TextInteractor::BadUserInput&) \
118 HandleBadUserInputException (); \
120 catch (const LException& err) \
122 HandlePowerPlantException ((OSErr)err.GetErrorCode ()); \
124 catch (ExceptionCode err) \
126 HandlePowerPlantException (err); \
130 HandleUnknownException (); \
135#if qStroika_Foundation_Common_Platform_Windows
137#define STD_EXCEPT_CATCHER(APP) \
138 catch (CMemoryException * e) \
140 (APP).HandleBadAllocException (); \
143 catch (CException * e) \
145 (APP).HandleMFCException (e); \
150 (APP).HandleBadAllocException (); \
154 (APP).HandleHRESULTException (hr); \
156 catch (TextInteractor::BadUserInput&) \
158 (APP).HandleBadUserInputException (); \
162 (APP).HandleUnknownException (); \
167#if qStroika_Foundation_Common_Platform_Windows
168class SimpleLedTemplate :
public CSingleDocTemplate {
170 SimpleLedTemplate (
const char* daStr);
173 virtual void LoadTemplate ()
override;
176 virtual CDocument* OpenDocumentFile (LPCTSTR lpszPathName, BOOL bMakeVisible)
override
180 CDocument* pDocument = NULL;
181 CFrameWnd* pFrame = NULL;
182 BOOL bCreated = FALSE;
183 BOOL bWasModified = FALSE;
185 if (m_pOnlyDoc != NULL) {
187 pDocument = m_pOnlyDoc;
188 if (!pDocument->SaveModified ())
191 pFrame = (CFrameWnd*)AfxGetMainWnd ();
192 ASSERT (pFrame != NULL);
193 ASSERT_KINDOF (CFrameWnd, pFrame);
194 ASSERT_VALID (pFrame);
198 pDocument = CreateNewDocument ();
199 ASSERT (pFrame == NULL);
203 if (pDocument == NULL) {
204 AfxMessageBox (AFX_IDP_FAILED_TO_CREATE_DOC);
207 ASSERT (pDocument == m_pOnlyDoc);
209 if (pFrame == NULL) {
213 BOOL bAutoDelete = pDocument->m_bAutoDelete;
214 pDocument->m_bAutoDelete = FALSE;
216 pFrame = CreateNewFrame (pDocument, NULL);
217 pDocument->m_bAutoDelete = bAutoDelete;
218 if (pFrame == NULL) {
219 AfxMessageBox (AFX_IDP_FAILED_TO_CREATE_DOC);
225 if (lpszPathName == NULL) {
227 SetDefaultTitle (pDocument);
231 pDocument->m_bEmbedded = TRUE;
233 if (!pDocument->OnNewDocument ()) {
236 pFrame->DestroyWindow ();
244 bWasModified = pDocument->IsModified ();
245 pDocument->SetModifiedFlag (FALSE);
247 BOOL docOpenDocResult =
false;
249 docOpenDocResult = pDocument->OnOpenDocument (lpszPathName);
253 pDocument->OnNewDocument ();
254 CWinThread* pThread = AfxGetThread ();
256 if (bCreated && pThread->m_pMainWnd == NULL) {
258 pThread->m_pMainWnd = pFrame;
260 InitialUpdateFrame (pFrame, pDocument, bMakeVisible);
265 if (!docOpenDocResult) {
268 pFrame->DestroyWindow ();
270 else if (!pDocument->IsModified ()) {
272 pDocument->SetModifiedFlag (bWasModified);
276 SetDefaultTitle (pDocument);
278 if (!pDocument->OnNewDocument ()) {
284 pDocument->SetPathName (lpszPathName);
287 CWinThread* pThread = AfxGetThread ();
289 if (bCreated && pThread->m_pMainWnd == NULL) {
291 pThread->m_pMainWnd = pFrame;
293 InitialUpdateFrame (pFrame, pDocument, bMakeVisible);
299class LedItDocManager :
public CDocManager {
302 virtual void OnFileNew ()
override;
303 virtual CDocument* OpenDocumentFile (LPCTSTR lpszFileName)
override;
304 nonvirtual CDocument* OpenDocumentFile (LPCTSTR lpszFileName, FileFormat format);
307 virtual void RegisterShellFileTypes (BOOL bWin95)
override;
310 nonvirtual
void RegisterShellFileType (
bool bWin95, CString strPathName,
int iconIndexInFile, CString strFilterExt,
311 CString strFileTypeId, CString strFileTypeName);
314 virtual BOOL DoPromptFileName (CString& fileName, UINT nIDSTitle, DWORD lFlags, BOOL bOpenFileDialog, CDocTemplate* pTemplate)
override;
316 virtual void OnFileOpen ()
override;
319inline const void* LoadAppResource (
long resID, LPCTSTR resType)
321 HRSRC hrsrc = ::FindResource (::AfxGetResourceHandle (), MAKEINTRESOURCE (resID), resType);
323 HGLOBAL hglobal = ::LoadResource (::AfxGetResourceHandle (), hrsrc);
324 const void* lockedData = ::LockResource (hglobal);
328static BOOL AFXAPI SetRegKey (LPCTSTR lpszKey, LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL)
330 if (lpszValueName == NULL) {
331 if (::RegSetValue (HKEY_CLASSES_ROOT, lpszKey, REG_SZ, lpszValue,
static_cast<DWORD
> (::_tcslen (lpszValue))) != ERROR_SUCCESS) {
332 TRACE1 (
"Warning: registration database update failed for key '%s'.\n", lpszKey);
339 if (::RegCreateKey (HKEY_CLASSES_ROOT, lpszKey, &hKey) == ERROR_SUCCESS) {
340 LONG lResult = ::RegSetValueEx (hKey, lpszValueName, 0, REG_SZ, (CONST BYTE*)lpszValue,
341 static_cast<DWORD
> (::_tcslen (lpszValue) +
sizeof (TCHAR)));
342 if (::RegCloseKey (hKey) == ERROR_SUCCESS && lResult == ERROR_SUCCESS) {
346 TRACE1 (
"Warning: registration database update failed for key '%s'.\n", lpszKey);
352class MyAboutBox :
public Led_StdDialogHelper_AboutBox {
354 using inherited = Led_StdDialogHelper_AboutBox;
355#if qStroika_Foundation_Common_Platform_Windows
357 MyAboutBox (HINSTANCE hInstance, HWND parentWnd)
358 : inherited (hInstance, parentWnd)
361#elif qStroika_FeatureSupported_XWindows
363 MyAboutBox (GtkWindow* modalParentWindow)
364 : inherited (modalParentWindow)
370 virtual void PreDoModalHook ()
override
372 inherited::PreDoModalHook ();
374#define kUNICODE_NAME_ADORNER L" [UNICODE]"
376#define kUNICODE_NAME_ADORNER " [Internal UNICODE]"
379#if qStroika_Foundation_Common_Platform_MacOS
380 const short kPictHeight = 273;
381 const short kPictWidth = 437;
382 SDKString verStr =
SDKString{qLed_ShortVersionString} + kUNICODE_NAME_ADORNER
" (" + __DATE__ +
")";
383 const int kVERWidth = 230;
384 SimpleLayoutHelper (kPictHeight, kPictWidth, Led_Rect (159, 15, 17, 142), Led_Rect (159, 227, 17, 179), verStr);
385#elif qStroika_Foundation_Common_Platform_Windows
388 const int kPictWidth = 437;
389 const int kPictHeight = 273;
390 const int kButHSluff = 17;
391 const int kButVSluff = 19;
394 ::GetWindowRect (GetHWND (), &windowRect);
400 ::GetClientRect (GetHWND (), &clientRect);
401 ncWidth = AsLedRect (windowRect).GetWidth () - AsLedRect (clientRect).GetWidth ();
402 ncHeight = AsLedRect (windowRect).GetHeight () - AsLedRect (clientRect).GetHeight ();
404 ::MoveWindow (GetHWND (), windowRect.left, windowRect.top, kPictWidth + ncWidth, kPictHeight + ncHeight,
false);
409 HWND w = ::GetDlgItem (GetHWND (), kLedStdDlg_AboutBox_VersionFieldID);
411 const int kVERWidth = 230;
412 ::MoveWindow (w, kPictWidth / 2 - kVERWidth / 2, 32, kVERWidth, 16,
false);
413 ::SetWindowText (w, _T (qLed_ShortVersionString) kUNICODE_NAME_ADORNER _T (
" (") _T (__DATE__) _T (
")"));
418 HWND w = ::GetDlgItem (GetHWND (), kLedStdDlg_AboutBox_InfoLedFieldID);
420 ::MoveWindow (w, 15, 159, 142, 17,
false);
421 w = ::GetDlgItem (GetHWND (), kLedStdDlg_AboutBox_LedWebPageFieldID);
423 ::MoveWindow (w, 227, 159, 179, 17,
false);
428 HWND w = ::GetDlgItem (GetHWND (), IDOK);
431 ::GetWindowRect (w, &tmp);
432 ::MoveWindow (w, kButHSluff, kPictHeight - AsLedRect (tmp).GetHeight () - kButVSluff, AsLedRect (tmp).GetWidth (),
433 AsLedRect (tmp).GetHeight (),
false);
436 ::SetWindowText (GetHWND (), _T (
"About LedIt!"));
437#elif qStroika_FeatureSupported_XWindows
438 GtkWidget* window = GetWindow ();
439 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
442 GtkStyle* style = gtk_widget_get_style (window);
443 GdkBitmap* mask = NULL;
444 GdkPixmap* pixmap = gdk_pixmap_create_from_xpm_d (window->window, &mask, &style->bg[GTK_STATE_NORMAL], (gchar**)AboutBoxImage_xpm);
447 GtkWidget* box1 = gtk_hbox_new (FALSE, 0);
448 gtk_container_set_border_width (GTK_CONTAINER (box1), 2);
451 GtkWidget* pixmapwid = gtk_pixmap_new (pixmap, mask);
454 GtkWidget* label = gtk_label_new (verStr.c_str ());
456 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 3);
457 gtk_box_pack_start (GTK_BOX (box1), pixmapwid, FALSE, FALSE, 3);
459 gtk_widget_show (pixmapwid);
460 gtk_widget_show (label);
461 gtk_widget_show (box1);
464 GtkWidget* button = gtk_button_new ();
465 gtk_container_add (GTK_CONTAINER (button), box1);
466 gtk_container_add (GTK_CONTAINER (window), button);
467 gtk_widget_show (button);
468 SetOKButton (button);
472 virtual void OnClickInInfoField ()
override
475 Led_URLManager::Get ().Open (
"mailto:info-led@sophists.com");
480 inherited::OnClickInInfoField ();
483 virtual void OnClickInLedWebPageField ()
override
486 Led_URLManager::Get ().Open (MakeSophistsAppNameVersionURL (
"/Led/LedIt/", kAppName));
491 inherited::OnClickInLedWebPageField ();
495#if qStroika_FeatureSupported_XWindows
496class LedItFilePickBox :
public StdFilePickBox {
498 using inherited = StdFilePickBox;
501 LedItFilePickBox (GtkWindow* modalParentWindow,
const SDKString& title,
bool saveDialog,
const SDKString& fileName, FileFormat fileFormat)
502 : inherited (modalParentWindow, title, saveDialog, fileName)
503 , fFileFormat (fileFormat)
504 , fFileTypeChoice (NULL)
509 virtual void PreDoModalHook ()
override
511 inherited::PreDoModalHook ();
514 GtkBox* mainVBox = GTK_BOX (GTK_FILE_SELECTION (GetWindow ())->main_vbox);
515 GtkWidget* fileTypeHBox = gtk_hbox_new (TRUE, 10);
516 gtk_box_pack_start (mainVBox, fileTypeHBox, FALSE, FALSE, 0);
517 gtk_widget_show (fileTypeHBox);
520 GtkWidget* filetypesLabel = gtk_label_new (
"File Type:");
521 gtk_label_set_justify (GTK_LABEL (filetypesLabel), GTK_JUSTIFY_RIGHT);
522 gtk_misc_set_alignment (GTK_MISC (filetypesLabel), 1.0, 0.5);
523 gtk_widget_show (filetypesLabel);
524 gtk_box_pack_start (GTK_BOX (fileTypeHBox), filetypesLabel, FALSE, TRUE, 0);
527 fFileTypeChoice = GTK_OPTION_MENU (gtk_option_menu_new ());
528 gtk_widget_show (GTK_WIDGET (fFileTypeChoice));
529 gtk_box_pack_end (GTK_BOX (fileTypeHBox), GTK_WIDGET (fFileTypeChoice), FALSE, TRUE, 0);
535 gtk_box_reorder_child (mainVBox, fileTypeHBox, 5);
539 GtkWidget* menu = gtk_menu_new ();
540 if (not fSaveDialog) {
541 GtkWidget* m = gtk_menu_item_new_with_label (
"Automatically recognize type");
542 gtk_object_set_user_data (GTK_OBJECT (m),
reinterpret_cast<void*
> (eUnknownFormat));
544 gtk_menu_append (GTK_MENU (menu), m);
547 struct FileFilterDesc {
551 static FileFilterDesc typeList[] = {
552 {
"HTML file", eHTMLFormat},
553 {
"Led Rich Text Format", eLedPrivateFormat},
554 {
"Microsoft Rich Text Format (RTF)", eRTFFormat},
555 {
"Text file", eTextFormat},
557 size_t defaultItem = 0;
558 for (
size_t i = 0; i < Led_Memory::NEltsOf (typeList); ++i) {
559 GtkWidget* m = gtk_menu_item_new_with_label (typeList[i].fDescription.c_str ());
560 gtk_object_set_user_data (GTK_OBJECT (m),
reinterpret_cast<void*
> (typeList[i].fFormat));
562 gtk_menu_append (GTK_MENU (menu), m);
565 if (typeList[i].fFormat == fFileFormat) {
570 gtk_widget_show (menu);
571 gtk_option_menu_set_menu (fFileTypeChoice, menu);
572 gtk_menu_set_active (GTK_MENU (menu), defaultItem);
573 gtk_option_menu_set_history (fFileTypeChoice, defaultItem);
577 virtual void OnOK ()
override
581 GtkWidget* activeItem = gtk_menu_get_active (GTK_MENU (gtk_option_menu_get_menu (fFileTypeChoice)));
583 fFileFormat = (FileFormat)(
reinterpret_cast<int> (gtk_object_get_user_data (GTK_OBJECT (activeItem))));
587 nonvirtual FileFormat GetFileFormat ()
const
593 FileFormat fFileFormat;
594 GtkOptionMenu* fFileTypeChoice;
603#if qStroika_Foundation_Common_Platform_Windows
604LedItApplication theApp;
609static const CLSID clsid = {0xfc00620, 0x28bd, 0x11cf, {0x89, 0x9c, 0x0, 0xaa, 0x0, 0x58, 0x3, 0x24}};
611BEGIN_MESSAGE_MAP (LedItApplication, CWinApp)
612ON_COMMAND (ID_APP_ABOUT, OnAppAbout)
613ON_COMMAND (ID_FILE_NEW, OnFileNew)
614ON_COMMAND (ID_FILE_OPEN, OnFileOpen)
615ON_COMMAND (ID_FILE_PRINT_SETUP, OnFilePrintSetup)
616ON_COMMAND (kToggleUseSmartCutNPasteCmd, OnToggleSmartCutNPasteOptionCommand)
617ON_UPDATE_COMMAND_UI (kToggleUseSmartCutNPasteCmd, OnToggleSmartCutNPasteOptionUpdateCommandUI)
618ON_COMMAND (kToggleWrapToWindowCmd, OnToggleWrapToWindowOptionCommand)
619ON_UPDATE_COMMAND_UI (kToggleWrapToWindowCmd, OnToggleWrapToWindowOptionUpdateCommandUI)
620ON_COMMAND (kToggleShowHiddenTextCmd, OnToggleShowHiddenTextOptionCommand)
621ON_UPDATE_COMMAND_UI (kToggleShowHiddenTextCmd, OnToggleShowHiddenTextOptionUpdateCommandUI)
622ON_COMMAND (cmdChooseDefaultFontDialog, OnChooseDefaultFontCommand)
623ON_COMMAND (kGotoLedItWebPageCmd, OnGotoLedItWebPageCommand)
624ON_COMMAND (kGotoSophistsWebPageCmd, OnGotoSophistsWebPageCommand)
625ON_COMMAND (kCheckForUpdatesWebPageCmdID, OnCheckForUpdatesWebPageCommand)
629LedItApplication* LedItApplication::sThe = NULL;
631LedItApplication::LedItApplication ()
633#if qStroika_Foundation_Common_Platform_MacOS || qStroika_Foundation_Common_Platform_Windows
637#if qStroika_Foundation_Common_Platform_MacOS
639 , fGotoLedItWebPageMenuItem (0)
640 , fGotoSophistsWebPageMenuItem (0)
641 , fCheckForUpdatesWebPageMenuItem (0)
642 , fLastLowMemWarnAt (0.0f)
644#if qStroika_Foundation_Common_Platform_Windows
645 fOleTemplateServer ()
648#if qStroika_Foundation_Common_Platform_Windows
650#elif qStroika_FeatureSupported_XWindows
651 fInstalledFonts (GDK_DISPLAY ())
654#if qStroika_FeatureSupported_XWindows
659 Require (sThe == NULL);
670#if !qStroika_Foundation_Common_Platform_Windows
672 EmbeddedObjectCreatorRegistry::Get ().AddStandardTypes ();
674#if qStroika_Foundation_Common_Platform_Windows
676 EmbeddedObjectCreatorRegistry::Get ().AddAssoc (LedItControlItem::kClipFormat, LedItControlItem::kEmbeddingTag,
677 LedItControlItem::mkLedItControlItemStyleMarker, LedItControlItem::mkLedItControlItemStyleMarker);
678 EmbeddedObjectCreatorRegistry::Get ().AddAssoc (kBadClipFormat, RTFIO::RTFOLEEmbedding::kEmbeddingTag,
679 LedItControlItem::mkLedItControlItemStyleMarker, LedItControlItem::mkLedItControlItemStyleMarker);
683#if qStroika_Foundation_Common_Platform_MacOS
685 TRegistrar<LPlaceHolder>::Register ();
686 TRegistrar<LPrintout>::Register ();
687 TRegistrar<LDialogBox>::Register ();
688 TRegistrar<LPicture>::Register ();
689 TRegistrar<LCaption>::Register ();
690 TRegistrar<LPane>::Register ();
691 TRegistrar<LTextButton>::Register ();
692 TRegistrar<LStdCheckBox>::Register ();
693 TRegistrar<LStdButton>::Register ();
694 TRegistrar<LEditField>::Register ();
695 TRegistrar<LTabGroup>::Register ();
696 TRegistrar<LStdPopupMenu>::Register ();
699 StandardUnknownTypeStyleMarker::sUnknownPict = (Picture**)::GetResource (
'PICT', kUnknownEmbeddingPictID);
700 StandardDIBStyleMarker::sUnsupportedFormatPict = (Picture**)::GetResource (
'PICT', kUnsupportedDIBFormatPictID);
704 SetSleepTime (Led_Min (6, GetCaretTime ()));
705#elif qStroika_FeatureSupported_XWindows
706 fDocument =
new LedItDocument ();
708 fAppWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
709 gtk_signal_connect (GTK_OBJECT (fAppWindow),
"destroy", GTK_SIGNAL_FUNC (xdestroy),
this);
711 UpdateFrameWindowTitle ();
712 gtk_widget_set_usize (GTK_WIDGET (fAppWindow), 300, 200);
713 gtk_widget_set_usize (fAppWindow, 600, 500);
714 gtk_window_set_policy (GTK_WINDOW (fAppWindow), TRUE, TRUE, FALSE);
715 gtk_container_set_border_width (GTK_CONTAINER (fAppWindow), 0);
717 GtkWidget* main_vbox = gtk_vbox_new (FALSE, 1);
718 gtk_container_border_width (GTK_CONTAINER (main_vbox), 1);
719 gtk_container_add (GTK_CONTAINER (fAppWindow), main_vbox);
720 gtk_widget_show (main_vbox);
722 GtkWidget* menubar = get_main_menu (fAppWindow);
724 gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, TRUE, 0);
725 gtk_widget_show (menubar);
728 GtkWidget* box1 = gtk_vbox_new (FALSE, 0);
729 gtk_container_add (GTK_CONTAINER (main_vbox), box1);
730 gtk_widget_show (box1);
732 GtkWidget* box2 = gtk_vbox_new (FALSE, 10);
733 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
734 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
735 gtk_widget_show (box2);
737 GtkWidget* table = gtk_table_new (2, 2,
false);
738 gtk_table_set_row_spacing (GTK_TABLE (table), 0, 2);
739 gtk_table_set_col_spacing (GTK_TABLE (table), 0, 2);
740 gtk_box_pack_start (GTK_BOX (box2), table, TRUE, TRUE, 0);
741 gtk_widget_show (table);
744 fTextEditor =
new LedItView (fDocument);
746 gtk_table_attach (GTK_TABLE (table), fTextEditor->Get_GtkWidget (), 0, 1, 0, 1,
747 static_cast<GtkAttachOptions
> (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
748 static_cast<GtkAttachOptions
> (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
749 gtk_widget_show (fTextEditor->Get_GtkWidget ());
753 GtkAdjustment* vAdj = fTextEditor->GetAdjustmentObject (TextInteractor::v);
754 GtkWidget* vscrollbar = gtk_vscrollbar_new (vAdj);
755 gtk_table_attach (GTK_TABLE (table), vscrollbar, 1, 2, 0, 1,
static_cast<GtkAttachOptions
> (GTK_FILL),
756 static_cast<GtkAttachOptions
> (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
757 gtk_widget_show (vscrollbar);
760 GtkAdjustment* hAdj = fTextEditor->GetAdjustmentObject (TextInteractor::h);
761 GtkWidget* hscrollbar = gtk_hscrollbar_new (hAdj);
762 gtk_table_attach (GTK_TABLE (table), hscrollbar, 0, 1, 1, 2,
static_cast<GtkAttachOptions
> (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
763 static_cast<GtkAttachOptions
> (GTK_FILL), 0, 0);
764 gtk_widget_show (hscrollbar);
766 gtk_widget_show (fAppWindow);
769 gtk_widget_grab_focus (fTextEditor->Get_GtkWidget ());
774LedItApplication::~LedItApplication ()
776 Require (sThe ==
this);
778#if qStroika_FeatureSupported_XWindows
783LedItApplication& LedItApplication::Get ()
789void LedItApplication::DoAboutBox ()
791#if qStroika_Foundation_Common_Platform_MacOS
793#elif qStroika_Foundation_Common_Platform_Windows
794 MyAboutBox dlg (m_hInstance, AfxGetMainWnd ()->m_hWnd);
795#elif qStroika_FeatureSupported_XWindows
796 MyAboutBox dlg (GTK_WINDOW (fAppWindow));
801void LedItApplication::OnGotoLedItWebPageCommand ()
804 Led_URLManager::Get ().Open (MakeSophistsAppNameVersionURL (
"/Led/LedIt/", kAppName));
807#if qStroika_Foundation_Common_Platform_MacOS
808 DoStringyAlert (kCannotOpenWebPageAlertID);
813void LedItApplication::OnGotoSophistsWebPageCommand ()
816 Led_URLManager::Get ().Open (MakeSophistsAppNameVersionURL (
"/", kAppName));
819#if qStroika_Foundation_Common_Platform_MacOS
820 DoStringyAlert (kCannotOpenWebPageAlertID);
825void LedItApplication::OnCheckForUpdatesWebPageCommand ()
828 Led_URLManager::Get ().Open (MakeSophistsAppNameVersionURL (
"/Led/CheckForUpdates.asp", kAppName));
831#if qStroika_Foundation_Common_Platform_MacOS
832 DoStringyAlert (kCannotOpenWebPageAlertID);
837#if qStroika_Foundation_Common_Platform_MacOS
838void LedItApplication::StartUp ()
841 ObeyCommand (cmd_New, nil);
843 STANDARD_LEDITAPPLICATION_MACOS_CATCHERS ();
846void LedItApplication::MakeMenuBar ()
848 inherited::MakeMenuBar ();
853 MenuRef fontMenuHandle = ::GetMenuHandle (cmd_FontMenu);
855 ::AppendResMenu (fontMenuHandle,
'FONT');
857 LMenu* fontMenu = LMenuBar::GetCurrentMenuBar ()->FetchMenu (cmd_FontMenu);
859 size_t nMenuItems = ::CountMenuItems (fontMenu->GetMacMenuH ());
860 for (
size_t i = 1; i <= nMenuItems; ++i) {
861 fontMenu->SetCommand (i, i - 1 + kBaseFontNameCmd);
867 SInt32 gestaltResponse = 0;
868 aquaUI = (::Gestalt (gestaltMenuMgrAttr, &gestaltResponse) == noErr) and (gestaltResponse & gestaltMenuMgrAquaLayoutMask);
874 MenuHandle helpMenu = NULL;
876 if (::HMGetHelpMenuHandle (&helpMenu) != noErr) {
880 if (helpMenu == NULL) {
882 helpMenu = ::NewMenu (kHelpMenuID,
"\pHelp");
885 ::InsertMenu (helpMenu, append);
887 if (helpMenu != NULL) {
888 ::AppendMenu (helpMenu,
"\pBrowse Local Help");
889 fHelpMenuItem = ::CountMenuItems (helpMenu);
890 ::AppendMenu (helpMenu,
"\p-");
891 ::AppendMenu (helpMenu,
"\pxxx");
892 ::SetMenuItemText (helpMenu, ::CountMenuItems (helpMenu),
"\pGoto LedIt! Web Page");
893 fGotoLedItWebPageMenuItem = ::CountMenuItems (helpMenu);
894 ::AppendMenu (helpMenu,
"\pGoto Sophist Solutions Web Page");
895 fGotoSophistsWebPageMenuItem = ::CountMenuItems (helpMenu);
896 ::AppendMenu (helpMenu,
"\pCheck for LedIt! Web Updates");
897 fCheckForUpdatesWebPageMenuItem = ::CountMenuItems (helpMenu);
903 MenuRef fileMenu = ::GetMenuHandle (kFileMenuID);
906 ::DeleteMenuItem (fileMenu, ::CountMenuItems (fileMenu));
907 ::DeleteMenuItem (fileMenu, ::CountMenuItems (fileMenu));
911void LedItApplication::ProcessNextEvent ()
913 if (sDeepShitCheeseBuf == NULL) {
914 sDeepShitCheeseBuf = ::NewHandle (10 * 1024);
917 inherited::ProcessNextEvent ();
919 STANDARD_LEDITAPPLICATION_MACOS_CATCHERS ();
922void LedItApplication::HandleAppleEvent (
const AppleEvent& inAppleEvent, AppleEvent& outAEReply, AEDesc& outResult,
long inAENumber)
925 inherited::HandleAppleEvent (inAppleEvent, outAEReply, outResult, inAENumber);
927 STANDARD_LEDITAPPLICATION_MACOS_CATCHERS ();
930void LedItApplication::HandleMacOSException (OSErr err)
934 HandleBadAllocException ();
939 NumToString (err, tmp);
940 DoStringyAlert (kGenericMacOSExceptionAlertID, tmp);
945void LedItApplication::HandlePowerPlantException (ExceptionCode err)
947 if (err > 32767 or err < -32768) {
949 ::NumToString (err, tmp);
950 ::DoStringyAlert (kPowerPlantExceptionAlertID, tmp);
953 Led_Assert (err == OSErr (err));
954 HandleMacOSException (OSErr (err));
958Boolean LedItApplication::ObeyCommand (CommandT inCommand,
void* ioParam)
960 Boolean cmdHandled =
true;
962 if ((HiWord ((-inCommand)) == kHMHelpMenuID or HiWord ((-inCommand)) == kHelpMenuID) and fHelpMenuItem == LoWord (-inCommand)) {
963 OnHelpMenuCommand ();
966 if ((HiWord ((-inCommand)) == kHMHelpMenuID or HiWord ((-inCommand)) == kHelpMenuID) and fGotoLedItWebPageMenuItem == LoWord (-inCommand)) {
967 OnGotoLedItWebPageCommand ();
970 if ((HiWord ((-inCommand)) == kHMHelpMenuID or HiWord ((-inCommand)) == kHelpMenuID) and fGotoSophistsWebPageMenuItem == LoWord (-inCommand)) {
971 OnGotoSophistsWebPageCommand ();
974 if ((HiWord ((-inCommand)) == kHMHelpMenuID or HiWord ((-inCommand)) == kHelpMenuID) and fCheckForUpdatesWebPageMenuItem == LoWord (-inCommand)) {
975 OnCheckForUpdatesWebPageCommand ();
979 if (inCommand >= kBaseWindowCmd and inCommand <= kLastWindowCmd) {
980 size_t windowIdx = (inCommand - kBaseWindowCmd);
981 const vector<LWindow*>& windows = LedItDocument::GetDocumentWindows ();
982 if (windowIdx < windows.size ()) {
983 LWindow* w = windows[windowIdx];
985 UDesktop::SelectDeskWindow (w);
994 case kToggleUseSmartCutNPasteCmd:
995 OnToggleSmartCutNPasteOptionCommand ();
997 case kToggleWrapToWindowCmd:
998 OnToggleWrapToWindowOptionCommand ();
1000 case kToggleShowHiddenTextCmd:
1001 OnToggleShowHiddenTextOptionCommand ();
1004 cmdHandled = inherited::ObeyCommand (inCommand, ioParam);
1012void LedItApplication::FindCommandStatus (CommandT inCommand, Boolean& outEnabled, Boolean& outUsesMark, UInt16& outMark, Str255 outName)
1014 if (inCommand >= kBaseWindowCmd and inCommand <= kLastWindowCmd) {
1015 size_t windowIdx = (inCommand - kBaseWindowCmd);
1016 const vector<LWindow*>& windows = LedItDocument::GetDocumentWindows ();
1017 if (windowIdx < windows.size ()) {
1018 LWindow* w = windows[windowIdx];
1021 (void)w->GetDescriptor (outName);
1022 outMark = UDesktop::WindowIsSelected (w) ? checkMark : 0;
1031 outUsesMark =
false;
1032 switch (inCommand) {
1033 case kToggleUseSmartCutNPasteCmd:
1034 OnToggleSmartCutNPasteOption_UpdateCommandUI (&Led_PP_TmpCmdUpdater (inCommand, outEnabled, outUsesMark, outMark, outName));
1036 case kToggleWrapToWindowCmd:
1037 OnToggleWrapToWindowOption_UpdateCommandUI (&Led_PP_TmpCmdUpdater (inCommand, outEnabled, outUsesMark, outMark, outName));
1039 case kToggleShowHiddenTextCmd:
1040 OnToggleShowHiddenTextOption_UpdateCommandUI (&Led_PP_TmpCmdUpdater (inCommand, outEnabled, outUsesMark, outMark, outName));
1043 inherited::FindCommandStatus (inCommand, outEnabled, outUsesMark, outMark, outName);
1048void LedItApplication::OnHelpMenuCommand ()
1052 Led_ThrowOSErr (::FSMakeFSSpec (0, 0,
"\p:LedItDocs:index.html", &fsp));
1053 string helpURL = Led_URLManager::Get ().FileSpecToURL (fsp);
1054 Led_URLManager::Get ().Open (helpURL);
1057 DoStringyAlert (kCannotOpenHelpFileAlertID);
1061void LedItApplication::UseIdleTime (
const EventRecord& inMacEvent)
1063 inherited::UseIdleTime (inMacEvent);
1068 const float kIntervalBetweenWarnings = 10.0f;
1069 if (fLastLowMemWarnAt + kIntervalBetweenWarnings < ::Led_GetTickCount ()) {
1070 bool enufLocalMemory =
true;
1071 bool enufMemory =
true;
1073 Led_CheckSomeLocalHeapRAMAvailable (8 * 1024);
1076 enufLocalMemory =
false;
1079 ::DisposeHandle (Led_DoNewHandle (8 * 1024));
1085 if (not enufLocalMemory) {
1086 DoStringyAlert (kWarnLowLocalRAMAlertID);
1087 fLastLowMemWarnAt = ::Led_GetTickCount ();
1089 if (not enufMemory) {
1090 DoStringyAlert (kWarnLowRAMAlertID);
1091 fLastLowMemWarnAt = ::Led_GetTickCount ();
1095#if qUseMacTmpMemForAllocs && 0
1097 float sLastSendMemBackTryAt = 0;
1098 if (sLastSendMemBackTryAt + 30.0f < ::Led_GetTickCount ()) {
1099 extern void TryToSendSomeTmpMemBackToOS ();
1100 TryToSendSomeTmpMemBackToOS ();
1101 sLastSendMemBackTryAt = ::Led_GetTickCount ();
1106void LedItApplication::OpenDocument (FSSpec* inMacFSSpec)
1108 LedItDocument* doc =
new LedItDocument (
this, eUnknownFormat);
1110 doc->BuildDocWindow (inMacFSSpec);
1118void LedItApplication::OpenDocument (FSSpec* inMacFSSpec, FileFormat format)
1120 LedItDocument* doc =
new LedItDocument (
this, format);
1122 doc->BuildDocWindow (inMacFSSpec);
1130LModelObject* LedItApplication::MakeNewDocument ()
1132 LedItDocument* doc =
new LedItDocument (
this, eDefaultFormat);
1134 doc->BuildDocWindow (NULL);
1144void LedItApplication::ChooseDocument ()
1146 static FilteredSFGetDLog::TypeSpec typeList[] = {
1147 {
"HTML file", kTEXTFileType},
1148 {
"Led Rich Text Format", kLedPrivateDocumentFileType},
1149 {
"Microsoft Rich Text Format (RTF)", kTEXTFileType},
1150 {
"Text file", kTEXTFileType},
1152 FilteredSFGetDLog filteredPicker (typeList, (
sizeof typeList) / (
sizeof typeList[0]));
1154 bool typeSpecified =
false;
1155 size_t typeIndex = 0;
1156 FileFormat format = eUnknownFormat;
1158 if (filteredPicker.PickFile (&fileResult, &typeSpecified, &typeIndex)) {
1159 if (typeSpecified) {
1160 switch (typeIndex) {
1162 format = eHTMLFormat;
1165 format = eLedPrivateFormat;
1168 format = eRTFFormat;
1171 format = eTextFormat;
1177 OpenDocument (&fileResult, format);
1181void LedItApplication::ShowAboutBox ()
1187void LedItApplication::OnToggleSmartCutNPasteOptionCommand ()
1190 o.SetSmartCutAndPaste (not o.GetSmartCutAndPaste ());
1191 UpdateViewsForPrefsChange ();
1194void LedItApplication::OnToggleSmartCutNPasteOption_UpdateCommandUI (CMD_ENABLER* enabler)
1197 enabler->SetEnabled (
true);
1198 enabler->SetChecked (Options{}.GetSmartCutAndPaste ());
1201void LedItApplication::OnToggleWrapToWindowOptionCommand ()
1204 o.SetWrapToWindow (not o.GetWrapToWindow ());
1205 UpdateViewsForPrefsChange ();
1208void LedItApplication::OnToggleWrapToWindowOption_UpdateCommandUI (CMD_ENABLER* enabler)
1211 enabler->SetEnabled (
true);
1212 enabler->SetChecked (Options{}.GetWrapToWindow ());
1215void LedItApplication::OnToggleShowHiddenTextOptionCommand ()
1218 o.SetShowHiddenText (not o.GetShowHiddenText ());
1219 UpdateViewsForPrefsChange ();
1222void LedItApplication::OnToggleShowHiddenTextOption_UpdateCommandUI (CMD_ENABLER* enabler)
1225 enabler->SetEnabled (
true);
1226 enabler->SetChecked (Options{}.GetShowHiddenText ());
1229void LedItApplication::UpdateViewsForPrefsChange ()
1231 bool wrapToWindow = Options{}.GetWrapToWindow ();
1232 bool smartCutNPaste = Options{}.GetSmartCutAndPaste ();
1233 bool showHiddenText = Options{}.GetShowHiddenText ();
1235#if qStroika_Foundation_Common_Platform_MacOS
1236 const TArray<LDocument*>& docList = LDocument::GetDocumentList ();
1237 TArrayIterator<LDocument*> iterator (docList);
1238 LDocument* theDoc = NULL;
1239 while (iterator.Next (theDoc)) {
1241 LedItDocument* d =
dynamic_cast<LedItDocument*
> (theDoc);
1243 d->GetTextView ()->SetSmartCutAndPasteMode (smartCutNPaste);
1244 d->GetTextView ()->SetWrapToWindow (wrapToWindow);
1245 d->GetTextView ()->SetShowHiddenText (showHiddenText);
1247#elif qStroika_Foundation_Common_Platform_Windows
1249 POSITION tp = GetFirstDocTemplatePosition ();
1250 while (tp != NULL) {
1251 CDocTemplate* t = GetNextDocTemplate (tp);
1253 POSITION dp = t->GetFirstDocPosition ();
1254 while (dp != NULL) {
1255 CDocument* doc = t->GetNextDoc (dp);
1257 POSITION vp = doc->GetFirstViewPosition ();
1258 while (vp != NULL) {
1259 CView* v = doc->GetNextView (vp);
1261 LedItView* lv =
dynamic_cast<LedItView*
> (v);
1263 lv->SetSmartCutAndPasteMode (smartCutNPaste);
1264 lv->SetWrapToWindow (wrapToWindow);
1265 lv->SetShowHiddenText (showHiddenText);
1270#elif qStroika_FeatureSupported_XWindows
1272 fTextEditor->SetSmartCutAndPasteMode (smartCutNPaste);
1273 fTextEditor->SetWrapToWindow (wrapToWindow);
1274 fTextEditor->SetShowHiddenText (showHiddenText);
1278#if qStroika_Foundation_Common_Platform_Windows
1279BOOL LedItApplication::InitInstance ()
1281 SetRegistryKey (_T (
"Sophist Solutions, Inc."));
1284 if (!AfxOleInit ()) {
1285 AfxMessageBox (IDP_OLE_INIT_FAILED);
1289#if qIncludeBasicSpellcheckEngine
1290#if qStroika_Foundation_Debug_AssertionsChecked
1291 SpellCheckEngine_Basic::RegressionTest ();
1294 fSpellCheckEngine = make_shared<SpellCheckEngine_Basic_Simple> ();
1296#if qStroika_Foundation_Common_Platform_Windows
1300 TCHAR defaultPath[MAX_PATH + 1];
1301 Verify (::SHGetSpecialFolderPath (
nullptr, defaultPath, CSIDL_FLAG_CREATE | CSIDL_PERSONAL,
true));
1302 fSpellCheckEngine->SetUserDictionary (SDKString{defaultPath} + Led_SDK_TCHAROF (
"\\My LedIt Dictionary.txt"));
1309 EmbeddedObjectCreatorRegistry::Get ().AddStandardTypes ();
1312 EmbeddedObjectCreatorRegistry::Get ().AddAssoc (LedItControlItem::kClipFormat, LedItControlItem::kEmbeddingTag,
1313 LedItControlItem::mkLedItControlItemStyleMarker, LedItControlItem::mkLedItControlItemStyleMarker);
1314 EmbeddedObjectCreatorRegistry::Get ().AddAssoc (kBadClipFormat, RTFIO::RTFOLEEmbedding::kEmbeddingTag,
1315 LedItControlItem::mkLedItControlItemStyleMarker, LedItControlItem::mkLedItControlItemStyleMarker);
1318 CCommandLineInfo cmdInfo;
1319 ParseCommandLine (cmdInfo);
1321 AfxEnableControlContainer ();
1326 Enable3dControlsStatic ();
1330 LoadStdProfileSettings (9);
1332 Assert (m_pDocManager == NULL);
1333 m_pDocManager =
new LedItDocManager ();
1335 AddDocTemplateForString (
"LedIt\n\nLedIt\nLed Rich Text Format (*.led)\n.led\nLedIt.Document\nLedIt Document",
true);
1339 RegisterShellFileTypes (
true);
1343 fOleTemplateServer.UpdateRegistry (OAT_INPLACE_SERVER);
1344 COleObjectFactory::UpdateRegistryAll ();
1347 StandardUnknownTypeStyleMarker::sUnknownPict = (
const Led_DIB*)::LoadAppResource (kUnknownEmbeddingPictID, RT_BITMAP);
1348 StandardMacPictureStyleMarker::sUnsupportedFormatPict = (
const Led_DIB*)::LoadAppResource (kUnsupportedPICTFormatPictID, RT_BITMAP);
1350#if qStroika_Foundation_Common_Platform_Windows
1352 class MyRegistrationHelper :
public Win32UIFileAssociationRegistrationHelper {
1354 using inherited = Win32UIFileAssociationRegistrationHelper;
1357 MyRegistrationHelper ()
1358 : inherited (::AfxGetResourceHandle ())
1363 virtual bool CheckUserSaysOKToUpdate ()
const override
1366 if (o.GetCheckFileAssocsAtStartup ()) {
1367 Led_StdDialogHelper_UpdateWin32FileAssocsDialog dlg (::AfxGetResourceHandle (), ::GetActiveWindow ());
1368 dlg.fAppName = Led_SDK_TCHAROF (
"LedIt!");
1369 dlg.fTypeList = Led_SDK_TCHAROF (
".rtf");
1370 dlg.fKeepChecking =
true;
1371 bool result = dlg.DoModal ();
1372 o.SetCheckFileAssocsAtStartup (dlg.fKeepChecking);
1380 MyRegistrationHelper fileAssocHelper;
1381 SDKString rtfDocIcon = Characters::CString::Format (Led_SDK_TCHAROF (
"$EXE$,%d"), -kLedItRTFDocumentIconID);
1382 fileAssocHelper.Add (Win32UIFileAssociationInfo (Led_SDK_TCHAROF (
".rtf"), Led_SDK_TCHAROF (
"rtffile"),
1383 Led_SDK_TCHAROF (
"Rich Text Document"), rtfDocIcon, Led_SDK_TCHAROF (
"$EXE$ \"%1\"")));
1384 fileAssocHelper.DoIt ();
1389 if (cmdInfo.m_bRunEmbedded || cmdInfo.m_bRunAutomated) {
1392 COleTemplateServer::RegisterAll ();
1400 if (not ProcessShellCommand (cmdInfo)) {
1407#if _MFC_VER >= 0x0700
1408void LedItApplication::WinHelpInternal ([[maybe_unused]] DWORD_PTR dwData, [[maybe_unused]] UINT nCmd)
1410void LedItApplication::WinHelp ([[maybe_unused]] DWORD dwData, [[maybe_unused]] UINT nCmd)
1414 TCHAR directoryName[_MAX_PATH];
1415 Verify (::GetModuleFileName (m_hInstance, directoryName, _MAX_PATH));
1418 LPTSTR lpszExt = _tcsrchr (directoryName,
'\\');
1419 ASSERT (lpszExt != NULL);
1420 ASSERT (*lpszExt ==
'\\');
1421 *(lpszExt + 1) =
'\0';
1423 Characters::CString::Cat (directoryName, Memory::NEltsOf (directoryName), _T (
"LedItDocs\\"));
1429 (void)::ShellExecute (NULL, _T (
"open"), _T (
"index.htm"), NULL, directoryName, SW_SHOWNORMAL);
1432BOOL LedItApplication::PumpMessage ()
1435 return inherited::PumpMessage ();
1437 STD_EXCEPT_CATCHER (*
this);
1441void LedItApplication::HandleMFCException ([[maybe_unused]] CException* e)
noexcept
1444 HandleUnknownException ();
1447void LedItApplication::HandleHRESULTException ([[maybe_unused]] HRESULT hr)
noexcept
1450 HandleUnknownException ();
1454BOOL LedItApplication::OnIdle (LONG lCount)
1456 POSITION tp = GetFirstDocTemplatePosition ();
1457 while (tp != NULL) {
1458 CDocTemplate* t = GetNextDocTemplate (tp);
1460 POSITION dp = t->GetFirstDocPosition ();
1461 while (dp != NULL) {
1462 CDocument* doc = t->GetNextDoc (dp);
1464 POSITION vp = doc->GetFirstViewPosition ();
1465 while (vp != NULL) {
1466 CView* v = doc->GetNextView (vp);
1468 LedItView* lv =
dynamic_cast<LedItView*
> (v);
1470 lv->CallEnterIdleCallback ();
1475 return inherited::OnIdle (lCount);
1479BOOL LedItApplication::ProcessShellCommand (CCommandLineInfo& rCmdInfo)
1482 switch (rCmdInfo.m_nShellCommand) {
1483 case CCommandLineInfo::FileOpen: {
1485 if (not OpenDocumentFile (rCmdInfo.m_strFileName)) {
1492 HANDLE h = ::CreateFile (rCmdInfo.m_strFileName, 0, 0, NULL, OPEN_EXISTING, 0, NULL);
1493 if (h == INVALID_HANDLE_VALUE) {
1496 CDocument* newDoc = NULL;
1498 POSITION tp = GetFirstDocTemplatePosition ();
1500 CDocTemplate* t = GetNextDocTemplate (tp);
1502 POSITION dp = t->GetFirstDocPosition ();
1504 newDoc = t->GetNextDoc (dp);
1509 if (newDoc != NULL) {
1512 newDoc->SetPathName (rCmdInfo.m_strFileName,
false);
1513 newDoc->SetTitle (newDoc->GetTitle () + Led_SDK_TCHAROF (
" {new}"));
1524 return inherited::ProcessShellCommand (rCmdInfo);
1528 STD_EXCEPT_CATCHER (*
this);
1532void LedItApplication::AddDocTemplateForString (
const char* tmplStr,
bool connectToServer)
1534 CSingleDocTemplate* pDocTemplate =
new SimpleLedTemplate (tmplStr);
1535 pDocTemplate->SetContainerInfo (IDR_CNTR_INPLACE);
1536 pDocTemplate->SetServerInfo (IDR_SRVR_EMBEDDED, IDR_SRVR_INPLACE, RUNTIME_CLASS (LedItInPlaceFrame));
1537 AddDocTemplate (pDocTemplate);
1538 if (connectToServer) {
1543 fOleTemplateServer.ConnectTemplate (clsid, pDocTemplate,
true);
1549void LedItApplication::OnAppAbout ()
1554void LedItApplication::OnToggleSmartCutNPasteOptionUpdateCommandUI (CCmdUI* pCmdUI)
1556 OnToggleSmartCutNPasteOption_UpdateCommandUI (CMD_ENABLER (pCmdUI));
1559void LedItApplication::OnToggleWrapToWindowOptionUpdateCommandUI (CCmdUI* pCmdUI)
1561 OnToggleWrapToWindowOption_UpdateCommandUI (CMD_ENABLER (pCmdUI));
1564void LedItApplication::OnToggleShowHiddenTextOptionUpdateCommandUI (CCmdUI* pCmdUI)
1566 OnToggleShowHiddenTextOption_UpdateCommandUI (CMD_ENABLER (pCmdUI));
1570void LedItApplication::OnChooseDefaultFontCommand ()
1572#if qStroika_Foundation_Common_Platform_Windows
1576 (void)::memset (&lf, 0,
sizeof (lf));
1578 Characters::CString::Copy (lf.lfFaceName, Memory::NEltsOf (lf.lfFaceName), fsp.GetFontNameSpecifier ().fName);
1579 Assert (::_tcslen (lf.lfFaceName) < sizeof (lf.lfFaceName));
1581 lf.lfWeight = (fsp.GetStyle_Bold ()) ? FW_BOLD : FW_NORMAL;
1582 lf.lfItalic = (fsp.GetStyle_Italic ());
1583 lf.lfUnderline = (fsp.GetStyle_Underline ());
1584 lf.lfStrikeOut = (fsp.GetStyle_Strikeout ());
1586 lf.lfHeight = fsp.PeekAtTMHeight ();
1588 CFontDialog dlog (&lf);
1589 if (dlog.DoModal () == IDOK) {
1597void LedItApplication::HandleBadAllocException () noexcept
1600#if qStroika_Foundation_Common_Platform_Windows
1601 CDialog errorDialog (kBadAllocExceptionOnCmdDialogID);
1602 errorDialog.DoModal ();
1603#elif qStroika_Foundation_Common_Platform_MacOS
1605 TArray<LDocument*>& docList = LDocument::GetDocumentList ();
1606 TArrayIterator<LDocument*> iterator (docList);
1607 LDocument* theDoc = NULL;
1608 while (iterator.Next (theDoc)) {
1610 LedItDocument* d =
dynamic_cast<LedItDocument*
> (theDoc);
1611 d->PurgeUnneededMemory ();
1614 DoStringyAlert (kMemoryExceptionAlertID);
1616 HandleUnknownException ();
1624void LedItApplication::HandleBadUserInputException () noexcept
1627#if qStroika_Foundation_Common_Platform_MacOS
1628 DoStringyAlert (kBadUserInputExceptionAlertID);
1629#elif qStroika_Foundation_Common_Platform_Windows
1630 CDialog errorDialog (kBadUserInputExceptionOnCmdDialogID);
1631 errorDialog.DoModal ();
1633 HandleUnknownException ();
1641void LedItApplication::HandleUnknownException () noexcept
1644#if qStroika_Foundation_Common_Platform_MacOS
1645 DoStringyAlert (kUnknownExceptionAlertID);
1646#elif qStroika_Foundation_Common_Platform_Windows
1647 CDialog errorDialog (kUnknownExceptionOnCmdDialogID);
1648 errorDialog.DoModal ();
1656#if qStroika_FeatureSupported_XWindows
1657gint LedItApplication::delete_event (GtkWidget* widget, gpointer data)
1667 g_print (
"delete event occurred\n");
1675void LedItApplication::xdestroy (GtkWidget* widget, gpointer data)
1677 LedItApplication* THIS =
reinterpret_cast<LedItApplication*
> (data);
1678 THIS->OnQuitCommand ();
1681void LedItApplication::OnNewDocumentCommand ()
1683 WordProcessor* wp = fTextEditor;
1684 TextStore& ts = wp->GetTextStore ();
1685 ts.Replace (ts.GetStart (), ts.GetEnd (), LED_TCHAR_OF (
""), 0);
1686 wp->SetDefaultFont (wp->GetStaticDefaultFont ());
1687 fDocument->fPathName =
string{};
1688 UpdateFrameWindowTitle ();
1691void LedItApplication::OnOpenDocumentCommand ()
1693 LedItFilePickBox filePickerDlg (GTK_WINDOW (fAppWindow), Led_SDK_TCHAROF (
"Open new document"),
false, SDKString{}, eUnknownFormat);
1694 if (filePickerDlg.DoModal ()) {
1696 LoadFromFile (filePickerDlg.GetFileName (), filePickerDlg.GetFileFormat ());
1704void LedItApplication::OnSaveDocumentCommand ()
1706#if qPrintGLIBTradeMessages
1707 g_message (
"Entering OnSaveDocumentCommand\n");
1709 if (fDocument->fPathName.empty ()) {
1710 OnSaveAsDocumentCommand ();
1717void LedItApplication::OnSaveAsDocumentCommand ()
1719 LedItFilePickBox filePickerDlg (GTK_WINDOW (fAppWindow), Led_SDK_TCHAROF (
"Save document as:"),
true, fDocument->fPathName, fDocument->fFileFormat);
1720 if (filePickerDlg.DoModal ()) {
1722 SaveAs (filePickerDlg.GetFileName (), filePickerDlg.GetFileFormat ());
1730void LedItApplication::OnQuitCommand ()
1732#if qPrintGLIBTradeMessages
1733 g_message (
"Entering OnQuitCommand\n");
1735 gtk_widget_destroy (fTextEditor->Get_GtkWidget ());
1740void LedItApplication::LoadFromFile (
const string& fileName, FileFormat fileFormat)
1742 WordProcessor* wp = fTextEditor;
1743 TextStore& ts = wp->GetTextStore ();
1744 ts.Replace (ts.GetStart (), ts.GetEnd (), LED_TCHAR_OF (
""), 0);
1745 wp->SetDefaultFont (wp->GetStaticDefaultFont ());
1746 fDocument->LoadFromFile (fileName, fileFormat);
1747 UpdateFrameWindowTitle ();
1750inline SDKString StripKnownSuffix (
const SDKString& from)
1753 SDKString suffix = ExtractFileSuffix (from);
1754 if (suffix ==
".rtf" or suffix ==
".txt" or suffix ==
".led" or suffix ==
".htm" or suffix ==
".html") {
1755 result.erase (result.length () - suffix.length ());
1759void LedItApplication::SaveAs (
const string& fileName, FileFormat fileFormat)
1761 Require (not fileName.empty ());
1764 fDocument->fPathName = fileName;
1770 SDKString suffix = ExtractFileSuffix (fileName);
1771 switch (fileFormat) {
1773 if (suffix !=
".htm" and suffix !=
".html") {
1774 fDocument->fPathName = StripKnownSuffix (fDocument->fPathName);
1775 fDocument->fPathName +=
".htm";
1779 if (suffix !=
".rtf") {
1780 fDocument->fPathName = StripKnownSuffix (fDocument->fPathName);
1781 fDocument->fPathName +=
".rtf";
1784 case eLedPrivateFormat: {
1785 if (suffix !=
".led") {
1786 fDocument->fPathName = StripKnownSuffix (fDocument->fPathName);
1787 fDocument->fPathName +=
".led";
1792 fDocument->fFileFormat = fileFormat;
1794 UpdateFrameWindowTitle ();
1797void LedItApplication::Save ()
1803void LedItApplication::UpdateFrameWindowTitle ()
1806 SDKString docName = Led_SDK_TCHAROF (
"untitled");
1807 if (fDocument != NULL and not fDocument->fPathName.empty ()) {
1808 docName = fDocument->fPathName;
1810 SDKString appTitle = Led_SDK_TCHAROF (
"LedIt! [") + docName + Led_SDK_TCHAROF (
"]");
1811 gtk_window_set_title (GTK_WINDOW (fAppWindow), appTitle.c_str ());
1814void LedItApplication::AppCmdDispatcher (gpointer callback_data, guint callback_action, GtkWidget* widget)
1816 LedItApplication* THIS =
reinterpret_cast<LedItApplication*
> (callback_data);
1817 GtkWidget* w = THIS->fTextEditor->Get_GtkWidget ();
1818 switch (callback_action) {
1819 case kGotoLedItWebPageCmd:
1820 THIS->OnGotoLedItWebPageCommand ();
1822 case kGotoSophistsWebPageCmd:
1823 THIS->OnGotoSophistsWebPageCommand ();
1825 case kCheckForUpdatesWebPageCmdID:
1826 THIS->OnCheckForUpdatesWebPageCommand ();
1829 THIS->DoAboutBox ();
1831 case kNewDocumentCmd:
1832 THIS->OnNewDocumentCommand ();
1834 case kOpenDocumentCmd:
1835 THIS->OnOpenDocumentCommand ();
1837 case kSaveDocumentCmd:
1838 THIS->OnSaveDocumentCommand ();
1840 case kSaveAsDocumentCmd:
1841 THIS->OnSaveAsDocumentCommand ();
1843 case kToggleUseSmartCutNPasteCmd:
1844 THIS->OnToggleSmartCutNPasteOptionCommand ();
1846 case kToggleWrapToWindowCmd:
1847 THIS->OnToggleWrapToWindowOptionCommand ();
1849 case kToggleShowHiddenTextCmd:
1850 THIS->OnToggleShowHiddenTextOptionCommand ();
1853 THIS->OnQuitCommand ();
1856 LedItView::DispatchCommandCallback (LedItView::WidgetToTHIS (w), callback_action, widget);
1860void LedItApplication::AppCmdOnInitMenu (GtkMenuItem* menuItem, gpointer callback_data)
1862 LedItApplication* THIS =
reinterpret_cast<LedItApplication*
> (callback_data);
1863 GtkWidget* w = THIS->fTextEditor->Get_GtkWidget ();
1865 GtkWidget* subMenu = menuItem->submenu;
1867 Led_Assert (GTK_IS_MENU_SHELL (subMenu));
1868 for (GList* i = GTK_MENU_SHELL (subMenu)->children; i != NULL; i = i->next) {
1869 GtkMenuItem* m =
reinterpret_cast<GtkMenuItem*
> (i->data);
1870 Led_Assert (GTK_IS_MENU_ITEM (m));
1871 bool bEnable = (GTK_MENU_ITEM (m)->submenu != NULL);
1872 gtk_widget_set_sensitive (GTK_WIDGET (m), bEnable);
1873 if (GTK_IS_CHECK_MENU_ITEM (m)) {
1874 GtkCheckMenuItem* cm = GTK_CHECK_MENU_ITEM (m);
1882 Led_Gtk_TmpCmdUpdater::CommandNumber commandNum =
reinterpret_cast<guint
> (gtk_object_get_user_data (GTK_OBJECT (m)));
1884 switch (commandNum) {
1885 case kGotoLedItWebPageCmd:
1886 gtk_widget_set_sensitive (GTK_WIDGET (m),
true);
1888 case kGotoSophistsWebPageCmd:
1889 gtk_widget_set_sensitive (GTK_WIDGET (m),
true);
1891 case kCheckForUpdatesWebPageCmdID:
1892 gtk_widget_set_sensitive (GTK_WIDGET (m),
true);
1895 gtk_widget_set_sensitive (GTK_WIDGET (m),
true);
1897 case kNewDocumentCmd:
1898 gtk_widget_set_sensitive (GTK_WIDGET (m),
true);
1900 case kOpenDocumentCmd:
1901 gtk_widget_set_sensitive (GTK_WIDGET (m),
true);
1904 case kSaveAsDocumentCmd:
1905 gtk_widget_set_sensitive (GTK_WIDGET (m),
true);
1907 case kToggleUseSmartCutNPasteCmd:
1908 THIS->OnToggleSmartCutNPasteOption_UpdateCommandUI (CMD_ENABLER (m, commandNum));
1910 case kToggleWrapToWindowCmd:
1911 THIS->OnToggleWrapToWindowOption_UpdateCommandUI (CMD_ENABLER (m, commandNum));
1913 case kToggleShowHiddenTextCmd:
1914 THIS->OnToggleShowHiddenTextOption_UpdateCommandUI (CMD_ENABLER (m, commandNum));
1917 gtk_widget_set_sensitive (GTK_WIDGET (m),
true);
1920 THIS->fTextEditor->DispatchCommandUpdateCallback (m, commandNum);
1926GtkWidget* LedItApplication::GetAppWindow ()
const
1953GtkItemFactoryEntry LedItApplication::kMenuItemResources[] = {
1954 {
"/_File", NULL, NULL, 0,
"<Branch>"},
1955 {
"/File/_New",
"<control>N", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kNewDocumentCmd, NULL},
1956 {
"/File/_Open...",
"<control>O", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kOpenDocumentCmd, NULL},
1957 {
"/File/_Save",
"<control>S", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSaveDocumentCmd, NULL},
1958 {
"/File/Sa_ve As...", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSaveAsDocumentCmd, NULL},
1959 {
"/File/sep1", NULL, NULL, 0,
"<Separator>"},
1960 {
"/File/_Quit",
"<control>Q", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kQuitCmd, NULL},
1962 {
"/_Edit", NULL, NULL, 0,
"<Branch>"},
1963 {
"/Edit/_Undo",
"<control>Z", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kCmdUndo, NULL},
1964 {
"/Edit/_Redo",
"<control>Y", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kCmdRedo, NULL},
1965 {
"/Edit/", NULL, NULL, 0,
"<Separator>"},
1966 {
"/Edit/_Cut",
"<control>X", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kCmdCut, NULL},
1967 {
"/Edit/C_opy",
"<control>C", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kCmdCopy, NULL},
1968 {
"/Edit/_Paste",
"<control>V", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kCmdPaste, NULL},
1969 {
"/Edit/C_lear", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kCmdClear, NULL},
1971 {
"/_Select", NULL, NULL, 0,
"<Branch>"},
1972 {
"/Select/Select _Word(s)", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSelectWordCmd, NULL},
1973 {
"/Select/Select Te_xt Row(s)", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSelectTextRowCmd, NULL},
1974 {
"/Select/Select _Paragraph(s)", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSelectParagraphCmd, NULL},
1975 {
"/Select/", NULL, NULL, 0,
"<Separator>"},
1976 {
"/Select/Select A_ll in Cell", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSelectTableIntraCellAllCmd, NULL},
1977 {
"/Select/Select Table _Cell", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSelectTableCellCmd, NULL},
1978 {
"/Select/Select Table Ro_w(s)", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSelectTableRowCmd, NULL},
1979 {
"/Select/Select Table C_olumn(s)", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSelectTableColumnCmd, NULL},
1980 {
"/Select/Select _Table", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSelectTableCmd, NULL},
1981 {
"/Select/", NULL, NULL, 0,
"<Separator>"},
1982 {
"/Select/Select _All",
"<control>A", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kCmdSelectAll, NULL},
1983 {
"/Select/", NULL, NULL, 0,
"<Separator>"},
1984 {
"/Select/_Find...",
"<control>F", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFindCmd, NULL},
1985 {
"/Select/Find Aga_in",
"<control>G", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFindAgainCmd, NULL},
1986 {
"/Select/_Enter 'Find' String",
"<control>E", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kEnterFindStringCmd, NULL},
1987 {
"/Select/_Replace...",
"<control>H", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kReplaceCmd, NULL},
1988 {
"/Select/Replace Agai_n",
"<control>R", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kReplaceAgainCmd, NULL},
1989 {
"/Select/", NULL, NULL, 0,
"<Separator>"},
1990 {
"/Select/_Check Spelling...",
"<control>L", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSpellCheckCmd, NULL},
1992 {
"/_Insert", NULL, NULL, 0,
"<Branch>"},
1993 {
"/Insert/Insert _Table", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kInsertTableCmd, NULL},
1994 {
"/Insert/Insert Table _Row Above", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kInsertTableRowAboveCmd, NULL},
1995 {
"/Insert/Insert Table R_ow Below", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kInsertTableRowBelowCmd, NULL},
1996 {
"/Insert/Insert Table _Column Before", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kInsertTableColBeforeCmd, NULL},
1997 {
"/Insert/Insert Table Co_lumn After", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kInsertTableColAfterCmd, NULL},
1998 {
"/Insert/", NULL, NULL, 0,
"<Separator>"},
1999 {
"/Insert/Insert _URL", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kInsertURLCmd, NULL},
2001 {
"/_Format", NULL, NULL, 0,
"<Branch>"},
2002 {
"/_Format/Font _Name", NULL, NULL, 0,
"<Branch>"},
2003 {
"/_Format/Font _Style", NULL, NULL, 0,
"<Branch>"},
2004 {
"/_Format/Font _Style/_Plain",
"<control>T", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontStylePlainCmd,
"<CheckItem>"},
2005 {
"/_Format/Font _Style/sep1", NULL, NULL, 0,
"<Separator>"},
2006 {
"/_Format/Font _Style/_Bold",
"<control>B", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontStyleBoldCmd,
"<CheckItem>"},
2007 {
"/_Format/Font _Style/_Italic",
"<control>I", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontStyleItalicCmd,
"<CheckItem>"},
2008 {
"/_Format/Font _Style/_Underline",
"<control>U", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontStyleUnderlineCmd,
"<CheckItem>"},
2009 {
"/_Format/Font _Style/_Subscript", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSubScriptCmd,
"<CheckItem>"},
2010 {
"/_Format/Font _Style/Supe_rscript", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSuperScriptCmd,
"<CheckItem>"},
2011 {
"/_Format/Font Si_ze", NULL, NULL, 0,
"<Branch>"},
2012 {
"/_Format/Font Si_ze/9", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontSize9Cmd,
"<CheckItem>"},
2013 {
"/_Format/Font Si_ze/10", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontSize10Cmd,
"<CheckItem>"},
2014 {
"/_Format/Font Si_ze/12", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontSize12Cmd,
"<CheckItem>"},
2015 {
"/_Format/Font Si_ze/14", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontSize14Cmd,
"<CheckItem>"},
2016 {
"/_Format/Font Si_ze/18", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontSize18Cmd,
"<CheckItem>"},
2017 {
"/_Format/Font Si_ze/24", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontSize24Cmd,
"<CheckItem>"},
2018 {
"/_Format/Font Si_ze/36", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontSize36Cmd,
"<CheckItem>"},
2019 {
"/_Format/Font Si_ze/48", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontSize48Cmd,
"<CheckItem>"},
2020 {
"/_Format/Font Si_ze/72", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontSize72Cmd,
"<CheckItem>"},
2021 {
"/_Format/Font Si_ze/sep1", NULL, NULL, 0,
"<Separator>"},
2022 {
"/_Format/Font Si_ze/_Smaller", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontSizeSmallerCmd, NULL},
2023 {
"/_Format/Font Si_ze/_Larger", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontSizeLargerCmd, NULL},
2024 {
"/_Format/Font Si_ze/sep2", NULL, NULL, 0,
"<Separator>"},
2025 {
"/_Format/Font Si_ze/_Other...", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontSizeOtherCmd,
"<CheckItem>"},
2026 {
"/_Format/Font _Color", NULL, NULL, 0,
"<Branch>"},
2027 {
"/_Format/Font _Color/_Black", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kBlackColorCmd,
"<CheckItem>"},
2028 {
"/_Format/Font _Color/_Maroon", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kMaroonColorCmd,
"<CheckItem>"},
2029 {
"/_Format/Font _Color/_Green", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kGreenColorCmd,
"<CheckItem>"},
2030 {
"/_Format/Font _Color/_Olive", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kOliveColorCmd,
"<CheckItem>"},
2031 {
"/_Format/Font _Color/_Navy", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kNavyColorCmd,
"<CheckItem>"},
2032 {
"/_Format/Font _Color/_Purple", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kPurpleColorCmd,
"<CheckItem>"},
2033 {
"/_Format/Font _Color/_Teal", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kTealColorCmd,
"<CheckItem>"},
2034 {
"/_Format/Font _Color/_Gray", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kGrayColorCmd,
"<CheckItem>"},
2035 {
"/_Format/Font _Color/_Silver", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSilverColorCmd,
"<CheckItem>"},
2036 {
"/_Format/Font _Color/_Red", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kRedColorCmd,
"<CheckItem>"},
2037 {
"/_Format/Font _Color/_Lime", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kLimeColorCmd,
"<CheckItem>"},
2038 {
"/_Format/Font _Color/_Yellow", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kYellowColorCmd,
"<CheckItem>"},
2039 {
"/_Format/Font _Color/Bl_ue", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kBlueColorCmd,
"<CheckItem>"},
2040 {
"/_Format/Font _Color/_Fuchsia", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFuchsiaColorCmd,
"<CheckItem>"},
2041 {
"/_Format/Font _Color/_Aqua", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kAquaColorCmd,
"<CheckItem>"},
2042 {
"/_Format/Font _Color/_White", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kWhiteColorCmd,
"<CheckItem>"},
2043 {
"/_Format/Font _Color/sep", NULL, NULL, 0,
"<Separator>"},
2044 {
"/_Format/Font _Color/O_ther...", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontColorOtherCmd,
"<CheckItem>"},
2045 {
"/_Format/_Choose Font Dialog...",
"<control>D", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kChooseFontDialogCmd, NULL},
2046 {
"/_Format/sep", NULL, NULL, 0,
"<Separator>"},
2047 {
"/_Format/_Justification", NULL, NULL, 0,
"<Branch>"},
2048 {
"/_Format/_Justification/_Left", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kJustifyLeftCmd,
"<CheckItem>"},
2049 {
"/_Format/_Justification/_Center", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kJustifyCenterCmd,
"<CheckItem>"},
2050 {
"/_Format/_Justification/_Right", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kJustifyRightCmd,
"<CheckItem>"},
2051 {
"/_Format/_Justification/_Full", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kJustifyFullCmd,
"<CheckItem>"},
2053 {
"/_Remove/", NULL, NULL, 0,
"<Separator>"},
2054 {
"/_Remove/Remove _Rows", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kRemoveTableRowsCmd, NULL},
2055 {
"/_Remove/Remove _Columns", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kRemoveTableColumnsCmd, NULL},
2056 {
"/_Remove/sep", NULL, NULL, 0,
"<Separator>"},
2057 {
"/_Remove/_Hide Selection", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kHideSelectionCmd, NULL},
2058 {
"/_Remove/_Unhide Selection", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kUnHideSelectionCmd, NULL},
2060 {
"/_Options", NULL, NULL, 0,
"<Branch>"},
2061 {
"/Options/_Smart Cut and Paste", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kToggleUseSmartCutNPasteCmd,
"<CheckItem>"},
2062 {
"/Options/_Wrap to Window", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kToggleWrapToWindowCmd,
"<CheckItem>"},
2063 {
"/Options/Show _Hidden Text", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kToggleShowHiddenTextCmd,
"<CheckItem>"},
2064 {
"/Options/_Paragraph Markers Shown", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kShowHideParagraphGlyphsCmd,
"<CheckItem>"},
2065 {
"/Options/_Tab Markers Shown", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kShowHideTabGlyphsCmd,
"<CheckItem>"},
2066 {
"/Options/Spa_ce characters Shown", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kShowHideSpaceGlyphsCmd,
"<CheckItem>"},
2068 {
"/_Help", NULL, NULL, 0,
"<LastBranch>"},
2069 {
"/_Help/Goto _LedIt! Web Page", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kGotoLedItWebPageCmd, NULL},
2070 {
"/_Help/Goto _Sophist Solutions Web Page", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kGotoSophistsWebPageCmd, NULL},
2071 {
"/_Help/_Check for LedIt! Web Updates", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kCheckForUpdatesWebPageCmdID, NULL},
2072 {
"/_Help/sep", NULL, NULL, 0,
"<Separator>"},
2073 {
"/_Help/_About", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kAboutBoxCmd, NULL},
2076static void RecursivelySetCallback (GtkWidget* menu, gpointer data)
2078 if (GTK_IS_MENU_ITEM (menu)) {
2079 GtkMenuItem* m = GTK_MENU_ITEM (menu);
2080 if (m->submenu != NULL) {
2081 gtk_signal_connect (GTK_OBJECT (menu),
"activate", GTK_SIGNAL_FUNC (LedItApplication::AppCmdOnInitMenu), data);
2082 RecursivelySetCallback (m->submenu, data);
2085 if (GTK_IS_CONTAINER (menu)) {
2086 GtkContainer* c = GTK_CONTAINER (menu);
2087 gtk_container_foreach (c, RecursivelySetCallback, data);
2091GtkWidget* LedItApplication::get_main_menu (GtkWidget* window)
2093 GtkAccelGroup* accel_group = gtk_accel_group_new ();
2103 GtkItemFactory* item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR,
"<main>", accel_group);
2108 gtk_item_factory_create_items (item_factory, Led_NEltsOf (kMenuItemResources), kMenuItemResources,
this);
2111 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
2114 const string kFontMenuPath =
"/Format/Font Name";
2115 GtkWidget* fontNameMenu = gtk_item_factory_get_widget (item_factory, kFontMenuPath.c_str ());
2116 vector<SDKString> fontNames = LedItApplication::Get ().fInstalledFonts.GetUsableFontNames ();
2117 for (vector<SDKString>::const_iterator i = fontNames.begin (); i != fontNames.end (); ++i) {
2118 GtkItemFactoryEntry entry;
2119 memset (&entry, 0,
sizeof (entry));
2120 string fontName = *i;
2121 string tmpPath = kFontMenuPath +
"/" + fontName;
2122 entry.path =
const_cast<char*
> (tmpPath.c_str ());
2123 entry.callback = GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher);
2124 entry.callback_action = (i - fontNames.begin ()) + kBaseFontNameCmd;
2125 entry.item_type =
"<CheckItem>";
2126 gtk_item_factory_create_items (item_factory, 1, &entry,
this);
2129 GtkWidget* justCreatedItem = gtk_item_factory_get_widget (item_factory, entry.path);
2131 gtk_object_set_user_data (GTK_OBJECT (justCreatedItem),
reinterpret_cast<void*
> (entry.callback_action));
2139 for (
size_t i = 0; i < Led_NEltsOf (kMenuItemResources); ++i) {
2140 string path = kMenuItemResources[i].path;
2143 for (
size_t idx; (idx = path.find (
'_')) != string::npos;) {
2144 path.erase (idx, 1);
2148 GtkWidget* aMenu = gtk_item_factory_get_widget (item_factory, path.c_str ());
2150 gtk_object_set_user_data (GTK_OBJECT (aMenu),
reinterpret_cast<void*
> (kMenuItemResources[i].callback_action));
2155 GtkWidget* menuBar = gtk_item_factory_get_widget (item_factory,
"<main>");
2156 RecursivelySetCallback (menuBar,
this);
2161#if qStroika_Foundation_Common_Platform_Windows
2162const vector<SDKString>& LedItApplication::GetUsableFontNames ()
2164 return fInstalledFonts.GetUsableFontNames ();
2167void LedItApplication::FixupFontMenu (CMenu* fontMenu)
2170 const vector<SDKString>& fontNames = GetUsableFontNames ();
2173 while (fontMenu->DeleteMenu (0, MF_BYPOSITION) != 0) {
2177 for (UINT i = 0; i < fontNames.size (); ++i) {
2178 UINT cmdNum = kBaseFontNameCmd + i;
2179 fontMenu->AppendMenu (MF_STRING, cmdNum, fontNames[i].c_str ());
2183SDKString LedItApplication::CmdNumToFontName (UINT cmdNum)
2185 const vector<SDKString>& fontNames = GetUsableFontNames ();
2186 return (fontNames[cmdNum - kBaseFontNameCmd]);
2190#if qStroika_Foundation_Common_Platform_Windows
2196SimpleLedTemplate::SimpleLedTemplate (
const char* daStr)
2197 : CSingleDocTemplate (IDR_MAINFRAME, RUNTIME_CLASS (LedItDocument), RUNTIME_CLASS (LedItMainFrame), RUNTIME_CLASS (LedItView))
2199 m_strDocStrings = daStr;
2202void SimpleLedTemplate::LoadTemplate ()
2204 bool doMenuEmbedding = (m_hMenuEmbedding == NULL);
2205 bool doMenuInPlaceServer = (m_hMenuInPlaceServer == NULL);
2206 bool doMenuInPlace = (m_hMenuInPlace == NULL);
2207 CSingleDocTemplate::LoadTemplate ();
2210 if (doMenuEmbedding and m_hMenuEmbedding != NULL) {
2215 tmp.Attach (m_hMenuEmbedding);
2216 LedItApplication::Get ().FixupFontMenu (tmp.GetSubMenu (4)->GetSubMenu (0));
2219 if (doMenuInPlaceServer and m_hMenuInPlaceServer != NULL) {
2224 tmp.Attach (m_hMenuInPlaceServer);
2225 LedItApplication::Get ().FixupFontMenu (tmp.GetSubMenu (3)->GetSubMenu (0));
2228 if (doMenuInPlace and m_hMenuInPlace != NULL) {
2235#if qStroika_Foundation_Common_Platform_Windows
2243extern BOOL AFXAPI AfxFullPath (LPTSTR lpszPathOut, LPCTSTR lpszFileIn);
2244extern BOOL AFXAPI AfxResolveShortcut (CWnd* pWnd, LPCTSTR pszShortcutFile, LPTSTR pszPath,
int cchPath);
2245extern void AFXAPI AfxGetModuleShortFileName (HINSTANCE hInst, CString& strShortName);
2247LedItDocManager::LedItDocManager ()
2252void LedItDocManager::OnFileNew ()
2256 CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetHead ();
2257 ASSERT (pTemplate != NULL);
2258 ASSERT_KINDOF (CDocTemplate, pTemplate);
2259 (void)pTemplate->OpenDocumentFile (NULL);
2262CDocument* LedItDocManager::OpenDocumentFile (LPCTSTR lpszFileName)
2264 return OpenDocumentFile (lpszFileName, eUnknownFormat);
2267inline SDKString GetLongPathName (
const SDKString& pathName)
2269 TCHAR szPath[_MAX_PATH];
2270 Require (pathName.length () < _MAX_PATH);
2271 Characters::CString::Copy (szPath, Memory::NEltsOf (szPath), pathName.c_str ());
2272 WIN32_FIND_DATA fileData;
2273 HANDLE hFind = ::FindFirstFile (szPath, &fileData);
2274 if (hFind != INVALID_HANDLE_VALUE) {
2275 TCHAR* lastSlash = ::_tcsrchr (szPath,
'\\');
2276 if (lastSlash != NULL) {
2279 Characters::CString::Cat (szPath, Memory::NEltsOf (szPath), _T (
"\\"));
2280 Characters::CString::Cat (szPath, Memory::NEltsOf (szPath), fileData.cFileName);
2281 szPath[_MAX_PATH - 1] =
'\0';
2282 VERIFY (::FindClose (hFind));
2286CDocument* LedItDocManager::OpenDocumentFile (LPCTSTR lpszFileName, FileFormat format)
2294 CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetHead ();
2295 ASSERT (pTemplate != NULL);
2296 ASSERT_KINDOF (CDocTemplate, pTemplate);
2298 TCHAR szPath[_MAX_PATH];
2299 ASSERT (::_tcslen (lpszFileName) < _MAX_PATH);
2300 TCHAR szTemp[_MAX_PATH];
2301 if (lpszFileName[0] ==
'\"')
2303 Characters::CString::Copy (szTemp, Memory::NEltsOf (szTemp), lpszFileName);
2304 LPTSTR lpszLast = _tcsrchr (szTemp,
'\"');
2305 if (lpszLast != NULL)
2307 AfxFullPath (szPath, szTemp);
2308 TCHAR szLinkName[_MAX_PATH];
2309 if (AfxResolveShortcut (AfxGetMainWnd (), szPath, szLinkName, _MAX_PATH))
2310 Characters::CString::Copy (szPath, Memory::NEltsOf (szPath), szLinkName);
2314 Characters::CString::Copy (szPath, Memory::NEltsOf (szPath), GetLongPathName (szPath).c_str ());
2316 LedItDocument::sHiddenDocOpenArg = format;
2317 return (pTemplate->OpenDocumentFile (szPath));
2320void LedItDocManager::RegisterShellFileTypes (BOOL bWin95)
2324 CString strPathName, strTemp;
2326 AfxGetModuleShortFileName (AfxGetInstanceHandle (), strPathName);
2330 RegisterShellFileType (bWin95, strPathName, 1,
".led",
"LedIt.Document",
"LedIt Document");
2333void LedItDocManager::RegisterShellFileType (
bool bWin95, CString strPathName,
int iconIndexInFile, CString strFilterExt,
2334 CString strFileTypeId, CString strFileTypeName)
2336 static const TCHAR szShellOpenFmt[] = _T(
"%s\\shell\\open\\%s");
2337 static const TCHAR szShellPrintFmt[] = _T(
"%s\\shell\\print\\%s");
2338 static const TCHAR szShellPrintToFmt[] = _T(
"%s\\shell\\printto\\%s");
2339 static const TCHAR szDefaultIconFmt[] = _T(
"%s\\DefaultIcon");
2340 static const TCHAR szShellNewFmt[] = _T(
"%s\\ShellNew");
2341 static const TCHAR szIconIndexFmt[] = _T(
",%d");
2342 static const TCHAR szCommand[] = _T(
"command");
2343 static const TCHAR szOpenArg[] = _T(
" \"%1\"");
2344 static const TCHAR szPrintArg[] = _T(
" /p \"%1\"");
2345 static const TCHAR szPrintToArg[] = _T(
" /pt \"%1\" \"%2\" \"%3\" \"%4\"");
2347 static const TCHAR szShellNewValueName[] = _T(
"NullFile");
2348 static const TCHAR szShellNewValue[] = _T(
"");
2350 const int DEFAULT_ICON_INDEX = 0;
2352 CString strOpenCommandLine = strPathName;
2353 CString strPrintCommandLine = strPathName;
2354 CString strPrintToCommandLine = strPathName;
2355 CString strDefaultIconCommandLine = strPathName;
2358 CString strIconIndex;
2359 HICON hIcon = ::ExtractIcon (AfxGetInstanceHandle (), strPathName, iconIndexInFile);
2360 if (hIcon != NULL) {
2361 strIconIndex.Format (szIconIndexFmt, iconIndexInFile);
2362 ::DestroyIcon (hIcon);
2365 strIconIndex.Format (szIconIndexFmt, DEFAULT_ICON_INDEX);
2367 strDefaultIconCommandLine += strIconIndex;
2370 if (!strFileTypeId.IsEmpty ()) {
2374 if (strFileTypeName.IsEmpty ()) {
2375 strFileTypeName = strFileTypeId;
2378 ASSERT (strFileTypeId.Find (
' ') == -1);
2381 if (!SetRegKey (strFileTypeId, strFileTypeName)) {
2387 strTemp.Format (szDefaultIconFmt, (LPCTSTR)strFileTypeId);
2388 if (!SetRegKey (strTemp, strDefaultIconCommandLine)) {
2397 strOpenCommandLine += szOpenArg;
2399 strPrintCommandLine += szPrintArg;
2400 strPrintToCommandLine += szPrintToArg;
2404 strTemp.Format (szShellOpenFmt, (LPCTSTR)strFileTypeId, (LPCTSTR)szCommand);
2405 if (!SetRegKey (strTemp, strOpenCommandLine)) {
2411 strTemp.Format (szShellPrintFmt, (LPCTSTR)strFileTypeId, (LPCTSTR)szCommand);
2412 if (!SetRegKey (strTemp, strPrintCommandLine)) {
2417 strTemp.Format (szShellPrintToFmt, (LPCTSTR)strFileTypeId, (LPCTSTR)szCommand);
2418 if (!SetRegKey (strTemp, strPrintToCommandLine)) {
2423 if (!strFilterExt.IsEmpty ()) {
2424 ASSERT (strFilterExt[0] ==
'.');
2425 LONG lSize = _MAX_PATH * 2;
2426 LONG lResult = ::RegQueryValue (HKEY_CLASSES_ROOT, strFilterExt, strTemp.GetBuffer (lSize), &lSize);
2427 strTemp.ReleaseBuffer ();
2428 if (lResult != ERROR_SUCCESS || strTemp.IsEmpty () || strTemp == strFileTypeId) {
2430 if (!SetRegKey (strFilterExt, strFileTypeId)) {
2434 strTemp.Format (szShellNewFmt, (LPCTSTR)strFilterExt);
2435 (void)SetRegKey (strTemp, szShellNewValue, szShellNewValueName);
2442BOOL LedItDocManager::DoPromptFileName (CString& , UINT , DWORD , BOOL , CDocTemplate* )
2449void LedItDocManager::OnFileOpen ()
2452 FileFormat format = eUnknownFormat;
2453 if (LedItDocument::DoPromptOpenFileName (fileName, &format)) {
2454 OpenDocumentFile (fileName, format);
#define RequireNotNull(p)
#define AssertMember(p, c)
basic_string< SDKChar > SDKString