| Current Path : /var/www/html/prashantkr/TurboC/TCWIN45/SOURCE/OWL/ |
| Current File : /var/www/html/prashantkr/TurboC/TCWIN45/SOURCE/OWL/INSOBJ.CPP |
//----------------------------------------------------------------------------
// ObjectWindows
// (C) Copyright 1993, 1994 by Borland International, All Rights Reserved
//
// Implementation of class TInsertObjectDlg
//----------------------------------------------------------------------------
#define INC_OLE2
#include <owl/owlpch.h>
#include <owl/listbox.h>
#include <owl/radiobut.h>
#include <owl/edit.h>
#include <ocf/ocview.h>
#include <owl/oledlg.h>
#include <owl/except.h>
#include <bwcc.h> // for IDHELP
#include <dir.h>
//
// 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; i<count; i++) {
hMetaPict = (HGLOBAL)ObjectList->GetItemData(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<char> _pe = pExec;
char* pClass= new char[MaxKeyLen];
TPointer<char> _pc = pClass;
char* pKey = new char[MaxKeyLen];
TPointer<char> _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<char> str1 = new char[buffLen];
TPointer<char> str2 = new char[buffLen];
TPointer<char> 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<char> 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<char> 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;
}