annotate dwt/ole/win32/OleClientSite.d @ 212:ab60f3309436

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