### Eclipse Workspace Patch 1.0 #P org.eclipse.swt Index: Eclipse SWT OLE Win32/win32/org/eclipse/swt/ole/win32/OleClientSite.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.swt/Eclipse SWT OLE Win32/win32/org/eclipse/swt/ole/win32/OleClientSite.java,v retrieving revision 1.54.2.1 diff -u -r1.54.2.1 OleClientSite.java --- Eclipse SWT OLE Win32/win32/org/eclipse/swt/ole/win32/OleClientSite.java 19 Aug 2009 15:52:45 -0000 1.54.2.1 +++ Eclipse SWT OLE Win32/win32/org/eclipse/swt/ole/win32/OleClientSite.java 7 Oct 2009 19:15:16 -0000 @@ -78,6 +78,7 @@ private int aspect; // the display aspect of the embedded object, e.g., DvaspectContent or DvaspectIcon private int type; // Indicates the type of client that can be supported inside this container private boolean isStatic; // Indicates item's display is static, i.e., a bitmap, metafile, etc. + boolean isActivated; private RECT borderWidths = new RECT(); private RECT indent = new RECT(); @@ -131,6 +132,8 @@ case SWT.Paint: onPaint(e); break; case SWT.Traverse: onTraverse(e); break; case SWT.KeyDown: /* required for traversal */ break; + case SWT.Activate: isActivated = true; break; + case SWT.Deactivate: isActivated = false; break; default : OLE.error(SWT.ERROR_NOT_IMPLEMENTED); } @@ -145,6 +148,8 @@ addListener(SWT.Paint, listener); addListener(SWT.Traverse, listener); addListener(SWT.KeyDown, listener); + addListener(SWT.Activate, listener); + addListener(SWT.Deactivate, listener); } /** * Create an OleClientSite child widget using the OLE Document type associated with the Index: Eclipse SWT OLE Win32/win32/org/eclipse/swt/ole/win32/OleControlSite.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.swt/Eclipse SWT OLE Win32/win32/org/eclipse/swt/ole/win32/OleControlSite.java,v retrieving revision 1.52 diff -u -r1.52 OleControlSite.java --- Eclipse SWT OLE Win32/win32/org/eclipse/swt/ole/win32/OleControlSite.java 29 May 2009 21:30:13 -0000 1.52 +++ Eclipse SWT OLE Win32/win32/org/eclipse/swt/ole/win32/OleControlSite.java 7 Oct 2009 19:15:16 -0000 @@ -64,6 +64,10 @@ 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 @@ -652,71 +656,65 @@ } return COM.S_OK; } - -// The following is intentionally commented, it's not believed that -// OLEIVERB_UIACTIVATE and UIDeactivate should be invoked for every -// received focusIn and focusOut, respectively. -// -//void onFocusIn(Event e) { -// String progID = getProgramID(); -// if (progID == null) return; -// if (!progID.startsWith("Shell.Explorer")) { -// super.onFocusIn(e); -// return; -// } -// if (objIOleInPlaceObject == null) return; -// 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.Explorer")) { -// super.onFocusOut(e); -// 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 (lpgui1.hwndCaret != 0) { -// GUITHREADINFO lpgui2 = new GUITHREADINFO(); -// lpgui2.cbSize = GUITHREADINFO.sizeof; -// OS.GetGUIThreadInfo(threadId, lpgui2); -// if (lpgui2.hwndCaret == 0 && lpgui1.hwndCaret == OS.GetFocus()) { -// if (SWT_RESTORECARET == 0) { -// SWT_RESTORECARET = OS.RegisterWindowMessage (new TCHAR (0, "SWT_RESTORECARET", true)); -// } -// /* -// * 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); -// } -// } -// } -//} - +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; + } + /* + * 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 (lpgui1.hwndCaret != 0) { + GUITHREADINFO lpgui2 = new GUITHREADINFO(); + lpgui2.cbSize = GUITHREADINFO.sizeof; + OS.GetGUIThreadInfo(threadId, lpgui2); + if (lpgui2.hwndCaret == 0 && lpgui1.hwndCaret == OS.GetFocus()) { + if (SWT_RESTORECARET == 0) { + SWT_RESTORECARET = OS.RegisterWindowMessage (new TCHAR (0, "SWT_RESTORECARET", true)); + } + /* + * 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); + } + } + } +} private int OnFocus(int fGotFocus) { return COM.S_OK; }