annotate dwt/ole/win32/OleClientSite.d @ 300:acf6957f2344

OLE fixes, thanks to Enzo Petrelli.
author Frank Benoit <benoit@tionex.de>
date Thu, 28 Aug 2008 15:12:24 +0200
parents bb89fd34ec82
children 8a2a24a30ea9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1 /*******************************************************************************
246
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
2 * Copyright (c) 2000, 2008 IBM Corporation and others.
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
3 * All rights reserved. This program and the accompanying materials
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
4 * are made available under the terms of the Eclipse Public License v1.0
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
5 * which accompanies this distribution, and is available at
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
6 * http://www.eclipse.org/legal/epl-v10.html
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
7 *
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
8 * Contributors:
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
9 * IBM Corporation - initial API and implementation
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
10 * Port to the D programming language:
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
11 * Frank Benoit <benoit@tionex.de>
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
12 *******************************************************************************/
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
13 module dwt.ole.win32.OleClientSite;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
14
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
15 import dwt.dwthelper.File;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
16 import dwt.dwthelper.FileInputStream;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
17 import dwt.dwthelper.FileOutputStream;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
18 import dwt.dwthelper.utils;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
19
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
20 import dwt.DWT;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
21 import dwt.DWTException;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
22 import dwt.graphics.Point;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
23 import dwt.graphics.Rectangle;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
24 import dwt.internal.Compatibility;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
25 // import dwt.internal.ole.win32.CAUUID;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
26 // import dwt.internal.ole.win32.COM;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
27 // import dwt.internal.ole.win32.COMObject;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
28 // import dwt.internal.ole.win32.GUID;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
29 // import dwt.internal.ole.win32.IDispatch;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
30 // import dwt.internal.ole.win32.IMoniker;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
31 // import dwt.internal.ole.win32.IOleCommandTarget;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
32 // import dwt.internal.ole.win32.IOleDocument;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
33 // import dwt.internal.ole.win32.IOleDocumentView;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
34 // import dwt.internal.ole.win32.IOleInPlaceObject;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
35 // import dwt.internal.ole.win32.IOleLink;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
36 // import dwt.internal.ole.win32.IOleObject;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
37 // import dwt.internal.ole.win32.IPersist;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
38 // import dwt.internal.ole.win32.IPersistStorage;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
39 // import dwt.internal.ole.win32.ISpecifyPropertyPages;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
40 // import dwt.internal.ole.win32.IStorage;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
41 // import dwt.internal.ole.win32.IStream;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
42 // import dwt.internal.ole.win32.IUnknown;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
43 // import dwt.internal.ole.win32.IViewObject2;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
44 // import dwt.internal.ole.win32.OLECMD;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
45 // import dwt.internal.ole.win32.OLEINPLACEFRAMEINFO;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
46 import dwt.internal.win32.OS;
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
47 import dwt.internal.ole.win32.extras;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
48 import dwt.internal.ole.win32.OAIDL;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
49 import dwt.internal.ole.win32.OLEIDL;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
50 import dwt.internal.ole.win32.OBJIDL;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
51 import dwt.internal.ole.win32.DOCOBJ;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
52 import dwt.internal.ole.win32.COM;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
53 import dwt.internal.ole.win32.ifs;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
54
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
55 import dwt.widgets.Composite;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
56 import dwt.widgets.Event;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
57 import dwt.widgets.Listener;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
58 import dwt.widgets.Menu;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
59 import dwt.widgets.Shell;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
60
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
61 import dwt.ole.win32.OleFrame;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
62 import dwt.ole.win32.Variant;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
63 import dwt.ole.win32.OLE;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
64
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
65
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
66 /**
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
67 * OleClientSite provides a site to manage an embedded OLE Document within a container.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
68 *
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
69 * <p>The OleClientSite provides the following capabilities:
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
70 * <ul>
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
71 * <li>creates the in-place editor for a blank document or opening an existing OLE Document
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
72 * <li>lays the editor out
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
73 * <li>provides a mechanism for activating and deactivating the Document
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
74 * <li>provides a mechanism for saving changes made to the document
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
75 * </ul>
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
76 *
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
77 * <p>This object implements the OLE Interfaces IUnknown, IOleClientSite, IAdviseSink,
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
78 * IOleInPlaceSite
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
79 *
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
80 * <p>Note that although this class is a subclass of <code>Composite</code>,
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
81 * it does not make sense to add <code>Control</code> children to it,
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
82 * or set a layout on it.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
83 * </p><p>
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
84 * <dl>
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
85 * <dt><b>Styles</b> <dd>BORDER
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
86 * <dt><b>Events</b> <dd>Dispose, Move, Resize
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
87 * </dl>
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
88 *
246
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
89 * @see <a href="http://www.eclipse.org/swt/snippets/#ole">OLE and ActiveX snippets</a>
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
90 * @see <a href="http://www.eclipse.org/swt/examples.php">DWT Examples: OLEExample, OleWebBrowser</a>
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
91 */
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
92 public class OleClientSite : Composite {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
93
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
94 // Interfaces for this Ole Client Container
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
95 private _IUnknownImpl iUnknown;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
96 private _IOleClientSiteImpl iOleClientSite;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
97 private _IAdviseSinkImpl iAdviseSink;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
98 private _IOleInPlaceSiteImpl iOleInPlaceSite;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
99 private _IOleDocumentSiteImpl iOleDocumentSite;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
100
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
101 protected GUID* appClsid;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
102 private GUID* objClsid;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
103 private int refCount;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
104
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
105 // References to the associated Frame.
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
106 package OleFrame frame;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
107
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
108 // Access to the embedded/linked Ole Object
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
109 protected IUnknown objIUnknown;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
110 protected IOleObject objIOleObject;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
111 protected IViewObject2 objIViewObject2;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
112 protected IOleInPlaceObject objIOleInPlaceObject;
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
113 protected IOleCommandTarget objIOleCommandTarget;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
114 protected IOleDocumentView objDocumentView;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
115
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
116 // Related storage information
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
117 protected IStorage tempStorage; // IStorage interface of the receiver
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
118
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
119 // Internal state and style information
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
120 private int aspect; // the display aspect of the embedded object, e.g., DvaspectContent or DvaspectIcon
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
121 private int type; // Indicates the type of client that can be supported inside this container
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
122 private bool isStatic; // Indicates item's display is static, i.e., a bitmap, metafile, etc.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
123
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
124 private RECT borderWidths;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
125 private RECT indent;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
126 private bool inUpdate = false;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
127 private bool inInit = true;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
128 private bool inDispose = false;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
129
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 162
diff changeset
130 private static const String WORDPROGID = "Word.Document"; //$NON-NLS-1$
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
131
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
132 private Listener listener;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
133
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
134 enum{
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
135 STATE_NONE = 0,
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
136 STATE_RUNNING = 1,
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
137 STATE_INPLACEACTIVE = 2,
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
138 STATE_UIACTIVE = 3,
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
139 STATE_ACTIVE = 4,
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
140 }
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
141 int state = STATE_NONE;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
142
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
143 protected this(Composite parent, int style) {
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
144 /*
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
145 * NOTE: this constructor should never be used by itself because it does
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
146 * not create an Ole Object
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
147 */
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
148 super(parent, style);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
149
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
150 createCOMInterfaces();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
151
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
152 // install the Ole Frame for this Client Site
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
153 while (parent !is null) {
284
bb89fd34ec82 Fix for OLE functionality. Thanks to Enzo Petrelli
Frank Benoit <benoit@tionex.de>
parents: 246
diff changeset
154 if ( auto aframe = cast(OleFrame)parent){
bb89fd34ec82 Fix for OLE functionality. Thanks to Enzo Petrelli
Frank Benoit <benoit@tionex.de>
parents: 246
diff changeset
155 frame = aframe;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
156 break;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
157 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
158 parent = parent.getParent();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
159 }
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
160 if (frame is null) OLE.error (__FILE__, __LINE__, DWT.ERROR_INVALID_ARGUMENT);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
161 frame.AddRef();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
162
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
163 aspect = COM.DVASPECT_CONTENT;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
164 type = COM.OLEEMBEDDED;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
165 isStatic = false;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
166
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
167 listener = new class() Listener {
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
168 public void handleEvent(Event e) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
169 switch (e.type) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
170 case DWT.Resize :
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
171 case DWT.Move : onResize(e); break;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
172 case DWT.Dispose : onDispose(e); break;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
173 case DWT.FocusIn: onFocusIn(e); break;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
174 case DWT.FocusOut: onFocusOut(e); break;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
175 case DWT.Paint: onPaint(e); break;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
176 case DWT.Traverse: onTraverse(e); break;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
177 case DWT.KeyDown: /* required for traversal */ break;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
178 default :
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
179 OLE.error (__FILE__, __LINE__, DWT.ERROR_NOT_IMPLEMENTED);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
180 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
181 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
182 };
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
183
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
184 frame.addListener(DWT.Resize, listener);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
185 frame.addListener(DWT.Move, listener);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
186 addListener(DWT.Dispose, listener);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
187 addListener(DWT.FocusIn, listener);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
188 addListener(DWT.FocusOut, listener);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
189 addListener(DWT.Paint, listener);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
190 addListener(DWT.Traverse, listener);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
191 addListener(DWT.KeyDown, listener);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
192 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
193 /**
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
194 * Create an OleClientSite child widget using the OLE Document type associated with the
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
195 * specified file. The OLE Document type is determined either through header information in the file
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
196 * or through a Registry entry for the file extension. Use style bits to select a particular look
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
197 * or set of properties.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
198 *
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
199 * @param parent a composite widget; must be an OleFrame
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
200 * @param style the bitwise OR'ing of widget styles
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
201 * @param file the file that is to be opened in this OLE Document
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
202 *
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
203 * @exception IllegalArgumentException
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
204 * <ul><li>ERROR_NULL_ARGUMENT when the parent is null
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
205 * <li>ERROR_INVALID_ARGUMENT when the parent is not an OleFrame</ul>
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
206 * @exception DWTException
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
207 * <ul><li>ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
208 * <li>ERROR_CANNOT_CREATE_OBJECT when failed to create OLE Object
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
209 * <li>ERROR_CANNOT_OPEN_FILE when failed to open file
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
210 * <li>ERROR_INTERFACE_NOT_FOUND when unable to create callbacks for OLE Interfaces
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
211 * <li>ERROR_INVALID_CLASSID
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
212 * </ul>
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
213 */
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
214 public this(Composite parent, int style, File file) {
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
215 this(parent, style);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
216 try {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
217
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
218 if (file is null || file.isDirectory() || !file.exists())
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
219 OLE.error (__FILE__, __LINE__, OLE.ERROR_INVALID_ARGUMENT);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
220
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
221 // Is there an associated CLSID?
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
222 appClsid = new GUID();
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
223 TCHAR* fileName = StrToTCHARz( 0, file.getAbsolutePath() );
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
224 int result = COM.GetClassFile(fileName, appClsid);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
225 if (result !is COM.S_OK)
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
226 OLE.error (__FILE__, __LINE__, OLE.ERROR_INVALID_CLASSID, result);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
227 // associated CLSID may not be installed on this machine
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
228 if (getProgramID() is null)
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
229 OLE.error (__FILE__, __LINE__, OLE.ERROR_INVALID_CLASSID, result);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
230
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
231 // Open a temporary storage object
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
232 tempStorage = createTempStorage();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
233
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
234 // Create ole object with storage object
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
235 result = COM.OleCreateFromFile(appClsid, fileName, &COM.IIDIUnknown, COM.OLERENDER_DRAW, null, null, tempStorage, cast(void**)&objIUnknown);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
236 if (result !is COM.S_OK)
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
237 OLE.error (__FILE__, __LINE__, OLE.ERROR_CANNOT_CREATE_OBJECT, result);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
238
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
239 // Init sinks
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
240 addObjectReferences();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
241
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
242 if (COM.OleRun(objIUnknown) is OLE.S_OK) state = STATE_RUNNING;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
243 } catch (DWTException e) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
244 dispose();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
245 disposeCOMInterfaces();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
246 throw e;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
247 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
248 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
249 /**
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
250 * Create an OleClientSite child widget to edit a blank document using the specified OLE Document
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
251 * application. Use style bits to select a particular look or set of properties.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
252 *
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
253 * @param parent a composite widget; must be an OleFrame
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
254 * @param style the bitwise OR'ing of widget styles
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
255 * @param progId the unique program identifier of am OLE Document application;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
256 * the value of the ProgID key or the value of the VersionIndependentProgID key specified
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
257 * in the registry for the desired OLE Document (for example, the VersionIndependentProgID
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
258 * for Word is Word.Document)
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
259 *
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
260 * @exception IllegalArgumentException
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
261 *<ul>
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
262 * <li>ERROR_NULL_ARGUMENT when the parent is null
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
263 * <li>ERROR_INVALID_ARGUMENT when the parent is not an OleFrame
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
264 *</ul>
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
265 * @exception DWTException
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
266 * <ul><li>ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
267 * <li>ERROR_INVALID_CLASSID when the progId does not map to a registered CLSID
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
268 * <li>ERROR_CANNOT_CREATE_OBJECT when failed to create OLE Object
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
269 * </ul>
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
270 */
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 162
diff changeset
271 public this(Composite parent, int style, String progId) {
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
272 this(parent, style);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
273 try {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
274 appClsid = getClassID(progId);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
275 if (appClsid is null)
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
276 OLE.error (__FILE__, __LINE__, OLE.ERROR_INVALID_CLASSID);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
277
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
278 // Open a temporary storage object
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
279 tempStorage = createTempStorage();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
280
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
281 // Create ole object with storage object
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
282 HRESULT result = COM.OleCreate(appClsid, &COM.IIDIUnknown, COM.OLERENDER_DRAW, null, null, tempStorage, cast(void**)&objIUnknown);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
283 if (result !is COM.S_OK)
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
284 OLE.error (__FILE__, __LINE__, OLE.ERROR_CANNOT_CREATE_OBJECT, result);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
285
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
286 // Init sinks
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
287 addObjectReferences();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
288
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
289 if (COM.OleRun(objIUnknown) is OLE.S_OK) state = STATE_RUNNING;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
290
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
291 } catch (DWTException e) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
292 dispose();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
293 disposeCOMInterfaces();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
294 throw e;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
295 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
296 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
297 /**
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
298 * Create an OleClientSite child widget to edit the specified file using the specified OLE Document
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
299 * application. Use style bits to select a particular look or set of properties.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
300 * <p>
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
301 * <b>IMPORTANT:</b> This method is <em>not</em> part of the public
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
302 * API for <code>OleClientSite</code>. It is marked public only so that it
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
303 * can be shared within the packages provided by DWT. It is not
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
304 * available on all platforms, and should never be called from
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
305 * application code.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
306 * </p>
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
307 * @param parent a composite widget; must be an OleFrame
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
308 * @param style the bitwise OR'ing of widget styles
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
309 * @param progId the unique program identifier of am OLE Document application;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
310 * the value of the ProgID key or the value of the VersionIndependentProgID key specified
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
311 * in the registry for the desired OLE Document (for example, the VersionIndependentProgID
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
312 * for Word is Word.Document)
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
313 * @param file the file that is to be opened in this OLE Document
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
314 *
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
315 * @exception IllegalArgumentException
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
316 * <ul><li>ERROR_NULL_ARGUMENT when the parent is null
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
317 * <li>ERROR_INVALID_ARGUMENT when the parent is not an OleFrame</ul>
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
318 * @exception DWTException
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
319 * <ul><li>ERROR_THREAD_INVALID_ACCESS when called from the wrong thread
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
320 * <li>ERROR_INVALID_CLASSID when the progId does not map to a registered CLSID
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
321 * <li>ERROR_CANNOT_CREATE_OBJECT when failed to create OLE Object
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
322 * <li>ERROR_CANNOT_OPEN_FILE when failed to open file
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
323 * </ul>
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
324 */
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 162
diff changeset
325 public this(Composite parent, int style, String progId, File file) {
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
326 this(parent, style);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
327 try {
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
328 if (file is null || file.isDirectory() || !file.exists()) OLE.error (__FILE__, __LINE__, OLE.ERROR_INVALID_ARGUMENT);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
329 appClsid = getClassID(progId);
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
330 if (appClsid is null) OLE.error (__FILE__, __LINE__, OLE.ERROR_INVALID_CLASSID);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
331
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
332 // Are we opening this file with the preferred OLE object?
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
333 wchar* fileName = StrToWCHARz(file.getAbsolutePath());
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
334 GUID* fileClsid = new GUID();
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
335 COM.GetClassFile(fileName, fileClsid);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
336
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
337 if (COM.IsEqualGUID(appClsid, fileClsid)){
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
338 // Using the same application that created file, therefore, use default mechanism.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
339 tempStorage = createTempStorage();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
340 // Create ole object with storage object
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
341 HRESULT result = COM.OleCreateFromFile(appClsid, fileName, &COM.IIDIUnknown, COM.OLERENDER_DRAW, null, null, tempStorage, cast(void**)&objIUnknown);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
342 if (result !is COM.S_OK) OLE.error (__FILE__, __LINE__, OLE.ERROR_CANNOT_CREATE_OBJECT, result);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
343 } else {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
344 // Not using the same application that created file, therefore, copy from original file to a new storage file
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
345 IStorage storage = null;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
346 if (COM.StgIsStorageFile(fileName) is COM.S_OK) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
347 int mode = COM.STGM_READ | COM.STGM_TRANSACTED | COM.STGM_SHARE_EXCLUSIVE;
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
348 HRESULT result = COM.StgOpenStorage(fileName, null, mode, null, 0, &storage); //Does an AddRef if successful
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
349 if (result !is COM.S_OK) OLE.error (__FILE__, __LINE__, OLE.ERROR_CANNOT_OPEN_FILE, result);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
350 } else {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
351 // Original file is not a Storage file so copy contents to a stream in a new storage file
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
352 int mode = COM.STGM_READWRITE | COM.STGM_DIRECT | COM.STGM_SHARE_EXCLUSIVE | COM.STGM_CREATE;
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
353 HRESULT result = COM.StgCreateDocfile(null, mode | COM.STGM_DELETEONRELEASE, 0, &storage); // Increments ref count if successful
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
354 if (result !is COM.S_OK) OLE.error (__FILE__, __LINE__, OLE.ERROR_CANNOT_OPEN_FILE, result);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
355 // Create a stream on the storage object.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
356 // Word does not follow the standard and does not use "CONTENTS" as the name of
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
357 // its primary stream
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
358 wchar* streamName = StrToWCHARz("CONTENTS"); //$NON-NLS-1$
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
359 GUID* wordGUID = getClassID(WORDPROGID);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
360 if (wordGUID !is null && COM.IsEqualGUID(appClsid, wordGUID)) streamName = "WordDocument"; //$NON-NLS-1$
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
361 IStream stream;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
362 result = storage.CreateStream(streamName, mode, 0, 0, &stream); // Increments ref count if successful
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
363 if (result !is COM.S_OK) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
364 storage.Release();
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
365 OLE.error (__FILE__, __LINE__, OLE.ERROR_CANNOT_OPEN_FILE, result);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
366 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
367 try {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
368 // Copy over data in file to named stream
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
369 FileInputStream fileInput = new FileInputStream(file);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
370 int increment = 1024*4;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
371 byte[] buffer = new byte[increment];
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
372 int count = 0;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
373 while((count = fileInput.read(buffer)) > 0){
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
374 auto pv = COM.CoTaskMemAlloc(count);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
375 OS.MoveMemory(pv, buffer.ptr, count);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
376 result = stream.Write(pv, count, null) ;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
377 COM.CoTaskMemFree(pv);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
378 if (result !is COM.S_OK) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
379 fileInput.close();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
380 stream.Release();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
381 storage.Release();
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
382 OLE.error (__FILE__, __LINE__, OLE.ERROR_CANNOT_OPEN_FILE, result);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
383 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
384 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
385 fileInput.close();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
386 stream.Commit(COM.STGC_DEFAULT);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
387 stream.Release();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
388 } catch (IOException err) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
389 stream.Release();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
390 storage.Release();
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
391 OLE.error (__FILE__, __LINE__, OLE.ERROR_CANNOT_OPEN_FILE);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
392 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
393 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
394
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
395 // Open a temporary storage object
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
396 tempStorage = createTempStorage();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
397 // Copy over contents of file
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
398 HRESULT result = storage.CopyTo(0, null, null, tempStorage);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
399 storage.Release();
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
400 if (result !is COM.S_OK) OLE.error (__FILE__, __LINE__, OLE.ERROR_CANNOT_OPEN_FILE, result);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
401
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
402 // create ole client
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
403 result = COM.CoCreateInstance(appClsid, null, COM.CLSCTX_INPROC_HANDLER | COM.CLSCTX_INPROC_SERVER, &COM.IIDIUnknown, cast(void**)&objIUnknown);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
404 if (result !is COM.S_OK) OLE.error (__FILE__, __LINE__, OLE.ERROR_CANNOT_CREATE_OBJECT, result);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
405 // get the persistent storage of the ole client
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
406 IPersistStorage iPersistStorage;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
407 result = objIUnknown.QueryInterface(&COM.IIDIPersistStorage, cast(void**)&iPersistStorage);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
408 if (result !is COM.S_OK) OLE.error (__FILE__, __LINE__, OLE.ERROR_CANNOT_CREATE_OBJECT, result);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
409 // load the contents of the file into the ole client site
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
410 result = iPersistStorage.Load(tempStorage);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
411 iPersistStorage.Release();
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
412 if (result !is COM.S_OK)OLE.error (__FILE__, __LINE__, OLE.ERROR_CANNOT_CREATE_OBJECT, result);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
413 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
414
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
415 // Init sinks
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
416 addObjectReferences();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
417
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
418 if (COM.OleRun(objIUnknown) is OLE.S_OK) state = STATE_RUNNING;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
419
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
420 } catch (DWTException e) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
421 dispose();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
422 disposeCOMInterfaces();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
423 throw e;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
424 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
425 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
426 protected void addObjectReferences() {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
427 //
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
428 IPersist objIPersist;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
429 if (objIUnknown.QueryInterface(&COM.IIDIPersist, cast(void**)&objIPersist) is COM.S_OK) {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
430 GUID* tempid = new GUID();
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
431 if (objIPersist.GetClassID(tempid) is COM.S_OK)
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
432 objClsid = tempid;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
433 objIPersist.Release();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
434 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
435
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
436 //
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
437 HRESULT result = objIUnknown.QueryInterface(&COM.IIDIViewObject2, cast(void**)&objIViewObject2);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
438 if (result !is COM.S_OK)
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
439 OLE.error (__FILE__, __LINE__, OLE.ERROR_INTERFACE_NOT_FOUND, result);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
440 objIViewObject2.SetAdvise(aspect, 0, iAdviseSink);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
441
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
442 //
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
443 result = objIUnknown.QueryInterface(&COM.IIDIOleObject, cast(void**)&objIOleObject);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
444 if (result !is COM.S_OK)
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
445 OLE.error (__FILE__, __LINE__, OLE.ERROR_INTERFACE_NOT_FOUND, result);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
446 objIOleObject.SetClientSite(iOleClientSite);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
447 uint pdwConnection;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
448 objIOleObject.Advise(iAdviseSink, &pdwConnection);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
449 objIOleObject.SetHostNames("main", "main"); //$NON-NLS-1$ //$NON-NLS-2$
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
450
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
451 // Notify the control object that it is embedded in an OLE container
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
452 COM.OleSetContainedObject(objIUnknown, true);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
453
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
454 // Is OLE object linked or embedded?
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
455 IOleLink objIOleLink;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
456 if (objIUnknown.QueryInterface(&COM.IIDIOleLink, cast(void**)&objIOleLink) is COM.S_OK) {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
457 IMoniker objIMoniker;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
458 if (objIOleLink.GetSourceMoniker(&objIMoniker) is COM.S_OK) {
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
459 objIMoniker.Release();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
460 type = COM.OLELINKED;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
461 objIOleLink.BindIfRunning();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
462 } else {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
463 isStatic = true;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
464 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
465 objIOleLink.Release();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
466 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
467 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
468 protected int AddRef() {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
469 refCount++;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
470 return refCount;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
471 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
472 private int CanInPlaceActivate() {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
473 if (aspect is COM.DVASPECT_CONTENT && type is COM.OLEEMBEDDED)
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
474 return COM.S_OK;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
475
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
476 return COM.S_FALSE;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
477 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
478 private int ContextSensitiveHelp(int fEnterMode) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
479 return COM.S_OK;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
480 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
481 protected void createCOMInterfaces() {
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
482 iUnknown = new _IUnknownImpl(this);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
483 iOleClientSite = new _IOleClientSiteImpl(this);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
484 iAdviseSink = new _IAdviseSinkImpl(this);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
485 iOleInPlaceSite = new _IOleInPlaceSiteImpl(this);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
486 iOleDocumentSite = new _IOleDocumentSiteImpl(this);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
487 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
488 protected IStorage createTempStorage() {
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
489 IStorage tmpStorage;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
490 int grfMode = COM.STGM_READWRITE | COM.STGM_SHARE_EXCLUSIVE | COM.STGM_DELETEONRELEASE;
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
491 HRESULT result = COM.StgCreateDocfile(null, grfMode, 0, &tmpStorage);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
492 if (result !is COM.S_OK) OLE.error(__FILE__, __LINE__, OLE.ERROR_CANNOT_CREATE_FILE, result);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
493 return (tmpStorage);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
494 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
495 /**
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
496 * Deactivates an active in-place object and discards the object's undo state.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
497 */
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
498 public void deactivateInPlaceClient() {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
499 if (objIOleInPlaceObject !is null) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
500 objIOleInPlaceObject.InPlaceDeactivate();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
501 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
502 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
503 private void deleteTempStorage() {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
504 //Destroy this item's contents in the temp root IStorage.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
505 if (tempStorage !is null){
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
506 tempStorage.Release();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
507 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
508 tempStorage = null;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
509 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
510 protected void disposeCOMInterfaces() {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
511 iUnknown = null;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
512 iOleClientSite = null;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
513 iAdviseSink = null;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
514 iOleInPlaceSite = null;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
515 iOleDocumentSite = null;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
516 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
517 /**
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
518 * Requests that the OLE Document or ActiveX Control perform an action; actions are almost always
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
519 * changes to the activation state.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
520 *
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
521 * @param verb the operation that is requested. This is one of the OLE.OLEIVERB_ values
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
522 *
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
523 * @return an HRESULT value indicating the success of the operation request; OLE.S_OK indicates
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
524 * success
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
525 */
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
526 public int doVerb(int verb) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
527 // Not all OLE clients (for example PowerPoint) can be set into the running state in the constructor.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
528 // The fix is to ensure that the client is in the running state before invoking any verb on it.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
529 if (state is STATE_NONE) {
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
530 if (COM.OleRun(objIUnknown) is OLE.S_OK) state = STATE_RUNNING;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
531 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
532 if (state is STATE_NONE || isStatic)
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
533 return COM.E_FAIL;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
534
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
535 // See PR: 1FV9RZW
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
536 RECT rect;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
537 OS.GetClientRect(handle, &rect);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
538 int result = objIOleObject.DoVerb(verb, null, iOleClientSite, 0, handle, &rect);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
539
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
540 if (state !is STATE_RUNNING && inInit) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
541 updateStorage();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
542 inInit = false;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
543 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
544 return result;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
545 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
546 /**
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
547 * Asks the OLE Document or ActiveX Control to execute a command from a standard
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
548 * list of commands. The OLE Document or ActiveX Control must support the IOleCommandTarget
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
549 * interface. The OLE Document or ActiveX Control does not have to support all the commands
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
550 * in the standard list. To check if a command is supported, you can call queryStatus with
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
551 * the cmdID.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
552 *
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
553 * @param cmdID the ID of a command; these are the OLE.OLECMDID_ values - a small set of common
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
554 * commands
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
555 * @param options the optional flags; these are the OLE.OLECMDEXECOPT_ values
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
556 * @param in the argument for the command
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
557 * @param out the return value of the command
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
558 *
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
559 * @return an HRESULT value; OLE.S_OK is returned if successful
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
560 *
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
561 */
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
562 public int exec(int cmdID, int options, Variant pvaIn, Variant pvaOut) {
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
563
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
564 if (objIOleCommandTarget is null) {
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
565 if (objIUnknown.QueryInterface(&COM.IIDIOleCommandTarget, cast(void**)&objIOleCommandTarget) !is COM.S_OK)
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
566 return OLE.ERROR_INTERFACE_NOT_FOUND;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
567 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
568
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
569 VARIANT* pIn = null;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
570 VARIANT* pOut = null;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
571
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
572 if(pvaIn){
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
573 pIn = new VARIANT();
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
574 pvaIn.getData(pIn);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
575 }
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
576 if(pvaOut){
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
577 pOut = new VARIANT();
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
578 pvaOut.getData(pOut);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
579 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
580
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
581 HRESULT result = objIOleCommandTarget.Exec(null, cmdID, options, pIn, pOut);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
582
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
583 if(pIn) {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
584 COM.VariantClear(pIn);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
585 }
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
586
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
587 if(pOut) {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
588 pvaOut.setData(pOut);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
589 COM.VariantClear(pOut);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
590 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
591
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
592 return result;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
593 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
594 IDispatch getAutomationObject() {
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
595 IDispatch ppvObject;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
596 if (objIUnknown.QueryInterface(&COM.IIDIDispatch, cast(void**)&ppvObject) !is COM.S_OK)
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
597 return null;
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
598 return ppvObject;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
599 }
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 162
diff changeset
600 protected GUID* getClassID(String clientName) {
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
601 // create a GUID struct to hold the result
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
602 GUID* guid = new GUID();
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
603
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
604 // create a null terminated array of char
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
605 wchar* buffer = null;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
606 if (clientName !is null) {
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
607 buffer = StrToWCHARz(clientName);;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
608 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
609 if (COM.CLSIDFromProgID(buffer, guid) !is COM.S_OK){
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
610 HRESULT result = COM.CLSIDFromString(buffer, guid);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
611 if (result !is COM.S_OK) return null;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
612 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
613 return guid;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
614 }
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
615
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
616 private HRESULT GetContainer(IOleContainer* ppContainer) {
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
617 /* Simple containers that do not support links to their embedded
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
618 * objects probably do not need to implement this method. Instead,
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
619 * they can return E_NOINTERFACE and set ppContainer to NULL.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
620 */
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
621 if (ppContainer !is null)
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
622 *ppContainer = null;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
623 return COM.E_NOINTERFACE;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
624 }
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
625
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
626 private SIZE* getExtent() {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
627 SIZE* sizel = new SIZE();
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
628 // get the current size of the embedded OLENatives object
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
629 if (objIOleObject !is null) {
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
630 if ( objIViewObject2 !is null && !COM.OleIsRunning(objIOleObject)) {
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
631 objIViewObject2.GetExtent(aspect, -1, null, sizel);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
632 } else {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
633 objIOleObject.GetExtent(aspect, sizel);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
634 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
635 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
636 return xFormHimetricToPixels(sizel);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
637 }
246
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
638 /**
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
639 * Returns the indent value that would be used to compute the clipping area
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
640 * of the active X object.
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
641 *
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
642 * NOTE: The indent value is no longer being used by the client site.
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
643 *
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
644 * @return the rectangle representing the indent
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
645 */
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
646 public Rectangle getIndent() {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
647 return new Rectangle(indent.left, indent.right, indent.top, indent.bottom);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
648 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
649 /**
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
650 * Returns the program ID of the OLE Document or ActiveX Control.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
651 *
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
652 * @return the program ID of the OLE Document or ActiveX Control
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
653 */
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 162
diff changeset
654 public String getProgramID(){
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
655 if (appClsid !is null){
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
656 wchar* hMem;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
657 if (COM.ProgIDFromCLSID(appClsid, &hMem) is COM.S_OK) {
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
658 int length = OS.GlobalSize(hMem);
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
659 auto ptr = OS.GlobalLock(hMem);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
660 wchar[] buffer = new wchar[length];
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
661 COM.MoveMemory(buffer.ptr, ptr, length);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
662 OS.GlobalUnlock(hMem);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
663 OS.GlobalFree(hMem);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
664
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 162
diff changeset
665 String result = WCHARzToStr(buffer.ptr);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
666 // remove null terminator
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
667 //int index = result.indexOf("\0");
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
668 return result;//.substring(0, index);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
669 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
670 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
671 return null;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
672 }
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
673 int ActivateMe(IOleDocumentView pViewToActivate) {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
674 if (pViewToActivate is null) {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
675 void* ppvObject;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
676 if (objIUnknown.QueryInterface(&COM.IIDIOleDocument, &ppvObject) !is COM.S_OK) return COM.E_FAIL;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
677 IOleDocument objOleDocument = cast(IOleDocument)ppvObject;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
678 if (objOleDocument.CreateView(iOleInPlaceSite, null, 0, &objDocumentView) !is COM.S_OK) return COM.E_FAIL;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
679 objOleDocument.Release();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
680 } else {
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
681 objDocumentView = pViewToActivate;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
682 objDocumentView.AddRef();
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
683 objDocumentView.SetInPlaceSite(iOleInPlaceSite);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
684 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
685 objDocumentView.UIActivate(1);//TRUE
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
686 RECT* rect = getRect();
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
687 objDocumentView.SetRect(rect);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
688 objDocumentView.Show(1);//TRUE
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
689 return COM.S_OK;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
690 }
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
691 protected int GetWindow(HWND* phwnd) {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
692 if (phwnd is null)
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
693 return COM.E_INVALIDARG;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
694 if (frame is null) {
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
695 *phwnd = null;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
696 return COM.E_NOTIMPL;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
697 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
698
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
699 // Copy the Window's handle into the memory passed in
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
700 *phwnd = frame.handle;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
701 return COM.S_OK;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
702 }
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
703 RECT* getRect() {
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
704 Point location = this.getLocation();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
705 Rectangle area = frame.getClientArea();
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
706 RECT* rect = new RECT();
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
707 rect.left = location.x;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
708 rect.top = location.y;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
709 rect.right = location.x + area.width - borderWidths.left - borderWidths.right;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
710 rect.bottom = location.y + area.height - borderWidths.top - borderWidths.bottom;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
711 return rect;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
712 }
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
713
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
714 private int GetWindowContext(IOleInPlaceFrame* ppFrame, IOleInPlaceUIWindow* ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo) {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
715 if (frame is null || ppFrame is null)
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
716 return COM.E_NOTIMPL;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
717
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
718 // fill in frame handle
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
719 auto iOleInPlaceFrame = frame.getIOleInPlaceFrame();
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
720 *ppFrame = iOleInPlaceFrame;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
721 frame.AddRef();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
722
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
723 // null out document handle
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
724 if (ppDoc !is null) *ppDoc = null;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
725
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
726 // fill in position and clipping info
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
727 RECT* rect = getRect();
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
728 if (lprcPosRect !is null) OS.MoveMemory(lprcPosRect, rect, RECT.sizeof);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
729 if (lprcClipRect !is null) OS.MoveMemory(lprcClipRect, rect, RECT.sizeof);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
730
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
731 // get frame info
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
732 OLEINPLACEFRAMEINFO* frameInfo = new OLEINPLACEFRAMEINFO();
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
733 frameInfo.cb = OLEINPLACEFRAMEINFO.sizeof;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
734 frameInfo.fMDIApp = 0;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
735 frameInfo.hwndFrame = frame.handle;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
736 Shell shell = getShell();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
737 Menu menubar = shell.getMenuBar();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
738 if (menubar !is null && !menubar.isDisposed()) {
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
739 auto hwnd = shell.handle;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
740 auto cAccel = OS.SendMessage(hwnd, OS.WM_APP, 0, 0);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
741 if (cAccel !is 0) {
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
742 auto hAccel = cast(HACCEL) OS.SendMessage(hwnd, OS.WM_APP+1, 0, 0);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
743 if (hAccel !is null) {
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
744 frameInfo.cAccelEntries = cAccel;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
745 frameInfo.haccel = hAccel;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
746 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
747 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
748 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
749 COM.MoveMemory(lpFrameInfo, frameInfo, OLEINPLACEFRAMEINFO.sizeof);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
750
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
751 return COM.S_OK;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
752 }
246
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
753 /**
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
754 * Returns whether ole document is dirty by checking whether the content
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
755 * of the file representing the document is dirty.
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
756 *
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
757 * @return <code>true</code> if the document has been modified,
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
758 * <code>false</code> otherwise.
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
759 * @since 3.1
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
760 */
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
761 public bool isDirty() {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
762 /*
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
763 * Note: this method must return true unless it is absolutely clear that the
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
764 * contents of the Ole Document do not differ from the contents in the file
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
765 * on the file system.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
766 */
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
767
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
768 // Get access to the persistent storage mechanism
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
769 IPersistStorage permStorage;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
770 if (objIOleObject.QueryInterface(&COM.IIDIPersistFile, cast(void**)&permStorage) !is COM.S_OK)
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
771 return true;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
772 // Are the contents of the permanent storage different from the file?
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
773 auto result = permStorage.IsDirty();
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
774 permStorage.Release();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
775 if (result is COM.S_FALSE) return false;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
776 return true;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
777 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
778 public bool isFocusControl () {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
779 checkWidget ();
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
780 auto focusHwnd = OS.GetFocus();
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
781 if (objIOleInPlaceObject is null) return (handle is focusHwnd);
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
782 HWND phwnd;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
783 objIOleInPlaceObject.GetWindow(&phwnd);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
784 while (focusHwnd !is null) {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
785 if (phwnd is focusHwnd) return true;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
786 focusHwnd = OS.GetParent(focusHwnd);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
787 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
788 return false;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
789 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
790 private int OnClose() {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
791 return COM.S_OK;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
792 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
793 private int OnDataChange(int pFormatetc, int pStgmed) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
794 return COM.S_OK;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
795 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
796 private void onDispose(Event e) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
797 inDispose = true;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
798 if (state !is STATE_NONE)
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
799 doVerb(OLE.OLEIVERB_DISCARDUNDOSTATE);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
800 deactivateInPlaceClient();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
801 releaseObjectInterfaces(); // Note, must release object interfaces before releasing frame
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
802 deleteTempStorage();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
803
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
804 // remove listeners
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
805 removeListener(DWT.Dispose, listener);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
806 removeListener(DWT.FocusIn, listener);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
807 removeListener(DWT.Paint, listener);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
808 removeListener(DWT.Traverse, listener);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
809 removeListener(DWT.KeyDown, listener);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
810 frame.removeListener(DWT.Resize, listener);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
811 frame.removeListener(DWT.Move, listener);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
812
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
813 frame.Release();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
814 frame = null;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
815 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
816 void onFocusIn(Event e) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
817 if (inDispose) return;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
818 if (state !is STATE_UIACTIVE) doVerb(OLE.OLEIVERB_SHOW);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
819 if (objIOleInPlaceObject is null) return;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
820 if (isFocusControl()) return;
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
821 HWND phwnd;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
822 objIOleInPlaceObject.GetWindow(&phwnd);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
823 if (phwnd is null) return;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
824 OS.SetFocus(phwnd);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
825 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
826 void onFocusOut(Event e) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
827 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
828 private int OnInPlaceActivate() {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
829 state = STATE_INPLACEACTIVE;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
830 frame.setCurrentDocument(this);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
831 if (objIOleObject is null)
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
832 return COM.S_OK;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
833 int[] ppvObject = new int[1];
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
834 if (objIOleObject.QueryInterface(&COM.IIDIOleInPlaceObject, cast(void**)&objIOleInPlaceObject) is COM.S_OK) {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
835 //objIOleInPlaceObject = new IOleInPlaceObject(ppvObject[0]);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
836 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
837 return COM.S_OK;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
838 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
839 private int OnInPlaceDeactivate() {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
840 if (objIOleInPlaceObject !is null) objIOleInPlaceObject.Release();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
841 objIOleInPlaceObject = null;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
842 state = STATE_RUNNING;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
843 redraw();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
844 Shell shell = getShell();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
845 if (isFocusControl() || frame.isFocusControl()) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
846 shell.traverse(DWT.TRAVERSE_TAB_NEXT);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
847 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
848 return COM.S_OK;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
849 }
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
850 private int OnPosRectChange(LPRECT lprcPosRect) {
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
851 Point size = getSize();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
852 setExtent(size.x, size.y);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
853 return COM.S_OK;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
854 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
855 private void onPaint(Event e) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
856 if (state is STATE_RUNNING || state is STATE_INPLACEACTIVE) {
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
857 SIZE* size = getExtent();
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
858 Rectangle area = getClientArea();
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
859 RECT* rect = new RECT();
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
860 if (getProgramID().startsWith("Excel.Sheet")) { //$NON-NLS-1$
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
861 rect.left = area.x; rect.right = area.x + (area.height * size.cx / size.cy);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
862 rect.top = area.y; rect.bottom = area.y + area.height;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
863 } else {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
864 rect.left = area.x; rect.right = area.x + size.cx;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
865 rect.top = area.y; rect.bottom = area.y + size.cy;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
866 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
867
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
868 auto pArea = cast(RECT*)OS.GlobalAlloc(COM.GMEM_FIXED | COM.GMEM_ZEROINIT, RECT.sizeof);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
869 OS.MoveMemory(pArea, rect, RECT.sizeof);
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
870 COM.OleDraw(objIUnknown, aspect, e.gc.handle, pArea);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
871 OS.GlobalFree(pArea);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
872 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
873 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
874 private void onResize(Event e) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
875 Rectangle area = frame.getClientArea();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
876 setBounds(borderWidths.left,
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
877 borderWidths.top,
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
878 area.width - borderWidths.left - borderWidths.right,
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
879 area.height - borderWidths.top - borderWidths.bottom);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
880
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
881 setObjectRects();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
882 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
883 private void OnSave() {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
884 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
885 private int OnShowWindow(int fShow) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
886 return COM.S_OK;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
887 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
888 private int OnUIActivate() {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
889 if (objIOleInPlaceObject is null) return COM.E_FAIL;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
890 state = STATE_UIACTIVE;
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
891 HWND phwnd;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
892 if (objIOleInPlaceObject.GetWindow(&phwnd) is COM.S_OK) {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
893 OS.SetWindowPos(phwnd, cast(HWND)OS.HWND_TOP, 0, 0, 0, 0, OS.SWP_NOSIZE | OS.SWP_NOMOVE);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
894 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
895 return COM.S_OK;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
896 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
897 private int OnUIDeactivate(int fUndoable) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
898 // currently, we are ignoring the fUndoable flag
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
899 if (frame is null || frame.isDisposed()) return COM.S_OK;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
900 state = STATE_INPLACEACTIVE;
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
901 frame.SetActiveObject(null, null);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
902 redraw();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
903 Shell shell = getShell();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
904 if (isFocusControl() || frame.isFocusControl()) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
905 shell.traverse(DWT.TRAVERSE_TAB_NEXT);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
906 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
907 Menu menubar = shell.getMenuBar();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
908 if (menubar is null || menubar.isDisposed())
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
909 return COM.S_OK;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
910
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
911 auto shellHandle = shell.handle;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
912 OS.SetMenu(shellHandle, menubar.handle);
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
913 return COM.OleSetMenuDescriptor(null, shellHandle, null, null, null);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
914 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
915 private void onTraverse(Event event) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
916 switch (event.detail) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
917 case DWT.TRAVERSE_ESCAPE:
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
918 case DWT.TRAVERSE_RETURN:
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
919 case DWT.TRAVERSE_TAB_NEXT:
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
920 case DWT.TRAVERSE_TAB_PREVIOUS:
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
921 case DWT.TRAVERSE_PAGE_NEXT:
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
922 case DWT.TRAVERSE_PAGE_PREVIOUS:
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
923 case DWT.TRAVERSE_MNEMONIC:
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
924 event.doit = true;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
925 break;
162
619faee45ef6 add missing default cases
Thomas Graber <d4rkdragon@gmail.com>
parents: 98
diff changeset
926 default:
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
927 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
928 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
929 private int OnViewChange(int dwAspect, int lindex) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
930 return COM.S_OK;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
931 }
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
932 protected int QueryInterface(REFIID riid, void ** ppvObject) {
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
933
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
934 if (riid is null || ppvObject is null)
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
935 return COM.E_NOINTERFACE;
284
bb89fd34ec82 Fix for OLE functionality. Thanks to Enzo Petrelli
Frank Benoit <benoit@tionex.de>
parents: 246
diff changeset
936 GUID oGuid = *riid;
bb89fd34ec82 Fix for OLE functionality. Thanks to Enzo Petrelli
Frank Benoit <benoit@tionex.de>
parents: 246
diff changeset
937 GUID* guid = &oGuid;
bb89fd34ec82 Fix for OLE functionality. Thanks to Enzo Petrelli
Frank Benoit <benoit@tionex.de>
parents: 246
diff changeset
938 //COM.MoveMemory(guid, riid, GUID.sizeof);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
939
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
940 if (COM.IsEqualGUID(guid, &COM.IIDIUnknown)) {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
941 *ppvObject = cast(void*)cast(IUnknown)iUnknown;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
942 AddRef();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
943 return COM.S_OK;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
944 }
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
945 if (COM.IsEqualGUID(guid, &COM.IIDIAdviseSink)) {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
946 *ppvObject = cast(void*)cast(IAdviseSink)iAdviseSink;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
947 AddRef();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
948 return COM.S_OK;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
949 }
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
950 if (COM.IsEqualGUID(guid, &COM.IIDIOleClientSite)) {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
951 *ppvObject = cast(void*)cast(IOleClientSite)iOleClientSite;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
952 AddRef();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
953 return COM.S_OK;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
954 }
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
955 if (COM.IsEqualGUID(guid, &COM.IIDIOleInPlaceSite)) {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
956 *ppvObject = cast(void*)cast(IOleInPlaceSite)iOleInPlaceSite;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
957 AddRef();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
958 return COM.S_OK;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
959 }
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
960 if (COM.IsEqualGUID(guid, &COM.IIDIOleDocumentSite )) {
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 162
diff changeset
961 String progID = getProgramID();
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
962 if (!progID.startsWith("PowerPoint")) { //$NON-NLS-1$
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
963 *ppvObject = cast(void*)cast(IOleDocumentSite)iOleDocumentSite;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
964 AddRef();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
965 return COM.S_OK;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
966 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
967 }
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
968 *ppvObject = null;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
969 return COM.E_NOINTERFACE;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
970 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
971 /**
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
972 * Returns the status of the specified command. The status is any bitwise OR'd combination of
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
973 * SWTOLE.OLECMDF_SUPPORTED, SWTOLE.OLECMDF_ENABLED, SWTOLE.OLECMDF_LATCHED, SWTOLE.OLECMDF_NINCHED.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
974 * You can query the status of a command before invoking it with OleClientSite.exec. The
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
975 * OLE Document or ActiveX Control must support the IOleCommandTarget to make use of this method.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
976 *
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
977 * @param cmd the ID of a command; these are the OLE.OLECMDID_ values - a small set of common
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
978 * commands
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
979 *
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
980 * @return the status of the specified command or 0 if unable to query the OLE Object; these are the
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
981 * OLE.OLECMDF_ values
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
982 */
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
983 public int queryStatus(int cmd) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
984
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
985 if (objIOleCommandTarget is null) {
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
986 if (objIUnknown.QueryInterface(&COM.IIDIOleCommandTarget, cast(void**)&objIOleCommandTarget) !is COM.S_OK)
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
987 return 0;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
988 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
989
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
990 OLECMD* olecmd = new OLECMD();
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
991 olecmd.cmdID = cmd;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
992
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
993 auto result = objIOleCommandTarget.QueryStatus(null, 1, olecmd, null);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
994
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
995 if (result !is COM.S_OK) return 0;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
996
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
997 return olecmd.cmdf;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
998 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
999 protected int Release() {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1000 refCount--;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1001
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1002 if (refCount is 0) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1003 disposeCOMInterfaces();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1004 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1005 return refCount;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1006 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1007 protected void releaseObjectInterfaces() {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1008
246
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1009 if (objIOleInPlaceObject !is null)
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1010 objIOleInPlaceObject.Release();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1011 objIOleInPlaceObject = null;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1012
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1013 if (objIOleObject !is null) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1014 objIOleObject.Close(COM.OLECLOSE_NOSAVE);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1015 objIOleObject.Release();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1016 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1017 objIOleObject = null;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1018
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1019 if (objDocumentView !is null){
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1020 objDocumentView.Release();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1021 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1022 objDocumentView = null;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1023
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1024 if (objIViewObject2 !is null) {
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1025 objIViewObject2.SetAdvise(aspect, 0, null);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1026 objIViewObject2.Release();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1027 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1028 objIViewObject2 = null;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1029
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1030 if (objIOleCommandTarget !is null)
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1031 objIOleCommandTarget.Release();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1032 objIOleCommandTarget = null;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1033
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1034 if (objIUnknown !is null){
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1035 objIUnknown.Release();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1036 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1037 objIUnknown = null;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1038
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1039 COM.CoFreeUnusedLibraries();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1040 }
246
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1041 /**
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1042 * Saves the document to the specified file and includes OLE specific information if specified.
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1043 * This method must <b>only</b> be used for files that have an OLE Storage format. For example,
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1044 * a word file edited with Word.Document should be saved using this method because there is
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1045 * formating information that should be stored in the OLE specific Storage format.
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1046 *
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1047 * @param file the file to which the changes are to be saved
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1048 * @param includeOleInfo the flag to indicate whether OLE specific information should be saved.
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1049 *
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1050 * @return true if the save was successful
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1051 */
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1052 public bool save(File file, bool includeOleInfo) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1053 if (includeOleInfo)
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1054 return saveToStorageFile(file);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1055 return saveToTraditionalFile(file);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1056 }
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1057 private bool saveFromContents(IStream address, File file) {
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1058
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1059 bool success = false;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1060
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1061 IStream tempContents = address;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1062 tempContents.AddRef();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1063
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1064 try {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1065 FileOutputStream writer = new FileOutputStream(file);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1066
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1067 int increment = 1024 * 4;
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1068 LPVOID pv = COM.CoTaskMemAlloc(increment);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1069 uint pcbWritten;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1070 while (tempContents.Read(pv, increment, &pcbWritten) is COM.S_OK && pcbWritten > 0) {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1071 byte[] buffer = new byte[ pcbWritten];
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1072 OS.MoveMemory(buffer.ptr, pv, pcbWritten);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1073 writer.write(buffer); // Note: if file does not exist, this will create the file the
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1074 // first time it is called
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1075 success = true;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1076 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1077 COM.CoTaskMemFree(pv);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1078
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1079 writer.close();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1080
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1081 } catch (IOException err) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1082 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1083
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1084 tempContents.Release();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1085
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1086 return success;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1087 }
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1088 private bool saveFromOle10Native(IStream address, File file) {
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1089
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1090 bool success = false;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1091
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1092 IStream tempContents = address;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1093 tempContents.AddRef();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1094
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1095 // The "\1Ole10Native" stream contains a DWORD header whose value is the length
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1096 // of the native data that follows.
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1097 LPVOID pv = COM.CoTaskMemAlloc(4);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1098 uint size;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1099 auto rc = tempContents.Read(pv, 4, null);
300
acf6957f2344 OLE fixes, thanks to Enzo Petrelli.
Frank Benoit <benoit@tionex.de>
parents: 284
diff changeset
1100 OS.MoveMemory(&size, pv, 4);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1101 COM.CoTaskMemFree(pv);
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1102 if (rc is COM.S_OK && size > 0) {
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1103
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1104 // Read the data
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1105 byte[] buffer = new byte[size];
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1106 pv = COM.CoTaskMemAlloc(size);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1107 rc = tempContents.Read(pv, size, null);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1108 OS.MoveMemory(buffer.ptr, pv, size);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1109 COM.CoTaskMemFree(pv);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1110
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1111 // open the file and write data into it
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1112 try {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1113 FileOutputStream writer = new FileOutputStream(file);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1114 writer.write(buffer); // Note: if file does not exist, this will create the file
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1115 writer.close();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1116
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1117 success = true;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1118 } catch (IOException err) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1119 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1120 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1121 tempContents.Release();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1122
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1123 return success;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1124 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1125 private int SaveObject() {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1126
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1127 updateStorage();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1128
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1129 return COM.S_OK;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1130 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1131 /**
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1132 * Saves the document to the specified file and includes OLE specific information. This method
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1133 * must <b>only</b> be used for files that have an OLE Storage format. For example, a word file
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1134 * edited with Word.Document should be saved using this method because there is formating information
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1135 * that should be stored in the OLE specific Storage format.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1136 *
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1137 * @param file the file to which the changes are to be saved
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1138 *
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1139 * @return true if the save was successful
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1140 */
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1141 private bool saveToStorageFile(File file) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1142 // The file will be saved using the formating of the current application - this
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1143 // may not be the format of the application that was originally used to create the file
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1144 // e.g. if an Excel file is opened in Word, the Word application will save the file in the
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1145 // Word format
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1146 // Note: if the file already exists, some applications will not overwrite the file
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1147 // In these cases, you should delete the file first (probably save the contents of the file in case the
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1148 // save fails)
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1149 if (file is null || file.isDirectory()) return false;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1150 if (!updateStorage()) return false;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1151
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1152 // get access to the persistent storage mechanism
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1153 IPersistStorage permStorage;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1154 if (objIOleObject.QueryInterface(&COM.IIDIPersistStorage, cast(void**)&permStorage) !is COM.S_OK) return false;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1155 try {
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1156 IStorage storage;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1157 wchar* path = StrToWCHARz(file.getAbsolutePath());
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1158 int mode = COM.STGM_TRANSACTED | COM.STGM_READWRITE | COM.STGM_SHARE_EXCLUSIVE | COM.STGM_CREATE;
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1159 int result = COM.StgCreateDocfile(path, mode, 0, &storage); //Does an AddRef if successful
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1160 if (result !is COM.S_OK) return false;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1161 try {
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1162 if (COM.OleSave(permStorage, storage, false) is COM.S_OK) {
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1163 if (storage.Commit(COM.STGC_DEFAULT) is COM.S_OK) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1164 return true;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1165 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1166 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1167 } finally {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1168 storage.Release();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1169 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1170 } finally {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1171 permStorage.Release();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1172 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1173 return false;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1174 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1175 /**
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1176 * Saves the document to the specified file. This method must be used for
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1177 * files that do not have an OLE Storage format. For example, a bitmap file edited with MSPaint
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1178 * should be saved using this method because bitmap is a standard format that does not include any
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1179 * OLE specific data.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1180 *
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1181 * @param file the file to which the changes are to be saved
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1182 *
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1183 * @return true if the save was successful
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1184 */
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1185 private bool saveToTraditionalFile(File file) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1186 // Note: if the file already exists, some applications will not overwrite the file
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1187 // In these cases, you should delete the file first (probably save the contents of the file in case the
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1188 // save fails)
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1189 if (file is null || file.isDirectory())
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1190 return false;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1191 if (!updateStorage())
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1192 return false;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1193
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1194 IStream stream;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1195 // Look for a CONTENTS stream
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1196 if (tempStorage.OpenStream(("CONTENTS"w).ptr, null, COM.STGM_DIRECT | COM.STGM_READ | COM.STGM_SHARE_EXCLUSIVE, 0, &stream) is COM.S_OK) //$NON-NLS-1$
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1197 return saveFromContents(stream, file);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1198
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1199 // Look for Ole 1.0 object stream
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1200 if (tempStorage.OpenStream(("\1Ole10Native"w).ptr, null, COM.STGM_DIRECT | COM.STGM_READ | COM.STGM_SHARE_EXCLUSIVE, 0, &stream) is COM.S_OK) //$NON-NLS-1$
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1201 return saveFromOle10Native(stream, file);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1202
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1203 return false;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1204 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1205 private int Scroll(int scrollExtant) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1206 return COM.S_OK;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1207 }
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1208 void setBorderSpace(RECT* newBorderwidth) {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1209 borderWidths = *newBorderwidth;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1210 // readjust size and location of client site
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1211 Rectangle area = frame.getClientArea();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1212 setBounds(borderWidths.left, borderWidths.top,
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1213 area.width - borderWidths.left - borderWidths.right,
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1214 area.height - borderWidths.top - borderWidths.bottom);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1215 setObjectRects();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1216 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1217 private void setExtent(int width, int height){
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1218 // Resize the width and height of the embedded/linked OLENatives object
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1219 // to the specified values.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1220
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1221 if (objIOleObject is null || isStatic || inUpdate) return;
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1222 SIZE* currentExtent = getExtent();
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1223 if (width is currentExtent.cx && height is currentExtent.cy) return;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1224
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1225 SIZE* newExtent = new SIZE();
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1226 newExtent.cx = width; newExtent.cy = height;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1227 newExtent = xFormPixelsToHimetric(newExtent);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1228
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1229 // Get the server running first, then do a SetExtent, then show it
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1230 bool alreadyRunning = cast(bool) COM.OleIsRunning(objIOleObject);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1231 if (!alreadyRunning)
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1232 COM.OleRun(objIOleObject);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1233
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1234 if (objIOleObject.SetExtent(aspect, newExtent) is COM.S_OK){
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1235 inUpdate = true;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1236 objIOleObject.Update();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1237 inUpdate = false;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1238 if (!alreadyRunning)
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1239 // Close server if it wasn't already running upon entering this method.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1240 objIOleObject.Close(COM.OLECLOSE_SAVEIFDIRTY);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1241 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1242 }
246
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1243 /**
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1244 * The indent value is no longer being used by the client site.
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1245 *
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1246 * @param newIndent the rectangle representing the indent amount
fd9c62a2998e Updater SWT 3.4M7 to 3.4
Frank Benoit <benoit@tionex.de>
parents: 212
diff changeset
1247 */
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1248 public void setIndent(Rectangle newIndent) {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1249 indent.left = newIndent.x;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1250 indent.right = newIndent.width;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1251 indent.top = newIndent.y;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1252 indent.bottom = newIndent.height;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1253 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1254 private void setObjectRects() {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1255 if (objIOleInPlaceObject is null) return;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1256 // size the object to fill the available space
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1257 // leave a border
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1258 RECT* rect = getRect();
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1259 objIOleInPlaceObject.SetObjectRects(rect, rect);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1260 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1261
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1262 private int ShowObject() {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1263 /* Tells the container to position the object so it is visible to
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1264 * the user. This method ensures that the container itself is
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1265 * visible and not minimized.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1266 */
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1267 return COM.S_OK;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1268 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1269 /**
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1270 * Displays a dialog with the property information for this OLE Object. The OLE Document or
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1271 * ActiveX Control must support the ISpecifyPropertyPages interface.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1272 *
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1273 * @param title the name that will appear in the titlebar of the dialog
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1274 */
212
ab60f3309436 reverted the char[] to String and use the an alias.
Frank Benoit <benoit@tionex.de>
parents: 162
diff changeset
1275 public void showProperties(String title) {
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1276
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1277 // Get the Property Page information from the OLE Object
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1278 ISpecifyPropertyPages objISPP;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1279 if (objIUnknown.QueryInterface(&COM.IIDISpecifyPropertyPages, cast(void**)&objISPP) !is COM.S_OK) return;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1280 CAUUID* caGUID = new CAUUID();
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1281 auto result = objISPP.GetPages(caGUID);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1282 objISPP.Release();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1283 if (result !is COM.S_OK) return;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1284
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1285 // create a frame in which to display the pages
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1286 wchar* chTitle = null;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1287 if (title !is null) {
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1288 chTitle = StrToWCHARz(title);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1289 }
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1290 result = COM.OleCreatePropertyFrame(frame.handle, 10, 10, chTitle, 1, &objIUnknown, caGUID.cElems, caGUID.pElems, COM.LOCALE_USER_DEFAULT, 0, null);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1291
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1292 // free the property page information
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1293 COM.CoTaskMemFree(caGUID.pElems);
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1294 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1295 private bool updateStorage() {
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1296
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1297 if (tempStorage is null) return false;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1298
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1299 IPersistStorage iPersistStorage;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1300 if (objIUnknown.QueryInterface(&COM.IIDIPersistStorage, cast(void**)&iPersistStorage) !is COM.S_OK) return false;
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1301
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1302 auto result = COM.OleSave(iPersistStorage, tempStorage, true);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1303
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1304 if (result !is COM.S_OK){
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1305 // OleSave will fail for static objects, so do what OleSave does.
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1306 COM.WriteClassStg(tempStorage, objClsid);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1307 result = iPersistStorage.Save(tempStorage, true);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1308 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1309
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1310 tempStorage.Commit(COM.STGC_DEFAULT);
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1311 result = iPersistStorage.SaveCompleted(null);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1312 iPersistStorage.Release();
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1313
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1314 return true;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1315 }
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1316 private SIZE* xFormHimetricToPixels(SIZE* aSize) {
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1317 // Return a new Size which is the pixel transformation of a
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1318 // size in HIMETRIC units.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1319
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1320 auto hDC = OS.GetDC(null);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1321 int xppi = OS.GetDeviceCaps(hDC, 88); // logical pixels/inch in x
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1322 int yppi = OS.GetDeviceCaps(hDC, 90); // logical pixels/inch in y
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1323 OS.ReleaseDC(null, hDC);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1324 int cx = Compatibility.round(aSize.cx * xppi, 2540); // 2540 HIMETRIC units per inch
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1325 int cy = Compatibility.round(aSize.cy * yppi, 2540);
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1326 SIZE* size = new SIZE();
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1327 size.cx = cx;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1328 size.cy = cy;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1329 return size;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1330 }
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1331 private SIZE* xFormPixelsToHimetric(SIZE* aSize) {
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1332 // Return a new size which is the HIMETRIC transformation of a
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1333 // size in pixel units.
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1334
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1335 auto hDC = OS.GetDC(null);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1336 int xppi = OS.GetDeviceCaps(hDC, 88); // logical pixels/inch in x
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1337 int yppi = OS.GetDeviceCaps(hDC, 90); // logical pixels/inch in y
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1338 OS.ReleaseDC(null, hDC);
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1339 int cx = Compatibility.round(aSize.cx * 2540, xppi); // 2540 HIMETRIC units per inch
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1340 int cy = Compatibility.round(aSize.cy * 2540, yppi);
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1341 SIZE* size = new SIZE();
97
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1342 size.cx = cx;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1343 size.cy = cy;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1344 return size;
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1345 }
2e6eb5bd2c16 starting OLE
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1346 }
98
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1347
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1348 class _IAdviseSinkImpl : IAdviseSink {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1349
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1350 OleClientSite parent;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1351 this(OleClientSite p) { parent = p; }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1352 extern (Windows):
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1353 // interface of IUnknown
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1354 HRESULT QueryInterface(REFIID riid, void ** ppvObject) { return parent.QueryInterface(riid, ppvObject); }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1355 ULONG AddRef() { return parent.AddRef(); }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1356 ULONG Release() { return parent.Release(); }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1357
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1358 // interface of IAdviseSink
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1359 void OnDataChange(FORMATETC *pFormatetc,STGMEDIUM *pStgmed) {return COM.S_OK; }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1360 void OnViewChange(DWORD dwAspect, LONG lindex) {return COM.S_OK; }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1361 void OnRename(IMoniker pmk) {return COM.S_OK; }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1362 void OnSave() {return COM.S_OK; }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1363 void OnClose() {return COM.S_OK; }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1364 }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1365
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1366 class _IOleClientSiteImpl : IOleClientSite {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1367
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1368 OleClientSite parent;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1369 this(OleClientSite p) { parent = p; }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1370 extern (Windows):
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1371 // interface of IUnknown
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1372 HRESULT QueryInterface(REFIID riid, void ** ppvObject) { return parent.QueryInterface(riid, ppvObject); }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1373 ULONG AddRef() { return parent.AddRef(); }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1374 ULONG Release() { return parent.Release(); }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1375
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1376 // interface of IOleClientSite
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1377 HRESULT SaveObject() { if(parent) parent.updateStorage(); return COM.S_OK; }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1378 HRESULT GetMoniker( DWORD dwAssign, DWORD dwWhichMoniker, IMoniker * ppmk ) {return COM.E_NOTIMPL; }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1379 HRESULT GetContainer( IOleContainer* ppContainer ) { return parent.GetContainer(ppContainer);}
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1380 HRESULT ShowObject() {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1381 /* Tells the container to position the object so it is visible to
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1382 * the user. This method ensures that the container itself is
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1383 * visible and not minimized.
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1384 */
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1385 return COM.S_OK;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1386 }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1387 HRESULT OnShowWindow(BOOL fShow ) {return COM.S_OK; }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1388 HRESULT RequestNewObjectLayout() {return COM.E_NOTIMPL; }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1389 }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1390
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1391 class _IOleDocumentSiteImpl : IOleDocumentSite {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1392
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1393 OleClientSite parent;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1394 this(OleClientSite p) { parent = p; }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1395 extern (Windows):
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1396 // interface of IUnknown
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1397 HRESULT QueryInterface(REFIID riid, void ** ppvObject) { return parent.QueryInterface(riid, ppvObject); }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1398 ULONG AddRef() { return parent.AddRef(); }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1399 ULONG Release() { return parent.Release(); }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1400
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1401 // interface of IOleDocumentSite
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1402 HRESULT ActivateMe(IOleDocumentView pViewToActivate) { return parent.ActivateMe(pViewToActivate);}
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1403 }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1404
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1405 class _IOleInPlaceSiteImpl : IOleInPlaceSite {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1406 OleClientSite parent;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1407 this(OleClientSite p) { parent = p; }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1408 extern (Windows):
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1409 // interface of IUnknown
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1410 HRESULT QueryInterface(REFIID riid, void ** ppvObject) { return parent.QueryInterface(riid, ppvObject); }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1411 ULONG AddRef() { return parent.AddRef(); }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1412 ULONG Release() { return parent.Release(); }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1413
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1414 // interface of IOleWindow
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1415 HRESULT GetWindow( HWND* phwnd ) { return parent.GetWindow(phwnd); }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1416 HRESULT ContextSensitiveHelp( BOOL fEnterMode ) {return COM.S_OK; }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1417
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1418 // interface of IOleInPlaceSite
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1419 HRESULT CanInPlaceActivate() { return parent.CanInPlaceActivate();}
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1420 HRESULT OnInPlaceActivate() { return parent.OnInPlaceActivate(); }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1421 HRESULT OnUIActivate() { return parent.OnUIActivate(); }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1422 HRESULT GetWindowContext( IOleInPlaceFrame * ppFrame, IOleInPlaceUIWindow * ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo ) {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1423 return parent.GetWindowContext(ppFrame, ppDoc, lprcPosRect, lprcClipRect, lpFrameInfo);
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1424 }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1425 HRESULT Scroll( SIZE scrollExtant ) {return COM.S_OK; }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1426 HRESULT OnUIDeactivate( BOOL fUndoable ) { return parent.OnUIDeactivate(fUndoable);}
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1427 HRESULT OnInPlaceDeactivate() { return parent.OnInPlaceDeactivate();}
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1428 HRESULT DiscardUndoState() {return COM.E_NOTIMPL; }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1429 HRESULT DeactivateAndUndo() {return COM.E_NOTIMPL; }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1430 HRESULT OnPosRectChange( LPCRECT lprcPosRect) { return parent.OnPosRectChange(lprcPosRect);}
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1431 }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1432
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1433 class _IUnknownImpl : IUnknown
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1434 {
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1435
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1436 OleClientSite parent;
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1437 this(OleClientSite p) { parent = p; }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1438 extern (Windows):
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1439 // interface of IUnknown
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1440 HRESULT QueryInterface(REFIID riid, void ** ppvObject) { return parent.QueryInterface(riid, ppvObject); }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1441 ULONG AddRef() { return parent.AddRef(); }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1442 ULONG Release() { return parent.Release(); }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1443 }
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1444
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1445
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1446
ecba636b634e package dwt/ole
Frank Benoit <benoit@tionex.de>
parents: 97
diff changeset
1447