Annotation of mstools/ole20/samples/ole2ui/ole2ui.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * OLE2UI.C
                      3:  *
                      4:  * Contains initialization routines and miscellaneous API implementations for 
                      5:  * the OLE 2.0 User Interface Support Library.
                      6:  *
                      7:  * Copyright (c)1992 Microsoft Corporation, All Right Reserved
                      8:  */
                      9: 
                     10: #define STRICT  1
                     11: 
                     12: #include "ole2ui.h"
                     13: #include "common.h"
                     14: #include "utility.h"
                     15: #include "resimage.h"
                     16: #include "iconbox.h"
                     17: #include <commdlg.h>
                     18: 
                     19: #define WINDLL  1           // make far pointer version of stdargs.h
                     20: #include <stdarg.h>
                     21: 
                     22: 
                     23: OLEDBGDATA_MAIN("OLE2UI")
                     24: 
                     25: //The DLL instance handle shared amongst all dialogs.
                     26: HINSTANCE     ghInst;
                     27: 
                     28: //Registered messages for use with all the dialogs, registered in LibMain
                     29: UINT        uMsgHelp=0;
                     30: UINT        uMsgEndDialog=0;
                     31: UINT        uMsgBrowse=0;
                     32: UINT        uMsgChangeIcon=0;
                     33: UINT        uMsgFileOKString=0;
                     34: UINT        uMsgCloseBusyDlg=0;
                     35: 
                     36: //Clipboard formats used by PasteSpecial
                     37: UINT  cfObjectDescriptor;
                     38: UINT  cfLinkSrcDescriptor;
                     39: UINT  cfEmbedSource;
                     40: UINT  cfEmbeddedObject;
                     41: UINT  cfLinkSource;
                     42: UINT  cfOwnerLink;
                     43: UINT  cfFileName;
                     44: 
                     45: // local function prototypes
                     46: BOOL CALLBACK EXPORT PromptUserDlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam);
                     47: BOOL CALLBACK EXPORT UpdateLinksDlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam);
                     48: 
                     49: 
                     50: // local definition
                     51: #define WM_U_UPDATELINK WM_USER
                     52: 
                     53: 
                     54: // local structure definition
                     55: typedef struct tagUPDATELINKS 
                     56: {
                     57:     LPOLEUILINKCONTAINER    lpOleUILinkCntr;    // pointer to Link Container
                     58:     UINT                    cLinks;             // total number of links
                     59:     UINT                    cUpdated;           // number of links updated
                     60:     DWORD                   dwLink;             // pointer to link
                     61:     BOOL                    fError;             // error flag
                     62:     LPSTR                   lpszTitle;          // title of the dialog box
                     63: } UPDATELINKS, *PUPDATELINKS, FAR *LPUPDATELINKS;
                     64: 
                     65: 
                     66: 
                     67: STDAPI_(BOOL) OleUIInitialize(HINSTANCE hInstance)
                     68: {
                     69:     HRSRC   hr;
                     70:     HGLOBAL hg;
                     71:     LPWORD lpdata;
                     72: 
                     73:     OleDbgOut1("OleUIInitialize called.\r\n");
                     74:     ghInst=hInstance;
                     75: 
                     76:     // Verify that we have the correct resources added to our application.
                     77:     if ((hr = FindResource(hInstance, "VERIFICATION", RT_RCDATA)) == NULL)
                     78:         goto ResourceLoadError;
                     79: 
                     80:     if ((hg = LoadResource(hInstance, hr)) == NULL)
                     81:         goto ResourceLoadError;
                     82: 
                     83:     if ((lpdata = (LPWORD)LockResource(hg)) == NULL)
                     84:         goto ResourceLockError;
                     85: 
                     86:     if ((WORD)*lpdata != (WORD)OLEUI_VERSION_MAGIC)
                     87:         goto ResourceReadError;
                     88: 
                     89:     // OK, resource versions match.  Contine on.
                     90:     UnlockResource(hg);
                     91:     FreeResource(hg);
                     92:     OleDbgOut1("OleUIInitialize: Resource magic number verified.\r\n");
                     93: 
                     94:     // Register messages we need for the dialogs.  If
                     95:     uMsgHelp      =RegisterWindowMessage(SZOLEUI_MSG_HELP);
                     96:     uMsgEndDialog =RegisterWindowMessage(SZOLEUI_MSG_ENDDIALOG);
                     97:     uMsgBrowse    =RegisterWindowMessage(SZOLEUI_MSG_BROWSE);
                     98:     uMsgChangeIcon=RegisterWindowMessage(SZOLEUI_MSG_CHANGEICON);
                     99:     uMsgFileOKString = RegisterWindowMessage(FILEOKSTRING);   
                    100:     uMsgCloseBusyDlg = RegisterWindowMessage(SZOLEUI_MSG_CLOSEBUSYDIALOG);
                    101: 
                    102:     // Register Clipboard Formats used by PasteSpecial dialog.
                    103:     cfObjectDescriptor = RegisterClipboardFormat(CF_OBJECTDESCRIPTOR);
                    104:     cfLinkSrcDescriptor= RegisterClipboardFormat(CF_LINKSRCDESCRIPTOR);
                    105:     cfEmbedSource      = RegisterClipboardFormat(CF_EMBEDSOURCE);
                    106:     cfEmbeddedObject   = RegisterClipboardFormat(CF_EMBEDDEDOBJECT);
                    107:     cfLinkSource       = RegisterClipboardFormat(CF_LINKSOURCE);
                    108:     cfOwnerLink        = RegisterClipboardFormat(CF_OWNERLINK);
                    109:     cfFileName         = RegisterClipboardFormat(CF_FILENAME);
                    110: 
                    111: 
                    112:     if (!FResultImageInitialize(hInstance))
                    113:         {
                    114:         OleDbgOut1("OleUIInitialize: FResultImageInitialize failed. Terminating.\r\n");
                    115:         return 0;
                    116:         }
                    117: 
                    118:     if (!FIconBoxInitialize(hInstance))
                    119:         {
                    120:         OleDbgOut1("OleUIInitialize: FIconBoxInitialize failed. Terminating.\r\n");
                    121:         return 0;
                    122:         }
                    123: 
                    124:     return TRUE;
                    125: 
                    126: ResourceLoadError:
                    127:     OleDbgOut1("OleUIInitialize: ERROR - Unable to find version verification resource.\r\n");
                    128:     return FALSE;
                    129: 
                    130: ResourceLockError:
                    131:     OleDbgOut1("OleUIInitialize: ERROR - Unable to lock version verification resource.\r\n");
                    132:     FreeResource(hg);
                    133:     return FALSE;
                    134: 
                    135: ResourceReadError:
                    136:     OleDbgOut1("OleUIInitialize: ERROR - Version verification values did not compare.\r\n");
                    137: 
                    138:     {char buf[255];
                    139:     wsprintf(buf, "resource read 0x%X, my value is 0x%X\n", (WORD)*lpdata, (WORD)OLEUI_VERSION_MAGIC);
                    140:     OutputDebugString(buf);
                    141:     }
                    142: 
                    143:     UnlockResource(hg);
                    144:     FreeResource(hg);
                    145:     return FALSE;
                    146: }
                    147: 
                    148: 
                    149: STDAPI_(BOOL) OleUIUnInitialize()
                    150: {
                    151:     IconBoxUninitialize();
                    152:     ResultImageUninitialize();
                    153: 
                    154:     return TRUE;
                    155: }
                    156: 
                    157: 
                    158: 
                    159: /*
                    160:  * OleUIAddVerbMenu
                    161:  *
                    162:  * Purpose:
                    163:  *  Add the Verb menu for the specified object to the given menu.  If the
                    164:  *  object has one verb, we directly add the verb to the given menu.  If
                    165:  *  the object has multiple verbs we create a cascading sub-menu.
                    166:  *
                    167:  * Parameters:
                    168:  *  lpObj           LPOLEOBJECT pointing to the selected object.  If this
                    169:  *                  is NULL, then we create a default disabled menu item.
                    170:  *  
                    171:  *  lpszShortType   LPSTR with short type name (AuxName==2) corresponding
                    172:  *                  to the lpOleObj. if the string is NOT known, then NULL
                    173:  *                  may be passed. if NULL is passed, then 
                    174:  *                  IOleObject::GetUserType will be called to retrieve it.
                    175:  *                  if the caller has the string handy, then it is faster 
                    176:  *                  to pass it in.
                    177:  *
                    178:  *  hMenu           HMENU in which to make modifications.
                    179:  *
                    180:  *  uPos            Position of the menu item
                    181:  *
                    182:  *  idVerbMin       UINT ID value at which to start the verbs.
                    183:  *                      verb_0 = wIDMVerbMin + verb_0
                    184:  *                      verb_1 = wIDMVerbMin + verb_1
                    185:  *                      verb_2 = wIDMVerbMin + verb_2
                    186:  *                      etc.
                    187:  *
                    188:  *  bAddConvert     BOOL specifying whether or not to add a "Convert" item
                    189:  *                  to the bottom of the menu (with a separator).
                    190:  *
                    191:  *  idConvert       UINT ID value to use for the Convert menu item, if
                    192:  *                  bAddConvert is TRUE.
                    193:  *
                    194:  *  lphMenu         HMENU FAR * of the cascading verb menu if it's created.
                    195:  *                  If there is only one verb, this will be filled with NULL.
                    196:  *
                    197:  *
                    198:  * Return Value:
                    199:  *  BOOL            TRUE if lpObj was valid and we added at least one verb
                    200:  *                  to the menu.  FALSE if lpObj was NULL and we created
                    201:  *                  a disabled default menu item
                    202:  */
                    203: 
                    204: STDAPI_(BOOL) OleUIAddVerbMenu(LPOLEOBJECT lpOleObj,
                    205:                              LPSTR lpszShortType,
                    206:                              HMENU hMenu,
                    207:                              UINT uPos,
                    208:                              UINT uIDVerbMin,
                    209:                              BOOL bAddConvert,
                    210:                              UINT idConvert,
                    211:                              HMENU FAR *lphMenu)
                    212: {
                    213:     LPPERSISTSTORAGE    lpPS=NULL;
                    214:     LPENUMOLEVERB       lpEnumOleVerb = NULL;
                    215:     OLEVERB             oleverb;
                    216:     LPUNKNOWN           lpUnk;
                    217:     LPSTR               lpszShortTypeName = lpszShortType;
                    218:     LPSTR               lpszVerbName = NULL;
                    219:     HRESULT             hrErr;
                    220:     BOOL                fStatus;
                    221:     BOOL                fIsLink = FALSE;
                    222:     BOOL                fResult = FALSE;
                    223:     BOOL                fAddConvertItem = FALSE;
                    224:     LONG                lNextVerbExpected;
                    225:     int                 cVerbs = 0;
                    226:     UINT                uFlags = MF_BYPOSITION;
                    227:     static BOOL         fFirstTime = TRUE;
                    228:     static char         szBuffer[OLEUI_OBJECTMENUMAX];
                    229:     static char         szNoObjectCmd[OLEUI_OBJECTMENUMAX];
                    230:     static char         szObjectCmd1Verb[OLEUI_OBJECTMENUMAX];
                    231:     static char         szLinkCmd1Verb[OLEUI_OBJECTMENUMAX];
                    232:     static char         szObjectCmdNVerb[OLEUI_OBJECTMENUMAX];
                    233:     static char         szLinkCmdNVerb[OLEUI_OBJECTMENUMAX];
                    234:     static char         szUnknown[OLEUI_OBJECTMENUMAX];
                    235:     static char         szEdit[OLEUI_OBJECTMENUMAX];
                    236:     static char         szConvert[OLEUI_OBJECTMENUMAX];
                    237: 
                    238:     *lphMenu=NULL;
                    239: 
                    240:     // Set fAddConvertItem flag
                    241:     if (bAddConvert & (idConvert != 0))
                    242:        fAddConvertItem = TRUE;
                    243: 
                    244:     // only need to load the strings the 1st time
                    245:     if (fFirstTime) {
                    246:         if (0 == LoadString(ghInst, IDS_OLE2UIEDITNOOBJCMD, 
                    247:                  (LPSTR)szNoObjectCmd, OLEUI_OBJECTMENUMAX)) 
                    248:             return FALSE;
                    249:         if (0 == LoadString(ghInst, IDS_OLE2UIEDITLINKCMD_1VERB, 
                    250:                  (LPSTR)szLinkCmd1Verb, OLEUI_OBJECTMENUMAX))
                    251:             return FALSE;
                    252:         if (0 == LoadString(ghInst, IDS_OLE2UIEDITOBJECTCMD_1VERB, 
                    253:                  (LPSTR)szObjectCmd1Verb, OLEUI_OBJECTMENUMAX))
                    254:             return FALSE;
                    255: 
                    256:         if (0 == LoadString(ghInst, IDS_OLE2UIEDITLINKCMD_NVERB, 
                    257:                  (LPSTR)szLinkCmdNVerb, OLEUI_OBJECTMENUMAX))
                    258:             return FALSE;
                    259:         if (0 == LoadString(ghInst, IDS_OLE2UIEDITOBJECTCMD_NVERB, 
                    260:                  (LPSTR)szObjectCmdNVerb, OLEUI_OBJECTMENUMAX))
                    261:             return FALSE;
                    262: 
                    263:         if (0 == LoadString(ghInst, IDS_OLE2UIUNKNOWN, 
                    264:                  (LPSTR)szUnknown, OLEUI_OBJECTMENUMAX))
                    265:             return FALSE;
                    266: 
                    267:         if (0 == LoadString(ghInst, IDS_OLE2UIEDIT, 
                    268:                  (LPSTR)szEdit, OLEUI_OBJECTMENUMAX))
                    269:             return FALSE;
                    270: 
                    271:         if ( (0 == LoadString(ghInst, IDS_OLE2UICONVERT, 
                    272:                    (LPSTR)szConvert, OLEUI_OBJECTMENUMAX)) && fAddConvertItem)
                    273:             return FALSE;
                    274:         
                    275:     }
                    276: 
                    277:     // Delete whatever menu may happen to be here already.
                    278:     DeleteMenu(hMenu, uPos, uFlags);
                    279: 
                    280:     if (!lpOleObj)
                    281:         goto AVMError;
                    282: 
                    283:     if (! lpszShortTypeName) {
                    284:         // get the Short form of the user type name for the menu
                    285:         OLEDBG_BEGIN2("IOleObject::GetUserType called\r\n")
                    286:         hrErr = lpOleObj->lpVtbl->GetUserType(
                    287:                 lpOleObj,
                    288:                 USERCLASSTYPE_SHORT,
                    289:                 (LPSTR FAR*)&lpszShortTypeName
                    290:         );
                    291:         OLEDBG_END2
                    292: 
                    293:         if (NOERROR != hrErr) {
                    294:             OleDbgOutHResult("IOleObject::GetUserType returned", hrErr);
                    295:         }
                    296:     }
                    297: 
                    298:     // check if the object is a link (it is a link if it support IOleLink)
                    299:     hrErr = lpOleObj->lpVtbl->QueryInterface(
                    300:             lpOleObj,
                    301:             &IID_IOleLink,
                    302:             (LPVOID FAR*)&lpUnk
                    303:     );
                    304:     if (NOERROR == hrErr) {
                    305:         fIsLink = TRUE;
                    306:         OleStdRelease(lpUnk);
                    307:     }
                    308: 
                    309:     // Get the verb enumerator from the OLE object
                    310:     OLEDBG_BEGIN2("IOleObject::EnumVerbs called\r\n")
                    311:     hrErr = lpOleObj->lpVtbl->EnumVerbs(
                    312:             lpOleObj,
                    313:             (LPENUMOLEVERB FAR*)&lpEnumOleVerb
                    314:     );
                    315:     OLEDBG_END2
                    316: 
                    317:     if (NOERROR != hrErr) {
                    318:         OleDbgOutHResult("IOleObject::EnumVerbs returned", hrErr);
                    319:     }
                    320: 
                    321:     if (!(*lphMenu = CreatePopupMenu()))
                    322:         goto AVMError;
                    323:     
                    324:     lNextVerbExpected = 0;  // we expect verbs to start at 0
                    325: 
                    326:     // loop through all verbs
                    327:     while (lpEnumOleVerb != NULL) {         // forever
                    328:         hrErr = lpEnumOleVerb->lpVtbl->Next(
                    329:                 lpEnumOleVerb,
                    330:                 1,
                    331:                 (LPOLEVERB)&oleverb,
                    332:                 NULL
                    333:         );
                    334:         if (NOERROR != hrErr)
                    335:             break;              // DONE! no more verbs
                    336: 
                    337:         /* OLE2NOTE: negative verb numbers and verbs that do not
                    338:         **    indicate ONCONTAINERMENU should NOT be put on the verb menu
                    339:         */
                    340:         if (oleverb.lVerb < 0 || 
                    341:                 ! (oleverb.grfAttribs & OLEVERBATTRIB_ONCONTAINERMENU)) {
                    342: 
                    343:             /* OLE2NOTE: we must still free the verb name string */
                    344:             if (oleverb.lpszVerbName)
                    345:                 OleStdFreeString(oleverb.lpszVerbName, NULL);
                    346:             continue;           
                    347:         }
                    348: 
                    349: #if defined( OBSOLETE )
                    350:         /* OLE2NOTE: we only support consecutively numbered verbs
                    351:         **    starting with verb 0. we will stop adding verbs to the
                    352:         **    menu when the first gap in the verb numbers is
                    353:         **    encountered. 
                    354:         */
                    355:         if (oleverb.lVerb != lNextVerbExpected)
                    356:             break;              // STOP -- gap in verb numbers encountered
                    357: 
                    358:         lNextVerbExpected++;    // next verb should be consecutive
                    359: #endif
                    360: 
                    361:         // we must free the previous verb name string
                    362:         if (lpszVerbName)
                    363:             OleStdFreeString(lpszVerbName, NULL);
                    364: 
                    365:         lpszVerbName = oleverb.lpszVerbName;
                    366: 
                    367:         fStatus = InsertMenu(
                    368:                 *lphMenu,
                    369:                 (UINT)-1,
                    370:                 MF_BYPOSITION | (UINT)oleverb.fuFlags,
                    371:                 uIDVerbMin+(UINT)oleverb.lVerb,
                    372:                 (LPSTR)lpszVerbName
                    373:         );
                    374:         if (! fStatus)
                    375:             goto AVMError;
                    376: 
                    377:         cVerbs++;
                    378:     }
                    379: 
                    380: 
                    381:    // Add the separator and "Convert" menu item.  Also add "Edit" item
                    382:    // if cVerbs = 0 so that we can just fall into the switch statement
                    383:    // below without any more Convert-specific code.
                    384: 
                    385:     if (fAddConvertItem) {
                    386:        
                    387: #if defined( OBSOLETE )
                    388:         if (0 == cVerbs) {
                    389:             fStatus = InsertMenu(*lphMenu,
                    390:                                (UINT)-1,
                    391:                                MF_BYPOSITION,
                    392:                                uIDVerbMin,
                    393:                                (LPCSTR)szEdit);
                    394:             if (! fStatus)
                    395:                 goto AVMError;
                    396: 
                    397:             cVerbs++;
                    398:         }
                    399: #endif
                    400: 
                    401:         if (cVerbs > 0) {
                    402:             fStatus = InsertMenu(*lphMenu,
                    403:                         (UINT)-1,
                    404:                         MF_BYPOSITION | MF_SEPARATOR,
                    405:                         (UINT)0,
                    406:                         (LPCSTR)NULL);
                    407:             if (! fStatus)
                    408:                 goto AVMError;
                    409:         }
                    410: 
                    411:         /* add convert menu */
                    412:         fStatus = InsertMenu(*lphMenu,
                    413:                     (UINT)-1,
                    414:                     MF_BYPOSITION,
                    415:                     idConvert,
                    416:                     (LPCSTR)szConvert);
                    417:         if (! fStatus)
                    418:             goto AVMError;
                    419: 
                    420:         cVerbs++;
                    421:     }
                    422: 
                    423: 
                    424:     /*
                    425:      * Build the appropriate menu based on the number of verbs found
                    426:      *
                    427:      * NOTE:  Localized verb menus may require a different format.
                    428:      *        to assist in localization of the single verb case, the
                    429:      *        szLinkCmd1Verb and szObjectCmd1Verb format strings start
                    430:      *        with either a '0' (note: NOT '\0'!) or a '1':
                    431:      *           leading '0' -- verb type
                    432:      *           leading '1' -- type verb
                    433:      */
                    434: 
                    435:     if (cVerbs == 0) {
                    436:         
                    437:         //No verbs.  Create a default using Edit as the verb.
                    438:         LPSTR       lpsz = (fIsLink ? szLinkCmd1Verb : szObjectCmd1Verb);
                    439: 
                    440:         if (*lpsz == '0') {
                    441:             wsprintf(szBuffer, lpsz+1, (LPSTR)szEdit,
                    442:                 (lpszShortTypeName ? lpszShortTypeName : (LPSTR)"")
                    443:             );
                    444:         }
                    445:         else {
                    446:             wsprintf(szBuffer, lpsz+1,
                    447:                 (lpszShortTypeName ? lpszShortTypeName : (LPSTR)""), 
                    448:                 (LPSTR)szEdit
                    449:             );
                    450:         }
                    451:         
                    452:         DestroyMenu(*lphMenu);
                    453:         *lphMenu = NULL;
                    454:     
                    455:     }
                    456:     else if ((cVerbs == 1) && !fAddConvertItem) {
                    457:         //One verb without Convert, one item.
                    458:         LPSTR       lpsz = (fIsLink ? szLinkCmd1Verb : szObjectCmd1Verb);
                    459: 
                    460:         if (*lpsz == '0') {
                    461:             wsprintf(szBuffer, lpsz+1, lpszVerbName,
                    462:                 (lpszShortTypeName ? lpszShortTypeName : (LPSTR)"")
                    463:             );
                    464:         }
                    465:         else {
                    466:             wsprintf(szBuffer, lpsz+1,
                    467:                 (lpszShortTypeName ? lpszShortTypeName : (LPSTR)""), 
                    468:                 lpszVerbName
                    469:             );
                    470:         }
                    471:         DestroyMenu(*lphMenu);
                    472:         *lphMenu=NULL;
                    473:     }
                    474:     else {
                    475: 
                    476:         //Multiple verbs or one verb with Convert, add the cascading menu
                    477:         wsprintf(
                    478:             szBuffer,
                    479:             (fIsLink ? (LPSTR)szLinkCmdNVerb:(LPSTR)szObjectCmdNVerb),
                    480:             (lpszShortTypeName ? lpszShortTypeName : (LPSTR)"")
                    481:         );
                    482:         uFlags |= MF_ENABLED | MF_POPUP;
                    483:         uIDVerbMin=(UINT)*lphMenu;
                    484:     }
                    485: 
                    486:     if (!InsertMenu(hMenu, uPos, uFlags, uIDVerbMin, szBuffer))
                    487: 
                    488: AVMError:
                    489:         {
                    490:             HMENU hmenuDummy = CreatePopupMenu();
                    491: 
                    492:             InsertMenu(hMenu, uPos, MF_GRAYED | MF_POPUP | uFlags,
                    493:                     (UINT)hmenuDummy, (LPSTR)szNoObjectCmd);
                    494:             fResult = FALSE;
                    495:             goto done;
                    496:         }
                    497: 
                    498:     fResult = TRUE;
                    499: 
                    500: done:
                    501:     if (lpszVerbName)
                    502:         OleStdFreeString(lpszVerbName, NULL);
                    503:     if (!lpszShortType && lpszShortTypeName)
                    504:         OleStdFreeString(lpszShortTypeName, NULL);
                    505:     if (lpEnumOleVerb)
                    506:         OleStdVerifyRelease(
                    507:                 (LPUNKNOWN)lpEnumOleVerb, "IEnumOleVerb NOT released\r\n");
                    508:     return fResult;
                    509: }
                    510: 
                    511: 
                    512: /* PromptUserDlgProc
                    513:  * -----------------
                    514:  *
                    515:  *  Purpose:
                    516:  *      Dialog procedure used by OleUIPromptUser(). Returns when a button is 
                    517:  *      clicked in the dialog box and the button id is return.
                    518:  *
                    519:  *  Parameters:
                    520:  *      hDlg
                    521:  *      iMsg
                    522:  *      wParam
                    523:  *      lParam
                    524:  *
                    525:  *  Returns:
                    526:  *
                    527:  */
                    528: BOOL CALLBACK EXPORT PromptUserDlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)
                    529: {
                    530:     switch (iMsg) {
                    531:         case WM_INITDIALOG:
                    532:         {
                    533:             LPSTR lpszTitle;
                    534:             char szBuf[256];
                    535:             char szFormat[256];
                    536:             va_list argptr;
                    537:             
                    538:             argptr = (va_list)lParam;
                    539:             if (!lParam) {
                    540:                 EndDialog(hDlg, -1);
                    541:                 return FALSE;
                    542:             }
                    543:             
                    544:             lpszTitle = va_arg(argptr, LPSTR);
                    545:             SetWindowText(hDlg, lpszTitle);
                    546: 
                    547:             GetDlgItemText(hDlg, ID_PU_TEXT, (LPSTR)szFormat, 256);
                    548:             wvsprintf((LPSTR)szBuf, (LPSTR)szFormat, argptr);
                    549:             SetDlgItemText(hDlg, ID_PU_TEXT, (LPSTR)szBuf);
                    550:             return TRUE;
                    551:         }
                    552:         case WM_COMMAND:
                    553:             EndDialog(hDlg, wParam);
                    554:             return TRUE;
                    555:             
                    556:         default:
                    557:             return FALSE;
                    558:     }
                    559: }
                    560: 
                    561: 
                    562: /* OleUIPromptUser
                    563:  * ---------------
                    564:  *
                    565:  *  Purpose:
                    566:  *      Popup a dialog box with the specified template and returned the
                    567:  *      response (button id) from the user.
                    568:  *
                    569:  *  Parameters:
                    570:  *      nTemplate       resource number of the dialog
                    571:  *      hwndParent      parent of the dialog box
                    572:  *      ...             title of the dialog box followed by argument list
                    573:  *                      for the format string in the static control 
                    574:  *                      (ID_PU_TEXT) of the dialog box.
                    575:  *                      The caller has to make sure that the correct number
                    576:  *                      and type of argument are passed in.
                    577:  *
                    578:  *  Returns:
                    579:  *      button id selected by the user (template dependent)
                    580:  */
                    581: int EXPORT FAR CDECL OleUIPromptUser(int nTemplate, HWND hwndParent, ...)
                    582: {
                    583:     int         nRet;
                    584:     
                    585:     va_list     argptr;
                    586:     
                    587:     va_start(argptr, hwndParent);
                    588:     nRet = DialogBoxParam(ghInst, MAKEINTRESOURCE(nTemplate), hwndParent, 
                    589:             PromptUserDlgProc, (LPARAM)argptr);
                    590:     
                    591:     va_end(argptr);
                    592:     return nRet;
                    593: }
                    594: 
                    595: 
                    596: 
                    597: /* UpdateLinksDlgProc
                    598:  * ------------------
                    599:  *
                    600:  *  Purpose:
                    601:  *      Dialog procedure used by OleUIUpdateLinks(). It will enumerate all
                    602:  *      all links in the container and updates all automatic links. 
                    603:  *      Returns when the Stop Button is clicked in the dialog box or when all
                    604:  *      links are updated
                    605:  *
                    606:  *  Parameters:
                    607:  *      hDlg
                    608:  *      iMsg
                    609:  *      wParam
                    610:  *      lParam          pointer to the UPDATELINKS structure
                    611:  *
                    612:  *  Returns:
                    613:  *
                    614:  */
                    615: BOOL CALLBACK EXPORT UpdateLinksDlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam)
                    616: {
                    617:     LPUPDATELINKS   lpUL;
                    618:     
                    619:     switch (iMsg) {
                    620:         case WM_INITDIALOG:
                    621:             lpUL = (LPUPDATELINKS)lParam;                       
                    622:             SetWindowText(hDlg, lpUL->lpszTitle);
                    623:             PostMessage(hDlg, WM_U_UPDATELINK, 0, lParam);
                    624:             return TRUE;
                    625:     
                    626:         case WM_COMMAND:    // Stop button 
                    627:             EndDialog(hDlg, 0);
                    628:             return TRUE;
                    629:             
                    630:         case WM_U_UPDATELINK:
                    631:         {
                    632:             HRESULT         hErr;
                    633:             int             nPercent;
                    634:             RECT            rc;
                    635:             char            szPercent[5];       // 0% to 100%
                    636:             HBRUSH          hbr;
                    637:             HDC             hDC;
                    638:             HWND            hwndMeter;
                    639:             MSG             msg;
                    640:             DWORD           dwUpdateOpt;
                    641: 
                    642:             lpUL = (LPUPDATELINKS)lParam;
                    643:             lpUL->dwLink = lpUL->lpOleUILinkCntr->lpVtbl->GetNextLink(
                    644:                     lpUL->lpOleUILinkCntr,
                    645:                     lpUL->dwLink
                    646:             );
                    647:             
                    648:             if (!lpUL->dwLink) {        // all links processed
                    649:                 EndDialog(hDlg, 0);
                    650:                 return TRUE;
                    651:             }
                    652:             
                    653:             hErr = lpUL->lpOleUILinkCntr->lpVtbl->GetLinkUpdateOptions(
                    654:                     lpUL->lpOleUILinkCntr,
                    655:                     lpUL->dwLink,
                    656:                     (LPDWORD)&dwUpdateOpt
                    657:             );
                    658:         
                    659:             if ((hErr == NOERROR) && (dwUpdateOpt == OLEUPDATE_ALWAYS)) {
                    660: 
                    661:                 hErr = lpUL->lpOleUILinkCntr->lpVtbl->UpdateLink(
                    662:                         lpUL->lpOleUILinkCntr,
                    663:                         lpUL->dwLink,
                    664:                         FALSE,      // fMessage
                    665:                         FALSE       // ignored
                    666:                 );
                    667:                 lpUL->fError |= (hErr != NOERROR);
                    668:                 lpUL->cUpdated++;
                    669: 
                    670:                 // update percentage
                    671:                 nPercent = lpUL->cUpdated * 100 / lpUL->cLinks;
                    672:                 wsprintf((LPSTR)szPercent, "%d%%", nPercent);
                    673:                 SetDlgItemText(hDlg, ID_PU_PERCENT, (LPSTR)szPercent);
                    674: 
                    675:                 // update indicator
                    676:                 hwndMeter = GetDlgItem(hDlg, ID_PU_METER);
                    677:                 GetClientRect(hwndMeter, (LPRECT)&rc);
                    678:                 rc.right = (rc.right - rc.left) * nPercent / 100 + rc.left;
                    679:                 hbr = CreateSolidBrush(GetSysColor(COLOR_HIGHLIGHT));
                    680:                 if (hbr) {
                    681:                     hDC = GetDC(hwndMeter);
                    682:                     if (hDC) {
                    683:                         FillRect(hDC, (LPRECT)&rc, hbr);
                    684:                         ReleaseDC(hwndMeter, hDC);
                    685:                     }
                    686:                     DeleteObject(hbr);
                    687:                 }
                    688:             }
                    689:             while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
                    690:                 TranslateMessage(&msg);
                    691:                 DispatchMessage(&msg);
                    692:             }
                    693:             
                    694:             PostMessage(hDlg, WM_U_UPDATELINK, 0, lParam);
                    695:             return TRUE;
                    696:         }
                    697:         
                    698:         default:
                    699:             return FALSE;
                    700:     }
                    701: }
                    702: 
                    703: 
                    704: /* OleUIUpdateLink
                    705:  * ---------------
                    706:  *
                    707:  *  Purpose:
                    708:  *      Update all links in the Link Container and popup a dialog box which
                    709:  *      shows the progress of the updating.
                    710:  *      The process is stopped when the user press Stop button or when all
                    711:  *      links are processed.
                    712:  *
                    713:  *  Parameters:
                    714:  *      lpOleUILinkCntr         pointer to Link Container
                    715:  *      hwndParent              parent window of the dialog
                    716:  *      lpszTitle               title of the dialog box
                    717:  *      cLinks                  total number of links
                    718:  *
                    719:  *  Returns:
                    720:  *      TRUE                    all links updated successfully
                    721:  *      FALSE                   otherwise
                    722:  */
                    723: STDAPI_(BOOL) OleUIUpdateLinks(LPOLEUILINKCONTAINER lpOleUILinkCntr, HWND hwndParent, LPSTR lpszTitle, int cLinks)
                    724: {
                    725:     LPUPDATELINKS lpUL = (LPUPDATELINKS)OleStdMalloc(sizeof(UPDATELINKS));
                    726:     BOOL          fError;
                    727: 
                    728:     OleDbgAssert(lpOleUILinkCntr && hwndParent && lpszTitle && (cLinks>0));
                    729:     OleDbgAssert(lpUL);
                    730:     
                    731:     lpUL->lpOleUILinkCntr = lpOleUILinkCntr;
                    732:     lpUL->cLinks           = cLinks;
                    733:     lpUL->cUpdated         = 0;
                    734:     lpUL->dwLink           = 0;
                    735:     lpUL->fError           = FALSE;
                    736:     lpUL->lpszTitle    = lpszTitle;
                    737: 
                    738:     DialogBoxParam(ghInst, MAKEINTRESOURCE(IDD_UPDATELINKS), 
                    739:             hwndParent, UpdateLinksDlgProc, (LPARAM)lpUL);
                    740: 
                    741:     fError = lpUL->fError;
                    742:     OleStdFree((LPVOID)lpUL);
                    743:     
                    744:     return !fError;
                    745: }

unix.superglobalmegacorp.com

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