//---------------------------------------------------------------------------- // ObjectWindows // (C) Copyright 1993, 1994 by Borland International, All Rights Reserved // // Implementation of class TInsertObjectDlg //---------------------------------------------------------------------------- #define INC_OLE2 #include #include #include #include #include #include #include #include // for IDHELP #include // // OWL OLE Dialog diagnostic group. // DIAG_DECLARE_GROUP(OwlOleDlg); // // // const char szNotInsertable[] = "\\NotInsertable"; const char szProStdEditSrv[] = "\\protocol\\StdFileEditing\\server"; const char szInsertable[] = "\\Insertable"; const char szCLSID2[] = "CLSID\\"; const char szInProcServer[] = "\\InProcServer"; const char szLocalServer[] = "\\LocalServer"; // // // static bool GetAssociatedExecutable(char* /*extension*/, char* /*executable*/) { return false; //! BB For now } // // // TInsertObjectDlg::TData::TData() { Flags = 0; cClsIdExclude = 0; lpClsIdExclude= 0; MetaPict = 0; FileName = 0; ClsId = CLSID_NULL; } DEFINE_RESPONSE_TABLE1(TInsertObjectDlg, TOleDialog) EV_BN_CLICKED(IDC_CREATENEW, CreateNewClicked), EV_BN_CLICKED(IDC_CREATEFROMFILE, CreateFromFileClicked), EV_BN_CLICKED(IDC_BROWSE, BrowseFileClicked), EV_BN_CLICKED(IDC_LINK, LinkToFileClicked), EV_BN_CLICKED(IDC_DISPLAYASICON, DisplayAsIconClicked), EV_BN_CLICKED(IDC_CHANGEICON, ChangeIconClicked), EV_LBN_SELCHANGE(IDC_OBJECTLIST, ObjectListChanged), EV_LBN_DBLCLK(IDC_OBJECTLIST, ObjectListDoubleClicked), EV_EN_CHANGE(IDC_FILENAME, FileNameChanged), EV_EN_KILLFOCUS(IDC_FILENAME, FileNameKillFocus), END_RESPONSE_TABLE; // // Static variales of TInserObjectDlg // CLSID TInsertObjectDlg::DynamicScopeClsid = CLSID_NULL; OLECHAR TInsertObjectDlg::DynamicScopePath[MaxPathLen] = {0}; // // // TInsertObjectDlg::TInsertObjectDlg(TWindow* parent, TOcInitInfo &initInfo, TData *data, TResId templateId, const char far* title, TModule* module) : TOleDialog(parent, templateId ? templateId : TResId(DLG_INSERTOBJECT), title, module), InitInfo(initInfo), Helper(*new THelper) { ObjectList = new TListBox(this, IDC_OBJECTLIST); ObjectType = new TStatic(this, IDC_OBJECTTYPE); Link = new TCheckBox(this, IDC_LINK); File = new TStatic(this, IDC_FILE); Browse = new TButton(this, IDC_BROWSE); FileName = new TEdit(this, IDC_FILENAME); FileType = new TStatic(this, IDC_FILETYPE); ResultText = new TStatic(this, IDC_RESULTTEXT); DisplayAsIcon = new TCheckBox(this, IDC_DISPLAYASICON); ChangeIcon = new TButton(this, IDC_CHANGEICON); ResultImage = new TResultImage(this, IDC_RESULTIMAGE); IconImage = new TIconImage(this, IDC_ICONIMAGE); CreateNew = new TRadioButton(this, IDC_CREATENEW); CreateFromFile = new TRadioButton(this, IDC_CREATEFROMFILE); Help = new TButton(this, IDHELP); Ok = new TButton(this, IDOK); Data = data; DeleteData = false; } // // // TInsertObjectDlg::~TInsertObjectDlg() { delete &Helper; if (DeleteData) delete Data; } // // Retrieves default parameters for InsertObject [if none was // specified] before excuting the dialog // int TInsertObjectDlg::DoExecute() { if (!Data) { if (!GetDefaultInsertObjectData()) return IDCANCEL; } return TDialog::DoExecute(); } bool TInsertObjectDlg::GetDefaultInsertObjectData() { Data = new TData; DeleteData = true; // Init Data members // Data->Flags = ioSelectCreateNew|ioShowHelp; Data->cClsIdExclude = 0; //! BB Add code to exclude ourselves using Data->lpClsIdExclude= 0; // OLE calls Data->MetaPict = 0; Data->FileName = DynamicScopePath; Data->ClsId = CLSID_NULL; return true; } bool TInsertObjectDlg::EvInitDialog(HWND hwndFocus) { TOleDialog::EvInitDialog(hwndFocus); // Make Copy of Flags // Helper.Flags = Data->Flags; Helper.ClsId = Data->ClsId; Helper.MetaPict = 0; if (Data->FileName && *(Data->FileName)) strcpyn(Helper.FileName, Data->FileName, MaxPathLen); else Helper.FileName[0]=0; // Set Control Font // if (Font) { ResultText->SetWindowFont(*Font, false); FileType->SetWindowFont(*Font, false); } // Fill ListBox with Insertable Servers // FillClassList(); // Adjust ListBox // TRect lRect; uint32 dbUnits = GetDialogBaseUnits(); ObjectList->GetClientRect(lRect); int tabWidth = (8*lRect.right)/LOWORD(dbUnits); ObjectList->SetTabStops(1, &tabWidth); // Initialize filename // if (Helper.FileName[0]) { FileName->SetText(Helper.FileName); Helper.FileDirty = ValidateInsertFile(false); } else { char curDir[MaxPathLen]; if(getcwd(curDir, sizeof(curDir))); FileName->SetText(curDir); Helper.FileDirty = true; } // // Init dialog for either CreateNew or CreateFromFile // if (Helper.Flags & ioSelectCreateNew) { Activate(File, false); Activate(FileType, false); Activate(FileName, false); Activate(Link, false); Activate(Browse, false); CheckRadioButton(IDC_CREATENEW, IDC_CREATEFROMFILE, IDC_CREATENEW); ObjectList->SetFocus(); Helper.AsIconNew = (Helper.Flags & ioCheckDisplayAsIcon) ? true : false; } else { // ioSelectCreateFromFile Activate(ObjectList, false); Activate(ObjectType, false); if (Helper.FileDirty) Helper.Flags &= ~ioCheckDisplayAsIcon; if (Helper.Flags & ioDisableLink) { Activate(Link, false); } else { if (Helper.Flags & ioCheckLink) Link->Check(); } CheckRadioButton(IDC_CREATENEW, IDC_CREATEFROMFILE, IDC_CREATEFROMFILE); Helper.AsIconFile = (Helper.Flags & ioCheckDisplayAsIcon) ? true : false; FileName->SetFocus(); } // Handled Icon display flags // bool fAsIcon = (Helper.Flags & ioCheckDisplayAsIcon) ? true : false; DisplayAsIcon->SetCheck(fAsIcon == false ? BF_UNCHECKED : BF_CHECKED); Activate(ChangeIcon, fAsIcon); Activate(IconImage, fAsIcon); // Handle ShowHelp flags // if (!(Helper.Flags & ioShowHelp)) Activate(Help, false); // Update Result display // UpdateClassIcon(); SetInsertObjectResults(); // Disable IconDisplay control if requested // if (Helper.Flags & ioDisableDisplayAsIcon) { Activate(DisplayAsIcon, false); Activate(ChangeIcon, false); Activate(IconImage, false); } return false; } // // Update TOcInitInfo member using the Data information. // bool TInsertObjectDlg::OleDlgOk() { // Set Focus on OK button // if (GetFocus() != *Ok) Ok->SetFocus(); if ((Helper.Flags & ioSelectCreateFromFile) && Helper.FileDirty) { if (ValidateInsertFile()) { Helper.FileDirty = false; Helper.FileValid = true; UpdateClassIcon(); UpdateClassType(true); } else { // Invalid file name specified Helper.FileDirty = false; Helper.FileValid = false; FileName->SetFocus(); FileName->SetSelection(0, -1); return false; } } else if ((Helper.Flags & ioSelectCreateFromFile) && !Helper.FileValid) { char file[MaxPathLen]; if (FileName->GetText(file, sizeof(file))) { OpenFileError(Helper.ErrCode, file); } Helper.FileDirty = false; Helper.FileValid = false; FileName->SetFocus(); FileName->SetSelection(0, -1); UpdateClassType(false); return false; } LPSTR lpszCLSID; char buff[MaxKeyLen+CLSIDStringLen]; // Copy info to user's structure // Data->Flags = Helper.Flags; if (Helper.Flags & ioSelectCreateNew) { int selIndex = ObjectList->GetSelIndex(); // Retrieve Icon and set to 0 to prevent deletion // if (Helper.Flags & ioCheckDisplayAsIcon) { Data->MetaPict = (HGLOBAL)ObjectList->GetItemData(selIndex); ObjectList->SetItemData(selIndex, 0); } else { Data->MetaPict = 0; } // Retrieve CLSID // ObjectList->GetString(buff, selIndex); lpszCLSID = PtrToNthField(buff, 2, '\t'); CLSIDFromString(lpszCLSID, &Data->ClsId); } else { // ioSelectCreateFromFile if (Helper.Flags & ioCheckDisplayAsIcon) { Data->MetaPict = IconImage->GetMetaPict(); } else { Data->MetaPict = 0; } FileName->GetText(Helper.FileName, MaxPathLen); strcpyn(Data->FileName, Helper.FileName, MaxPathLen); } // // Update TOcInitInfo members // InitInfo.HIcon =(Data->Flags & ioCheckDisplayAsIcon) ? (HICON)Data->MetaPict : NULL; if (Data->Flags & ioSelectCreateNew) { InitInfo.Where = iwNew; InitInfo.How = ihEmbed; DynamicScopeClsid = Data->ClsId; InitInfo.CId = (BCID)&DynamicScopeClsid; } else if (Data->Flags & ioSelectCreateFromFile) { InitInfo.Where = iwFile; InitInfo.How = (Data->Flags & ioCheckLink) ? ihLink : ihEmbed; InitInfo.Path = strnewdup(Data->FileName); } return true; } // // Cleanup metafiles stored as itemData in ListBox // void TInsertObjectDlg::CleanupWindow() { int count = ObjectList->GetCount(); HGLOBAL hMetaPict; for (int i=0; iGetItemData(i); if (hMetaPict) { TOleMetaPict::Free(hMetaPict); ObjectList->SetItemData(i, 0); } } TOleDialog::CleanupWindow(); } // // // int TInsertObjectDlg::FillClassList() { HKEY hKey; CLSID clsid; LPSTR pszID= 0; int strIndex = 0; char* pExec = new char[MaxKeyLen]; TPointer _pe = pExec; char* pClass= new char[MaxKeyLen]; TPointer _pc = pClass; char* pKey = new char[MaxKeyLen]; TPointer _pk = pKey; // // Retrieve task memory allocator // TOleAllocator oleAllocator; // // Return error if cannot open the root key // if (RegOpenKey(HKEY_CLASSES_ROOT, NULL, &hKey) != ERROR_SUCCESS) { TRACEX(OwlOleDlg, 1, "Unable to open Reg. DB"); return -1; } // Clear ListBox // ObjectList->ClearList(); while(RegEnumKey(hKey, strIndex++, pClass, MaxKeyLen) == ERROR_SUCCESS) { if (pszID) { oleAllocator.Free(pszID); pszID = 0; } int classLen = strlen(pClass); // Skip entries with not-insertable subkeys // LONG buffSize = MaxKeyLen; strcpy(pClass+classLen, szNotInsertable); if (RegQueryValue(hKey, pClass, pKey, &buffSize) == ERROR_SUCCESS) continue; // Append and check for "\\protocol\\StdFileEditiing\\server" entry // buffSize = MaxKeyLen; strcpy(pClass+classLen, szProStdEditSrv); if (RegQueryValue(hKey, pClass, pKey, &buffSize) == ERROR_SUCCESS) { // Retrieve full user type name // *(pClass+classLen) = 0; buffSize = MaxKeyLen; if (RegQueryValue(hKey, pClass, pKey, &buffSize) != ERROR_SUCCESS) continue; } else { // Skip if no "\\Insertable" entry is found // strcpy(pClass+classLen, szInsertable); buffSize = MaxKeyLen; if (RegQueryValue(hKey, pClass, pKey, &buffSize) != ERROR_SUCCESS) continue; // Reset class // *(pClass+classLen) = 0; // Check for "\\CLSID" subkey as hint to look for second entry // [GUID entries] of registration // buffSize = MaxKeyLen; pszID = (char*)oleAllocator.Alloc(MaxKeyLen); strcat(pClass+classLen, ClsIdStr); if (RegQueryValue(hKey, pClass, pszID, &buffSize) != ERROR_SUCCESS) continue; // Look for ROOT\CLSID\'GUID'\LocalServer // strcpy(pExec, szCLSID2); strcat(pExec, pszID); int execLen = strlen(pExec); strcpy(pExec+execLen, szLocalServer); buffSize = MaxKeyLen; if (RegQueryValue(hKey, pExec, pKey, &buffSize) != ERROR_SUCCESS) { // Look for ROOT\CLSID\'GUID'\InProcServer // strcpy(pExec+execLen, szInProcServer); buffSize = MaxKeyLen; if (RegQueryValue(hKey, pExec, pKey, &buffSize)!= ERROR_SUCCESS) continue; } } if (!pszID) { HRESULT result = CLSIDFromProgID((LPCOLESTR)(char*)pClass, &clsid); if (result != S_OK) continue; StringFromCLSID(clsid, &pszID); } else { CLSIDFromString(pszID, &clsid); } if (!pszID || IsEqualCLSID(clsid, CLSID_NULL)) continue; // Tag classID to string and add latter to the list if // it's not already there. // if (ObjectList->FindString(pKey, 0) == LB_ERR) { strcat(pKey, "\t"); strcat(pKey, pszID); ObjectList->AddString(pKey); TRACEX(OwlOleDlg, 1, "Adding " << pKey); } // Free CLSID String using task allocator // if (pszID) { oleAllocator.Free(pszID); pszID = 0; } } RegCloseKey(hKey); // Select first entry // ObjectList->SetSelIndex(0); // Return list count // return ObjectList->GetCount(); } // // // bool TInsertObjectDlg::ToggleObjectSource(TInsertObjectFlags flag) { PRECONDITION((flag == ioSelectCreateNew) || (flag == ioSelectCreateFromFile)); if (Helper.Flags & flag) return true; // Store current file icon // if (flag == ioSelectCreateNew && (Helper.Flags & ioCheckDisplayAsIcon)) Helper.MetaPict = IconImage->GetMetaPict(); // Enable/Disable Icon related // bool asIcon = (flag == ioSelectCreateNew) ? Helper.AsIconNew : Helper.AsIconFile; if (asIcon) { Helper.Flags |= ioCheckDisplayAsIcon; DisplayAsIcon->Check(); } else { Helper.Flags &= ~ioCheckDisplayAsIcon; DisplayAsIcon->Uncheck(); } ChangeIcon->EnableWindow(asIcon); // Hide/Show appropriate controls // bool enable = (flag == ioSelectCreateNew) ? true : Helper.FileSelected; DisplayAsIcon->EnableWindow(enable); Ok->EnableWindow(enable); Link->EnableWindow(enable); enable = (flag == ioSelectCreateNew) ? true : false; FileName->EnableWindow(enable); Browse->EnableWindow(enable); Activate(ObjectList, enable); Activate(ObjectType, enable); enable = (flag == ioSelectCreateFromFile) ? true : false; Activate(File, enable); Activate(FileType, enable); Activate(FileName, enable); Activate(Browse, enable); if (Helper.Flags & ioDisableLink) enable = false; Activate(Link, enable); // Update Flag // Helper.Flags = (Helper.Flags & ~(ioSelectCreateFromFile|ioSelectCreateNew)) | flag; enable = (Helper.Flags & ioCheckDisplayAsIcon) ? true : false; Activate(ChangeIcon, enable); Activate(IconImage, enable); // Update result display // SetInsertObjectResults(); // Set Focus to newly enable control // if (flag == ioSelectCreateNew) { UpdateClassIcon(); ObjectList->SetFocus(); } else { // ioSelectCreateFromFile if (Helper.AsIconFile && Helper.MetaPict) { IconImage->SetMetaPict(Helper.MetaPict); Helper.MetaPict = 0; } else { UpdateClassIcon(); } Browse->SetFocus(); } return false; } // // // void TInsertObjectDlg::UpdateClassType(bool setText) { CLSID clsid; char fileName[MaxPathLen]; char fileType[MaxLabelLen]; fileType[0] = 0; if (setText) { FileName->GetText(fileName, sizeof(fileName)); if (GetClassFile(fileName, &clsid) == S_OK) GetUserTypeOfClass(clsid, fileType, sizeof(fileType)); } FileType->SetText(fileType); } // // // void TInsertObjectDlg::UpdateClassIcon() { if (!(Helper.Flags & ioCheckDisplayAsIcon)) return; int index = ObjectList->GetSelIndex(); if (index == LB_ERR) return; HGLOBAL iconMeta = 0; // Handle 'CreateNew' // if (Helper.Flags & ioSelectCreateNew) { // Check if we did not store the icon earlier // uint32 itemData = ObjectList->GetItemData(index); if (itemData) { IconImage->SetMetaPict((HGLOBAL)itemData); return; } // Retrieve CLSID [and Icon] of selection // if (GetCurrentCLSID(Helper.ClsId)) { iconMeta = GetIconFromClass(Helper.ClsId, 0, true); } // Store Icon for future use // ObjectList->SetItemData(index, (uint32)iconMeta); } else { // ioSelectCreateFromFile char *fileName = new char[MaxPathLen]; FileName->GetText(fileName, MaxPathLen); CLSID clsid; bool isChkLnk = (Helper.Flags & ioCheckLink) ? true : false; if (isChkLnk || (GetClassFile(fileName, &clsid) == S_OK)) { iconMeta = GetIconFromFile(fileName, isChkLnk ? true : false); } else { iconMeta = GetIconFromClass(clsid, 0, true); } } // Update icon display // IconImage->SetMetaPict(iconMeta); Activate(IconImage, iconMeta ? true : false ); } // // // void TInsertObjectDlg::SetInsertObjectResults() { TModule *module = GetModule(); const int buffLen = 0x200; TPointer str1 = new char[buffLen]; TPointer str2 = new char[buffLen]; TPointer str3 = new char[buffLen]; uint strID1=0, strID2=0; uint imageIndex = 0; bool asIcon = (Helper.Flags & ioCheckDisplayAsIcon) ? true : false; if (Helper.Flags & ioSelectCreateNew) { strID1 = asIcon ? IDS_IORESULTNEWICON : IDS_IORESULTNEW; imageIndex = asIcon ? riEmbedIcon : riEmbed; } if (Helper.Flags & ioSelectCreateFromFile) { if (Helper.Flags & ioCheckLink) { strID1 = asIcon ? IDS_IORESULTLINKFILEICON1 : IDS_IORESULTLINKFILE1; strID2 = asIcon ? IDS_IORESULTLINKFILEICON2 : IDS_IORESULTLINKFILE2; imageIndex = asIcon ? riLinkIcon : riLink; } else { strID1 = IDS_IORESULTFROMFILE1; strID2 = (asIcon==true) ? IDS_IORESULTFROMFILEICON2 : IDS_IORESULTFROMFILE2; imageIndex = asIcon ? riEmbedIcon : riEmbed; } } *((char*)str1) = 0; if (module->LoadString(strID1, str1, buffLen)) { if (strID2 && module->LoadString(strID2, str2, buffLen)) strcat(str1, str2); if (Helper.Flags & ioSelectCreateNew) { int index = ObjectList->GetSelIndex(); if (index != LB_ERR) { int len = ObjectList->GetStringLen(index)+1; TPointer lstEntry = new char[len]; if (ObjectList->GetString(lstEntry, index) != LB_ERR) { char *pTab = strchr(lstEntry, '\t'); if (pTab) *pTab = 0; wsprintf((LPSTR)(char*)str3, (LPSTR)(char*)str1, (LPSTR)(char*)lstEntry); strcpy(str1, str3); } } } } ResultText->SetText(str1); ResultImage->SetBitmapIndex(imageIndex); } // // Validates file name currently specified in edit control and // attempts to substitute a full path for any partial/relative // filenames. // bool TInsertObjectDlg::ValidateInsertFile(bool showErr) { // Retrieve current name // char fileName[MaxPathLen]; if (!FileName->GetText(fileName, sizeof(fileName))) return false; OFSTRUCT of; HFILE hFile; hFile = DoesFileExist(fileName, of); // Sharing Violation's OK since OleCreateFromFile and // OleCreateLinkToFile can still succeed under these circumstances. // const uint ofErrSharingViolation = 0x0020; if (hFile==HFILE_ERROR && of.nErrCode != ofErrSharingViolation) { if (showErr) { OpenFileError(of.nErrCode, fileName); } return false; } else { OemToAnsi(of.szPathName, of.szPathName); FileName->SetText(of.szPathName); return true; } } // // // bool TInsertObjectDlg::GetCurrentCLSID(CLSID& clsid) { PRECONDITION(Helper.Flags & ioSelectCreateNew); int index = ObjectList->GetSelIndex(); if (index == LB_ERR) return false; char *listEntry = new char[MaxKeyLen]; TPointer p(listEntry); // Retrieve ListBox entry and get to CLSID stored beyond tab // ObjectList->GetString(listEntry, index); LPSTR lpszCLSID = PtrToNthField(listEntry, 2, '\t'); return (CLSIDFromString(lpszCLSID, &clsid) == S_OK) ? true : false; } // // // void TInsertObjectDlg::CreateNewClicked() { ToggleObjectSource(ioSelectCreateNew); } // // // void TInsertObjectDlg::CreateFromFileClicked() { ToggleObjectSource(ioSelectCreateFromFile); } // // // void TInsertObjectDlg::LinkToFileClicked() { if (Link->GetCheck() == BF_CHECKED) { Helper.Flags |= ioCheckLink; } else { Helper.Flags &= ~ioCheckLink; } SetInsertObjectResults(); UpdateClassIcon(); } // // // void TInsertObjectDlg::BrowseFileClicked() { char* initDirPtr = 0; char initDirBuf[MaxPathLen]; // Save current name // char curName[MaxPathLen]; int nChars = FileName->GetText(curName, sizeof(curName)); // Try to retrieve initial directory from name // if (ValidateInsertFile(false)) { nChars = FileName->GetText(curName, sizeof(curName)); GetFileTitle(curName, Helper.FileName, MaxPathLen); strcpyn(initDirBuf, curName, nChars-strlen(Helper.FileName)); initDirPtr = initDirBuf; } else { // Default to current directory if (getcwd(initDirBuf, MaxPathLen)) initDirPtr = initDirBuf; Helper.FileName[0] = 0; } uint32 flags = OFN_FILEMUSTEXIST; if (Data->Flags & ioShowHelp) flags |= OFN_SHOWHELP; if (BrowseDlg(Helper.FileName, initDirPtr, IDS_FILTERS, flags)) { if (strcmpi(Helper.FileName, curName)) { FileName->SetText(Helper.FileName); Helper.FileSelected = true; if (ValidateInsertFile(true)) { Helper.FileDirty = false; Helper.FileValid = true; UpdateClassIcon(); UpdateClassType(true); Ok->SetFocus(); } else { Helper.FileDirty = false; Helper.FileValid = false; FileName->SetFocus(); FileName->SetSelection(0, -1); } DisplayAsIcon->EnableWindow(true); Ok->EnableWindow(true); } } } // // // void TInsertObjectDlg::DisplayAsIconClicked() { bool isChecked = (DisplayAsIcon->GetCheck()==BF_CHECKED) ? true : false; ChangeIcon->EnableWindow(isChecked); // Update flags // if (isChecked) Helper.Flags |= ioCheckDisplayAsIcon; else Helper.Flags &= ~ioCheckDisplayAsIcon; if (Helper.Flags & ioSelectCreateNew) Helper.AsIconNew = isChecked; else Helper.AsIconFile = isChecked; if (isChecked) { if (Helper.Flags & ioSelectCreateFromFile) { if (ValidateInsertFile()) { Helper.FileDirty = false; Helper.FileValid = true; UpdateClassIcon(); UpdateClassType(true); } else { Helper.AsIconFile = false; Helper.FileDirty = false; Helper.FileValid = false; IconImage->SetMetaPict(0); UpdateClassType(false); Helper.Flags &= ~ioCheckDisplayAsIcon; DisplayAsIcon->Uncheck(); FileName->SetFocus(); FileName->SetSelection(0, -1); return; } } else { // ioSelectCreateNew UpdateClassIcon(); } } SetInsertObjectResults(); Activate(ChangeIcon, isChecked); Activate(IconImage, isChecked); } // // // void TInsertObjectDlg::ChangeIconClicked() { if (Helper.Flags & ioSelectCreateFromFile) { if (Helper.FileDirty && !ValidateInsertFile()) { Helper.FileDirty = true; FileName->SetFocus(); FileName->SetSelection(0, -1); return; } else { Helper.FileDirty = false; } } TChangeIconDlg::TData chgIconData; chgIconData.MetaPict = IconImage->GetMetaPict(); chgIconData.Flags = ciSelectCurrent; if (Helper.Flags & ioShowHelp) chgIconData.Flags |= ciShowHelp; if (Helper.Flags & ioSelectCreateNew) { GetCurrentCLSID(chgIconData.ClsId); } else { // ioSelectCreateFromFile char fileName[MaxPathLen]; if (FileName->GetText(fileName, sizeof(fileName))) { if (GetClassFile(fileName, &chgIconData.ClsId) == S_OK) { char* extension; int nameLen = strlen(fileName); extension = fileName+nameLen+1; while((extension > fileName) && (*extension != '.')) extension--; if (GetAssociatedExecutable(extension, chgIconData.IconExe)) { chgIconData.Flags |= ciUseIconExe; } } } } TRY { TChangeIconDlg chgIconDlg(this, chgIconData); if (chgIconDlg.Execute() == IDOK) { IconImage->SetMetaPict(chgIconData.MetaPict); if (Helper.Flags & ioSelectCreateNew) { int index = ObjectList->GetSelIndex(); if (index != LB_ERR) { ObjectList->SetItemData(index, (uint32)chgIconData.MetaPict); } } } } CATCH( (xmsg& msg){ GetModule()->Error(msg, 0); } ) } // // // void TInsertObjectDlg::ObjectListChanged() { UpdateClassIcon(); SetInsertObjectResults(); } // // // void TInsertObjectDlg::ObjectListDoubleClicked() { SendNotification(IDOK, BN_CLICKED, GetDlgItem(IDOK)); } // // // void TInsertObjectDlg::FileNameChanged() { bool hasText = FileName->GetLineLength(0) ? true : false; Helper.FileDirty = true; Helper.FileValid = false; Helper.FileSelected = hasText; Link->EnableWindow(hasText); DisplayAsIcon->EnableWindow(hasText); ChangeIcon->EnableWindow(hasText); Ok->EnableWindow(hasText); } // // // void TInsertObjectDlg::FileNameKillFocus() { if (ValidateInsertFile(false)) { Helper.FileDirty = false; Helper.FileValid = true; UpdateClassIcon(); UpdateClassType(true); } else { Helper.FileDirty = false; Helper.FileValid = false; UpdateClassType(false); } } // // Initialized helper object used internally by TInsertObjectDlg // TInsertObjectDlg::THelper::THelper() { Flags = 0; ClsId = CLSID_NULL; FileName[0] = 0; FileSelected = false; AsIconNew = false; AsIconFile = false; FileDirty = true; FileValid = false; MetaPict = 0; }