All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.swt.ole.win32.OleControlSite Maven / Gradle / Ivy

Go to download

SWT is an open source widget toolkit for Java designed to provide efficient, portable access to the user-interface facilities of the operating systems on which it is implemented.

The newest version!
/*******************************************************************************
 * Copyright (c) 2000, 2013 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.swt.ole.win32;

import java.io.*;

import org.eclipse.swt.*;
import org.eclipse.swt.internal.ole.win32.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.internal.win32.*;

/**
 * OleControlSite provides a site to manage an embedded ActiveX Control within a container.
 *
 * 

In addition to the behaviour provided by OleClientSite, this object provides the following: *

    *
  • events from the ActiveX control *
  • notification of property changes from the ActiveX control *
  • simplified access to well known properties of the ActiveX Control (e.g. font, background color) *
  • expose ambient properties of the container to the ActiveX Control *
* *

This object implements the OLE Interfaces IOleControlSite, IDispatch, and IPropertyNotifySink. * *

Note that although this class is a subclass of Composite, * it does not make sense to add Control children to it, * or set a layout on it. *

*

*
Styles
BORDER *
Events
Dispose, Move, Resize *
* * @see OLE and ActiveX snippets * @see SWT Examples: OLEExample, OleWebBrowser */ public class OleControlSite extends OleClientSite { // interfaces for this container private COMObject iOleControlSite; private COMObject iDispatch; // supporting Property Change attributes private OlePropertyChangeSink olePropertyChangeSink; // supporting Event Sink attributes private OleEventSink[] oleEventSink = new OleEventSink[0]; private GUID[] oleEventSinkGUID = new GUID[0]; private int /*long*/[] oleEventSinkIUnknown = new int /*long*/[0]; // supporting information for the Control COM object private CONTROLINFO currentControlInfo; private int[] sitePropertyIds = new int[0]; private Variant[] sitePropertyValues = new Variant[0]; private Font font; // work around for IE destroying the caret static int SWT_RESTORECARET; static final String SHELL_PROG_ID = "Shell.Explorer"; //$NON-NLS-1$ /** * Create an OleControlSite child widget using the OLE Document type associated with the * specified file. The OLE Document type is determined either through header information in the file * or through a Registry entry for the file extension. Use style bits to select a particular look * or set of properties. * * @param parent a composite widget; must be an OleFrame * @param style the bitwise OR'ing of widget styles * @param file the file that is to be opened in this OLE Document * * @exception IllegalArgumentException *
  • ERROR_NULL_ARGUMENT when the parent is null *
  • ERROR_INVALID_ARGUMENT when the parent is not an OleFrame
* @exception SWTException *
  • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread *
  • ERROR_CANNOT_CREATE_OBJECT when failed to create OLE Object *
  • ERROR_CANNOT_OPEN_FILE when failed to open file *
  • ERROR_INTERFACE_NOT_FOUND when unable to create callbacks for OLE Interfaces *
  • ERROR_INVALID_CLASSID *
* * @since 3.5 */ public OleControlSite(Composite parent, int style, File file) { super(parent, style, file); // Init site properties setSiteProperty(COM.DISPID_AMBIENT_USERMODE, new Variant(true)); setSiteProperty(COM.DISPID_AMBIENT_UIDEAD, new Variant(false)); } /** * Create an OleControlSite child widget using style bits * to select a particular look or set of properties. * * @param parent a composite widget; must be an OleFrame * @param style the bitwise OR'ing of widget styles * @param progId the unique program identifier which has been registered for this ActiveX Control; * the value of the ProgID key or the value of the VersionIndependentProgID key specified * in the registry for this Control (for example, the VersionIndependentProgID for * Internet Explorer is Shell.Explorer) * * @exception IllegalArgumentException
    *
  • ERROR_NULL_ARGUMENT when the parent is null *
* @exception SWTException
    *
  • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread *
  • ERROR_INVALID_CLASSID when the progId does not map to a registered CLSID *
  • ERROR_CANNOT_CREATE_OBJECT when failed to create OLE Object *
  • ERROR_CANNOT_ACCESS_CLASSFACTORY when Class Factory could not be found *
  • ERROR_CANNOT_CREATE_LICENSED_OBJECT when failed to create a licensed OLE Object *
*/ public OleControlSite(Composite parent, int style, String progId) { super(parent, style); try { // check for licensing appClsid = getClassID(progId); if (appClsid == null) OLE.error(OLE.ERROR_INVALID_CLASSID); int /*long*/ licinfo = getLicenseInfo(appClsid); if (licinfo == 0) { // Open a storage object tempStorage = createTempStorage(); // Create ole object with storage object int /*long*/[] address = new int /*long*/[1]; /* * Bug in ICA Client 2.7. The creation of the IOleObject fails if the client * site is provided to OleCreate(). The fix is to detect that the program * id is an ICA Client and do not pass a client site to OleCreate(). * IOleObject.SetClientSite() is called later on. */ int /*long*/ clientSite = isICAClient() ? 0 : iOleClientSite.getAddress(); int result = COM.OleCreate(appClsid, COM.IIDIUnknown, COM.OLERENDER_DRAW, null, clientSite, tempStorage.getAddress(), address); if (result != COM.S_OK) OLE.error(OLE.ERROR_CANNOT_CREATE_OBJECT, result); objIUnknown = new IUnknown(address[0]); } else { // Prepare the ClassFactory int /*long*/[] ppvObject = new int /*long*/[1]; try { int result = COM.CoGetClassObject(appClsid, COM.CLSCTX_INPROC_HANDLER | COM.CLSCTX_INPROC_SERVER, 0, COM.IIDIClassFactory2, ppvObject); if (result != COM.S_OK) { OLE.error(OLE.ERROR_CANNOT_ACCESS_CLASSFACTORY, result); } IClassFactory2 classFactory = new IClassFactory2(ppvObject[0]); // Create Com Object ppvObject = new int /*long*/[1]; result = classFactory.CreateInstanceLic(0, 0, COM.IIDIUnknown, licinfo, ppvObject); classFactory.Release(); if (result != COM.S_OK) OLE.error(OLE.ERROR_CANNOT_CREATE_LICENSED_OBJECT, result); } finally { COM.SysFreeString(licinfo); } objIUnknown = new IUnknown(ppvObject[0]); // Prepare a storage medium ppvObject = new int /*long*/[1]; if (objIUnknown.QueryInterface(COM.IIDIPersistStorage, ppvObject) == COM.S_OK) { IPersistStorage persist = new IPersistStorage(ppvObject[0]); tempStorage = createTempStorage(); persist.InitNew(tempStorage.getAddress()); persist.Release(); } } // Init sinks addObjectReferences(); // Init site properties setSiteProperty(COM.DISPID_AMBIENT_USERMODE, new Variant(true)); setSiteProperty(COM.DISPID_AMBIENT_UIDEAD, new Variant(false)); if (COM.OleRun(objIUnknown.getAddress()) == OLE.S_OK) state= STATE_RUNNING; } catch (SWTError e) { dispose(); disposeCOMInterfaces(); throw e; } } /** * Create an OleClientSite child widget to edit the specified file using the specified OLE Document * application. Use style bits to select a particular look or set of properties. *

* IMPORTANT: This method is not part of the public * API for OleClientSite. It is marked public only so that it * can be shared within the packages provided by SWT. It is not * available on all platforms, and should never be called from * application code. *

* @param parent a composite widget; must be an OleFrame * @param style the bitwise OR'ing of widget styles * @param progId the unique program identifier of am OLE Document application; * the value of the ProgID key or the value of the VersionIndependentProgID key specified * in the registry for the desired OLE Document (for example, the VersionIndependentProgID * for Word is Word.Document) * @param file the file that is to be opened in this OLE Document * * @exception IllegalArgumentException *
  • ERROR_NULL_ARGUMENT when the parent is null *
  • ERROR_INVALID_ARGUMENT when the parent is not an OleFrame
* @exception SWTException *
  • ERROR_THREAD_INVALID_ACCESS when called from the wrong thread *
  • ERROR_INVALID_CLASSID when the progId does not map to a registered CLSID *
  • ERROR_CANNOT_CREATE_OBJECT when failed to create OLE Object *
  • ERROR_CANNOT_OPEN_FILE when failed to open file *
* * @noreference This method is not intended to be referenced by clients. * * @since 3.5 */ public OleControlSite(Composite parent, int style, String progId, File file) { super(parent, style, progId, file); // Init site properties setSiteProperty(COM.DISPID_AMBIENT_USERMODE, new Variant(true)); setSiteProperty(COM.DISPID_AMBIENT_UIDEAD, new Variant(false)); } /** * Adds the listener to receive events. * * @param eventID the id of the event * * @param listener the listener * * @exception IllegalArgumentException
    *
  • ERROR_NULL_ARGUMENT when listener is null
  • *
*/ public void addEventListener(int eventID, OleListener listener) { if (listener == null) OLE.error (SWT.ERROR_NULL_ARGUMENT); GUID riid = getDefaultEventSinkGUID(objIUnknown); if (riid != null) { addEventListener(objIUnknown.getAddress(), riid, eventID, listener); } } static GUID getDefaultEventSinkGUID(IUnknown unknown) { // get Event Sink I/F from IProvideClassInfo2 int /*long*/[] ppvObject = new int /*long*/[1]; if (unknown.QueryInterface(COM.IIDIProvideClassInfo2, ppvObject) == COM.S_OK) { IProvideClassInfo2 pci2 = new IProvideClassInfo2(ppvObject[0]); GUID riid = new GUID(); int result = pci2.GetGUID(COM.GUIDKIND_DEFAULT_SOURCE_DISP_IID, riid); pci2.Release(); if (result == COM.S_OK) return riid; } // get Event Sink I/F from IProvideClassInfo if (unknown.QueryInterface(COM.IIDIProvideClassInfo, ppvObject) == COM.S_OK) { IProvideClassInfo pci = new IProvideClassInfo(ppvObject[0]); int /*long*/[] ppTI = new int /*long*/[1]; int /*long*/[] ppEI = new int /*long*/[1]; int result = pci.GetClassInfo(ppTI); pci.Release(); if (result == COM.S_OK && ppTI[0] != 0) { ITypeInfo classInfo = new ITypeInfo(ppTI[0]); int /*long*/[] ppTypeAttr = new int /*long*/[1]; result = classInfo.GetTypeAttr(ppTypeAttr); if (result == COM.S_OK && ppTypeAttr[0] != 0) { TYPEATTR typeAttribute = new TYPEATTR(); COM.MoveMemory(typeAttribute, ppTypeAttr[0], TYPEATTR.sizeof); classInfo.ReleaseTypeAttr(ppTypeAttr[0]); int implMask = COM.IMPLTYPEFLAG_FDEFAULT | COM.IMPLTYPEFLAG_FSOURCE | COM.IMPLTYPEFLAG_FRESTRICTED; int implBits = COM.IMPLTYPEFLAG_FDEFAULT | COM.IMPLTYPEFLAG_FSOURCE; for (int i = 0; i < typeAttribute.cImplTypes; i++) { int[] pImplTypeFlags = new int[1]; if (classInfo.GetImplTypeFlags(i, pImplTypeFlags) == COM.S_OK) { if ((pImplTypeFlags[0] & implMask) == implBits) { int[] pRefType = new int[1]; if (classInfo.GetRefTypeOfImplType(i, pRefType) == COM.S_OK) { classInfo.GetRefTypeInfo(pRefType[0], ppEI); } } } } } classInfo.Release(); if (ppEI[0] != 0) { ITypeInfo eventInfo = new ITypeInfo(ppEI[0]); ppTypeAttr = new int /*long*/[1]; result = eventInfo.GetTypeAttr(ppTypeAttr); GUID riid = null; if (result == COM.S_OK && ppTypeAttr[0] != 0) { riid = new GUID(); COM.MoveMemory(riid, ppTypeAttr[0], GUID.sizeof); eventInfo.ReleaseTypeAttr(ppTypeAttr[0]); } eventInfo.Release(); return riid; } } } return null; } /** * Adds the listener to receive events. * * @since 2.0 * * @param automation the automation object that provides the event notification * @param eventID the id of the event * @param listener the listener * * @exception IllegalArgumentException
    *
  • ERROR_NULL_ARGUMENT when listener is null
  • *
*/ public void addEventListener(OleAutomation automation, int eventID, OleListener listener) { if (listener == null || automation == null) OLE.error (SWT.ERROR_NULL_ARGUMENT); int /*long*/ address = automation.getAddress(); IUnknown unknown = new IUnknown(address); GUID riid = getDefaultEventSinkGUID(unknown); if (riid != null) { addEventListener(address, riid, eventID, listener); } } /** * Adds the listener to receive events. * * @since 3.2 * * @param automation the automation object that provides the event notification * @param eventSinkId the GUID of the event sink * @param eventID the id of the event * @param listener the listener * * @exception IllegalArgumentException
    *
  • ERROR_NULL_ARGUMENT when listener is null
  • *
*/ public void addEventListener(OleAutomation automation, String eventSinkId, int eventID, OleListener listener) { if (listener == null || automation == null || eventSinkId == null) OLE.error (SWT.ERROR_NULL_ARGUMENT); int /*long*/ address = automation.getAddress(); if (address == 0) return; char[] buffer = (eventSinkId +"\0").toCharArray(); GUID guid = new GUID(); if (COM.IIDFromString(buffer, guid) != COM.S_OK) return; addEventListener(address, guid, eventID, listener); } void addEventListener(int /*long*/ iunknown, GUID guid, int eventID, OleListener listener) { if (listener == null || iunknown == 0 || guid == null) OLE.error (SWT.ERROR_NULL_ARGUMENT); // have we connected to this kind of event sink before? int index = -1; for (int i = 0; i < oleEventSinkGUID.length; i++) { if (COM.IsEqualGUID(oleEventSinkGUID[i], guid)) { if (iunknown == oleEventSinkIUnknown[i]) { index = i; break; } } } if (index != -1) { oleEventSink[index].addListener(eventID, listener); } else { int oldLength = oleEventSink.length; OleEventSink[] newOleEventSink = new OleEventSink[oldLength + 1]; GUID[] newOleEventSinkGUID = new GUID[oldLength + 1]; int /*long*/[] newOleEventSinkIUnknown = new int /*long*/[oldLength + 1]; System.arraycopy(oleEventSink, 0, newOleEventSink, 0, oldLength); System.arraycopy(oleEventSinkGUID, 0, newOleEventSinkGUID, 0, oldLength); System.arraycopy(oleEventSinkIUnknown, 0, newOleEventSinkIUnknown, 0, oldLength); oleEventSink = newOleEventSink; oleEventSinkGUID = newOleEventSinkGUID; oleEventSinkIUnknown = newOleEventSinkIUnknown; oleEventSink[oldLength] = new OleEventSink(this, iunknown, guid); oleEventSinkGUID[oldLength] = guid; oleEventSinkIUnknown[oldLength] = iunknown; oleEventSink[oldLength].AddRef(); oleEventSink[oldLength].connect(); oleEventSink[oldLength].addListener(eventID, listener); } } protected void addObjectReferences() { super.addObjectReferences(); // Get property change notification from control connectPropertyChangeSink(); // Get access to the Control object int /*long*/[] ppvObject = new int /*long*/[1]; if (objIUnknown.QueryInterface(COM.IIDIOleControl, ppvObject) == COM.S_OK) { IOleControl objIOleControl = new IOleControl(ppvObject[0]); // ask the control for its info in case users // need to act on it currentControlInfo = new CONTROLINFO(); objIOleControl.GetControlInfo(currentControlInfo); objIOleControl.Release(); } } /** * Adds the listener to receive events. * * @param propertyID the identifier of the property * @param listener the listener * * @exception IllegalArgumentException
    *
  • ERROR_NULL_ARGUMENT when listener is null
  • *
*/ public void addPropertyListener(int propertyID, OleListener listener) { if (listener == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); olePropertyChangeSink.addListener(propertyID, listener); } private void connectPropertyChangeSink() { olePropertyChangeSink = new OlePropertyChangeSink(this); olePropertyChangeSink.AddRef(); olePropertyChangeSink.connect(objIUnknown); } protected void createCOMInterfaces () { super.createCOMInterfaces(); // register each of the interfaces that this object implements iOleControlSite = new COMObject(new int[]{2, 0, 0, 0, 1, 1, 3, 2, 1, 0}){ public int /*long*/ method0(int /*long*/[] args) {return QueryInterface(args[0], args[1]);} public int /*long*/ method1(int /*long*/[] args) {return AddRef();} public int /*long*/ method2(int /*long*/[] args) {return Release();} public int /*long*/ method3(int /*long*/[] args) {return OnControlInfoChanged();} // method4 LockInPlaceActive - not implemented // method5 GetExtendedControl - not implemented // method6 TransformCoords - not implemented // method7 Translate Accelerator - not implemented public int /*long*/ method8(int /*long*/[] args) {return OnFocus((int)/*64*/args[0]);} // method9 ShowPropertyFrame - not implemented }; iDispatch = new COMObject(new int[]{2, 0, 0, 1, 3, 5, 8}){ public int /*long*/ method0(int /*long*/[] args) {return QueryInterface(args[0], args[1]);} public int /*long*/ method1(int /*long*/[] args) {return AddRef();} public int /*long*/ method2(int /*long*/[] args) {return Release();} // method3 GetTypeInfoCount - not implemented // method4 GetTypeInfo - not implemented // method5 GetIDsOfNames - not implemented public int /*long*/ method6(int /*long*/[] args) {return Invoke((int)/*64*/args[0], args[1], (int)/*64*/args[2], (int)/*64*/args[3], args[4], args[5], args[6], args[7]);} }; } private void disconnectEventSinks() { for (int i = 0; i < oleEventSink.length; i++) { OleEventSink sink = oleEventSink[i]; sink.disconnect(); sink.Release(); } oleEventSink = new OleEventSink[0]; oleEventSinkGUID = new GUID[0]; oleEventSinkIUnknown = new int /*long*/[0]; } private void disconnectPropertyChangeSink() { if (olePropertyChangeSink != null) { olePropertyChangeSink.disconnect(objIUnknown); olePropertyChangeSink.Release(); } olePropertyChangeSink = null; } protected void disposeCOMInterfaces() { super.disposeCOMInterfaces(); if (iOleControlSite != null) iOleControlSite.dispose(); iOleControlSite = null; if (iDispatch != null) iDispatch.dispose(); iDispatch = null; } public Color getBackground () { if (objIUnknown != null) { // !! We are getting the OLE_COLOR - should we change this to the COLORREF value? OleAutomation oleObject= new OleAutomation(this); Variant varBackColor = oleObject.getProperty(COM.DISPID_BACKCOLOR); oleObject.dispose(); if (varBackColor != null){ int[] colorRef = new int[1]; if (COM.OleTranslateColor(varBackColor.getInt(), getDisplay().hPalette, colorRef) == COM.S_OK) return Color.win32_new(getDisplay(), colorRef[0]); } } return super.getBackground(); } public Font getFont () { if (font != null && !font.isDisposed()) return font; if (objIUnknown != null) { OleAutomation oleObject= new OleAutomation(this); Variant varDispFont = oleObject.getProperty(COM.DISPID_FONT); oleObject.dispose(); if (varDispFont != null){ OleAutomation iDispFont = varDispFont.getAutomation(); Variant lfFaceName = iDispFont.getProperty(COM.DISPID_FONT_NAME); Variant lfHeight = iDispFont.getProperty(COM.DISPID_FONT_SIZE); Variant lfItalic = iDispFont.getProperty(COM.DISPID_FONT_ITALIC); //Variant lfCharSet = iDispFont.getProperty(COM.DISPID_FONT_CHARSET); Variant lfBold = iDispFont.getProperty(COM.DISPID_FONT_BOLD); iDispFont.dispose(); if (lfFaceName != null && lfHeight != null && lfItalic != null && lfBold != null){ int style = 3 * lfBold.getInt() + 2 * lfItalic.getInt(); font = new Font(getShell().getDisplay(), lfFaceName.getString(), lfHeight.getInt(), style); return font; } } } return super.getFont(); } public Color getForeground () { if (objIUnknown != null) { // !! We are getting the OLE_COLOR - should we change this to the COLORREF value? OleAutomation oleObject= new OleAutomation(this); Variant varForeColor = oleObject.getProperty(COM.DISPID_FORECOLOR); oleObject.dispose(); if (varForeColor != null){ int[] colorRef = new int[1]; if (COM.OleTranslateColor(varForeColor.getInt(), getDisplay().hPalette, colorRef) == COM.S_OK) return Color.win32_new(getDisplay(), colorRef[0]); } } return super.getForeground(); } protected int /*long*/ getLicenseInfo(GUID clsid) { int /*long*/[] ppvObject = new int /*long*/[1]; if (COM.CoGetClassObject(clsid, COM.CLSCTX_INPROC_HANDLER | COM.CLSCTX_INPROC_SERVER, 0, COM.IIDIClassFactory, ppvObject) != COM.S_OK) { return 0; } int /*long*/ result = 0; IUnknown unknown = new IUnknown(ppvObject[0]); if (unknown.QueryInterface(COM.IIDIClassFactory2, ppvObject) == COM.S_OK) { IClassFactory2 classFactory = new IClassFactory2(ppvObject[0]); LICINFO licinfo = new LICINFO(); if (classFactory.GetLicInfo(licinfo) == COM.S_OK) { int /*long*/[] pBstrKey = new int /*long*/[1]; if (licinfo != null && licinfo.fRuntimeKeyAvail) { if (classFactory.RequestLicKey(0, pBstrKey) == COM.S_OK) { result = pBstrKey[0]; } } } classFactory.Release(); } unknown.Release(); return result; } /** * * Get the control site property specified by the dispIdMember, or * null if the dispId is not recognised. * * @param dispId the dispId * * @return the property value or null * * @since 2.1 */ public Variant getSiteProperty(int dispId){ for (int i = 0; i < sitePropertyIds.length; i++) { if (sitePropertyIds[i] == dispId) { return sitePropertyValues[i]; } } return null; } protected int GetWindow(int /*long*/ phwnd) { if (phwnd == 0) return COM.E_INVALIDARG; if (frame == null) { COM.MoveMemory(phwnd, new int /*long*/[] {0}, OS.PTR_SIZEOF); return COM.E_NOTIMPL; } // Copy the Window's handle into the memory passed in COM.MoveMemory(phwnd, new int /*long*/[] {handle}, OS.PTR_SIZEOF); return COM.S_OK; } private int Invoke(int dispIdMember, int /*long*/ riid, int lcid, int dwFlags, int /*long*/ pDispParams, int /*long*/ pVarResult, int /*long*/ pExcepInfo, int /*long*/ pArgErr) { if (pVarResult == 0 || dwFlags != COM.DISPATCH_PROPERTYGET) { if (pExcepInfo != 0) COM.MoveMemory(pExcepInfo, new int /*long*/ [] {0}, OS.PTR_SIZEOF); if (pArgErr != 0) COM.MoveMemory(pArgErr, new int[] {0}, 4); return COM.DISP_E_MEMBERNOTFOUND; } Variant result = getSiteProperty(dispIdMember); if (result != null) { if (pVarResult != 0) result.getData(pVarResult); return COM.S_OK; } switch (dispIdMember) { // indicate a false result case COM.DISPID_AMBIENT_SUPPORTSMNEMONICS : case COM.DISPID_AMBIENT_SHOWGRABHANDLES : case COM.DISPID_AMBIENT_SHOWHATCHING : if (pVarResult != 0) COM.MoveMemory(pVarResult, new int /*long*/ [] {0}, OS.PTR_SIZEOF); if (pExcepInfo != 0) COM.MoveMemory(pExcepInfo, new int /*long*/ [] {0}, OS.PTR_SIZEOF); if (pArgErr != 0) COM.MoveMemory(pArgErr, new int[] {0}, 4); return COM.S_FALSE; // not implemented case COM.DISPID_AMBIENT_OFFLINEIFNOTCONNECTED : case COM.DISPID_AMBIENT_BACKCOLOR : case COM.DISPID_AMBIENT_FORECOLOR : case COM.DISPID_AMBIENT_FONT : case COM.DISPID_AMBIENT_LOCALEID : case COM.DISPID_AMBIENT_SILENT : case COM.DISPID_AMBIENT_MESSAGEREFLECT : if (pVarResult != 0) COM.MoveMemory(pVarResult, new int /*long*/ [] {0}, OS.PTR_SIZEOF); if (pExcepInfo != 0) COM.MoveMemory(pExcepInfo, new int /*long*/ [] {0}, OS.PTR_SIZEOF); if (pArgErr != 0) COM.MoveMemory(pArgErr, new int[] {0}, 4); return COM.E_NOTIMPL; default : if (pVarResult != 0) COM.MoveMemory(pVarResult, new int /*long*/ [] {0}, OS.PTR_SIZEOF); if (pExcepInfo != 0) COM.MoveMemory(pExcepInfo,new int /*long*/ [] {0}, OS.PTR_SIZEOF); if (pArgErr != 0) COM.MoveMemory(pArgErr, new int[] {0}, 4); return COM.DISP_E_MEMBERNOTFOUND; } } private int OnControlInfoChanged() { int /*long*/[] ppvObject = new int /*long*/[1]; if (objIUnknown.QueryInterface(COM.IIDIOleControl, ppvObject) == COM.S_OK) { IOleControl objIOleControl = new IOleControl(ppvObject[0]); // ask the control for its info in case users // need to act on it currentControlInfo = new CONTROLINFO(); objIOleControl.GetControlInfo(currentControlInfo); objIOleControl.Release(); } return COM.S_OK; } protected int OnUIDeactivate(int fUndoable) { return super.OnUIDeactivate(fUndoable); } void onFocusIn(Event e) { String progID = getProgramID(); if (progID == null) return; if (!progID.startsWith(SHELL_PROG_ID)) { super.onFocusIn(e); return; } if (objIOleInPlaceObject == null) return; if (!isActivated) doVerb(OLE.OLEIVERB_UIACTIVATE); if (isFocusControl()) return; int /*long*/[] phwnd = new int /*long*/[1]; objIOleInPlaceObject.GetWindow(phwnd); if (phwnd[0] == 0) return; OS.SetFocus(phwnd[0]); } void onFocusOut(Event e) { if (objIOleInPlaceObject == null) return; String progID = getProgramID(); if (progID == null) return; if (!progID.startsWith(SHELL_PROG_ID)) { super.onFocusOut(e); return; } /* * FocusOut is received when focus is reassigned between handles within * our site. In such cases the site should not be UIDeactivated. */ if (isFocusControl()) return; /* * Bug in Windows. When IE7 loses focus and UIDeactivate() * is called, IE destroys the caret even though it is * no longer owned by IE. If focus has moved to a control * that shows a caret then the caret disappears. The fix * is to detect this case and restore the caret. */ int threadId = OS.GetCurrentThreadId(); GUITHREADINFO lpgui1 = new GUITHREADINFO(); lpgui1.cbSize = GUITHREADINFO.sizeof; OS.GetGUIThreadInfo(threadId, lpgui1); objIOleInPlaceObject.UIDeactivate(); if (SWT_RESTORECARET == 0) { SWT_RESTORECARET = OS.RegisterWindowMessage (new TCHAR (0, "SWT_RESTORECARET", true)); } if (lpgui1.hwndCaret != 0) { GUITHREADINFO lpgui2 = new GUITHREADINFO(); lpgui2.cbSize = GUITHREADINFO.sizeof; OS.GetGUIThreadInfo(threadId, lpgui2); if (lpgui2.hwndCaret == 0 && lpgui1.hwndCaret == OS.GetFocus()) { /* * If the caret was not restored by SWT, put it back using * the information from GUITHREADINFO. Note that this will * not be correct when the caret has a bitmap. There is no * API to query the bitmap that the caret is using. */ if (OS.SendMessage (lpgui1.hwndCaret, SWT_RESTORECARET, 0, 0) == 0) { int width = lpgui1.right - lpgui1.left; int height = lpgui1.bottom - lpgui1.top; OS.CreateCaret (lpgui1.hwndCaret, 0, width, height); OS.SetCaretPos (lpgui1.left, lpgui1.top); OS.ShowCaret (lpgui1.hwndCaret); } } } else if (lpgui1.hwndFocus != 0 && lpgui1.hwndFocus == OS.GetFocus()) { OS.SendMessage (lpgui1.hwndFocus, SWT_RESTORECARET, 0, 0); } } private int OnFocus(int fGotFocus) { return COM.S_OK; } protected int QueryInterface(int /*long*/ riid, int /*long*/ ppvObject) { int result = super.QueryInterface(riid, ppvObject); if (result == COM.S_OK) return result; if (riid == 0 || ppvObject == 0) return COM.E_INVALIDARG; GUID guid = new GUID(); COM.MoveMemory(guid, riid, GUID.sizeof); if (COM.IsEqualGUID(guid, COM.IIDIOleControlSite)) { COM.MoveMemory(ppvObject, new int /*long*/[] {iOleControlSite.getAddress()}, OS.PTR_SIZEOF); AddRef(); return COM.S_OK; } if (COM.IsEqualGUID(guid, COM.IIDIDispatch)) { COM.MoveMemory(ppvObject, new int /*long*/[] {iDispatch.getAddress()}, OS.PTR_SIZEOF); AddRef(); return COM.S_OK; } COM.MoveMemory(ppvObject, new int /*long*/[] {0}, OS.PTR_SIZEOF); return COM.E_NOINTERFACE; } protected int Release() { int result = super.Release(); if (result == 0) { for (int i = 0; i < sitePropertyIds.length; i++) { sitePropertyValues[i].dispose(); } sitePropertyIds = new int[0]; sitePropertyValues = new Variant[0]; } return result; } protected void releaseObjectInterfaces() { disconnectEventSinks(); disconnectPropertyChangeSink(); super.releaseObjectInterfaces(); } /** * Removes the listener. * * @param eventID the event identifier * * @param listener the listener which should no longer be notified * * @exception IllegalArgumentException
    *
  • ERROR_NULL_ARGUMENT when listener is null
  • *
*/ public void removeEventListener(int eventID, OleListener listener) { checkWidget(); if (listener == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); GUID riid = getDefaultEventSinkGUID(objIUnknown); if (riid != null) { removeEventListener(objIUnknown.getAddress(), riid, eventID, listener); } } /** * Removes the listener. * * @since 2.0 * @deprecated - use OleControlSite.removeEventListener(OleAutomation, int, OleListener) * * @param automation the automation object that provides the event notification * * @param guid the identifier of the events COM interface * * @param eventID the event identifier * * @param listener the listener * * @exception IllegalArgumentException
    *
  • ERROR_NULL_ARGUMENT when listener is null
  • *
*/ public void removeEventListener(OleAutomation automation, GUID guid, int eventID, OleListener listener) { checkWidget(); if (automation == null || listener == null || guid == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); removeEventListener(automation.getAddress(), guid, eventID, listener); } /** * Removes the listener. * * @param automation the automation object that provides the event notification * @param eventID the event identifier * @param listener the listener which should no longer be notified * * @exception IllegalArgumentException
    *
  • ERROR_NULL_ARGUMENT when listener is null
  • *
* * @since 2.0 */ public void removeEventListener(OleAutomation automation, int eventID, OleListener listener) { checkWidget(); if (automation == null || listener == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); int /*long*/ address = automation.getAddress(); IUnknown unknown = new IUnknown(address); GUID riid = getDefaultEventSinkGUID(unknown); if (riid != null) { removeEventListener(address, riid, eventID, listener); } } void removeEventListener(int /*long*/ iunknown, GUID guid, int eventID, OleListener listener) { if (listener == null || guid == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); for (int i = 0; i < oleEventSink.length; i++) { if (COM.IsEqualGUID(oleEventSinkGUID[i], guid)) { if (iunknown == oleEventSinkIUnknown[i]) { oleEventSink[i].removeListener(eventID, listener); if (!oleEventSink[i].hasListeners()) { //free resources associated with event sink oleEventSink[i].disconnect(); oleEventSink[i].Release(); int oldLength = oleEventSink.length; if (oldLength == 1) { oleEventSink = new OleEventSink[0]; oleEventSinkGUID = new GUID[0]; oleEventSinkIUnknown = new int /*long*/[0]; } else { OleEventSink[] newOleEventSink = new OleEventSink[oldLength - 1]; System.arraycopy(oleEventSink, 0, newOleEventSink, 0, i); System.arraycopy(oleEventSink, i + 1, newOleEventSink, i, oldLength - i - 1); oleEventSink = newOleEventSink; GUID[] newOleEventSinkGUID = new GUID[oldLength - 1]; System.arraycopy(oleEventSinkGUID, 0, newOleEventSinkGUID, 0, i); System.arraycopy(oleEventSinkGUID, i + 1, newOleEventSinkGUID, i, oldLength - i - 1); oleEventSinkGUID = newOleEventSinkGUID; int /*long*/[] newOleEventSinkIUnknown = new int /*long*/[oldLength - 1]; System.arraycopy(oleEventSinkIUnknown, 0, newOleEventSinkIUnknown, 0, i); System.arraycopy(oleEventSinkIUnknown, i + 1, newOleEventSinkIUnknown, i, oldLength - i - 1); oleEventSinkIUnknown = newOleEventSinkIUnknown; } } return; } } } } /** * Removes the listener. * * @param propertyID the identifier of the property * @param listener the listener which should no longer be notified * * @exception IllegalArgumentException
    *
  • ERROR_NULL_ARGUMENT when listener is null
  • *
*/ public void removePropertyListener(int propertyID, OleListener listener) { if (listener == null) SWT.error (SWT.ERROR_NULL_ARGUMENT); olePropertyChangeSink.removeListener(propertyID, listener); } public void setBackground (Color color) { super.setBackground(color); //set the background of the ActiveX Control if (objIUnknown != null) { OleAutomation oleObject= new OleAutomation(this); oleObject.setProperty(COM.DISPID_BACKCOLOR, new Variant(color.handle)); oleObject.dispose(); } } public void setFont (Font font) { super.setFont(font); //set the font of the ActiveX Control if (objIUnknown != null) { OleAutomation oleObject= new OleAutomation(this); Variant varDispFont = oleObject.getProperty(COM.DISPID_FONT); oleObject.dispose(); if (varDispFont != null){ OleAutomation iDispFont = varDispFont.getAutomation(); FontData[] fdata = font.getFontData(); iDispFont.setProperty(COM.DISPID_FONT_NAME, new Variant(fdata[0].getName())); iDispFont.setProperty(COM.DISPID_FONT_SIZE, new Variant(fdata[0].getHeight())); iDispFont.setProperty(COM.DISPID_FONT_ITALIC, new Variant(fdata[0].getStyle() & SWT.ITALIC)); //iDispFont.setProperty(COM.DISPID_FONT_CHARSET, new Variant(fdata[0].getCharset)); iDispFont.setProperty(COM.DISPID_FONT_BOLD, new Variant((fdata[0].getStyle() & SWT.BOLD))); iDispFont.dispose(); } } this.font = font; return; } public void setForeground (Color color) { super.setForeground(color); //set the foreground of the ActiveX Control if (objIUnknown != null) { OleAutomation oleObject= new OleAutomation(this); oleObject.setProperty(COM.DISPID_FORECOLOR, new Variant(color.handle)); oleObject.dispose(); } } /** * Sets the control site property specified by the dispIdMember to a new value. * The value will be disposed by the control site when it is no longer required * using Variant.dispose. Passing a value of null will clear the dispId value. * * @param dispId the ID of the property as specified by the IDL of the ActiveX Control * @param value The new value for the property as expressed in a Variant. * * @since 2.1 */ public void setSiteProperty(int dispId, Variant value){ for (int i = 0; i < sitePropertyIds.length; i++) { if (sitePropertyIds[i] == dispId) { if (sitePropertyValues[i] != null) { sitePropertyValues[i].dispose(); } if (value != null) { sitePropertyValues[i] = value; } else { int oldLength = sitePropertyIds.length; int[] newSitePropertyIds = new int[oldLength - 1]; Variant[] newSitePropertyValues = new Variant[oldLength - 1]; System.arraycopy(sitePropertyIds, 0, newSitePropertyIds, 0, i); System.arraycopy(sitePropertyIds, i + 1, newSitePropertyIds, i, oldLength - i - 1); System.arraycopy(sitePropertyValues, 0, newSitePropertyValues, 0, i); System.arraycopy(sitePropertyValues, i + 1, newSitePropertyValues, i, oldLength - i - 1); sitePropertyIds = newSitePropertyIds; sitePropertyValues = newSitePropertyValues; } return; } } int oldLength = sitePropertyIds.length; int[] newSitePropertyIds = new int[oldLength + 1]; Variant[] newSitePropertyValues = new Variant[oldLength + 1]; System.arraycopy(sitePropertyIds, 0, newSitePropertyIds, 0, oldLength); System.arraycopy(sitePropertyValues, 0, newSitePropertyValues, 0, oldLength); newSitePropertyIds[oldLength] = dispId; newSitePropertyValues[oldLength] = value; sitePropertyIds = newSitePropertyIds; sitePropertyValues = newSitePropertyValues; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy