* Copyright 2005, Waldemar Kornewald <wkornew@gmx.net>
* Distributed under the terms of the MIT License.
*/
#include "PPPDeskbarReplicant.h"
#include "PPPUpApplication.h"
#include "PPPStatusWindow.h"
#include <PPPInterface.h>
#include <Deskbar.h>
#include <MenuItem.h>
#include <Message.h>
#include <PopUpMenu.h>
static const uint32 kMsgDisconnect = 'DISC';
static const uint32 kMsgStatus = 'STAT';
static const char *kLabelDisconnect = "Disconnect";
static const char *kLabelStatus = "Status";
PPPDeskbarReplicant::PPPDeskbarReplicant(ppp_interface_id id)
: BView(BRect(0, 0, 15, 15), "PPPDeskbarReplicant", B_FOLLOW_NONE, 0),
fID(id)
{
Init();
}
PPPDeskbarReplicant::PPPDeskbarReplicant(BMessage *message)
: BView(BRect(0, 0, 15, 15), "PPPDeskbarReplicant", B_FOLLOW_NONE, 0)
{
message->FindInt32("interface", reinterpret_cast<int32*>(&fID));
Init();
}
PPPDeskbarReplicant::~PPPDeskbarReplicant()
{
delete fContextMenu;
fWindow->LockLooper();
fWindow->Quit();
}
PPPDeskbarReplicant*
PPPDeskbarReplicant::Instantiate(BMessage *data)
{
if(!validate_instantiation(data, "PPPDeskbarReplicant"))
return NULL;
return new PPPDeskbarReplicant(data);
}
status_t
PPPDeskbarReplicant::Archive(BMessage *data, bool deep) const
{
BView::Archive(data, deep);
data->AddString("add_on", APP_SIGNATURE);
data->AddInt32("interface", fID);
return B_NO_ERROR;
}
void
PPPDeskbarReplicant::AttachedToWindow()
{
BMenuItem *item = new BMenuItem(kLabelDisconnect, new BMessage(kMsgDisconnect));
item->SetTarget(fWindow->StatusView());
fContextMenu->AddItem(item);
fContextMenu->AddSeparatorItem();
item = new BMenuItem(kLabelStatus, new BMessage(kMsgStatus));
item->SetTarget(this);
fContextMenu->AddItem(item);
}
void
PPPDeskbarReplicant::MessageReceived(BMessage *message)
{
switch(message->what) {
case PPP_REPORT_MESSAGE: {
int32 type;
message->FindInt32("type", &type);
if(type == PPP_DESTRUCTION_REPORT)
BDeskbar().RemoveItem(Name());
} break;
case kMsgStatus:
fWindow->Show();
break;
default:
BView::MessageReceived(message);
}
}
void
PPPDeskbarReplicant::MouseDown(BPoint point)
{
Looper()->CurrentMessage()->FindInt32("buttons", &fLastButtons);
if(fLastButtons & B_SECONDARY_MOUSE_BUTTON) {
ConvertToScreen(&point);
fContextMenu->Go(point, true, true, true);
}
}
void
PPPDeskbarReplicant::MouseUp(BPoint point)
{
if(fLastButtons & B_PRIMARY_MOUSE_BUTTON) {
fWindow->Show();
}
}
void
PPPDeskbarReplicant::Draw(BRect updateRect)
{
MovePenTo(4, 12);
DrawString("P");
}
void
PPPDeskbarReplicant::Init()
{
BString name("PPPDeskbarReplicant");
name << fID;
SetName(name.String());
BRect rect(50,50,380,150);
fWindow = new PPPStatusWindow(rect, fID);
fContextMenu = new BPopUpMenu("PPPContextMenu", false);
PPPInterface interface(fID);
if(interface.InitCheck() != B_OK)
return;
}