Home | History | Annotate | Download | only in haiku
      1 /*
      2  * Copyright (C) 2008 Apple Inc. All Rights Reserved.
      3  * Copyright 2009 Maxime Simon <simon.maxime (at) gmail.com> All Rights Reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  *
     14  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
     15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
     18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     25  */
     26 
     27 #include "config.h"
     28 #include "ScrollbarThemeHaiku.h"
     29 
     30 #include "GraphicsContext.h"
     31 #include "Scrollbar.h"
     32 #include <ControlLook.h>
     33 #include <InterfaceDefs.h>
     34 
     35 
     36 int buttonWidth(int scrollbarWidth, int thickness)
     37 {
     38     return scrollbarWidth < 2 * thickness ? scrollbarWidth / 2 : thickness;
     39 }
     40 
     41 namespace WebCore {
     42 
     43 ScrollbarTheme* ScrollbarTheme::nativeTheme()
     44 {
     45     static ScrollbarThemeHaiku theme;
     46     return &theme;
     47 }
     48 
     49 ScrollbarThemeHaiku::ScrollbarThemeHaiku()
     50 {
     51 }
     52 
     53 ScrollbarThemeHaiku::~ScrollbarThemeHaiku()
     54 {
     55 }
     56 
     57 int ScrollbarThemeHaiku::scrollbarThickness(ScrollbarControlSize controlSize)
     58 {
     59     // FIXME: Should we make a distinction between a Small and a Regular Scrollbar?
     60     return 16;
     61 }
     62 
     63 bool ScrollbarThemeHaiku::hasButtons(Scrollbar* scrollbar)
     64 {
     65     return scrollbar->enabled();
     66 }
     67 
     68 bool ScrollbarThemeHaiku::hasThumb(Scrollbar* scrollbar)
     69 {
     70     return scrollbar->enabled() && thumbLength(scrollbar) > 0;
     71 }
     72 
     73 IntRect ScrollbarThemeHaiku::backButtonRect(Scrollbar* scrollbar, ScrollbarPart part, bool)
     74 {
     75     if (part == BackButtonEndPart)
     76         return IntRect();
     77 
     78     int thickness = scrollbarThickness();
     79     IntPoint buttonOrigin(scrollbar->x(), scrollbar->y());
     80     IntSize buttonSize = scrollbar->orientation() == HorizontalScrollbar
     81         ? IntSize(buttonWidth(scrollbar->width(), thickness), thickness)
     82         : IntSize(thickness, buttonWidth(scrollbar->height(), thickness));
     83     IntRect buttonRect(buttonOrigin, buttonSize);
     84 
     85     return buttonRect;
     86 }
     87 
     88 IntRect ScrollbarThemeHaiku::forwardButtonRect(Scrollbar* scrollbar, ScrollbarPart part, bool)
     89 {
     90     if (part == BackButtonStartPart)
     91         return IntRect();
     92 
     93     int thickness = scrollbarThickness();
     94     if (scrollbar->orientation() == HorizontalScrollbar) {
     95         int width = buttonWidth(scrollbar->width(), thickness);
     96         return IntRect(scrollbar->x() + scrollbar->width() - width, scrollbar->y(), width, thickness);
     97     }
     98 
     99     int height = buttonWidth(scrollbar->height(), thickness);
    100     return IntRect(scrollbar->x(), scrollbar->y() + scrollbar->height() - height, thickness, height);
    101 }
    102 
    103 IntRect ScrollbarThemeHaiku::trackRect(Scrollbar* scrollbar, bool)
    104 {
    105     int thickness = scrollbarThickness();
    106     if (scrollbar->orientation() == HorizontalScrollbar) {
    107         if (scrollbar->width() < 2 * thickness)
    108             return IntRect();
    109         return IntRect(scrollbar->x() + thickness, scrollbar->y(), scrollbar->width() - 2 * thickness, thickness);
    110     }
    111     if (scrollbar->height() < 2 * thickness)
    112         return IntRect();
    113     return IntRect(scrollbar->x(), scrollbar->y() + thickness, thickness, scrollbar->height() - 2 * thickness);
    114 }
    115 
    116 void ScrollbarThemeHaiku::paintScrollbarBackground(GraphicsContext* context, Scrollbar* scrollbar)
    117 {
    118     if (!be_control_look)
    119         return;
    120 
    121     BRect rect = trackRect(scrollbar, false);
    122     orientation scrollbarOrientation = scrollbar->orientation() == HorizontalScrollbar ? B_HORIZONTAL : B_VERTICAL;
    123 
    124     be_control_look->DrawScrollBarBackground(context->platformContext(), rect, rect, ui_color(B_PANEL_BACKGROUND_COLOR), 0, scrollbarOrientation);
    125 }
    126 
    127 void ScrollbarThemeHaiku::paintButton(GraphicsContext* context, Scrollbar* scrollbar, const IntRect& rect, ScrollbarPart part)
    128 {
    129     if (!be_control_look)
    130         return;
    131 
    132     BRect drawRect = BRect(rect);
    133     BView* view = context->platformContext();
    134     rgb_color panelBgColor = ui_color(B_PANEL_BACKGROUND_COLOR);
    135     rgb_color buttonBgColor = tint_color(panelBgColor, B_LIGHTEN_1_TINT);
    136 
    137     be_control_look->DrawButtonFrame(view, drawRect, drawRect, buttonBgColor, panelBgColor);
    138     be_control_look->DrawButtonBackground(view, drawRect, drawRect, buttonBgColor);
    139 
    140     int arrowDirection;
    141     if (scrollbar->orientation() == VerticalScrollbar)
    142         arrowDirection = part == BackButtonStartPart ? BControlLook::B_UP_ARROW : BControlLook::B_DOWN_ARROW;
    143     else
    144         arrowDirection = part == BackButtonStartPart ? BControlLook::B_LEFT_ARROW : BControlLook::B_RIGHT_ARROW;
    145 
    146     be_control_look->DrawArrowShape(view, drawRect, drawRect, ui_color(B_CONTROL_TEXT_COLOR), arrowDirection);
    147 }
    148 
    149 void ScrollbarThemeHaiku::paintThumb(GraphicsContext* context, Scrollbar*, const IntRect& rect)
    150 {
    151     if (!be_control_look)
    152         return;
    153 
    154     BRect drawRect = BRect(rect);
    155     BView* view = context->platformContext();
    156     rgb_color panelBgColor = ui_color(B_PANEL_BACKGROUND_COLOR);
    157     rgb_color buttonBgColor = tint_color(panelBgColor, B_LIGHTEN_1_TINT);
    158 
    159     be_control_look->DrawButtonFrame(view, drawRect, drawRect, buttonBgColor, panelBgColor);
    160     be_control_look->DrawButtonBackground(view, drawRect, drawRect, buttonBgColor);
    161 }
    162 
    163 }
    164 
    165