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 < std::size (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, std::size (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, std::size (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, std::size (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, std::size (szPath), _T (
"\\"));
 
 2280        Characters::CString::Cat (szPath, std::size (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, std::size (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, std::size (szPath), szLinkName);
 
 2314    Characters::CString::Copy (szPath, std::size (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