RosterWindow.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. /*
  2. * Copyright 2009-2011, Andrea Anzani. All rights reserved.
  3. * Copyright 2009-2011, Pier Luigi Fiorini. All rights reserved.
  4. * Copyright 2021, Jaidyn Levesque. All rights reserved.
  5. * Distributed under the terms of the MIT License.
  6. *
  7. * Authors:
  8. * Andrea Anzani, andrea.anzani@gmail.com
  9. * Pier Luigi Fiorini, pierluigi.fiorini@gmail.com
  10. * Jaidyn Levesque, jadedctrl@teknik.io
  11. */
  12. #include "RosterWindow.h"
  13. #include <Button.h>
  14. #include <LayoutBuilder.h>
  15. #include <MenuField.h>
  16. #include <Notification.h>
  17. #include <ScrollView.h>
  18. #include "AccountsMenu.h"
  19. #include "AppMessages.h"
  20. #include "AppPreferences.h"
  21. #include "ChatProtocolMessages.h"
  22. #include "RosterItem.h"
  23. #include "RosterListView.h"
  24. #include "RosterView.h"
  25. const uint32 kSendMessage = 'RWSM';
  26. const uint32 kSelAccount = 'RWSA';
  27. const uint32 kSelNoAccount = 'RWNA';
  28. RosterWindow::RosterWindow(const char* title, BMessage* selectMsg,
  29. BMessenger* messenger, Server* server, bigtime_t instance)
  30. :
  31. BWindow(BRect(0, 0, 300, 400), title, B_FLOATING_WINDOW,
  32. B_AUTO_UPDATE_SIZE_LIMITS),
  33. fTarget(messenger),
  34. fMessage(selectMsg),
  35. fServer(server)
  36. {
  37. fRosterView = new RosterView("buddyView", server, instance),
  38. fRosterView->SetInvocationMessage(new BMessage(kSendMessage));
  39. fOkButton = new BButton("OK", new BMessage(kSendMessage));
  40. AccountInstances accounts = fServer->GetActiveAccounts();
  41. // If a specific instance is given, disallow selecting other accounts
  42. // In fact, don't even bother populating with them
  43. if (instance > -1) {
  44. BMenu* accountMenu = new BMenu("accountMenu");
  45. BString name = "N/A";
  46. for (int i = 0; i < accounts.CountItems(); i++)
  47. if (accounts.ValueAt(i) == instance) {
  48. name = accounts.KeyAt(i);
  49. break;
  50. }
  51. accountMenu->AddItem(new BMenuItem(name.String(), NULL));
  52. accountMenu->SetLabelFromMarked(true);
  53. accountMenu->ItemAt(0)->SetMarked(true);
  54. accountMenu->SetEnabled(false);
  55. fAccountField = new BMenuField("accountMenuField", NULL, accountMenu);
  56. }
  57. else
  58. fAccountField = new BMenuField("accountMenuField", NULL,
  59. new AccountsMenu("accountMenu", BMessage(kSelAccount),
  60. new BMessage(kSelNoAccount)));
  61. BLayoutBuilder::Group<>(this, B_VERTICAL, 0.0f)
  62. .SetInsets(B_USE_DEFAULT_SPACING)
  63. .Add(fRosterView)
  64. .AddGroup(B_HORIZONTAL)
  65. .Add(fAccountField)
  66. .AddGlue()
  67. .Add(new BButton("Cancel", new BMessage(B_QUIT_REQUESTED)))
  68. .Add(fOkButton)
  69. .End()
  70. .End();
  71. CenterOnScreen();
  72. }
  73. void
  74. RosterWindow::MessageReceived(BMessage* message)
  75. {
  76. switch (message->what) {
  77. case kSendMessage:
  78. {
  79. int index = message->FindInt32("index");
  80. RosterItem* ritem = fRosterView->ListView()->RosterItemAt(index);
  81. const char* search = fRosterView->SearchBox()->Text();
  82. BString user_id;
  83. int64 instance;
  84. if (ritem != NULL) {
  85. User* user = ritem->GetContact();
  86. user_id = user->GetId();
  87. instance = user->GetProtocolLooper()->GetInstance();
  88. }
  89. else if (search != NULL) {
  90. user_id = search;
  91. instance = fRosterView->GetAccount();
  92. }
  93. else
  94. return;
  95. User* user = ritem->GetContact();
  96. fMessage->AddString("user_id", user_id);
  97. fMessage->AddInt64("instance", instance);
  98. fTarget->SendMessage(fMessage);
  99. PostMessage(B_QUIT_REQUESTED);
  100. break;
  101. }
  102. case kSelAccount:
  103. {
  104. AccountInstances accounts = fServer->GetActiveAccounts();
  105. int index = message->FindInt32("index") - 1;
  106. if (index < 0 || index > (accounts.CountItems() - 1))
  107. return;
  108. fRosterView->SetAccount(accounts.ValueAt(index));
  109. break;
  110. }
  111. case kSelNoAccount:
  112. fRosterView->SetAccount(-1);
  113. break;
  114. case IM_MESSAGE:
  115. fRosterView->MessageReceived(message);
  116. break;
  117. default:
  118. BWindow::MessageReceived(message);
  119. }
  120. }
  121. void
  122. RosterWindow::UpdateListItem(RosterItem* item)
  123. {
  124. fRosterView->UpdateListItem(item);
  125. }