123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- /*
- * Copyright 2009-2011, Andrea Anzani. All rights reserved.
- * Copyright 2009-2011, Pier Luigi Fiorini. All rights reserved.
- * Copyright 2021, Jaidyn Levesque. All rights reserved.
- * Distributed under the terms of the MIT License.
- *
- * Authors:
- * Andrea Anzani, andrea.anzani@gmail.com
- * Pier Luigi Fiorini, pierluigi.fiorini@gmail.com
- * Jaidyn Levesque, jadedctrl@teknik.io
- */
- #include "RosterWindow.h"
- #include <Button.h>
- #include <LayoutBuilder.h>
- #include <MenuField.h>
- #include <Notification.h>
- #include <ScrollView.h>
- #include "AccountsMenu.h"
- #include "AppMessages.h"
- #include "AppPreferences.h"
- #include "ChatProtocolMessages.h"
- #include "RosterItem.h"
- #include "RosterListView.h"
- #include "RosterView.h"
- const uint32 kSendMessage = 'RWSM';
- const uint32 kSelAccount = 'RWSA';
- const uint32 kSelNoAccount = 'RWNA';
- RosterWindow::RosterWindow(const char* title, BMessage* selectMsg,
- BMessenger* messenger, Server* server, bigtime_t instance)
- :
- BWindow(BRect(0, 0, 300, 400), title, B_FLOATING_WINDOW,
- B_AUTO_UPDATE_SIZE_LIMITS),
- fTarget(messenger),
- fMessage(selectMsg),
- fServer(server)
- {
- fRosterView = new RosterView("buddyView", server, instance),
- fRosterView->SetInvocationMessage(new BMessage(kSendMessage));
- fOkButton = new BButton("OK", new BMessage(kSendMessage));
- AccountInstances accounts = fServer->GetActiveAccounts();
- // If a specific instance is given, disallow selecting other accounts
- // In fact, don't even bother populating with them
- if (instance > -1) {
- BMenu* accountMenu = new BMenu("accountMenu");
- BString name = "N/A";
- for (int i = 0; i < accounts.CountItems(); i++)
- if (accounts.ValueAt(i) == instance) {
- name = accounts.KeyAt(i);
- break;
- }
- accountMenu->AddItem(new BMenuItem(name.String(), NULL));
- accountMenu->SetLabelFromMarked(true);
- accountMenu->ItemAt(0)->SetMarked(true);
- accountMenu->SetEnabled(false);
- fAccountField = new BMenuField("accountMenuField", NULL, accountMenu);
- }
- else
- fAccountField = new BMenuField("accountMenuField", NULL,
- new AccountsMenu("accountMenu", BMessage(kSelAccount),
- new BMessage(kSelNoAccount)));
- BLayoutBuilder::Group<>(this, B_VERTICAL, 0.0f)
- .SetInsets(B_USE_DEFAULT_SPACING)
- .Add(fRosterView)
- .AddGroup(B_HORIZONTAL)
- .Add(fAccountField)
- .AddGlue()
- .Add(new BButton("Cancel", new BMessage(B_QUIT_REQUESTED)))
- .Add(fOkButton)
- .End()
- .End();
- CenterOnScreen();
- }
- void
- RosterWindow::MessageReceived(BMessage* message)
- {
- switch (message->what) {
- case kSendMessage:
- {
- int index = message->FindInt32("index");
- RosterItem* ritem = fRosterView->ListView()->RosterItemAt(index);
- const char* search = fRosterView->SearchBox()->Text();
- BString user_id;
- int64 instance;
- if (ritem != NULL) {
- User* user = ritem->GetContact();
- user_id = user->GetId();
- instance = user->GetProtocolLooper()->GetInstance();
- }
- else if (search != NULL) {
- user_id = search;
- instance = fRosterView->GetAccount();
- }
- else
- return;
- User* user = ritem->GetContact();
- fMessage->AddString("user_id", user_id);
- fMessage->AddInt64("instance", instance);
- fTarget->SendMessage(fMessage);
- PostMessage(B_QUIT_REQUESTED);
- break;
- }
- case kSelAccount:
- {
- AccountInstances accounts = fServer->GetActiveAccounts();
- int index = message->FindInt32("index") - 1;
- if (index < 0 || index > (accounts.CountItems() - 1))
- return;
- fRosterView->SetAccount(accounts.ValueAt(index));
- break;
- }
- case kSelNoAccount:
- fRosterView->SetAccount(-1);
- break;
- case IM_MESSAGE:
- fRosterView->MessageReceived(message);
- break;
- default:
- BWindow::MessageReceived(message);
- }
- }
- void
- RosterWindow::UpdateListItem(RosterItem* item)
- {
- fRosterView->UpdateListItem(item);
- }
|