Annotation of mstools/mfc/samples/oclient/mainwnd.cpp, revision 1.1

1.1     ! root        1: // This is a part of the Microsoft Foundation Classes C++ library.
        !             2: // Copyright (C) 1992 Microsoft Corporation
        !             3: // All rights reserved.
        !             4: //
        !             5: // This source code is only intended as a supplement to the
        !             6: // Microsoft Foundation Classes Reference and Microsoft
        !             7: // QuickHelp documentation provided with the library.
        !             8: // See these sources for detailed information regarding the
        !             9: // Microsoft Foundation Classes product.
        !            10: 
        !            11: // MAINWND.CXX : main window
        !            12: 
        !            13: #include "oclient.h"
        !            14: #include "mainwnd.h"
        !            15: #include "itemwnd.h"
        !            16: 
        !            17: static LPSTR CreateNewUniqueName(LPSTR lpstr);
        !            18: 
        !            19: /////////////////////////////////////////////////////////////////////////////
        !            20: 
        !            21: 
        !            22: #pragma warning(disable:4355)
        !            23: // C4355 is "'this' used in base initializer list" warning
        !            24: 
        !            25: CMainWnd::CMainWnd()
        !            26:        : m_document(this)
        !            27: {
        !            28:        VERIFY(m_title.LoadString(IDS_APPNAME));
        !            29:        VERIFY(LoadAccelTable(MAKEINTRESOURCE(ID_APPLICATION)));
        !            30:        Create(NULL, m_title, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
        !            31:                rectDefault, NULL, MAKEINTRESOURCE(ID_APPLICATION));
        !            32:        ASSERT(m_hWnd != NULL);
        !            33:        m_pSelection = NULL;
        !            34:        m_fDirty = FALSE;
        !            35: }
        !            36: 
        !            37: #pragma warning(default:4355)
        !            38: 
        !            39: // Iterator over content
        !            40: COleClientItem* CMainDocument::GetNextItem(POSITION& rPosition,
        !            41:                BOOL* pIsSelected)
        !            42: {
        !            43:        CItemWnd* pItemWnd = (CItemWnd*) rPosition;
        !            44:        if (pItemWnd == NULL)
        !            45:                pItemWnd = (CItemWnd*)m_pView->GetTopWindow();
        !            46:        else
        !            47:                pItemWnd = (CItemWnd*)pItemWnd->GetNextWindow();
        !            48: 
        !            49:        *pIsSelected = (m_pView->GetSelection() == pItemWnd);
        !            50:        rPosition = (POSITION)pItemWnd;
        !            51:        return (pItemWnd == NULL) ? NULL : pItemWnd->GetEmbedded();
        !            52: }
        !            53: 
        !            54: 
        !            55: /////////////////////////////////////////////////////////////////////////////
        !            56: 
        !            57: void CMainWnd::OnAbout()
        !            58: {
        !            59:        CModalDialog about(MAKEINTRESOURCE(IDDT_ABOUT), this);
        !            60:        about.DoModal();
        !            61: }
        !            62: 
        !            63: void CMainWnd::Hourglass(BOOL bOn)
        !            64: {
        !            65:        static int count = 0;
        !            66:        static HCURSOR hcurWait = AfxGetApp()->LoadStandardCursor(IDC_WAIT);
        !            67:        static HCURSOR hcurLast;
        !            68: 
        !            69:        ASSERT(hcurWait != NULL);
        !            70:        if (bOn)
        !            71:        {
        !            72:                if (count++ == 0)
        !            73:                        hcurLast = ::SetCursor(hcurWait);
        !            74:        }
        !            75:        else
        !            76:        {
        !            77:                if (--count == 0)
        !            78:                        ::SetCursor(hcurLast);
        !            79:        }
        !            80: }
        !            81: 
        !            82: void CMainWnd::OnClose()
        !            83: {
        !            84:        if (COleClientItem::InWaitForRelease())
        !            85:        {
        !            86:                ErrorMessage(E_BUSY);
        !            87:                return;
        !            88:        }
        !            89: 
        !            90:        if (!SaveAsNeeded())
        !            91:                return;     // don't quit
        !            92: 
        !            93:        DeregisterDoc();
        !            94:        DestroyWindow();
        !            95: }
        !            96: 
        !            97: BOOL CMainWnd::OnQueryEndSession()
        !            98: {
        !            99:        if (COleClientItem::InWaitForRelease())
        !           100:                return FALSE;
        !           101:        return CFrameWnd::OnQueryEndSession();
        !           102: }
        !           103: 
        !           104: void CMainWnd::OnDestroy()
        !           105: {
        !           106:        GetDocument()->Revoke();    // revoke just in case
        !           107:        CFrameWnd::OnDestroy(); // will close down the app
        !           108: }
        !           109: 
        !           110: /////////////////////////////////////////////////////////////////////////////
        !           111: // Error reporting
        !           112: 
        !           113: void CMainWnd::ErrorMessage(UINT id)
        !           114: {
        !           115:        // if in exit mode no message box
        !           116:        if (!GetDocument()->IsOpen())
        !           117:                return;
        !           118: 
        !           119:        CString str;
        !           120:        str.LoadString(id);
        !           121:        MessageBox(str, AfxGetAppName(), MB_OK | MB_ICONEXCLAMATION);
        !           122: }
        !           123: 
        !           124: /////////////////////////////////////////////////////////////////////////////
        !           125: 
        !           126: void CMainWnd::OnExit()
        !           127: {
        !           128:        // close window - NOTE: Do _not_ call 'OnClose' message map function
        !           129:        SendMessage(WM_CLOSE);
        !           130: }
        !           131: 
        !           132: /////////////////////////////////////////////////////////////////////////////
        !           133: 
        !           134: 
        !           135: BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd)
        !           136:        // windows messages
        !           137:        ON_WM_INITMENUPOPUP()
        !           138:        ON_WM_CLOSE()
        !           139:        ON_WM_DESTROY()
        !           140:        ON_WM_QUERYENDSESSION()
        !           141:        ON_WM_ACTIVATE()
        !           142: 
        !           143:        // file menu commands
        !           144:        ON_COMMAND(IDM_NEW, OnFileNew)
        !           145:        ON_COMMAND(IDM_OPEN, OnFileOpen)
        !           146:        ON_COMMAND(IDM_SAVE, OnFileSave)
        !           147:        ON_COMMAND(IDM_SAVEAS, OnFileSaveAs)
        !           148:        ON_COMMAND(IDM_EXIT, OnExit)
        !           149:        ON_COMMAND(IDM_ABOUT, OnAbout)
        !           150:        // edit menu commands
        !           151:        ON_COMMAND(IDM_CUT, OnCut)
        !           152:        ON_COMMAND(IDM_COPY, OnCopy)
        !           153:        ON_COMMAND(IDM_PASTE, OnPaste)
        !           154:        ON_COMMAND(IDM_PASTELINK, OnPasteLink)
        !           155:        ON_COMMAND(IDM_CLEAR, OnClear)
        !           156:        ON_COMMAND(IDM_CLEARALL, OnClearAll)
        !           157:        ON_COMMAND(IDM_INSERT_OBJECT, OnInsertObject)
        !           158:        ON_COMMAND(IDM_LINKS, OnEditLinks)
        !           159: END_MESSAGE_MAP()
        !           160: 
        !           161: 
        !           162: /////////////////////////////////////////////////////////////////////////////
        !           163: // Most Edit Commands
        !           164: 
        !           165: void CMainWnd::OnInitMenuPopup(CMenu* pMenu, UINT iMenu, BOOL bSysMenu)
        !           166: {
        !           167:        if (bSysMenu || iMenu != IMENU_EDIT)
        !           168:                return; // system and file menu don't do any dynamic updating
        !           169: 
        !           170:        ASSERT(pMenu != NULL);
        !           171:        // only enable/diable items on the Edit menu
        !           172:        CItemWnd* pSelection = GetSelection();
        !           173: 
        !           174:        //BLOCK: Simple editing
        !           175:        {
        !           176:                UINT    mfCanEdit = MF_GRAYED|MF_DISABLED;
        !           177: 
        !           178:                if (pSelection != NULL)
        !           179:                        mfCanEdit = MF_ENABLED; // have some content
        !           180: 
        !           181:                // Now enable appropriate menu items
        !           182:                pMenu->EnableMenuItem(IDM_CUT, mfCanEdit);
        !           183:                pMenu->EnableMenuItem(IDM_COPY, mfCanEdit);
        !           184:                pMenu->EnableMenuItem(IDM_CLEAR, mfCanEdit);
        !           185:                pMenu->EnableMenuItem(IDM_CLEARALL, mfCanEdit);
        !           186:        }
        !           187: 
        !           188:        //BLOCK: paste variants
        !           189:        {
        !           190:                pMenu->EnableMenuItem(IDM_PASTE, COleClientItem::CanPaste() ?
        !           191:                         MF_ENABLED : (MF_GRAYED|MF_DISABLED));
        !           192:                pMenu->EnableMenuItem(IDM_PASTELINK, COleClientItem::CanPasteLink() ?
        !           193:                         MF_ENABLED : (MF_GRAYED|MF_DISABLED));
        !           194:        }
        !           195: 
        !           196:        //BLOCK: special case if any linked objects
        !           197:        {
        !           198:                UINT    mfLinks = MF_GRAYED|MF_DISABLED;
        !           199: 
        !           200:                CItemWnd* pItemWnd;
        !           201:                for (pItemWnd = (CItemWnd*)GetTopWindow(); pItemWnd != NULL;
        !           202:                        pItemWnd = (CItemWnd*)pItemWnd->GetNextWindow())
        !           203:                {
        !           204:                        if (pItemWnd->GetEmbedded()->GetType() == OT_LINK)
        !           205:                        {
        !           206:                                mfLinks = MF_ENABLED;
        !           207:                                break;
        !           208:                        }
        !           209:                }
        !           210:                pMenu->EnableMenuItem(IDM_LINKS, mfLinks);
        !           211:        }
        !           212: 
        !           213:        //BLOCK: Object menu specific
        !           214:        {
        !           215:                static int iItemObjectVerb = -1;    // position on the Edit menu
        !           216: 
        !           217:                if (iItemObjectVerb == -1)
        !           218:                {
        !           219:                        // one-time init - find the position of the "Object ?" menuitem
        !           220:                        int nItems = pMenu->GetMenuItemCount();
        !           221:                        for (int iItem = 0; iItem < nItems; iItem++)
        !           222:                        {
        !           223:                                if (pMenu->GetMenuItemID(iItem) == IDM_OBJECT_VERB_MIN)
        !           224:                                {
        !           225:                                        iItemObjectVerb = iItem;
        !           226:                                        break;
        !           227:                                }
        !           228:                        }
        !           229:                        ASSERT(iItemObjectVerb != -1);
        !           230:                                // MUST BE IN THE MENU TEMPLATE ON INIT !
        !           231:                }
        !           232: 
        !           233:                AfxOleSetEditMenu(pSelection == NULL ? NULL : pSelection->GetEmbedded(),
        !           234:                        pMenu, iItemObjectVerb, IDM_OBJECT_VERB_MIN);
        !           235:        }
        !           236: }
        !           237: 
        !           238: BOOL CMainWnd::OnCommand(UINT wParam, LONG lParam)
        !           239: {
        !           240:        // if we are waiting for release - ignore all commands
        !           241:        if (COleClientItem::InWaitForRelease())
        !           242:        {
        !           243:                ErrorMessage(E_BUSY);
        !           244:                return TRUE;        // handled
        !           245:        }
        !           246: 
        !           247:        if (LOWORD(lParam) == 0 && wParam >= IDM_OBJECT_VERB_MIN &&
        !           248:                wParam <= IDM_OBJECT_VERB_MAX)
        !           249:        {
        !           250:                // activate the current selection with the appropriate verb
        !           251:                CItemWnd* pItemWnd = GetSelection();
        !           252:                ASSERT(pItemWnd != NULL);
        !           253:                pItemWnd->DoVerb(wParam - IDM_OBJECT_VERB_MIN);
        !           254:                return TRUE;        // handled
        !           255:        }
        !           256:        return CFrameWnd::OnCommand(wParam, lParam);
        !           257: }
        !           258: 
        !           259: /////////////////////////////////////////////////////////////////////////////
        !           260: // Selection support
        !           261: 
        !           262: void CMainWnd::SetSelection(CItemWnd* pNewSelection)
        !           263: {
        !           264:        if (pNewSelection != GetTopWindow() && pNewSelection != NULL)
        !           265:                pNewSelection->BringWindowToTop();
        !           266: 
        !           267:        if (m_pSelection != pNewSelection)
        !           268:        {
        !           269:                // de-select old
        !           270:                if (m_pSelection != NULL)
        !           271:                        m_pSelection->Select(FALSE);
        !           272:                // select the new
        !           273:                if (pNewSelection != NULL)
        !           274:                {
        !           275:                        pNewSelection->Select(TRUE);
        !           276:                }
        !           277:                m_pSelection = pNewSelection;
        !           278:        }
        !           279: }
        !           280: 
        !           281: void CMainWnd::OnActivate(UINT nState, CWnd*, BOOL)
        !           282: {
        !           283:        if (m_pSelection)
        !           284:                m_pSelection->Select(nState != 0);
        !           285: }
        !           286: 
        !           287: /////////////////////////////////////////////////////////////////////////////
        !           288: 
        !           289: void CMainWnd::OnCut()
        !           290: {
        !           291:        if (!DoCopySelection())
        !           292:        {
        !           293:                ErrorMessage(E_CLIPBOARD_CUT_FAILED);
        !           294:                return;
        !           295:        }
        !           296:        // cut it out
        !           297:        OnClear();
        !           298:        Dirty();
        !           299: }
        !           300: 
        !           301: 
        !           302: void CMainWnd::OnCopy()
        !           303: {
        !           304:        if (!DoCopySelection())
        !           305:                ErrorMessage(E_CLIPBOARD_COPY_FAILED);
        !           306: }
        !           307: 
        !           308: BOOL CMainWnd::DoCopySelection()
        !           309: {
        !           310:        CItemWnd* pSel = GetSelection();
        !           311:        ASSERT(pSel != NULL);
        !           312: 
        !           313:        if (!OpenClipboard())
        !           314:                return FALSE;
        !           315: 
        !           316:        /* Empty the clipboard */
        !           317:        EmptyClipboard();
        !           318: 
        !           319:        TRY
        !           320:                pSel->GetEmbedded()->CopyToClipboard();
        !           321:        CATCH (CException, e)
        !           322:                return FALSE;
        !           323:        END_CATCH
        !           324: 
        !           325:        CloseClipboard();
        !           326:        return TRUE;
        !           327: }
        !           328: 
        !           329: 
        !           330: void CMainWnd::OnClear()
        !           331: {
        !           332:        ASSERT(GetSelection() != NULL);
        !           333:        CItemWnd* pSel = GetSelection();
        !           334: 
        !           335:        if (pSel)
        !           336:                pSel->DestroyWindow();
        !           337: 
        !           338:        Dirty();
        !           339: }
        !           340: 
        !           341: void CMainWnd::ClearAll()
        !           342: {
        !           343:        CWnd* pKid;
        !           344:        while ((pKid = GetTopWindow()) != NULL)
        !           345:        {
        !           346:                VERIFY(pKid->DestroyWindow());
        !           347:        }
        !           348: }
        !           349: 
        !           350: void CMainWnd::OnClearAll()
        !           351: {
        !           352:        ClearAll();      /* Wipes out all items */
        !           353:        Dirty();
        !           354: }
        !           355: 
        !           356: void CMainWnd::OnPaste()
        !           357: {
        !           358:        if (!DoPaste(FALSE))
        !           359:                ErrorMessage(E_GET_FROM_CLIPBOARD_FAILED);
        !           360:        Dirty();
        !           361: }
        !           362: 
        !           363: void CMainWnd::OnPasteLink()
        !           364: {
        !           365:        if (!DoPaste(TRUE))
        !           366:                ErrorMessage(E_GET_FROM_CLIPBOARD_FAILED);
        !           367: }
        !           368: 
        !           369: BOOL CMainWnd::DoPaste(BOOL fLink)
        !           370: {
        !           371:        if (!OpenClipboard())
        !           372:                return NULL;                    /* Couldn't open the clipboard */
        !           373: 
        !           374:        Hourglass(TRUE);
        !           375: 
        !           376:        /* Don't replace the current object unless we're successful */
        !           377:        CItemWnd* pItemWnd = new CItemWnd(this);
        !           378:        CEmbeddedItem* pItem = pItemWnd->GetEmbedded();
        !           379:        char szName[OLE_MAXNAMESIZE];
        !           380:        CreateNewUniqueName(szName);
        !           381: 
        !           382:        TRY
        !           383:        {
        !           384:                if (fLink)
        !           385:                {
        !           386:                        if (!pItem->CreateLinkFromClipboard(szName))
        !           387:                                AfxThrowMemoryException();      // any exception will do
        !           388:                }
        !           389:                else
        !           390:                {
        !           391:                        // paste embedded
        !           392:                        if (pItem->CreateFromClipboard(szName))
        !           393:                        {
        !           394:                                TRACE("embedded an embedded OLE object\n");
        !           395:                        }
        !           396:                        else if (pItem->CreateStaticFromClipboard(szName))
        !           397:                        {
        !           398:                                TRACE("embedded a static picture object\n");
        !           399:                        }
        !           400:                        else
        !           401:                        {
        !           402:                                AfxThrowMemoryException();      // any exception will do
        !           403:                        }
        !           404:                }
        !           405:        }
        !           406:        CATCH (CException, e)
        !           407:        {
        !           408:                // general cleanup
        !           409:                TRACE("failed to embed/link an OLE object\n");
        !           410:                delete pItemWnd;
        !           411:                pItemWnd = NULL;
        !           412:        }
        !           413:        END_CATCH
        !           414: 
        !           415:        CloseClipboard();
        !           416:        Hourglass(FALSE);
        !           417: 
        !           418:        if (pItemWnd == NULL)
        !           419:                return FALSE;
        !           420:        
        !           421:        // create as a live health ItemWnd
        !           422:        if (!pItemWnd->CreateItemWindow(TRUE))
        !           423:        {
        !           424:                delete pItemWnd;
        !           425:                return FALSE;
        !           426:        }
        !           427: 
        !           428:        // Success !
        !           429:        //  (from this point on the PostNcCreate hook will clean up memory)
        !           430:        return TRUE;
        !           431: }
        !           432: 
        !           433: 
        !           434: /////////////////////////////////////////////////////////////////////////////
        !           435: // Insert new object
        !           436: 
        !           437: void CMainWnd::OnInsertObject()
        !           438: {
        !           439:        CString className;
        !           440: 
        !           441:        if (!AfxOleInsertDialog(className))
        !           442:                return;
        !           443: 
        !           444:        TRACE("Trying to Insert OLE object (class '%s')\n", (const char*)className);
        !           445:        CItemWnd* pItemWnd = new CItemWnd(this);
        !           446:        CEmbeddedItem* pItem = pItemWnd->GetEmbedded();
        !           447: 
        !           448:        char szTmp[OLE_MAXNAMESIZE];
        !           449:        TRY
        !           450:        {
        !           451:                if (!pItem->CreateNewObject(className, CreateNewUniqueName(szTmp)))
        !           452:                        AfxThrowMemoryException();      // any exception will do
        !           453:        }
        !           454:        CATCH (CException, e)
        !           455:        {
        !           456:                ErrorMessage(E_FAILED_TO_CREATE);
        !           457:                // clean up item
        !           458:                delete pItemWnd;
        !           459:                return;
        !           460:        }
        !           461:        END_CATCH
        !           462: 
        !           463:        // Create invisible (will become visible later when updated)
        !           464:        if (!pItemWnd->CreateItemWindow(FALSE))
        !           465:                delete pItemWnd;
        !           466: 
        !           467:        // Success!
        !           468:        //  (from this point on the PostNcCreate hook will clean up memory)
        !           469: 
        !           470:        Dirty();
        !           471: }
        !           472: 
        !           473: /////////////////////////////////////////////////////////////////////////////
        !           474: 
        !           475: void FixObjectBounds(CRect& rect)
        !           476: {
        !           477:        /* If we have an empty rectangle, start at default size */
        !           478:        if (rect.IsRectNull())
        !           479:        {
        !           480:                rect.SetRect(0, 0, CXDEFAULT, CYDEFAULT);
        !           481:        }
        !           482:        else
        !           483:        {
        !           484:                // First map from HIMETRIC back to screen coordinates
        !           485:                {
        !           486:                        CClientDC screenDC(NULL);
        !           487: 
        !           488:                        short oldMode = screenDC.SetMapMode(MM_HIMETRIC);
        !           489:                        screenDC.LPtoDP(&rect);
        !           490:                        screenDC.SetMapMode(oldMode);
        !           491:                }
        !           492: 
        !           493:                /* Preserve the Aspect Ratio of the picture */
        !           494:                DWORD xDiff = (DWORD) (rect.right - rect.left + 1);
        !           495:                DWORD yDiff = (DWORD) (rect.bottom - rect.top + 1);
        !           496: 
        !           497:                /* Don't use *= here because of integer arithmetic. */
        !           498:                if (xDiff > CXDEFAULT || yDiff > CYDEFAULT)
        !           499:                {
        !           500:                        if ((xDiff * CYDEFAULT) > (yDiff * CXDEFAULT))
        !           501:                        {
        !           502:                                yDiff = ((yDiff * CXDEFAULT) / xDiff);
        !           503:                                xDiff = CXDEFAULT;
        !           504:                        }
        !           505:                        else
        !           506:                        {
        !           507:                                xDiff = ((xDiff * CYDEFAULT) / yDiff);
        !           508:                                yDiff = CYDEFAULT;
        !           509:                        }
        !           510:                }
        !           511:                rect.SetRect(0, 0, (int)xDiff - 1, (int)yDiff - 1);
        !           512:        }
        !           513: }
        !           514: 
        !           515: /////////////////////////////////////////////////////////////////////////////
        !           516: // Name generator helper
        !           517: 
        !           518: LPSTR CreateNewUniqueName(LPSTR lpstr)
        !           519: {
        !           520:        static int CurrentNumber = 0;
        !           521:        wsprintf(lpstr, "%s%04d", (LPSTR)OBJ_NAME_PREFIX, CurrentNumber++);
        !           522:        return(lpstr);
        !           523: }
        !           524: 
        !           525: /////////////////////////////////////////////////////////////////////////////
        !           526: 
        !           527: void CMainWnd::OnEditLinks()
        !           528: {
        !           529:        CItemWnd* pSelection = GetSelection();
        !           530: 
        !           531:        AfxOleLinksDialog(GetDocument());
        !           532: }
        !           533: 
        !           534: /////////////////////////////////////////////////////////////////////////////
        !           535: // Diagnostics
        !           536: 
        !           537: #ifdef _DEBUG
        !           538: void CMainWnd::AssertValid() const
        !           539: {
        !           540:        ASSERT(GetDocument()->IsOpen());
        !           541: }
        !           542: #endif
        !           543: 
        !           544: /////////////////////////////////////////////////////////////////////////////

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.