//---------------------------------------------------------------------------- // ObjectWindows // (C) Copyright 1994 by Borland International, All Rights Reserved // // Base OLE UI dialog class definitions //---------------------------------------------------------------------------- #if !defined(OWL_OLEDLG_H) #define OWL_OLEDLG_H #if !defined(OWL_OPENSAVE_H) # include #endif #if !defined(OWL_CONTROL_H) # include #endif #if !defined(OWL_GDIOBJEC_H) # include #endif #if !defined(OCF_OCVIEW_H) # include #endif #include class _OWLCLASS TWindow; class _OWLCLASS TEdit; class _OWLCLASS TStatic; class _OWLCLASS TButton; class _OWLCLASS TRadioButton; class _OWLCLASS TCheckBox; class _OWLCLASS TListBox; // // Constants // const int MaxLinkTypes = 8; // Max # of link types const int MaxPathLen = 256; // Max length of file name const int MaxKeyLen = 256; // Max lenght of reg. key const int LoadStringLen = 256; // Default length buffer for LoadStrings const int MaxLabelLen = 40; // Max length of icon label const int MaxUnknownLen = 100; // Max Length of UnknownType string const int CLSIDStringLen = 39; // Length of string CLSID const int GenericBufferLen= 1024; // Generic scratch buffer length const int cxIconPad = 12; // x-padding in TIconListBox const int cyIconPad = 4; // y-padding in TIconListBox const int LinkTypeLen = 20; // Hold "Automatic" or "Manual" const int LinksListCols = 3; // Number of Column in Edit Links Dlg const int PrefixSize = 8; // Used for Chopping text const int MaxFormatEtc = 20; // Max. # of FormatEtc const int HiMetricPerInch = 2540; extern const char ClsIdStr[]; // "\\CLSID" Helpful when RegDB-searching // // Clipboard Format Strings // #if !defined(CF_EMBEDSOURCE) # define CF_EMBEDSOURCE "Embed Source" #endif #if !defined(CF_EMBEDDEDOBJECT) # define CF_EMBEDDEDOBJECT "Embedded Object" #endif #if !defined(CF_LINKSOURCE) # define CF_LINKSOURCE "Link Source" #endif #if !defined(CF_CUSTOMLINKSOURCE) # define CF_CUSTOMLINKSOURCE "Custom Link Source" #endif #if !defined(CF_OBJECTDESCRIPTOR) # define CF_OBJECTDESCRIPTOR "Object Descriptor" #endif #if !defined(CF_LINKSRCDESCRIPTOR) # define CF_LINKSRCDESCRIPTOR "Link Source Descriptor" #endif #if !defined(CF_OWNERLINK) # define CF_OWNERLINK "OwnerLink" #endif #if !defined(CF_FILENAME) # define CF_FILENAME "FileName" #endif #if !defined(NEXTCBVIEWER) # define NEXTCBVIEWER "NextCBViewer" #endif // // Forward referenced classes // class _OWLCLASS TIconListBox; // // // Class TOleDialog // ----- ---------- // Base class of OLE dialogs // class _USERCLASS TOleDialog : public TDialog { public: TOleDialog(TWindow* parent, TResId templateId, const char far *title = 0, TModule *module = 0); // // Disable modeless usage // HWND DoCreate() { return 0; } // // Force derive class to redefine // int DoExecute() = 0; protected: void SetupWindow(); void CleanupWindow(); // // Event handlers to allow proper cleanup prior to closing the dialog // void CmOk(); virtual bool OleDlgOk() = 0; // // To Enable/Show or Disable/Hide a control // void Activate(TWindow*, bool); // // OLE 2.0 Wrappers to simplify Dlg. management // [Based on OLESTD, OLE2UI, BOleService etc.] // HGLOBAL GetIconFromClass(REFCLSID clsid, const char far* label, bool useType); HGLOBAL GetIconFromFile(const char far* path, bool useFile); HGLOBAL FillObjectDescriptorFromData(LPDATAOBJECT dataObject, LPSTGMEDIUM medium, CLIPFORMAT FAR *cfFmt); HGLOBAL GetObjectDescriptorData(CLSID clsid, DWORD dwDrawAspect, SIZEL sizel, POINTL pointl, DWORD dwStatus, LPSTR lpszFullUserTypeName, LPSTR lpszSrcOfCopy); uint GetAuxUserType(REFCLSID clsid, WORD auxUserType, char far* lpszAuxUserType, int len, HKEY hkey); uint GetUserTypeOfClass(REFCLSID clsid, char far* lpszUserStr, uint len); HGLOBAL GetData(LPDATAOBJECT dataObj, CLIPFORMAT cfFormat, DVTARGETDEVICE FAR *targetDevice, DWORD aspect, LPSTGMEDIUM medium); // // Helper routines shared by OLE Dialogs // HFILE DoesFileExist(const char* filename, OFSTRUCT& ofs); char far* PtrToNthField(char far*, int nField, char chDelim); int ErrorWithFile(uint strId, const char* fileName, uint mbFlags = MB_OK); void OpenFileError(uint errCode, const char* fileName); bool BrowseDlg(char* file, char* initialDir, uint filterId, uint32 flags); int PopupMessage(uint idMsg, uint idTitle, uint mbFlags); int GetTextWSize(TDC &dc, char far* lpsz); char far* ChopText(TWindow&, int widdth, char far* str); char far* AnsiPrev(const char far* start, const char far* current); char far* AnsiNext(const char far* current); // // Near versions of few helpers from above [used in MEDIUM model] // #if defined(BI_DATA_NEAR) char* ChopText(TWindow&, int width, char* str); char* AnsiPrev(const char* start, const char* current); char* AnsiNext(const char* current); #endif // // Clipboard formats // static uint16 cfObjectDescriptor; static uint16 cfLinkSrcDescriptor; static uint16 cfEmbedSource; static uint16 cfEmbeddedObject; static uint16 cfLinkSource; static uint16 cfOwnerLink; static uint16 cfFileName; static bool cfInit; // // Non-bold font for static controls // TFont* Font; // // Dialog's title // const char far* ODTitle; DECLARE_RESPONSE_TABLE(TOleDialog); }; // // Class TIconImage // ----- ---------- // Simple control which displays an OLE Icon [which is really a metafile // with embedded icon and label]. // class TIconImage : public TControl { public: TIconImage(TWindow* parent, int resourceId, TModule* module = 0); void GetWindowClass(WNDCLASS& wndclass); char far* GetClassName(); bool SetMetaPict(HGLOBAL hMetaPict, bool deleteOld = false); HGLOBAL GetMetaPict() const { return MetaPict; } protected: void EvPaint(); bool EvEraseBkgnd(HDC); private: HGLOBAL MetaPict; DECLARE_RESPONSE_TABLE(TIconImage); }; // // Indices of the predefined bitmap used by TResultImage // const uint riNone = 0xffff; const uint riPaste = 0; const uint riEmbed = 1; const uint riEmbedIcon = 2; const uint riLink = 3; const uint riLinkIcon = 4; // // Class TResultImage // ----- ------------ // Control which simply displays a bitmap leaving one of the colors as // transparent. Can also only display part of the bitmap if the latter // is a *bitmap of smaller bitmaps*. // class _USERCLASS TResultImage : public TControl { public: TResultImage(TWindow* parent, int resourceId, TModule* module = 0); ~TResultImage(); void GetWindowClass(WNDCLASS& wndclass); char far* GetClassName(); void SetBitmap(TResId resId, TColor transparent = TColor::Black, uint numRows = 0, uint index = 0, TAutoDelete = AutoDelete); void SetBitmapIndex(uint); protected: void EvPaint(); void SetupWindow(); TBitmap *Bitmap; bool ShouldDelete; uint NumRows, CurIndex, CX, CY; TColor ClearColor; DECLARE_RESPONSE_TABLE(TResultImage); }; // // Class TOleMetaPict // ----- ------------ // Helper class providing methods to manipulate an OLE Icon [which is // really a metafile with embedded icon, label and icon source info] // class _USERCLASS TOleMetaPict { public: TOleMetaPict(HICON hIcon, char far* lpszLabel, TAutoDelete = AutoDelete); TOleMetaPict(HGLOBAL metaPict, TAutoDelete = NoAutoDelete); ~TOleMetaPict(); // // Conversion operator to underlying/native type // operator HGLOBAL() const { return MetaPict; } bool Draw(TDC &dc, TRect &rect, bool IconOnly) const; int ExtractLabel(char far* label, uint32* wrap=0) const; HICON ExtractIcon(HINSTANCE) const; bool ExtractIconSource(char far* source, uint& index) const; static bool Free(HGLOBAL& metaPict); protected: HGLOBAL MetaPict; bool ShouldDelete; }; // // ChangeIcon Data Flags // enum TChangeIconFlags { ciShowHelp = 0x0001, ciSelectCurrent = 0x0002, ciSelectDefault = 0x0004, ciSelectFromFile= 0x0008, ciUseIconExe = 0x0010, }; // // Class TChangeIconDlg // ----- -------------- // class _USERCLASS TChangeIconDlg : public TOleDialog { public: class _USERCLASS TData { public: TData(); uint32 Flags; // Data Flags HGLOBAL MetaPict; // *The* image CLSID ClsId; // Class for Default Icon char IconExe[MaxPathLen]; // File to extract icon from }; TChangeIconDlg(TWindow* parent, TData& data, TResId templateId = 0, const char far* title = 0, TModule* module = 0); ~TChangeIconDlg(); int DoExecute(); protected: void SetupWindow(); void CleanupWindow(); bool OleDlgOk(); void SetIcon(TStatic&, HICON); uint FillIconList(const char*); void UpdateResultIcon(TChangeIconFlags); void CurrentClicked(); void DefaultClicked(); void FromFileClicked(); void LabelKillFocus(); void FileNameNotification(uint); void IconListSetFocus(); void IconListSelChange(); void IconListDblClk(); void BrowseClicked(); TData& Data; TStatic* CurrentIcon; TStatic* DefaultIcon; TRadioButton* Current; TRadioButton* Default; TRadioButton* FromFile; TEdit* FileName; TIconListBox* IconList; TEdit* Label; TStatic* ResultIcon; TStatic* ResultLabel; TButton* Help; TButton* Browse; private: // // Used internally to keep track of dialog's state // class _USERCLASS THelper { public: THelper(); uint32 Flags; HICON CurIcon; char Label[MaxLabelLen+1]; char File[MaxPathLen]; uint IconIndex; HICON DefIcon; char DefIconFile[MaxPathLen]; uint DefIconIndex; }; THelper& Helper; DECLARE_RESPONSE_TABLE(TChangeIconDlg); }; // // Enumerations used to populate Flags member of TInsertObjectDlg::TData // enum TInsertObjectFlags { ioShowHelp = 0x0001, ioSelectCreateNew = 0x0002, ioSelectCreateFromFile= 0x0004, ioCheckLink = 0x0008, ioCheckDisplayAsIcon = 0x0010, ioDisableLink = 0x0100, ioVerifyServerExist = 0x0200, ioDisableDisplayAsIcon= 0x0400 }; // // Class TInsertObjectDlg // ----- ---------------- // class _USERCLASS TInsertObjectDlg : public TOleDialog { public: // // Class TData (InsertObject Data) // ----- ----- ------------- ----- // class _USERCLASS TData { public: TData(); uint32 Flags; CLSID ClsId; char far* FileName; LPCLSID lpClsIdExclude; uint cClsIdExclude; HGLOBAL MetaPict; }; TInsertObjectDlg(TWindow* parent, TOcInitInfo &initInfo, TData *insObj = 0, TResId templateId = 0, const char far* title = 0, TModule* module = 0); ~TInsertObjectDlg(); int DoExecute(); protected: bool EvInitDialog(HWND); void CleanupWindow(); bool OleDlgOk(); int FillClassList(); bool ToggleObjectSource(TInsertObjectFlags); void UpdateClassType(bool); void UpdateClassIcon(); void SetInsertObjectResults(); bool ValidateInsertFile(bool showErr=true); bool GetCurrentCLSID(CLSID&); // // Response Methods // void CreateNewClicked(); void CreateFromFileClicked(); void BrowseFileClicked(); void LinkToFileClicked(); void DisplayAsIconClicked(); void ChangeIconClicked(); void ObjectListChanged(); void ObjectListDoubleClicked(); void FileNameChanged(); void FileNameKillFocus(); TOcInitInfo& InitInfo; TData* Data; TCheckBox* DisplayAsIcon; TButton* ChangeIcon; TButton* Browse; TCheckBox* Link; TStatic* File; TStatic* FileType; TEdit* FileName; TListBox* ObjectList; TStatic* ObjectType; TStatic* ResultText; TResultImage* ResultImage; TIconImage* IconImage; TButton* Help; TButton* Ok; TRadioButton* CreateNew; TRadioButton* CreateFromFile; private: bool GetDefaultInsertObjectData(); // // Class THelper // ----- ------- // Used internally to keep track of dialog's state // class _USERCLASS THelper { public: THelper(); uint32 Flags; CLSID ClsId; char FileName[MaxPathLen]; bool FileSelected; bool AsIconNew; bool AsIconFile; bool FileDirty; bool FileValid; uint ErrCode; HGLOBAL MetaPict; }; THelper& Helper; bool DeleteData; static OLECHAR DynamicScopePath[MaxPathLen]; static CLSID DynamicScopeClsid; DECLARE_RESPONSE_TABLE(TInsertObjectDlg); }; // // Enumeration flags for Flags member of TConvertDlg::TData // enum TConvertFlags { cvShowHelpButton = 0x0001, cvSetConvertDefault = 0x0002, cvSetActivateDefault = 0x0004, cvSelectConvertTo = 0x0008, cvSelectActivateAs = 0x0010, cvDisableDisplayAsIcon= 0x0020, cvDisableActivateAs = 0x0040 }; // // Class TConvertDlg // ----- ----------- // class _USERCLASS TConvertDlg : public TOleDialog { public: // // Class TData // ----- ----- // class _USERCLASS TData { public: TData(TOcPart& ocpart); uint32 Flags; CLSID ClsId; CLSID ClsIdConvertDefault; CLSID ClsIdActivateDefault; CLSID ClsIdNew; uint32 dvAspect; WORD wFormat; bool fIsLinkedObject; HGLOBAL MetaPict; LPSTR lpszUserType; bool fObjectsIconChanged; LPSTR lpszDefLabel; uint ClsIdExclude; LPCLSID lpClsIdExclude; }; TConvertDlg(TWindow* parent, TData& data, TResId templateId = 0, const char far* title = 0, TModule* module = 0); ~TConvertDlg(); void SetupWindow(); void CleanupWindow(); protected: uint FillClassList(); void UpdateClassIcon(); bool IsValidClassID(CLSID); void SetConvertResults(); bool FormatIncluded(char* str, WORD wFormat); TStatic* ObjectType; TListBox* ConvertList; TListBox* ActivateList; TCheckBox* DisplayAsIcon; TStatic* ResultText; TStatic* ResultIcon; TStatic* IconLabel1; TStatic* IconLabel2; TRadioButton* ConvertTo; TRadioButton* ActivateAs; TButton* ChangeIcon; TButton* Help; TData& Data; private: // // Class used internally to keep track of dialog state // class _USERCLASS THelper { public: THelper(){ memset(this, 0, sizeof(THelper)); } uint32 Flags; TListBox* VisibleList; TListBox* InvisibleList; CLSID ClsId; DWORD dvAspect; bool fCustomIcon; uint IconIndex; LPSTR lpszIconSource; LPSTR lpszCurrentObject; LPSTR lpszConvertDefault; LPSTR lpszActivateDefault; }; THelper& Helper; DECLARE_RESPONSE_TABLE(TConvertDlg); }; // // Enumerations used to populate Flags member of TPasteSpecialDlg::TData // enum TPasteSpecialFlags { psShowHelp = 0x0001, psSelectPaste = 0x0002, psSelectPasteLink = 0x0004, psCheckDisplayAsIcon = 0x0008, psDisableDisplayAsIcon= 0x0010 }; // // // enum TOleUIPasteFlag { pfPasteOnly = 0, pfLinkType1 = 1, pfLinkType2 = 2, pfLinkType3 = 4, pfLinkType4 = 8, pfLinkType5 = 16, pfLinkType6 = 32, pfLinkType7 = 64, pfLinkType8 = 128, pfPaste = 512, pfLinkAnyType = 1024, pfEnableIcon = 2048 }; // // Class TPasteSpecialDlg // ----- ---------------- // class _USERCLASS TPasteSpecialDlg : public TOleDialog { public: class _USERCLASS TPasteEntry; // // Class TData (TPasteSpecialDlg Data) // ----- ----- ----------------- ----- // class _USERCLASS TData { public: TData(); uint32 Flags; LPDATAOBJECT lpSrcDataObj; TPasteEntry FAR* ArrayPasteEntries; int cPasteEntries; uint far* ArrayLinkTypes; int cLinkTypes; LPCLSID lpClsIdExclude; uint cClsIdExclude; int SelectedIndex; bool fLink; HGLOBAL MetaPict; SIZEL SizeL; }; protected: // // Class TPasteEntry // ----- ----------- // class _USERCLASS TPasteEntry { public: TPasteEntry(); FORMATETC fmtetc; LPCSTR lpstrFormatName; LPCSTR lpstrResultText; DWORD dwFlags; DWORD dwScratchSpace; }; // // Class TPasteListItemData // ----- ------------------ // class _USERCLASS TPasteListItemData { public: TPasteListItemData(); int nPasteEntriesIndex; bool fCntrEnableIcon; }; public: TPasteSpecialDlg(TWindow* parent, TOcInitInfo &initInfo, TData *data = 0, TResId templateId = 0, const char far* title = 0, TModule* module = 0); ~TPasteSpecialDlg(); int DoExecute(); protected: bool EvInitDialog(HWND); void CleanupWindow(); bool OleDlgOk(); bool GetDefaultPasteSpecialData(); bool TogglePasteType(TPasteSpecialFlags); void ChangeListSelection(); void EnableDisplayAsIcon(); void ToggleDisplayAsIcon(); void SetPasteSpecialHelpResults(); bool FillPasteList(); bool FillPasteLinkList(); bool AddPasteListItem(TListBox&, bool, int, const char far*); void FreeListData(TListBox&); bool HasPercentS(const char far*); void MarkPasteEntryList(LPDATAOBJECT lpSrcDataObj, TPasteEntry far* lpPriorityList, int cEntries); void EvDrawClipboard(); void EvChangeCBChain(HWND hwndRemoved, HWND hwndNext); void ChangeIconClicked(); void PasteClicked(); void PasteLinkClicked(); void DisplayAsIconClicked(); void DisplayListSelChange(); void DisplayListDblClk(); TCheckBox* DisplayAsIcon; TButton* ChangeIcon; TRadioButton* Paste; TRadioButton* PasteLink; TResultImage* ResultImage; TIconImage* IconImage; TListBox* DisplayList; TListBox* PasteList; TListBox* PasteLinkList; TStatic* ResultText; TStatic* SourceText; TButton* Help; TOcInitInfo &InitInfo; TData *Data; private: // // Used internally to keep track of dialog's state // struct _USERCLASS THelper { public: THelper(); uint32 Flags; int PasteListCurSel; int PasteLinkListCurSel; int SelectedIndex; bool Link; char UnknownType[MaxUnknownLen]; char UnknownSource[MaxUnknownLen]; char AppName[MaxKeyLen]; CLSID ClsIdOD; SIZEL SizeLOD; char far* FullUserTypeNameOD; char far* SourceOfDataOD; bool SrcAspectIconOD; bool SrcOnlyIconicOD; HGLOBAL MetaPictOD; HGLOBAL ObjDesc; CLSID ClsIdLSD; SIZEL SizeLLSD; char far* FullUserTypeNameLSD; char far* SourceOfDataLSD; bool SrcAspectIconLSD; bool SrcOnlyIconicLSD; HGLOBAL MetaPictLSD; HGLOBAL LinkSrcDesc; bool ClipboardChanged; }; THelper& Helper; // // Used internally if no TData* is specified // bool DeleteData; TPasteEntry *pOleUIEntries; TOcFormatInfo* pBOleEntries; uint *pBOleLinkEntries; DECLARE_RESPONSE_TABLE(TPasteSpecialDlg); }; #if !defined(LPOLEUILINKCONTAINER) // IOleUILinkContainer Interface // ----------------------------- // This interface must be implemented by container applications that // want to use the EditLinks dialog. the EditLinks dialog calls back // to the container app to perform the OLE functions to manipulate // the links within the container. The OWL Edit Links Dialog uses // Bolero's implementation of this interface. // #define LPOLEUILINKCONTAINER IOleUILinkContainer FAR* #undef INTERFACE #define INTERFACE IOleUILinkContainer DECLARE_INTERFACE_(IOleUILinkContainer, IUnknown) { //*** IUnknown methods ***/ STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj) PURE; STDMETHOD_(ULONG,AddRef) (THIS) PURE; STDMETHOD_(ULONG,Release) (THIS) PURE; STDMETHOD_(DWORD,GetNextLink) (THIS_ DWORD dwLink) PURE; STDMETHOD(SetLinkUpdateOptions) (THIS_ DWORD dwLink, DWORD dwUpdateOpt) PURE; STDMETHOD(GetLinkUpdateOptions) (THIS_ DWORD dwLink, DWORD FAR* lpdwUpdateOpt) PURE; STDMETHOD(SetLinkSource) (THIS_ DWORD dwLink, LPSTR lpszDisplayName, ULONG lenFileName, ULONG FAR* pchEaten, BOOL fValidateSource) PURE; STDMETHOD(GetLinkSource) (THIS_ DWORD dwLink, LPSTR FAR* lplpszDisplayName, ULONG FAR* lplenFileName, LPSTR FAR* lplpszFullLinkType, LPSTR FAR* lplpszShortLinkType, BOOL FAR* lpfSourceAvailable, BOOL FAR* lpfIsSelected) PURE; STDMETHOD(OpenLinkSource) (THIS_ DWORD dwLink) PURE; STDMETHOD(UpdateLink) (THIS_ DWORD dwLink, BOOL fErrorMessage, BOOL fErrorAction) PURE; STDMETHOD(CancelLink) (THIS_ DWORD dwLink) PURE; }; #endif // !defined LPOLEUILINKCONTAINER // // Enumeration used to populate dwFlags member of TEditLinksDlg::TData // enum TEditLinksFlags { elShowHelp = 0x0001, elDisableUpdateNow = 0x0002, elDisableOpenSource = 0x0004, elDisableChangeSource= 0x0008, elDisableCancelLink = 0x0010 }; // // Class TEditLinksDlg // ----- ------------- // class _USERCLASS TEditLinksDlg : public TOleDialog { public: // // Class TEditLinksDlg::TData // ----- -------------------- // Class used to pass in the necessary information to the // EditLinks dialog. // class _USERCLASS TData { public: TData(const TOcView&); ~TData(); uint32 dwFlags; LPOLEUILINKCONTAINER lpOleUILinkContainer; }; TEditLinksDlg(TWindow* parent, const TOcView& ocView, TResId templateId = 0, const char far* title = 0, TModule* module = 0); ~TEditLinksDlg(); int DoExecute(); bool OleDlgOk() {return true;} protected: bool EvInitDialog(HWND); void DrawLinksListEntry(DRAWITEMSTRUCT far&); void EvMeasureItem(uint, MEASUREITEMSTRUCT far&); void EvDrawItem(uint, DRAWITEMSTRUCT far&); LRESULT EvCompareItem(uint, COMPAREITEMSTRUCT far&); void EvDeleteItem(uint, DELETEITEMSTRUCT far&); void ChangeSourceClicked(); void AutomaticClicked(); void ManualClicked(); void BreakLinkClicked(); void UpdateNowClicked(); void OpenSourceClicked(); private: // // Used internally to store information about a particular link // class _USERCLASS TLinkInfo { public: TLinkInfo(DWORD); ~TLinkInfo(); uint32 dwLink; char* lpszDisplayName; char* lpszItemName; char* lpszShortFileName; char* lpszShortLinkType; char* lpszFullLinkType; char* lpszAMX; uint32 clenFileName; bool fSourceAvailable; bool fIsAuto; bool fIsMarked; bool fDontFree; bool fIsSelected; }; // // Used internally to keep track of dialog's state // class _USERCLASS THelper { public: THelper(); bool fClose; int *rgIndex; int cSelItems; bool fItemsExist; char szClose[50]; }; // // Class TChgSrcFileOpenDlg // ----- ------------------ // This customized version of the FileOpen dialog performs // validation on the file name entered. It is used when the // user decides to change the source of a Link. // class _USERCLASS TChgSrcFileOpenDlg : public TFileOpenDialog { public: // // Class TChgSrcData // ----- ----------- // class _USERCLASS TChgSrcData { public: TChgSrcData(TLinkInfo far*, TEditLinksDlg::TData&); TEditLinksDlg::TLinkInfo far* lpLI; TEditLinksDlg::TData& Data; bool fValidLink; char* lpszFrom; char* lpszTo; }; TChgSrcFileOpenDlg(TWindow* parent, TData& data, TChgSrcData& chgSrcData, TResId templateId = 0, const char far* title = 0, TModule* module = 0); ~TChgSrcFileOpenDlg(); protected: void SetupWindow(); TChgSrcData& ChgSrcData; private: // // Class THelper // ----- ------- // class _USERCLASS THelper { public: THelper() { memset(this, 0, sizeof(THelper)); } bool fValidLink; char szFileName[MaxPathLen]; char szItemName[MaxPathLen]; bool bFileNameStored; bool bItemNameStored; char szEdit[MaxPathLen]; LPSTR lpszFrom; LPSTR lpszTo; }; THelper& Helper; }; protected: bool Container_ChangeSource(); HRESULT Container_AutomaticManual(bool fAutoMan); HRESULT Container_UpdateNow(); HRESULT Container_OpenSource(); int AddLinkLBItem(TLinkInfo* lpLinkInfo, bool sel); void UpdateLinkLBItem(int nIndex, bool bSelect); void ChangeAllLinks(char* from, char* to); bool ChangeSource(char* file, TChgSrcFileOpenDlg::TChgSrcData&, uint); void BreakString(TLinkInfo*); HRESULT CancelLink(); int GetSelectedItems(int* &); void InitControls(); void DiffPrefix(const char*, const char*, char* &, char* &); int LoadLinkLB(); void RefreshLinkLB(); int LBPad() const; TListBox* LinksList; TButton* UpdateBtn; TButton* OpenBtn; TButton* ChangeBtn; TButton* BreakLinkBtn; TButton* Help; TButton* Cancel; TRadioButton* Automatic; TRadioButton* Manual; TStatic* LinkSource; TStatic* LinkType; int nColPos[LinksListCols]; int nMaxCharWidth, nHeightLine; TData* Data; private: THelper& Helper; DECLARE_RESPONSE_TABLE(TEditLinksDlg); }; //---------------------------------------------------------------------------- // Inlines // // // // inline HGLOBAL TOleDialog::GetIconFromClass(REFCLSID clsid, const char far* label, bool useType) { return ::OleGetIconOfClass(clsid, OleStr(const_cast(label)), useType); } // // // inline HGLOBAL TOleDialog::GetIconFromFile(const char far* path, bool useFile) { return ::OleGetIconOfFile(OleStr(const_cast(path)), useFile); } // // // inline char far* TOleDialog::AnsiPrev(const char far* start, const char far* current) { return ::AnsiPrev(start, current); } // // // inline char far* TOleDialog::AnsiNext(const char far* current) { return ::AnsiNext(current); } #if defined(BI_DATA_NEAR) // // // inline char* TOleDialog::AnsiPrev(const char* start, const char* current) { char far* str = ::AnsiPrev(start, current); CHECK(HIWORD(str) == HIWORD(start)); return (char*)(LOWORD(str)); } // // // inline char* TOleDialog::AnsiNext(const char* current) { char far* str = ::AnsiNext(current); CHECK(HIWORD(str) == HIWORD(current)); return (char*)(LOWORD(str)); } // // // inline char* TOleDialog::ChopText(TWindow& win, int width, char* str) { char far* lpstr = str; char far* result = ChopText(win, width, lpstr); CHECK(HIWORD(result) == HIWORD(lpstr)); return (char*)(LOWORD(result)); } #endif // BI_DATA_NEAR // // // inline char far* TResultImage::GetClassName() { return RESULTIMAGE_CLSNAME; } // // // inline char far* TIconImage::GetClassName() { return ICONIMAGE_CLSNAME; } // // // inline HCURSOR HourGlassOn() { HCURSOR oldCursor = ::SetCursor(::LoadCursor(0, IDC_WAIT)); ShowCursor(TRUE); return oldCursor; } // // // inline void HourGlassOff(HCURSOR hCursor) { ShowCursor(FALSE); SetCursor(hCursor); } // // Slight variation of strncpy() which guarantees a NULL-terminated // destination - Returns 0 if the 'maxLen' is only 1. // inline char far* strcpyn(char far* dest, const char far* src, size_t maxLen) { PRECONDITION(!IsBadWritePtr(dest, maxLen)); dest[maxLen-1] = 0; return (maxLen > 1) ? strncpy(dest, src, maxLen-1) : 0; } #if defined(BI_DATA_NEAR) inline char* strcpyn(char* dest, const char* src, size_t maxlen) { char far *lpDest = dest; char far *lpResult = strcpyn(dest, src, maxlen); CHECK(HIWORD(lpResult) == HIWORD(lpDest)); return (char*)(LOWORD(lpResult)); } #endif // // Initialize FORMATETC structure // inline void InitFormatEtc(FORMATETC &fmt, CLIPFORMAT cf, DWORD tymed, LONG lindex = -1, DWORD dwAspect = DVASPECT_CONTENT, DVTARGETDEVICE FAR* ptd = 0) { fmt.cfFormat = cf; fmt.dwAspect = dwAspect; fmt.ptd = ptd; fmt.tymed = tymed; fmt.lindex = lindex; } #endif // __USER_OLEDLG_H