OleInsertObject

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Changelog:
   Ulrich Czekalla ulrich@xxxxxxxxxxxxxxx
   Initial implementation of OleUIInsertObject

Index: dlls/oledlg/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/oledlg/Makefile.in,v
retrieving revision 1.11
diff -u -w -r1.11 Makefile.in
--- dlls/oledlg/Makefile.in	11 Oct 2003 01:09:18 -0000	1.11
+++ dlls/oledlg/Makefile.in	3 Nov 2003 17:30:51 -0000
@@ -3,10 +3,13 @@
 SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = oledlg.dll
-IMPORTS   = kernel32
+IMPORTS   = kernel32 user32 advapi32 ole32 comdlg32 ntdll
 
 C_SRCS = \
+	insobjdlg.c \
 	oledlg_main.c
+
+RC_SRCS = rsrc.rc
 
 @MAKE_DLL_RULES@
 
Index: dlls/oledlg/oledlg_main.c
===================================================================
RCS file: /home/wine/wine/dlls/oledlg/oledlg_main.c,v
retrieving revision 1.8
diff -u -w -r1.8 oledlg_main.c
--- dlls/oledlg/oledlg_main.c	5 Sep 2003 23:08:33 -0000	1.8
+++ dlls/oledlg/oledlg_main.c	3 Nov 2003 17:30:51 -0000
@@ -32,6 +32,28 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(ole);
 
+HINSTANCE OLEDLG_hInstance = 0;
+
+/***********************************************************************
+ *		DllMain
+ */
+BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
+{
+    TRACE("%p 0x%lx %p\n", hinstDLL, fdwReason, fImpLoad);
+
+    switch(fdwReason) {
+    case DLL_PROCESS_ATTACH:
+        OLEDLG_hInstance = hinstDLL;
+        break;
+
+    case DLL_PROCESS_DETACH:
+        OLEDLG_hInstance = 0;
+        break;
+    }
+    return TRUE;
+}
+
+
 /***********************************************************************
  *           OleUIAddVerbMenuA (OLEDLG.1)
  */
@@ -77,16 +99,6 @@
   );
   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
   return FALSE;
-}
-
-/***********************************************************************
- *           OleUIInsertObjectA (OLEDLG.3)
- */
-UINT WINAPI OleUIInsertObjectA(LPOLEUIINSERTOBJECTA lpOleUIInsertObject)
-{
-  FIXME("(%p): stub\n", lpOleUIInsertObject);
-  SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-  return OLEUI_FALSE;
 }
 
 /***********************************************************************
Index: include/oledlg.h
===================================================================
RCS file: /home/wine/wine/include/oledlg.h,v
retrieving revision 1.15
diff -u -w -r1.15 oledlg.h
--- include/oledlg.h	5 Sep 2003 23:15:44 -0000	1.15
+++ include/oledlg.h	3 Nov 2003 17:30:57 -0000
@@ -104,6 +104,25 @@
 #define OLEUI_OK      1 /* OK button pressed */
 #define OLEUI_CANCEL  2 /* Cancel button pressed */
 
+#define OLEUI_ERR_STANDARDMIN           100
+#define OLEUI_ERR_OLEMEMALLOC           100
+#define OLEUI_ERR_STRUCTURENULL         101
+#define OLEUI_ERR_STRUCTUREINVALID      102
+#define OLEUI_ERR_CBSTRUCTINCORRECT     103
+#define OLEUI_ERR_HWNDOWNERINVALID      104
+#define OLEUI_ERR_LPSZCAPTIONINVALID    105
+#define OLEUI_ERR_LPFNHOOKINVALID       106
+#define OLEUI_ERR_HINSTANCEINVALID      107
+#define OLEUI_ERR_LPSZTEMPLATEINVALID   108
+#define OLEUI_ERR_HRESOURCEINVALID      109
+#define OLEUI_ERR_FINDTEMPLATEFAILURE   110
+#define OLEUI_ERR_LOADTEMPLATEFAILURE   111
+#define OLEUI_ERR_DIALOGFAILURE         112
+#define OLEUI_ERR_LOCALMEMALLOC         113
+#define OLEUI_ERR_GLOBALMEMALLOC        114
+#define OLEUI_ERR_LOADSTRING            115
+#define OLEUI_ERR_STANDARDMAX           116
+
 #define OPF_OBJECTISLINK                0x00000001L
 #define OPF_NOFILLDEFAULT               0x00000002L
 #define OPF_SHOWHELP                    0x00000004L
--- /dev/null	2003-01-30 05:24:37.000000000 -0500
+++ dlls/oledlg/rsrc.rc	2003-11-03 12:19:51.000000000 -0500
@@ -0,0 +1,34 @@
+/*
+ * Top level resource file for OLE Dialogs
+ *
+ * Copyright 2003 Ulrich Czekalla for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "winnls.h"
+#include "resource.h"
+
+/*
+ * Everything specific to any language goes
+ * in one of the specific files.
+ * Note that you can and may override resources
+ * which also have a neutral version. This is to
+ * get localized bitmaps for example.
+ */
+#include "cdlg_En.rc"
--- /dev/null	2003-01-30 05:24:37.000000000 -0500
+++ dlls/oledlg/insobjdlg.c	2003-11-03 12:19:51.000000000 -0500
@@ -0,0 +1,628 @@
+/*
+ *	OLEDLG library
+ *
+ *	Copyright 2003	Ulrich Czekalla for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "winreg.h"
+#include "winternl.h"
+#include "winnls.h"
+#include "winerror.h"
+#include "wingdi.h"
+#include "winuser.h"
+#include "wine/debug.h"
+#include "wine/unicode.h"
+
+#include "oledlg.h"
+#include "resource.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(oledlg);
+
+typedef struct
+{
+    HWND hwndSelf;
+    BOOL bObjListInit; /* Object list has been initialized */
+    LPOLEUIINSERTOBJECTA lpOleUIInsertObject;
+
+    HWND hwndObjTypeLBL;
+    HWND hwndObjTypeLB;
+    HWND hwndFileLBL;
+    HWND hwndFileTB;
+    HWND hwndCreateCtrlCB;
+    HWND hwndCreateNewCB;
+    HWND hwndCreateFromFileCB;
+    HWND hwndDisplayIconCB;
+    HWND hwndAddCtrlBTN;
+    HWND hwndBrowseBTN;
+    HWND hwndResultDesc;
+
+} InsertObjectDlgInfo;
+
+INT_PTR CALLBACK UIInsertObjectDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+static LRESULT UIINSOBJDLG_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam);
+static void UIINSERTOBJECTDLG_InitDialog(InsertObjectDlgInfo* pdlgInfo);
+static void UIINSERTOBJECTDLG_SelectCreateCtrl(InsertObjectDlgInfo* pdlgInfo);
+static void UIINSERTOBJECTDLG_SelectCreateFromFile(InsertObjectDlgInfo* pdlgInfo);
+static void UIINSERTOBJECTDLG_SelectCreateNew(InsertObjectDlgInfo* pdlgInfo);
+static BOOL UIINSERTOBJECTDLG_PopulateObjectTypes(InsertObjectDlgInfo* pdlgInfo);
+static void UIINSERTOBJECTDLG_FreeObjectTypes(InsertObjectDlgInfo* pdlgInfo);
+static void UIINSERTOBJECTDLG_SelChange(InsertObjectDlgInfo* pdlgInfo);
+static BOOL UIINSERTOBJECTDLG_OnOpen(InsertObjectDlgInfo* pdlgInfo);
+static void UIINSERTOBJECTDLG_BrowseFile(InsertObjectDlgInfo* pdlgInfo);
+static void UIINSERTOBJECTDLG_AddControl(InsertObjectDlgInfo* pdlgInfo);
+
+typedef HRESULT (*DLLREGISTER)          (void);
+
+extern HINSTANCE OLEDLG_hInstance;
+const char *OleUIInsertObjectInfoStr = "OleUIInsertObjectInfoStr";
+
+/***********************************************************************
+ *           OleUIInsertObjectA (OLEDLG.3)
+ */
+UINT WINAPI OleUIInsertObjectA(LPOLEUIINSERTOBJECTA lpOleUIInsertObject)
+{
+  LRESULT lRes;
+  LPCVOID template;
+  HRSRC hRes;
+  InsertObjectDlgInfo dlgInfo;
+  HANDLE hDlgTmpl = 0;
+
+  if (lpOleUIInsertObject->lpszTemplate || lpOleUIInsertObject->hResource)
+     FIXME("Customized template not supported\n");
+
+  /* Create the dialog from a template */
+  if(!(hRes = FindResourceA(OLEDLG_hInstance,MAKEINTRESOURCEA(UIINSERTOBJECT),
+      (LPSTR)RT_DIALOG)))
+  {
+      return OLEUI_ERR_FINDTEMPLATEFAILURE;
+  }
+
+  if (!(hDlgTmpl = LoadResource(OLEDLG_hInstance, hRes )) ||
+      !(template = LockResource( hDlgTmpl )))
+  {
+      return OLEUI_ERR_LOADTEMPLATEFAILURE;
+  }
+
+  /* Initialize InsertObjectDlgInfo structure */
+  dlgInfo.lpOleUIInsertObject = lpOleUIInsertObject;
+  dlgInfo.bObjListInit = FALSE;
+
+  lRes = DialogBoxIndirectParamA(OLEDLG_hInstance, (LPDLGTEMPLATEA) template,
+      lpOleUIInsertObject->hWndOwner, UIInsertObjectDlgProc,
+      (LPARAM) &dlgInfo);
+
+    /* Unable to create the dialog */
+    if( lRes == -1)
+        return OLEUI_ERR_DIALOGFAILURE;
+
+    return lRes;
+}
+
+
+/***********************************************************************
+ *          UIInsertObjectDlgProc
+ *
+ * OLE UI Insert Object dialog procedure
+ */
+INT_PTR CALLBACK UIInsertObjectDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+  InsertObjectDlgInfo* pdlgInfo = (InsertObjectDlgInfo*) GetPropA(hwnd,OleUIInsertObjectInfoStr);
+
+  switch(uMsg)
+  {
+    case WM_INITDIALOG:
+    {
+        InsertObjectDlgInfo* pdlgInfo = (InsertObjectDlgInfo*)lParam;
+
+        pdlgInfo->hwndSelf = hwnd;
+
+        SetPropA(hwnd, OleUIInsertObjectInfoStr, (HANDLE) pdlgInfo);
+
+        UIINSERTOBJECTDLG_InitDialog(pdlgInfo);
+
+        return 0;
+    }
+
+    case WM_COMMAND:
+      return UIINSOBJDLG_OnWMCommand(hwnd, wParam, lParam);
+
+    case WM_DESTROY:
+      if (pdlgInfo)
+          UIINSERTOBJECTDLG_FreeObjectTypes(pdlgInfo);
+      RemovePropA(hwnd, OleUIInsertObjectInfoStr);
+      return FALSE;
+
+    default :
+      return FALSE;
+  }
+}
+
+
+/***********************************************************************
+ *      UIINSOBJDLG_OnWMCommand
+ *
+ * WM_COMMAND message handler
+ */
+static LRESULT UIINSOBJDLG_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam)
+{
+  WORD wNotifyCode = HIWORD(wParam);
+  WORD wID = LOWORD(wParam);
+  InsertObjectDlgInfo* pdlgInfo = (InsertObjectDlgInfo*) GetPropA(hwnd,OleUIInsertObjectInfoStr);
+
+  switch(wID)
+  {
+    case IDOK:
+      EndDialog(hwnd, UIINSERTOBJECTDLG_OnOpen(pdlgInfo));
+      break;
+
+    case IDCANCEL:
+      EndDialog(hwnd, FALSE);
+      break;
+
+    case IDC_CREATECONTROL:
+      UIINSERTOBJECTDLG_SelectCreateCtrl(pdlgInfo);
+      break;
+
+    case IDC_CREATENEW:
+      UIINSERTOBJECTDLG_SelectCreateNew(pdlgInfo);
+      break;
+
+    case IDC_CREATEFROMFILE:
+      UIINSERTOBJECTDLG_SelectCreateFromFile(pdlgInfo);
+      break;
+
+    case IDC_BROWSE:
+      UIINSERTOBJECTDLG_BrowseFile(pdlgInfo);
+      break;
+
+    case IDC_ADDCONTROL:
+      UIINSERTOBJECTDLG_AddControl(pdlgInfo);
+
+    case IDC_OBJTYPELIST:
+    {
+      if (wNotifyCode == LBN_SELCHANGE)
+        UIINSERTOBJECTDLG_SelChange(pdlgInfo);
+      break;
+    }
+  }
+  return 0;
+}
+
+
+/***********************************************************************
+ *      UIINSERTOBJECTDLG_InitDialog
+ *
+ * Initialize dialog display
+ */
+static void UIINSERTOBJECTDLG_InitDialog(InsertObjectDlgInfo* pdlgInfo)
+{
+  /* Initialize InsertObjectDlgInfo data structure */
+  pdlgInfo->hwndObjTypeLB = GetDlgItem(pdlgInfo->hwndSelf, IDC_OBJTYPELIST);
+  pdlgInfo->hwndObjTypeLBL = GetDlgItem(pdlgInfo->hwndSelf, IDC_OBJTYPELBL);
+  pdlgInfo->hwndFileLBL = GetDlgItem(pdlgInfo->hwndSelf, IDC_FILELBL);
+  pdlgInfo->hwndFileTB = GetDlgItem(pdlgInfo->hwndSelf, IDC_FILE);
+  pdlgInfo->hwndCreateCtrlCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATECONTROL);
+  pdlgInfo->hwndCreateNewCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATENEW);
+  pdlgInfo->hwndCreateFromFileCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_CREATEFROMFILE);
+  pdlgInfo->hwndDisplayIconCB = GetDlgItem(pdlgInfo->hwndSelf, IDC_ASICON);
+  pdlgInfo->hwndAddCtrlBTN = GetDlgItem(pdlgInfo->hwndSelf, IDC_ADDCONTROL);
+  pdlgInfo->hwndBrowseBTN = GetDlgItem(pdlgInfo->hwndSelf, IDC_BROWSE);
+  pdlgInfo->hwndResultDesc = GetDlgItem(pdlgInfo->hwndSelf, IDC_RESULTDESC);
+
+  /* Setup dialog controls based on flags */
+  if (pdlgInfo->lpOleUIInsertObject->lpszCaption)
+     SetWindowTextA(pdlgInfo->hwndSelf, pdlgInfo->lpOleUIInsertObject->lpszCaption);
+
+  ShowWindow(pdlgInfo->hwndCreateCtrlCB, (pdlgInfo->lpOleUIInsertObject->dwFlags &
+    IOF_SHOWINSERTCONTROL) ? SW_SHOW : SW_HIDE);
+  ShowWindow(pdlgInfo->hwndDisplayIconCB, (pdlgInfo->lpOleUIInsertObject->dwFlags &
+    IOF_CHECKDISPLAYASICON) ? SW_SHOW : SW_HIDE);
+  EnableWindow(pdlgInfo->hwndDisplayIconCB, (pdlgInfo->lpOleUIInsertObject->dwFlags &
+    IOF_DISABLEDISPLAYASICON) ? FALSE : TRUE);
+
+  if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATECONTROL)
+    UIINSERTOBJECTDLG_SelectCreateCtrl(pdlgInfo);
+  else if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATEFROMFILE)
+    UIINSERTOBJECTDLG_SelectCreateFromFile(pdlgInfo);
+  else /* (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_SELECTCREATENEW) */
+    UIINSERTOBJECTDLG_SelectCreateNew(pdlgInfo);
+}
+
+
+/***********************************************************************
+ *      UIINSERTOBJECTDLG_SelectCreateCtrl
+ *
+ * Select Create Control Radio Button
+ */
+static void UIINSERTOBJECTDLG_SelectCreateCtrl(InsertObjectDlgInfo* pdlgInfo)
+{
+  ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_HIDE);
+  ShowWindow(pdlgInfo->hwndFileLBL, SW_HIDE);
+  ShowWindow(pdlgInfo->hwndFileTB, SW_HIDE);
+  ShowWindow(pdlgInfo->hwndBrowseBTN, SW_HIDE);
+
+  ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_SHOW);
+  ShowWindow(pdlgInfo->hwndObjTypeLB, SW_SHOW);
+  ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_SHOW);
+
+  SendMessageA(pdlgInfo->hwndCreateCtrlCB, BM_SETCHECK, BST_CHECKED, 0);
+
+  /* Populate object type listbox */
+  if (!pdlgInfo->bObjListInit)
+     UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo);
+}
+
+
+/***********************************************************************
+ *      UIINSERTOBJECTDLG_SelectCreateNew
+ *
+ * Select Create New Radio Button
+ */
+static void UIINSERTOBJECTDLG_SelectCreateNew(InsertObjectDlgInfo* pdlgInfo)
+{
+  ShowWindow(pdlgInfo->hwndFileLBL, SW_HIDE);
+  ShowWindow(pdlgInfo->hwndFileTB, SW_HIDE);
+  ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_HIDE);
+  ShowWindow(pdlgInfo->hwndBrowseBTN, SW_HIDE);
+
+  if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CHECKDISPLAYASICON)
+    ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_SHOW);
+
+  ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_SHOW);
+  ShowWindow(pdlgInfo->hwndObjTypeLB, SW_SHOW);
+
+  SendMessageA(pdlgInfo->hwndCreateNewCB, BM_SETCHECK, BST_CHECKED, 0);
+
+  if (!pdlgInfo->bObjListInit)
+     UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo);
+
+  UIINSERTOBJECTDLG_SelChange(pdlgInfo);
+}
+
+
+/***********************************************************************
+ *      UIINSERTOBJECTDLG_SelectCreateFromFile
+ *
+ * Select Create From File Radio Button
+ */
+static void UIINSERTOBJECTDLG_SelectCreateFromFile(InsertObjectDlgInfo* pdlgInfo)
+{
+  char resstr[MAX_PATH];
+
+  ShowWindow(pdlgInfo->hwndAddCtrlBTN, SW_HIDE);
+  ShowWindow(pdlgInfo->hwndObjTypeLBL, SW_HIDE);
+  ShowWindow(pdlgInfo->hwndObjTypeLB, SW_HIDE);
+
+  if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CHECKDISPLAYASICON)
+    ShowWindow(pdlgInfo->hwndDisplayIconCB, SW_SHOW);
+
+  ShowWindow(pdlgInfo->hwndFileLBL, SW_SHOW);
+  ShowWindow(pdlgInfo->hwndFileTB, SW_SHOW);
+  ShowWindow(pdlgInfo->hwndBrowseBTN, SW_SHOW);
+
+  SendMessageA(pdlgInfo->hwndCreateFromFileCB, BM_SETCHECK, BST_CHECKED, 0);
+
+  if (LoadStringA(OLEDLG_hInstance, IDS_RESULTFILEOBJDESC, resstr, MAX_PATH))
+     SendMessageA(pdlgInfo->hwndResultDesc, WM_SETTEXT, 0, (LPARAM)resstr);
+}
+
+
+/***********************************************************************
+ *      UIINSERTOBJECTDLG_PopulateObjectTypes
+ *
+ * Populate Object Type listbox
+ */
+static BOOL UIINSERTOBJECTDLG_PopulateObjectTypes(InsertObjectDlgInfo* pdlgInfo)
+{
+  DWORD i, len;
+  HKEY hkclsids;
+  HKEY hkey;
+  CLSID clsid;
+  HRESULT ret;
+  CHAR szclsid[128];
+  CHAR keydesc[MAX_PATH];
+  CHAR keyname[MAX_PATH];
+  WCHAR wszclsid[128];
+  DWORD index = 0;
+
+  UIINSERTOBJECTDLG_FreeObjectTypes(pdlgInfo);
+
+  RegOpenKeyExA(HKEY_CLASSES_ROOT, "CLSID", 0, KEY_READ, &hkclsids);
+
+  while (ERROR_SUCCESS == (ret = RegEnumKeyA(hkclsids, index, szclsid, MAX_PATH)))
+  {
+    index++;
+
+    RegOpenKeyExA(hkclsids, szclsid, 0, KEY_READ, &hkey);
+
+    len = MAX_PATH;
+    if (ERROR_SUCCESS != RegQueryValueA(hkey, "Insertable", keyname, &len))
+        continue;
+
+    len = MAX_PATH;
+    if (ERROR_SUCCESS == RegQueryValueA(hkey, "NotInsertable", keyname, &len))
+        continue;
+
+    RtlMultiByteToUnicodeN(wszclsid, MAX_PATH, NULL, szclsid, MAX_PATH); 
+    CLSIDFromString(wszclsid, &clsid);
+
+    for (i = 0; i < pdlgInfo->lpOleUIInsertObject->cClsidExclude; i++)
+      if (IsEqualGUID(&pdlgInfo->lpOleUIInsertObject->lpClsidExclude[i], &clsid))
+        break;
+
+    if (i < pdlgInfo->lpOleUIInsertObject->cClsidExclude)
+      continue;
+
+    len = MAX_PATH;
+    if (ERROR_SUCCESS == RegQueryValueA(hkey, NULL, keydesc, &len))
+    {
+       CLSID* lpclsid = (CLSID*) HeapAlloc(GetProcessHeap(), 0, sizeof(CLSID));
+       memcpy(lpclsid, &clsid, sizeof(CLSID));
+
+       len = SendMessageA(pdlgInfo->hwndObjTypeLB, LB_ADDSTRING, 0, (LPARAM)keydesc);
+       SendMessageA(pdlgInfo->hwndObjTypeLB, LB_SETITEMDATA, (WPARAM)len, (LPARAM)lpclsid);
+    }
+  }
+
+  pdlgInfo->bObjListInit = (ret == ERROR_NO_MORE_ITEMS);
+
+  return pdlgInfo->bObjListInit;
+}
+
+
+/***********************************************************************
+ *      UIINSERTOBJECTDLG_FreeObjectTypes
+ *
+ * Free Object Types listbox
+ */
+static void UIINSERTOBJECTDLG_FreeObjectTypes(InsertObjectDlgInfo* pdlgInfo)
+{
+  UINT i, count;
+
+  count = SendMessageA(pdlgInfo->hwndObjTypeLB, LB_GETCOUNT, (WPARAM)0, (LPARAM)0);
+
+  for (i = 0; i < count; i++)
+  {
+      CLSID* lpclsid = (CLSID*) SendMessageA(pdlgInfo->hwndObjTypeLB, 
+         LB_GETITEMDATA, (WPARAM)i, (LPARAM)0);
+      HeapFree(GetProcessHeap(), 0, lpclsid);
+  }
+}
+
+
+/***********************************************************************
+ *      UIINSERTOBJECTDLG_SelChange
+ *
+ * Handle object type selection change
+ */
+static void UIINSERTOBJECTDLG_SelChange(InsertObjectDlgInfo* pdlgInfo)
+{
+  INT index;
+  CHAR objname[MAX_PATH];
+  CHAR objdesc[MAX_PATH];
+  CHAR resstr[MAX_PATH];
+
+  TRACE("\n");
+
+  if (LoadStringA(OLEDLG_hInstance, IDS_RESULTOBJDESC, resstr, MAX_PATH) &&
+     ((index = SendMessageA(pdlgInfo->hwndObjTypeLB, LB_GETCURSEL, 0, 0)) >= 0) &&
+     SendMessageA(pdlgInfo->hwndObjTypeLB, LB_GETTEXT, (WPARAM)index, (LPARAM)objname))
+       sprintf(objdesc, resstr, objname);
+  else
+    objdesc[0] = 0;
+
+  SendMessageA(pdlgInfo->hwndResultDesc, WM_SETTEXT, 0, (LPARAM)objdesc);
+}
+
+
+/***********************************************************************
+ *      UIINSERTOBJECTDLG_SelChange
+ *
+ * Handle OK Button
+ */
+static BOOL UIINSERTOBJECTDLG_OnOpen(InsertObjectDlgInfo* pdlgInfo)
+{
+  BOOL bret = FALSE;
+
+  if (BST_CHECKED == SendMessageA(pdlgInfo->hwndCreateCtrlCB, BM_GETCHECK, 0, 0) ||
+      BST_CHECKED == SendMessageA(pdlgInfo->hwndCreateNewCB, BM_GETCHECK, 0, 0))
+  {
+    INT index = SendMessageA(pdlgInfo->hwndObjTypeLB, LB_GETCURSEL, 0, 0);
+
+    if (index >= 0)
+    {
+       CLSID* clsid = (CLSID*) SendMessageA(pdlgInfo->hwndObjTypeLB, 
+          LB_GETITEMDATA, (WPARAM)index, 0);
+       memcpy(&pdlgInfo->lpOleUIInsertObject->clsid, clsid, sizeof(CLSID));
+
+       if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CREATENEWOBJECT)
+       {
+          pdlgInfo->lpOleUIInsertObject->sc= OleCreate(
+             &pdlgInfo->lpOleUIInsertObject->clsid,
+             &pdlgInfo->lpOleUIInsertObject->iid,
+             pdlgInfo->lpOleUIInsertObject->oleRender,
+             pdlgInfo->lpOleUIInsertObject->lpFormatEtc,
+             pdlgInfo->lpOleUIInsertObject->lpIOleClientSite,
+             pdlgInfo->lpOleUIInsertObject->lpIStorage,
+             pdlgInfo->lpOleUIInsertObject->ppvObj);
+       }
+
+       bret = TRUE;
+    }
+  }
+  else if (BST_CHECKED == SendMessageA(pdlgInfo->hwndCreateFromFileCB, BM_GETCHECK, 0, 0))
+  {
+    char fname[MAX_PATH];
+
+    if (pdlgInfo->lpOleUIInsertObject->lpszFile)
+    {
+      HRESULT hres;
+      WCHAR wcsFile[MAX_PATH];
+
+      SendMessageA(pdlgInfo->hwndFileTB, WM_GETTEXT, (WPARAM)MAX_PATH, (LPARAM)fname);
+      strncpy(pdlgInfo->lpOleUIInsertObject->lpszFile, fname, pdlgInfo->lpOleUIInsertObject->cchFile);
+
+      RtlMultiByteToUnicodeN(wcsFile, MAX_PATH, NULL, fname, MAX_PATH); 
+      if (ERROR_SUCCESS == (hres = GetClassFile(wcsFile, &pdlgInfo->lpOleUIInsertObject->clsid)))
+      {
+         if (pdlgInfo->lpOleUIInsertObject->dwFlags & IOF_CREATEFILEOBJECT)
+         {
+           hres = OleCreateFromFile(
+             &pdlgInfo->lpOleUIInsertObject->clsid,
+             wcsFile,
+             &pdlgInfo->lpOleUIInsertObject->iid,
+             pdlgInfo->lpOleUIInsertObject->oleRender,
+             pdlgInfo->lpOleUIInsertObject->lpFormatEtc,
+             pdlgInfo->lpOleUIInsertObject->lpIOleClientSite,
+             pdlgInfo->lpOleUIInsertObject->lpIStorage,
+             pdlgInfo->lpOleUIInsertObject->ppvObj);
+         }
+
+         bret = TRUE;
+      }
+      pdlgInfo->lpOleUIInsertObject->sc = hres;
+    }
+  }
+
+  return bret;
+}
+
+
+/***********************************************************************
+ *      UIINSERTOBJECTDLG_BrowseFile
+ *
+ * Browse for the file
+ */
+static void UIINSERTOBJECTDLG_BrowseFile(InsertObjectDlgInfo* pdlgInfo)
+{
+   OPENFILENAMEA fn;
+   char fname[MAX_PATH];
+   char title[32];
+
+   fn.lStructSize = sizeof(OPENFILENAMEA);
+   fn.hwndOwner = pdlgInfo->hwndSelf;
+   fn.hInstance = 0;
+   fn.lpstrFilter = "All Files\0*.*\0\0";
+   fn.lpstrCustomFilter = NULL;
+   fn.nMaxCustFilter = 0;
+   fn.nFilterIndex = 0;
+
+   SendMessageA(pdlgInfo->hwndFileTB, WM_GETTEXT, (WPARAM)MAX_PATH, (LPARAM)fname);
+   fn.lpstrFile = fname;
+   fn.nMaxFile = MAX_PATH;
+
+   fn.lpstrFileTitle = NULL;
+   fn.nMaxFileTitle = 0;
+   fn.lpstrInitialDir = NULL;
+
+   LoadStringA(OLEDLG_hInstance, IDS_BROWSE, title, 32);
+   fn.lpstrTitle = title;
+
+   fn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST |
+      OFN_HIDEREADONLY | OFN_LONGNAMES;
+   fn.nFileOffset = 0;
+   fn.nFileExtension = 0;
+   fn.lpstrDefExt = NULL;
+   fn.lCustData = 0;
+   fn.lpfnHook = NULL;
+   fn.lpTemplateName = NULL;
+
+   if (GetOpenFileNameA(&fn))
+      SendMessageA(pdlgInfo->hwndFileTB, WM_SETTEXT, (WPARAM)0, (LPARAM)fn.lpstrFile);
+}
+
+
+/***********************************************************************
+ *      UIINSERTOBJECTDLG_AddControl
+ *
+ * Add control to Object Type
+ */
+static void UIINSERTOBJECTDLG_AddControl(InsertObjectDlgInfo* pdlgInfo)
+{
+   OPENFILENAMEA fn;
+   char fname[MAX_PATH];
+   char title[32];
+
+   fn.lStructSize = sizeof(OPENFILENAMEA);
+   fn.hwndOwner = pdlgInfo->hwndSelf;
+   fn.hInstance = 0;
+   fn.lpstrFilter = "OLE Controls\0*.ocx\0Libraries\0*.dll\0All Files\0*.*\0\0";
+   fn.lpstrCustomFilter = NULL;
+   fn.nMaxCustFilter = 0;
+   fn.nFilterIndex = 0;
+
+   fname[0] = 0;
+   fn.lpstrFile = fname;
+   fn.nMaxFile = MAX_PATH;
+
+   fn.lpstrFileTitle = NULL;
+   fn.nMaxFileTitle = 0;
+   fn.lpstrInitialDir = NULL;
+
+   LoadStringA(OLEDLG_hInstance, IDS_BROWSE, title, 32);
+   fn.lpstrTitle = title;
+
+   fn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST |
+      OFN_HIDEREADONLY | OFN_LONGNAMES;
+   fn.nFileOffset = 0;
+   fn.nFileExtension = 0;
+   fn.lpstrDefExt = NULL;
+   fn.lCustData = 0;
+   fn.lpfnHook = NULL;
+   fn.lpTemplateName = NULL;
+
+   if (GetOpenFileNameA(&fn))
+   {
+      HMODULE hMod;
+      BOOL bValid = FALSE;
+
+      hMod = LoadLibraryA(fn.lpstrFile);
+
+      if (hMod)
+      {
+          DLLREGISTER regproc;
+
+          regproc = (DLLREGISTER) GetProcAddress(hMod, "DllRegisterServer");
+          if (regproc)
+          {
+             if (S_OK == regproc())
+             {
+                UIINSERTOBJECTDLG_PopulateObjectTypes(pdlgInfo);
+                bValid = TRUE;
+             }
+          }
+
+          FreeLibrary(hMod);
+      }
+
+      if (!bValid)
+      {
+          char title[32];
+          char msg[256];
+
+          LoadStringA(OLEDLG_hInstance, IDS_NOTOLEMODCAPTION, title, 32);
+          LoadStringA(OLEDLG_hInstance, IDS_NOTOLEMOD, msg, 256);
+
+          MessageBoxA(pdlgInfo->hwndSelf, msg, title, MB_ICONEXCLAMATION);
+      }
+   }
+}
--- /dev/null	2003-01-30 05:24:37.000000000 -0500
+++ dlls/oledlg/resource.h	2003-11-03 12:19:51.000000000 -0500
@@ -0,0 +1,20 @@
+#define IDS_RESULTOBJDESC	        101
+#define IDS_RESULTFILEOBJDESC	        102
+#define IDS_BROWSE                      103
+#define IDS_NOTOLEMOD                   104
+#define IDS_NOTOLEMODCAPTION            105
+
+#define UIINSERTOBJECT                  129
+
+#define IDC_OBJTYPELIST                 1000
+#define IDC_RESULT                      1001
+#define IDC_CREATENEW                   1002
+#define IDC_CREATECONTROL               1003
+#define IDC_CREATEFROMFILE              1004
+#define IDC_OBJTYPELBL                  1005
+#define IDC_RESULTDESC                  1006
+#define IDC_ADDCONTROL                  1007
+#define IDC_ASICON                      1008
+#define IDC_BROWSE                      1009
+#define IDC_FILELBL                     1010
+#define IDC_FILE                        1011
--- /dev/null	2003-01-30 05:24:37.000000000 -0500
+++ dlls/oledlg/cdlg_En.rc	2003-11-03 12:19:51.000000000 -0500
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2003 Ulrich Czekalla for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
+
+UIINSERTOBJECT DIALOG DISCARDABLE  0, 0, 294, 151
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Insert Object"
+FONT 8, "MS Sans Serif"
+BEGIN
+    LISTBOX         IDC_OBJTYPELIST,82,19,131,66,LBS_SORT |
+                    LBS_NOINTEGRALHEIGHT | WS_VISIBLE | WS_VSCROLL |
+                    WS_TABSTOP
+    LTEXT           "Object Type:",IDC_OBJTYPELBL,82,7,53,8,WS_VISIBLE
+    DEFPUSHBUTTON   "OK",IDOK,221,7,66,14
+    PUSHBUTTON      "Cancel",IDCANCEL,221,24,66,14
+    GROUPBOX        "Result",IDC_RESULT,7,103,208,41
+    CONTROL         "Create New",IDC_CREATENEW,"Button",BS_AUTORADIOBUTTON | 
+                    WS_GROUP,7,20,62,10
+    CONTROL         "Create Control",IDC_CREATECONTROL,"Button",
+                    BS_AUTORADIOBUTTON | NOT WS_VISIBLE,7,54,62,10
+    CONTROL         "Create From File",IDC_CREATEFROMFILE,"Button",
+                    BS_AUTORADIOBUTTON,7,37,67,10
+    LTEXT           "",IDC_RESULTDESC,49,112,159,23
+    PUSHBUTTON      "&Add Control...",IDC_ADDCONTROL,81,88,63,14,NOT WS_VISIBLE
+    CONTROL         "Display As Icon",IDC_ASICON,"Button",BS_AUTOCHECKBOX | 
+                    WS_TABSTOP | NOT WS_VISIBLE,223,58,64,10
+    PUSHBUTTON      "Browse...",IDC_BROWSE,83,53,50,14,NOT WS_VISIBLE
+    LTEXT           "File:",IDC_FILELBL,83,27,20,8, NOT WS_VISIBLE
+    EDITTEXT        IDC_FILE,83,37,132,13,ES_AUTOHSCROLL | NOT WS_VISIBLE
+END
+
+STRINGTABLE DISCARDABLE
+{
+  IDS_RESULTOBJDESC	"Insert a new %s object into your document"
+  IDS_RESULTFILEOBJDESC	"Insert the contents of the file as an object into your document so that you may activate it using the program which created it."
+  IDS_BROWSE            "Browse"
+  IDS_NOTOLEMOD         "File does not appear to be a valid OLE module. Unable to register OLE control."
+  IDS_NOTOLEMODCAPTION  "Add Control"
+}
+
+

[Index of Archives]     [Gimp for Windows]     [Red Hat]     [Samba]     [Yosemite Camping]     [Graphics Cards]     [Wine Home]

  Powered by Linux