9 * Initial Contributors: |
9 * Initial Contributors: |
10 * Nokia Corporation - initial contribution. |
10 * Nokia Corporation - initial contribution. |
11 * |
11 * |
12 * Contributors: |
12 * Contributors: |
13 * |
13 * |
14 * Description: |
14 * Description: NMailUI web viewer. Inherits from |
15 * |
15 * QGrapohicsWebView and handles gestures, etc. |
16 */ |
16 */ |
17 |
17 |
18 #include "nmuiheaders.h" |
18 #include "nmuiheaders.h" |
19 |
19 |
20 /*! |
20 /*! |
21 Constructor. |
21 Constructor. |
22 */ |
22 */ |
23 NmMailViewerWK::NmMailViewerWK() |
23 NmMailViewerWK::NmMailViewerWK() |
24 : QGraphicsWebView() |
24 : QGraphicsWebView(), |
|
25 mContent(), |
|
26 mSuppressRelease(false) |
25 { |
27 { |
|
28 // Subscribe this widget to tap and pinch gestures. |
|
29 grabGesture(Qt::TapGesture); |
26 grabGesture(Qt::PinchGesture); |
30 grabGesture(Qt::PinchGesture); |
27 installEventFilter(new NmEventFilterWK(this)); |
31 // Prevent this widget from accepting focus. |
28 setFlag(QGraphicsItem::ItemIsFocusable,false); |
32 setFocusPolicy(Qt::NoFocus); |
29 } |
33 } |
30 |
34 |
31 /*! |
35 /*! |
32 Destructor. |
36 Destructor. |
33 */ |
37 */ |
34 NmMailViewerWK::~NmMailViewerWK() |
38 NmMailViewerWK::~NmMailViewerWK() |
35 { |
39 { |
36 mContent.clear(); |
40 mContent.clear(); |
37 } |
|
38 |
|
39 /*! |
|
40 Sets the parent view. |
|
41 */ |
|
42 void NmMailViewerWK::setParentView(NmViewerView *parentView) |
|
43 { |
|
44 mParentView = parentView; |
|
45 } |
41 } |
46 |
42 |
47 /*! |
43 /*! |
48 Adds content into web view. |
44 Adds content into web view. |
49 */ |
45 */ |
67 if (mContent.contains(key)) { |
63 if (mContent.contains(key)) { |
68 partId = mContent[key].mPartId; |
64 partId = mContent[key].mPartId; |
69 isFetched = mContent[key].mIsFetched; |
65 isFetched = mContent[key].mIsFetched; |
70 return mContent[key].mData; |
66 return mContent[key].mData; |
71 } |
67 } |
72 return 0; |
|
73 } |
68 } |
74 return 0; |
69 return 0; |
75 } |
70 } |
76 |
71 |
77 /*! |
72 /*! |
78 Filter class' constructor. |
73 This is the main event handler that processes all incoming events in an |
|
74 appropriate manner. |
79 */ |
75 */ |
80 NmEventFilterWK::NmEventFilterWK(QObject* parent) |
76 bool NmMailViewerWK::event(QEvent* event) |
81 : QObject(parent) |
|
82 { |
77 { |
83 } |
|
84 |
|
85 /* |
|
86 Filters events if this object has been installed as an event filter. |
|
87 */ |
|
88 bool NmEventFilterWK::eventFilter(QObject* object, QEvent* event) { |
|
89 Q_UNUSED(object); |
|
90 bool consumed = false; |
78 bool consumed = false; |
91 if (event) { |
79 if (event) { |
92 switch (event->type()) { |
80 switch (event->type()) { |
93 case QEvent::Gesture: |
81 case QEvent::Gesture: |
94 consumed = gestureEvent(static_cast<QGestureEvent*>(event)); |
82 // Handle gesture events. |
95 break; |
83 gestureEvent(static_cast<QGestureEvent*>(event)); |
96 case QEvent::GraphicsSceneMouseDoubleClick: |
84 consumed = event->isAccepted(); |
97 // Handle double click (instant zoom). |
|
98 // At the moment we simply consume the event. |
|
99 event->accept(); |
|
100 consumed = true; |
|
101 break; |
85 break; |
102 case QEvent::GraphicsSceneContextMenu: |
86 case QEvent::GraphicsSceneContextMenu: |
103 case QEvent::GraphicsSceneMouseMove: |
87 // Handle context-menu events. |
104 event->accept(); |
88 // contextMenuEvent() is invoked directly in order to override |
105 consumed = true; |
89 // text selection in QWebPage. |
|
90 contextMenuEvent(static_cast<QGraphicsSceneContextMenuEvent*>(event)); |
|
91 consumed = event->isAccepted(); |
106 break; |
92 break; |
107 default: |
93 default: |
|
94 // Invoke base class' event handler. |
|
95 consumed = QGraphicsWebView::event(event); |
108 break; |
96 break; |
109 } |
97 } |
110 } |
98 } |
111 return consumed; |
99 return consumed; |
112 } |
100 } |
113 |
101 |
114 /*! |
102 /*! |
115 Handles gesture events. This function is invoked by the eventFilter() |
103 Handles context-menu events. |
116 function in case of gesture events. |
|
117 */ |
104 */ |
118 bool NmEventFilterWK::gestureEvent(QGestureEvent* event) { |
105 void NmMailViewerWK::contextMenuEvent(QGraphicsSceneContextMenuEvent* event) |
119 bool consumed = false; |
106 { |
120 if (event) { |
107 if (event) { |
|
108 // Suppress context-menu invocations. |
|
109 event->accept(); |
|
110 } |
|
111 } |
|
112 |
|
113 /*! |
|
114 Handles gesture events. |
|
115 */ |
|
116 void NmMailViewerWK::gestureEvent(QGestureEvent* event) |
|
117 { |
|
118 if (event) { |
|
119 if (QTapGesture* tap = static_cast<QTapGesture*>(event->gesture(Qt::TapGesture))) { |
|
120 switch (tap->state()) { |
|
121 case Qt::GestureCanceled: |
|
122 // Tap cancellation suppresses the following mouse release. |
|
123 mSuppressRelease = true; |
|
124 break; |
|
125 default: |
|
126 // Other states disclose the following mouse release. |
|
127 mSuppressRelease = false; |
|
128 break; |
|
129 } |
|
130 event->accept(); |
|
131 } |
121 if (QPinchGesture* pinch = static_cast<QPinchGesture*>(event->gesture(Qt::PinchGesture))) { |
132 if (QPinchGesture* pinch = static_cast<QPinchGesture*>(event->gesture(Qt::PinchGesture))) { |
122 // Handle pinch (zoom). |
133 // Handle pinch (zoom). |
123 // At the moment we simply consume the event. |
134 // At the moment we simply consume the event. |
124 event->accept(); |
135 event->accept(); |
125 consumed = true; |
|
126 } |
136 } |
127 } |
137 } |
128 return consumed; |
|
129 } |
138 } |
|
139 |
|
140 /*! |
|
141 Handles double-click events. |
|
142 */ |
|
143 void NmMailViewerWK::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event) |
|
144 { |
|
145 if (event) { |
|
146 // Handle double clicks (instant zoom). |
|
147 // At the moment we simply consume the event. |
|
148 event->accept(); |
|
149 } |
|
150 } |
|
151 |
|
152 /*! |
|
153 Handles mouse-move events. |
|
154 */ |
|
155 void NmMailViewerWK::mouseMoveEvent(QGraphicsSceneMouseEvent* event) |
|
156 { |
|
157 if (event) { |
|
158 // Suppress drag selection. |
|
159 event->accept(); |
|
160 } |
|
161 } |
|
162 |
|
163 /*! |
|
164 Handles mouse-release events. |
|
165 */ |
|
166 void NmMailViewerWK::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) |
|
167 { |
|
168 if (event) { |
|
169 // Suppress mouse release if the previous tap was cancelled. |
|
170 // Otherwise, invoke the base class' event handler. |
|
171 if (mSuppressRelease) { |
|
172 event->accept(); |
|
173 } else { |
|
174 QGraphicsWebView::mouseReleaseEvent(event); |
|
175 } |
|
176 } |
|
177 } |