Annotation of mstools/ole20/samples/outline/outlntbl.c, revision 1.1.1.1

1.1       root        1: /*************************************************************************
                      2: ** 
                      3: **    OLE 2 Sample Code
                      4: **    
                      5: **    outlntbl.c
                      6: **    
                      7: **    This file contains OutlineNameTable functions.
                      8: **    
                      9: **    (c) Copyright Microsoft Corp. 1992 - 1993 All Rights Reserved
                     10: **
                     11: *************************************************************************/
                     12: 
                     13: 
                     14: #include "outline.h"
                     15: 
                     16: OLEDBGDATA
                     17: 
                     18: extern LPOUTLINEAPP g_lpApp;
                     19: 
                     20: char ErrMsgNameTable[] = "Can't create NameTable!";
                     21: 
                     22: 
                     23: /* OutlineNameTable_Init
                     24:  * ---------------------
                     25:  *
                     26:  *      initialize a name table.
                     27:  */
                     28: BOOL OutlineNameTable_Init(LPOUTLINENAMETABLE lpOutlineNameTable, LPOUTLINEDOC lpOutlineDoc)
                     29: {
                     30:     HWND lpParent = OutlineDoc_GetWindow(lpOutlineDoc);
                     31: 
                     32:     lpOutlineNameTable->m_nCount = 0;
                     33: 
                     34:     /* We will use an OwnerDraw listbox as our data structure to
                     35:     **    maintain the table of Names. this listbox will never be made
                     36:     **    visible. the listbox is just a convenient data structure to
                     37:     **    manage a collection.
                     38:     */
                     39:     lpOutlineNameTable->m_hWndListBox = CreateWindow(
                     40:                     "listbox",              /* Window class name           */
                     41:                     NULL,                   /* Window's title              */
                     42:                     WS_CHILDWINDOW |
                     43:                     LBS_OWNERDRAWFIXED,
                     44:                     0, 0,                   /* Use default X, Y            */
                     45:                     0, 0,                   /* Use default X, Y            */
                     46:                     lpParent,               /* Parent window's handle      */
                     47:                     (HMENU)IDC_NAMETABLE,   /* Child Window ID             */
                     48:                     g_lpApp->m_hInst,       /* Instance of window          */
                     49:                     NULL);                  /* Create struct for WM_CREATE */
                     50: 
                     51:     if (! lpOutlineNameTable->m_hWndListBox) {
                     52:         OutlineApp_ErrorMessage(g_lpApp, ErrMsgNameTable);
                     53:         return FALSE;
                     54:     }
                     55: 
                     56:     return TRUE;
                     57: }
                     58: 
                     59: 
                     60: /* OutlineNameTable_Destroy
                     61:  * ------------------------
                     62:  *
                     63:  *      Free memory used by the name table.
                     64:  */
                     65: void OutlineNameTable_Destroy(LPOUTLINENAMETABLE lpOutlineNameTable)
                     66: {
                     67:     // Delete all names
                     68:     OutlineNameTable_ClearAll(lpOutlineNameTable);
                     69: 
                     70:     DestroyWindow(lpOutlineNameTable->m_hWndListBox);
                     71:     Delete(lpOutlineNameTable);
                     72: }
                     73: 
                     74: 
                     75: /* OutlineNameTable_AddName
                     76:  * ------------------------
                     77:  *
                     78:  *      Add a name to the table
                     79:  */
                     80: void OutlineNameTable_AddName(LPOUTLINENAMETABLE lpOutlineNameTable, LPOUTLINENAME lpOutlineName)
                     81: {
                     82:     SendMessage(
                     83:             lpOutlineNameTable->m_hWndListBox,
                     84:             LB_ADDSTRING,
                     85:             0,
                     86:             (DWORD)lpOutlineName
                     87:     );
                     88:     lpOutlineNameTable->m_nCount++;
                     89: }
                     90: 
                     91: 
                     92: /* OutlineNameTable_DeleteName
                     93:  * ---------------------------
                     94:  *
                     95:  *      Delete a name from table
                     96:  */
                     97: void OutlineNameTable_DeleteName(LPOUTLINENAMETABLE lpOutlineNameTable,int nIndex)
                     98: {
                     99:     LPOUTLINENAME lpOutlineName = OutlineNameTable_GetName(lpOutlineNameTable, nIndex);
                    100: 
                    101: #if defined( OLE_SERVER )
                    102:     /* OLE2NOTE: if there is a pseudo object attached to this name, it
                    103:     **    must first be closed before deleting the Name. this will
                    104:     **    cause OnClose notification to be sent to all linking clients.
                    105:     */
                    106:     ServerName_ClosePseudoObj((LPSERVERNAME)lpOutlineName);
                    107: #endif
                    108: 
                    109:     if (lpOutlineName) 
                    110:         Delete(lpOutlineName);      // free memory for name     
                    111: 
                    112:     SendMessage(
                    113:             lpOutlineNameTable->m_hWndListBox, 
                    114:             LB_DELETESTRING, 
                    115:             (WPARAM)nIndex, 
                    116:             0L
                    117:     );
                    118:     lpOutlineNameTable->m_nCount--;
                    119: }
                    120: 
                    121: 
                    122: /* OutlineNameTable_GetNameIndex
                    123:  * -----------------------------
                    124:  *
                    125:  *      Return the index of the Name given a pointer to the Name.
                    126:  *      Return -1 if the Name is not found.
                    127:  */
                    128: int OutlineNameTable_GetNameIndex(LPOUTLINENAMETABLE lpOutlineNameTable, LPOUTLINENAME lpOutlineName)
                    129: {
                    130:     LRESULT lReturn;
                    131: 
                    132:     if (! lpOutlineName) return -1;
                    133: 
                    134:     lReturn = SendMessage(
                    135:             lpOutlineNameTable->m_hWndListBox,
                    136:             LB_FINDSTRING, 
                    137:             (WPARAM)-1, 
                    138:             (LPARAM)(LPCSTR)lpOutlineName
                    139:         );
                    140:     
                    141:     return ((lReturn == LB_ERR) ? -1 : (int)lReturn);
                    142: }
                    143: 
                    144: 
                    145: /* OutlineNameTable_GetName
                    146:  * ------------------------
                    147:  *
                    148:  *      Retrieve the pointer to the Name given its index in the NameTable
                    149:  */
                    150: LPOUTLINENAME OutlineNameTable_GetName(LPOUTLINENAMETABLE lpOutlineNameTable, int nIndex)
                    151: {
                    152:     LPOUTLINENAME lpOutlineName;
                    153: 
                    154:     if (lpOutlineNameTable->m_nCount == 0 || 
                    155:         nIndex > lpOutlineNameTable->m_nCount || 
                    156:         nIndex < 0) {
                    157:         return NULL;
                    158:     }
                    159: 
                    160:     SendMessage(
                    161:             lpOutlineNameTable->m_hWndListBox,
                    162:             LB_GETTEXT,
                    163:             nIndex,
                    164:             (LPARAM)(LPCSTR)&lpOutlineName
                    165:     );
                    166:     return lpOutlineName;
                    167: }
                    168: 
                    169: 
                    170: /* OutlineNameTable_FindName
                    171:  * -------------------------
                    172:  *
                    173:  *      Find a name in the name table given a string.
                    174:  */
                    175: LPOUTLINENAME OutlineNameTable_FindName(LPOUTLINENAMETABLE lpOutlineNameTable, LPSTR lpszName)
                    176: {
                    177:     LPOUTLINENAME lpOutlineName;
                    178:     BOOL fFound = FALSE;
                    179:     int i;
                    180: 
                    181:     for (i = 0; i < lpOutlineNameTable->m_nCount; i++) {
                    182:         lpOutlineName = OutlineNameTable_GetName(lpOutlineNameTable, i);
                    183:         if (lstrcmp(lpOutlineName->m_szName, lpszName) == 0) {
                    184:             fFound = TRUE;
                    185:             break;      // FOUND MATCH!
                    186:         }
                    187:     }
                    188:     
                    189:     return (fFound ? lpOutlineName : NULL);
                    190: }
                    191: 
                    192: 
                    193: /* OutlineNameTable_FindNamedRange
                    194:  * -------------------------------
                    195:  *
                    196:  *      Find a name in the name table which matches a given line range.
                    197:  */
                    198: LPOUTLINENAME OutlineNameTable_FindNamedRange(LPOUTLINENAMETABLE lpOutlineNameTable, LPLINERANGE lplrSel)
                    199: {
                    200:     LPOUTLINENAME lpOutlineName;
                    201:     BOOL fFound = FALSE;
                    202:     int i;
                    203: 
                    204:     for (i = 0; i < lpOutlineNameTable->m_nCount; i++) {
                    205:         lpOutlineName = OutlineNameTable_GetName(lpOutlineNameTable, i);
                    206:         if ((lpOutlineName->m_nStartLine == lplrSel->m_nStartLine) &&
                    207:             (lpOutlineName->m_nEndLine == lplrSel->m_nEndLine) ) {
                    208:             fFound = TRUE;
                    209:             break;      // FOUND MATCH!
                    210:         }
                    211:     }
                    212:     
                    213:     return (fFound ? lpOutlineName : NULL);
                    214: }
                    215: 
                    216: 
                    217: /* OutlineNameTable_GetCount
                    218:  * -------------------------
                    219:  *
                    220:  * Return number of names in nametable
                    221:  */
                    222: int OutlineNameTable_GetCount(LPOUTLINENAMETABLE lpOutlineNameTable)
                    223: {
                    224:        if (!lpOutlineNameTable)
                    225:                return 0;
                    226: 
                    227:     return lpOutlineNameTable->m_nCount;
                    228: }
                    229: 
                    230: 
                    231: /* OutlineNameTable_ClearAll
                    232:  * -------------------------
                    233:  *
                    234:  *      Remove all names from table
                    235:  */
                    236: void OutlineNameTable_ClearAll(LPOUTLINENAMETABLE lpOutlineNameTable)
                    237: {
                    238:     LPOUTLINENAME lpOutlineName;
                    239:     int i;
                    240:        int nCount = lpOutlineNameTable->m_nCount;
                    241: 
                    242:     for (i = 0; i < nCount; i++) {
                    243:         lpOutlineName = OutlineNameTable_GetName(lpOutlineNameTable, i);
                    244:         Delete(lpOutlineName);      // free memory for name     
                    245:     }
                    246:     
                    247:     lpOutlineNameTable->m_nCount = 0;
                    248:     SendMessage(lpOutlineNameTable->m_hWndListBox,LB_RESETCONTENT,0,0L);
                    249: }
                    250: 
                    251: 
                    252: /* OutlineNameTable_AddLineUpdate
                    253:  * ------------------------------
                    254:  *
                    255:  *      Update table when a new line is added at nAddIndex
                    256:  * The line used to be at nAddIndex is pushed down
                    257:  */
                    258: void OutlineNameTable_AddLineUpdate(LPOUTLINENAMETABLE lpOutlineNameTable, int nAddIndex)
                    259: {
                    260:     LPOUTLINENAME lpOutlineName;
                    261:     LINERANGE lrSel;
                    262:     int i;
                    263:     BOOL fRangeModified = FALSE;
                    264: 
                    265:     for(i = 0; i < lpOutlineNameTable->m_nCount; i++) {
                    266:         lpOutlineName=OutlineNameTable_GetName(lpOutlineNameTable, i);
                    267:         OutlineName_GetSel(lpOutlineName, &lrSel);
                    268: 
                    269:         if((int)lrSel.m_nStartLine > nAddIndex) {
                    270:             lrSel.m_nStartLine++;
                    271:             fRangeModified = !fRangeModified;
                    272:         }
                    273:         if((int)lrSel.m_nEndLine > nAddIndex) {
                    274:             lrSel.m_nEndLine++;
                    275:             fRangeModified = !fRangeModified;
                    276:         }
                    277: 
                    278:         OutlineName_SetSel(lpOutlineName, &lrSel, fRangeModified);
                    279:     }
                    280: }
                    281: 
                    282: 
                    283: /* OutlineNameTable_DeleteLineUpdate
                    284:  * ---------------------------------
                    285:  *
                    286:  *      Update the table when a line at nDeleteIndex is removed
                    287:  */
                    288: void OutlineNameTable_DeleteLineUpdate(LPOUTLINENAMETABLE lpOutlineNameTable, int nDeleteIndex)
                    289: {
                    290:     LPOUTLINENAME lpOutlineName;
                    291:     LINERANGE lrSel;
                    292:     int i;
                    293:     BOOL fRangeModified = FALSE;
                    294: 
                    295:     for(i = 0; i < lpOutlineNameTable->m_nCount; i++) {
                    296:         lpOutlineName=OutlineNameTable_GetName(lpOutlineNameTable, i);
                    297:         OutlineName_GetSel(lpOutlineName, &lrSel);
                    298: 
                    299:         if((int)lrSel.m_nStartLine > nDeleteIndex) {
                    300:             lrSel.m_nStartLine--;
                    301:             fRangeModified = !fRangeModified;
                    302:         }
                    303:         if((int)lrSel.m_nEndLine >= nDeleteIndex) {
                    304:             lrSel.m_nEndLine--;
                    305:             fRangeModified = !fRangeModified;
                    306:         }
                    307: 
                    308:         // delete the name if its entire range is deleted 
                    309:         if(lrSel.m_nStartLine > lrSel.m_nEndLine) {
                    310:             OutlineNameTable_DeleteName(lpOutlineNameTable, i);
                    311:             i--;  // re-examine this name
                    312:         } else {
                    313:             OutlineName_SetSel(lpOutlineName, &lrSel, fRangeModified);
                    314:         }
                    315:     }
                    316: }
                    317: 
                    318: 
                    319: /* OutlineNameTable_SaveSelToStg
                    320:  * -----------------------------
                    321:  *
                    322:  *      Save only the names that refer to lines completely contained in the
                    323:  * specified selection range.
                    324:  */
                    325: BOOL OutlineNameTable_SaveSelToStg(LPOUTLINENAMETABLE lpOutlineNameTable, LPLINERANGE lplrSel, UINT uFormat, LPSTORAGE lpDestStg)
                    326: {
                    327:     HRESULT hrErr;
                    328:     IStream FAR* lpNTStm;
                    329:     ULONG nWritten;
                    330:     LPOUTLINENAME lpOutlineName;
                    331:     ULONG nNameCount = 0;
                    332:     BOOL fNameSaved;
                    333:     BOOL fStatus;
                    334:     int i;
                    335:     LARGE_INTEGER dlibZeroOffset;
                    336:     LISet32( dlibZeroOffset, 0 );
                    337: 
                    338:     hrErr = lpDestStg->lpVtbl->CreateStream(
                    339:             lpDestStg, 
                    340:             "NameTable", 
                    341:             STGM_WRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE,
                    342:             0,
                    343:             0,
                    344:             &lpNTStm
                    345:     );
                    346: 
                    347:     if (! OleDbgVerifySz(hrErr == NOERROR, 
                    348:                                     "Could not create NameTable stream")) {
                    349:         OleDbgOutHResult("NameTable CreateStream returned", hrErr);
                    350:         goto error;
                    351:     }
                    352: 
                    353:     /* initially write 0 for count of names. the correct count will be
                    354:     **    written at the end when we know how many names qualified to
                    355:     **    be written (within the selection).
                    356:     */
                    357:     hrErr = lpNTStm->lpVtbl->Write(
                    358:             lpNTStm,
                    359:             (int FAR*)&nNameCount, 
                    360:             sizeof(int),
                    361:             &nWritten
                    362:     );
                    363:     
                    364:     if (! OleDbgVerifySz(hrErr == NOERROR,
                    365:                                 "Could not write header to NameTable stream"))
                    366:         goto error;
                    367:     
                    368:     for(i = 0; i < lpOutlineNameTable->m_nCount; i++) {
                    369:         lpOutlineName=OutlineNameTable_GetName(lpOutlineNameTable, i);
                    370:         fStatus = OutlineName_SaveToStg(
                    371:                 lpOutlineName, 
                    372:                 lplrSel,
                    373:                 uFormat,
                    374:                 lpNTStm, 
                    375:                 (BOOL FAR*)&fNameSaved
                    376:         );
                    377:         if (! fStatus) goto error;
                    378:         if (fNameSaved) nNameCount++;
                    379:     }
                    380: 
                    381:     /* write the final count of names written. */
                    382:     hrErr = lpNTStm->lpVtbl->Seek(
                    383:             lpNTStm,
                    384:             dlibZeroOffset,
                    385:             STREAM_SEEK_SET,
                    386:             NULL
                    387:     );
                    388:     if (! OleDbgVerifySz(hrErr == NOERROR, "Error writing NameTable header")) 
                    389:         goto error;
                    390: 
                    391:     hrErr = lpNTStm->lpVtbl->Write(
                    392:             lpNTStm,
                    393:             (int FAR*)&nNameCount, 
                    394:             sizeof(int),
                    395:             &nWritten
                    396:     );
                    397:     if (! OleDbgVerifySz(hrErr == NOERROR, "Error writing NameTable header")) 
                    398:         goto error;
                    399: 
                    400:     OleStdRelease((LPUNKNOWN)lpNTStm);
                    401:     return TRUE;
                    402:     
                    403: error:
                    404:     if (lpNTStm)  
                    405:         OleStdRelease((LPUNKNOWN)lpNTStm);
                    406: 
                    407:     return FALSE;
                    408: }
                    409: 
                    410: 
                    411: /* OutlineNameTable_LoadFromStg
                    412:  * ----------------------------
                    413:  *
                    414:  *      Load Name Table from file
                    415:  *
                    416:  *      Return TRUE if ok, FALSE if error
                    417:  */
                    418: BOOL OutlineNameTable_LoadFromStg(LPOUTLINENAMETABLE lpOutlineNameTable, LPSTORAGE lpSrcStg)
                    419: {
                    420:     LPOUTLINEAPP lpOutlineApp = (LPOUTLINEAPP)g_lpApp;
                    421:     HRESULT hrErr;
                    422:     IStream FAR* lpNTStm;
                    423:     ULONG nRead;
                    424:     int nCount;
                    425:     LPOUTLINENAME lpOutlineName;
                    426:     BOOL fStatus;
                    427:     int i;
                    428: 
                    429:     hrErr = lpSrcStg->lpVtbl->OpenStream(
                    430:             lpSrcStg, 
                    431:             "NameTable",
                    432:             NULL,
                    433:             STGM_READ | STGM_SHARE_EXCLUSIVE,
                    434:             0,
                    435:             &lpNTStm
                    436:     );
                    437: 
                    438:     if (! OleDbgVerifySz(hrErr == NOERROR, "Could not open NameTable stream"))
                    439:         goto error;
                    440: 
                    441:     hrErr = lpNTStm->lpVtbl->Read(lpNTStm,&nCount,sizeof(nCount),&nRead);
                    442: 
                    443:     if (! OleDbgVerifySz(hrErr == NOERROR, 
                    444:                             "Could not read header from NameTable stream")) 
                    445:         goto error;
                    446: 
                    447:     for (i = 0; i < nCount; i++) {
                    448:         lpOutlineName = OutlineApp_CreateName(lpOutlineApp);
                    449:         if (! lpOutlineName) goto error;
                    450:         fStatus = OutlineName_LoadFromStg(lpOutlineName, lpNTStm);
                    451:         if (! fStatus) goto error;
                    452:         OutlineNameTable_AddName(lpOutlineNameTable, lpOutlineName);
                    453:     }
                    454: 
                    455:     OleStdRelease((LPUNKNOWN)lpNTStm);
                    456:     return TRUE;
                    457:     
                    458: error:
                    459:     if (lpNTStm)  
                    460:         OleStdRelease((LPUNKNOWN)lpNTStm);
                    461: 
                    462:     return FALSE;
                    463: }

unix.superglobalmegacorp.com

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