Files
haiku-beta6/src/servers/app/proto5/BeDecorator.cpp
T
ejakowatz 52a3801208 It is accomplished ...
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@10 a95241bf-73f2-0310-859d-f6bbb57e9c96
2002-07-09 12:24:59 +00:00

360 lines
6.3 KiB
C++

#include "Layer.h"
#include "DisplayDriver.h"
#include <View.h>
#include "BeDecorator.h"
#define DEBUG_DECOR
#ifdef DEBUG_DECOR
#include <stdio.h>
#endif
BeDecorator::BeDecorator(Layer *lay, uint32 dflags, window_look wlook)
: Decorator(lay, dflags, wlook)
{
#ifdef DEBUG_DECOR
printf("BeDecorator()\n");
#endif
zoomstate=false;
closestate=false;
taboffset=0;
blue.red=100;
blue.green=100;
blue.blue=255;
blue2.red=150;
blue2.green=150;
blue2.blue=255;
black.red=0;
black.green=0;
black.blue=0;
gray.red=224;
gray.green=224;
gray.blue=224;
white.red=224;
white.green=224;
white.blue=224;
yellow.red=255;
yellow.green=203;
yellow.blue=0;
ltyellow.red=255;
ltyellow.green=236;
ltyellow.blue=33;
mdyellow.red=255;
mdyellow.green=203;
mdyellow.blue=0;
dkyellow.red=234;
dkyellow.green=181;
dkyellow.blue=0;
Resize(lay->frame);
}
BeDecorator::~BeDecorator(void)
{
#ifdef DEBUG_DECOR
printf("~BeDecorator()\n");
#endif
}
click_type BeDecorator::Clicked(BPoint pt, uint32 buttons)
{
// the case order is important - we go from smallest to largest
if(closerect.Contains(pt))
{
#ifdef DEBUG_DECOR
printf("BeDecorator():Clicked() - Close\n");
#endif
return CLICK_CLOSE;
}
if(zoomrect.Contains(pt))
{
#ifdef DEBUG_DECOR
printf("BeDecorator():Clicked() - Zoom\n");
#endif
return CLICK_ZOOM;
}
if(resizerect.Contains(pt))
{
#ifdef DEBUG_DECOR
printf("BeDecorator():Clicked() - Resize thumb\n");
#endif
return CLICK_RESIZE_RB;
}
// Clicking in the tab?
if(tabrect.Contains(pt))
{
// Here's part of our window management stuff
if(buttons==B_PRIMARY_MOUSE_BUTTON && !focused)
return CLICK_MOVETOFRONT;
if(buttons==B_SECONDARY_MOUSE_BUTTON)
return CLICK_MOVETOBACK;
return CLICK_TAB;
}
// We got this far, so user is clicking on the border?
BRect borderrect(frame);
borderrect.top+=19;
BRect clientrect(borderrect.InsetByCopy(2,2));
if(borderrect.Contains(pt) && !clientrect.Contains(pt))
{
#ifdef DEBUG_DECOR
printf("BeDecorator():Clicked() - Drag\n");
#endif
return CLICK_DRAG;
}
// Guess user didn't click anything
#ifdef DEBUG_DECOR
printf("BeDecorator():Clicked()\n");
#endif
return CLICK_NONE;
}
void BeDecorator::Resize(BRect rect)
{
#ifdef DEBUG_DECOR
printf("BeDecorator()::Resize()"); rect.PrintToStream();
#endif
frame=rect;
closerect=frame;
tabrect=frame;
resizerect=frame;
borderrect=frame;
closerect.left+=2;
closerect.top+=2;
closerect.right=closerect.left+10;
closerect.bottom=closerect.top+10;
borderrect.top+=19;
resizerect.top=resizerect.bottom-18;
resizerect.left=resizerect.right-18;
tabrect.bottom=tabrect.top+18;
tabrect.right=tabrect.left+tabrect.Width()/2;
zoomrect=tabrect;
zoomrect.top+=2;
zoomrect.right-=2;
zoomrect.bottom-=2;
zoomrect.left=zoomrect.right-10;
zoomrect.bottom=zoomrect.top+10;
}
void BeDecorator::MoveBy(BPoint pt)
{
frame.OffsetBy(pt);
closerect.OffsetBy(pt);
tabrect.OffsetBy(pt);
resizerect.OffsetBy(pt);
borderrect.OffsetBy(pt);
zoomrect.OffsetBy(pt);
}
BRect BeDecorator::GetBorderSize(void)
{
return bsize;
}
BPoint BeDecorator::GetMinimumSize(void)
{
return minsize;
}
void BeDecorator::SetFlags(uint32 dflags)
{
flags=dflags;
}
void BeDecorator::UpdateFont(void)
{
}
void BeDecorator::UpdateTitle(const char *string)
{
}
void BeDecorator::SetFocus(bool bfocused)
{
focused=bfocused;
}
void BeDecorator::SetCloseButton(bool down)
{
closestate=down;
}
void BeDecorator::SetZoomButton(bool down)
{
zoomstate=down;
}
void BeDecorator::Draw(BRect update)
{
#ifdef DEBUG_DECOR
printf("BeDecorator()::Draw():"); update.PrintToStream();
#endif
// We need to draw a few things: the tab, the resize thumb, the borders,
// and the buttons
DrawTab();
// Draw the top view's client area - just a hack :)
driver->FillRect(borderrect,blue);
DrawFrame();
}
void BeDecorator::DrawZoom(BRect r)
{
BPoint pt1(r.left+2,r.bottom-2);
BPoint pt2(r.left+(r.Width()/2),r.top+2);
BPoint pt3(r.right-2,r.bottom-2);
if(zoomstate)
{
driver->FillRect(r,ltyellow);
driver->FillRect(r,(uint8*)&B_SOLID_LOW);
driver->FillTriangle(pt1,pt2,pt3,r,(uint8*)&B_SOLID_HIGH);
driver->StrokeLine(pt1,pt2,white);
driver->StrokeRect(r,black);
}
else
{
driver->FillRect(r,ltyellow);
driver->FillRect(r,(uint8*)&B_SOLID_HIGH);
driver->FillTriangle(pt1,pt2,pt3,r,(uint8*)&B_SOLID_LOW);
driver->StrokeLine(pt1,pt2,white);
driver->StrokeRect(r,black);
}
}
void BeDecorator::DrawClose(BRect r)
{
float w=r.Width()/2, h=r.Height()/2;
if(closestate)
{
BPoint pt1(r.LeftTop());
BPoint pt2(r.left+w,r.top);
BPoint pt3(r.left,r.top+h);
driver->FillTriangle(pt1,pt2,pt3,r,(uint8*)&B_SOLID_HIGH);
pt1.Set(r.right-w,r.bottom);
pt2.Set(r.right,r.bottom-h);
pt3.Set(r.right,r.bottom);
driver->FillTriangle(pt1,pt2,pt3,r,(uint8*)&B_SOLID_LOW);
driver->StrokeRect(r,black);
}
else
{
driver->FillRect(r,mdyellow);
BPoint pt1(r.LeftTop());
BPoint pt2(r.left+w,r.top);
BPoint pt3(r.left,r.top+h);
driver->FillTriangle(pt1,pt2,pt3,r,(uint8*)&B_SOLID_LOW);
pt1.Set(r.right-w,r.bottom);
pt2.Set(r.right,r.bottom-h);
pt3.Set(r.right,r.bottom);
driver->FillTriangle(pt1,pt2,pt3,r,(uint8*)&B_SOLID_HIGH);
driver->StrokeRect(r,black);
}
}
void BeDecorator::Draw(void)
{
// Easy way to draw everything - no worries about drawing only certain
// things
DrawTab();
// Draw the top view's client area - just a hack :)
driver->FillRect(borderrect,blue);
DrawFrame();
}
void BeDecorator::DrawTab(void)
{
if(focused)
driver->FillRect(tabrect,yellow);
else
driver->FillRect(tabrect,gray);
driver->StrokeRect(tabrect,black);
}
void BeDecorator::DrawFrame(void)
{
driver->StrokeRect(borderrect,black);
// Draw the resize thumb if we're supposed to
if(!(flags & B_NOT_RESIZABLE))
{
driver->FillRect(resizerect,gray);
driver->StrokeRect(resizerect,black);
}
// Draw the buttons if we're supposed to
if(!(flags & B_NOT_CLOSABLE))
DrawClose(closerect);
if(!(flags & B_NOT_ZOOMABLE))
DrawZoom(zoomrect);
}
void BeDecorator::SetLook(window_look wlook)
{
look=wlook;
}
void BeDecorator::CalculateBorders(void)
{
switch(look)
{
case B_NO_BORDER_WINDOW_LOOK:
{
bsize.Set(0,0,0,0);
break;
}
case B_TITLED_WINDOW_LOOK:
case B_DOCUMENT_WINDOW_LOOK:
case B_BORDERED_WINDOW_LOOK:
{
bsize.top=18;
break;
}
case B_MODAL_WINDOW_LOOK:
case B_FLOATING_WINDOW_LOOK:
{
bsize.top=15;
break;
}
default:
{
break;
}
}
}