diff options
Diffstat (limited to 'WebKit/wx/WebView.cpp')
-rw-r--r-- | WebKit/wx/WebView.cpp | 252 |
1 files changed, 214 insertions, 38 deletions
diff --git a/WebKit/wx/WebView.cpp b/WebKit/wx/WebView.cpp index 94c760b..6bb1f7c 100644 --- a/WebKit/wx/WebView.cpp +++ b/WebKit/wx/WebView.cpp @@ -46,6 +46,7 @@ #include "PlatformWheelEvent.h" #include "RenderObject.h" #include "RenderView.h" +#include "Scrollbar.h" #include "SelectionController.h" #include "Settings.h" #include "SubstituteData.h" @@ -147,6 +148,42 @@ wxWebViewConsoleMessageEvent::wxWebViewConsoleMessageEvent(wxWindow* win) SetId(win->GetId()); } +IMPLEMENT_DYNAMIC_CLASS(wxWebViewAlertEvent, wxCommandEvent) + +DEFINE_EVENT_TYPE(wxEVT_WEBVIEW_JS_ALERT) + +wxWebViewAlertEvent::wxWebViewAlertEvent(wxWindow* win) +{ + SetEventType(wxEVT_WEBVIEW_JS_ALERT); + SetEventObject(win); + if (win) + SetId(win->GetId()); +} + +IMPLEMENT_DYNAMIC_CLASS(wxWebViewConfirmEvent, wxCommandEvent) + +DEFINE_EVENT_TYPE(wxEVT_WEBVIEW_JS_CONFIRM) + +wxWebViewConfirmEvent::wxWebViewConfirmEvent(wxWindow* win) +{ + SetEventType(wxEVT_WEBVIEW_JS_CONFIRM); + SetEventObject(win); + if (win) + SetId(win->GetId()); +} + +IMPLEMENT_DYNAMIC_CLASS(wxWebViewPromptEvent, wxCommandEvent) + +DEFINE_EVENT_TYPE(wxEVT_WEBVIEW_JS_PROMPT) + +wxWebViewPromptEvent::wxWebViewPromptEvent(wxWindow* win) +{ + SetEventType(wxEVT_WEBVIEW_JS_PROMPT); + SetEventObject(win); + if (win) + SetId(win->GetId()); +} + IMPLEMENT_DYNAMIC_CLASS(wxWebViewReceivedTitleEvent, wxCommandEvent) DEFINE_EVENT_TYPE(wxEVT_WEBVIEW_RECEIVED_TITLE) @@ -159,6 +196,19 @@ wxWebViewReceivedTitleEvent::wxWebViewReceivedTitleEvent(wxWindow* win) SetId(win->GetId()); } +IMPLEMENT_DYNAMIC_CLASS(wxWebViewWindowObjectClearedEvent, wxCommandEvent) + +DEFINE_EVENT_TYPE(wxEVT_WEBVIEW_WINDOW_OBJECT_CLEARED) + +wxWebViewWindowObjectClearedEvent::wxWebViewWindowObjectClearedEvent(wxWindow* win) +{ + SetEventType(wxEVT_WEBVIEW_WINDOW_OBJECT_CLEARED); + SetEventObject(win); + if (win) + SetId(win->GetId()); +} + + //--------------------------------------------------------- // DOM Element info data type //--------------------------------------------------------- @@ -416,6 +466,12 @@ void wxWebView::DecreaseTextSize() m_mainFrame->DecreaseTextSize(); } +void wxWebView::ResetTextSize() +{ + if (m_mainFrame) + m_mainFrame->ResetTextSize(); +} + void wxWebView::MakeEditable(bool enable) { m_isEditable = enable; @@ -454,17 +510,16 @@ void wxWebView::OnPaint(wxPaintEvent& event) paintRect.Offset(offset.width(), offset.height()); #if USE(WXGC) - WebCore::GraphicsContext* gc = new WebCore::GraphicsContext(&gcdc); + WebCore::GraphicsContext gc(&gcdc); #else - WebCore::GraphicsContext* gc = new WebCore::GraphicsContext((wxWindowDC*)&dc); + WebCore::GraphicsContext gc(&dc); #endif - if (gc && frame->contentRenderer()) { + if (frame->contentRenderer()) { if (frame->view()->needsLayout()) frame->view()->layout(); - frame->view()->paintContents(gc, paintRect); + frame->view()->paintContents(&gc, paintRect); } - delete gc; } } } @@ -489,10 +544,22 @@ void wxWebView::OnSize(wxSizeEvent& event) event.Skip(); } +static int getDoubleClickTime() +{ +#if __WXMSW__ + return ::GetDoubleClickTime(); +#else + return 500; +#endif +} + void wxWebView::OnMouseEvents(wxMouseEvent& event) { event.Skip(); + if (m_beingDestroyed) + return; + if (!m_mainFrame) return; @@ -510,7 +577,20 @@ void wxWebView::OnMouseEvents(wxMouseEvent& event) return; } - WebCore::PlatformMouseEvent wkEvent(event, globalPoint); + int clickCount = event.ButtonDClick() ? 2 : 1; + + if (clickCount == 1 && m_impl->tripleClickTimer.IsRunning()) { + wxPoint diff(event.GetPosition() - m_impl->tripleClickPos); + if (abs(diff.x) <= wxSystemSettings::GetMetric(wxSYS_DCLICK_X) && + abs(diff.y) <= wxSystemSettings::GetMetric(wxSYS_DCLICK_Y)) { + clickCount = 3; + } + } else if (clickCount == 2) { + m_impl->tripleClickTimer.Start(getDoubleClickTime(), false); + m_impl->tripleClickPos = event.GetPosition(); + } + + WebCore::PlatformMouseEvent wkEvent(event, globalPoint, clickCount); if (type == wxEVT_LEFT_DOWN || type == wxEVT_MIDDLE_DOWN || type == wxEVT_RIGHT_DOWN || type == wxEVT_LEFT_DCLICK || type == wxEVT_MIDDLE_DCLICK || type == wxEVT_RIGHT_DCLICK) @@ -539,7 +619,7 @@ void wxWebView::OnContextMenuEvents(wxContextMenuEvent& event) wxMouseEvent mouseEvent(wxEVT_RIGHT_DOWN); mouseEvent.m_x = localEventPoint.x; mouseEvent.m_y = localEventPoint.y; - WebCore::PlatformMouseEvent wkEvent(mouseEvent, event.GetPosition()); + WebCore::PlatformMouseEvent wkEvent(mouseEvent, event.GetPosition(), 1); bool handledEvent = focusedFrame->eventHandler()->sendContextMenuEvent(wkEvent); if (!handledEvent) @@ -583,7 +663,7 @@ void wxWebView::Copy() bool wxWebView::CanCut() { if (m_mainFrame) - m_mainFrame->CanCut(); + return m_mainFrame->CanCut(); return false; } @@ -597,7 +677,7 @@ void wxWebView::Cut() bool wxWebView::CanPaste() { if (m_mainFrame) - m_mainFrame->CanPaste(); + return m_mainFrame->CanPaste(); return false; } @@ -606,7 +686,6 @@ void wxWebView::Paste() { if (m_mainFrame) m_mainFrame->Paste(); - } void wxWebView::OnKeyEvents(wxKeyEvent& event) @@ -614,40 +693,137 @@ void wxWebView::OnKeyEvents(wxKeyEvent& event) WebCore::Frame* frame = 0; if (m_mainFrame) frame = m_mainFrame->GetFrame(); - - if (frame && frame->view()) { - // WebCore doesn't handle these events itself, so we need to do - // it and not send the event down or else CTRL+C will erase the text - // and replace it with c. - if (event.CmdDown() && event.GetEventType() == wxEVT_KEY_UP) { - if (event.GetKeyCode() == static_cast<int>('C')) + + if (!(frame && frame->view())) + return; + + if (event.GetKeyCode() == WXK_CAPITAL) + frame->eventHandler()->capsLockStateMayHaveChanged(); + + WebCore::PlatformKeyboardEvent wkEvent(event); + + if (frame->eventHandler()->keyEvent(wkEvent)) + return; + + //Some things WebKit won't do for us... Copy/Cut/Paste and KB scrolling + if (event.GetEventType() == wxEVT_KEY_DOWN) { + switch (event.GetKeyCode()) { + case 67: //"C" + if (CanCopy() && event.GetModifiers() == wxMOD_CMD) { Copy(); - else if (event.GetKeyCode() == static_cast<int>('X')) + return; + } + break; + case 86: //"V" + if (CanPaste() && event.GetModifiers() == wxMOD_CMD) { + Paste(); + return; + } + break; + case 88: //"X" + if (CanCut() && event.GetModifiers() == wxMOD_CMD) { Cut(); - else if (event.GetKeyCode() == static_cast<int>('V')) + return; + } + break; + case WXK_INSERT: + if (CanCopy() && event.GetModifiers() == wxMOD_CMD) { + Copy(); + return; + } + if (CanPaste() && event.GetModifiers() == wxMOD_SHIFT) { Paste(); - else if (event.GetKeyCode() == static_cast<int>('Z')) { - if (event.ShiftDown()) { - if (m_mainFrame->CanRedo()) - m_mainFrame->Redo(); - } - else { - if (m_mainFrame->CanUndo()) - m_mainFrame->Undo(); - } + return; + } + return; //Insert shall not become a char + case WXK_DELETE: + if (CanCut() && event.GetModifiers() == wxMOD_SHIFT) { + Cut(); + return; } - } else { - WebCore::PlatformKeyboardEvent wkEvent(event); - if (wkEvent.type() == WebCore::PlatformKeyboardEvent::Char && wkEvent.altKey()) - frame->eventHandler()->handleAccessKey(wkEvent); - else - frame->eventHandler()->keyEvent(wkEvent); + break; + case WXK_LEFT: + case WXK_NUMPAD_LEFT: + frame->view()->scrollBy(WebCore::IntSize(-WebCore::cScrollbarPixelsPerLineStep, 0)); + return; + case WXK_UP: + case WXK_NUMPAD_UP: + frame->view()->scrollBy(WebCore::IntSize(0, -WebCore::cScrollbarPixelsPerLineStep)); + return; + case WXK_RIGHT: + case WXK_NUMPAD_RIGHT: + frame->view()->scrollBy(WebCore::IntSize(WebCore::cScrollbarPixelsPerLineStep, 0)); + return; + case WXK_DOWN: + case WXK_NUMPAD_DOWN: + frame->view()->scrollBy(WebCore::IntSize(0, WebCore::cScrollbarPixelsPerLineStep)); + return; + case WXK_END: + case WXK_NUMPAD_END: + frame->view()->setScrollPosition(WebCore::IntPoint(frame->view()->scrollX(), frame->view()->maximumScrollPosition().y())); + return; + case WXK_HOME: + case WXK_NUMPAD_HOME: + frame->view()->setScrollPosition(WebCore::IntPoint(frame->view()->scrollX(), 0)); + return; + case WXK_PAGEUP: + case WXK_NUMPAD_PAGEUP: + frame->view()->scrollBy(WebCore::IntSize(0, -frame->view()->visibleHeight() + WebCore::cAmountToKeepWhenPaging)); + return; + case WXK_PAGEDOWN: + case WXK_NUMPAD_PAGEDOWN: + frame->view()->scrollBy(WebCore::IntSize(0, frame->view()->visibleHeight() - WebCore::cAmountToKeepWhenPaging)); + return; + //These we don't want turning into char events, stuff 'em + case WXK_ESCAPE: + case WXK_LBUTTON: + case WXK_RBUTTON: + case WXK_CANCEL: + case WXK_MENU: + case WXK_MBUTTON: + case WXK_CLEAR: + case WXK_PAUSE: + case WXK_SELECT: + case WXK_PRINT: + case WXK_EXECUTE: + case WXK_SNAPSHOT: + case WXK_HELP: + case WXK_F1: + case WXK_F2: + case WXK_F3: + case WXK_F4: + case WXK_F5: + case WXK_F6: + case WXK_F7: + case WXK_F8: + case WXK_F9: + case WXK_F10: + case WXK_F11: + case WXK_F12: + case WXK_F13: + case WXK_F14: + case WXK_F15: + case WXK_F16: + case WXK_F17: + case WXK_F18: + case WXK_F19: + case WXK_F20: + case WXK_F21: + case WXK_F22: + case WXK_F23: + case WXK_F24: + case WXK_NUMPAD_F1: + case WXK_NUMPAD_F2: + case WXK_NUMPAD_F3: + case WXK_NUMPAD_F4: + //When numlock is off Numpad 5 becomes BEGIN, or HOME on Char + case WXK_NUMPAD_BEGIN: + case WXK_NUMPAD_INSERT: + return; } } - - // make sure we get the character event. - if (event.GetEventType() != wxEVT_CHAR) - event.Skip(); + + event.Skip(); } void wxWebView::OnSetFocus(wxFocusEvent& event) |