//---------------------------------------------------------------------------- // ObjectWindows // (C) Copyright 1991, 1994 by Borland International, All Rights Reserved // //---------------------------------------------------------------------------- #define INC_OLE2 #include #include #include #include #include #include #include #include // for IDHELP #include static char szNULL[] = ""; DEFINE_GUID(IID_IOleUILinkContainer, 0x000004FF, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46); // // OWL OLE Dialog diagnostic group. // DIAG_DECLARE_GROUP(OwlOleDlg); // // Constructor of customized (for validation) FileOpen dialog // TEditLinksDlg::TChgSrcFileOpenDlg::TChgSrcFileOpenDlg(TWindow* parent, TData& data, TChgSrcData& chgSrcData, TResId templateId, const char far* title, TModule* module) : TFileOpenDialog(parent, data, templateId, title, module), ChgSrcData(chgSrcData), Helper(*new THelper) { } // // Cleanup memory allocated // TEditLinksDlg::TChgSrcFileOpenDlg::~TChgSrcFileOpenDlg() { delete &Helper; } // // Initializes custom FileOpen dialog // void TEditLinksDlg::TChgSrcFileOpenDlg::SetupWindow() { TLinkInfo far* lpLinkInfo = ChgSrcData.lpLI; Helper.bFileNameStored = true; Helper.bItemNameStored = true; if (lpLinkInfo->lpszDisplayName) { strcpyn(Helper.szFileName, lpLinkInfo->lpszDisplayName, MaxPathLen); strcpyn(Helper.szEdit, lpLinkInfo->lpszDisplayName, MaxPathLen); } if (lpLinkInfo->lpszItemName) { strcpyn(Helper.szItemName, lpLinkInfo->lpszItemName, MaxPathLen); } } // // Builds a TEditLinksDlg::TData using a TOcView - retrieves // Bolero's implemetation of the IOLEUILinkContainer interface. // TEditLinksDlg::TData::TData(const TOcView& ocView) { dwFlags = elShowHelp; // // Retrieve BOLERO's IOLEUILinkContainer Interface // lpOleUILinkContainer = 0; CONST_CAST(TOcView*, &ocView)->QueryInterface(IID_IOleUILinkContainer, &(LPVOID)lpOleUILinkContainer); } // // Release Bolero's IOLEUILinkContainer Interface // TEditLinksDlg::TData::~TData() { // // Release BOLERO's IOLEUILinkContainer Interface // if (lpOleUILinkContainer) lpOleUILinkContainer->Release(); } // // Constructor of structure which keeps track of the state of // a particular link. // NOTE: The 'link' parameter is a container-defined unique // identifier for each link - Bolero provides this // value. // TEditLinksDlg::TLinkInfo::TLinkInfo(DWORD link) { dwLink = link; lpszDisplayName = 0; lpszItemName = 0; lpszShortFileName = 0; lpszShortLinkType = 0; lpszFullLinkType = 0; clenFileName = 0; fSourceAvailable = false; fIsAuto = false; fIsMarked = false; fDontFree = false; fIsSelected = false; lpszAMX = new char[LinkTypeLen+1]; lpszAMX[0] = 0; } // // Cleanup memory. // TEditLinksDlg::TLinkInfo::~TLinkInfo() { if (lpszAMX) delete []lpszAMX; } // // Initialized Helper object used internally by TEditLinksDlg // TEditLinksDlg::THelper::THelper() { // // Use memset to initialize private PODS // memset(this, 0, sizeof(THelper)); } // // Initializes data structure for Custom FileOpen dialog. // TEditLinksDlg::TChgSrcFileOpenDlg::TChgSrcData::TChgSrcData(TLinkInfo far* li, TEditLinksDlg::TData& data) : Data(data) { lpLI = li; lpszFrom = 0; lpszTo = 0; fValidLink = false; } DEFINE_RESPONSE_TABLE1(TEditLinksDlg, TOleDialog) EV_WM_COMPAREITEM, EV_WM_DRAWITEM, EV_WM_DELETEITEM, EV_WM_MEASUREITEM, EV_BN_CLICKED(IDC_CHANGESOURCE, ChangeSourceClicked), EV_BN_CLICKED(IDC_AUTOMATIC, AutomaticClicked), EV_BN_CLICKED(IDC_MANUAL, ManualClicked), EV_BN_CLICKED(IDC_BREAKLINK, BreakLinkClicked), EV_BN_CLICKED(IDC_UPDATENOW, UpdateNowClicked), EV_BN_CLICKED(IDC_OPENSOURCE, OpenSourceClicked), END_RESPONSE_TABLE; // // // TEditLinksDlg::TEditLinksDlg(TWindow* parent, const TOcView &ocView, TResId templateId, const char far* title, TModule* module): TOleDialog(parent, templateId ? templateId : TResId(DLG_EDITLINKS), title, module), Helper(*new THelper) { LinksList = new TListBox(this, IDC_LINKLIST); UpdateBtn = new TButton(this, IDC_UPDATENOW); OpenBtn = new TButton(this, IDC_OPENSOURCE); ChangeBtn = new TButton(this, IDC_CHANGESOURCE); BreakLinkBtn = new TButton(this, IDC_BREAKLINK); Automatic = new TRadioButton(this, IDC_AUTOMATIC); Manual = new TRadioButton(this, IDC_MANUAL); LinkSource = new TStatic(this, IDC_SOURCE); LinkType = new TStatic(this, IDC_TYPE); Help = new TButton(this, IDHELP); Cancel = new TButton(this, IDCANCEL); Data = new TData(ocView); nMaxCharWidth = 0; nHeightLine = 0; } // // Cleanup objects allocated // TEditLinksDlg::~TEditLinksDlg() { delete Data; delete &Helper; } // // // bool TEditLinksDlg::EvInitDialog(HWND hwndFocus) { // // Chain to base allow control aliasing // TOleDialog::EvInitDialog(hwndFocus); // // Compute column position of listbox // TRect rect; LinksList->GetWindowRect(rect); int nStart = rect.left; ::GetWindowRect(GetDlgItem(IDC_COL1), &rect); nColPos[0] = rect.left - nStart; ::GetWindowRect(GetDlgItem(IDC_COL2), &rect); nColPos[1] = rect.left - nStart; ::GetWindowRect(GetDlgItem(IDC_COL3), &rect); nColPos[2] = rect.left - nStart; // // Fill listbox with // Helper.fItemsExist = LoadLinkLB() ? true : false; // // // InitControls(); // // Hide/Disable controls based on flag settings // if (!(Data->dwFlags & elShowHelp)) Activate(Help, false); if (Data->dwFlags & elDisableUpdateNow) Activate(UpdateBtn, false); if (Data->dwFlags & elDisableOpenSource) Activate(OpenBtn, false); if (Data->dwFlags & elDisableChangeSource) Activate(ChangeBtn, false); if (Data->dwFlags & elDisableCancelLink) Activate(BreakLinkBtn, false); // // Retrieve 'Close' string to rename CANCEL button // GetModule()->LoadString(IDS_CLOSE, Helper.szClose, sizeof(Helper.szClose)); // // Set focus to listbox if we have links // if (Helper.fItemsExist > 0) LinksList->SetFocus(); else ::SetFocus(GetDlgItem(IDCANCEL)); return false; } // // // int TEditLinksDlg::DoExecute() { return TDialog::DoExecute(); } // // // void TEditLinksDlg::EvMeasureItem(uint ctlId, MEASUREITEMSTRUCT far& measureInfo) { if (ctlId != IDC_LINKLIST) { TOleDialog::EvMeasureItem(ctlId, measureInfo); return; } HFONT hFont = GetWindowFont(); if (!hFont) hFont = (HFONT)GetStockObject(SYSTEM_FONT); TFont font(hFont); TClientDC hdc(*this); hdc.SelectObject(font); TEXTMETRIC tm; hdc.GetTextMetrics(tm); measureInfo.itemHeight = tm.tmHeight; nHeightLine = tm.tmHeight; nMaxCharWidth = tm.tmMaxCharWidth; hdc.RestoreFont(); } // // // int TEditLinksDlg::LBPad() const { return nMaxCharWidth > 0 ? nMaxCharWidth : 5; } // // // void TEditLinksDlg::EvDrawItem(uint ctlId, DRAWITEMSTRUCT far& drawInfo) { if (ctlId != IDC_LINKLIST) { TOleDialog::EvDrawItem(ctlId, drawInfo); return; } if ((int)drawInfo.itemID < 0) return; if (drawInfo.itemAction & (ODA_DRAWENTIRE | ODA_SELECT)) DrawLinksListEntry(drawInfo); InitControls(); if (drawInfo.itemAction & ODA_FOCUS) { DrawFocusRect(drawInfo.hDC, &drawInfo.rcItem); } } // // // void TEditLinksDlg::DrawLinksListEntry(DRAWITEMSTRUCT far& drawInfo) { TDC dc(drawInfo.hDC); TLinkInfo* lpLinkInfo = (TLinkInfo*)drawInfo.itemData; // // Update selection flag and set text color (if selected) // TColor oldTxtColor; if (drawInfo.itemState & ODS_SELECTED) { oldTxtColor = dc.SetTextColor(TColor(GetSysColor(COLOR_HIGHLIGHTTEXT))); lpLinkInfo->fIsSelected = true; } else { lpLinkInfo->fIsSelected = false; } // // Fill background // TBrush brush(GetSysColor(drawInfo.itemState & ODS_SELECTED ? COLOR_HIGHLIGHT : COLOR_WINDOW)); dc.FillRect(drawInfo.rcItem, brush); // // Set transparent mode // int oldMode; oldMode = dc.SetBkMode(TRANSPARENT); TRect rcClip; char* pStr; char str[MaxPathLen]; if (lpLinkInfo->lpszDisplayName) { strcpy(str, lpLinkInfo->lpszDisplayName); pStr = ChopText(*LinksList, nColPos[1] - nColPos[0] - LBPad(), str); rcClip = drawInfo.rcItem; rcClip.left += nColPos[0]; rcClip.right = drawInfo.rcItem.left + (nColPos[1] - LBPad()); dc.ExtTextOut(rcClip.left, rcClip.top, ETO_CLIPPED, &rcClip, pStr, strlen(pStr)); } if (lpLinkInfo->lpszShortLinkType) { rcClip = drawInfo.rcItem; rcClip.left += nColPos[1]; rcClip.right = drawInfo.rcItem.left + nColPos[2] - LBPad(); dc.ExtTextOut(rcClip.left, rcClip.top, ETO_CLIPPED, &rcClip, lpLinkInfo->lpszShortLinkType, strlen(lpLinkInfo->lpszShortLinkType)); } if (lpLinkInfo->lpszAMX) { rcClip = drawInfo.rcItem; rcClip.left += nColPos[2]; dc.ExtTextOut(rcClip.left, rcClip.top, ETO_CLIPPED, &rcClip, lpLinkInfo->lpszAMX, strlen(lpLinkInfo->lpszAMX)); } // // Restore DC attributes // dc.SetBkMode(oldMode); if (drawInfo.itemState & ODS_SELECTED) dc.SetTextColor(oldTxtColor); } // // // LRESULT TEditLinksDlg::EvCompareItem(uint ctlid, COMPAREITEMSTRUCT far& compareInfo) { if (ctlid != IDC_LINKLIST) { return TOleDialog::EvCompareItem(ctlid, compareInfo); } TLinkInfo* lpLI1 = (TLinkInfo*)compareInfo.itemData1; TLinkInfo* lpLI2 = (TLinkInfo*)compareInfo.itemData2; if (lpLI1->lpszDisplayName && lpLI2->lpszDisplayName) return strcmp(lpLI1->lpszDisplayName, lpLI2->lpszDisplayName); return 0; } // // // void TEditLinksDlg::EvDeleteItem(uint ctlid, DELETEITEMSTRUCT far& deleteInfo) { if (ctlid != IDC_LINKLIST) { TOleDialog::EvDeleteItem(ctlid, deleteInfo); return; } TLinkInfo* lpLinkInfo = (TLinkInfo*)deleteInfo.itemData; if (lpLinkInfo->lpszDisplayName) delete []lpLinkInfo->lpszDisplayName; if (lpLinkInfo->lpszShortLinkType) delete []lpLinkInfo->lpszShortLinkType; if (lpLinkInfo->lpszFullLinkType) delete []lpLinkInfo->lpszFullLinkType; if (lpLinkInfo->fDontFree) lpLinkInfo->fDontFree = false; else delete lpLinkInfo; } // // Handles ChangeSource button by displaying a customized version // of FileOpen dialog with the LinkName. // void TEditLinksDlg::ChangeSourceClicked() { if (!Container_ChangeSource()) PopupMessage(IDS_FAILED, IDS_LINKS, MB_ICONEXCLAMATION|MB_OK); InitControls(); } // // Sets a Link [or Links for multiple selections] to automatic // void TEditLinksDlg::AutomaticClicked() { CheckDlgButton(IDC_AUTOMATIC, BF_CHECKED); CheckDlgButton(IDC_MANUAL, BF_UNCHECKED); if (Container_AutomaticManual(true) != NOERROR) PopupMessage(IDS_FAILED, IDS_LINKS, MB_ICONEXCLAMATION|MB_OK); InitControls(); } // // Set Link [or Links for multiple selections] to manual // void TEditLinksDlg::ManualClicked() { CheckDlgButton(IDC_MANUAL, BF_CHECKED); CheckDlgButton(IDC_AUTOMATIC, BF_UNCHECKED); if (Container_AutomaticManual(false) != NOERROR) PopupMessage(IDS_FAILED, IDS_LINKS, MB_ICONEXCLAMATION|MB_OK); InitControls(); } // // Breaks the Link. // NOTE: Object retains its data and becomes a static object // void TEditLinksDlg::BreakLinkClicked() { CancelLink(); InitControls(); } // // Causes immediate update of Link(s). Will start Servers if necessary. // void TEditLinksDlg::UpdateNowClicked() { Container_UpdateNow(); InitControls(); } // // Open the current selection. // NOTE: This options causes the dialog to close. // void TEditLinksDlg::OpenSourceClicked() { if (Container_OpenSource() != NOERROR) InitControls(); else { // // Terminate dialog by simulating an OK // SendNotification(IDOK, BN_CLICKED, GetDlgItem(IDOK)); } } // // // bool TEditLinksDlg::ChangeSource(char* file, TChgSrcFileOpenDlg::TChgSrcData& chgSrcData, uint filterId) { if (!file) return false; // // Load Filter(s) string // char* pFilter = 0; TPointer filters = new char[MaxPathLen]; if (GetModule()->LoadString(filterId, filters, MaxPathLen)) pFilter = filters; // // Load Title string // char* pTitle = 0; TPointer title = new char[MaxPathLen]; if (GetModule()->LoadString(IDS_CHANGESOURCE, title, MaxPathLen)) pTitle = title; // // Attempt to retrieve initial directory from file name // char *pInitDir = 0; char *initDir = new char[MaxPathLen]; TPointer _cln(initDir); strcpyn(initDir, file, MaxPathLen); for (int i=strlen(initDir)-1; i>=0; i--) { if ((initDir[i]=='\\') || (initDir[i]==':') || (initDir[i]=='/')) break; } if (i > 0) { initDir[i] = 0; pInitDir = initDir; } // // Execute customized fileOpen dialog // TPointer data = new TOpenSaveDialog::TData(OFN_NOVALIDATE|OFN_HIDEREADONLY, pFilter, 0, pInitDir); TChgSrcFileOpenDlg foDlg(this, *data, chgSrcData, TResId(DLG_FILEOPEN), pTitle); if (foDlg.Execute()==IDOK) { return true; } return false; } // // Allows user to change Links using a customized FileOpen dialog. // bool TEditLinksDlg::Container_ChangeSource() { int* rgIndex = 0; int cSelItems = GetSelectedItems(rgIndex); if (cSelItems < 0) return false; if (!cSelItems) return true; if (!Helper.fClose) { Cancel->SetWindowText(Helper.szClose); Helper.fClose = true; } TLinkInfo FAR *lpLinkInfo; for( int i=cSelItems-1; i>=0; i--) { // // Retrieve link information // LinksList->HandleMessage(LB_GETTEXT, rgIndex[i], (LPARAM)(TLinkInfo far*)&lpLinkInfo); // // Data for dialog // TChgSrcFileOpenDlg::TChgSrcData chgSrcData(lpLinkInfo, *Data); if (!ChangeSource(lpLinkInfo->lpszDisplayName, chgSrcData, IDS_FILTERS)) { // // The Cancel button was probably pressed - Stop processing // for all remaining links // delete []rgIndex; return true; } UpdateLinkLBItem(rgIndex[i], true); if (chgSrcData.lpszFrom && chgSrcData.lpszTo) { ChangeAllLinks(chgSrcData.lpszFrom, chgSrcData.lpszTo); //! BB - Need to free lpszFrom and lpszTo??? } } delete []rgIndex; return true; } // // // HRESULT TEditLinksDlg::Container_AutomaticManual(bool fAutoMan) { HRESULT hErr = NOERROR; int* rgIndex = 0; int cSelItems = GetSelectedItems(rgIndex); if (cSelItems < 0) return ResultFromScode(E_FAIL); if (!cSelItems) return NOERROR; if (!Helper.fClose) { Cancel->SetWindowText(Helper.szClose); Helper.fClose = true; } bool bUpdate = false; TLinkInfo* lpLinkInfo; LPOLEUILINKCONTAINER lpLnkCntnr = Data->lpOleUILinkContainer; for (int i=0; i < cSelItems; i++) { LinksList->HandleMessage(LB_GETTEXT, rgIndex[i], (LPARAM)(TLinkInfo far*)&lpLinkInfo); if (fAutoMan) { if (!lpLinkInfo->fIsAuto) { hErr = lpLnkCntnr->SetLinkUpdateOptions(lpLinkInfo->dwLink, OLEUPDATE_ALWAYS); lpLinkInfo->fIsAuto = true; lpLinkInfo->fIsMarked = true; bUpdate = true; } } else { if (lpLinkInfo->fIsAuto) { hErr = lpLnkCntnr->SetLinkUpdateOptions(lpLinkInfo->dwLink, OLEUPDATE_ONCALL); lpLinkInfo->fIsAuto = false; lpLinkInfo->fIsMarked = true; bUpdate = true; } } } if (bUpdate) RefreshLinkLB(); if (rgIndex) delete []rgIndex; return hErr; } HRESULT TEditLinksDlg::CancelLink() { HRESULT hErr = NOERROR; int* rgIndex = 0; int cSelItems = GetSelectedItems(rgIndex); if (cSelItems < 0) return ResultFromScode(E_FAIL); if (!cSelItems) return NOERROR; if (!Helper.fClose) { Cancel->SetWindowText(Helper.szClose); Helper.fClose = true; } bool bUpdate = false; TLinkInfo* lpLinkInfo; LPOLEUILINKCONTAINER lpLnkCntnr = Data->lpOleUILinkContainer; for (int i=0; iHandleMessage(LB_GETTEXT, rgIndex[i], (LPARAM)(TLinkInfo far*)&lpLinkInfo); hErr = lpLnkCntnr->CancelLink(lpLinkInfo->dwLink); if (hErr != NOERROR) { lpLinkInfo->fIsMarked = true; bUpdate = true; } else { LinksList->DeleteString(rgIndex[i]); } } if (bUpdate) RefreshLinkLB(); if (rgIndex) delete []rgIndex; return hErr; } // // // HRESULT TEditLinksDlg::Container_UpdateNow() { HRESULT hErr = NOERROR; int* rgIndex = 0; int cSelItems = GetSelectedItems(rgIndex); if (cSelItems < 0) return ResultFromScode(E_FAIL); if (!cSelItems) return NOERROR; if (!Helper.fClose) { Cancel->SetWindowText(Helper.szClose); Helper.fClose = true; } bool bUpdate = false; TLinkInfo FAR *lpLinkInfo; LPOLEUILINKCONTAINER lpLnkCntnr = Data->lpOleUILinkContainer; for (int i=0; iHandleMessage(LB_GETTEXT, rgIndex[i], (LPARAM)(TLinkInfo far*)&lpLinkInfo); hErr = lpLnkCntnr->UpdateLink(lpLinkInfo->dwLink, true, false); bUpdate = true; lpLinkInfo->fIsMarked = true; if (hErr != NOERROR) break; } if (bUpdate) RefreshLinkLB(); if (rgIndex) delete []rgIndex; return hErr; } // // // HRESULT TEditLinksDlg::Container_OpenSource() { HRESULT hErr = NOERROR; int* rgIndex = 0; int cSelItems = GetSelectedItems(rgIndex); if (cSelItems < 0) return ResultFromScode(E_FAIL); if (cSelItems != 1) { TRACEX(OwlOleDlg, 1, "Attempt to open source of multiple items."); return NOERROR; } if (!Helper.fClose) { Cancel->SetWindowText(Helper.szClose); Helper.fClose = true; } TLinkInfo* lpLinkInfo; LinksList->HandleMessage(LB_GETTEXT, rgIndex[0], (LPARAM)(TLinkInfo far*)&lpLinkInfo); LPOLEUILINKCONTAINER lpLnkCntnr = Data->lpOleUILinkContainer; hErr = lpLnkCntnr->OpenLinkSource(lpLinkInfo->dwLink); UpdateLinkLBItem(rgIndex[0], true); if (rgIndex) delete []rgIndex; return hErr; } // // // void TEditLinksDlg::BreakString(TLinkInfo* lpLinkInfo) { if (!lpLinkInfo->clenFileName || (strlen(lpLinkInfo->lpszDisplayName) == lpLinkInfo->clenFileName)) { lpLinkInfo->lpszItemName = 0; } else { lpLinkInfo->lpszItemName = lpLinkInfo->lpszDisplayName + (int)lpLinkInfo->clenFileName; } char* str; str = lpLinkInfo->lpszDisplayName + strlen(lpLinkInfo->lpszDisplayName); while (str > lpLinkInfo->lpszDisplayName) { str = AnsiPrev(lpLinkInfo->lpszDisplayName, str); if ((*str == '\\') || (*str == '/') || (*str == ':')) break; } if (str == lpLinkInfo->lpszDisplayName) lpLinkInfo->lpszShortFileName = str; else lpLinkInfo->lpszShortFileName = AnsiNext(str); } // // // int TEditLinksDlg::GetSelectedItems(int* &lprgIndex) { lprgIndex = 0; int count = LinksList->GetSelCount(); if (count < 0) // Error return count; if (count == 0) return 0; lprgIndex = new int[count]; if (LinksList->GetSelIndexes(lprgIndex, count) == count) { return count; // Caller will free lprgIndex! } else { if (lprgIndex) delete []lprgIndex; lprgIndex = 0; return 0; } } // // Update state of Auto/Manual, Link Source and Link Type information based // on currently selected entry // void TEditLinksDlg::InitControls() { int* rgIndex = 0; int cSelItems = GetSelectedItems(rgIndex); if (cSelItems < 0) // Error! return; // // Enable/Disable controls // Automatic->EnableWindow(cSelItems ? true : false); Manual->EnableWindow(cSelItems ? true : false); if (!(Data->dwFlags & elDisableCancelLink)) BreakLinkBtn->EnableWindow(cSelItems ? true : false); if (!(Data->dwFlags & elDisableOpenSource)) OpenBtn->EnableWindow(cSelItems ? true : false); if (!(Data->dwFlags & elDisableChangeSource)) ChangeBtn->EnableWindow(cSelItems ? true : false); if (!(Data->dwFlags & elDisableUpdateNow)) UpdateBtn->EnableWindow(cSelItems ? true : false); int cAuto = 0; int cManual = 0; char* lpszType = 0; char* lpszSource = 0; bool bSameType = true; bool bSameSource = true; TLinkInfo* lpLinkInfo; for (int i=0; i < cSelItems; i++) { LinksList->HandleMessage(LB_GETTEXT, rgIndex[i], (LPARAM)(TLinkInfo far*)&lpLinkInfo); if (lpszSource && lpLinkInfo->lpszDisplayName) { if (bSameSource && strcmp(lpszSource, lpLinkInfo->lpszDisplayName)) { bSameSource = false; } } else { lpszSource = lpLinkInfo->lpszDisplayName; } if (lpszType && lpLinkInfo->lpszFullLinkType) { if (bSameType && strcmp(lpszType, lpLinkInfo->lpszFullLinkType)) { bSameType = false; } } else { lpszType = lpLinkInfo->lpszFullLinkType; } if (lpLinkInfo->fIsAuto) cAuto++; else cManual++; } CheckDlgButton(IDC_AUTOMATIC, cAuto && !cManual); CheckDlgButton(IDC_MANUAL, !cAuto && cManual); if (!bSameSource || !lpszSource) lpszSource = szNULL; char* lpsz = szNULL; TPointer sz = new char[MaxPathLen]; strcpy(sz, lpszSource); lpsz = ChopText(*LinkSource, 0, sz); LinkSource->SetText(lpsz); if (!bSameType || !lpszType) lpszType = szNULL; LinkType->SetText(lpszType); if (rgIndex) delete []rgIndex; } void TEditLinksDlg::UpdateLinkLBItem(int nIndex, bool bSelect) { if (nIndex <0) return; TLinkInfo* lpLinkInfo = 0; long result = (long)LinksList->HandleMessage(LB_GETTEXT, nIndex, (LPARAM)(TLinkInfo far*)&lpLinkInfo); if (result == LB_ERR || !lpLinkInfo) return; lpLinkInfo->fDontFree = true; LinksList->DeleteString(nIndex); nIndex = AddLinkLBItem(lpLinkInfo, false); if (bSelect) { LinksList->SetSel(nIndex, true); LinksList->SetCaretIndex(nIndex, true); } } void TEditLinksDlg::DiffPrefix(const char* lpsz1, const char* lpsz2, char* &pref1, char* &pref2) { PRECONDITION(lpsz1 && lpsz2 && *lpsz1 && *lpsz2); pref1 = 0; pref2 = 0; pref1 = new char[strlen(lpsz1)+1]; pref2 = new char[strlen(lpsz2)+1]; strcpy(pref1, lpsz1); strcpy(pref2, lpsz2); char* lpstr1 = pref1 + strlen(pref1); char* lpstr2 = pref2 + strlen(pref2); while ((lpstr1 > pref1) && (lpstr2 > pref2)) { lpstr1 = AnsiPrev(pref1, lpstr1); lpstr2 = AnsiPrev(pref1, lpstr2); if (*lpstr1 != *lpstr2) { lpstr1 = AnsiNext(lpstr1); lpstr2 = AnsiNext(lpstr2); break; } } while(*lpstr1 && *lpstr1!='\\' && *lpstr1!='!') lpstr1 = AnsiNext(lpstr1); while(*lpstr2 && *lpstr2!='\\' && *lpstr2!='!') lpstr2 = AnsiNext(lpstr2); *lpstr1 = 0; *lpstr2 = 0; } void TEditLinksDlg::ChangeAllLinks(char* lpszFrom, char* lpszTo) { bool bFound = false; int cFrom = strlen(lpszFrom); int cItems = LinksList->GetCount(); char szTmp[MaxPathLen]; TLinkInfo* lpLinkInfo = 0; for (int nIndex=0; nIndexHandleMessage(LB_GETTEXT, nIndex, (LPARAM)(TLinkInfo far*)&lpLinkInfo); lpLinkInfo->fIsMarked = false; if (!*(lpLinkInfo->lpszDisplayName + cFrom) || (*(lpLinkInfo->lpszDisplayName + cFrom) == '\\') || (*(lpLinkInfo->lpszDisplayName + cFrom) == '!')) { strcpyn(szTmp, lpLinkInfo->lpszDisplayName, cFrom+1); if (!strcmp(szTmp, lpszFrom)) { HRESULT hErr; int nFileLength; ULONG ulDummy; if (!bFound) { TPointer pTitle = new char[MaxPathLen]; TPointer pMsg = new char[MaxPathLen]; TPointer pBuff = new char[MaxPathLen]; GetModule()->LoadString(IDS_CHANGESOURCE, (LPSTR)(char*)pTitle, MaxPathLen); GetModule()->LoadString(IDS_CHANGEADDITIONALLINKS, (LPSTR)(char*)pMsg, MaxPathLen); wsprintf((LPSTR)(char*)pBuff, (LPSTR)(char*)pMsg, lpszFrom); if (MessageBox((LPSTR)(char*)pBuff, (LPSTR)(char*)pTitle, MB_ICONQUESTION|MB_YESNO) != IDYES) return; bFound = true; } strcpy(szTmp, lpszTo); strcat(szTmp, lpLinkInfo->lpszDisplayName + cFrom); nFileLength = strlen(szTmp) - (lpLinkInfo->lpszItemName ? strlen(lpLinkInfo->lpszItemName) : 0); LPOLEUILINKCONTAINER lpLnkCntnr = Data->lpOleUILinkContainer; hErr = lpLnkCntnr->SetLinkSource(lpLinkInfo->dwLink, szTmp,nFileLength, (ULONG FAR*)&ulDummy, true); if (hErr != NOERROR) lpLnkCntnr->SetLinkSource(lpLinkInfo->dwLink, szTmp, nFileLength, (ULONG FAR*)&ulDummy, false); lpLinkInfo->fIsMarked = true; } } } } int TEditLinksDlg::AddLinkLBItem(TLinkInfo* lpLinkInfo, bool sel) { PRECONDITION(lpLinkInfo); TOleAllocator oleAllocator; TRY { DWORD dwUpdateOpt; HRESULT hErr = NOERROR; lpLinkInfo->fDontFree = false; LPOLEUILINKCONTAINER lpLnkCntnr = Data->lpOleUILinkContainer; CHECK(lpLnkCntnr); // // Retrieve Link Source Information // LPSTR lpszDisplayName = lpLinkInfo->lpszDisplayName; LPSTR lpszFullLinkType = lpLinkInfo->lpszFullLinkType; LPSTR lpszShortLinkType = lpLinkInfo->lpszShortLinkType; hErr = lpLnkCntnr->GetLinkSource(lpLinkInfo->dwLink, &lpszDisplayName, &lpLinkInfo->clenFileName, &lpszFullLinkType, &lpszShortLinkType, &lpLinkInfo->fSourceAvailable, sel ? &lpLinkInfo->fIsSelected : 0); if (hErr != NOERROR) THROW(IDS_ERR_GETLINKSOURCE;) // // Ask for the Update Options // hErr = lpLnkCntnr->GetLinkUpdateOptions(lpLinkInfo->dwLink, &dwUpdateOpt); if (hErr != NOERROR) THROW(IDS_ERR_GETLINKUPDATEOPTIONS;) if (lpLinkInfo->fSourceAvailable) { if (dwUpdateOpt == OLEUPDATE_ALWAYS) { lpLinkInfo->fIsAuto = true; GetModule()->LoadString(IDS_LINK_AUTO, lpLinkInfo->lpszAMX, LinkTypeLen+1); } else { lpLinkInfo->fIsAuto = false; GetModule()->LoadString(IDS_LINK_MANUAL, lpLinkInfo->lpszAMX, LinkTypeLen+1); } } else { GetModule()->LoadString(IDS_LINK_UNKNOWN, lpLinkInfo->lpszAMX, LinkTypeLen+1); } BreakString(lpLinkInfo); int index = (int)LinksList->HandleMessage(LB_ADDSTRING, 0, (LPARAM)lpLinkInfo); if (index == LB_ERR) THROW(IDS_ERR_ADDSTRING;) return index; } CATCH( ( int errMsgId) { \ // \ // Display error message \ // \ PopupMessage(errMsgId, IDS_LINKS, MB_ICONEXCLAMATION|MB_OK); \ \ // \ // Cleanup up buffers allocated by container \ // \ if (lpLinkInfo->lpszDisplayName) { \ oleAllocator.Free(lpLinkInfo->lpszDisplayName); \ lpLinkInfo->lpszDisplayName = 0; \ } \ \ if (lpLinkInfo->lpszShortLinkType) { \ oleAllocator.Free(lpLinkInfo->lpszShortLinkType); \ lpLinkInfo->lpszShortLinkType = 0; \ } \ \ if (lpLinkInfo->lpszDisplayName) { \ oleAllocator.Free(lpLinkInfo->lpszFullLinkType); \ lpLinkInfo->lpszFullLinkType = 0; \ } \ return -1; \ } ) // End-Of-CATCH macro // } int TEditLinksDlg::LoadLinkLB() { int cLinks = 0; DWORD dwLink = 0; LPOLEUILINKCONTAINER lpLnkCntnr = Data->lpOleUILinkContainer; int index; TLinkInfo* lpLinkInfo; while((dwLink = lpLnkCntnr->GetNextLink(dwLink)) != 0) { lpLinkInfo = new TLinkInfo(dwLink); cLinks++; index = AddLinkLBItem(lpLinkInfo, true); if (index < 0) return -1; if (lpLinkInfo->fIsSelected) LinksList->SetSel(index, true); } if (LinksList->GetSelIndexes(&index, 1) > 0) LinksList->SetCaretIndex(index, true); return cLinks; } void TEditLinksDlg::RefreshLinkLB() { int cItems = LinksList->GetCount(); CHECK(cItems > 0); bool bStop; TLinkInfo* lpLinkInfo; do { bStop = true; for (int nIndex=0; nIndexHandleMessage(LB_GETTEXT, nIndex, (LPARAM)(TLinkInfo far*)&lpLinkInfo); if (lpLinkInfo->fIsMarked) { lpLinkInfo->fIsMarked = false; lpLinkInfo->fDontFree = true; LinksList->DeleteString(nIndex); nIndex =AddLinkLBItem(lpLinkInfo, false); if (lpLinkInfo->fIsSelected) { LinksList->SetSel(nIndex, true); LinksList->SetCaretIndex(nIndex, true); } bStop = false; break; } } } while (!bStop); }