WinDecorator: Make it compile, use tabs

but stub out the missing pieces for now.

At this point selecting it crashes app server spectacularly.
This commit is contained in:
John Scipione 2013-07-19 19:08:32 -04:00
parent 45b17fde13
commit 196fc0d6ae
2 changed files with 308 additions and 194 deletions

View File

@ -13,6 +13,7 @@
#include <stdio.h>
#include <Point.h>
#include <Rect.h>
#include <View.h>
#include "DesktopSettings.h"
@ -33,22 +34,19 @@ WinDecorAddOn::WinDecorAddOn(image_id id, const char* name)
:
DecorAddOn(id, name)
{
}
Decorator*
WinDecorAddOn::_AllocateDecorator(DesktopSettings& settings, BRect rect,
window_look look, uint32 flags)
WinDecorAddOn::_AllocateDecorator(DesktopSettings& settings, BRect rect)
{
return new (std::nothrow)WinDecorator(settings, rect, look, flags);
return new (std::nothrow)WinDecorator(settings, rect);
}
WinDecorator::WinDecorator(DesktopSettings& settings, BRect rect,
window_look look, uint32 flags)
WinDecorator::WinDecorator(DesktopSettings& settings, BRect rect)
:
Decorator(settings, rect, look, flags)
Decorator(settings, rect)
{
_UpdateFont(settings);
@ -64,14 +62,16 @@ WinDecorator::WinDecorator(DesktopSettings& settings, BRect rect,
fNonFocusTabColor = settings.UIColor(B_WINDOW_INACTIVE_TAB_COLOR);
fNonFocusTextColor = settings.UIColor(B_WINDOW_INACTIVE_TEXT_COLOR);
fTabList.AddItem(_AllocateNewTab());
// Set appropriate colors based on the current focus value. In this case,
// each decorator defaults to not having the focus.
_SetFocus();
_SetFocus(_TabAt(0));
// Do initial decorator setup
_DoLayout();
textoffset=5;
textoffset = 5;
STRACE(("WinDecorator()\n"));
}
@ -86,15 +86,22 @@ WinDecorator::~WinDecorator()
// TODO : Add GetSettings
/*! \brief Updates the decorator in the rectangular area \a updateRect.
The default version updates all areas which intersect the frame and tab.
\param updateRect The rectangular area to update.
*/
void
WinDecorator::Draw(BRect update)
WinDecorator::Draw(BRect updateRect)
{
STRACE(("WinDecorator::Draw(): ")); update.PrintToStream();
STRACE(("WinDecorator::Draw(BRect updateRect): "));
updateRect.PrintToStream();
fDrawingEngine->SetDrawState(&fDrawState);
_DrawFrame(update);
_DrawTab(update);
_DrawFrame(updateRect & fFrame);
_DrawTabs(updateRect & fTitleBarRect);
}
@ -104,8 +111,8 @@ WinDecorator::Draw()
STRACE(("WinDecorator::Draw()\n"));
fDrawingEngine->SetDrawState(&fDrawState);
_DrawFrame(fBorderRect);
_DrawTab(fTabRect);
_DrawFrame(fFrame);
_DrawTabs(fTitleBarRect);
}
@ -113,25 +120,25 @@ WinDecorator::Draw()
Decorator::Region
WinDecorator::RegionAt(BPoint where) const
WinDecorator::RegionAt(BPoint where, int32& tab) const
{
// Let the base class version identify hits of the buttons and the tab.
Region region = Decorator::RegionAt(where);
Region region = Decorator::RegionAt(where, tab);
if (region != REGION_NONE)
return region;
// check the resize corner
if (fLook == B_DOCUMENT_WINDOW_LOOK && fResizeRect.Contains(where))
if (fTopTab->look == B_DOCUMENT_WINDOW_LOOK && fResizeRect.Contains(where))
return REGION_RIGHT_BOTTOM_CORNER;
// hit-test the borders
if (!(fFlags & B_NOT_RESIZABLE)
&& (fLook == B_TITLED_WINDOW_LOOK
|| fLook == B_FLOATING_WINDOW_LOOK
|| fLook == B_MODAL_WINDOW_LOOK)
if (!(fTopTab->flags & B_NOT_RESIZABLE)
&& (fTopTab->look == B_TITLED_WINDOW_LOOK
|| fTopTab->look == B_FLOATING_WINDOW_LOOK
|| fTopTab->look == B_MODAL_WINDOW_LOOK)
&& fBorderRect.Contains(where) && !fFrame.Contains(where)) {
return REGION_BOTTOM_BORDER;
// TODO: Determine the actual border!
// TODO Determine the actual border!
}
return REGION_NONE;
@ -145,10 +152,8 @@ WinDecorator::_DoLayout()
bool hasTab = false;
fBorderRect=fFrame;
fTabRect=fFrame;
switch (Look()) {
fBorderRect = fFrame;
switch ((int)fTopTab->look) {
case B_MODAL_WINDOW_LOOK:
fBorderRect.InsetBy(-4, -4);
break;
@ -173,33 +178,61 @@ WinDecorator::_DoLayout()
if (hasTab) {
fBorderRect.top -= 19;
fTabRect.top -= 19;
fTabRect.bottom=fTabRect.top+19;
for (int32 i = 0; i < fTabList.CountItems(); i++) {
Decorator::Tab* tab = fTabList.ItemAt(i);
fZoomRect=fTabRect;
fZoomRect.top+=3;
fZoomRect.right-=3;
fZoomRect.bottom-=3;
fZoomRect.left=fZoomRect.right-15;
tab->tabRect.top -= 19;
tab->tabRect.bottom = tab->tabRect.top + 19;
fCloseRect=fZoomRect;
fZoomRect.OffsetBy(0-fZoomRect.Width()-3,0);
tab->zoomRect = tab->tabRect;
tab->zoomRect.top += 3;
tab->zoomRect.right -= 3;
tab->zoomRect.bottom -= 3;
tab->zoomRect.left = tab->zoomRect.right - 15;
fMinimizeRect=fZoomRect;
fMinimizeRect.OffsetBy(0-fZoomRect.Width()-1,0);
tab->closeRect = tab->zoomRect;
tab->zoomRect.OffsetBy(0 - tab->zoomRect.Width() - 3, 0);
tab->minimizeRect = tab->zoomRect;
tab->minimizeRect.OffsetBy(0 - tab->zoomRect.Width() - 1, 0);
}
} else {
fTabRect.Set(0.0, 0.0, -1.0, -1.0);
fCloseRect.Set(0.0, 0.0, -1.0, -1.0);
fZoomRect.Set(0.0, 0.0, -1.0, -1.0);
fMinimizeRect.Set(0.0, 0.0, -1.0, -1.0);
for (int32 i = 0; i < fTabList.CountItems(); i++) {
Decorator::Tab* tab = fTabList.ItemAt(i);
tab->tabRect.Set(0.0, 0.0, -1.0, -1.0);
tab->closeRect.Set(0.0, 0.0, -1.0, -1.0);
tab->zoomRect.Set(0.0, 0.0, -1.0, -1.0);
tab->minimizeRect.Set(0.0, 0.0, -1.0, -1.0);
}
}
}
Decorator::Tab*
WinDecorator::_AllocateNewTab()
{
Decorator::Tab* tab = new(std::nothrow) WinDecorator::Tab;
if (tab == NULL)
return NULL;
// Set appropriate colors based on the current focus value. In this case,
// each decorator defaults to not having the focus.
_SetFocus(tab);
return tab;
}
WinDecorator::Tab*
WinDecorator::_TabAt(int32 index) const
{
// TODO stub
return static_cast<WinDecorator::Tab*>(fTabList.ItemAt(index));
}
void
WinDecorator::_DrawFrame(BRect rect)
{
if (fLook == B_NO_BORDER_WINDOW_LOOK)
if (fTopTab->look == B_NO_BORDER_WINDOW_LOOK)
return;
if (fBorderRect == fFrame)
@ -210,158 +243,167 @@ WinDecorator::_DrawFrame(BRect rect)
fDrawingEngine->SetHighColor(frame_lowercol);
fDrawingEngine->StrokeRect(r);
if (fLook == B_BORDERED_WINDOW_LOOK)
if (fTopTab->look == B_BORDERED_WINDOW_LOOK)
return;
BPoint pt;
pt=r.RightTop();
pt = r.RightTop();
pt.x--;
fDrawingEngine->StrokeLine(r.LeftTop(),pt,frame_midcol);
pt=r.LeftBottom();
fDrawingEngine->StrokeLine(r.LeftTop(), pt, frame_midcol);
pt = r.LeftBottom();
pt.y--;
fDrawingEngine->StrokeLine(r.LeftTop(),pt,frame_midcol);
fDrawingEngine->StrokeLine(r.LeftTop(), pt, frame_midcol);
fDrawingEngine->StrokeLine(r.RightTop(),r.RightBottom(),frame_lowercol);
fDrawingEngine->StrokeLine(r.LeftBottom(),r.RightBottom(),frame_lowercol);
fDrawingEngine->StrokeLine(r.RightTop(), r.RightBottom(), frame_lowercol);
fDrawingEngine->StrokeLine(r.LeftBottom(), r.RightBottom(), frame_lowercol);
r.InsetBy(1,1);
pt=r.RightTop();
pt = r.RightTop();
pt.x--;
fDrawingEngine->StrokeLine(r.LeftTop(),pt,frame_highcol);
pt=r.LeftBottom();
pt = r.LeftBottom();
pt.y--;
fDrawingEngine->StrokeLine(r.LeftTop(),pt,frame_highcol);
fDrawingEngine->StrokeLine(r.RightTop(),r.RightBottom(),frame_lowcol);
fDrawingEngine->StrokeLine(r.LeftBottom(),r.RightBottom(),frame_lowcol);
fDrawingEngine->StrokeLine(r.RightTop(), r.RightBottom(), frame_lowcol);
fDrawingEngine->StrokeLine(r.LeftBottom(), r.RightBottom(), frame_lowcol);
r.InsetBy(1,1);
fDrawingEngine->StrokeRect(r,frame_midcol);
r.InsetBy(1,1);
fDrawingEngine->StrokeRect(r,frame_midcol);
r.InsetBy(1, 1);
fDrawingEngine->StrokeRect(r, frame_midcol);
r.InsetBy(1, 1);
fDrawingEngine->StrokeRect(r, frame_midcol);
}
void
WinDecorator::_DrawTab(BRect invalid)
WinDecorator::_DrawTab(Decorator::Tab* tab, BRect rect)
{
// If a window has a tab, this will draw it and any buttons which are
// in it.
if (!fTabRect.IsValid() || !invalid.Intersects(fTabRect) || fLook==B_NO_BORDER_WINDOW_LOOK)
const BRect& tabRect = tab->tabRect;
// If a window has a tab, this will draw it and any buttons in it.
if (!tabRect.IsValid() || !rect.Intersects(tabRect)
|| fTopTab->look == B_NO_BORDER_WINDOW_LOOK) {
return;
}
fDrawingEngine->FillRect(fTabRect,tab_highcol);
fDrawingEngine->FillRect(tabRect, tab_highcol);
_DrawTitle(fTabRect);
_DrawTitle(tab, tabRect);
// Draw the buttons if we're supposed to
// TODO : we should still draw the buttons if they are disabled, but grey them out
if (!(fFlags & B_NOT_CLOSABLE) && invalid.Intersects(fCloseRect))
_DrawClose(fCloseRect);
if (!(fFlags & B_NOT_ZOOMABLE) && invalid.Intersects(fZoomRect))
_DrawZoom(fZoomRect);
DrawButtons(tab, rect);
}
void
WinDecorator::_DrawClose(BRect r)
WinDecorator::_DrawTitle(Decorator::Tab* tab, BRect rect)
{
// Just like DrawZoom, but for a close button
_DrawBeveledRect(r,GetClose());
const BRect& tabRect = tab->tabRect;
const BRect& closeRect = tab->closeRect;
const BRect& zoomRect = tab->zoomRect;
// Draw the X
BRect rect(r);
rect.InsetBy(4,4);
rect.right--;
rect.top--;
if (GetClose())
rect.OffsetBy(1,1);
fDrawingEngine->SetHighColor(RGBColor(0,0,0));
fDrawingEngine->StrokeLine(rect.LeftTop(),rect.RightBottom());
fDrawingEngine->StrokeLine(rect.RightTop(),rect.LeftBottom());
rect.OffsetBy(1,0);
fDrawingEngine->StrokeLine(rect.LeftTop(),rect.RightBottom());
fDrawingEngine->StrokeLine(rect.RightTop(),rect.LeftBottom());
}
void
WinDecorator::_DrawTitle(BRect r)
{
//fDrawingEngine->SetDrawingMode(B_OP_OVER);
fDrawingEngine->SetHighColor(textcol);
fDrawingEngine->SetLowColor(IsFocus()?fFocusTabColor:fNonFocusTabColor);
fDrawingEngine->SetLowColor(IsFocus(_TabAt(0))
? fFocusTabColor : fNonFocusTabColor);
fTruncatedTitle = Title();
fTruncatedTitle = Title(_TabAt(0));
fDrawState.Font().TruncateString(&fTruncatedTitle, B_TRUNCATE_END,
((fZoomRect.IsValid() ? fZoomRect.left :
fCloseRect.IsValid() ? fCloseRect.left : fTabRect.right) - 5)
- (fTabRect.left + textoffset));
((zoomRect.IsValid() ? zoomRect.left :
closeRect.IsValid() ? closeRect.left : tabRect.right) - 5)
- (tabRect.left + textoffset));
fTruncatedTitleLength = fTruncatedTitle.Length();
fDrawingEngine->SetFont(fDrawState.Font());
fDrawingEngine->DrawString(fTruncatedTitle,fTruncatedTitleLength,
BPoint(fTabRect.left+textoffset,fCloseRect.bottom-1));
fDrawingEngine->DrawString(fTruncatedTitle, fTruncatedTitleLength,
BPoint(tabRect.left + textoffset,closeRect.bottom - 1));
//fDrawingEngine->SetDrawingMode(B_OP_COPY);
}
void
WinDecorator::_DrawZoom(BRect r)
WinDecorator::_DrawClose(Decorator::Tab* tab, bool direct, BRect rect)
{
_DrawBeveledRect(r,GetZoom());
STRACE(("_DrawClose(%f, %f, %f, %f)\n", rect.left, rect.top, rect.right,
rect.bottom));
// Just like DrawZoom, but for a close button
_DrawBeveledRect(rect, true);
// Draw the X
BRect closeBox(rect);
closeBox.InsetBy(4, 4);
closeBox.right--;
closeBox.top--;
if (true)
closeBox.OffsetBy(1, 1);
fDrawingEngine->SetHighColor(RGBColor(0, 0, 0));
fDrawingEngine->StrokeLine(closeBox.LeftTop(), closeBox.RightBottom());
fDrawingEngine->StrokeLine(closeBox.RightTop(), closeBox.LeftBottom());
closeBox.OffsetBy(1, 0);
fDrawingEngine->StrokeLine(closeBox.LeftTop(), closeBox.RightBottom());
fDrawingEngine->StrokeLine(closeBox.RightTop(), closeBox.LeftBottom());
}
void
WinDecorator::_DrawZoom(Decorator::Tab* tab, bool direct, BRect rect)
{
_DrawBeveledRect(rect, true);
// Draw the Zoom box
BRect rect(r);
rect.InsetBy(2,2);
rect.InsetBy(1,0);
rect.bottom--;
rect.right--;
BRect zoomBox(rect);
zoomBox.InsetBy(2, 2);
zoomBox.InsetBy(1, 0);
zoomBox.bottom--;
zoomBox.right--;
if (GetZoom())
rect.OffsetBy(1,1);
if (true)
zoomBox.OffsetBy(1, 1);
fDrawingEngine->SetHighColor(RGBColor(0,0,0));
fDrawingEngine->StrokeRect(rect);
rect.InsetBy(1,1);
fDrawingEngine->StrokeLine(rect.LeftTop(),rect.RightTop());
fDrawingEngine->StrokeRect(zoomBox);
zoomBox.InsetBy(1, 1);
fDrawingEngine->StrokeLine(zoomBox.LeftTop(), zoomBox.RightTop());
}
void
WinDecorator::_DrawMinimize(BRect r)
WinDecorator::_DrawMinimize(Decorator::Tab* tab, bool direct, BRect rect)
{
// Just like DrawZoom, but for a Minimize button
_DrawBeveledRect(r,GetMinimize());
_DrawBeveledRect(rect, true);
fDrawingEngine->SetHighColor(textcol);
BRect rect(r.left+5,r.bottom-4,r.right-5,r.bottom-3);
if(GetMinimize())
rect.OffsetBy(1,1);
BRect minimizeBox(rect.left + 5, rect.bottom - 4, rect.right - 5,
rect.bottom - 3);
if (true)
minimizeBox.OffsetBy(1, 1);
fDrawingEngine->SetHighColor(RGBColor(0,0,0));
fDrawingEngine->StrokeRect(rect);
fDrawingEngine->SetHighColor(RGBColor(0, 0, 0));
fDrawingEngine->StrokeRect(minimizeBox);
}
void
WinDecorator::_SetTitle(const char* string, BRegion* updateRegion)
WinDecorator::_SetTitle(Decorator::Tab* tab, const char* string,
BRegion* updateRegion)
{
// TODO: we could be much smarter about the update region
// TODO we could be much smarter about the update region
BRect rect = TabRect();
BRect rect = TabRect(tab);
if (updateRegion == NULL)
return;
BRect updatedRect = TabRect();
BRect updatedRect = TabRect(tab);
if (rect.left > updatedRect.left)
rect.left = updatedRect.left;
if (rect.right < updatedRect.right)
@ -392,13 +434,13 @@ void
WinDecorator::_SetLook(DesktopSettings& settings, window_look look,
BRegion* updateRegion)
{
// TODO: we could be much smarter about the update region
// TODO we could be much smarter about the update region
// get previous extent
if (updateRegion != NULL)
updateRegion->Include(&GetFootprint());
fLook = look;
fTopTab->look = look;
_UpdateFont(settings);
_DoLayout();
@ -412,7 +454,7 @@ WinDecorator::_SetLook(DesktopSettings& settings, window_look look,
void
WinDecorator::_SetFlags(uint32 flags, BRegion* updateRegion)
{
// TODO: we could be much smarter about the update region
// TODO we could be much smarter about the update region
// get previous extent
if (updateRegion != NULL)
@ -427,35 +469,43 @@ WinDecorator::_SetFlags(uint32 flags, BRegion* updateRegion)
void
WinDecorator::_SetFocus(void)
WinDecorator::_SetFocus(Decorator::Tab* tab)
{
// TODO stub
// SetFocus() performs necessary duties for color swapping and
// other things when a window is deactivated or activated.
if (IsFocus()) {
// tab_highcol.SetColor(100,100,255);
// tab_lowcol.SetColor(40,0,255);
tab_highcol=fFocusTabColor;
textcol=fFocusTextColor;
if (IsFocus(_TabAt(0))) {
// tab_highcol.SetColor(100, 100, 255);
// tab_lowcol.SetColor(40, 0, 255);
tab_highcol = fFocusTabColor;
textcol = fFocusTextColor;
} else {
// tab_highcol.SetColor(220,220,220);
// tab_lowcol.SetColor(128,128,128);
tab_highcol=fNonFocusTabColor;
textcol=fNonFocusTextColor;
// tab_highcol.SetColor(220, 220, 220);
// tab_lowcol.SetColor(128, 128, 128);
tab_highcol = fNonFocusTabColor;
textcol = fNonFocusTextColor;
}
}
void
WinDecorator::_MoveBy(BPoint pt)
WinDecorator::_MoveBy(BPoint offset)
{
// Move all internal rectangles the appropriate amount
fFrame.OffsetBy(pt);
fCloseRect.OffsetBy(pt);
fTabRect.OffsetBy(pt);
fBorderRect.OffsetBy(pt);
fZoomRect.OffsetBy(pt);
fMinimizeRect.OffsetBy(pt);
// Move all tab rectangles over
for (int32 i = 0; i < fTabList.CountItems(); i++) {
Decorator::Tab* tab = fTabList.ItemAt(i);
tab->zoomRect.OffsetBy(offset);
tab->closeRect.OffsetBy(offset);
tab->minimizeRect.OffsetBy(offset);
tab->tabRect.OffsetBy(offset);
}
// Move all internal rectangles over
fFrame.OffsetBy(offset);
fBorderRect.OffsetBy(offset);
}
@ -465,17 +515,21 @@ WinDecorator::_ResizeBy(BPoint offset, BRegion* dirty)
// Move all internal rectangles the appropriate amount
fFrame.right += offset.x;
fFrame.bottom += offset.y;
fTabRect.right += offset.x;
fBorderRect.right += offset.x;
fBorderRect.bottom += offset.y;
// fZoomRect.OffsetBy(offset.x, 0);
// fMinimizeRect.OffsetBy(offset.x, 0);
if (dirty) {
dirty->Include(fTabRect);
dirty->Include(fBorderRect);
}
for (int32 i = 0; i < fTabList.CountItems(); i++) {
Decorator::Tab* tab = fTabList.ItemAt(i);
tab->tabRect.right += offset.x;
if (dirty != NULL)
dirty->Include(tab->tabRect);
//tab->zoomRect.right += offset.x;
//tab->closeRect.right += offset.x;
//tab->minimizeRect.right += offset.x;
}
if (dirty != NULL)
dirty->Include(fBorderRect);
// TODO probably some other layouting stuff here
_DoLayout();
@ -485,31 +539,72 @@ WinDecorator::_ResizeBy(BPoint offset, BRegion* dirty)
// TODO : _SetSettings
bool
WinDecorator::_AddTab(DesktopSettings& settings, int32 index,
BRegion* updateRegion)
{
// TODO stub
return false;
}
bool
WinDecorator::_RemoveTab(int32 index, BRegion* updateRegion)
{
// TODO stub
return false;
}
bool
WinDecorator::_MoveTab(int32 from, int32 to, bool isMoving,
BRegion* updateRegion)
{
// TODO stub
return false;
}
void
WinDecorator::_GetFootprint(BRegion* region)
{
// This function calculates the decorator's footprint in coordinates
// relative to the view. This is most often used to set a Window
// object's visible region.
if (!region)
if (region == NULL)
return;
region->MakeEmpty();
if (fLook == B_NO_BORDER_WINDOW_LOOK)
if (fTopTab->look == B_NO_BORDER_WINDOW_LOOK)
return;
region->Set(fBorderRect);
region->Include(fTabRect);
for (int32 i = 0; i < fTabList.CountItems(); i++) {
Decorator::Tab* tab = fTabList.ItemAt(i);
region->Include(tab->tabRect);
}
region->Exclude(fFrame);
}
void
WinDecorator::DrawButtons(Decorator::Tab* tab, const BRect& invalid)
{
if (!(tab->flags & B_NOT_MINIMIZABLE) && invalid.Intersects(tab->minimizeRect))
_DrawMinimize(tab, false, tab->minimizeRect);
if (!(tab->flags & B_NOT_ZOOMABLE) && invalid.Intersects(tab->zoomRect))
_DrawZoom(tab, false, tab->zoomRect);
if (!(tab->flags & B_NOT_CLOSABLE) && invalid.Intersects(tab->closeRect))
_DrawClose(tab, false, tab->closeRect);
}
void
WinDecorator::_UpdateFont(DesktopSettings& settings)
{
ServerFont font;
if (fLook == B_FLOATING_WINDOW_LOOK)
if (fTopTab->look == B_FLOATING_WINDOW_LOOK)
settings.GetDefaultPlainFont(font);
else
settings.GetDefaultBoldFont(font);
@ -544,42 +639,42 @@ WinDecorator::_DrawBeveledRect(BRect r, bool down)
}
BRect rect(r);
BPoint pt;
BPoint point;
// Top highlight
fDrawingEngine->SetHighColor(higher);
fDrawingEngine->StrokeLine(rect.LeftTop(),rect.RightTop());
fDrawingEngine->StrokeLine(rect.LeftTop(), rect.RightTop());
// Left highlight
fDrawingEngine->StrokeLine(rect.LeftTop(),rect.LeftBottom());
fDrawingEngine->StrokeLine(rect.LeftTop(), rect.LeftBottom());
// Right shading
pt=rect.RightTop();
pt.y++;
fDrawingEngine->StrokeLine(pt,rect.RightBottom(),lower);
point = rect.RightTop();
point.y++;
fDrawingEngine->StrokeLine(point, rect.RightBottom(), lower);
// Bottom shading
pt=rect.LeftBottom();
pt.x++;
fDrawingEngine->StrokeLine(pt,rect.RightBottom(),lower);
point = rect.LeftBottom();
point.x++;
fDrawingEngine->StrokeLine(point, rect.RightBottom(), lower);
rect.InsetBy(1,1);
// Top inside highlight
fDrawingEngine->StrokeLine(rect.LeftTop(),rect.RightTop());
fDrawingEngine->StrokeLine(rect.LeftTop(), rect.RightTop());
// Left inside highlight
fDrawingEngine->StrokeLine(rect.LeftTop(),rect.LeftBottom());
fDrawingEngine->StrokeLine(rect.LeftTop(), rect.LeftBottom());
// Right inside shading
pt=rect.RightTop();
pt.y++;
fDrawingEngine->StrokeLine(pt,rect.RightBottom(),lower);
point = rect.RightTop();
point.y++;
fDrawingEngine->StrokeLine(point, rect.RightBottom(), lower);
// Bottom inside shading
pt=rect.LeftBottom();
pt.x++;
fDrawingEngine->StrokeLine(pt,rect.RightBottom(),lower);
point = rect.LeftBottom();
point.x++;
fDrawingEngine->StrokeLine(point, rect.RightBottom(), lower);
rect.InsetBy(1,1);

View File

@ -6,46 +6,57 @@
#define _WINDOWS_DECORATOR_H_
#include "Decorator.h"
#include "DecorManager.h"
#include "RGBColor.h"
struct rgb_color;
class BRect;
class WinDecorAddOn : public DecorAddOn {
public:
WinDecorAddOn(image_id id, const char* name);
protected:
virtual Decorator* _AllocateDecorator(DesktopSettings& settings,
BRect rect, window_look look, uint32 flags);
BRect rect);
};
class WinDecorator: public Decorator {
public:
WinDecorator(DesktopSettings& settings,
BRect frame, window_look wlook,
uint32 wflags);
WinDecorator(DesktopSettings& settings, BRect frame);
~WinDecorator(void);
void Draw(BRect r);
void Draw();
virtual void Draw(BRect updateRect);
virtual void Draw();
virtual Region RegionAt(BPoint where) const;
virtual Region RegionAt(BPoint where, int32& tab) const;
protected:
virtual void DrawButtons(Decorator::Tab* tab,
const BRect& invalid);
void _DoLayout();
void _DrawFrame(BRect r);
void _DrawTab(BRect r);
virtual Decorator::Tab* _AllocateNewTab();
WinDecorator::Tab* _TabAt(int32 index) const;
void _DrawClose(BRect r);
void _DrawTitle(BRect r);
void _DrawZoom(BRect r);
void _DrawMinimize(BRect r);
virtual void _DrawFrame(BRect rect);
virtual void _DrawTab(Decorator::Tab* tab, BRect rect);
virtual void _DrawTitle(Decorator::Tab* tab, BRect rect);
void _SetTitle(const char* string,
BRegion* updateRegion = NULL);
virtual void _DrawMinimize(Decorator::Tab* tab, bool direct,
BRect rect);
virtual void _DrawZoom(Decorator::Tab* tab, bool direct,
BRect rect);
virtual void _DrawClose(Decorator::Tab* tab, bool direct,
BRect rect);
virtual void _SetTitle(Decorator::Tab* tab, const char* string,
BRegion* updateRegion = NULL);
void _FontsChanged(DesktopSettings& settings,
BRegion* updateRegion);
@ -55,11 +66,19 @@ protected:
void _SetFlags(uint32 flags,
BRegion* updateRegion = NULL);
void _MoveBy(BPoint pt);
void _ResizeBy(BPoint pt, BRegion* dirty);
void _MoveBy(BPoint offset);
void _ResizeBy(BPoint offset, BRegion* dirty);
virtual bool _AddTab(DesktopSettings& settings,
int32 index = -1,
BRegion* updateRegion = NULL);
virtual bool _RemoveTab(int32 index,
BRegion* updateRegion = NULL);
virtual bool _MoveTab(int32 from, int32 to, bool isMoving,
BRegion* updateRegion = NULL);
void _GetFootprint(BRegion *region);
void _SetFocus(void);
virtual void _SetFocus(Decorator::Tab* tab);
private:
void _UpdateFont(DesktopSettings& settings);