summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/platform/efl/ScrollbarEfl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/platform/efl/ScrollbarEfl.cpp')
-rw-r--r--Source/WebCore/platform/efl/ScrollbarEfl.cpp216
1 files changed, 216 insertions, 0 deletions
diff --git a/Source/WebCore/platform/efl/ScrollbarEfl.cpp b/Source/WebCore/platform/efl/ScrollbarEfl.cpp
new file mode 100644
index 0000000..282ca7c
--- /dev/null
+++ b/Source/WebCore/platform/efl/ScrollbarEfl.cpp
@@ -0,0 +1,216 @@
+/*
+ * Copyright (C) 2007 Holger Hans Peter Freyther zecke@selfish.org
+ * (C) 2009 Kenneth Rohde Christiansen
+ * (C) 2009 INdT, Instituto Nokia de Technologia
+ * (C) 2009-2010 ProFUSION embedded systems
+ * (C) 2009-2010 Samsung Electronics
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "config.h"
+#include "ScrollbarEfl.h"
+
+#include "ChromeClient.h"
+#include "Frame.h"
+#include "FrameView.h"
+#include "GraphicsContext.h"
+#include "HostWindow.h"
+#include "IntRect.h"
+#include "NotImplemented.h"
+#include "Page.h"
+#include "ScrollbarTheme.h"
+
+#include <Ecore.h>
+#include <Edje.h>
+#include <Evas.h>
+#include <string>
+#include <wtf/text/CString.h>
+
+using namespace std;
+using namespace WebCore;
+
+PassRefPtr<Scrollbar> Scrollbar::createNativeScrollbar(ScrollbarClient* client, ScrollbarOrientation orientation, ScrollbarControlSize size)
+{
+ return adoptRef(new ScrollbarEfl(client, orientation, size));
+}
+
+ScrollbarEfl::ScrollbarEfl(ScrollbarClient* client, ScrollbarOrientation orientation, ScrollbarControlSize controlSize)
+ : Scrollbar(client, orientation, controlSize)
+ , m_lastPos(0)
+ , m_lastTotalSize(0)
+ , m_lastVisibleSize(0)
+{
+ Widget::setFrameRect(IntRect(0, 0, 0, 0));
+}
+
+ScrollbarEfl::~ScrollbarEfl()
+{
+ if (!evasObject())
+ return;
+ evas_object_del(evasObject());
+ setEvasObject(0);
+}
+
+static void scrollbarEflEdjeMessage(void* data, Evas_Object* o, Edje_Message_Type type, int id, void* msg)
+{
+ ScrollbarEfl* that = static_cast<ScrollbarEfl*>(data);
+ Edje_Message_Float* m;
+ int v;
+
+ if (!id) {
+ EINA_LOG_ERR("Unknown message id '%d' from scroll bar theme.", id);
+ return;
+ }
+
+ if (type != EDJE_MESSAGE_FLOAT) {
+ EINA_LOG_ERR("Message id '%d' of incorrect type from scroll bar theme. "
+ "Expected '%d', got '%d'.",
+ id, EDJE_MESSAGE_FLOAT, type);
+ return;
+ }
+
+ m = static_cast<Edje_Message_Float*>(msg);
+ v = m->val * (that->totalSize() - that->visibleSize());
+ that->setValue(v, Scrollbar::NotFromScrollAnimator);
+}
+
+void ScrollbarEfl::setParent(ScrollView* view)
+{
+ Evas_Object* o = evasObject();
+ Evas_Coord w, h;
+
+ Widget::setParent(view);
+
+ if (!o) {
+ if (!view)
+ return;
+
+ o = edje_object_add(view->evas());
+ if (!o) {
+ EINA_LOG_ERR("Could not create edje object for view=%p (evas=%p)",
+ view, view->evas());
+ return;
+ }
+ edje_object_message_handler_set(o, scrollbarEflEdjeMessage, this);
+ setEvasObject(o);
+ } else if (!view) {
+ evas_object_hide(o);
+ return;
+ }
+
+ const char* group = (orientation() == HorizontalScrollbar)
+ ? "scrollbar.horizontal" : "scrollbar.vertical";
+ String theme(edjeThemeRecursive());
+
+ if (theme.isEmpty()) {
+ EINA_LOG_ERR("Could not load theme '%s': no theme path set.", group);
+ evas_object_hide(o);
+ return;
+ }
+
+ if (!edje_object_file_set(o, theme.utf8().data(), group)) {
+ Edje_Load_Error err = edje_object_load_error_get(o);
+ const char* errmsg = edje_load_error_str(err);
+ EINA_LOG_ERR("Could not load theme '%s' from file '%s': #%d '%s'",
+ group, theme.utf8().data(), err, errmsg);
+ return;
+ }
+
+ setPlatformWidget(o);
+ evas_object_smart_member_add(o, view->evasObject());
+ evas_object_show(o);
+
+ edje_object_size_min_get(o, &w, &h);
+
+ IntRect rect = frameRect();
+ rect.setSize(IntSize(w, h));
+ setFrameRect(rect);
+}
+
+void ScrollbarEfl::updateThumbPosition()
+{
+ updateThumbPositionAndProportion();
+}
+
+void ScrollbarEfl::updateThumbProportion()
+{
+ updateThumbPositionAndProportion();
+}
+
+void ScrollbarEfl::updateThumbPositionAndProportion()
+{
+ if (!platformWidget())
+ return;
+
+ int pos = currentPos();
+ int tSize = totalSize();
+ int vSize = visibleSize();
+
+ if (m_lastPos == pos
+ && m_lastTotalSize == tSize
+ && m_lastVisibleSize == vSize)
+ return;
+
+ m_lastPos = pos;
+ m_lastTotalSize = tSize;
+ m_lastVisibleSize = vSize;
+
+ Edje_Message_Float_Set* msg = static_cast<Edje_Message_Float_Set*>
+ (alloca(sizeof(Edje_Message_Float_Set) + sizeof(float)));
+ msg->count = 2;
+
+ if (tSize - vSize > 0)
+ msg->val[0] = pos / (float)(tSize - vSize);
+ else
+ msg->val[0] = 0.0;
+
+ if (tSize > 0)
+ msg->val[1] = vSize / (float)tSize;
+ else
+ msg->val[1] = 0.0;
+
+ edje_object_message_send(platformWidget(), EDJE_MESSAGE_FLOAT_SET, 0, msg);
+}
+
+void ScrollbarEfl::setFrameRect(const IntRect& rect)
+{
+ Widget::setFrameRect(rect);
+ frameRectsChanged();
+}
+
+void ScrollbarEfl::frameRectsChanged()
+{
+ Evas_Object* o = platformWidget();
+ Evas_Coord x, y;
+
+ if (!parent() || !o)
+ return;
+
+ IntRect rect = frameRect();
+ if (parent()->isScrollViewScrollbar(this))
+ rect.setLocation(parent()->convertToContainingWindow(rect.location()));
+ else
+ rect.setLocation(parent()->contentsToWindow(rect.location()));
+
+ evas_object_geometry_get(root()->evasObject(), &x, &y, 0, 0);
+ evas_object_move(o, x + rect.x(), y + rect.y());
+ evas_object_resize(o, rect.width(), rect.height());
+}
+
+void ScrollbarEfl::paint(GraphicsContext* context, const IntRect& rect)
+{
+}
+