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