2 * Copyright (C) 2012 Samsung Electronics
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
28 #if ENABLE(TIZEN_WEBKIT2_TEXT_SELECTION)
29 #include "TextSelectionMagnifier.h"
33 #include <Elementary.h>
34 #include <WebCore/IntRect.h>
37 using namespace WebCore;
41 TextSelectionMagnifier::TextSelectionMagnifier(EwkViewImpl* viewImpl)
42 : m_viewImpl(viewImpl)
52 TextSelectionMagnifier::~TextSelectionMagnifier()
55 evas_object_del(m_image);
56 evas_object_del(m_magnifier);
59 static float s_widtheOffset = 32;
60 static float s_heightOffset = 60;
62 void TextSelectionMagnifier::update(const IntPoint& point)
65 Evas_Object* topWidget = elm_object_top_widget_get(elm_object_parent_widget_get(m_viewImpl->view()));
67 topWidget = m_viewImpl->view();
69 m_magnifier = elm_layout_add(topWidget);
70 elm_layout_file_set(m_magnifier, EDJE_DIR"/Magnifier.edj", "magnifier");
72 edje_object_part_geometry_get(elm_layout_edje_get(m_magnifier), "bg", 0, 0, &m_edjeWidth, &m_edjeHeight);
74 m_width = m_edjeWidth - s_widtheOffset;
75 m_height = m_edjeHeight - s_heightOffset;
78 int viewX, viewY, viewWidth, viewHeight;
79 evas_object_geometry_get(m_viewImpl->view(), &viewX, &viewY, &viewWidth, &viewHeight);
81 float zoomLevel = 1.5f;
82 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));
89 int overSize = rect.maxX() - (viewX + viewWidth);
91 rect.setX(rect.x() - overSize);
92 overSize = rect.maxY() - (viewY + viewHeight);
94 rect.setY(rect.y() - overSize);
96 RefPtr<WebImage> webImage = m_viewImpl->page()->createSnapshot(rect, zoomLevel);
97 if (!webImage || !webImage->bitmap())
99 RefPtr<cairo_surface_t> cairoSurface = webImage->bitmap()->createCairoSurface();
104 evas_object_del(m_image);
106 m_image = ewk_util_image_from_cairo_surface_add(evas_object_evas_get(m_viewImpl->view()), cairoSurface.get());
107 evas_object_size_hint_min_set(m_image, m_width, m_height);
108 evas_object_resize(m_image, m_width, m_height);
109 evas_object_image_filled_set(m_image, true);
110 evas_object_show(m_image);
112 elm_object_part_content_set(m_magnifier, "swallow", m_image);
113 evas_object_pass_events_set(m_image, EINA_TRUE);
114 evas_object_clip_set(m_image, m_magnifier);
116 evas_object_layer_set(m_magnifier, EVAS_LAYER_MAX);
117 evas_object_layer_set(m_image, EVAS_LAYER_MAX);
120 void TextSelectionMagnifier::show()
125 evas_object_show(m_magnifier);
126 evas_object_smart_callback_call(m_viewImpl->view(), "magnifier,show", 0);
129 void TextSelectionMagnifier::hide()
134 evas_object_hide(m_magnifier);
135 evas_object_smart_callback_call(m_viewImpl->view(), "magnifier,hide", 0);
138 static int s_magnifierMargin = 10;
139 static int s_magnifierOffsetY = 220;
140 static int s_defaultEdjeHeight = 177;
142 void TextSelectionMagnifier::move(const IntPoint& point)
144 int viewX, viewY, viewWidth, viewHeight;
145 evas_object_geometry_get(m_viewImpl->view(), &viewX, &viewY, &viewWidth, &viewHeight);
147 int xPosition = point.x();
148 if (xPosition < viewX + (m_width / 2))
149 xPosition = viewX + m_width / 2 + s_magnifierMargin;
150 if (xPosition > viewX + viewWidth - (m_width / 2))
151 xPosition = viewX + viewWidth - (m_width / 2) - s_magnifierMargin;
153 int yPosition = point.y() - ((float)s_magnifierOffsetY * ((float)m_edjeHeight / s_defaultEdjeHeight));
154 if (yPosition < viewY)
156 if (yPosition > viewY + viewHeight)
157 yPosition = viewY + viewHeight;
159 evas_object_move(m_magnifier, xPosition, yPosition);
162 bool TextSelectionMagnifier::isVisible()
164 return evas_object_visible_get(m_magnifier);
167 } // namespace WebKit
169 #endif // TIZEN_WEBKIT2_TEXT_SELECTION