diff --git a/application/Caya.rdef b/application/Caya.rdef index 17a59e2..da39790 100644 --- a/application/Caya.rdef +++ b/application/Caya.rdef @@ -13,7 +13,7 @@ resource app_version { internal = 0, short_info = "Caya", - long_info = "©2009-2011 Andrea Anzani, Pier Luigi Fiorini" + long_info = "©2009-2012 Andrea Anzani, Pier Luigi Fiorini, Dario Casalinuovo" }; resource app_flags B_SINGLE_LAUNCH; @@ -115,7 +115,7 @@ resource(kSearchIcon) #'VICN' array { */ // Connecting Green -resource(kConnectingReplicant) #'VICN' array { +resource(kOnlineReplicant) #'VICN' array { $"6E636966070501040156020106023DB0753A5ED7B9F9EE3D18204A5B813F873F" $"C376A70251C9FF89020106023DE0000000000000003D40004A200049A0005376" $"A702CBC9FF89020106023F5C743B37D1BAB2F23ED1AC471CEC4937F8BF77A703" @@ -264,6 +264,24 @@ resource(kExitMenuReplicant) #'VICN' array { $"00003FBBBB40CC7F4022220A05020203100117842004" }; +// Replicant message received + +resource(kReplicantMessageReceived) #'VICN' array { + $"6E636966050500020106033D835C3C19B2BA8B0B3C20794769624A510E00FFCE" + $"CEB4FF0404FFC10505020106023D835C3C19B2BA8B0B3C20794769624A510E00" + $"FF0404FFC10505020106033D429E3C5148BB5ADA3C5C1B4A23AA46EC1800AAE4" + $"F3B40392B6FF03627A05FF0502093F404644383C273F2E3A244122482245224D" + $"2755245126572256245725582A5828592C5A315C2F5B345D3C5E385E425E4957" + $"475C4D4E02043F4044433D3FBC95BE953B3D333D3D493844424E4A5148534A4A" + $"04032E264DB84FC80CB673C6C93258385902085645C8FEC3AFCA30C0E55E3A5E" + $"405EBA4D5227592B4A2237263E21BA16B6DF33353130363E4A4641444D475346" + $"C657C27B554BCB01C635584F5A4F04032E36353F3DBD0FBD2D44404C42090A00" + $"01001001178400040A010100000A020101000A0401021001178210040A040102" + $"123FFD6238491FB8085D3F8C5843A1A3BE897201178210040A00010310011784" + $"00040A030103000A0401041001178210040A040104123FC0CBB65EEB3639DA3F" + $"FF4C40FECDC3C0A80117821004" +}; + // Person icon resource(kPersonIcon) #'VICN' array { diff --git a/application/CayaConstants.h b/application/CayaConstants.h index 37bc918..83d389c 100644 --- a/application/CayaConstants.h +++ b/application/CayaConstants.h @@ -30,9 +30,9 @@ const rgb_color CAYA_SELEND_COLOR = {230, 113, 9}; enum CayaStatus { CAYA_ONLINE = 1, CAYA_AWAY = 2, - CAYA_EXTENDED_AWAY = 3, - CAYA_DO_NOT_DISTURB = 4, - CAYA_OFFLINE = 5, + CAYA_DO_NOT_DISTURB = 3, + CAYA_OFFLINE = 4, + CAYA_EXTENDED_AWAY = 5, CAYA_STATUSES = 6 }; diff --git a/application/CayaResources.h b/application/CayaResources.h index 87b48d2..98b5946 100644 --- a/application/CayaResources.h +++ b/application/CayaResources.h @@ -16,12 +16,13 @@ enum { kProtocolSettingsTemplate = 1000, - kConnectingReplicant = 1200, + kOnlineReplicant = 1200, kCayaIconReplicant = 1220, kOfflineReplicant = 1300, kBusyReplicant = 1333, kAwayReplicant = 1400, kExitMenuReplicant = 1401, + kReplicantMessageReceived = 1402, kPersonIcon = 1500 }; diff --git a/application/CayaUtils.cpp b/application/CayaUtils.cpp index 8e1a818..a8a8350 100644 --- a/application/CayaUtils.cpp +++ b/application/CayaUtils.cpp @@ -29,7 +29,7 @@ CayaStatusToString(CayaStatus status) case CAYA_AWAY: return "Away"; case CAYA_EXTENDED_AWAY: - return "Extended Away"; + return "Custom Status"; case CAYA_DO_NOT_DISTURB: return "Busy"; default: diff --git a/application/ChatWindow.cpp b/application/ChatWindow.cpp index 85dc6b0..cfc0bf7 100644 --- a/application/ChatWindow.cpp +++ b/application/ChatWindow.cpp @@ -36,7 +36,7 @@ ChatWindow::ChatWindow(ContactLinker* cl) : BWindow(BRect(200, 200, 500, 500), - cl->GetName().String(), B_DOCUMENT_WINDOW, 0), + cl->GetName().String(), B_TITLED_WINDOW, 0), fContactLinker(cl) { fReceiveView = new CayaRenderView("fReceiveView"); @@ -53,7 +53,9 @@ ChatWindow::ChatWindow(ContactLinker* cl) fPersonalMessage = new BTextView("personalMessage", B_WILL_DRAW); - fPersonalMessage->SetExplicitAlignment(BAlignment(B_ALIGN_LEFT, B_ALIGN_MIDDLE)); + fPersonalMessage->SetExplicitAlignment( + BAlignment(B_ALIGN_LEFT, B_ALIGN_MIDDLE)); + fPersonalMessage->SetText(fContactLinker->GetNotifyPersonalStatus()); fPersonalMessage->SetExplicitMaxSize(BSize(400, 200)); fPersonalMessage->MakeEditable(false); @@ -83,8 +85,8 @@ ChatWindow::ChatWindow(ContactLinker* cl) .Add(fAvatar) .End() .Add(scrollViewReceive, 2) - .Add(scrollViewSend) - .Add(fStatus, 3) + .Add(scrollViewSend, 3) + .Add(fStatus, 4) .SetInsets(5, 5, 5, 5) ); diff --git a/application/ChatWindow.h b/application/ChatWindow.h index a15e940..ec84c0f 100644 --- a/application/ChatWindow.h +++ b/application/ChatWindow.h @@ -16,7 +16,7 @@ class BitmapView; class ContactLinker; class CayaRenderView; -class ChatWindow: public BWindow, public Observer { +class ChatWindow : public BWindow, public Observer { public: ChatWindow(ContactLinker* cl); diff --git a/application/ContactLinker.cpp b/application/ContactLinker.cpp index 10f7735..5e584c6 100644 --- a/application/ContactLinker.cpp +++ b/application/ContactLinker.cpp @@ -7,12 +7,15 @@ * Andrea Anzani, andrea.anzani@gmail.com * Dario Casalinuovo */ +#include "ContactLinker.h" #include +#include "CayaUtils.h" +#include "CayaPreferences.h" #include "CayaProtocolAddOn.h" +#include "CayaResources.h" #include "ChatWindow.h" -#include "ContactLinker.h" #include "ContactPopUp.h" #include "NotifyMessage.h" #include "ProtocolLooper.h" @@ -20,10 +23,6 @@ #include "RosterItem.h" #include "WindowsManager.h" -#include "CayaUtils.h" -#include "CayaResources.h" -#include "CayaPreferences.h" - #include diff --git a/application/Jamfile b/application/Jamfile index ea320a8..6c1365b 100644 --- a/application/Jamfile +++ b/application/Jamfile @@ -49,6 +49,7 @@ Application Caya : # views ContactPopUp.cpp + SearchBarTextControl.cpp NicknameTextControl.cpp RosterItem.cpp RosterListView.cpp diff --git a/application/MainWindow.cpp b/application/MainWindow.cpp index ff3e7ac..87dd561 100644 --- a/application/MainWindow.cpp +++ b/application/MainWindow.cpp @@ -45,6 +45,7 @@ #include "ReplicantStatusView.h" #include "RosterItem.h" #include "RosterListView.h" +#include "SearchBarTextControl.h" #include "Server.h" #include "StatusView.h" @@ -54,12 +55,12 @@ const uint32 kSearchContact = 'SRCH'; MainWindow::MainWindow() : - BWindow(BRect(0, 0, 300, 400), "Caya", B_DOCUMENT_WINDOW, 0), + BWindow(BRect(0, 0, 300, 400), "Caya", B_TITLED_WINDOW, 0), fWorkspaceChanged(false) { fStatusView = new StatusView("statusView"); - BTextControl* searchBox = new BTextControl("searchBox", NULL, NULL, + SearchBarTextControl* searchBox = new SearchBarTextControl( new BMessage(kSearchContact)); fListView = new RosterListView("buddyView"); @@ -89,8 +90,8 @@ MainWindow::MainWindow() wrench->SetBitmap(toolIcon); wrench->SetMenu(wrenchMenu); - SetLayout(new BGridLayout(5, 5)); - AddChild(BGridLayoutBuilder(5, 5) + SetLayout(new BGridLayout(1, 2)); + AddChild(BGridLayoutBuilder(1, 2) .Add(searchBox, 0, 0) .Add(wrench, 1, 0) .Add(scrollView, 0, 1, 2) @@ -141,7 +142,8 @@ MainWindow::MessageReceived(BMessage* message) if (message->FindPointer("source", &control) != B_OK) return; - BTextControl* searchBox = static_cast(control); + SearchBarTextControl* searchBox + = static_cast(control); if (searchBox == NULL) return; diff --git a/application/TheApp.cpp b/application/TheApp.cpp index fe968c5..70976ac 100644 --- a/application/TheApp.cpp +++ b/application/TheApp.cpp @@ -91,7 +91,7 @@ TheApp::AboutRequested() const char* holders[] = { "2009-2010 Andrea Anzani", "2009-2010 Pier Luigi Fiorini", - "2011-2012 Casalinuovo Dario", + "2010-2012 Casalinuovo Dario", NULL }; @@ -109,7 +109,7 @@ TheApp::AboutRequested() AboutWindow* about = new AboutWindow("Caya", holders, authors, extraInfo.String()); about->Show(); - delete about; + //delete about; } diff --git a/application/views/NicknameTextControl.cpp b/application/views/NicknameTextControl.cpp index 5f2706b..3412c8d 100644 --- a/application/views/NicknameTextControl.cpp +++ b/application/views/NicknameTextControl.cpp @@ -6,20 +6,24 @@ * Pier Luigi Fiorini, pierluigi.fiorini@gmail.com */ +#include "CayaConstants.h" #include "NicknameTextControl.h" +#include + NicknameTextControl::NicknameTextControl(const char* name, BMessage* message) - : BTextControl(name, NULL, NULL, message) + : BTextView(name, B_WILL_DRAW) { + SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); } - +/* void NicknameTextControl::Draw(BRect updateRect) { - BRect rect(Bounds()); +// BRect rect(Bounds()); - SetHighColor(ui_color(B_PANEL_BACKGROUND_COLOR)); - FillRect(rect); +// FillRect(rect); } +*/ diff --git a/application/views/NicknameTextControl.h b/application/views/NicknameTextControl.h index 70600cd..a815e23 100644 --- a/application/views/NicknameTextControl.h +++ b/application/views/NicknameTextControl.h @@ -5,13 +5,13 @@ #ifndef _NICKNAME_TEXT_CONTROL_H #define _NICKNAME_TEXT_CONTROL_H -#include +#include -class NicknameTextControl : public BTextControl { +class NicknameTextControl : public BTextView { public: NicknameTextControl(const char* name, BMessage* message); - virtual void Draw(BRect updateRect); +// virtual void Draw(BRect updateRect); }; #endif // _NICKNAME_TEXT_CONTROL_H diff --git a/application/views/ReplicantMenuItem.cpp b/application/views/ReplicantMenuItem.cpp index f9847f8..8ab8024 100644 --- a/application/views/ReplicantMenuItem.cpp +++ b/application/views/ReplicantMenuItem.cpp @@ -65,9 +65,11 @@ ReplicantMenuItem::SetIcon() switch (fStatus) { case CAYA_ONLINE: - num = kConnectingReplicant; + num = kOnlineReplicant; break; case CAYA_EXTENDED_AWAY: + num = kCayaIconReplicant; + break; case CAYA_AWAY: num = kAwayReplicant; break; diff --git a/application/views/ReplicantStatusView.cpp b/application/views/ReplicantStatusView.cpp index c73f635..808ce27 100644 --- a/application/views/ReplicantStatusView.cpp +++ b/application/views/ReplicantStatusView.cpp @@ -151,9 +151,11 @@ ReplicantStatusView::SetStatus(CayaStatus status) switch (status) { case CAYA_AWAY: - case CAYA_EXTENDED_AWAY: fIcon = fAwayIcon; break; + case CAYA_EXTENDED_AWAY: + fIcon = fCayaIcon; + break; case CAYA_DO_NOT_DISTURB: fIcon = fBusyIcon; break; @@ -273,7 +275,7 @@ ReplicantStatusView::_Init() fResources = CayaResources(); //Get icons from resources - fConnectingIcon = _GetIcon(kConnectingReplicant); + fConnectingIcon = _GetIcon(kOnlineReplicant); fCayaIcon = _GetIcon(kCayaIconReplicant); fOfflineIcon = _GetIcon(kOfflineReplicant); fIcon = fOfflineIcon; @@ -299,15 +301,11 @@ void ReplicantStatusView::_BuildMenu() { // Status menu - //fStatusMenu = new BPopUpMenu("Status", false, false); + fReplicantMenu = new BPopUpMenu(" - ", false, false); // Add status menu items int32 s = CAYA_ONLINE; while (s >= CAYA_ONLINE && s < CAYA_STATUSES) { - if (s == CAYA_EXTENDED_AWAY) { - s++; - continue; - } BMessage* msg = new BMessage(CAYA_REPLICANT_STATUS_SET); msg->AddInt32("status", s); @@ -315,20 +313,12 @@ ReplicantStatusView::_BuildMenu() CayaStatusToString((CayaStatus)s), (CayaStatus)s); fReplicantMenu->AddItem(item); - // Add items for custom messages - if (s == CAYA_ONLINE/* || s == CAYA_DO_NOT_DISTURB*/) { - item = new ReplicantMenuItem("Custom...", (CayaStatus) s, true); - fReplicantMenu->AddItem(item); - fReplicantMenu->AddItem(new BSeparatorItem()); - } - // Mark offline status by default if (s == CAYA_OFFLINE) item->SetMarked(true); s++; } - //fReplicantMenu->AddItem(fStatusMenu); fReplicantMenu->AddItem(new BSeparatorItem()); fReplicantMenu->AddItem(new BitmapMenuItem("Preferences ", @@ -337,7 +327,6 @@ ReplicantStatusView::_BuildMenu() fReplicantMenu->AddItem(new BitmapMenuItem("Exit", new BMessage(CAYA_REPLICANT_EXIT), fExitMenuIcon)); - //fStatusMenu->SetTargetForItems(fReplicantMenu); fReplicantMenu->SetTargetForItems(this); } diff --git a/application/views/RosterItem.cpp b/application/views/RosterItem.cpp index f895569..3e8aa87 100644 --- a/application/views/RosterItem.cpp +++ b/application/views/RosterItem.cpp @@ -99,6 +99,7 @@ void RosterItem::DrawItem(BView* owner, BRect frame, bool complete) rgb_color highlightColor = ui_color(B_CONTROL_HIGHLIGHT_COLOR); rgb_color highColor = owner->HighColor(); rgb_color lowColor = owner->LowColor(); + float h = frame.Height(); // Draw selection if (IsSelected()) { @@ -111,31 +112,33 @@ void RosterItem::DrawItem(BView* owner, BRect frame, bool complete) owner->FillRect(frame); } - BResources* res = CayaResources(); + /*BResources* res = CayaResources(); if (res) { int32 num = 0; switch (fStatus) { case CAYA_ONLINE: - num = kOnlineIcon; + num = kOnlineReplicant; break; case CAYA_EXTENDED_AWAY: + num = kCayaIconReplicant; + break; case CAYA_AWAY: - num = kAwayIcon; + num = kAwayReplicant; break; case CAYA_DO_NOT_DISTURB: - num = kBusyIcon; + num = kBusyReplicant; break; case CAYA_OFFLINE: - num = kOfflineIcon; + num = kOfflineReplicant; break; default: - break; - } + break; + } BBitmap* bitmap = IconFromResources(res, num, B_MINI_ICON); - BRect bitmapRect(frame.left + 2, frame.top + 2, - frame.left + 2 + 14, frame.top + 2 + 14); + BRect bitmapRect(frame.left + 40, frame.top + fBaselineOffset - 10, + frame.left + 55, frame.top + 18); owner->SetDrawingMode(B_OP_ALPHA); owner->SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_OVERLAY); @@ -143,7 +146,7 @@ void RosterItem::DrawItem(BView* owner, BRect frame, bool complete) bitmapRect, B_FILTER_BITMAP_BILINEAR); delete res; - } else { + } else {*/ // Draw contact status switch (fStatus) { case CAYA_ONLINE: @@ -162,19 +165,31 @@ void RosterItem::DrawItem(BView* owner, BRect frame, bool complete) break; } - owner->FillEllipse(BRect(frame.left + 4, frame.top + 4, - frame.left + 4 + 10 , frame.top + 4 + 10)); + owner->FillRect(BRect(frame.left, + frame.top, + frame.left + 5, frame.top + h - 1 + )); + //} + + // Draw avatar icon + if (fBitmap != NULL) { + BRect rect(frame.left + 6, frame.top, + frame.left + 42, frame.top + h); + owner->SetDrawingMode(B_OP_ALPHA); + owner->SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_OVERLAY); + owner->DrawBitmap(fBitmap, fBitmap->Bounds(), + rect, B_FILTER_BITMAP_BILINEAR); } // Draw contact name - owner->MovePenTo(frame.left + 20, frame.top + fBaselineOffset); + owner->MovePenTo(frame.left + 48, frame.top + fBaselineOffset); owner->SetHighColor(ui_color(B_CONTROL_TEXT_COLOR)); owner->DrawString(Text()); // Draw contact status string - owner->MovePenTo(frame.left + 20, frame.top + fBaselineOffset + - fBaselineOffset + 2); - owner->SetHighColor(tint_color(lowColor, B_DARKEN_1_TINT)); + owner->MovePenTo(frame.left + 48, frame.top + fBaselineOffset + + fBaselineOffset + 3); + owner->SetHighColor(tint_color(lowColor, B_DARKEN_2_TINT)); if (fPersonalStatus.Length() == 0) owner->DrawString(CayaStatusToString(fStatus)); else @@ -184,21 +199,11 @@ void RosterItem::DrawItem(BView* owner, BRect frame, bool complete) owner->StrokeLine(BPoint(frame.left, frame.bottom), BPoint(frame.right, frame.bottom)); - // Draw avatar icon - if (fBitmap != NULL) { - float h = frame.Height() - 4; - BRect rect(frame.right - h - 2, frame.top + 2, - frame.right - 2, frame.top + h ); - owner->SetDrawingMode(B_OP_ALPHA); - owner->SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_OVERLAY); - owner->DrawBitmap(fBitmap, fBitmap->Bounds(), - rect, B_FILTER_BITMAP_BILINEAR); - } - + // Draw protocol bitmpap BBitmap* protocolBitmap = contactLinker->ProtocolBitmap(); - float h = frame.Height(); - BRect rect(frame.right - h - 20, frame.top + 2, - frame.right - 40, frame.top + h - 20); + + BRect rect(frame.right - 19, frame.top + 2, + frame.right - 2, frame.top + 19 );; owner->SetDrawingMode(B_OP_ALPHA); owner->SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_OVERLAY); owner->DrawBitmap(protocolBitmap, protocolBitmap->Bounds(), diff --git a/application/views/RosterListView.cpp b/application/views/RosterListView.cpp index 4609179..d4f5c01 100644 --- a/application/views/RosterListView.cpp +++ b/application/views/RosterListView.cpp @@ -50,7 +50,8 @@ compare_by_status(const void* _item1, const void* _item2) RosterListView::RosterListView(const char* name) - : BListView(name, B_SINGLE_SELECTION_LIST, B_WILL_DRAW | B_FRAME_EVENTS | + : BOutlineListView(name, B_SINGLE_SELECTION_LIST, + B_WILL_DRAW | B_FRAME_EVENTS | B_NAVIGABLE | B_FULL_UPDATE_ON_RESIZE), fPrevItem(NULL) { diff --git a/application/views/RosterListView.h b/application/views/RosterListView.h index fdc336c..c83c41f 100644 --- a/application/views/RosterListView.h +++ b/application/views/RosterListView.h @@ -5,14 +5,14 @@ #ifndef _ROSTER_LIST_VIEW_H #define _ROSTER_LIST_VIEW_H -#include +#include class BPopUpMenu; class ContactLinker; class RosterItem; -class RosterListView : public BListView +class RosterListView : public BOutlineListView { public: RosterListView(const char* name); diff --git a/application/views/StatusMenuItem.cpp b/application/views/StatusMenuItem.cpp index b687691..669509e 100644 --- a/application/views/StatusMenuItem.cpp +++ b/application/views/StatusMenuItem.cpp @@ -62,17 +62,19 @@ StatusMenuItem::SetIcon() switch (fStatus) { case CAYA_ONLINE: - num = kOnlineIcon; + num = kOnlineReplicant; break; case CAYA_EXTENDED_AWAY: + num = kCayaIconReplicant; + break; case CAYA_AWAY: - num = kAwayIcon; + num = kAwayReplicant; break; case CAYA_DO_NOT_DISTURB: - num = kBusyIcon; + num = kBusyReplicant; break; case CAYA_OFFLINE: - num = kOfflineIcon; + num = kOfflineReplicant; break; default: break; diff --git a/application/views/StatusView.cpp b/application/views/StatusView.cpp index 87c905a..3de3f3e 100644 --- a/application/views/StatusView.cpp +++ b/application/views/StatusView.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -32,8 +33,10 @@ StatusView::StatusView(const char* name) BView(name, B_WILL_DRAW) { // Nick name - fNickname = new NicknameTextControl("Nickname", new BMessage(kSetNickname)); + fPersonalMessage = new NicknameTextControl("Nickname", + new BMessage(kSetNickname)); + BStringView* personalMessageLabel = new BStringView("Nickname","Nickname:", B_WILL_DRAW); // Status menu fStatusMenu = new BPopUpMenu("-"); @@ -44,12 +47,12 @@ StatusView::StatusView(const char* name) (CayaStatus)s), (CayaStatus)s); fStatusMenu->AddItem(item); - // Add items for custom messages + /*// Add items for custom messages if (s == CAYA_ONLINE || s == CAYA_DO_NOT_DISTURB) { item = new StatusMenuItem("Custom...", (CayaStatus)s, true); fStatusMenu->AddItem(item); fStatusMenu->AddItem(new BSeparatorItem()); - } + }*/ // Mark offline status by default if (s == CAYA_OFFLINE) @@ -71,12 +74,14 @@ StatusView::StatusView(const char* name) SetLayout(new BGroupLayout(B_VERTICAL)); AddChild(BGroupLayoutBuilder(B_HORIZONTAL, 5) .AddGroup(B_VERTICAL) - .Add(fNickname) .Add(statusField) - .AddGlue() + .AddGroup(B_HORIZONTAL) + .Add(personalMessageLabel) + .Add(fPersonalMessage) + .End() .End() .Add(fAvatar) - .TopView() +// .TopView() ); } @@ -84,8 +89,7 @@ StatusView::StatusView(const char* name) void StatusView::AttachedToWindow() { - fNickname->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); - fNickname->SetTarget(this); + //fNickname->SetTarget(this); fStatusMenu->SetTargetForItems(this); } @@ -94,12 +98,12 @@ void StatusView::MessageReceived(BMessage* msg) { switch (msg->what) { - case kSetNickname: + /*case kSetNickname: { AccountManager* accountManager = AccountManager::Get(); accountManager->SetNickname(fNickname->Text()); break; - } + }*/ case kSetStatus: { int32 status; @@ -120,7 +124,7 @@ StatusView::MessageReceived(BMessage* msg) void StatusView::SetName(BString name) { - fNickname->SetText(name.String()); + fPersonalMessage->SetText(name.String()); } diff --git a/application/views/StatusView.h b/application/views/StatusView.h index 2b1cf8e..34397e1 100644 --- a/application/views/StatusView.h +++ b/application/views/StatusView.h @@ -27,7 +27,7 @@ public: private: BPopUpMenu* fStatusMenu; - NicknameTextControl* fNickname; + NicknameTextControl* fPersonalMessage; BitmapView* fAvatar; };