Files
befpc/begui/begui/libbegui/BeGuiClasses.cpp
memson 434b2f7566 Added quite a bit.
Got basic file handling soeted out. Also got the FilePanel's working (see
example project)

Popup menu now only responds to a right click (at last!!)
2002-04-12 23:32:56 +00:00

1249 lines
25 KiB
C++

/*
$Header: /home/haiku/befpc/begui/begui/libbegui/BeGuiClasses.cpp,v 1.2 2002-04-12 23:32:56 memson Exp $
$Revision: 1.2 $
$Log: not supported by cvs2svn $
Revision 1.1.1.1 2002/03/31 10:36:16 memson
initial import into sourceforge
Revision 1.19 2002/03/26 13:28:51 memson
added in combobox support - flawed at the moment.
Revision 1.18 2002/03/14 22:31:41 memson
Got the Menubar/menu/menuitem and popupmenu/menuitem both working... Had a
bit of a slack night, so didn't really do much else.
Revision 1.17 2002/03/14 00:12:38 memson
Revised the event and property class hierarchies... hopefully makes more
sense.
Started to add in the Menu functionality. PopUpMenu is done and 'tested',
but the BMenuBar/BMenu (mainmenu) stuff is there but untested.
Added in an OnCreate and OnDestroy event to the events, plust a wierd
offshoot class to handle the menuitem click.
Revision 1.6 2002/03/12 23:12:37 memson
hashed out some details - stopped child windows from screwing up app, and
also added the close action to form and terminating functionality to the app.
Revision 1.15 2002/03/12 18:39:16 memson
Revision 1.14 2002/03/11 23:54:06 memson
the form works more happily, also sorted out form canvas issues.
lost hours of work pissing about with pascal - needs quite a bit of revision
to get it happily working with fpc.
Revision 1.13 2002/03/11 23:22:11 memson
Revision 1.12 2002/03/03 11:31:38 memson
began adding a class to hold additional properties (Owner and Tag for now).
Revision 1.11 2002/02/19 17:49:53 memson
Added half arsed support for multiple windows - not working quite right yet,
but at least they seem to 'work' in so much as they don't wipe the app out.
The secondary forms Canvas is screwed up a little.. that is a priority I
guess.
Revision 1.10 2002/02/18 19:28:34 memson
No *major* changes, cleaned things up a lot. Created MEventPlugin and now
use multiple inheritence to implement most of the event pointer storage.
This makes things a lot neater and also ensures that I don't have to write
the same code loads of time (mostly).
Revision 1.9 2002/02/14 23:39:53 memson
I've now added most of the events to the MButton, MCanvas, MMemo and MEdit..
started a MPanel component. Again, the MCanvas is *not* tread safe!!!
This means the calling thread must create it.
NB. Before I add much more functionality, I'm going to look at other GUI
libs to see if there are any controls worth borrowing.
Next control will probably be a MLabel followed by a MMenuBar and MMenuItem.
MForm will own a MMenuBar.
Revision 1.8 2002/02/14 20:33:19 memson
Got the MButton OnClick, OnMouseDown/Up, OnKeyDown/Up and OnMouseMoved
events working. Started to add the required code to the rest of the classes
(should be a cut/paste job).
Revision 1.7 2002/02/14 14:00:16 memson
fiddled a bit.. nothing major.
Revision 1.6 2002/02/13 23:26:25 memson
Got the MMemo working.
Got the MEdit working, including OnClick event signal
Got the MButton working with a signal
Added a few get/set accessor routined for captions/text.
Revision 1.5 2002/02/13 00:02:02 memson
Got the MTextControl basic functionality - annoying fact is that a text
control has to be added inside the thread that will display it!!!!
Revision 1.4 2002/02/12 19:40:59 memson
Removed the Sebder param for the MButton::DoClick()
Revision 1.3 2002/02/11 23:26:44 memson
Revision 1.2 2002/01/17 20:32:54 memson
*/
#define BEGUI_EXPORTS 1
#include "MList.h"
#include "MFile.h"
#include "BeGuiClasses.h"
#include <stdio.h>
#include <storage/Path.h>
//clik - control click
#define ClickMessage 'clik'
#define ChangeMessage 'chng'
#define TEXT_INSET 3.0
////////////////////////////////////////
//
// Classes...
//
////////////////////////////////////////
////////////////////////////////////////
// List classes...
//List item for storing GUI classes...
MGUIListItem::MGUIListItem(BString name, void *item):
MListItem(item)
{
fName = name;
}
BString MGUIListItem::getName(void){
return fName;
}
void MGUIListItem::setName(BString name){
fName = name;
}
// GUI Item store....
MGUIListItem* MGUIList::GetItem(int32 index){
return (MGUIListItem*) GetItem(index);
}
//////////////////////////////////////////
MPropertyPlugin::MPropertyPlugin(BArchivable *AOwner)
{
FOwner = AOwner;
}
MPropertyPlugin::MPropertyPlugin()
{
FOwner = 0;
}
MPropertyPlugin::~MPropertyPlugin()
{
FOwner = 0;
}
void MPropertyPlugin::setTag(uint32 ATag)
{
FTag = ATag;
}
uint32 MPropertyPlugin::getTag(void)
{
return FTag;
}
BArchivable* MPropertyPlugin::getOwner(void)
{
return FOwner;
}
void MPropertyPlugin::setOwner(BArchivable *AOwner)
{
if (AOwner != FOwner){
//change over
}
FOwner = AOwner;
}
//////////////////////////////////////////
// Property Plugin Class...
MMenuPropertyPlugin::MMenuPropertyPlugin(BArchivable *AOwner):
MPropertyPlugin(AOwner)
{
fPopUpMenu = 0;
}
MMenuPropertyPlugin::~MMenuPropertyPlugin()
{
//this control will be owned by a BView..BView
fPopUpMenu = 0;
}
void MMenuPropertyPlugin::setPopUpMenu(MPopUpMenu *menu)
{
fPopUpMenu = menu;
}
MPopUpMenu* MMenuPropertyPlugin::getPopUpMenu(void)
{
return fPopUpMenu;
}
//////////////////////////////////////////
// EventPlugin Class...
MEventPlugin::MEventPlugin()
{
fOnCreate = 0;
fOnDestroy = 0;
}
MEventPlugin::~MEventPlugin()
{
fOnCreate = 0;
fOnDestroy = 0;
}
void MEventPlugin::AttachCreateDispatcher(genericEvent_Message value)
{
fOnCreate = value;
}
void MEventPlugin::AttachDestroyDispatcher(genericEvent_Message value)
{
fOnDestroy = value;
}
void MEventPlugin::DoCreate(BControl *self)
{
if (fOnCreate != NULL){
fOnCreate( self );
}
}
void MEventPlugin::DoDestroy(BControl *self)
{
if (fOnDestroy != NULL){
fOnDestroy( self );
}
}
//////////////////////////////////////////
//
MMenuEventPlugin::MMenuEventPlugin()
{
fOnMenuClick = 0;
}
MMenuEventPlugin::~MMenuEventPlugin()
{
fOnMenuClick = 0;
}
void MMenuEventPlugin::DoMenuClick(MMenuItem *self)
{
if (fOnMenuClick != NULL){
fOnMenuClick( self, ClickMessage );
}
}
void MMenuEventPlugin::AttachMenuClickDispatcher(base_Message value)
{
fOnMenuClick = value;
}
//////////////////////////////////////////
//BasicEventPlugin Class...
MBasicEventPlugin::MBasicEventPlugin():
MEventPlugin()
{
fOnClick = 0;
fOnChange = 0;
}
MBasicEventPlugin::~MBasicEventPlugin()
{
fOnClick = 0;
fOnChange = 0;
}
void MBasicEventPlugin::AttachClickDispatcher(base_Message value)
{
fOnClick = value;
}
void MBasicEventPlugin::AttachChangeDispatcher(base_Message value)
{
fOnChange = value;
}
void MBasicEventPlugin::DoChange(BControl *self)
{
if (fOnChange != NULL){
fOnChange( self, ChangeMessage );
}
}
void MBasicEventPlugin::DoClick(BControl *self)
{
if (fOnClick != NULL){
fOnClick( dynamic_cast<BControl*>(this), ClickMessage );
}
}
//////////////////////////////////////////
//ControlEventPlugin Class...
MControlEventPlugin::MControlEventPlugin():
MBasicEventPlugin()
{
fOnMouseMove = 0;
fOnMouseUp = 0;
fOnMouseDown = 0;
fOnKeyUp = 0;
fOnKeyDown = 0;
fOnDraw = 0;
fOnKeyPress = 0;
}
MControlEventPlugin::~MControlEventPlugin()
{
fOnMouseMove = 0;
fOnMouseUp = 0;
fOnMouseDown = 0;
fOnKeyUp = 0;
fOnKeyDown = 0;
fOnDraw = 0;
fOnKeyPress = 0;
}
void MControlEventPlugin::AttachDrawDispatcher(drawAction_Message value)
{
fOnDraw = value;
}
void MControlEventPlugin::AttachMouseDownDispatcher(mouseAction_Message value)
{
fOnMouseDown = value;
}
void MControlEventPlugin::AttachMouseUpDispatcher(mouseAction_Message value)
{
fOnMouseUp = value;
}
void MControlEventPlugin::AttachMouseMovedDispatcher(mouseMoved_Message value)
{
fOnMouseMove = value;
}
void MControlEventPlugin::AttachKeyDownDispatcher(keyAction_Message value)
{
fOnKeyDown = value;
}
void MControlEventPlugin::AttachKeyUpDispatcher(keyAction_Message value)
{
fOnKeyUp = value;
}
void MControlEventPlugin::AttachKeyPressDispatcher(keyAction_Message value)
{
fOnKeyPress = value;
}
void MControlEventPlugin::DoKeyPress(BControl *self, const char *bytes, int32 numBytes)
{
if (fOnKeyPress != NULL){
fOnKeyPress( self, bytes, numBytes );
}
}
//////////////////////////////////////////
// Form Event Property
MFormEventPlugin::MFormEventPlugin():
MEventPlugin()
{
fOnClose = 0;
}
MFormEventPlugin::~MFormEventPlugin()
{
fOnClose = 0;
}
void MFormEventPlugin::AttachCloseDispatcher(closeAction_Message value)
{
fOnClose = value;
}
void MFormEventPlugin::DoClose(BView *self, MCloseAction &closeAction)
{
if (fOnClose != NULL){
fOnClose( self, closeAction );
}
}
//////////////////////////////////////////
//Panel Class...
MPanel::MPanel(BRect ClientArea, char *name):
MCanvas(ClientArea, name)
{
SetViewColor(200, 200, 200);
}
void MPanel::Draw(BRect updateArea)
{
MCanvas::Draw(updateArea);
}
//////////////////////////////////////////
//Memo Class...
MMemo::MMemo(char *name):
BScrollView(name,
fTextArea = new BTextView(BRect(0, 0, 50, 50),
"TextArea",
BRect(0, 0,
(50 - TEXT_INSET),
(50 - TEXT_INSET)),
B_FOLLOW_ALL,
B_WILL_DRAW),
B_FOLLOW_ALL,
true, true,
B_FANCY_BORDER),
MControlEventPlugin(),
MPropertyPlugin(NULL)
{
fTextArea->SetStylable(true);
}
MMemo::MMemo(BRect frame, char *name):
BScrollView(name,
fTextArea = new BTextView(
BRect(frame.left,
frame.top,
(frame.right - B_V_SCROLL_BAR_WIDTH),
(frame.bottom - B_H_SCROLL_BAR_HEIGHT)),
"TextArea",
BRect(0, 0,
(frame.right - frame.left - TEXT_INSET - B_V_SCROLL_BAR_WIDTH),
(frame.bottom - frame.top - TEXT_INSET - B_H_SCROLL_BAR_HEIGHT)),
B_FOLLOW_ALL,
B_WILL_DRAW),
B_FOLLOW_ALL,
true, true,
B_FANCY_BORDER),
MControlEventPlugin(),
MPropertyPlugin(NULL)
{
fTextArea->SetStylable(true);
}
BTextView* MMemo::getTextView(void)
{
return fTextArea;
}
void MMemo::AttachedToWindow()
{
fTextArea->SetFont(be_bold_font);
fTextArea->SetFontSize(12);
fTextArea->MakeFocus();
}
void MMemo::KeyDown(const char *bytes, int32 numBytes)
{
BScrollView::KeyDown(bytes, numBytes);
if (fOnKeyDown != NULL){
fOnKeyDown( this, bytes, numBytes );
}
}
void MMemo::KeyUp(const char *bytes, int32 numBytes)
{
BScrollView::KeyUp(bytes, numBytes);
if (fOnKeyUp != NULL){
fOnKeyUp( this, bytes, numBytes );
}
DoChange(dynamic_cast<BControl*>(this)); //simulate a 'change' event...
}
void MMemo::MouseDown(BPoint pt)
{
BScrollView::MouseDown(pt);
if (fOnMouseDown != NULL){
fOnMouseDown( this, pt.x, pt.y );
}
}
void MMemo::MouseUp(BPoint pt)
{
BScrollView::MouseUp(pt);
if (fOnMouseUp != NULL){
fOnMouseUp( this, pt.x, pt.y );
}
DoClick(dynamic_cast<BControl*>(this)); //simulate a click event
}
void MMemo::MouseMoved(BPoint pt, uint32 code, const BMessage *msg)
{
BScrollView::MouseMoved(pt, code, msg);
if (fOnMouseMove != NULL){
fOnMouseMove( this, pt.x, pt.y, code, 0 );
}
}
void MMemo::Draw(BRect updateArea)
{
BScrollView::Draw(updateArea);
if (fOnDraw != NULL){
fOnDraw( this, updateArea.left, updateArea.top, updateArea.right, updateArea.bottom );
}
}
//////////////////////////////////////////
// MComboBox
MCheckBox::MCheckBox(BRect frame, char *name):
BCheckBox(frame, name, name, new BMessage(ClickMessage)),
MControlEventPlugin(),
MPropertyPlugin(NULL)
{
DoCreate(dynamic_cast<BControl*>(this));
}
MCheckBox::~MCheckBox()
{
DoDestroy(dynamic_cast<BControl*>(this));
}
void MCheckBox::KeyDown(const char *bytes, int32 numBytes)
{
BControl::KeyDown(bytes, numBytes);
if (fOnKeyDown != NULL){
fOnKeyDown( this, bytes, numBytes );
}
}
void MCheckBox::KeyUp(const char *bytes, int32 numBytes)
{
BControl::KeyUp(bytes, numBytes);
if (fOnKeyUp != NULL){
fOnKeyUp( this, bytes, numBytes );
}
DoChange(dynamic_cast<BControl*>(this)); //simulate a 'change' event...
}
void MCheckBox::MouseDown(BPoint pt)
{
BControl::MouseDown(pt);
if (fOnMouseDown != NULL){
fOnMouseDown( this, pt.x, pt.y );
}
}
void MCheckBox::MouseUp(BPoint pt)
{
BControl::MouseUp(pt);
if (fOnMouseUp != NULL){
fOnMouseUp( this, pt.x, pt.y );
}
DoClick(dynamic_cast<BControl*>(this)); //simulate a click event
}
void MCheckBox::MouseMoved(BPoint pt, uint32 code, const BMessage *msg)
{
BControl::MouseMoved(pt, code, msg);
if (fOnMouseMove != NULL){
fOnMouseMove( this, pt.x, pt.y, code, 0 );
}
}
void MCheckBox::Draw(BRect updateArea)
{
BControl::Draw(updateArea);
if (fOnDraw != NULL){
fOnDraw( this, updateArea.left, updateArea.top, updateArea.right, updateArea.bottom );
}
}
bool MCheckBox::Checked(void)
{
if (this->Value() == B_CONTROL_ON)
return true;
else
return false;
}
//////////////////////////////////////////
//Edit Class...
MEdit::MEdit(char *name):
BTextControl(BRect(0, 0, 25, 50), name, NULL, "", new BMessage(ChangeMessage)),
MControlEventPlugin(),
MPropertyPlugin(NULL)
{
DoCreate( dynamic_cast<BControl*>(this) );
}
MEdit::MEdit(BRect frame, char *name):
BTextControl(frame, name, NULL, "", new BMessage(ChangeMessage)),
MControlEventPlugin(),
MPropertyPlugin(NULL)
{
DoCreate( dynamic_cast<BControl*>(this) );
}
MEdit::~MEdit()
{
DoDestroy( dynamic_cast<BControl*>(this) );
}
void MEdit::KeyDown(const char *bytes, int32 numBytes)
{
BTextControl::KeyDown(bytes, numBytes);
if (fOnKeyDown != NULL){
fOnKeyDown( this, bytes, numBytes );
}
}
void MEdit::KeyUp(const char *bytes, int32 numBytes)
{
BTextControl::KeyUp(bytes, numBytes);
if (fOnKeyUp != NULL){
fOnKeyUp( this, bytes, numBytes );
}
}
void MEdit::MouseDown(BPoint pt)
{
BTextControl::MouseDown(pt);
if (fOnMouseDown != NULL){
fOnMouseDown( this, pt.x, pt.y );
}
}
void MEdit::MouseUp(BPoint pt)
{
BTextControl::MouseUp(pt);
if (fOnMouseUp != NULL){
fOnMouseUp( this, pt.x, pt.y );
}
DoClick(this); //simulate click event
}
void MEdit::MouseMoved(BPoint pt, uint32 code, const BMessage *msg)
{
BTextControl::MouseMoved(pt, code, msg);
if (fOnMouseMove != NULL){
fOnMouseMove( this, pt.x, pt.y, code, 0 );
}
}
void MEdit::Draw(BRect updateArea)
{
BTextControl::Draw(updateArea);
if (fOnDraw != NULL){
fOnDraw( this, updateArea.left, updateArea.top, updateArea.right, updateArea.bottom );
}
}
//////////////////////////////////////////
//Button Class...
MButton::MButton(char *name):
BButton(BRect(0, 0, 25, 50), name, name, new BMessage(ClickMessage)),
MControlEventPlugin(),
MPropertyPlugin(NULL)
{
DoCreate(dynamic_cast<BControl*>(this));
}
MButton::MButton(BRect frame, char *name):
BButton(frame, name, name, new BMessage(ClickMessage)),
MControlEventPlugin(),
MPropertyPlugin(NULL)
{
DoCreate(dynamic_cast<BControl*>(this));
}
MButton::~MButton()
{
DoDestroy(dynamic_cast<BControl*>(this));
}
void MButton::KeyDown(const char *bytes, int32 numBytes)
{
BButton::KeyDown(bytes, numBytes);
if (fOnKeyDown != NULL){
fOnKeyDown( this, bytes, numBytes );
}
}
void MButton::KeyUp(const char *bytes, int32 numBytes)
{
BButton::KeyUp(bytes, numBytes);
if (fOnKeyUp != NULL){
fOnKeyUp( this, bytes, numBytes );
}
}
void MButton::MouseDown(BPoint pt)
{
BButton::MouseDown(pt);
if (fOnMouseDown != NULL){
fOnMouseDown( this, pt.x, pt.y );
}
}
void MButton::MouseUp(BPoint pt)
{
BButton::MouseUp(pt);
if (fOnMouseUp != NULL){
fOnMouseUp( this, pt.x, pt.y );
}
}
void MButton::MouseMoved(BPoint pt, uint32 code, const BMessage *msg)
{
BButton::MouseMoved(pt, code, msg);
if (fOnMouseMove != NULL){
fOnMouseMove( this, pt.x, pt.y, code, 0 );
}
}
void MButton::Draw(BRect updateArea)
{
BButton::Draw(updateArea);
if (fOnDraw != NULL){
fOnDraw( this, updateArea.left, updateArea.top, updateArea.right, updateArea.bottom );
}
}
//////////////////////////////////////////
//Application Class...
MApplication::MApplication(const char* signature):
BApplication(signature),
MEventPlugin()
{
BRect tmpRect;
tmpRect.Set(50, 50, 1000, 500);
BString formname = "main";
fMainForm = new MForm(tmpRect);
//fMainForm->Show();
fForms = new MGUIList();
fForms->AddItem(new MGUIListItem(formname, fMainForm));
fTerminating = false; //controls the act of shutting down
DoCreate( dynamic_cast<BControl*>(this) );
}
MApplication::~MApplication()
{
DoDestroy( dynamic_cast<BControl*>(this) );
}
thread_id MApplication::Run(void)
{
if (fMainForm != NULL) fMainForm->Show();
return BApplication::Run();
}
void MApplication::RefsReceived(BMessage *message)
{
if (message->what == SAVE_PANEL_MESSAGE){
printf("\nSave\n");
}
}
void MApplication::MessageReceived(BMessage *message)
{
void *pointer;
MFilePanel *filepanel;
entry_ref ref;
const char *name;
BPath path;
BEntry entry;
status_t err = B_OK;
if (message->what == SAVE_PANEL_MESSAGE || message->what == OPEN_PANEL_MESSAGE){
printf("\nSave\n");
if ( (err = message->FindRef("directory", &ref)) != B_OK ) {
printf("failed to find dir, error %d\n", err);
return;
}
if ( (err = message->FindString("name", &name)) != B_OK ){
printf("failed to find filename, error %d\n", err);
return;
}
if ( (err = entry.SetTo(&ref)) != B_OK ){
printf("failed to create entr from path, error %d\n", err);
return;
}
entry.GetPath(&path);
path.Append(name);
printf( "%s\n", path.Path() );
if (message->FindPointer("source", &pointer) == B_OK){
printf("works1\n");
if ((filepanel = reinterpret_cast<MFilePanel*>(pointer)) != NULL){
printf("works2\n");
filepanel->DoExecute( path );
}
}
}
}
void MApplication::Terminate(void)
{
//if main form is dead, we must not call this because...
if (!fTerminating)
{
//...fTerminating is set by fMainForm as it exits.
fMainForm->QuitRequested();
}
}
MForm* MApplication::AddForm(BRect ClientArea, BString name, bool showForm = false)
{
MForm *form = new MForm(ClientArea);
fForms->AddItem(new MGUIListItem(name, form));
form->Lock();
form->Run();
if (showForm) form->Show();
form->Unlock();
return form;
}
////////////////////////////////////////
//Form Class...
MForm::MForm(BRect ClientArea):
BWindow(ClientArea, "Form", B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS),
MFormEventPlugin()
{
fClientArea = Bounds();
fClientArea.OffsetTo(B_ORIGIN); //reset position
fCanvas = new MCanvas(fClientArea, "Canvas");
AddChild(fCanvas);
fCloseAction = caHide;
DoCreate(dynamic_cast<BControl*>(this));
}
MForm::~MForm()
{
DoDestroy(dynamic_cast<BControl*>(this));
}
void MForm::MessageReceived(BMessage *message){
void *pointer;
BControl *control;
MButton *btn;
MMenuItem *mni;
MEdit *edt;
if (message->FindPointer("source", &pointer) == B_OK)
{
if ((control = reinterpret_cast<BControl*>(pointer)) != NULL)
{
if ((btn = dynamic_cast<MButton*>(control)) != NULL){
btn->DoClick(btn);
}
else if ((edt = dynamic_cast<MEdit*>(control)) != NULL){
edt->DoChange(edt); //this is a funny event!!
}
else if ((mni = dynamic_cast<MMenuItem*>(control)) != NULL){
mni->DoMenuClick(mni);
}
}
else
{
BWindow::MessageReceived(message);
}
}
else
{
BWindow::MessageReceived(message);
}
}
bool MForm::QuitRequested()
{
MForm *frm;
//handle the close event
DoClose(dynamic_cast<BControl*>(this), fCloseAction);
if (dynamic_cast<MApplication*>(be_app) != NULL)
{
//when terminating, just exit
if ( dynamic_cast<MApplication*>(be_app)->Terminating() )
{
return(true);
}
//main form
frm = dynamic_cast<MApplication*>(be_app)->GetMainForm();
if (frm == this)
{
printf("killing app");
frm->Lock();
be_app->PostMessage(B_QUIT_REQUESTED);
frm->Unlock();
dynamic_cast<MApplication*>(be_app)->setTerminating( true );
}
//sub forms
else
{
//add 'canclose' here
switch (fCloseAction) {
case caNone:
//ignore the action
return(false);
case caHide:
//hide self
this->Lock(); //must lock window before calling hide
this->Hide();
this->Unlock(); //must remember to unlock
return(false);
case caFree:
//do default.. just remove window
return(true);
default:
return(true);
}
}
}
else
{
be_app->PostMessage(B_QUIT_REQUESTED);
}
return(true);
}
void MForm::UpdateBounds(void)
{
//fClientArea = this->Bounds();
}
void MForm::setWidth(float w)
{
float h = fClientArea.Height();
fClientArea.Set(fClientArea.left, fClientArea.top, fClientArea.left + w, fClientArea.top + h);
this->ResizeTo(w, h);
//UpdateBounds();
}
void MForm::setHeight(float h)
{
float w = fClientArea.Width();
fClientArea.Set(fClientArea.left, fClientArea.top, fClientArea.left + w, fClientArea.top + h);
this->ResizeTo(w, h);
//UpdateBounds();
}
float MForm::getWidth(void)
{
return fClientArea.Width();
}
float MForm::getHeight(void)
{
return fClientArea.Height();
}
float MForm::getLeft(void)
{
return fClientArea.left;
}
float MForm::getTop(void)
{
return fClientArea.top;
}
float MForm::getBottom(void)
{
return fClientArea.bottom;
}
float MForm::getRight(void)
{
return fClientArea.right;
}
MCanvas* MForm::Canvas(void)
{
return fCanvas;
}
MCloseAction MForm::getCloseAction(void)
{
return fCloseAction;
}
void MForm::setCloseAction(MCloseAction ca)
{
fCloseAction = ca;
}
////////////////////////////////////////
//Canvas class...
MCanvas::MCanvas(BRect ClientArea, char *name):
BView(ClientArea, name, B_FOLLOW_ALL, 0),
MControlEventPlugin(),
MMenuPropertyPlugin(NULL)
{
SetViewColor(150, 150, 150);
DoCreate(dynamic_cast<BControl*>(this));
}
MCanvas::~MCanvas()
{
DoDestroy(dynamic_cast<BControl*>(this));
}
void MCanvas::AttachedToWindow()
{
}
MEdit* MCanvas::AddEdit(BRect ClientArea, char *name)
{
MEdit* tmp = new MEdit(ClientArea, name);
AddChild(tmp);
return tmp;
}
MMemo* MCanvas::AddMemo(BRect ClientArea, char *name)
{
MMemo* tmp = new MMemo(ClientArea, name);
AddChild(tmp);
return tmp;
}
MPanel* MCanvas::AddPanel(BRect ClientArea, char *name)
{
MPanel* tmp = new MPanel(ClientArea, name);
AddChild(tmp);
return tmp;
}
MCheckBox* MCanvas::AddCheckBox(BRect ClientArea, char *name)
{
MCheckBox* tmp = new MCheckBox(ClientArea, name);
AddChild(tmp);
return tmp;
}
void MCanvas::KeyDown(const char *bytes, int32 numBytes)
{
BView::KeyDown(bytes, numBytes);
if (fOnKeyDown != NULL){
fOnKeyDown( this, bytes, numBytes );
}
}
void MCanvas::KeyUp(const char *bytes, int32 numBytes)
{
BView::KeyUp(bytes, numBytes);
if (fOnKeyUp != NULL){
fOnKeyUp( this, bytes, numBytes );
}
}
void MCanvas::MouseDown(BPoint pt)
{
BPoint point;
int32 buttons = 0;
BView::MouseDown(pt);
if (fOnMouseDown != NULL){
fOnMouseDown( this, pt.x, pt.y );
}
Looper()->CurrentMessage()->FindInt32("buttons", &buttons);
if (buttons == B_SECONDARY_MOUSE_BUTTON) {
if (fPopUpMenu != NULL){
point = pt;
ConvertToScreen(&point);
BMenuItem *mni = fPopUpMenu->Go(point, true);
if (mni){
MMenuItem *mmni = dynamic_cast<MMenuItem*>(mni);
if(mmni){
mmni->DoMenuClick(mmni);
}
}
}
}
}
void MCanvas::MouseUp(BPoint pt)
{
BView::MouseUp(pt);
if (fOnMouseUp != NULL){
fOnMouseUp( this, pt.x, pt.y );
}
DoClick(dynamic_cast<BControl*>(this)); //simulate a 'click'
}
void MCanvas::MouseMoved(BPoint pt, uint32 code, const BMessage *msg)
{
BView::MouseMoved(pt, code, msg);
if (fOnMouseMove != NULL){
fOnMouseMove( this, pt.x, pt.y, code, 0 );
}
}
void MCanvas::Draw(BRect updateArea)
{
BView::Draw(updateArea);
if (fOnDraw != NULL){
fOnDraw( this, updateArea.left, updateArea.top, updateArea.right, updateArea.bottom );
}
}
/////////////////////////////////////////
//MenuItem Class...
MMenuItem::MMenuItem(const char *label):
BMenuItem(label, new BMessage(ClickMessage)),
MMenuEventPlugin(){}
MMenuItem::~MMenuItem(){}
/////////////////////////////////////////
//PopUpMenu Class...
MPopUpMenu::MPopUpMenu(const char *name):
BPopUpMenu(name, false, false)
{
//MMenuItem *mnu = new MMenuItem("test");
//AddItem(mnu);
}
/////////////////////////////////////////
//Test the Library
CTest::CTest(void){
FValue = 33;
}
//GetTest
int CTest::GetValue(void){
return FValue;
}
//SetTest
void CTest::SetValue(int NewVal){
FValue = NewVal;
}