home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
ool.zip
/
OOL
/
source
/
xuserbtn.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1997-04-05
|
8KB
|
342 lines
#include "xuserbtn.h"
#include "xdefhdl.h"
#include "xmoushdl.h"
#include "xmousevn.h"
#include "xbitmap.h"
#include "XLine.h"
#include "xbox.h"
#include "xfont.h"
class userbtnhandler:public XDefaultHandler
{
public:
userbtnhandler(XWindow * w):XDefaultHandler(w) {;}
BOOL HandleEvent(ULONG, void *, void *);
};
class userbtnmousehandler:public XMouseHandler
{
public:
userbtnmousehandler(XWindow * w):XMouseHandler(w) {;}
BOOL HandleEvent(XMouseEvent *);
};
/*@
@class XUserButton
@parent XSettingButton
@type overview
@symbol _
*/
/*@ XUserButton::XUserButton( const XWindow * w, const XRect * r, const LONG id, const LONG st, const char * t, const SHORT yOff)
@group constructors/destructors
@remarks Constructs a userbuttom
@parameters <t '°' c=2>
°XWindow * owner °the owner
°XRect * rect °the rectangle
°USHORT id °id of the window
°ULONG style °style, valid values are:
<t '°' c=1>
°BU_HELP
°BU_DEFAULT
°BU_NOPOINTERFOCUS
°BU_NOCURSORSELECT
°BU_NOBORDER
°BU_TWOSTATE
</t>
(can be or-ed).
°const char * string °text to display (default is NULL)
°SHORT yOffset °an y-offset for the bitmap (useful if you use bimaps and text, default is NULL)
</t>
*/
XUserButton :: XUserButton(const XWindow * w, const XRect * r, const LONG id, const LONG st, const char *t, const SHORT yOff):XSettingButton(w, r, id, st | BS_PUSHBUTTON | BS_USERBUTTON, (const char *) "", (unsigned char *) WC_BUTTON)
{
graph = NULL;
bmp[0] = bmp[1] = NULL;
isPressed = 0;
style = st;
graph = new XGraphicDevice(this);
XColor colPaleGray(COL_PALEGRAY);
graph->SetBackgroundColor(&colPaleGray);
bmp[0] = new XBitmap(graph);
bmp[1] = new XBitmap(graph);
XPoint p1(1, 2), p2(1, 0), p3, p4(1, 2), pa(0, 0), pb;
p2.SetY(r->GetHeight() - 1);
p3.SetY(p2.GetY());
p3.SetX(r->GetWidth() - 1);
p4.SetX(p3.GetX());
pb.SetX(r->GetWidth());
pb.SetY(r->GetHeight());
XColor colWhite(COL_WHITE);
XColor colGray(COL_DARKGRAY);
line1 = new XLine(graph, &p1, &p2);
line1->SetColor(&colWhite);
line2 = new XLine(graph, &p2, &p3);
line2->SetLineWidth(LINEWIDTH_THICK);
line2->SetColor(&colWhite);
line3 = new XLine(graph, &p3, &p4);
line3->SetLineWidth(LINEWIDTH_THICK);
line3->SetColor(&colGray);
line4 = new XLine(graph, &p4, &p1);
line4->SetLineWidth(LINEWIDTH_THICK);
line4->SetColor(&colGray);
XBox *box = new XBox(graph, &pa, &pb, FALSE);
XFont *font = new XFont(graph, "Helvetica", 9);
XRect rect;
GetSize(&rect);
rect.SetX(2);
rect.SetY(2);
rect.SetWidth(rect.GetWidth() - 2);
rect.SetHeight(rect.GetHeight() - 2);
text = new XText(graph, font, &rect, t, DT_BOTTOM | DT_CENTER);
if (style & BU_TWOSTATE)
userbtnmousehandler *m = new userbtnmousehandler(this);
else
userbtnhandler * u = new userbtnhandler(this);
}
void XUserButton::GetText(XString * buffer)
{
text->GetText(buffer);
}
void XUserButton::SetText(const char *t)
{
text->SetText(t);
}
XUserButton :: ~XUserButton()
{
WinSetWindowULong(winhandle, QWL_USER, 0);
delete graph;
}
void XUserButton::Draw(void)
{
if (graph)
graph->Draw();
}
/*@ XUserButton :: IsSelected( void )
@group misc
@remarks Query if the button is selected or not
@returns BOOL selection
*/
BOOL XUserButton::IsSelected(void) const
{
if (!(style & BU_TWOSTATE))
return XSettingButton::IsSelected();
else
return isPressed;
}
/*@ XUserButton::Toggle(void)
@group misc
@remarks Toggles the button
*/
void XUserButton::Toggle(void)
{
if (!(style & BU_TWOSTATE))
{
BOOL res = (XSettingButton::IsSelected() ? FALSE : TRUE);
XSettingButton::Select(res);
}
else
{
isPressed = (isPressed ? FALSE : TRUE);
Invalidate();
}
}
/*@ XUserButton :: Select( BOOL sel )
@group misc
@remarks Select te button
@parameters BOOL selection TRUE=select, FALSE=unselect
*/
void XUserButton::Select(BOOL sel)
{
if (!(style & BU_TWOSTATE))
XSettingButton::Select(sel);
else
{
isPressed = sel;
Invalidate();
}
}
/*@ XUserButton::GetBitmapPointer()
@group style
@remarks Returns a pointer to one of two used bitmaps.
@parameters <t '°' c=2>
°UCHAR index °index of the bitmap:<BR>
0 = the bitmap to display if the button is not pressed<BR>
1 = the bitmap to display if the button is pressed
</t>
@returns XBitmap * bmp the requested bitmap
*/
/*@ XUserButton::GetGraphPointer()
@group style
@remarks Returns a pointer to the graphic-device of the button.
@returns XGraphicDevice * dev the graphic device
*/
/*@ XUserButton::GetTextPointer()
@group style
@remarks Returns a pointer to used text-object of the button.
@returns XText * text the text object
*/
/*@ XUserButton::SetBitmap()
@group style
@remarks Set a bitmap to the button. The bitmap is copied so the destructor of the bitmap given in
the argument can be called when this functions returns.
@parameters <t '°' c=2>
°XBitmap * bmp °the bitmap
°UCHAR index °index of the bitmap:<BR>
0 = the bitmap to display if the button is not pressed<BR>
1 = the bitmap to display if the button is pressed
/t>
*/
void XUserButton::SetBitmap(const XBitmap * b, const UCHAR index)
{
if (index > 1)
return;
*bmp[index] = *b;
XPoint p(1, 1);
bmp[index]->Move(&p);
if (index == 1)
{
bmp[1]->Show(FALSE);
bmp[0]->Show(TRUE);
}
Invalidate();
}
void XUserButton::Setup(void)
{
XColor colWhite(COL_WHITE);
XColor colGray(COL_DARKGRAY);
if (isPressed)
{
XPoint p;
text->GetPos(&p);
p.SetX(p.GetX() + 1);
p.SetY(p.GetY() - 1);
text->Move(&p);
if (bmp[1]->cx == 0)
{
bmp[0]->GetPos(&p);
p.SetX(p.GetX() + 1);
p.SetY(p.GetY() - 1);
bmp[0]->Move(&p);
}
else
{
bmp[0]->Show(FALSE);
bmp[1]->Show();
}
line1->SetColor(&colGray);
line2->SetColor(&colGray);
line3->SetColor(&colWhite);
line4->SetColor(&colWhite);
}
else
{
XPoint p;
text->GetPos(&p);
p.SetX(p.GetX() - 1);
p.SetY(p.GetY() + 1);
text->Move(&p);
if (bmp[1]->cx == 0)
{
bmp[0]->GetPos(&p);
p.SetX(p.GetX() - 1);
p.SetY(p.GetY() + 1);
bmp[0]->Move(&p);
}
else
{
bmp[0]->Show();
bmp[1]->Show(FALSE);
}
line1->SetColor(&colWhite);
line2->SetColor(&colWhite);
line3->SetColor(&colGray);
line4->SetColor(&colGray);
}
Invalidate();
}
BOOL userbtnhandler::HandleEvent(ULONG msg, void *mp1, void *)
{
if (msg == BM_SETHILITE)
{
XUserButton *b = (XUserButton *) GetWindow();
b->isPressed = SHORT1FROMMP(mp1);
b->Setup();
b->Invalidate();
return TRUE;
}
return FALSE;
}
BOOL userbtnmousehandler::HandleEvent(XMouseEvent * event)
{
if (event->GetEventID() == MOU_BTN1UP)
{
XUserButton *b = (XUserButton *) GetWindow();
b->isPressed = (b->buffer ? FALSE : TRUE);
if (b->isPressed != b->buffer)
b->Setup();
}
else if (event->GetEventID() == MOU_BTN1DOWN)
{
XUserButton *b = (XUserButton *) GetWindow();
b->buffer = b->isPressed;
b->isPressed = (b->buffer ? TRUE : FALSE);
if (b->isPressed != b->buffer)
b->Setup();
}
return FALSE;
}