⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webkit.mm

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 MM
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////////////// Name:        webkit.mm// Purpose:     wxWebKitCtrl - embeddable web kit control// Author:      Jethro Grassie / Kevin Ollivier// Modified by:// Created:     2004-4-16// RCS-ID:      $Id: webkit.mm,v 1.30 2006/12/06 04:37:32 KO Exp $// Copyright:   (c) Jethro Grassie / Kevin Ollivier// Licence:     wxWindows licence/////////////////////////////////////////////////////////////////////////////#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)    #pragma implementation "webkit.h"#endif// For compilers that support precompilation, includes "wx.h".#include "wx/wxprec.h"#include "wx/splitter.h"#ifndef WX_PRECOMP    #include "wx/wx.h"#endif#if wxUSE_WEBKIT#ifdef __WXCOCOA__#include "wx/cocoa/autorelease.h"#else#include "wx/mac/uma.h"#include <Carbon/Carbon.h>#include <WebKit/WebKit.h>#include <WebKit/HIWebView.h>#include <WebKit/CarbonUtils.h>#endif#include "wx/html/webkit.h"#define DEBUG_WEBKIT_SIZING 0// ----------------------------------------------------------------------------// macros// ----------------------------------------------------------------------------IMPLEMENT_DYNAMIC_CLASS(wxWebKitCtrl, wxControl)BEGIN_EVENT_TABLE(wxWebKitCtrl, wxControl)    EVT_SIZE(wxWebKitCtrl::OnSize)END_EVENT_TABLE()// ----------------------------------------------------------------------------// Carbon Events handlers// ----------------------------------------------------------------------------// prototype for function in src/mac/carbon/toplevel.cppvoid SetupMouseEvent( wxMouseEvent &wxevent , wxMacCarbonEvent &cEvent );static const EventTypeSpec eventList[] ={    //{ kEventClassControl, kEventControlTrack } ,    { kEventClassMouse, kEventMouseUp },    { kEventClassMouse, kEventMouseDown },    { kEventClassMouse, kEventMouseMoved },    { kEventClassMouse, kEventMouseDragged },        { kEventClassKeyboard, kEventRawKeyDown } ,    { kEventClassKeyboard, kEventRawKeyRepeat } ,    { kEventClassKeyboard, kEventRawKeyUp } ,    { kEventClassKeyboard, kEventRawKeyModifiersChanged } ,        { kEventClassTextInput, kEventTextInputUnicodeForKeyEvent } ,    { kEventClassTextInput, kEventTextInputUpdateActiveInputArea } ,    #if DEBUG_WEBKIT_SIZING == 1    { kEventClassControl, kEventControlBoundsChanged } ,#endif};// mix this in from window.cpppascal OSStatus wxMacUnicodeTextEventHandler( EventHandlerCallRef handler , EventRef event , void *data ) ;// NOTE: This is mostly taken from KeyboardEventHandler in toplevel.cpp, but// that expects the data pointer is a top-level window, so I needed to change// that in this case. However, once 2.8 is out, we should factor out the common logic// among the two functions and merge them.static pascal OSStatus wxWebKitKeyEventHandler( EventHandlerCallRef handler , EventRef event , void *data ){    OSStatus result = eventNotHandledErr ;    wxMacCarbonEvent cEvent( event ) ;    wxWebKitCtrl* thisWindow = (wxWebKitCtrl*) data ;        wxWindow* focus = thisWindow ;    unsigned char charCode ;    wxChar uniChar[2] ;    uniChar[0] = 0;    uniChar[1] = 0;    UInt32 keyCode ;    UInt32 modifiers ;    Point point ;    UInt32 when = EventTimeToTicks( GetEventTime( event ) ) ;#if wxUSE_UNICODE    ByteCount dataSize = 0 ;    if ( GetEventParameter( event, kEventParamKeyUnicodes, typeUnicodeText, NULL, 0 , &dataSize, NULL ) == noErr )    {        UniChar buf[2] ;        int numChars = dataSize / sizeof( UniChar) + 1;        UniChar* charBuf = buf ;        if ( numChars * 2 > 4 )            charBuf = new UniChar[ numChars ] ;        GetEventParameter( event, kEventParamKeyUnicodes, typeUnicodeText, NULL, dataSize , NULL , charBuf ) ;        charBuf[ numChars - 1 ] = 0;#if SIZEOF_WCHAR_T == 2        uniChar = charBuf[0] ;#else        wxMBConvUTF16 converter ;        converter.MB2WC( uniChar , (const char*)charBuf , 2 ) ;#endif        if ( numChars * 2 > 4 )            delete[] charBuf ;    }#endif    GetEventParameter( event, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(char), NULL, &charCode );    GetEventParameter( event, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &keyCode );    GetEventParameter( event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers );    GetEventParameter( event, kEventParamMouseLocation, typeQDPoint, NULL, sizeof(Point), NULL, &point );    UInt32 message = (keyCode << 8) + charCode;    switch ( GetEventKind( event ) )    {        case kEventRawKeyRepeat :        case kEventRawKeyDown :            {                WXEVENTREF formerEvent = wxTheApp->MacGetCurrentEvent() ;                WXEVENTHANDLERCALLREF formerHandler = wxTheApp->MacGetCurrentEventHandlerCallRef() ;                wxTheApp->MacSetCurrentEvent( event , handler ) ;                if ( /* focus && */ wxTheApp->MacSendKeyDownEvent(                    focus , message , modifiers , when , point.h , point.v , uniChar[0] ) )                {                    result = noErr ;                }                wxTheApp->MacSetCurrentEvent( formerEvent , formerHandler ) ;            }            break ;        case kEventRawKeyUp :            if ( /* focus && */ wxTheApp->MacSendKeyUpEvent(                focus , message , modifiers , when , point.h , point.v , uniChar[0] ) )            {                result = noErr ;            }            break ;        case kEventRawKeyModifiersChanged :            {                wxKeyEvent event(wxEVT_KEY_DOWN);                event.m_shiftDown = modifiers & shiftKey;                event.m_controlDown = modifiers & controlKey;                event.m_altDown = modifiers & optionKey;                event.m_metaDown = modifiers & cmdKey;                event.m_x = point.h;                event.m_y = point.v;#if wxUSE_UNICODE                event.m_uniChar = uniChar[0] ;#endif                event.SetTimestamp(when);                event.SetEventObject(focus);                if ( /* focus && */ (modifiers ^ wxApp::s_lastModifiers ) & controlKey )                {                    event.m_keyCode = WXK_CONTROL ;                    event.SetEventType( ( modifiers & controlKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ;                    focus->GetEventHandler()->ProcessEvent( event ) ;                }                if ( /* focus && */ (modifiers ^ wxApp::s_lastModifiers ) & shiftKey )                {                    event.m_keyCode = WXK_SHIFT ;                    event.SetEventType( ( modifiers & shiftKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ;                    focus->GetEventHandler()->ProcessEvent( event ) ;                }                if ( /* focus && */ (modifiers ^ wxApp::s_lastModifiers ) & optionKey )                {                    event.m_keyCode = WXK_ALT ;                    event.SetEventType( ( modifiers & optionKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ;                    focus->GetEventHandler()->ProcessEvent( event ) ;                }                if ( /* focus && */ (modifiers ^ wxApp::s_lastModifiers ) & cmdKey )                {                    event.m_keyCode = WXK_COMMAND ;                    event.SetEventType( ( modifiers & cmdKey ) ? wxEVT_KEY_DOWN : wxEVT_KEY_UP ) ;                    focus->GetEventHandler()->ProcessEvent( event ) ;                }                wxApp::s_lastModifiers = modifiers ;            }            break ;        default:            break;    }    return result ;}static pascal OSStatus wxWebKitCtrlEventHandler( EventHandlerCallRef handler , EventRef event , void *data ){    OSStatus result = eventNotHandledErr ;    wxMacCarbonEvent cEvent( event ) ;    ControlRef controlRef ;    wxWebKitCtrl* thisWindow = (wxWebKitCtrl*) data ;    wxTopLevelWindowMac* tlw = NULL;    if (thisWindow)        tlw = thisWindow->MacGetTopLevelWindow();    cEvent.GetParameter( kEventParamDirectObject , &controlRef ) ;        wxWindow* currentMouseWindow = thisWindow ;        if ( wxApp::s_captureWindow )        currentMouseWindow = wxApp::s_captureWindow;    switch ( GetEventClass( event ) )    {        case kEventClassKeyboard:        {            result = wxWebKitKeyEventHandler(handler, event, data);            break;        }                case kEventClassTextInput:        {            result = wxMacUnicodeTextEventHandler(handler, event, data);            break;        }                case kEventClassMouse:        {            switch ( GetEventKind( event ) )            {                case kEventMouseDragged :                case kEventMouseMoved :                case kEventMouseDown :                case kEventMouseUp :                {                    wxMouseEvent wxevent(wxEVT_LEFT_DOWN);                    SetupMouseEvent( wxevent , cEvent ) ;                                        currentMouseWindow->ScreenToClient( &wxevent.m_x , &wxevent.m_y ) ;                    wxevent.SetEventObject( currentMouseWindow ) ;                    wxevent.SetId( currentMouseWindow->GetId() ) ;                                        if ( currentMouseWindow->GetEventHandler()->ProcessEvent(wxevent) )                    {                        result = noErr;                    }                    break; // this should enable WebKit to fire mouse dragged and mouse up events...                }                default :                    break ;            }        }        default:            break;    }    result = CallNextEventHandler(handler, event);    return result ;}DEFINE_ONE_SHOT_HANDLER_GETTER( wxWebKitCtrlEventHandler )// ----------------------------------------------------------------------------// wxWebKit Events// ----------------------------------------------------------------------------IMPLEMENT_DYNAMIC_CLASS( wxWebKitStateChangedEvent, wxCommandEvent )DEFINE_EVENT_TYPE( wxEVT_WEBKIT_STATE_CHANGED )wxWebKitStateChangedEvent::wxWebKitStateChangedEvent( wxWindow* win ){    SetEventType( wxEVT_WEBKIT_STATE_CHANGED);    SetEventObject( win );    SetId(win->GetId());}IMPLEMENT_DYNAMIC_CLASS( wxWebKitBeforeLoadEvent, wxCommandEvent )DEFINE_EVENT_TYPE( wxEVT_WEBKIT_BEFORE_LOAD )wxWebKitBeforeLoadEvent::wxWebKitBeforeLoadEvent( wxWindow* win ){    m_cancelled = false;    SetEventType( wxEVT_WEBKIT_BEFORE_LOAD);    SetEventObject( win );    SetId(win->GetId());}//---------------------------------------------------------// helper functions for NSString<->wxString conversion//---------------------------------------------------------inline wxString wxStringWithNSString(NSString *nsstring){#if wxUSE_UNICODE    return wxString([nsstring UTF8String], wxConvUTF8);#else    return wxString([nsstring lossyCString]);#endif // wxUSE_UNICODE}inline NSString* wxNSStringWithWxString(const wxString &wxstring){#if wxUSE_UNICODE    return [NSString stringWithUTF8String: wxstring.mb_str(wxConvUTF8)];#else    return [NSString stringWithCString: wxstring.c_str() length:wxstring.Len()];#endif // wxUSE_UNICODE}inline int wxNavTypeFromWebNavType(int type){    if (type == WebNavigationTypeLinkClicked)        return wxWEBKIT_NAV_LINK_CLICKED;        if (type == WebNavigationTypeFormSubmitted)        return wxWEBKIT_NAV_FORM_SUBMITTED;            if (type == WebNavigationTypeBackForward)        return wxWEBKIT_NAV_BACK_NEXT;            if (type == WebNavigationTypeReload)        return wxWEBKIT_NAV_RELOAD;            if (type == WebNavigationTypeFormResubmitted)        return wxWEBKIT_NAV_FORM_RESUBMITTED;            return wxWEBKIT_NAV_OTHER;}@interface MyFrameLoadMonitor : NSObject{    wxWebKitCtrl* webKitWindow;}- initWithWxWindow: (wxWebKitCtrl*)inWindow;@end@interface MyPolicyDelegate : NSObject{    wxWebKitCtrl* webKitWindow;}- initWithWxWindow: (wxWebKitCtrl*)inWindow;@end// ----------------------------------------------------------------------------// creation/destruction// ----------------------------------------------------------------------------bool wxWebKitCtrl::Create(wxWindow *parent,                                 wxWindowID winID,                                 const wxString& strURL,                                 const wxPoint& pos,                                 const wxSize& size, long style,                                 const wxValidator& validator,                                 const wxString& name){    m_currentURL = strURL;    //m_pageTitle = _("Untitled Page"); //still needed for wxCocoa??/*    int width, height;    wxSize sizeInstance;    if (size.x == wxDefaultCoord || size.y == wxDefaultCoord)    {        m_parent->GetClientSize(&width, &height);        sizeInstance.x = width;        sizeInstance.y = height;    }    else    {        sizeInstance.x = size.x;        sizeInstance.y = size.y;    }*/    // now create and attach WebKit view...#ifdef __WXCOCOA__    wxControl::Create(parent, m_windowID, pos, sizeInstance, style , validator , name);    SetSize(pos.x, pos.y, sizeInstance.x, sizeInstance.y);    wxTopLevelWindowCocoa *topWin = wxDynamicCast(this, wxTopLevelWindowCocoa);    NSWindow* nsWin = topWin->GetNSWindow();    NSRect rect;    rect.origin.x = pos.x;    rect.origin.y = pos.y;    rect.size.width = sizeInstance.x;    rect.size.height = sizeInstance.y;    m_webView = (WebView*)[[WebView alloc] initWithFrame:rect frameName:@"webkitFrame" groupName:@"webkitGroup"];    SetNSView(m_webView);    [m_cocoaNSView release];    if(m_parent) m_parent->CocoaAddChild(this);    SetInitialFrameRect(pos,sizeInstance);#else    m_macIsUserPane = false;    wxControl::Create(parent, winID, pos, size, style , validator , name);    m_peer = new wxMacControl(this);    WebInitForCarbon();    HIWebViewCreate( m_peer->GetControlRefAddr() );    m_webView = (WebView*) HIWebViewGetWebView( m_peer->GetControlRef() );    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -