TemplateWindow.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. /*
  2. * Copyright 2009-2010, Pier Luigi Fiorini. All rights reserved.
  3. * Copyright 2021, Jaidyn Levesque. All rights reserved.
  4. * Distributed under the terms of the MIT License.
  5. *
  6. * Authors:
  7. * Pier Luigi Fiorini, pierluigi.fiorini@gmail.com
  8. * Jaidyn Levesque, jadedctrl@teknik.io
  9. */
  10. #include "TemplateWindow.h"
  11. #include <Alert.h>
  12. #include <Button.h>
  13. #include <Catalog.h>
  14. #include <ControlLook.h>
  15. #include <LayoutBuilder.h>
  16. #include <TextControl.h>
  17. #include <String.h>
  18. #include "AccountsMenu.h"
  19. #include "ChatProtocolMessages.h"
  20. #include "TemplateView.h"
  21. #undef B_TRANSLATION_CONTEXT
  22. #define B_TRANSLATION_CONTEXT "TemplateWindow"
  23. const uint32 kOK = 'save';
  24. const uint32 kAccSelected = 'JWas';
  25. TemplateWindow::TemplateWindow(const char* title, const char* templateType,
  26. BMessage* msg, Server* server, bigtime_t instance)
  27. :
  28. BWindow(BRect(0, 0, 400, 100), title, B_FLOATING_WINDOW,
  29. B_NOT_RESIZABLE | B_AUTO_UPDATE_SIZE_LIMITS | B_CLOSE_ON_ESCAPE),
  30. fServer(server),
  31. fSelectedAcc(-1),
  32. fTemplate(NULL),
  33. fTemplateType(templateType),
  34. fMessage(msg),
  35. fTarget(NULL)
  36. {
  37. _InitInterface(instance);
  38. _LoadTemplate();
  39. CenterOnScreen();
  40. }
  41. TemplateWindow::TemplateWindow(const char* title, ProtocolTemplate* temp,
  42. BMessage* msg, Server* server, bigtime_t instance)
  43. :
  44. BWindow(BRect(0, 0, 400, 100), title, B_FLOATING_WINDOW,
  45. B_NOT_RESIZABLE | B_AUTO_UPDATE_SIZE_LIMITS | B_CLOSE_ON_ESCAPE),
  46. fServer(server),
  47. fSelectedAcc(-1),
  48. fTemplate(temp),
  49. fMessage(msg)
  50. {
  51. _InitInterface(instance);
  52. CenterOnScreen();
  53. fTemplate->Load(fTemplateView);
  54. fTemplateView->AttachedToWindow();
  55. fTemplateView->MakeFocus(true);
  56. }
  57. void
  58. TemplateWindow::MessageReceived(BMessage* msg)
  59. {
  60. switch (msg->what) {
  61. case IM_MESSAGE: {
  62. // If IM_MESSAGE, assume it should be treated as current settings
  63. if (fTemplate == NULL)
  64. break;
  65. for (int i = 0; fTemplateView->CountChildren(); i++)
  66. fTemplateView->RemoveChild(fTemplateView->ChildAt(i));
  67. fTemplate->Load(fTemplateView, msg);
  68. break;
  69. }
  70. case kOK: {
  71. // Save account settings
  72. if (fTemplate == NULL || fTemplateView == NULL)
  73. break;
  74. BString error = B_TRANSLATE("Some items are empty. Please make "
  75. "sure to fill out every item.");
  76. BMessage* settings = new BMessage(*fMessage);
  77. status_t result = fTemplate->Save(fTemplateView, settings, &error);
  78. if (result != B_OK) {
  79. BAlert* alert = new BAlert("", error.String(),
  80. B_TRANSLATE("OK"), NULL, NULL, B_WIDTH_AS_USUAL,
  81. B_WARNING_ALERT);
  82. alert->Go();
  83. break;
  84. }
  85. ProtocolLooper* looper = fServer->GetProtocolLooper(fSelectedAcc);
  86. if (looper == NULL)
  87. break;
  88. looper->PostMessage(settings);
  89. Close();
  90. break;
  91. }
  92. case kAccSelected:
  93. {
  94. int64 instance;
  95. if (msg->FindInt64("instance", &instance) == B_OK)
  96. fSelectedAcc = instance;
  97. _LoadTemplate();
  98. break;
  99. }
  100. default:
  101. BWindow::MessageReceived(msg);
  102. }
  103. }
  104. void
  105. TemplateWindow::SetTarget(BHandler* target)
  106. {
  107. fTarget = target;
  108. }
  109. void
  110. TemplateWindow::_InitInterface(bigtime_t instance)
  111. {
  112. fTemplateView = new TemplateView("template");
  113. AccountInstances accounts = fServer->GetActiveAccounts();
  114. if (instance > -1) {
  115. BMenu* accountMenu = new BMenu("accountMenu");
  116. BString name = "N/A";
  117. for (int i = 0; i < accounts.CountItems(); i++)
  118. if (accounts.ValueAt(i) == instance) {
  119. name = accounts.KeyAt(i);
  120. break;
  121. }
  122. accountMenu->AddItem(new BMenuItem(name.String(), NULL));
  123. accountMenu->SetLabelFromMarked(true);
  124. accountMenu->ItemAt(0)->SetMarked(true);
  125. accountMenu->SetEnabled(false);
  126. fMenuField = new BMenuField("accountMenuField", NULL, accountMenu);
  127. }
  128. else {
  129. AccountsMenu* accountMenu = new AccountsMenu("accountMenu",
  130. BMessage(kAccSelected));
  131. fMenuField = new BMenuField("accountMenuField", NULL, accountMenu);
  132. fSelectedAcc = accountMenu->GetDefaultSelection();
  133. }
  134. BButton* fOkButton = new BButton(B_TRANSLATE("OK"), new BMessage(kOK));
  135. if (accounts.CountItems() <= 0)
  136. fOkButton->SetEnabled(false);
  137. fOkButton->MakeDefault(true);
  138. const float spacing = be_control_look->DefaultItemSpacing();
  139. BLayoutBuilder::Group<>(this, B_VERTICAL)
  140. .SetInsets(B_USE_DEFAULT_SPACING)
  141. .Add(fTemplateView)
  142. .AddGroup(B_HORIZONTAL)
  143. .Add(fMenuField)
  144. .AddGlue()
  145. .Add(new BButton(B_TRANSLATE("Cancel"),
  146. new BMessage(B_QUIT_REQUESTED)))
  147. .Add(fOkButton)
  148. .End()
  149. .End();
  150. }
  151. void
  152. TemplateWindow::_LoadTemplate()
  153. {
  154. if (fTemplateType.IsEmpty() == true)
  155. return;
  156. ProtocolLooper* looper = fServer->GetProtocolLooper(fSelectedAcc);
  157. if (looper == NULL)
  158. return;
  159. fTemplate = new ProtocolTemplate(looper->Protocol(), fTemplateType.String());
  160. for (int i = 0; fTemplateView->CountChildren(); i++)
  161. fTemplateView->RemoveChild(fTemplateView->ChildAt(i));
  162. fTemplate->Load(fTemplateView);
  163. fTemplateView->AttachedToWindow();
  164. fTemplateView->MakeFocus(true);
  165. }