/* _______ __ __ __ ______ __ __ _______ __ __ * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\ * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / / * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / / * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / / * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ * * Copyright (c) 2004, 2005 darkbits Js_./ * Per Larsson a.k.a finalman _RqZ{a<^_aa * Olof Naessén a.k.a jansem/yakslem _asww7!uY`> )\a// * _Qhm`] _f "'c 1!5m * Visit: http://guichan.darkbits.org )Qk

ws?a-?' ._/L #' * binary forms, with or without )4d[#7r, . ' )d`)[ * modification, are permitted provided _Q-5'5W..j/?' -?!\)cam' * that the following conditions are met: j<. a J@\ * this list of conditions and the j(]1u_setParent(NULL); getContent()->_setFocusHandler(NULL); } if (widget != NULL) { widget->_setParent(this); widget->_setFocusHandler(_getFocusHandler()); } mContent = widget; repositionContent(); } Widget* Window::getContent() const { return mContent; } void Window::setCaption(const std::string& caption) { mCaption = caption; } const std::string& Window::getCaption() const { return mCaption; } void Window::setAlignment(unsigned int alignment) { mAlignment = alignment; } unsigned int Window::getAlignment() const { return mAlignment; } void Window::draw(Graphics* graphics) { Color faceColor = getBaseColor(); Color highlightColor, shadowColor; int alpha = getBaseColor().a; highlightColor = faceColor + 0x303030; highlightColor.a = alpha; shadowColor = faceColor - 0x303030; shadowColor.a = alpha; Rectangle d = getContentDimension(); // Fill the background around the content graphics->setColor(faceColor); // Fill top graphics->fillRectangle(Rectangle(0,0,getWidth(),d.y - 1)); // Fill left graphics->fillRectangle(Rectangle(0,d.y - 1, d.x - 1, getHeight() - d.y + 1)); // Fill right graphics->fillRectangle(Rectangle(d.x + d.width + 1, d.y - 1, getWidth() - d.x - d.width - 1, getHeight() - d.y + 1)); // Fill bottom graphics->fillRectangle(Rectangle(d.x - 1, d.y + d.height + 1, d.width + 2, getHeight() - d.height - d.y - 1)); if (isOpaque()) { graphics->fillRectangle(d); } // Construct a rectangle one pixel bigger than the content d.x -= 1; d.y -= 1; d.width += 2; d.height += 2; // Draw a border around the content graphics->setColor(shadowColor); // Top line graphics->drawLine(d.x, d.y, d.x + d.width - 2, d.y); // Left line graphics->drawLine(d.x, d.y + 1, d.x, d.y + d.height - 1); graphics->setColor(highlightColor); // Right line graphics->drawLine(d.x + d.width - 1, d.y, d.x + d.width - 1, d.y + d.height - 2); // Bottom line graphics->drawLine(d.x + 1, d.y + d.height - 1, d.x + d.width - 1, d.y + d.height - 1); drawContent(graphics); int textX; int textY; textY = ((int)getTitleBarHeight() - getFont()->getHeight()) / 2; switch (getAlignment()) { case Graphics::LEFT: textX = 4; break; case Graphics::CENTER: textX = getWidth() / 2; break; case Graphics::RIGHT: textX = getWidth() - 4; break; default: throw GCN_EXCEPTION("Unknown alignment."); } graphics->setColor(getForegroundColor()); graphics->setFont(getFont()); graphics->drawText(getCaption(), textX, textY, getAlignment()); } void Window::drawBorder(Graphics* graphics) { Color faceColor = getBaseColor(); Color highlightColor, shadowColor; int alpha = getBaseColor().a; int width = getWidth() + getBorderSize() * 2 - 1; int height = getHeight() + getBorderSize() * 2 - 1; highlightColor = faceColor + 0x303030; highlightColor.a = alpha; shadowColor = faceColor - 0x303030; shadowColor.a = alpha; unsigned int i; for (i = 0; i < getBorderSize(); ++i) { graphics->setColor(highlightColor); graphics->drawLine(i,i, width - i, i); graphics->drawLine(i,i + 1, i, height - i - 1); graphics->setColor(shadowColor); graphics->drawLine(width - i,i + 1, width - i, height - i); graphics->drawLine(i,height - i, width - i - 1, height - i); } } void Window::drawContent(Graphics* graphics) { if (getContent() != NULL) { graphics->pushClipArea(getContentDimension()); graphics->pushClipArea(Rectangle(0, 0, getContent()->getWidth(), getContent()->getHeight())); getContent()->draw(graphics); graphics->popClipArea(); graphics->popClipArea(); } } void Window::mousePress(int x, int y, int button) { if (getParent() != NULL) { getParent()->moveToTop(this); } if (isMovable() && hasMouse() && y < (int)(getTitleBarHeight() + getPadding()) && button == 1) { mMouseDrag = true; mMouseXOffset = x; mMouseYOffset = y; } } void Window::mouseRelease(int x, int y, int button) { if (button == 1) { mMouseDrag = false; } } void Window::mouseMotion(int x, int y) { if (mMouseDrag && isMovable()) { setPosition(x - mMouseXOffset + getX(), y - mMouseYOffset + getY()); } } void Window::moveToTop(Widget* widget) { if (widget != getContent()) { throw GCN_EXCEPTION("Widget is not content of window."); } } void Window::moveToBottom(Widget* widget) { if (widget != getContent()) { throw GCN_EXCEPTION("Widget is not content of window"); } } void Window::getDrawSize(int& width, int& height, Widget* widget) { if (widget != getContent()) { throw GCN_EXCEPTION("Widget is not content of window"); } Rectangle d = getContentDimension(); width = d.width; height = d.height; } void Window::repositionContent() { if (getContent() == NULL) { return; } Rectangle d = getContentDimension(); mContent->setPosition(d.x, d.y); } Rectangle Window::getContentDimension() { return Rectangle(getPadding(), getTitleBarHeight(), getWidth() - getPadding() * 2, getHeight() - getPadding() - getTitleBarHeight()); } void Window::setMovable(bool movable) { mMovable = movable; } bool Window::isMovable() const { return mMovable; } void Window::resizeToContent() { if (getContent() != NULL) { setSize(getContent()->getWidth() + 2*getPadding(), getContent()->getHeight() + getPadding() + getTitleBarHeight()); } } void Window::_mouseInputMessage(const MouseInput &mouseInput) { BasicContainer::_mouseInputMessage(mouseInput); if (getContent() != NULL) { if (getContentDimension().isPointInRect(mouseInput.x, mouseInput.y) && getContent()->getDimension().isPointInRect(mouseInput.x, mouseInput.y)) { if (!getContent()->hasMouse()) { getContent()->_mouseInMessage(); } MouseInput mi = mouseInput; mi.x -= getContent()->getX(); mi.y -= getContent()->getY(); getContent()->_mouseInputMessage(mi); } else if (getContent()->hasMouse()) { getContent()->_mouseOutMessage(); } } } void Window::_mouseOutMessage() { BasicContainer::_mouseOutMessage(); if (getContent() != NULL && getContent()->hasMouse()) { getContent()->_mouseOutMessage(); } } void Window::_setFocusHandler(FocusHandler *focusHandler) { if (getContent() != NULL) { getContent()->_setFocusHandler(focusHandler); } BasicContainer::_setFocusHandler(focusHandler); } void Window::setOpaque(bool opaque) { mOpaque = opaque; } bool Window::isOpaque() { return mOpaque; } void Window::logic() { if (getContent() != NULL) { getContent()->logic(); } } }