Annotation of mstools/mfc/src/oleui.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: #include "afxole.h"
        !            12: #pragma hdrstop
        !            13: 
        !            14: #include "afxoleUI.h"       // user interface parts
        !            15: 
        !            16: #include "shellapi.h"
        !            17: 
        !            18: #ifdef AFX_OLE_SEG
        !            19: #pragma code_seg(AFX_OLE_SEG)
        !            20: #endif
        !            21: 
        !            22: #ifdef _DEBUG
        !            23: #undef THIS_FILE
        !            24: static char BASED_CODE THIS_FILE[] = __FILE__;
        !            25: #endif
        !            26: 
        !            27: /////////////////////////////////////////////////////////////////////////////
        !            28: // User interface for COleClientItem
        !            29: 
        !            30: int COleClientItem::cWaitForRelease = 0;
        !            31: BOOL COleClientItem::InWaitForRelease()
        !            32: {
        !            33:        return cWaitForRelease != 0;
        !            34: }
        !            35: 
        !            36: void COleClientItem::WaitForServer()
        !            37: {
        !            38:        // enforce synchronous action from the server
        !            39:        if (afxTraceFlags & 0x10)
        !            40:                TRACE("WAITING for server\n");
        !            41: 
        !            42:        ASSERT(m_lpObject != NULL);
        !            43:        ASSERT(cWaitForRelease == 0);
        !            44: #ifdef _DEBUG
        !            45:        m_lastStatus = OLE_WAIT_FOR_RELEASE;
        !            46: #endif
        !            47:        cWaitForRelease++;
        !            48: 
        !            49:        // OnRelease may NULL out our m_lpObject
        !            50:        while (m_lpObject != NULL && ::OleQueryReleaseStatus(m_lpObject) != OLE_OK)
        !            51:        {
        !            52:                TRY
        !            53:                {
        !            54:                        AfxGetApp()->PumpMessage();
        !            55:                }
        !            56:                CATCH(CException,e)
        !            57:                {
        !            58:                        TRACE("DANGER: caught exception in WaitForServer - continuing\n");
        !            59:                }
        !            60:                END_CATCH
        !            61:        }
        !            62:        cWaitForRelease--;
        !            63: 
        !            64:        if (afxTraceFlags & 0x10)
        !            65:                TRACE("DONE WAITING for server\n");
        !            66: }
        !            67: 
        !            68: BOOL COleClientItem::ReportError(OLESTATUS status)
        !            69:        // return TRUE if error or warning reported
        !            70: {
        !            71:        UINT idString = 0;
        !            72: 
        !            73:        switch (status)
        !            74:        {
        !            75:        default:
        !            76:                return FALSE;       // nothing sensible to report
        !            77: 
        !            78:        case OLE_ERROR_STATIC:
        !            79:                idString = AFX_ERROR_STATIC_OBJECT;
        !            80:                break;
        !            81: 
        !            82:        case OLE_ERROR_REQUEST_PICT:
        !            83:        case OLE_ERROR_ADVISE_RENAME:
        !            84:        case OLE_ERROR_SHOW:
        !            85:        case OLE_ERROR_OPEN:
        !            86:        case OLE_ERROR_NETWORK:
        !            87:        case OLE_ERROR_ADVISE_PICT:
        !            88:        case OLE_ERROR_COMM:
        !            89:        case OLE_ERROR_LAUNCH:
        !            90:                // invalid link
        !            91:                idString = AFX_ERROR_FAILED_TO_CONNECT;
        !            92:                break;
        !            93: 
        !            94:        case OLE_ERROR_DOVERB:
        !            95:                idString = AFX_ERROR_BAD_VERB;
        !            96:                break;
        !            97: 
        !            98:        case OLE_BUSY:
        !            99:                idString = AFX_ERROR_SERVER_BUSY;
        !           100:                break;
        !           101: 
        !           102:        case OLE_ERROR_MEMORY:
        !           103:                idString = AFX_ERROR_MEMORY;
        !           104:                break;
        !           105:        }
        !           106: 
        !           107:        CString s;
        !           108:        s.LoadString(idString);
        !           109: 
        !           110:        // bring up a message box in the topmost window
        !           111:        CWinApp* pApp = AfxGetApp();
        !           112:        ASSERT(pApp != NULL && pApp->m_pMainWnd != NULL);
        !           113:        pApp->m_pMainWnd->MessageBox(s, pApp->m_pszAppName,
        !           114:                        MB_OK | MB_ICONEXCLAMATION);
        !           115: 
        !           116:        return TRUE;
        !           117: }
        !           118: 
        !           119: 
        !           120: /////////////////////////////////////////////////////////////////////////////
        !           121: // OLE Object Verb Menu helpers
        !           122: 
        !           123: // Parameters:
        !           124: //      pClient = client object to operate on (NULL => none)
        !           125: //      pMenu = menu to modify
        !           126: //      iMenuItem = index into menu where menu item or popup is to be placed
        !           127: //              (note will delete the old one)
        !           128: //      nIDVerbMin = first menu command id for sending to pClient
        !           129: //
        !           130: // Supported cases:
        !           131: //  NULL client "&Object" disabled
        !           132: //  0 verbs       "<Object Class> &Object"
        !           133: //  1 verb (no name) "<Object Class> &Object"
        !           134: //  1 verb == edit   "<Object Class> &Object"
        !           135: //  1 verb != edit   "<verb> <Object Class> &Object"
        !           136: //  more than 1 verb "<Object Class> &Object" => verbs
        !           137: 
        !           138: void AfxOleSetEditMenu(COleClientItem* pClient, CMenu* pMenu,
        !           139:        UINT iMenuItem, UINT nIDVerbMin)
        !           140: {
        !           141:        ASSERT(pMenu != NULL);
        !           142: 
        !           143:        static CString NEAR strObjectVerb;           // "&Object"
        !           144:        static CString NEAR strEditVerb;             // "Edit"
        !           145:        static BOOL bInited = FALSE;
        !           146:        if (!bInited)
        !           147:        {
        !           148:                VERIFY(strObjectVerb.LoadString(AFX_IDS_OBJECT_MENUITEM));
        !           149:                VERIFY(strEditVerb.LoadString(AFX_IDS_EDIT_VERB));
        !           150:        }
        !           151: 
        !           152:        pMenu->DeleteMenu(iMenuItem, MF_BYPOSITION); // get rid of old UI
        !           153: 
        !           154:        HANDLE hLinkData = NULL;
        !           155:        UINT mfObjectVerb = MF_GRAYED|MF_DISABLED;
        !           156: 
        !           157:        if (pClient != NULL)
        !           158:        {
        !           159:                // get type from object
        !           160:                hLinkData = pClient->GetLinkFormatData();
        !           161:                mfObjectVerb = MF_ENABLED;
        !           162:        }
        !           163: 
        !           164:        LPCSTR   lpszData;
        !           165:        // use the link data to determine what class we are talking about
        !           166: 
        !           167:        if (hLinkData == NULL ||
        !           168:           (lpszData = (LPCSTR)::GlobalLock(hLinkData)) == NULL)
        !           169:        {
        !           170:                // not a valid link, just use the simple '&Object' format disabled
        !           171:                pMenu->InsertMenu(iMenuItem, MF_BYPOSITION, nIDVerbMin, strObjectVerb);
        !           172:                pMenu->EnableMenuItem(iMenuItem, mfObjectVerb | MF_BYPOSITION |
        !           173:                        MF_GRAYED|MF_DISABLED);
        !           174:                return;
        !           175:        }
        !           176: 
        !           177:        LONG    lSize;
        !           178:        char    szClass[OLE_MAXNAMESIZE];
        !           179:        char    szBuffer[OLE_MAXNAMESIZE+40];
        !           180: 
        !           181:        // get real language class of object in szClass for menu
        !           182:        lSize = OLE_MAXNAMESIZE;
        !           183:        if (::RegQueryValue(HKEY_CLASSES_ROOT, lpszData, szClass,
        !           184:                &lSize) != ERROR_SUCCESS)
        !           185:        {
        !           186:                // no localized class name, use unlocalized name
        !           187:                lstrcpy(szClass, lpszData);
        !           188:        }
        !           189:        ::GlobalUnlock(hLinkData);
        !           190: 
        !           191:        // determine list of available verbs
        !           192:        char    szFirstVerb[OLE_MAXNAMESIZE];
        !           193:        HMENU  hPopup = NULL;
        !           194:        int     cVerbs = 0;
        !           195: 
        !           196:        while (1)
        !           197:        {
        !           198:                wsprintf(szBuffer, "%s\\protocol\\StdFileEditing\\verb\\%d",
        !           199:                                 (LPCSTR)lpszData, cVerbs);
        !           200: 
        !           201:                /* get verb name */
        !           202:                char    szVerb[OLE_MAXNAMESIZE];
        !           203:                lSize = OLE_MAXNAMESIZE;
        !           204:                if (::RegQueryValue(HKEY_CLASSES_ROOT, szBuffer, szVerb, &lSize) != 0)
        !           205:                {
        !           206:                        // finished counting verbs
        !           207:                        break;
        !           208:                }
        !           209:                cVerbs++;
        !           210: 
        !           211:                if (_stricmp(szVerb, strEditVerb) == 0)
        !           212:                        strcpy(szVerb, strEditVerb);    // use 'Edit' not 'EDIT'
        !           213: 
        !           214:                if (cVerbs == 1)
        !           215:                {
        !           216:                        // save first verb (special case if this is it)
        !           217:                        strcpy(szFirstVerb, szVerb);
        !           218:                }
        !           219:                else
        !           220:                {
        !           221:                        // overflow into popup
        !           222:                        if (cVerbs == 2)
        !           223:                        {
        !           224:                                // start the popup
        !           225:                                ASSERT(hPopup == NULL);
        !           226:                                hPopup = CreatePopupMenu();
        !           227: 
        !           228:                                // now add the first verb
        !           229:                                InsertMenu(hPopup, -1, MF_BYPOSITION, nIDVerbMin + 0,
        !           230:                                        szFirstVerb);
        !           231:                        }
        !           232: 
        !           233:                        ASSERT(hPopup != NULL);
        !           234:                        InsertMenu(hPopup, -1, MF_BYPOSITION, nIDVerbMin + cVerbs - 1,
        !           235:                                        szVerb);
        !           236:                }
        !           237:        }
        !           238: 
        !           239:        if (cVerbs >= 2)
        !           240:        {
        !           241:                // install the popup
        !           242:                wsprintf(szBuffer, "%s %s", (LPCSTR)szClass, (LPCSTR)strObjectVerb);
        !           243:                pMenu->InsertMenu(iMenuItem, MF_BYPOSITION|MF_POPUP, (UINT)hPopup, szBuffer);
        !           244:        }
        !           245:        else if (cVerbs == 0 || _stricmp(szFirstVerb, strEditVerb) == 0)
        !           246:        {
        !           247:                // no verbs or redundant 'edit' verb
        !           248:                wsprintf(szBuffer, "%s %s", (LPCSTR)szClass, (LPCSTR)strObjectVerb);
        !           249:                pMenu->InsertMenu(iMenuItem, MF_BYPOSITION, nIDVerbMin, szBuffer);
        !           250:        }
        !           251:        else
        !           252:        {
        !           253:                // use that verb in menu item
        !           254:                ASSERT(cVerbs == 1);
        !           255:                wsprintf(szBuffer, "%s %s %s", (LPCSTR)szFirstVerb, (LPCSTR)szClass,
        !           256:                        (LPCSTR)strObjectVerb);
        !           257:                pMenu->InsertMenu(iMenuItem, MF_BYPOSITION, nIDVerbMin, szBuffer);
        !           258:        }
        !           259: 
        !           260:        // enable what we added
        !           261:        pMenu->EnableMenuItem(iMenuItem, MF_ENABLED|MF_BYPOSITION);
        !           262: }
        !           263: 
        !           264: /////////////////////////////////////////////////////////////////////////////
        !           265: // InsertObject dialog
        !           266: 
        !           267: class CInsertNewObjectDlg : public CModalDialog
        !           268: {
        !           269: public:
        !           270:        CString&    m_rClassName;
        !           271: 
        !           272:        CInsertNewObjectDlg(CString& rReturn)
        !           273:                        : CModalDialog(AFX_IDD_INSERTNEWOBJECT),
        !           274:                                m_rClassName(rReturn)
        !           275:                { }
        !           276: 
        !           277:        BOOL OnInitDialog();
        !           278:        void OnOK();
        !           279:        DECLARE_MESSAGE_MAP()
        !           280: };
        !           281: 
        !           282: BEGIN_MESSAGE_MAP(CInsertNewObjectDlg, CModalDialog)
        !           283:        ON_LBN_DBLCLK(AFX_IDC_LISTBOX, OnOK)
        !           284: END_MESSAGE_MAP()
        !           285: 
        !           286: BOOL CInsertNewObjectDlg::OnInitDialog()
        !           287: {
        !           288:        int cClasses = 0;
        !           289:        CListBox* pList = (CListBox*)GetDlgItem(AFX_IDC_LISTBOX);
        !           290: 
        !           291:        pList->ResetContent();
        !           292: 
        !           293:        char szClass[OLE_MAXNAMESIZE];
        !           294:        int i = 0;
        !           295:        while (::RegEnumKey(HKEY_CLASSES_ROOT, i++, szClass, OLE_MAXNAMESIZE) == 0)
        !           296:        {
        !           297:                if (*szClass == '.')
        !           298:                        continue;       // skip extensions
        !           299: 
        !           300:                // See if this class really refers to a server
        !           301:                LONG lSize;
        !           302:                HKEY hkey = NULL;
        !           303:                char szExec[OLE_MAXNAMESIZE+40];
        !           304:                lstrcpy(szExec, szClass);
        !           305:                lstrcat(szExec, "\\protocol\\StdFileEditing\\server");
        !           306: 
        !           307:                if (::RegOpenKey(HKEY_CLASSES_ROOT, szExec, &hkey) == 0)
        !           308:                {
        !           309:                        // since it has a server - add it to the list
        !           310:                        char szName[OLE_MAXNAMESIZE];
        !           311:                        lSize = OLE_MAXNAMESIZE;
        !           312:                        if (::RegQueryValue(HKEY_CLASSES_ROOT, szClass,
        !           313:                          szName, &lSize) == 0)
        !           314:                        {
        !           315:                                // we have a class name
        !           316:                                pList->AddString(szName);
        !           317:                                cClasses++;
        !           318:                        }
        !           319:                        ::RegCloseKey(hkey);
        !           320:                }
        !           321:        }
        !           322: 
        !           323:        if (cClasses == 0)
        !           324:        {
        !           325:                // whoops - nothing to choose from
        !           326:                EndDialog(IDCANCEL);
        !           327:        }
        !           328:        pList->SetCurSel(0);
        !           329:        return TRUE;
        !           330: }
        !           331: 
        !           332: void CInsertNewObjectDlg::OnOK()
        !           333: {
        !           334:        CListBox* pList = (CListBox*)GetDlgItem(AFX_IDC_LISTBOX);
        !           335: 
        !           336:        char szKey[OLE_MAXNAMESIZE];
        !           337:        pList->GetText(pList->GetCurSel(), szKey);
        !           338: 
        !           339:        char szClass[OLE_MAXNAMESIZE];
        !           340:        int i = 0;
        !           341:        while (::RegEnumKey(HKEY_CLASSES_ROOT, i++, szClass, OLE_MAXNAMESIZE) == 0)
        !           342:        {
        !           343:                if (*szClass == '.')
        !           344:                        continue;       // skip extensions
        !           345: 
        !           346:                // See if this class really refers to a server
        !           347:                LONG lSize;
        !           348:                HKEY hkey = NULL;
        !           349:                char szExec[OLE_MAXNAMESIZE+40];
        !           350:                lstrcpy(szExec, szClass);
        !           351:                lstrcat(szExec, "\\protocol\\StdFileEditing\\server");
        !           352: 
        !           353:                if (::RegOpenKey(HKEY_CLASSES_ROOT, szExec, &hkey) == 0)
        !           354:                {
        !           355:                        // we found a match - see if appropriate name
        !           356:                        char szName[OLE_MAXNAMESIZE];
        !           357:                        lSize = OLE_MAXNAMESIZE;
        !           358:                        if (::RegQueryValue(HKEY_CLASSES_ROOT, szClass,
        !           359:                          szName, &lSize) == 0)
        !           360:                        {
        !           361:                                // it is a named class - see if it matches key
        !           362:                                if (strcmp(szKey, szName) == 0)
        !           363:                                {
        !           364:                                        // this is it
        !           365:                                        m_rClassName = szClass;
        !           366:                                        CModalDialog::OnOK();   // terminate dialog
        !           367:                                        return;
        !           368:                                }
        !           369:                        }
        !           370:                        ::RegCloseKey(hkey);
        !           371:                }
        !           372:        }
        !           373: 
        !           374:        // didn't find it
        !           375:        EndDialog(IDCANCEL);
        !           376: }
        !           377: 
        !           378: 
        !           379: BOOL AfxOleInsertDialog(CString& name)
        !           380: {
        !           381:        CInsertNewObjectDlg dlg(name);
        !           382: 
        !           383:        return (dlg.DoModal() == IDOK);
        !           384: }
        !           385: 
        !           386: /////////////////////////////////////////////////////////////////////////////

unix.superglobalmegacorp.com

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