Tizen 2.1 base
[framework/web/webkit-efl.git] / Source / WebKit2 / UIProcess / API / efl / tizen / TextSelectionMagnifier.cpp
1 /*
2  * Copyright (C) 2012 Samsung Electronics
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27
28 #if ENABLE(TIZEN_WEBKIT2_TEXT_SELECTION)
29 #include "TextSelectionMagnifier.h"
30
31 #include "WebImage.h"
32 #include "ewk_util.h"
33 #include <Elementary.h>
34 #include <WebCore/IntRect.h>
35 #include <cairo.h>
36
37 using namespace WebCore;
38
39 namespace WebKit {
40
41 TextSelectionMagnifier::TextSelectionMagnifier(Evas_Object* object, WebPageProxy* page, PageClientImpl* pageClient)
42     : m_object(object),
43       m_image(0),
44       m_popup(0),
45       m_width(300),
46       m_height(100),
47       m_page(page),
48       m_pageClient(pageClient)
49 {
50 }
51
52 TextSelectionMagnifier::~TextSelectionMagnifier()
53 {
54     if (m_image)
55         evas_object_del(m_image);
56     evas_object_del(m_popup);
57 }
58
59 void TextSelectionMagnifier::update(const IntPoint& point)
60 {
61     if (!m_popup) {
62         Evas_Object* topWidget = elm_object_top_widget_get(elm_object_parent_widget_get(m_object));
63         if (!topWidget)
64             topWidget = m_object;
65
66         m_popup = elm_ctxpopup_add(topWidget);
67         elm_object_focus_allow_set(m_popup, EINA_FALSE);
68         elm_object_style_set(m_popup, "extended/entry/pass_event");
69         elm_ctxpopup_direction_priority_set(m_popup, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_UP,
70              ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_UP);
71     }
72
73     int viewX, viewY, viewWidth, viewHeight;
74     evas_object_geometry_get(m_pageClient->viewWidget(), &viewX, &viewY, &viewWidth, &viewHeight);
75
76     float zoomLevel = 1.5f;
77     IntRect rect(point.x() - viewX - (ceil(m_width/zoomLevel)/2), point.y() - viewY - (ceil(m_height/zoomLevel)/2), ceil(m_width/zoomLevel), ceil(m_height/zoomLevel));
78
79     if (rect.x() < 0)
80         rect.setX(0);
81     if (rect.y() < 0)
82         rect.setY(0);
83
84     int overSize = rect.maxX() - (viewX + viewWidth);
85     if (overSize > 0)
86         rect.setX(rect.x() - overSize);
87     overSize = rect.maxY() - (viewY + viewHeight);
88     if (overSize > 0)
89         rect.setY(rect.y() - overSize);
90
91     RefPtr<WebImage> webImage = m_page->createSnapshot(rect, zoomLevel);
92     if (!webImage || !webImage->bitmap())
93         return;
94     RefPtr<cairo_surface_t> cairoSurface = webImage->bitmap()->createCairoSurface();
95     if (!cairoSurface)
96         return;
97
98     if (m_image)
99         evas_object_del(m_image);
100
101     m_image = ewk_util_image_from_cairo_surface_add(evas_object_evas_get(m_object), cairoSurface.get());
102     evas_object_size_hint_min_set(m_image, m_width, m_height);
103     evas_object_resize(m_image, m_width, m_height);
104
105     evas_object_image_filled_set(m_image, true);
106
107     elm_object_content_unset(m_popup);
108     elm_object_content_set(m_popup, m_image);
109 }
110
111 void TextSelectionMagnifier::show()
112 {
113     evas_object_show(m_image);
114     evas_object_show(m_popup);
115 }
116
117 void TextSelectionMagnifier::hide()
118 {
119     evas_object_hide(m_image);
120     evas_object_hide(m_popup);
121 }
122
123 void TextSelectionMagnifier::move(const IntPoint& point)
124 {
125     evas_object_move(m_popup, point.x(), point.y());
126 }
127
128 bool TextSelectionMagnifier::isVisible()
129 {
130     return evas_object_visible_get(m_popup);
131 }
132
133 } // namespace WebKit
134
135 #endif // TIZEN_WEBKIT2_TEXT_SELECTION