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>
45#include "Stroika/Frameworks/Led/Config.h"
46#include "Stroika/Frameworks/Led/StdDialogs.h"
47#if qStroika_Foundation_Common_Platform_Windows
48#include "Stroika/Frameworks/Led/Platform/Windows_FileRegistration.h"
50#include "Stroika/Frameworks/Led/StyledTextEmbeddedObjects.h"
52#if qStroika_Foundation_Common_Platform_Windows
53#include "LedItControlItem.h"
54#include "LedItInPlaceFrame.h"
55#include "LedItMainFrame.h"
56#elif qStroika_Foundation_Common_Platform_MacOS
57#include "FilteredFilePicker.h"
60#include "LedItDocument.h"
61#include "LedItResources.h"
65#include "LedItApplication.h"
67#if qStroika_FeatureSupported_XWindows
68#include "AboutBoxImage.xpm"
72using namespace Stroika::Frameworks::Led;
73using namespace Stroika::Frameworks::Led::Platform;
74using namespace Stroika::Frameworks::Led::StyledTextIO;
76using Memory::MakeSharedPtr;
78#if qStroika_Foundation_Common_Platform_MacOS
79static Handle sDeepShitCheeseBuf = NULL;
81inline void DoStringyAlert (
short alertID,
const ConstStr255Param p0 = NULL,
const ConstStr255Param p1 = NULL,
82 const ConstStr255Param p2 = NULL,
const ConstStr255Param p3 = NULL)
84 if (sDeepShitCheeseBuf != NULL) {
85 ::DisposeHandle (sDeepShitCheeseBuf);
86 sDeepShitCheeseBuf = NULL;
88 if (::GetResource (
'ALRT', alertID) == nil) {
93 Led_CheckSomeLocalHeapRAMAvailable (4 * 1024);
99 ::ParamText (p0 == NULL ?
"\p" : p0, p1 == NULL ?
"\p" : p1, p2 == NULL ?
"\p" : p2, p3 == NULL ?
"\p" : p3);
101 ::CautionAlert (alertID, nil);
106const char kAppName[] =
"LedIt";
108#if qStroika_Foundation_Common_Platform_MacOS
110#define STANDARD_LEDITAPPLICATION_MACOS_CATCHERS() \
113 HandleMacOSException (err); \
117 HandleBadAllocException (); \
119 catch (TextInteractor::BadUserInput&) \
121 HandleBadUserInputException (); \
123 catch (const LException& err) \
125 HandlePowerPlantException ((OSErr)err.GetErrorCode ()); \
127 catch (ExceptionCode err) \
129 HandlePowerPlantException (err); \
133 HandleUnknownException (); \
138#if qStroika_Foundation_Common_Platform_Windows
140#define STD_EXCEPT_CATCHER(APP) \
141 catch (CMemoryException * e) \
143 (APP).HandleBadAllocException (); \
146 catch (CException * e) \
148 (APP).HandleMFCException (e); \
153 (APP).HandleBadAllocException (); \
157 (APP).HandleHRESULTException (hr); \
159 catch (TextInteractor::BadUserInput&) \
161 (APP).HandleBadUserInputException (); \
165 (APP).HandleUnknownException (); \
170#if qStroika_Foundation_Common_Platform_Windows
171class SimpleLedTemplate :
public CSingleDocTemplate {
173 SimpleLedTemplate (
const char* daStr);
176 virtual void LoadTemplate ()
override;
179 virtual CDocument* OpenDocumentFile (LPCTSTR lpszPathName, BOOL bMakeVisible)
override
183 CDocument* pDocument = NULL;
184 CFrameWnd* pFrame = NULL;
185 BOOL bCreated = FALSE;
186 BOOL bWasModified = FALSE;
188 if (m_pOnlyDoc != NULL) {
190 pDocument = m_pOnlyDoc;
191 if (!pDocument->SaveModified ())
194 pFrame = (CFrameWnd*)AfxGetMainWnd ();
195 ASSERT (pFrame != NULL);
196 ASSERT_KINDOF (CFrameWnd, pFrame);
197 ASSERT_VALID (pFrame);
201 pDocument = CreateNewDocument ();
202 ASSERT (pFrame == NULL);
206 if (pDocument == NULL) {
207 AfxMessageBox (AFX_IDP_FAILED_TO_CREATE_DOC);
210 ASSERT (pDocument == m_pOnlyDoc);
212 if (pFrame == NULL) {
216 BOOL bAutoDelete = pDocument->m_bAutoDelete;
217 pDocument->m_bAutoDelete = FALSE;
219 pFrame = CreateNewFrame (pDocument, NULL);
220 pDocument->m_bAutoDelete = bAutoDelete;
221 if (pFrame == NULL) {
222 AfxMessageBox (AFX_IDP_FAILED_TO_CREATE_DOC);
228 if (lpszPathName == NULL) {
230 SetDefaultTitle (pDocument);
234 pDocument->m_bEmbedded = TRUE;
236 if (!pDocument->OnNewDocument ()) {
239 pFrame->DestroyWindow ();
247 bWasModified = pDocument->IsModified ();
248 pDocument->SetModifiedFlag (FALSE);
250 BOOL docOpenDocResult =
false;
252 docOpenDocResult = pDocument->OnOpenDocument (lpszPathName);
256 pDocument->OnNewDocument ();
257 CWinThread* pThread = AfxGetThread ();
259 if (bCreated && pThread->m_pMainWnd == NULL) {
261 pThread->m_pMainWnd = pFrame;
263 InitialUpdateFrame (pFrame, pDocument, bMakeVisible);
268 if (!docOpenDocResult) {
271 pFrame->DestroyWindow ();
273 else if (!pDocument->IsModified ()) {
275 pDocument->SetModifiedFlag (bWasModified);
279 SetDefaultTitle (pDocument);
281 if (!pDocument->OnNewDocument ()) {
287 pDocument->SetPathName (lpszPathName);
290 CWinThread* pThread = AfxGetThread ();
292 if (bCreated && pThread->m_pMainWnd == NULL) {
294 pThread->m_pMainWnd = pFrame;
296 InitialUpdateFrame (pFrame, pDocument, bMakeVisible);
302class LedItDocManager :
public CDocManager {
305 virtual void OnFileNew ()
override;
306 virtual CDocument* OpenDocumentFile (LPCTSTR lpszFileName)
override;
307 nonvirtual CDocument* OpenDocumentFile (LPCTSTR lpszFileName, FileFormat format);
310 virtual void RegisterShellFileTypes (BOOL bWin95)
override;
313 nonvirtual
void RegisterShellFileType (
bool bWin95, CString strPathName,
int iconIndexInFile, CString strFilterExt,
314 CString strFileTypeId, CString strFileTypeName);
317 virtual BOOL DoPromptFileName (CString& fileName, UINT nIDSTitle, DWORD lFlags, BOOL bOpenFileDialog, CDocTemplate* pTemplate)
override;
319 virtual void OnFileOpen ()
override;
322inline const void* LoadAppResource (
long resID, LPCTSTR resType)
324 HRSRC hrsrc = ::FindResource (::AfxGetResourceHandle (), MAKEINTRESOURCE (resID), resType);
326 HGLOBAL hglobal = ::LoadResource (::AfxGetResourceHandle (), hrsrc);
327 const void* lockedData = ::LockResource (hglobal);
331static BOOL AFXAPI SetRegKey (LPCTSTR lpszKey, LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL)
333 if (lpszValueName == NULL) {
334 if (::RegSetValue (HKEY_CLASSES_ROOT, lpszKey, REG_SZ, lpszValue,
static_cast<DWORD
> (::_tcslen (lpszValue))) != ERROR_SUCCESS) {
335 TRACE1 (
"Warning: registration database update failed for key '%s'.\n", lpszKey);
342 if (::RegCreateKey (HKEY_CLASSES_ROOT, lpszKey, &hKey) == ERROR_SUCCESS) {
343 LONG lResult = ::RegSetValueEx (hKey, lpszValueName, 0, REG_SZ, (CONST BYTE*)lpszValue,
344 static_cast<DWORD
> (::_tcslen (lpszValue) +
sizeof (TCHAR)));
345 if (::RegCloseKey (hKey) == ERROR_SUCCESS && lResult == ERROR_SUCCESS) {
349 TRACE1 (
"Warning: registration database update failed for key '%s'.\n", lpszKey);
355class MyAboutBox :
public Led_StdDialogHelper_AboutBox {
357 using inherited = Led_StdDialogHelper_AboutBox;
358#if qStroika_Foundation_Common_Platform_Windows
360 MyAboutBox (HINSTANCE hInstance, HWND parentWnd)
361 : inherited (hInstance, parentWnd)
364#elif qStroika_FeatureSupported_XWindows
366 MyAboutBox (GtkWindow* modalParentWindow)
367 : inherited (modalParentWindow)
373 virtual void PreDoModalHook ()
override
375 inherited::PreDoModalHook ();
377#define kUNICODE_NAME_ADORNER L" [UNICODE]"
379#define kUNICODE_NAME_ADORNER " [Internal UNICODE]"
382#if qStroika_Foundation_Common_Platform_MacOS
383 const short kPictHeight = 273;
384 const short kPictWidth = 437;
385 SDKString verStr =
SDKString{qLed_ShortVersionString} + kUNICODE_NAME_ADORNER
" (" + __DATE__ +
")";
386 const int kVERWidth = 230;
387 SimpleLayoutHelper (kPictHeight, kPictWidth, Led_Rect (159, 15, 17, 142), Led_Rect (159, 227, 17, 179), verStr);
388#elif qStroika_Foundation_Common_Platform_Windows
391 const int kPictWidth = 437;
392 const int kPictHeight = 273;
393 const int kButHSluff = 17;
394 const int kButVSluff = 19;
397 ::GetWindowRect (GetHWND (), &windowRect);
403 ::GetClientRect (GetHWND (), &clientRect);
404 ncWidth = AsLedRect (windowRect).GetWidth () - AsLedRect (clientRect).GetWidth ();
405 ncHeight = AsLedRect (windowRect).GetHeight () - AsLedRect (clientRect).GetHeight ();
407 ::MoveWindow (GetHWND (), windowRect.left, windowRect.top, kPictWidth + ncWidth, kPictHeight + ncHeight,
false);
412 HWND w = ::GetDlgItem (GetHWND (), kLedStdDlg_AboutBox_VersionFieldID);
414 const int kVERWidth = 230;
415 ::MoveWindow (w, kPictWidth / 2 - kVERWidth / 2, 32, kVERWidth, 16,
false);
416 ::SetWindowText (w, _T (qLed_ShortVersionString) kUNICODE_NAME_ADORNER _T (
" (") _T (__DATE__) _T (
")"));
421 HWND w = ::GetDlgItem (GetHWND (), kLedStdDlg_AboutBox_InfoLedFieldID);
423 ::MoveWindow (w, 15, 159, 142, 17,
false);
424 w = ::GetDlgItem (GetHWND (), kLedStdDlg_AboutBox_LedWebPageFieldID);
426 ::MoveWindow (w, 227, 159, 179, 17,
false);
431 HWND w = ::GetDlgItem (GetHWND (), IDOK);
434 ::GetWindowRect (w, &tmp);
435 ::MoveWindow (w, kButHSluff, kPictHeight - AsLedRect (tmp).GetHeight () - kButVSluff, AsLedRect (tmp).GetWidth (),
436 AsLedRect (tmp).GetHeight (),
false);
439 ::SetWindowText (GetHWND (), _T (
"About LedIt!"));
440#elif qStroika_FeatureSupported_XWindows
441 GtkWidget* window = GetWindow ();
442 gtk_container_set_border_width (GTK_CONTAINER (window), 10);
445 GtkStyle* style = gtk_widget_get_style (window);
446 GdkBitmap* mask = NULL;
447 GdkPixmap* pixmap = gdk_pixmap_create_from_xpm_d (window->window, &mask, &style->bg[GTK_STATE_NORMAL], (gchar**)AboutBoxImage_xpm);
450 GtkWidget* box1 = gtk_hbox_new (FALSE, 0);
451 gtk_container_set_border_width (GTK_CONTAINER (box1), 2);
454 GtkWidget* pixmapwid = gtk_pixmap_new (pixmap, mask);
457 GtkWidget* label = gtk_label_new (verStr.c_str ());
459 gtk_box_pack_start (GTK_BOX (box1), label, FALSE, FALSE, 3);
460 gtk_box_pack_start (GTK_BOX (box1), pixmapwid, FALSE, FALSE, 3);
462 gtk_widget_show (pixmapwid);
463 gtk_widget_show (label);
464 gtk_widget_show (box1);
467 GtkWidget* button = gtk_button_new ();
468 gtk_container_add (GTK_CONTAINER (button), box1);
469 gtk_container_add (GTK_CONTAINER (window), button);
470 gtk_widget_show (button);
471 SetOKButton (button);
475 virtual void OnClickInInfoField ()
override
478 Led_URLManager::Get ().Open (
"mailto:info-led@sophists.com");
483 inherited::OnClickInInfoField ();
486 virtual void OnClickInLedWebPageField ()
override
489 Led_URLManager::Get ().Open (MakeSophistsAppNameVersionURL (
"/Led/LedIt/", kAppName));
494 inherited::OnClickInLedWebPageField ();
498#if qStroika_FeatureSupported_XWindows
499class LedItFilePickBox :
public StdFilePickBox {
501 using inherited = StdFilePickBox;
504 LedItFilePickBox (GtkWindow* modalParentWindow,
const SDKString& title,
bool saveDialog,
const SDKString& fileName, FileFormat fileFormat)
505 : inherited (modalParentWindow, title, saveDialog, fileName)
506 , fFileFormat (fileFormat)
507 , fFileTypeChoice (NULL)
512 virtual void PreDoModalHook ()
override
514 inherited::PreDoModalHook ();
517 GtkBox* mainVBox = GTK_BOX (GTK_FILE_SELECTION (GetWindow ())->main_vbox);
518 GtkWidget* fileTypeHBox = gtk_hbox_new (TRUE, 10);
519 gtk_box_pack_start (mainVBox, fileTypeHBox, FALSE, FALSE, 0);
520 gtk_widget_show (fileTypeHBox);
523 GtkWidget* filetypesLabel = gtk_label_new (
"File Type:");
524 gtk_label_set_justify (GTK_LABEL (filetypesLabel), GTK_JUSTIFY_RIGHT);
525 gtk_misc_set_alignment (GTK_MISC (filetypesLabel), 1.0, 0.5);
526 gtk_widget_show (filetypesLabel);
527 gtk_box_pack_start (GTK_BOX (fileTypeHBox), filetypesLabel, FALSE, TRUE, 0);
530 fFileTypeChoice = GTK_OPTION_MENU (gtk_option_menu_new ());
531 gtk_widget_show (GTK_WIDGET (fFileTypeChoice));
532 gtk_box_pack_end (GTK_BOX (fileTypeHBox), GTK_WIDGET (fFileTypeChoice), FALSE, TRUE, 0);
538 gtk_box_reorder_child (mainVBox, fileTypeHBox, 5);
542 GtkWidget* menu = gtk_menu_new ();
543 if (not fSaveDialog) {
544 GtkWidget* m = gtk_menu_item_new_with_label (
"Automatically recognize type");
545 gtk_object_set_user_data (GTK_OBJECT (m),
reinterpret_cast<void*
> (eUnknownFormat));
547 gtk_menu_append (GTK_MENU (menu), m);
550 struct FileFilterDesc {
554 static FileFilterDesc typeList[] = {
555 {
"HTML file", eHTMLFormat},
556 {
"Led Rich Text Format", eLedPrivateFormat},
557 {
"Microsoft Rich Text Format (RTF)", eRTFFormat},
558 {
"Text file", eTextFormat},
560 size_t defaultItem = 0;
561 for (
size_t i = 0; i < std::size (typeList); ++i) {
562 GtkWidget* m = gtk_menu_item_new_with_label (typeList[i].fDescription.c_str ());
563 gtk_object_set_user_data (GTK_OBJECT (m),
reinterpret_cast<void*
> (typeList[i].fFormat));
565 gtk_menu_append (GTK_MENU (menu), m);
568 if (typeList[i].fFormat == fFileFormat) {
573 gtk_widget_show (menu);
574 gtk_option_menu_set_menu (fFileTypeChoice, menu);
575 gtk_menu_set_active (GTK_MENU (menu), defaultItem);
576 gtk_option_menu_set_history (fFileTypeChoice, defaultItem);
580 virtual void OnOK ()
override
584 GtkWidget* activeItem = gtk_menu_get_active (GTK_MENU (gtk_option_menu_get_menu (fFileTypeChoice)));
586 fFileFormat = (FileFormat)(
reinterpret_cast<int> (gtk_object_get_user_data (GTK_OBJECT (activeItem))));
590 nonvirtual FileFormat GetFileFormat ()
const
596 FileFormat fFileFormat;
597 GtkOptionMenu* fFileTypeChoice;
606#if qStroika_Foundation_Common_Platform_Windows
607LedItApplication theApp;
612static const CLSID clsid = {0xfc00620, 0x28bd, 0x11cf, {0x89, 0x9c, 0x0, 0xaa, 0x0, 0x58, 0x3, 0x24}};
614BEGIN_MESSAGE_MAP (LedItApplication, CWinApp)
615ON_COMMAND (ID_APP_ABOUT, OnAppAbout)
616ON_COMMAND (ID_FILE_NEW, OnFileNew)
617ON_COMMAND (ID_FILE_OPEN, OnFileOpen)
618ON_COMMAND (ID_FILE_PRINT_SETUP, OnFilePrintSetup)
619ON_COMMAND (kToggleUseSmartCutNPasteCmd, OnToggleSmartCutNPasteOptionCommand)
620ON_UPDATE_COMMAND_UI (kToggleUseSmartCutNPasteCmd, OnToggleSmartCutNPasteOptionUpdateCommandUI)
621ON_COMMAND (kToggleWrapToWindowCmd, OnToggleWrapToWindowOptionCommand)
622ON_UPDATE_COMMAND_UI (kToggleWrapToWindowCmd, OnToggleWrapToWindowOptionUpdateCommandUI)
623ON_COMMAND (kToggleShowHiddenTextCmd, OnToggleShowHiddenTextOptionCommand)
624ON_UPDATE_COMMAND_UI (kToggleShowHiddenTextCmd, OnToggleShowHiddenTextOptionUpdateCommandUI)
625ON_COMMAND (cmdChooseDefaultFontDialog, OnChooseDefaultFontCommand)
626ON_COMMAND (kGotoLedItWebPageCmd, OnGotoLedItWebPageCommand)
627ON_COMMAND (kGotoSophistsWebPageCmd, OnGotoSophistsWebPageCommand)
628ON_COMMAND (kCheckForUpdatesWebPageCmdID, OnCheckForUpdatesWebPageCommand)
632LedItApplication* LedItApplication::sThe = NULL;
634LedItApplication::LedItApplication ()
636#if qStroika_Foundation_Common_Platform_MacOS || qStroika_Foundation_Common_Platform_Windows
640#if qStroika_Foundation_Common_Platform_MacOS
642 , fGotoLedItWebPageMenuItem (0)
643 , fGotoSophistsWebPageMenuItem (0)
644 , fCheckForUpdatesWebPageMenuItem (0)
645 , fLastLowMemWarnAt (0.0f)
647#if qStroika_Foundation_Common_Platform_Windows
648 fOleTemplateServer ()
651#if qStroika_Foundation_Common_Platform_Windows
653#elif qStroika_FeatureSupported_XWindows
654 fInstalledFonts (GDK_DISPLAY ())
657#if qStroika_FeatureSupported_XWindows
662 Require (sThe == NULL);
673#if !qStroika_Foundation_Common_Platform_Windows
675 EmbeddedObjectCreatorRegistry::Get ().AddStandardTypes ();
677#if qStroika_Foundation_Common_Platform_Windows
679 EmbeddedObjectCreatorRegistry::Get ().AddAssoc (LedItControlItem::kClipFormat, LedItControlItem::kEmbeddingTag,
680 LedItControlItem::mkLedItControlItemStyleMarker, LedItControlItem::mkLedItControlItemStyleMarker);
681 EmbeddedObjectCreatorRegistry::Get ().AddAssoc (kBadClipFormat, RTFIO::RTFOLEEmbedding::kEmbeddingTag,
682 LedItControlItem::mkLedItControlItemStyleMarker, LedItControlItem::mkLedItControlItemStyleMarker);
686#if qStroika_Foundation_Common_Platform_MacOS
688 TRegistrar<LPlaceHolder>::Register ();
689 TRegistrar<LPrintout>::Register ();
690 TRegistrar<LDialogBox>::Register ();
691 TRegistrar<LPicture>::Register ();
692 TRegistrar<LCaption>::Register ();
693 TRegistrar<LPane>::Register ();
694 TRegistrar<LTextButton>::Register ();
695 TRegistrar<LStdCheckBox>::Register ();
696 TRegistrar<LStdButton>::Register ();
697 TRegistrar<LEditField>::Register ();
698 TRegistrar<LTabGroup>::Register ();
699 TRegistrar<LStdPopupMenu>::Register ();
702 StandardUnknownTypeStyleMarker::sUnknownPict = (Picture**)::GetResource (
'PICT', kUnknownEmbeddingPictID);
703 StandardDIBStyleMarker::sUnsupportedFormatPict = (Picture**)::GetResource (
'PICT', kUnsupportedDIBFormatPictID);
707 SetSleepTime (Led_Min (6, GetCaretTime ()));
708#elif qStroika_FeatureSupported_XWindows
709 fDocument =
new LedItDocument ();
711 fAppWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
712 gtk_signal_connect (GTK_OBJECT (fAppWindow),
"destroy", GTK_SIGNAL_FUNC (xdestroy),
this);
714 UpdateFrameWindowTitle ();
715 gtk_widget_set_usize (GTK_WIDGET (fAppWindow), 300, 200);
716 gtk_widget_set_usize (fAppWindow, 600, 500);
717 gtk_window_set_policy (GTK_WINDOW (fAppWindow), TRUE, TRUE, FALSE);
718 gtk_container_set_border_width (GTK_CONTAINER (fAppWindow), 0);
720 GtkWidget* main_vbox = gtk_vbox_new (FALSE, 1);
721 gtk_container_border_width (GTK_CONTAINER (main_vbox), 1);
722 gtk_container_add (GTK_CONTAINER (fAppWindow), main_vbox);
723 gtk_widget_show (main_vbox);
725 GtkWidget* menubar = get_main_menu (fAppWindow);
727 gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, TRUE, 0);
728 gtk_widget_show (menubar);
731 GtkWidget* box1 = gtk_vbox_new (FALSE, 0);
732 gtk_container_add (GTK_CONTAINER (main_vbox), box1);
733 gtk_widget_show (box1);
735 GtkWidget* box2 = gtk_vbox_new (FALSE, 10);
736 gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
737 gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
738 gtk_widget_show (box2);
740 GtkWidget* table = gtk_table_new (2, 2,
false);
741 gtk_table_set_row_spacing (GTK_TABLE (table), 0, 2);
742 gtk_table_set_col_spacing (GTK_TABLE (table), 0, 2);
743 gtk_box_pack_start (GTK_BOX (box2), table, TRUE, TRUE, 0);
744 gtk_widget_show (table);
747 fTextEditor =
new LedItView (fDocument);
749 gtk_table_attach (GTK_TABLE (table), fTextEditor->Get_GtkWidget (), 0, 1, 0, 1,
750 static_cast<GtkAttachOptions
> (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
751 static_cast<GtkAttachOptions
> (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
752 gtk_widget_show (fTextEditor->Get_GtkWidget ());
756 GtkAdjustment* vAdj = fTextEditor->GetAdjustmentObject (TextInteractor::v);
757 GtkWidget* vscrollbar = gtk_vscrollbar_new (vAdj);
758 gtk_table_attach (GTK_TABLE (table), vscrollbar, 1, 2, 0, 1,
static_cast<GtkAttachOptions
> (GTK_FILL),
759 static_cast<GtkAttachOptions
> (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0);
760 gtk_widget_show (vscrollbar);
763 GtkAdjustment* hAdj = fTextEditor->GetAdjustmentObject (TextInteractor::h);
764 GtkWidget* hscrollbar = gtk_hscrollbar_new (hAdj);
765 gtk_table_attach (GTK_TABLE (table), hscrollbar, 0, 1, 1, 2,
static_cast<GtkAttachOptions
> (GTK_EXPAND | GTK_SHRINK | GTK_FILL),
766 static_cast<GtkAttachOptions
> (GTK_FILL), 0, 0);
767 gtk_widget_show (hscrollbar);
769 gtk_widget_show (fAppWindow);
772 gtk_widget_grab_focus (fTextEditor->Get_GtkWidget ());
777LedItApplication::~LedItApplication ()
779 Require (sThe ==
this);
781#if qStroika_FeatureSupported_XWindows
786LedItApplication& LedItApplication::Get ()
792void LedItApplication::DoAboutBox ()
794#if qStroika_Foundation_Common_Platform_MacOS
796#elif qStroika_Foundation_Common_Platform_Windows
797 MyAboutBox dlg (m_hInstance, AfxGetMainWnd ()->m_hWnd);
798#elif qStroika_FeatureSupported_XWindows
799 MyAboutBox dlg (GTK_WINDOW (fAppWindow));
804void LedItApplication::OnGotoLedItWebPageCommand ()
807 Led_URLManager::Get ().Open (MakeSophistsAppNameVersionURL (
"/Led/LedIt/", kAppName));
810#if qStroika_Foundation_Common_Platform_MacOS
811 DoStringyAlert (kCannotOpenWebPageAlertID);
816void LedItApplication::OnGotoSophistsWebPageCommand ()
819 Led_URLManager::Get ().Open (MakeSophistsAppNameVersionURL (
"/", kAppName));
822#if qStroika_Foundation_Common_Platform_MacOS
823 DoStringyAlert (kCannotOpenWebPageAlertID);
828void LedItApplication::OnCheckForUpdatesWebPageCommand ()
831 Led_URLManager::Get ().Open (MakeSophistsAppNameVersionURL (
"/Led/CheckForUpdates.asp", kAppName));
834#if qStroika_Foundation_Common_Platform_MacOS
835 DoStringyAlert (kCannotOpenWebPageAlertID);
840#if qStroika_Foundation_Common_Platform_MacOS
841void LedItApplication::StartUp ()
844 ObeyCommand (cmd_New, nil);
846 STANDARD_LEDITAPPLICATION_MACOS_CATCHERS ();
849void LedItApplication::MakeMenuBar ()
851 inherited::MakeMenuBar ();
856 MenuRef fontMenuHandle = ::GetMenuHandle (cmd_FontMenu);
858 ::AppendResMenu (fontMenuHandle,
'FONT');
860 LMenu* fontMenu = LMenuBar::GetCurrentMenuBar ()->FetchMenu (cmd_FontMenu);
862 size_t nMenuItems = ::CountMenuItems (fontMenu->GetMacMenuH ());
863 for (
size_t i = 1; i <= nMenuItems; ++i) {
864 fontMenu->SetCommand (i, i - 1 + kBaseFontNameCmd);
870 SInt32 gestaltResponse = 0;
871 aquaUI = (::Gestalt (gestaltMenuMgrAttr, &gestaltResponse) == noErr) and (gestaltResponse & gestaltMenuMgrAquaLayoutMask);
877 MenuHandle helpMenu = NULL;
879 if (::HMGetHelpMenuHandle (&helpMenu) != noErr) {
883 if (helpMenu == NULL) {
885 helpMenu = ::NewMenu (kHelpMenuID,
"\pHelp");
888 ::InsertMenu (helpMenu, append);
890 if (helpMenu != NULL) {
891 ::AppendMenu (helpMenu,
"\pBrowse Local Help");
892 fHelpMenuItem = ::CountMenuItems (helpMenu);
893 ::AppendMenu (helpMenu,
"\p-");
894 ::AppendMenu (helpMenu,
"\pxxx");
895 ::SetMenuItemText (helpMenu, ::CountMenuItems (helpMenu),
"\pGoto LedIt! Web Page");
896 fGotoLedItWebPageMenuItem = ::CountMenuItems (helpMenu);
897 ::AppendMenu (helpMenu,
"\pGoto Sophist Solutions Web Page");
898 fGotoSophistsWebPageMenuItem = ::CountMenuItems (helpMenu);
899 ::AppendMenu (helpMenu,
"\pCheck for LedIt! Web Updates");
900 fCheckForUpdatesWebPageMenuItem = ::CountMenuItems (helpMenu);
906 MenuRef fileMenu = ::GetMenuHandle (kFileMenuID);
909 ::DeleteMenuItem (fileMenu, ::CountMenuItems (fileMenu));
910 ::DeleteMenuItem (fileMenu, ::CountMenuItems (fileMenu));
914void LedItApplication::ProcessNextEvent ()
916 if (sDeepShitCheeseBuf == NULL) {
917 sDeepShitCheeseBuf = ::NewHandle (10 * 1024);
920 inherited::ProcessNextEvent ();
922 STANDARD_LEDITAPPLICATION_MACOS_CATCHERS ();
925void LedItApplication::HandleAppleEvent (
const AppleEvent& inAppleEvent, AppleEvent& outAEReply, AEDesc& outResult,
long inAENumber)
928 inherited::HandleAppleEvent (inAppleEvent, outAEReply, outResult, inAENumber);
930 STANDARD_LEDITAPPLICATION_MACOS_CATCHERS ();
933void LedItApplication::HandleMacOSException (OSErr err)
937 HandleBadAllocException ();
942 NumToString (err, tmp);
943 DoStringyAlert (kGenericMacOSExceptionAlertID, tmp);
948void LedItApplication::HandlePowerPlantException (ExceptionCode err)
950 if (err > 32767 or err < -32768) {
952 ::NumToString (err, tmp);
953 ::DoStringyAlert (kPowerPlantExceptionAlertID, tmp);
956 Led_Assert (err == OSErr (err));
957 HandleMacOSException (OSErr (err));
961Boolean LedItApplication::ObeyCommand (CommandT inCommand,
void* ioParam)
963 Boolean cmdHandled =
true;
965 if ((HiWord ((-inCommand)) == kHMHelpMenuID or HiWord ((-inCommand)) == kHelpMenuID) and fHelpMenuItem == LoWord (-inCommand)) {
966 OnHelpMenuCommand ();
969 if ((HiWord ((-inCommand)) == kHMHelpMenuID or HiWord ((-inCommand)) == kHelpMenuID) and fGotoLedItWebPageMenuItem == LoWord (-inCommand)) {
970 OnGotoLedItWebPageCommand ();
973 if ((HiWord ((-inCommand)) == kHMHelpMenuID or HiWord ((-inCommand)) == kHelpMenuID) and fGotoSophistsWebPageMenuItem == LoWord (-inCommand)) {
974 OnGotoSophistsWebPageCommand ();
977 if ((HiWord ((-inCommand)) == kHMHelpMenuID or HiWord ((-inCommand)) == kHelpMenuID) and fCheckForUpdatesWebPageMenuItem == LoWord (-inCommand)) {
978 OnCheckForUpdatesWebPageCommand ();
982 if (inCommand >= kBaseWindowCmd and inCommand <= kLastWindowCmd) {
983 size_t windowIdx = (inCommand - kBaseWindowCmd);
984 const vector<LWindow*>& windows = LedItDocument::GetDocumentWindows ();
985 if (windowIdx < windows.size ()) {
986 LWindow* w = windows[windowIdx];
988 UDesktop::SelectDeskWindow (w);
997 case kToggleUseSmartCutNPasteCmd:
998 OnToggleSmartCutNPasteOptionCommand ();
1000 case kToggleWrapToWindowCmd:
1001 OnToggleWrapToWindowOptionCommand ();
1003 case kToggleShowHiddenTextCmd:
1004 OnToggleShowHiddenTextOptionCommand ();
1007 cmdHandled = inherited::ObeyCommand (inCommand, ioParam);
1015void LedItApplication::FindCommandStatus (CommandT inCommand, Boolean& outEnabled, Boolean& outUsesMark, UInt16& outMark, Str255 outName)
1017 if (inCommand >= kBaseWindowCmd and inCommand <= kLastWindowCmd) {
1018 size_t windowIdx = (inCommand - kBaseWindowCmd);
1019 const vector<LWindow*>& windows = LedItDocument::GetDocumentWindows ();
1020 if (windowIdx < windows.size ()) {
1021 LWindow* w = windows[windowIdx];
1024 (void)w->GetDescriptor (outName);
1025 outMark = UDesktop::WindowIsSelected (w) ? checkMark : 0;
1034 outUsesMark =
false;
1035 switch (inCommand) {
1036 case kToggleUseSmartCutNPasteCmd:
1037 OnToggleSmartCutNPasteOption_UpdateCommandUI (&Led_PP_TmpCmdUpdater (inCommand, outEnabled, outUsesMark, outMark, outName));
1039 case kToggleWrapToWindowCmd:
1040 OnToggleWrapToWindowOption_UpdateCommandUI (&Led_PP_TmpCmdUpdater (inCommand, outEnabled, outUsesMark, outMark, outName));
1042 case kToggleShowHiddenTextCmd:
1043 OnToggleShowHiddenTextOption_UpdateCommandUI (&Led_PP_TmpCmdUpdater (inCommand, outEnabled, outUsesMark, outMark, outName));
1046 inherited::FindCommandStatus (inCommand, outEnabled, outUsesMark, outMark, outName);
1051void LedItApplication::OnHelpMenuCommand ()
1055 Led_ThrowOSErr (::FSMakeFSSpec (0, 0,
"\p:LedItDocs:index.html", &fsp));
1056 string helpURL = Led_URLManager::Get ().FileSpecToURL (fsp);
1057 Led_URLManager::Get ().Open (helpURL);
1060 DoStringyAlert (kCannotOpenHelpFileAlertID);
1064void LedItApplication::UseIdleTime (
const EventRecord& inMacEvent)
1066 inherited::UseIdleTime (inMacEvent);
1071 const float kIntervalBetweenWarnings = 10.0f;
1072 if (fLastLowMemWarnAt + kIntervalBetweenWarnings < ::Led_GetTickCount ()) {
1073 bool enufLocalMemory =
true;
1074 bool enufMemory =
true;
1076 Led_CheckSomeLocalHeapRAMAvailable (8 * 1024);
1079 enufLocalMemory =
false;
1082 ::DisposeHandle (Led_DoNewHandle (8 * 1024));
1088 if (not enufLocalMemory) {
1089 DoStringyAlert (kWarnLowLocalRAMAlertID);
1090 fLastLowMemWarnAt = ::Led_GetTickCount ();
1092 if (not enufMemory) {
1093 DoStringyAlert (kWarnLowRAMAlertID);
1094 fLastLowMemWarnAt = ::Led_GetTickCount ();
1098#if qUseMacTmpMemForAllocs && 0
1100 float sLastSendMemBackTryAt = 0;
1101 if (sLastSendMemBackTryAt + 30.0f < ::Led_GetTickCount ()) {
1102 extern void TryToSendSomeTmpMemBackToOS ();
1103 TryToSendSomeTmpMemBackToOS ();
1104 sLastSendMemBackTryAt = ::Led_GetTickCount ();
1109void LedItApplication::OpenDocument (FSSpec* inMacFSSpec)
1111 LedItDocument* doc =
new LedItDocument (
this, eUnknownFormat);
1113 doc->BuildDocWindow (inMacFSSpec);
1121void LedItApplication::OpenDocument (FSSpec* inMacFSSpec, FileFormat format)
1123 LedItDocument* doc =
new LedItDocument (
this, format);
1125 doc->BuildDocWindow (inMacFSSpec);
1133LModelObject* LedItApplication::MakeNewDocument ()
1135 LedItDocument* doc =
new LedItDocument (
this, eDefaultFormat);
1137 doc->BuildDocWindow (NULL);
1147void LedItApplication::ChooseDocument ()
1149 static FilteredSFGetDLog::TypeSpec typeList[] = {
1150 {
"HTML file", kTEXTFileType},
1151 {
"Led Rich Text Format", kLedPrivateDocumentFileType},
1152 {
"Microsoft Rich Text Format (RTF)", kTEXTFileType},
1153 {
"Text file", kTEXTFileType},
1155 FilteredSFGetDLog filteredPicker (typeList, (
sizeof typeList) / (
sizeof typeList[0]));
1157 bool typeSpecified =
false;
1158 size_t typeIndex = 0;
1159 FileFormat format = eUnknownFormat;
1161 if (filteredPicker.PickFile (&fileResult, &typeSpecified, &typeIndex)) {
1162 if (typeSpecified) {
1163 switch (typeIndex) {
1165 format = eHTMLFormat;
1168 format = eLedPrivateFormat;
1171 format = eRTFFormat;
1174 format = eTextFormat;
1180 OpenDocument (&fileResult, format);
1184void LedItApplication::ShowAboutBox ()
1190void LedItApplication::OnToggleSmartCutNPasteOptionCommand ()
1193 o.SetSmartCutAndPaste (not o.GetSmartCutAndPaste ());
1194 UpdateViewsForPrefsChange ();
1197void LedItApplication::OnToggleSmartCutNPasteOption_UpdateCommandUI (CMD_ENABLER* enabler)
1200 enabler->SetEnabled (
true);
1201 enabler->SetChecked (Options{}.GetSmartCutAndPaste ());
1204void LedItApplication::OnToggleWrapToWindowOptionCommand ()
1207 o.SetWrapToWindow (not o.GetWrapToWindow ());
1208 UpdateViewsForPrefsChange ();
1211void LedItApplication::OnToggleWrapToWindowOption_UpdateCommandUI (CMD_ENABLER* enabler)
1214 enabler->SetEnabled (
true);
1215 enabler->SetChecked (Options{}.GetWrapToWindow ());
1218void LedItApplication::OnToggleShowHiddenTextOptionCommand ()
1221 o.SetShowHiddenText (not o.GetShowHiddenText ());
1222 UpdateViewsForPrefsChange ();
1225void LedItApplication::OnToggleShowHiddenTextOption_UpdateCommandUI (CMD_ENABLER* enabler)
1228 enabler->SetEnabled (
true);
1229 enabler->SetChecked (Options{}.GetShowHiddenText ());
1232void LedItApplication::UpdateViewsForPrefsChange ()
1234 bool wrapToWindow = Options{}.GetWrapToWindow ();
1235 bool smartCutNPaste = Options{}.GetSmartCutAndPaste ();
1236 bool showHiddenText = Options{}.GetShowHiddenText ();
1238#if qStroika_Foundation_Common_Platform_MacOS
1239 const TArray<LDocument*>& docList = LDocument::GetDocumentList ();
1240 TArrayIterator<LDocument*> iterator (docList);
1241 LDocument* theDoc = NULL;
1242 while (iterator.Next (theDoc)) {
1244 LedItDocument* d =
dynamic_cast<LedItDocument*
> (theDoc);
1246 d->GetTextView ()->SetSmartCutAndPasteMode (smartCutNPaste);
1247 d->GetTextView ()->SetWrapToWindow (wrapToWindow);
1248 d->GetTextView ()->SetShowHiddenText (showHiddenText);
1250#elif qStroika_Foundation_Common_Platform_Windows
1252 POSITION tp = GetFirstDocTemplatePosition ();
1253 while (tp != NULL) {
1254 CDocTemplate* t = GetNextDocTemplate (tp);
1256 POSITION dp = t->GetFirstDocPosition ();
1257 while (dp != NULL) {
1258 CDocument* doc = t->GetNextDoc (dp);
1260 POSITION vp = doc->GetFirstViewPosition ();
1261 while (vp != NULL) {
1262 CView* v = doc->GetNextView (vp);
1264 LedItView* lv =
dynamic_cast<LedItView*
> (v);
1266 lv->SetSmartCutAndPasteMode (smartCutNPaste);
1267 lv->SetWrapToWindow (wrapToWindow);
1268 lv->SetShowHiddenText (showHiddenText);
1273#elif qStroika_FeatureSupported_XWindows
1275 fTextEditor->SetSmartCutAndPasteMode (smartCutNPaste);
1276 fTextEditor->SetWrapToWindow (wrapToWindow);
1277 fTextEditor->SetShowHiddenText (showHiddenText);
1281#if qStroika_Foundation_Common_Platform_Windows
1282BOOL LedItApplication::InitInstance ()
1284 SetRegistryKey (_T (
"Sophist Solutions, Inc."));
1287 if (!AfxOleInit ()) {
1288 AfxMessageBox (IDP_OLE_INIT_FAILED);
1292#if qIncludeBasicSpellcheckEngine
1293#if qStroika_Foundation_Debug_AssertionsChecked
1294 SpellCheckEngine_Basic::RegressionTest ();
1297 fSpellCheckEngine = MakeSharedPtr<SpellCheckEngine_Basic_Simple> ();
1299#if qStroika_Foundation_Common_Platform_Windows
1303 TCHAR defaultPath[MAX_PATH + 1];
1304 Verify (::SHGetSpecialFolderPath (
nullptr, defaultPath, CSIDL_FLAG_CREATE | CSIDL_PERSONAL,
true));
1305 fSpellCheckEngine->SetUserDictionary (SDKString{defaultPath} + Led_SDK_TCHAROF (
"\\My LedIt Dictionary.txt"));
1312 EmbeddedObjectCreatorRegistry::Get ().AddStandardTypes ();
1315 EmbeddedObjectCreatorRegistry::Get ().AddAssoc (LedItControlItem::kClipFormat, LedItControlItem::kEmbeddingTag,
1316 LedItControlItem::mkLedItControlItemStyleMarker, LedItControlItem::mkLedItControlItemStyleMarker);
1317 EmbeddedObjectCreatorRegistry::Get ().AddAssoc (kBadClipFormat, RTFIO::RTFOLEEmbedding::kEmbeddingTag,
1318 LedItControlItem::mkLedItControlItemStyleMarker, LedItControlItem::mkLedItControlItemStyleMarker);
1321 CCommandLineInfo cmdInfo;
1322 ParseCommandLine (cmdInfo);
1324 AfxEnableControlContainer ();
1329 Enable3dControlsStatic ();
1333 LoadStdProfileSettings (9);
1335 Assert (m_pDocManager == NULL);
1336 m_pDocManager =
new LedItDocManager ();
1338 AddDocTemplateForString (
"LedIt\n\nLedIt\nLed Rich Text Format (*.led)\n.led\nLedIt.Document\nLedIt Document",
true);
1342 RegisterShellFileTypes (
true);
1346 fOleTemplateServer.UpdateRegistry (OAT_INPLACE_SERVER);
1347 COleObjectFactory::UpdateRegistryAll ();
1350 StandardUnknownTypeStyleMarker::sUnknownPict = (
const Led_DIB*)::LoadAppResource (kUnknownEmbeddingPictID, RT_BITMAP);
1351 StandardMacPictureStyleMarker::sUnsupportedFormatPict = (
const Led_DIB*)::LoadAppResource (kUnsupportedPICTFormatPictID, RT_BITMAP);
1353#if qStroika_Foundation_Common_Platform_Windows
1355 class MyRegistrationHelper :
public Win32UIFileAssociationRegistrationHelper {
1357 using inherited = Win32UIFileAssociationRegistrationHelper;
1360 MyRegistrationHelper ()
1361 : inherited (::AfxGetResourceHandle ())
1366 virtual bool CheckUserSaysOKToUpdate ()
const override
1369 if (o.GetCheckFileAssocsAtStartup ()) {
1370 Led_StdDialogHelper_UpdateWin32FileAssocsDialog dlg (::AfxGetResourceHandle (), ::GetActiveWindow ());
1371 dlg.fAppName = Led_SDK_TCHAROF (
"LedIt!");
1372 dlg.fTypeList = Led_SDK_TCHAROF (
".rtf");
1373 dlg.fKeepChecking =
true;
1374 bool result = dlg.DoModal ();
1375 o.SetCheckFileAssocsAtStartup (dlg.fKeepChecking);
1383 MyRegistrationHelper fileAssocHelper;
1384 SDKString rtfDocIcon = Characters::CString::Format (Led_SDK_TCHAROF (
"$EXE$,%d"), -kLedItRTFDocumentIconID);
1385 fileAssocHelper.Add (Win32UIFileAssociationInfo (Led_SDK_TCHAROF (
".rtf"), Led_SDK_TCHAROF (
"rtffile"),
1386 Led_SDK_TCHAROF (
"Rich Text Document"), rtfDocIcon, Led_SDK_TCHAROF (
"$EXE$ \"%1\"")));
1387 fileAssocHelper.DoIt ();
1392 if (cmdInfo.m_bRunEmbedded || cmdInfo.m_bRunAutomated) {
1395 COleTemplateServer::RegisterAll ();
1403 if (not ProcessShellCommand (cmdInfo)) {
1410#if _MFC_VER >= 0x0700
1411void LedItApplication::WinHelpInternal ([[maybe_unused]] DWORD_PTR dwData, [[maybe_unused]] UINT nCmd)
1413void LedItApplication::WinHelp ([[maybe_unused]] DWORD dwData, [[maybe_unused]] UINT nCmd)
1417 TCHAR directoryName[_MAX_PATH];
1418 Verify (::GetModuleFileName (m_hInstance, directoryName, _MAX_PATH));
1421 LPTSTR lpszExt = _tcsrchr (directoryName,
'\\');
1422 ASSERT (lpszExt != NULL);
1423 ASSERT (*lpszExt ==
'\\');
1424 *(lpszExt + 1) =
'\0';
1426 Characters::CString::Cat (directoryName, std::size (directoryName), _T (
"LedItDocs\\"));
1432 (void)::ShellExecute (NULL, _T (
"open"), _T (
"index.htm"), NULL, directoryName, SW_SHOWNORMAL);
1435BOOL LedItApplication::PumpMessage ()
1438 return inherited::PumpMessage ();
1440 STD_EXCEPT_CATCHER (*
this);
1444void LedItApplication::HandleMFCException ([[maybe_unused]] CException* e)
noexcept
1447 HandleUnknownException ();
1450void LedItApplication::HandleHRESULTException ([[maybe_unused]] HRESULT hr)
noexcept
1453 HandleUnknownException ();
1457BOOL LedItApplication::OnIdle (LONG lCount)
1459 POSITION tp = GetFirstDocTemplatePosition ();
1460 while (tp != NULL) {
1461 CDocTemplate* t = GetNextDocTemplate (tp);
1463 POSITION dp = t->GetFirstDocPosition ();
1464 while (dp != NULL) {
1465 CDocument* doc = t->GetNextDoc (dp);
1467 POSITION vp = doc->GetFirstViewPosition ();
1468 while (vp != NULL) {
1469 CView* v = doc->GetNextView (vp);
1471 LedItView* lv =
dynamic_cast<LedItView*
> (v);
1473 lv->CallEnterIdleCallback ();
1478 return inherited::OnIdle (lCount);
1482BOOL LedItApplication::ProcessShellCommand (CCommandLineInfo& rCmdInfo)
1485 switch (rCmdInfo.m_nShellCommand) {
1486 case CCommandLineInfo::FileOpen: {
1488 if (not OpenDocumentFile (rCmdInfo.m_strFileName)) {
1495 HANDLE h = ::CreateFile (rCmdInfo.m_strFileName, 0, 0, NULL, OPEN_EXISTING, 0, NULL);
1496 if (h == INVALID_HANDLE_VALUE) {
1499 CDocument* newDoc = NULL;
1501 POSITION tp = GetFirstDocTemplatePosition ();
1503 CDocTemplate* t = GetNextDocTemplate (tp);
1505 POSITION dp = t->GetFirstDocPosition ();
1507 newDoc = t->GetNextDoc (dp);
1512 if (newDoc != NULL) {
1515 newDoc->SetPathName (rCmdInfo.m_strFileName,
false);
1516 newDoc->SetTitle (newDoc->GetTitle () + Led_SDK_TCHAROF (
" {new}"));
1527 return inherited::ProcessShellCommand (rCmdInfo);
1531 STD_EXCEPT_CATCHER (*
this);
1535void LedItApplication::AddDocTemplateForString (
const char* tmplStr,
bool connectToServer)
1537 CSingleDocTemplate* pDocTemplate =
new SimpleLedTemplate (tmplStr);
1538 pDocTemplate->SetContainerInfo (IDR_CNTR_INPLACE);
1539 pDocTemplate->SetServerInfo (IDR_SRVR_EMBEDDED, IDR_SRVR_INPLACE, RUNTIME_CLASS (LedItInPlaceFrame));
1540 AddDocTemplate (pDocTemplate);
1541 if (connectToServer) {
1546 fOleTemplateServer.ConnectTemplate (clsid, pDocTemplate,
true);
1552void LedItApplication::OnAppAbout ()
1557void LedItApplication::OnToggleSmartCutNPasteOptionUpdateCommandUI (CCmdUI* pCmdUI)
1559 OnToggleSmartCutNPasteOption_UpdateCommandUI (CMD_ENABLER (pCmdUI));
1562void LedItApplication::OnToggleWrapToWindowOptionUpdateCommandUI (CCmdUI* pCmdUI)
1564 OnToggleWrapToWindowOption_UpdateCommandUI (CMD_ENABLER (pCmdUI));
1567void LedItApplication::OnToggleShowHiddenTextOptionUpdateCommandUI (CCmdUI* pCmdUI)
1569 OnToggleShowHiddenTextOption_UpdateCommandUI (CMD_ENABLER (pCmdUI));
1573void LedItApplication::OnChooseDefaultFontCommand ()
1575#if qStroika_Foundation_Common_Platform_Windows
1579 (void)::memset (&lf, 0,
sizeof (lf));
1581 Characters::CString::Copy (lf.lfFaceName, std::size (lf.lfFaceName), fsp.GetFontNameSpecifier ().fName);
1582 Assert (::_tcslen (lf.lfFaceName) < sizeof (lf.lfFaceName));
1584 lf.lfWeight = (fsp.GetStyle_Bold ()) ? FW_BOLD : FW_NORMAL;
1585 lf.lfItalic = (fsp.GetStyle_Italic ());
1586 lf.lfUnderline = (fsp.GetStyle_Underline ());
1587 lf.lfStrikeOut = (fsp.GetStyle_Strikeout ());
1589 lf.lfHeight = fsp.PeekAtTMHeight ();
1591 CFontDialog dlog (&lf);
1592 if (dlog.DoModal () == IDOK) {
1600void LedItApplication::HandleBadAllocException () noexcept
1603#if qStroika_Foundation_Common_Platform_Windows
1604 CDialog errorDialog (kBadAllocExceptionOnCmdDialogID);
1605 errorDialog.DoModal ();
1606#elif qStroika_Foundation_Common_Platform_MacOS
1608 TArray<LDocument*>& docList = LDocument::GetDocumentList ();
1609 TArrayIterator<LDocument*> iterator (docList);
1610 LDocument* theDoc = NULL;
1611 while (iterator.Next (theDoc)) {
1613 LedItDocument* d =
dynamic_cast<LedItDocument*
> (theDoc);
1614 d->PurgeUnneededMemory ();
1617 DoStringyAlert (kMemoryExceptionAlertID);
1619 HandleUnknownException ();
1627void LedItApplication::HandleBadUserInputException () noexcept
1630#if qStroika_Foundation_Common_Platform_MacOS
1631 DoStringyAlert (kBadUserInputExceptionAlertID);
1632#elif qStroika_Foundation_Common_Platform_Windows
1633 CDialog errorDialog (kBadUserInputExceptionOnCmdDialogID);
1634 errorDialog.DoModal ();
1636 HandleUnknownException ();
1644void LedItApplication::HandleUnknownException () noexcept
1647#if qStroika_Foundation_Common_Platform_MacOS
1648 DoStringyAlert (kUnknownExceptionAlertID);
1649#elif qStroika_Foundation_Common_Platform_Windows
1650 CDialog errorDialog (kUnknownExceptionOnCmdDialogID);
1651 errorDialog.DoModal ();
1659#if qStroika_FeatureSupported_XWindows
1660gint LedItApplication::delete_event (GtkWidget* widget, gpointer data)
1670 g_print (
"delete event occurred\n");
1678void LedItApplication::xdestroy (GtkWidget* widget, gpointer data)
1680 LedItApplication* THIS =
reinterpret_cast<LedItApplication*
> (data);
1681 THIS->OnQuitCommand ();
1684void LedItApplication::OnNewDocumentCommand ()
1686 WordProcessor* wp = fTextEditor;
1687 TextStore& ts = wp->GetTextStore ();
1688 ts.Replace (ts.GetStart (), ts.GetEnd (), LED_TCHAR_OF (
""), 0);
1689 wp->SetDefaultFont (wp->GetStaticDefaultFont ());
1690 fDocument->fPathName =
string{};
1691 UpdateFrameWindowTitle ();
1694void LedItApplication::OnOpenDocumentCommand ()
1696 LedItFilePickBox filePickerDlg (GTK_WINDOW (fAppWindow), Led_SDK_TCHAROF (
"Open new document"),
false, SDKString{}, eUnknownFormat);
1697 if (filePickerDlg.DoModal ()) {
1699 LoadFromFile (filePickerDlg.GetFileName (), filePickerDlg.GetFileFormat ());
1707void LedItApplication::OnSaveDocumentCommand ()
1709#if qPrintGLIBTradeMessages
1710 g_message (
"Entering OnSaveDocumentCommand\n");
1712 if (fDocument->fPathName.empty ()) {
1713 OnSaveAsDocumentCommand ();
1720void LedItApplication::OnSaveAsDocumentCommand ()
1722 LedItFilePickBox filePickerDlg (GTK_WINDOW (fAppWindow), Led_SDK_TCHAROF (
"Save document as:"),
true, fDocument->fPathName, fDocument->fFileFormat);
1723 if (filePickerDlg.DoModal ()) {
1725 SaveAs (filePickerDlg.GetFileName (), filePickerDlg.GetFileFormat ());
1733void LedItApplication::OnQuitCommand ()
1735#if qPrintGLIBTradeMessages
1736 g_message (
"Entering OnQuitCommand\n");
1738 gtk_widget_destroy (fTextEditor->Get_GtkWidget ());
1743void LedItApplication::LoadFromFile (
const string& fileName, FileFormat fileFormat)
1745 WordProcessor* wp = fTextEditor;
1746 TextStore& ts = wp->GetTextStore ();
1747 ts.Replace (ts.GetStart (), ts.GetEnd (), LED_TCHAR_OF (
""), 0);
1748 wp->SetDefaultFont (wp->GetStaticDefaultFont ());
1749 fDocument->LoadFromFile (fileName, fileFormat);
1750 UpdateFrameWindowTitle ();
1753inline SDKString StripKnownSuffix (
const SDKString& from)
1756 SDKString suffix = ExtractFileSuffix (from);
1757 if (suffix ==
".rtf" or suffix ==
".txt" or suffix ==
".led" or suffix ==
".htm" or suffix ==
".html") {
1758 result.erase (result.length () - suffix.length ());
1762void LedItApplication::SaveAs (
const string& fileName, FileFormat fileFormat)
1764 Require (not fileName.empty ());
1767 fDocument->fPathName = fileName;
1773 SDKString suffix = ExtractFileSuffix (fileName);
1774 switch (fileFormat) {
1776 if (suffix !=
".htm" and suffix !=
".html") {
1777 fDocument->fPathName = StripKnownSuffix (fDocument->fPathName);
1778 fDocument->fPathName +=
".htm";
1782 if (suffix !=
".rtf") {
1783 fDocument->fPathName = StripKnownSuffix (fDocument->fPathName);
1784 fDocument->fPathName +=
".rtf";
1787 case eLedPrivateFormat: {
1788 if (suffix !=
".led") {
1789 fDocument->fPathName = StripKnownSuffix (fDocument->fPathName);
1790 fDocument->fPathName +=
".led";
1795 fDocument->fFileFormat = fileFormat;
1797 UpdateFrameWindowTitle ();
1800void LedItApplication::Save ()
1806void LedItApplication::UpdateFrameWindowTitle ()
1809 SDKString docName = Led_SDK_TCHAROF (
"untitled");
1810 if (fDocument != NULL and not fDocument->fPathName.empty ()) {
1811 docName = fDocument->fPathName;
1813 SDKString appTitle = Led_SDK_TCHAROF (
"LedIt! [") + docName + Led_SDK_TCHAROF (
"]");
1814 gtk_window_set_title (GTK_WINDOW (fAppWindow), appTitle.c_str ());
1817void LedItApplication::AppCmdDispatcher (gpointer callback_data, guint callback_action, GtkWidget* widget)
1819 LedItApplication* THIS =
reinterpret_cast<LedItApplication*
> (callback_data);
1820 GtkWidget* w = THIS->fTextEditor->Get_GtkWidget ();
1821 switch (callback_action) {
1822 case kGotoLedItWebPageCmd:
1823 THIS->OnGotoLedItWebPageCommand ();
1825 case kGotoSophistsWebPageCmd:
1826 THIS->OnGotoSophistsWebPageCommand ();
1828 case kCheckForUpdatesWebPageCmdID:
1829 THIS->OnCheckForUpdatesWebPageCommand ();
1832 THIS->DoAboutBox ();
1834 case kNewDocumentCmd:
1835 THIS->OnNewDocumentCommand ();
1837 case kOpenDocumentCmd:
1838 THIS->OnOpenDocumentCommand ();
1840 case kSaveDocumentCmd:
1841 THIS->OnSaveDocumentCommand ();
1843 case kSaveAsDocumentCmd:
1844 THIS->OnSaveAsDocumentCommand ();
1846 case kToggleUseSmartCutNPasteCmd:
1847 THIS->OnToggleSmartCutNPasteOptionCommand ();
1849 case kToggleWrapToWindowCmd:
1850 THIS->OnToggleWrapToWindowOptionCommand ();
1852 case kToggleShowHiddenTextCmd:
1853 THIS->OnToggleShowHiddenTextOptionCommand ();
1856 THIS->OnQuitCommand ();
1859 LedItView::DispatchCommandCallback (LedItView::WidgetToTHIS (w), callback_action, widget);
1863void LedItApplication::AppCmdOnInitMenu (GtkMenuItem* menuItem, gpointer callback_data)
1865 LedItApplication* THIS =
reinterpret_cast<LedItApplication*
> (callback_data);
1866 GtkWidget* w = THIS->fTextEditor->Get_GtkWidget ();
1868 GtkWidget* subMenu = menuItem->submenu;
1870 Led_Assert (GTK_IS_MENU_SHELL (subMenu));
1871 for (GList* i = GTK_MENU_SHELL (subMenu)->children; i != NULL; i = i->next) {
1872 GtkMenuItem* m =
reinterpret_cast<GtkMenuItem*
> (i->data);
1873 Led_Assert (GTK_IS_MENU_ITEM (m));
1874 bool bEnable = (GTK_MENU_ITEM (m)->submenu != NULL);
1875 gtk_widget_set_sensitive (GTK_WIDGET (m), bEnable);
1876 if (GTK_IS_CHECK_MENU_ITEM (m)) {
1877 GtkCheckMenuItem* cm = GTK_CHECK_MENU_ITEM (m);
1885 Led_Gtk_TmpCmdUpdater::CommandNumber commandNum =
reinterpret_cast<guint
> (gtk_object_get_user_data (GTK_OBJECT (m)));
1887 switch (commandNum) {
1888 case kGotoLedItWebPageCmd:
1889 gtk_widget_set_sensitive (GTK_WIDGET (m),
true);
1891 case kGotoSophistsWebPageCmd:
1892 gtk_widget_set_sensitive (GTK_WIDGET (m),
true);
1894 case kCheckForUpdatesWebPageCmdID:
1895 gtk_widget_set_sensitive (GTK_WIDGET (m),
true);
1898 gtk_widget_set_sensitive (GTK_WIDGET (m),
true);
1900 case kNewDocumentCmd:
1901 gtk_widget_set_sensitive (GTK_WIDGET (m),
true);
1903 case kOpenDocumentCmd:
1904 gtk_widget_set_sensitive (GTK_WIDGET (m),
true);
1907 case kSaveAsDocumentCmd:
1908 gtk_widget_set_sensitive (GTK_WIDGET (m),
true);
1910 case kToggleUseSmartCutNPasteCmd:
1911 THIS->OnToggleSmartCutNPasteOption_UpdateCommandUI (CMD_ENABLER (m, commandNum));
1913 case kToggleWrapToWindowCmd:
1914 THIS->OnToggleWrapToWindowOption_UpdateCommandUI (CMD_ENABLER (m, commandNum));
1916 case kToggleShowHiddenTextCmd:
1917 THIS->OnToggleShowHiddenTextOption_UpdateCommandUI (CMD_ENABLER (m, commandNum));
1920 gtk_widget_set_sensitive (GTK_WIDGET (m),
true);
1923 THIS->fTextEditor->DispatchCommandUpdateCallback (m, commandNum);
1929GtkWidget* LedItApplication::GetAppWindow ()
const
1956GtkItemFactoryEntry LedItApplication::kMenuItemResources[] = {
1957 {
"/_File", NULL, NULL, 0,
"<Branch>"},
1958 {
"/File/_New",
"<control>N", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kNewDocumentCmd, NULL},
1959 {
"/File/_Open...",
"<control>O", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kOpenDocumentCmd, NULL},
1960 {
"/File/_Save",
"<control>S", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSaveDocumentCmd, NULL},
1961 {
"/File/Sa_ve As...", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSaveAsDocumentCmd, NULL},
1962 {
"/File/sep1", NULL, NULL, 0,
"<Separator>"},
1963 {
"/File/_Quit",
"<control>Q", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kQuitCmd, NULL},
1965 {
"/_Edit", NULL, NULL, 0,
"<Branch>"},
1966 {
"/Edit/_Undo",
"<control>Z", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kCmdUndo, NULL},
1967 {
"/Edit/_Redo",
"<control>Y", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kCmdRedo, NULL},
1968 {
"/Edit/", NULL, NULL, 0,
"<Separator>"},
1969 {
"/Edit/_Cut",
"<control>X", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kCmdCut, NULL},
1970 {
"/Edit/C_opy",
"<control>C", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kCmdCopy, NULL},
1971 {
"/Edit/_Paste",
"<control>V", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kCmdPaste, NULL},
1972 {
"/Edit/C_lear", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kCmdClear, NULL},
1974 {
"/_Select", NULL, NULL, 0,
"<Branch>"},
1975 {
"/Select/Select _Word(s)", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSelectWordCmd, NULL},
1976 {
"/Select/Select Te_xt Row(s)", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSelectTextRowCmd, NULL},
1977 {
"/Select/Select _Paragraph(s)", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSelectParagraphCmd, NULL},
1978 {
"/Select/", NULL, NULL, 0,
"<Separator>"},
1979 {
"/Select/Select A_ll in Cell", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSelectTableIntraCellAllCmd, NULL},
1980 {
"/Select/Select Table _Cell", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSelectTableCellCmd, NULL},
1981 {
"/Select/Select Table Ro_w(s)", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSelectTableRowCmd, NULL},
1982 {
"/Select/Select Table C_olumn(s)", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSelectTableColumnCmd, NULL},
1983 {
"/Select/Select _Table", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSelectTableCmd, NULL},
1984 {
"/Select/", NULL, NULL, 0,
"<Separator>"},
1985 {
"/Select/Select _All",
"<control>A", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kCmdSelectAll, NULL},
1986 {
"/Select/", NULL, NULL, 0,
"<Separator>"},
1987 {
"/Select/_Find...",
"<control>F", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFindCmd, NULL},
1988 {
"/Select/Find Aga_in",
"<control>G", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFindAgainCmd, NULL},
1989 {
"/Select/_Enter 'Find' String",
"<control>E", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kEnterFindStringCmd, NULL},
1990 {
"/Select/_Replace...",
"<control>H", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kReplaceCmd, NULL},
1991 {
"/Select/Replace Agai_n",
"<control>R", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kReplaceAgainCmd, NULL},
1992 {
"/Select/", NULL, NULL, 0,
"<Separator>"},
1993 {
"/Select/_Check Spelling...",
"<control>L", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSpellCheckCmd, NULL},
1995 {
"/_Insert", NULL, NULL, 0,
"<Branch>"},
1996 {
"/Insert/Insert _Table", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kInsertTableCmd, NULL},
1997 {
"/Insert/Insert Table _Row Above", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kInsertTableRowAboveCmd, NULL},
1998 {
"/Insert/Insert Table R_ow Below", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kInsertTableRowBelowCmd, NULL},
1999 {
"/Insert/Insert Table _Column Before", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kInsertTableColBeforeCmd, NULL},
2000 {
"/Insert/Insert Table Co_lumn After", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kInsertTableColAfterCmd, NULL},
2001 {
"/Insert/", NULL, NULL, 0,
"<Separator>"},
2002 {
"/Insert/Insert _URL", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kInsertURLCmd, NULL},
2004 {
"/_Format", NULL, NULL, 0,
"<Branch>"},
2005 {
"/_Format/Font _Name", NULL, NULL, 0,
"<Branch>"},
2006 {
"/_Format/Font _Style", NULL, NULL, 0,
"<Branch>"},
2007 {
"/_Format/Font _Style/_Plain",
"<control>T", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontStylePlainCmd,
"<CheckItem>"},
2008 {
"/_Format/Font _Style/sep1", NULL, NULL, 0,
"<Separator>"},
2009 {
"/_Format/Font _Style/_Bold",
"<control>B", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontStyleBoldCmd,
"<CheckItem>"},
2010 {
"/_Format/Font _Style/_Italic",
"<control>I", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontStyleItalicCmd,
"<CheckItem>"},
2011 {
"/_Format/Font _Style/_Underline",
"<control>U", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontStyleUnderlineCmd,
"<CheckItem>"},
2012 {
"/_Format/Font _Style/_Subscript", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSubScriptCmd,
"<CheckItem>"},
2013 {
"/_Format/Font _Style/Supe_rscript", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSuperScriptCmd,
"<CheckItem>"},
2014 {
"/_Format/Font Si_ze", NULL, NULL, 0,
"<Branch>"},
2015 {
"/_Format/Font Si_ze/9", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontSize9Cmd,
"<CheckItem>"},
2016 {
"/_Format/Font Si_ze/10", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontSize10Cmd,
"<CheckItem>"},
2017 {
"/_Format/Font Si_ze/12", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontSize12Cmd,
"<CheckItem>"},
2018 {
"/_Format/Font Si_ze/14", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontSize14Cmd,
"<CheckItem>"},
2019 {
"/_Format/Font Si_ze/18", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontSize18Cmd,
"<CheckItem>"},
2020 {
"/_Format/Font Si_ze/24", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontSize24Cmd,
"<CheckItem>"},
2021 {
"/_Format/Font Si_ze/36", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontSize36Cmd,
"<CheckItem>"},
2022 {
"/_Format/Font Si_ze/48", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontSize48Cmd,
"<CheckItem>"},
2023 {
"/_Format/Font Si_ze/72", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontSize72Cmd,
"<CheckItem>"},
2024 {
"/_Format/Font Si_ze/sep1", NULL, NULL, 0,
"<Separator>"},
2025 {
"/_Format/Font Si_ze/_Smaller", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontSizeSmallerCmd, NULL},
2026 {
"/_Format/Font Si_ze/_Larger", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontSizeLargerCmd, NULL},
2027 {
"/_Format/Font Si_ze/sep2", NULL, NULL, 0,
"<Separator>"},
2028 {
"/_Format/Font Si_ze/_Other...", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontSizeOtherCmd,
"<CheckItem>"},
2029 {
"/_Format/Font _Color", NULL, NULL, 0,
"<Branch>"},
2030 {
"/_Format/Font _Color/_Black", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kBlackColorCmd,
"<CheckItem>"},
2031 {
"/_Format/Font _Color/_Maroon", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kMaroonColorCmd,
"<CheckItem>"},
2032 {
"/_Format/Font _Color/_Green", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kGreenColorCmd,
"<CheckItem>"},
2033 {
"/_Format/Font _Color/_Olive", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kOliveColorCmd,
"<CheckItem>"},
2034 {
"/_Format/Font _Color/_Navy", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kNavyColorCmd,
"<CheckItem>"},
2035 {
"/_Format/Font _Color/_Purple", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kPurpleColorCmd,
"<CheckItem>"},
2036 {
"/_Format/Font _Color/_Teal", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kTealColorCmd,
"<CheckItem>"},
2037 {
"/_Format/Font _Color/_Gray", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kGrayColorCmd,
"<CheckItem>"},
2038 {
"/_Format/Font _Color/_Silver", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kSilverColorCmd,
"<CheckItem>"},
2039 {
"/_Format/Font _Color/_Red", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kRedColorCmd,
"<CheckItem>"},
2040 {
"/_Format/Font _Color/_Lime", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kLimeColorCmd,
"<CheckItem>"},
2041 {
"/_Format/Font _Color/_Yellow", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kYellowColorCmd,
"<CheckItem>"},
2042 {
"/_Format/Font _Color/Bl_ue", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kBlueColorCmd,
"<CheckItem>"},
2043 {
"/_Format/Font _Color/_Fuchsia", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFuchsiaColorCmd,
"<CheckItem>"},
2044 {
"/_Format/Font _Color/_Aqua", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kAquaColorCmd,
"<CheckItem>"},
2045 {
"/_Format/Font _Color/_White", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kWhiteColorCmd,
"<CheckItem>"},
2046 {
"/_Format/Font _Color/sep", NULL, NULL, 0,
"<Separator>"},
2047 {
"/_Format/Font _Color/O_ther...", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kFontColorOtherCmd,
"<CheckItem>"},
2048 {
"/_Format/_Choose Font Dialog...",
"<control>D", GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kChooseFontDialogCmd, NULL},
2049 {
"/_Format/sep", NULL, NULL, 0,
"<Separator>"},
2050 {
"/_Format/_Justification", NULL, NULL, 0,
"<Branch>"},
2051 {
"/_Format/_Justification/_Left", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kJustifyLeftCmd,
"<CheckItem>"},
2052 {
"/_Format/_Justification/_Center", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kJustifyCenterCmd,
"<CheckItem>"},
2053 {
"/_Format/_Justification/_Right", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kJustifyRightCmd,
"<CheckItem>"},
2054 {
"/_Format/_Justification/_Full", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kJustifyFullCmd,
"<CheckItem>"},
2056 {
"/_Remove/", NULL, NULL, 0,
"<Separator>"},
2057 {
"/_Remove/Remove _Rows", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kRemoveTableRowsCmd, NULL},
2058 {
"/_Remove/Remove _Columns", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kRemoveTableColumnsCmd, NULL},
2059 {
"/_Remove/sep", NULL, NULL, 0,
"<Separator>"},
2060 {
"/_Remove/_Hide Selection", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kHideSelectionCmd, NULL},
2061 {
"/_Remove/_Unhide Selection", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kUnHideSelectionCmd, NULL},
2063 {
"/_Options", NULL, NULL, 0,
"<Branch>"},
2064 {
"/Options/_Smart Cut and Paste", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kToggleUseSmartCutNPasteCmd,
"<CheckItem>"},
2065 {
"/Options/_Wrap to Window", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kToggleWrapToWindowCmd,
"<CheckItem>"},
2066 {
"/Options/Show _Hidden Text", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kToggleShowHiddenTextCmd,
"<CheckItem>"},
2067 {
"/Options/_Paragraph Markers Shown", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kShowHideParagraphGlyphsCmd,
"<CheckItem>"},
2068 {
"/Options/_Tab Markers Shown", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kShowHideTabGlyphsCmd,
"<CheckItem>"},
2069 {
"/Options/Spa_ce characters Shown", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kShowHideSpaceGlyphsCmd,
"<CheckItem>"},
2071 {
"/_Help", NULL, NULL, 0,
"<LastBranch>"},
2072 {
"/_Help/Goto _LedIt! Web Page", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kGotoLedItWebPageCmd, NULL},
2073 {
"/_Help/Goto _Sophist Solutions Web Page", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kGotoSophistsWebPageCmd, NULL},
2074 {
"/_Help/_Check for LedIt! Web Updates", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kCheckForUpdatesWebPageCmdID, NULL},
2075 {
"/_Help/sep", NULL, NULL, 0,
"<Separator>"},
2076 {
"/_Help/_About", NULL, GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher), kAboutBoxCmd, NULL},
2079static void RecursivelySetCallback (GtkWidget* menu, gpointer data)
2081 if (GTK_IS_MENU_ITEM (menu)) {
2082 GtkMenuItem* m = GTK_MENU_ITEM (menu);
2083 if (m->submenu != NULL) {
2084 gtk_signal_connect (GTK_OBJECT (menu),
"activate", GTK_SIGNAL_FUNC (LedItApplication::AppCmdOnInitMenu), data);
2085 RecursivelySetCallback (m->submenu, data);
2088 if (GTK_IS_CONTAINER (menu)) {
2089 GtkContainer* c = GTK_CONTAINER (menu);
2090 gtk_container_foreach (c, RecursivelySetCallback, data);
2094GtkWidget* LedItApplication::get_main_menu (GtkWidget* window)
2096 GtkAccelGroup* accel_group = gtk_accel_group_new ();
2106 GtkItemFactory* item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR,
"<main>", accel_group);
2111 gtk_item_factory_create_items (item_factory, Led_NEltsOf (kMenuItemResources), kMenuItemResources,
this);
2114 gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
2117 const string kFontMenuPath =
"/Format/Font Name";
2118 GtkWidget* fontNameMenu = gtk_item_factory_get_widget (item_factory, kFontMenuPath.c_str ());
2119 vector<SDKString> fontNames = LedItApplication::Get ().fInstalledFonts.GetUsableFontNames ();
2120 for (vector<SDKString>::const_iterator i = fontNames.begin (); i != fontNames.end (); ++i) {
2121 GtkItemFactoryEntry entry;
2122 memset (&entry, 0,
sizeof (entry));
2123 string fontName = *i;
2124 string tmpPath = kFontMenuPath +
"/" + fontName;
2125 entry.path =
const_cast<char*
> (tmpPath.c_str ());
2126 entry.callback = GTK_SIGNAL_FUNC (LedItApplication::AppCmdDispatcher);
2127 entry.callback_action = (i - fontNames.begin ()) + kBaseFontNameCmd;
2128 entry.item_type =
"<CheckItem>";
2129 gtk_item_factory_create_items (item_factory, 1, &entry,
this);
2132 GtkWidget* justCreatedItem = gtk_item_factory_get_widget (item_factory, entry.path);
2134 gtk_object_set_user_data (GTK_OBJECT (justCreatedItem),
reinterpret_cast<void*
> (entry.callback_action));
2142 for (
size_t i = 0; i < Led_NEltsOf (kMenuItemResources); ++i) {
2143 string path = kMenuItemResources[i].path;
2146 for (
size_t idx; (idx = path.find (
'_')) != string::npos;) {
2147 path.erase (idx, 1);
2151 GtkWidget* aMenu = gtk_item_factory_get_widget (item_factory, path.c_str ());
2153 gtk_object_set_user_data (GTK_OBJECT (aMenu),
reinterpret_cast<void*
> (kMenuItemResources[i].callback_action));
2158 GtkWidget* menuBar = gtk_item_factory_get_widget (item_factory,
"<main>");
2159 RecursivelySetCallback (menuBar,
this);
2164#if qStroika_Foundation_Common_Platform_Windows
2165const vector<SDKString>& LedItApplication::GetUsableFontNames ()
2167 return fInstalledFonts.GetUsableFontNames ();
2170void LedItApplication::FixupFontMenu (CMenu* fontMenu)
2173 const vector<SDKString>& fontNames = GetUsableFontNames ();
2176 while (fontMenu->DeleteMenu (0, MF_BYPOSITION) != 0) {
2180 for (UINT i = 0; i < fontNames.size (); ++i) {
2181 UINT cmdNum = kBaseFontNameCmd + i;
2182 fontMenu->AppendMenu (MF_STRING, cmdNum, fontNames[i].c_str ());
2186SDKString LedItApplication::CmdNumToFontName (UINT cmdNum)
2188 const vector<SDKString>& fontNames = GetUsableFontNames ();
2189 return (fontNames[cmdNum - kBaseFontNameCmd]);
2193#if qStroika_Foundation_Common_Platform_Windows
2199SimpleLedTemplate::SimpleLedTemplate (
const char* daStr)
2200 : CSingleDocTemplate (IDR_MAINFRAME, RUNTIME_CLASS (LedItDocument), RUNTIME_CLASS (LedItMainFrame), RUNTIME_CLASS (LedItView))
2202 m_strDocStrings = daStr;
2205void SimpleLedTemplate::LoadTemplate ()
2207 bool doMenuEmbedding = (m_hMenuEmbedding == NULL);
2208 bool doMenuInPlaceServer = (m_hMenuInPlaceServer == NULL);
2209 bool doMenuInPlace = (m_hMenuInPlace == NULL);
2210 CSingleDocTemplate::LoadTemplate ();
2213 if (doMenuEmbedding and m_hMenuEmbedding != NULL) {
2218 tmp.Attach (m_hMenuEmbedding);
2219 LedItApplication::Get ().FixupFontMenu (tmp.GetSubMenu (4)->GetSubMenu (0));
2222 if (doMenuInPlaceServer and m_hMenuInPlaceServer != NULL) {
2227 tmp.Attach (m_hMenuInPlaceServer);
2228 LedItApplication::Get ().FixupFontMenu (tmp.GetSubMenu (3)->GetSubMenu (0));
2231 if (doMenuInPlace and m_hMenuInPlace != NULL) {
2238#if qStroika_Foundation_Common_Platform_Windows
2246extern BOOL AFXAPI AfxFullPath (LPTSTR lpszPathOut, LPCTSTR lpszFileIn);
2247extern BOOL AFXAPI AfxResolveShortcut (CWnd* pWnd, LPCTSTR pszShortcutFile, LPTSTR pszPath,
int cchPath);
2248extern void AFXAPI AfxGetModuleShortFileName (HINSTANCE hInst, CString& strShortName);
2250LedItDocManager::LedItDocManager ()
2255void LedItDocManager::OnFileNew ()
2259 CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetHead ();
2260 ASSERT (pTemplate != NULL);
2261 ASSERT_KINDOF (CDocTemplate, pTemplate);
2262 (void)pTemplate->OpenDocumentFile (NULL);
2265CDocument* LedItDocManager::OpenDocumentFile (LPCTSTR lpszFileName)
2267 return OpenDocumentFile (lpszFileName, eUnknownFormat);
2270inline SDKString GetLongPathName (
const SDKString& pathName)
2272 TCHAR szPath[_MAX_PATH];
2273 Require (pathName.length () < _MAX_PATH);
2274 Characters::CString::Copy (szPath, std::size (szPath), pathName.c_str ());
2275 WIN32_FIND_DATA fileData;
2276 HANDLE hFind = ::FindFirstFile (szPath, &fileData);
2277 if (hFind != INVALID_HANDLE_VALUE) {
2278 TCHAR* lastSlash = ::_tcsrchr (szPath,
'\\');
2279 if (lastSlash != NULL) {
2282 Characters::CString::Cat (szPath, std::size (szPath), _T (
"\\"));
2283 Characters::CString::Cat (szPath, std::size (szPath), fileData.cFileName);
2284 szPath[_MAX_PATH - 1] =
'\0';
2285 VERIFY (::FindClose (hFind));
2289CDocument* LedItDocManager::OpenDocumentFile (LPCTSTR lpszFileName, FileFormat format)
2297 CDocTemplate* pTemplate = (CDocTemplate*)m_templateList.GetHead ();
2298 ASSERT (pTemplate != NULL);
2299 ASSERT_KINDOF (CDocTemplate, pTemplate);
2301 TCHAR szPath[_MAX_PATH];
2302 ASSERT (::_tcslen (lpszFileName) < _MAX_PATH);
2303 TCHAR szTemp[_MAX_PATH];
2304 if (lpszFileName[0] ==
'\"')
2306 Characters::CString::Copy (szTemp, std::size (szTemp), lpszFileName);
2307 LPTSTR lpszLast = _tcsrchr (szTemp,
'\"');
2308 if (lpszLast != NULL)
2310 AfxFullPath (szPath, szTemp);
2311 TCHAR szLinkName[_MAX_PATH];
2312 if (AfxResolveShortcut (AfxGetMainWnd (), szPath, szLinkName, _MAX_PATH))
2313 Characters::CString::Copy (szPath, std::size (szPath), szLinkName);
2317 Characters::CString::Copy (szPath, std::size (szPath), GetLongPathName (szPath).c_str ());
2319 LedItDocument::sHiddenDocOpenArg = format;
2320 return (pTemplate->OpenDocumentFile (szPath));
2323void LedItDocManager::RegisterShellFileTypes (BOOL bWin95)
2327 CString strPathName, strTemp;
2329 AfxGetModuleShortFileName (AfxGetInstanceHandle (), strPathName);
2333 RegisterShellFileType (bWin95, strPathName, 1,
".led",
"LedIt.Document",
"LedIt Document");
2336void LedItDocManager::RegisterShellFileType (
bool bWin95, CString strPathName,
int iconIndexInFile, CString strFilterExt,
2337 CString strFileTypeId, CString strFileTypeName)
2339 static const TCHAR szShellOpenFmt[] = _T(
"%s\\shell\\open\\%s");
2340 static const TCHAR szShellPrintFmt[] = _T(
"%s\\shell\\print\\%s");
2341 static const TCHAR szShellPrintToFmt[] = _T(
"%s\\shell\\printto\\%s");
2342 static const TCHAR szDefaultIconFmt[] = _T(
"%s\\DefaultIcon");
2343 static const TCHAR szShellNewFmt[] = _T(
"%s\\ShellNew");
2344 static const TCHAR szIconIndexFmt[] = _T(
",%d");
2345 static const TCHAR szCommand[] = _T(
"command");
2346 static const TCHAR szOpenArg[] = _T(
" \"%1\"");
2347 static const TCHAR szPrintArg[] = _T(
" /p \"%1\"");
2348 static const TCHAR szPrintToArg[] = _T(
" /pt \"%1\" \"%2\" \"%3\" \"%4\"");
2350 static const TCHAR szShellNewValueName[] = _T(
"NullFile");
2351 static const TCHAR szShellNewValue[] = _T(
"");
2353 const int DEFAULT_ICON_INDEX = 0;
2355 CString strOpenCommandLine = strPathName;
2356 CString strPrintCommandLine = strPathName;
2357 CString strPrintToCommandLine = strPathName;
2358 CString strDefaultIconCommandLine = strPathName;
2361 CString strIconIndex;
2362 HICON hIcon = ::ExtractIcon (AfxGetInstanceHandle (), strPathName, iconIndexInFile);
2363 if (hIcon != NULL) {
2364 strIconIndex.Format (szIconIndexFmt, iconIndexInFile);
2365 ::DestroyIcon (hIcon);
2368 strIconIndex.Format (szIconIndexFmt, DEFAULT_ICON_INDEX);
2370 strDefaultIconCommandLine += strIconIndex;
2373 if (!strFileTypeId.IsEmpty ()) {
2377 if (strFileTypeName.IsEmpty ()) {
2378 strFileTypeName = strFileTypeId;
2381 ASSERT (strFileTypeId.Find (
' ') == -1);
2384 if (!SetRegKey (strFileTypeId, strFileTypeName)) {
2390 strTemp.Format (szDefaultIconFmt, (LPCTSTR)strFileTypeId);
2391 if (!SetRegKey (strTemp, strDefaultIconCommandLine)) {
2400 strOpenCommandLine += szOpenArg;
2402 strPrintCommandLine += szPrintArg;
2403 strPrintToCommandLine += szPrintToArg;
2407 strTemp.Format (szShellOpenFmt, (LPCTSTR)strFileTypeId, (LPCTSTR)szCommand);
2408 if (!SetRegKey (strTemp, strOpenCommandLine)) {
2414 strTemp.Format (szShellPrintFmt, (LPCTSTR)strFileTypeId, (LPCTSTR)szCommand);
2415 if (!SetRegKey (strTemp, strPrintCommandLine)) {
2420 strTemp.Format (szShellPrintToFmt, (LPCTSTR)strFileTypeId, (LPCTSTR)szCommand);
2421 if (!SetRegKey (strTemp, strPrintToCommandLine)) {
2426 if (!strFilterExt.IsEmpty ()) {
2427 ASSERT (strFilterExt[0] ==
'.');
2428 LONG lSize = _MAX_PATH * 2;
2429 LONG lResult = ::RegQueryValue (HKEY_CLASSES_ROOT, strFilterExt, strTemp.GetBuffer (lSize), &lSize);
2430 strTemp.ReleaseBuffer ();
2431 if (lResult != ERROR_SUCCESS || strTemp.IsEmpty () || strTemp == strFileTypeId) {
2433 if (!SetRegKey (strFilterExt, strFileTypeId)) {
2437 strTemp.Format (szShellNewFmt, (LPCTSTR)strFilterExt);
2438 (void)SetRegKey (strTemp, szShellNewValue, szShellNewValueName);
2445BOOL LedItDocManager::DoPromptFileName (CString& , UINT , DWORD , BOOL , CDocTemplate* )
2452void LedItDocManager::OnFileOpen ()
2455 FileFormat format = eUnknownFormat;
2456 if (LedItDocument::DoPromptOpenFileName (fileName, &format)) {
2457 OpenDocumentFile (fileName, format);
#define RequireNotNull(p)
#define AssertMember(p, c)
basic_string< SDKChar > SDKString