forked from Mirrors/wine-wine
mshtml: Added tooltip implementation.
parent
a6431c3868
commit
5f009f2540
|
@ -140,8 +140,12 @@ static ULONG WINAPI HTMLDocument_Release(IHTMLDocument2 *iface)
|
||||||
IOleInPlaceObjectWindowless_InPlaceDeactivate(INPLACEWIN(This));
|
IOleInPlaceObjectWindowless_InPlaceDeactivate(INPLACEWIN(This));
|
||||||
if(This->ipsite)
|
if(This->ipsite)
|
||||||
IOleDocumentView_SetInPlaceSite(DOCVIEW(This), NULL);
|
IOleDocumentView_SetInPlaceSite(DOCVIEW(This), NULL);
|
||||||
|
|
||||||
|
if(This->tooltips_hwnd)
|
||||||
|
DestroyWindow(This->tooltips_hwnd);
|
||||||
if(This->hwnd)
|
if(This->hwnd)
|
||||||
DestroyWindow(This->hwnd);
|
DestroyWindow(This->hwnd);
|
||||||
|
|
||||||
release_nodes(This);
|
release_nodes(This);
|
||||||
|
|
||||||
if(This->nscontainer)
|
if(This->nscontainer)
|
||||||
|
|
|
@ -73,6 +73,7 @@ typedef struct {
|
||||||
IOleInPlaceFrame *frame;
|
IOleInPlaceFrame *frame;
|
||||||
|
|
||||||
HWND hwnd;
|
HWND hwnd;
|
||||||
|
HWND tooltips_hwnd;
|
||||||
|
|
||||||
BOOL in_place_active;
|
BOOL in_place_active;
|
||||||
BOOL ui_active;
|
BOOL ui_active;
|
||||||
|
@ -86,11 +87,14 @@ typedef struct {
|
||||||
} HTMLDocument;
|
} HTMLDocument;
|
||||||
|
|
||||||
struct NSContainer {
|
struct NSContainer {
|
||||||
const nsIWebBrowserChromeVtbl *lpWebBrowserChromeVtbl;
|
const nsIWebBrowserChromeVtbl *lpWebBrowserChromeVtbl;
|
||||||
const nsIContextMenuListenerVtbl *lpContextMenuListenerVtbl;
|
const nsIContextMenuListenerVtbl *lpContextMenuListenerVtbl;
|
||||||
const nsIURIContentListenerVtbl *lpURIContentListenerVtbl;
|
const nsIURIContentListenerVtbl *lpURIContentListenerVtbl;
|
||||||
const nsIEmbeddingSiteWindowVtbl *lpEmbeddingSiteWindowVtbl;
|
const nsIEmbeddingSiteWindowVtbl *lpEmbeddingSiteWindowVtbl;
|
||||||
const nsIInterfaceRequestorVtbl *lpInterfaceRequestorVtbl;
|
const nsITooltipListenerVtbl *lpTooltipListenerVtbl;
|
||||||
|
const nsIInterfaceRequestorVtbl *lpInterfaceRequestorVtbl;
|
||||||
|
const nsIWeakReferenceVtbl *lpWeakReferenceVtbl;
|
||||||
|
const nsISupportsWeakReferenceVtbl *lpSupportsWeakReferenceVtbl;
|
||||||
|
|
||||||
nsIWebBrowser *webbrowser;
|
nsIWebBrowser *webbrowser;
|
||||||
nsIWebNavigation *navigation;
|
nsIWebNavigation *navigation;
|
||||||
|
@ -167,6 +171,9 @@ typedef struct {
|
||||||
#define NSURICL(x) ((nsIURIContentListener*) &(x)->lpURIContentListenerVtbl)
|
#define NSURICL(x) ((nsIURIContentListener*) &(x)->lpURIContentListenerVtbl)
|
||||||
#define NSEMBWNDS(x) ((nsIEmbeddingSiteWindow*) &(x)->lpEmbeddingSiteWindowVtbl)
|
#define NSEMBWNDS(x) ((nsIEmbeddingSiteWindow*) &(x)->lpEmbeddingSiteWindowVtbl)
|
||||||
#define NSIFACEREQ(x) ((nsIInterfaceRequestor*) &(x)->lpInterfaceRequestorVtbl)
|
#define NSIFACEREQ(x) ((nsIInterfaceRequestor*) &(x)->lpInterfaceRequestorVtbl)
|
||||||
|
#define NSTOOLTIP(x) ((nsITooltipListener*) &(x)->lpTooltipListenerVtbl)
|
||||||
|
#define NSWEAKREF(x) ((nsIWeakReference*) &(x)->lpWeakReferenceVtbl)
|
||||||
|
#define NSSUPWEAKREF(x) ((nsISupportsWeakReference*) &(x)->lpSupportsWeakReferenceVtbl)
|
||||||
|
|
||||||
#define HTMLELEM(x) ((IHTMLElement*) &(x)->lpHTMLElementVtbl)
|
#define HTMLELEM(x) ((IHTMLElement*) &(x)->lpHTMLElementVtbl)
|
||||||
#define HTMLELEM2(x) ((IHTMLElement2*) &(x)->lpHTMLElement2Vtbl)
|
#define HTMLELEM2(x) ((IHTMLElement2*) &(x)->lpHTMLElement2Vtbl)
|
||||||
|
@ -190,6 +197,9 @@ void NSContainer_Release(NSContainer*);
|
||||||
void HTMLDocument_LockContainer(HTMLDocument*,BOOL);
|
void HTMLDocument_LockContainer(HTMLDocument*,BOOL);
|
||||||
void HTMLDocument_ShowContextMenu(HTMLDocument*,DWORD,POINT*);
|
void HTMLDocument_ShowContextMenu(HTMLDocument*,DWORD,POINT*);
|
||||||
|
|
||||||
|
void show_tooltip(HTMLDocument*,DWORD,DWORD,LPCWSTR);
|
||||||
|
void hide_tooltip(HTMLDocument*);
|
||||||
|
|
||||||
HRESULT ProtocolFactory_Create(REFCLSID,REFIID,void**);
|
HRESULT ProtocolFactory_Create(REFCLSID,REFIID,void**);
|
||||||
|
|
||||||
void close_gecko(void);
|
void close_gecko(void);
|
||||||
|
@ -200,6 +210,9 @@ void hlink_frame_navigate(HTMLDocument*,IHlinkFrame*,LPCWSTR,nsIInputStream*,DWO
|
||||||
|
|
||||||
nsIURI *get_nsIURI(LPCWSTR);
|
nsIURI *get_nsIURI(LPCWSTR);
|
||||||
|
|
||||||
|
void *nsalloc(size_t);
|
||||||
|
void nsfree(void*);
|
||||||
|
|
||||||
void nsACString_Init(nsACString*,const char*);
|
void nsACString_Init(nsACString*,const char*);
|
||||||
PRUint32 nsACString_GetData(const nsACString*,const char**,PRBool*);
|
PRUint32 nsACString_GetData(const nsACString*,const char**,PRBool*);
|
||||||
void nsACString_Finish(nsACString*);
|
void nsACString_Finish(nsACString*);
|
||||||
|
|
|
@ -38,6 +38,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
|
||||||
#define NS_APPSTARTUPNOTIFIER_CONTRACTID "@mozilla.org/embedcomp/appstartup-notifier;1"
|
#define NS_APPSTARTUPNOTIFIER_CONTRACTID "@mozilla.org/embedcomp/appstartup-notifier;1"
|
||||||
#define NS_WEBBROWSER_CONTRACTID "@mozilla.org/embedding/browser/nsWebBrowser;1"
|
#define NS_WEBBROWSER_CONTRACTID "@mozilla.org/embedding/browser/nsWebBrowser;1"
|
||||||
#define NS_PROFILE_CONTRACTID "@mozilla.org/profile/manager;1"
|
#define NS_PROFILE_CONTRACTID "@mozilla.org/profile/manager;1"
|
||||||
|
#define NS_MEMORY_CONTRACTID "@mozilla.org/xpcom/memory-service;1"
|
||||||
#define NS_STRINGSTREAM_CONTRACTID "@mozilla.org/io/string-input-stream;1"
|
#define NS_STRINGSTREAM_CONTRACTID "@mozilla.org/io/string-input-stream;1"
|
||||||
|
|
||||||
#define APPSTARTUP_TOPIC "app-startup"
|
#define APPSTARTUP_TOPIC "app-startup"
|
||||||
|
@ -68,6 +69,7 @@ static HINSTANCE hXPCOM = NULL;
|
||||||
|
|
||||||
static nsIServiceManager *pServMgr = NULL;
|
static nsIServiceManager *pServMgr = NULL;
|
||||||
static nsIComponentManager *pCompMgr = NULL;
|
static nsIComponentManager *pCompMgr = NULL;
|
||||||
|
static nsIMemory *nsmem = NULL;
|
||||||
|
|
||||||
static const WCHAR wszNsContainer[] = {'N','s','C','o','n','t','a','i','n','e','r',0};
|
static const WCHAR wszNsContainer[] = {'N','s','C','o','n','t','a','i','n','e','r',0};
|
||||||
|
|
||||||
|
@ -353,6 +355,11 @@ static BOOL load_gecko(void)
|
||||||
|
|
||||||
set_profile();
|
set_profile();
|
||||||
|
|
||||||
|
nsres = nsIComponentManager_CreateInstanceByContractID(pCompMgr, NS_MEMORY_CONTRACTID,
|
||||||
|
NULL, &IID_nsIMemory, (void**)&nsmem);
|
||||||
|
if(NS_FAILED(nsres))
|
||||||
|
ERR("Could not get nsIMemory: %08lx\n", nsres);
|
||||||
|
|
||||||
if(registrar) {
|
if(registrar) {
|
||||||
register_nsservice(registrar, pServMgr);
|
register_nsservice(registrar, pServMgr);
|
||||||
nsIComponentRegistrar_Release(registrar);
|
nsIComponentRegistrar_Release(registrar);
|
||||||
|
@ -361,6 +368,16 @@ static BOOL load_gecko(void)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *nsalloc(size_t size)
|
||||||
|
{
|
||||||
|
return nsIMemory_Alloc(nsmem, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void nsfree(void *mem)
|
||||||
|
{
|
||||||
|
nsIMemory_Free(nsmem, mem);
|
||||||
|
}
|
||||||
|
|
||||||
void nsACString_Init(nsACString *str, const char *data)
|
void nsACString_Init(nsACString *str, const char *data)
|
||||||
{
|
{
|
||||||
NS_CStringContainerInit(str);
|
NS_CStringContainerInit(str);
|
||||||
|
@ -431,6 +448,9 @@ void close_gecko()
|
||||||
if(pServMgr)
|
if(pServMgr)
|
||||||
nsIServiceManager_Release(pServMgr);
|
nsIServiceManager_Release(pServMgr);
|
||||||
|
|
||||||
|
if(nsmem)
|
||||||
|
nsIMemory_Release(nsmem);
|
||||||
|
|
||||||
if(hXPCOM)
|
if(hXPCOM)
|
||||||
FreeLibrary(hXPCOM);
|
FreeLibrary(hXPCOM);
|
||||||
}
|
}
|
||||||
|
@ -462,9 +482,18 @@ static nsresult NSAPI nsWebBrowserChrome_QueryInterface(nsIWebBrowserChrome *ifa
|
||||||
}else if(IsEqualGUID(&IID_nsIEmbeddingSiteWindow, riid)) {
|
}else if(IsEqualGUID(&IID_nsIEmbeddingSiteWindow, riid)) {
|
||||||
TRACE("(%p)->(IID_nsIEmbeddingSiteWindow %p)\n", This, result);
|
TRACE("(%p)->(IID_nsIEmbeddingSiteWindow %p)\n", This, result);
|
||||||
*result = NSEMBWNDS(This);
|
*result = NSEMBWNDS(This);
|
||||||
|
}else if(IsEqualGUID(&IID_nsITooltipListener, riid)) {
|
||||||
|
TRACE("(%p)->(IID_nsITooltipListener %p)\n", This, result);
|
||||||
|
*result = NSTOOLTIP(This);
|
||||||
}else if(IsEqualGUID(&IID_nsIInterfaceRequestor, riid)) {
|
}else if(IsEqualGUID(&IID_nsIInterfaceRequestor, riid)) {
|
||||||
TRACE("(%p)->(IID_nsIInterfaceRequestor %p)\n", This, result);
|
TRACE("(%p)->(IID_nsIInterfaceRequestor %p)\n", This, result);
|
||||||
*result = NSIFACEREQ(This);
|
*result = NSIFACEREQ(This);
|
||||||
|
}else if(IsEqualGUID(&IID_nsIWeakReference, riid)) {
|
||||||
|
TRACE("(%p)->(IID_nsIWeakReference %p)\n", This, result);
|
||||||
|
*result = NSWEAKREF(This);
|
||||||
|
}else if(IsEqualGUID(&IID_nsISupportsWeakReference, riid)) {
|
||||||
|
TRACE("(%p)->(IID_nsISupportsWeakReference %p)\n", This, result);
|
||||||
|
*result = NSSUPWEAKREF(This);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(*result) {
|
if(*result) {
|
||||||
|
@ -928,6 +957,56 @@ static const nsIEmbeddingSiteWindowVtbl nsEmbeddingSiteWindowVtbl = {
|
||||||
nsEmbeddingSiteWindow_GetSiteWindow
|
nsEmbeddingSiteWindow_GetSiteWindow
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define NSTOOLTIP_THIS(iface) DEFINE_THIS(NSContainer, TooltipListener, iface)
|
||||||
|
|
||||||
|
static nsresult NSAPI nsTooltipListener_QueryInterface(nsITooltipListener *iface, nsIIDRef riid,
|
||||||
|
nsQIResult result)
|
||||||
|
{
|
||||||
|
NSContainer *This = NSTOOLTIP_THIS(iface);
|
||||||
|
return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This), riid, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
static nsrefcnt NSAPI nsTooltipListener_AddRef(nsITooltipListener *iface)
|
||||||
|
{
|
||||||
|
NSContainer *This = NSTOOLTIP_THIS(iface);
|
||||||
|
return nsIWebBrowserChrome_AddRef(NSWBCHROME(This));
|
||||||
|
}
|
||||||
|
|
||||||
|
static nsrefcnt NSAPI nsTooltipListener_Release(nsITooltipListener *iface)
|
||||||
|
{
|
||||||
|
NSContainer *This = NSTOOLTIP_THIS(iface);
|
||||||
|
return nsIWebBrowserChrome_AddRef(NSWBCHROME(This));
|
||||||
|
}
|
||||||
|
|
||||||
|
static nsresult NSAPI nsTooltipListener_OnShowTooltip(nsITooltipListener *iface,
|
||||||
|
PRInt32 aXCoord, PRInt32 aYCoord, const PRUnichar *aTipText)
|
||||||
|
{
|
||||||
|
NSContainer *This = NSTOOLTIP_THIS(iface);
|
||||||
|
|
||||||
|
show_tooltip(This->doc, aXCoord, aYCoord, aTipText);
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static nsresult NSAPI nsTooltipListener_OnHideTooltip(nsITooltipListener *iface)
|
||||||
|
{
|
||||||
|
NSContainer *This = NSTOOLTIP_THIS(iface);
|
||||||
|
|
||||||
|
hide_tooltip(This->doc);
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef NSTOOLTIM_THIS
|
||||||
|
|
||||||
|
static const nsITooltipListenerVtbl nsTooltipListenerVtbl = {
|
||||||
|
nsTooltipListener_QueryInterface,
|
||||||
|
nsTooltipListener_AddRef,
|
||||||
|
nsTooltipListener_Release,
|
||||||
|
nsTooltipListener_OnShowTooltip,
|
||||||
|
nsTooltipListener_OnHideTooltip
|
||||||
|
};
|
||||||
|
|
||||||
#define NSIFACEREQ_THIS(iface) DEFINE_THIS(NSContainer, InterfaceRequestor, iface)
|
#define NSIFACEREQ_THIS(iface) DEFINE_THIS(NSContainer, InterfaceRequestor, iface)
|
||||||
|
|
||||||
static nsresult NSAPI nsInterfaceRequestor_QueryInterface(nsIInterfaceRequestor *iface,
|
static nsresult NSAPI nsInterfaceRequestor_QueryInterface(nsIInterfaceRequestor *iface,
|
||||||
|
@ -971,6 +1050,85 @@ static const nsIInterfaceRequestorVtbl nsInterfaceRequestorVtbl = {
|
||||||
nsInterfaceRequestor_GetInterface
|
nsInterfaceRequestor_GetInterface
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define NSWEAKREF_THIS(iface) DEFINE_THIS(NSContainer, WeakReference, iface)
|
||||||
|
|
||||||
|
static nsresult NSAPI nsWeakReference_QueryInterface(nsIWeakReference *iface,
|
||||||
|
nsIIDRef riid, nsQIResult result)
|
||||||
|
{
|
||||||
|
NSContainer *This = NSWEAKREF_THIS(iface);
|
||||||
|
return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This), riid, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
static nsrefcnt NSAPI nsWeakReference_AddRef(nsIWeakReference *iface)
|
||||||
|
{
|
||||||
|
NSContainer *This = NSWEAKREF_THIS(iface);
|
||||||
|
return nsIWebBrowserChrome_AddRef(NSWBCHROME(This));
|
||||||
|
}
|
||||||
|
|
||||||
|
static nsrefcnt NSAPI nsWeakReference_Release(nsIWeakReference *iface)
|
||||||
|
{
|
||||||
|
NSContainer *This = NSWEAKREF_THIS(iface);
|
||||||
|
return nsIWebBrowserChrome_Release(NSWBCHROME(This));
|
||||||
|
}
|
||||||
|
|
||||||
|
static nsresult NSAPI nsWeakReference_QueryReferent(nsIWeakReference *iface,
|
||||||
|
const nsIID *riid, void **result)
|
||||||
|
{
|
||||||
|
NSContainer *This = NSWEAKREF_THIS(iface);
|
||||||
|
return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This), riid, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef NSWEAKREF_THIS
|
||||||
|
|
||||||
|
static const nsIWeakReferenceVtbl nsWeakReferenceVtbl = {
|
||||||
|
nsWeakReference_QueryInterface,
|
||||||
|
nsWeakReference_AddRef,
|
||||||
|
nsWeakReference_Release,
|
||||||
|
nsWeakReference_QueryReferent
|
||||||
|
};
|
||||||
|
|
||||||
|
#define NSSUPWEAKREF_THIS(iface) DEFINE_THIS(NSContainer, SupportsWeakReference, iface)
|
||||||
|
|
||||||
|
static nsresult NSAPI nsSupportsWeakReference_QueryInterface(nsISupportsWeakReference *iface,
|
||||||
|
nsIIDRef riid, nsQIResult result)
|
||||||
|
{
|
||||||
|
NSContainer *This = NSSUPWEAKREF_THIS(iface);
|
||||||
|
return nsIWebBrowserChrome_QueryInterface(NSWBCHROME(This), riid, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
static nsrefcnt NSAPI nsSupportsWeakReference_AddRef(nsISupportsWeakReference *iface)
|
||||||
|
{
|
||||||
|
NSContainer *This = NSSUPWEAKREF_THIS(iface);
|
||||||
|
return nsIWebBrowserChrome_AddRef(NSWBCHROME(This));
|
||||||
|
}
|
||||||
|
|
||||||
|
static nsrefcnt NSAPI nsSupportsWeakReference_Release(nsISupportsWeakReference *iface)
|
||||||
|
{
|
||||||
|
NSContainer *This = NSSUPWEAKREF_THIS(iface);
|
||||||
|
return nsIWebBrowserChrome_Release(NSWBCHROME(This));
|
||||||
|
}
|
||||||
|
|
||||||
|
static nsresult NSAPI nsSupportsWeakReference_GetWeakReference(nsISupportsWeakReference *iface,
|
||||||
|
nsIWeakReference **_retval)
|
||||||
|
{
|
||||||
|
NSContainer *This = NSSUPWEAKREF_THIS(iface);
|
||||||
|
|
||||||
|
TRACE("(%p)->(%p)\n", This, _retval);
|
||||||
|
|
||||||
|
*_retval = NSWEAKREF(This);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef NSWEAKREF_THIS
|
||||||
|
|
||||||
|
const nsISupportsWeakReferenceVtbl nsSupportsWeakReferenceVtbl = {
|
||||||
|
nsSupportsWeakReference_QueryInterface,
|
||||||
|
nsSupportsWeakReference_AddRef,
|
||||||
|
nsSupportsWeakReference_Release,
|
||||||
|
nsSupportsWeakReference_GetWeakReference
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
NSContainer *NSContainer_Create(HTMLDocument *doc, NSContainer *parent)
|
NSContainer *NSContainer_Create(HTMLDocument *doc, NSContainer *parent)
|
||||||
{
|
{
|
||||||
nsIWebBrowserSetup *wbsetup;
|
nsIWebBrowserSetup *wbsetup;
|
||||||
|
@ -982,11 +1140,15 @@ NSContainer *NSContainer_Create(HTMLDocument *doc, NSContainer *parent)
|
||||||
|
|
||||||
ret = HeapAlloc(GetProcessHeap(), 0, sizeof(NSContainer));
|
ret = HeapAlloc(GetProcessHeap(), 0, sizeof(NSContainer));
|
||||||
|
|
||||||
ret->lpWebBrowserChromeVtbl = &nsWebBrowserChromeVtbl;
|
ret->lpWebBrowserChromeVtbl = &nsWebBrowserChromeVtbl;
|
||||||
ret->lpContextMenuListenerVtbl = &nsContextMenuListenerVtbl;
|
ret->lpContextMenuListenerVtbl = &nsContextMenuListenerVtbl;
|
||||||
ret->lpURIContentListenerVtbl = &nsURIContentListenerVtbl;
|
ret->lpURIContentListenerVtbl = &nsURIContentListenerVtbl;
|
||||||
ret->lpEmbeddingSiteWindowVtbl = &nsEmbeddingSiteWindowVtbl;
|
ret->lpEmbeddingSiteWindowVtbl = &nsEmbeddingSiteWindowVtbl;
|
||||||
ret->lpInterfaceRequestorVtbl = &nsInterfaceRequestorVtbl;
|
ret->lpTooltipListenerVtbl = &nsTooltipListenerVtbl;
|
||||||
|
ret->lpInterfaceRequestorVtbl = &nsInterfaceRequestorVtbl;
|
||||||
|
ret->lpWeakReferenceVtbl = &nsWeakReferenceVtbl;
|
||||||
|
ret->lpSupportsWeakReferenceVtbl = &nsSupportsWeakReferenceVtbl;
|
||||||
|
|
||||||
|
|
||||||
ret->doc = doc;
|
ret->doc = doc;
|
||||||
ret->ref = 1;
|
ret->ref = 1;
|
||||||
|
|
|
@ -81,7 +81,6 @@ interface nsISupports
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Currently we don't need a full declaration of these interfaces */
|
/* Currently we don't need a full declaration of these interfaces */
|
||||||
typedef nsISupports nsIWeakReference;
|
|
||||||
typedef nsISupports nsISHistory;
|
typedef nsISupports nsISHistory;
|
||||||
typedef nsISupports nsISimpleEnumerator;
|
typedef nsISupports nsISimpleEnumerator;
|
||||||
typedef nsISupports nsIWidget;
|
typedef nsISupports nsIWidget;
|
||||||
|
@ -154,6 +153,37 @@ interface nsIComponentManager : nsISupports
|
||||||
nsIIDRef aIID, nsQIResult result);
|
nsIIDRef aIID, nsQIResult result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[
|
||||||
|
object,
|
||||||
|
uuid(59e7e77a-38e4-11d4-8cf5-0060b0fc14a3)
|
||||||
|
]
|
||||||
|
interface nsIMemory : nsISupports
|
||||||
|
{
|
||||||
|
void *Alloc(/*size_t*/ int size);
|
||||||
|
void *Realloc(void *_ptr, /*size_t*/ int newSize);
|
||||||
|
void Free(void *_ptr);
|
||||||
|
nsresult HeapMinimize(PRBool immediate);
|
||||||
|
nsresult IsLowMemory(PRBool *_retval);
|
||||||
|
}
|
||||||
|
|
||||||
|
[
|
||||||
|
object,
|
||||||
|
uuid(9188bc85-f92e-11d2-81ef-0060083a0bcf)
|
||||||
|
]
|
||||||
|
interface nsIWeakReference : nsISupports
|
||||||
|
{
|
||||||
|
nsresult QueryReferent(const nsIID *riid, void **result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[
|
||||||
|
object,
|
||||||
|
uuid(9188bc86-f92e-11d2-81ef-0060083a0bcf)
|
||||||
|
]
|
||||||
|
interface nsISupportsWeakReference : nsISupports
|
||||||
|
{
|
||||||
|
nsresult GetWeakReference(nsIWeakReference **_retval);
|
||||||
|
}
|
||||||
|
|
||||||
[
|
[
|
||||||
object,
|
object,
|
||||||
uuid(033a1470-8b2a-11d3-af88-00a024ffc08c)
|
uuid(033a1470-8b2a-11d3-af88-00a024ffc08c)
|
||||||
|
@ -615,6 +645,16 @@ interface nsIURIContentListener : nsISupports
|
||||||
nsresult SetParentContentListener(nsIURIContentListener *aParentContentListener);
|
nsresult SetParentContentListener(nsIURIContentListener *aParentContentListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[
|
||||||
|
object,
|
||||||
|
uuid(44b78386-1dd2-11b2-9ad2-e4eee2ca1916)
|
||||||
|
]
|
||||||
|
interface nsITooltipListener : nsISupports
|
||||||
|
{
|
||||||
|
nsresult OnShowTooltip(PRInt32 aXCoords, PRInt32 aYCoords, const PRUnichar *aTipText);
|
||||||
|
nsresult OnHideTooltip();
|
||||||
|
}
|
||||||
|
|
||||||
[
|
[
|
||||||
object,
|
object,
|
||||||
uuid(69e5df00-7b8b-11d3-af61-00a024ffc08c)
|
uuid(69e5df00-7b8b-11d3-af61-00a024ffc08c)
|
||||||
|
@ -958,6 +998,15 @@ interface nsIPromptService : nsISupports
|
||||||
PRInt32 *aOutSelection, PRBool *_retval);
|
PRInt32 *aOutSelection, PRBool *_retval);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[
|
||||||
|
object,
|
||||||
|
uuid(b128a1e6-44f3-4331-8fbe-5af360ff21ee)
|
||||||
|
]
|
||||||
|
interface nsITooltipTextProvider : nsISupports
|
||||||
|
{
|
||||||
|
nsresult GetNodeText(nsIDOMNode *aNode, PRUnichar **aText, PRBool *_retval);
|
||||||
|
}
|
||||||
|
|
||||||
[
|
[
|
||||||
object,
|
object,
|
||||||
uuid(02b0625a-e7f3-11d2-9f5a-006008a6efe9)
|
uuid(02b0625a-e7f3-11d2-9f5a-006008a6efe9)
|
||||||
|
|
|
@ -37,9 +37,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
|
||||||
|
|
||||||
#define NS_PROMPTSERVICE_CONTRACTID "@mozilla.org/embedcomp/prompt-service;1"
|
#define NS_PROMPTSERVICE_CONTRACTID "@mozilla.org/embedcomp/prompt-service;1"
|
||||||
#define NS_WINDOWWATCHER_CONTRACTID "@mozilla.org/embedcomp/window-watcher;1"
|
#define NS_WINDOWWATCHER_CONTRACTID "@mozilla.org/embedcomp/window-watcher;1"
|
||||||
|
#define NS_TOOLTIPTEXTPROVIDER_CONTRACTID "@mozilla.org/embedcomp/tooltiptextprovider;1"
|
||||||
|
|
||||||
|
#define NS_TOOLTIPTEXTPROVIDER_CLASSNAME "nsTooltipTextProvider"
|
||||||
|
|
||||||
static const nsIID NS_PROMPTSERVICE_CID =
|
static const nsIID NS_PROMPTSERVICE_CID =
|
||||||
{0xa2112d6a,0x0e28,0x421f,{0xb4,0x6a,0x25,0xc0,0xb3,0x8,0xcb,0xd0}};
|
{0xa2112d6a,0x0e28,0x421f,{0xb4,0x6a,0x25,0xc0,0xb3,0x8,0xcb,0xd0}};
|
||||||
|
static const nsIID NS_TOOLTIPTEXTPROVIDER_CID =
|
||||||
|
{0x0b666e3e,0x569a,0x462c,{0xa7,0xf0,0xb1,0x6b,0xb1,0x5d,0x42,0xff}};
|
||||||
|
|
||||||
static nsresult NSAPI nsWindowCreator_QueryInterface(nsIWindowCreator2 *iface, nsIIDRef riid,
|
static nsresult NSAPI nsWindowCreator_QueryInterface(nsIWindowCreator2 *iface, nsIIDRef riid,
|
||||||
nsQIResult result)
|
nsQIResult result)
|
||||||
|
@ -260,6 +265,104 @@ static const nsIPromptServiceVtbl PromptServiceVtbl = {
|
||||||
|
|
||||||
static nsIPromptService nsPromptService = { &PromptServiceVtbl };
|
static nsIPromptService nsPromptService = { &PromptServiceVtbl };
|
||||||
|
|
||||||
|
static nsresult NSAPI nsTooltipTextProvider_QueryInterface(nsITooltipTextProvider *iface,
|
||||||
|
nsIIDRef riid, nsQIResult result)
|
||||||
|
{
|
||||||
|
*result = NULL;
|
||||||
|
|
||||||
|
if(IsEqualGUID(&IID_nsISupports, riid)) {
|
||||||
|
TRACE("(IID_nsISupports %p)\n", result);
|
||||||
|
*result = iface;
|
||||||
|
}else if(IsEqualGUID(&IID_nsITooltipTextProvider, riid)) {
|
||||||
|
TRACE("(IID_nsITooltipTextProvider %p)\n", result);
|
||||||
|
*result = iface;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(*result) {
|
||||||
|
nsITooltipTextProvider_AddRef(iface);
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
WARN("(%s %p)\n", debugstr_guid(riid), result);
|
||||||
|
return NS_NOINTERFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static nsrefcnt NSAPI nsTooltipTextProvider_AddRef(nsITooltipTextProvider *iface)
|
||||||
|
{
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
static nsrefcnt NSAPI nsTooltipTextProvider_Release(nsITooltipTextProvider *iface)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static nsresult NSAPI nsTooltipTextProvider_GetNodeText(nsITooltipTextProvider *iface,
|
||||||
|
nsIDOMNode *aNode, PRUnichar **aText, PRBool *_retval)
|
||||||
|
{
|
||||||
|
nsIDOMHTMLElement *nselem;
|
||||||
|
nsIDOMNode *node = aNode, *parent;
|
||||||
|
nsAString title_str;
|
||||||
|
const PRUnichar *title = NULL;
|
||||||
|
nsresult nsres;
|
||||||
|
|
||||||
|
TRACE("(%p %p %p)\n", aNode, aText, _retval);
|
||||||
|
|
||||||
|
*aText = NULL;
|
||||||
|
|
||||||
|
nsAString_Init(&title_str, NULL);
|
||||||
|
|
||||||
|
do {
|
||||||
|
nsres = nsIDOMNode_QueryInterface(node, &IID_nsIDOMHTMLElement, (void**)&nselem);
|
||||||
|
if(NS_SUCCEEDED(nsres)) {
|
||||||
|
title = NULL;
|
||||||
|
|
||||||
|
nsIDOMHTMLElement_GetTitle(nselem, &title_str);
|
||||||
|
nsIDOMHTMLElement_Release(nselem);
|
||||||
|
|
||||||
|
nsAString_GetData(&title_str, &title, NULL);
|
||||||
|
if(title && *title) {
|
||||||
|
if(node != aNode)
|
||||||
|
nsIDOMNode_Release(node);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nsres = nsIDOMNode_GetParentNode(node, &parent);
|
||||||
|
if(NS_FAILED(nsres))
|
||||||
|
parent = NULL;
|
||||||
|
|
||||||
|
if(node != aNode)
|
||||||
|
nsIDOMNode_Release(node);
|
||||||
|
node = parent;
|
||||||
|
} while(node);
|
||||||
|
|
||||||
|
if(title && *title) {
|
||||||
|
int size = (strlenW(title)+1)*sizeof(PRUnichar);
|
||||||
|
|
||||||
|
*aText = nsalloc(size);
|
||||||
|
memcpy(*aText, title, size);
|
||||||
|
TRACE("aText = %s\n", debugstr_w(*aText));
|
||||||
|
|
||||||
|
*_retval = TRUE;
|
||||||
|
}else {
|
||||||
|
*_retval = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
nsAString_Finish(&title_str);
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const nsITooltipTextProviderVtbl nsTooltipTextProviderVtbl = {
|
||||||
|
nsTooltipTextProvider_QueryInterface,
|
||||||
|
nsTooltipTextProvider_AddRef,
|
||||||
|
nsTooltipTextProvider_Release,
|
||||||
|
nsTooltipTextProvider_GetNodeText
|
||||||
|
};
|
||||||
|
|
||||||
|
static nsITooltipTextProvider nsTooltipTextProvider = { &nsTooltipTextProviderVtbl };
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const nsIFactoryVtbl *lpFactoryVtbl;
|
const nsIFactoryVtbl *lpFactoryVtbl;
|
||||||
nsISupports *service;
|
nsISupports *service;
|
||||||
|
@ -333,6 +436,11 @@ static nsServiceFactory nsPromptServiceFactory = {
|
||||||
(nsISupports*)&nsPromptService
|
(nsISupports*)&nsPromptService
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static nsServiceFactory nsTooltipTextFactory = {
|
||||||
|
&nsServiceFactoryVtbl,
|
||||||
|
(nsISupports*)&nsTooltipTextProvider
|
||||||
|
};
|
||||||
|
|
||||||
void register_nsservice(nsIComponentRegistrar *registrar, nsIServiceManager *service_manager)
|
void register_nsservice(nsIComponentRegistrar *registrar, nsIServiceManager *service_manager)
|
||||||
{
|
{
|
||||||
nsIWindowWatcher *window_watcher;
|
nsIWindowWatcher *window_watcher;
|
||||||
|
@ -354,4 +462,10 @@ void register_nsservice(nsIComponentRegistrar *registrar, nsIServiceManager *ser
|
||||||
}else {
|
}else {
|
||||||
ERR("Could not get WindowWatcher object: %08lx\n", nsres);
|
ERR("Could not get WindowWatcher object: %08lx\n", nsres);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nsres = nsIComponentRegistrar_RegisterFactory(registrar, &NS_TOOLTIPTEXTPROVIDER_CID,
|
||||||
|
NS_TOOLTIPTEXTPROVIDER_CLASSNAME, NS_TOOLTIPTEXTPROVIDER_CONTRACTID,
|
||||||
|
NSFACTORY(&nsTooltipTextFactory));
|
||||||
|
if(NS_FAILED(nsres))
|
||||||
|
ERR("RegisterFactory failed: %08lx\n", nsres);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2005 Jacek Caban
|
* Copyright 2005-2006 Jacek Caban for CodeWeavers
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
@ -27,6 +27,7 @@
|
||||||
#include "winbase.h"
|
#include "winbase.h"
|
||||||
#include "winuser.h"
|
#include "winuser.h"
|
||||||
#include "wingdi.h"
|
#include "wingdi.h"
|
||||||
|
#include "commctrl.h"
|
||||||
#include "ole2.h"
|
#include "ole2.h"
|
||||||
#include "resource.h"
|
#include "resource.h"
|
||||||
|
|
||||||
|
@ -39,8 +40,15 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
|
||||||
static const WCHAR wszInternetExplorer_Server[] =
|
static const WCHAR wszInternetExplorer_Server[] =
|
||||||
{'I','n','t','e','r','n','e','t',' ','E','x','p','l','o','r','e','r','_','S','e','r','v','e','r',0};
|
{'I','n','t','e','r','n','e','t',' ','E','x','p','l','o','r','e','r','_','S','e','r','v','e','r',0};
|
||||||
|
|
||||||
|
static const WCHAR wszTooltipData[] = {'t','o','o','l','t','i','p','_','d','a','t','a',0};
|
||||||
|
|
||||||
static ATOM serverwnd_class = 0;
|
static ATOM serverwnd_class = 0;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
HTMLDocument *doc;
|
||||||
|
WNDPROC proc;
|
||||||
|
} tooltip_data;
|
||||||
|
|
||||||
static void paint_disabled(HWND hwnd) {
|
static void paint_disabled(HWND hwnd) {
|
||||||
HDC hdc;
|
HDC hdc;
|
||||||
PAINTSTRUCT ps;
|
PAINTSTRUCT ps;
|
||||||
|
@ -149,6 +157,7 @@ static HRESULT activate_window(HTMLDocument *This)
|
||||||
WARN("GetWindowContext failed: %08lx\n", hres);
|
WARN("GetWindowContext failed: %08lx\n", hres);
|
||||||
return hres;
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(pIPWnd)
|
if(pIPWnd)
|
||||||
IOleInPlaceUIWindow_Release(pIPWnd);
|
IOleInPlaceUIWindow_Release(pIPWnd);
|
||||||
TRACE("got window context: %p %p {%ld %ld %ld %ld} {%ld %ld %ld %ld} {%d %x %p %p %d}\n",
|
TRACE("got window context: %p %p {%ld %ld %ld %ld} {%ld %ld %ld %ld} {%d %x %p %p %d}\n",
|
||||||
|
@ -221,6 +230,77 @@ static HRESULT activate_window(HTMLDocument *This)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static LRESULT tooltips_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
tooltip_data *data = GetPropW(hwnd, wszTooltipData);
|
||||||
|
|
||||||
|
TRACE("%d %p\n", msg, data);
|
||||||
|
|
||||||
|
if(msg == TTM_WINDOWFROMPOINT) {
|
||||||
|
RECT rect;
|
||||||
|
POINT *pt = (POINT*)lParam;
|
||||||
|
|
||||||
|
TRACE("TTM_WINDOWFROMPOINT (%ld,%ld)\n", pt->x, pt->y);
|
||||||
|
|
||||||
|
GetWindowRect(data->doc->hwnd, &rect);
|
||||||
|
|
||||||
|
if(rect.left <= pt->x && pt->x <= rect.right
|
||||||
|
&& rect.top <= pt->y && pt->y <= rect.bottom)
|
||||||
|
return (LPARAM)data->doc->hwnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CallWindowProcW(data->proc, hwnd, msg, wParam, lParam);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void create_tooltips_window(HTMLDocument *This)
|
||||||
|
{
|
||||||
|
tooltip_data *data = HeapAlloc(GetProcessHeap(), 0, sizeof(*data));
|
||||||
|
|
||||||
|
This->tooltips_hwnd = CreateWindowExW(0, TOOLTIPS_CLASSW, NULL, TTS_NOPREFIX | WS_POPUP,
|
||||||
|
CW_USEDEFAULT, CW_USEDEFAULT, 10, 10, This->hwnd, NULL, hInst, NULL);
|
||||||
|
|
||||||
|
data->doc = This;
|
||||||
|
data->proc = (WNDPROC)GetWindowLongPtrW(This->tooltips_hwnd, GWLP_WNDPROC);
|
||||||
|
|
||||||
|
SetPropW(This->tooltips_hwnd, wszTooltipData, data);
|
||||||
|
|
||||||
|
SetWindowLongPtrW(This->tooltips_hwnd, GWLP_WNDPROC, (LONG_PTR)tooltips_proc);
|
||||||
|
|
||||||
|
SetWindowPos(This->tooltips_hwnd, HWND_TOPMOST,0, 0, 0, 0,
|
||||||
|
SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void show_tooltip(HTMLDocument *This, DWORD x, DWORD y, LPCWSTR text)
|
||||||
|
{
|
||||||
|
TTTOOLINFOW toolinfo = {
|
||||||
|
sizeof(TTTOOLINFOW), 0, This->hwnd, 0xdeadbeef,
|
||||||
|
{x>2 ? x-2 : 0, y>0 ? y-2 : 0, x+2, y+2}, /* FIXME */
|
||||||
|
NULL, (LPWSTR)text, 0};
|
||||||
|
MSG msg = {This->hwnd, WM_MOUSEMOVE, 0, MAKELPARAM(x,y), 0, {x,y}};
|
||||||
|
|
||||||
|
TRACE("(%p)->(%ld %ld %s)\n", This, x, y, debugstr_w(text));
|
||||||
|
|
||||||
|
if(!This->tooltips_hwnd)
|
||||||
|
create_tooltips_window(This);
|
||||||
|
|
||||||
|
SendMessageW(This->tooltips_hwnd, TTM_ADDTOOLW, 0, (LPARAM)&toolinfo);
|
||||||
|
SendMessageW(This->tooltips_hwnd, TTM_ACTIVATE, TRUE, 0);
|
||||||
|
SendMessageW(This->tooltips_hwnd, TTM_RELAYEVENT, 0, (LPARAM)&msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void hide_tooltip(HTMLDocument *This)
|
||||||
|
{
|
||||||
|
TTTOOLINFOW toolinfo = {
|
||||||
|
sizeof(TTTOOLINFOW), 0, This->hwnd, 0xdeadbeef,
|
||||||
|
{0,0,0,0}, NULL, NULL, 0};
|
||||||
|
|
||||||
|
TRACE("(%p)\n", This);
|
||||||
|
|
||||||
|
SendMessageW(This->tooltips_hwnd, TTM_DELTOOLW, 0, (LPARAM)&toolinfo);
|
||||||
|
SendMessageW(This->tooltips_hwnd, TTM_ACTIVATE, FALSE, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/**********************************************************
|
/**********************************************************
|
||||||
* IOleDocumentView implementation
|
* IOleDocumentView implementation
|
||||||
*/
|
*/
|
||||||
|
@ -579,6 +659,7 @@ void HTMLDocument_View_Init(HTMLDocument *This)
|
||||||
This->ipsite = NULL;
|
This->ipsite = NULL;
|
||||||
This->frame = NULL;
|
This->frame = NULL;
|
||||||
This->hwnd = NULL;
|
This->hwnd = NULL;
|
||||||
|
This->tooltips_hwnd = NULL;
|
||||||
|
|
||||||
This->in_place_active = FALSE;
|
This->in_place_active = FALSE;
|
||||||
This->ui_active = FALSE;
|
This->ui_active = FALSE;
|
||||||
|
|
Loading…
Reference in New Issue