NetPrefsServerView.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437
  1. #include <Autolock.h>
  2. #include <Box.h>
  3. #include <Button.h>
  4. #include <MenuField.h>
  5. #include <Menu.h>
  6. #include <MenuItem.h>
  7. #include <StringView.h>
  8. #include <SupportDefs.h>
  9. #include <stdio.h>
  10. #include "NetPrefsServerView.h"
  11. #include "NetworkWindow.h"
  12. #include "ServerEntryWindow.h"
  13. #include "ColumnListView.h"
  14. #include "ColumnTypes.h"
  15. #include "Vision.h"
  16. const rgb_color serverItemNormalColor = {0, 0, 0, 255};
  17. const rgb_color serverItemDefaultColor = {0, 127, 0, 255};
  18. const rgb_color serverItemDisabledColor = {0, 0, 192, 255};
  19. class ServerListItem : public BStringItem
  20. {
  21. public:
  22. ServerListItem (ServerData &);
  23. ~ServerListItem (void);
  24. virtual void DrawItem (BView *, BRect, bool);
  25. void SetState (uint32);
  26. void SetServer (const char *);
  27. void SetPort (uint32);
  28. ServerData GetServerInfo (void);
  29. private:
  30. void UpdateItemText (void);
  31. inline rgb_color GetItemColor (void);
  32. uint32 state;
  33. BString serverName;
  34. uint32 port;
  35. };
  36. ServerListItem::ServerListItem (ServerData & data)
  37. : BStringItem ("")
  38. {
  39. state = data.state;
  40. serverName = data.serverName;
  41. port = data.port;
  42. UpdateItemText ();
  43. }
  44. ServerListItem::~ServerListItem (void)
  45. {
  46. }
  47. void
  48. ServerListItem::UpdateItemText (void)
  49. {
  50. BString itemText;
  51. itemText += serverName;
  52. itemText += ":";
  53. itemText << port;
  54. SetText (itemText.String ());
  55. }
  56. inline rgb_color
  57. ServerListItem::GetItemColor (void)
  58. {
  59. switch (state)
  60. {
  61. case 1:
  62. return serverItemDefaultColor;
  63. case 2:
  64. return serverItemDisabledColor;
  65. }
  66. return serverItemNormalColor;
  67. }
  68. void
  69. ServerListItem::DrawItem (BView * parent, BRect frame, bool complete)
  70. {
  71. parent->SetHighColor (GetItemColor ());
  72. BStringItem::DrawItem (parent, frame, complete);
  73. }
  74. void
  75. ServerListItem::SetState (uint32 newState)
  76. {
  77. state = newState;
  78. UpdateItemText ();
  79. }
  80. void
  81. ServerListItem::SetServer (const char *newServer)
  82. {
  83. serverName = newServer;
  84. UpdateItemText ();
  85. }
  86. void
  87. ServerListItem::SetPort (uint32 newPort)
  88. {
  89. port = newPort;
  90. UpdateItemText ();
  91. }
  92. ServerData
  93. ServerListItem::GetServerInfo (void)
  94. {
  95. ServerData data;
  96. data.port = port;
  97. data.state = state;
  98. strcpy (data.serverName, serverName.String ());
  99. return data;
  100. }
  101. // server window
  102. NetPrefsServerView::NetPrefsServerView (BRect bounds, const char *name, BMessenger target)
  103. : BView (
  104. bounds,
  105. name,
  106. B_FOLLOW_ALL_SIDES,
  107. B_WILL_DRAW),
  108. fEntryWin (NULL),
  109. fNetWin (target)
  110. {
  111. SetViewColor (ui_color (B_PANEL_BACKGROUND_COLOR));
  112. BRect boundsRect (Bounds ());
  113. BBox *mainBox (new BBox (bounds.InsetByCopy (-1, -1), NULL, B_FOLLOW_ALL_SIDES));
  114. AddChild (mainBox);
  115. fSelectTitleString = new BStringView (BRect (0, 0, 0, 0), NULL, "Select servers for");
  116. fSelectTitleString->ResizeToPreferred ();
  117. mainBox->AddChild (fSelectTitleString);
  118. fSelectTitleString->MoveTo (11, 11);
  119. fServerList = new BColumnListView (BRect (0, 0, boundsRect.Width () - 10,
  120. boundsRect.Height () / 2), "fServerList", B_FOLLOW_LEFT | B_FOLLOW_TOP, B_WILL_DRAW,
  121. B_PLAIN_BORDER);
  122. fServerList->SetSelectionMessage (new BMessage (M_SERVER_ITEM_SELECTED));
  123. mainBox->AddChild (fServerList);
  124. fServerList->MoveTo (5, fSelectTitleString->Frame ().bottom + 3);
  125. BStringColumn *status (new BStringColumn (S_PREFSERVER_STATUS_COLUMN, be_plain_font->StringWidth ("Status") * 2,
  126. 0, bounds.Width (), 0, B_ALIGN_CENTER));
  127. fServerList->AddColumn (status, 0);
  128. BStringColumn *data (new BStringColumn (S_PREFSERVER_SERVER_COLUMN, be_plain_font->StringWidth ("Server") * 2,
  129. 0, bounds.Width (), 0));
  130. fServerList->AddColumn (data, 1);
  131. BStringColumn *port (new BStringColumn (S_PREFSERVER_PORT_COLUMN, be_plain_font->StringWidth ("Port") * 2,
  132. 0, bounds.Width (), 0));
  133. fServerList->AddColumn (port, 2);
  134. fAddButton = new BButton (BRect (0, 0, 0, 0), NULL, S_PREFSERVER_ADD_BUTTON B_UTF8_ELLIPSIS,
  135. new BMessage (M_SERVER_ADD_ITEM));
  136. fRemoveButton = new BButton (BRect (0, 0, 0, 0), NULL, S_PREFSERVER_REMOVE_BUTTON,
  137. new BMessage (M_SERVER_REMOVE_ITEM));
  138. fEditButton = new BButton (BRect (0, 0, 0, 0), NULL, S_PREFSERVER_EDIT_BUTTON B_UTF8_ELLIPSIS,
  139. new BMessage (M_SERVER_EDIT_ITEM));
  140. fAddButton->ResizeToPreferred ();
  141. fRemoveButton->ResizeToPreferred ();
  142. fEditButton->ResizeToPreferred ();
  143. fRemoveButton->MoveTo (fServerList->Frame ().right - fRemoveButton->Frame ().Width (),
  144. fServerList->Frame ().bottom + 5);
  145. mainBox->AddChild (fRemoveButton);
  146. fAddButton->MoveTo (fRemoveButton->Frame ().left - (fAddButton->Frame ().Width () + 5),
  147. fRemoveButton->Frame ().top);
  148. mainBox->AddChild (fAddButton);
  149. fEditButton->MoveTo (fAddButton->Frame ().left - (fEditButton->Frame ().Width () + 15),
  150. fAddButton->Frame ().top);
  151. mainBox->AddChild (fEditButton);
  152. BStringView *legend1 = new BStringView (BRect (0, 0, 0, 0), "str1", S_PREFSERVER_DESC1);
  153. legend1->ResizeToPreferred ();
  154. mainBox->AddChild (legend1);
  155. legend1->MoveTo (fServerList->Frame ().left + 5, fAddButton->Frame ().bottom + 5);
  156. BStringView *legend2 = new BStringView (BRect (0, 0, 0, 0), "str1", S_PREFSERVER_DESC2);
  157. legend2->ResizeToPreferred ();
  158. mainBox->AddChild (legend2);
  159. legend2->MoveTo (legend1->Frame ().left, legend1->Frame ().bottom);
  160. BStringView *legend3 = new BStringView (BRect (0, 0, 0, 0), "str1", S_PREFSERVER_DESC3);
  161. legend3->ResizeToPreferred ();
  162. mainBox->AddChild (legend3);
  163. legend3->MoveTo (legend2->Frame ().left, legend2->Frame ().bottom);
  164. fLegend4 = new BStringView (BRect (0, 0, 0, 0), "str1", S_PREFSERVER_DESC4);
  165. fLegend4->ResizeToPreferred ();
  166. mainBox->AddChild (fLegend4);
  167. fLegend4->MoveTo (legend3->Frame ().left, legend3->Frame ().bottom);
  168. fOkButton = new BButton (BRect (0, 0, 0, 0), NULL, S_PREFSERVER_OK_BUTTON,
  169. new BMessage (B_QUIT_REQUESTED));
  170. fOkButton->ResizeToPreferred ();
  171. mainBox->AddChild (fOkButton);
  172. fOkButton->MoveTo (fServerList->Frame ().right - fOkButton->Frame ().Width (),
  173. fLegend4->Frame ().bottom + 5);
  174. }
  175. NetPrefsServerView::~NetPrefsServerView (void)
  176. {
  177. BMessenger msgr (fEntryWin);
  178. if (msgr.IsValid ())
  179. msgr.SendMessage (B_QUIT_REQUESTED);
  180. }
  181. void
  182. NetPrefsServerView::AttachedToWindow (void)
  183. {
  184. BView::AttachedToWindow ();
  185. fAddButton->SetTarget (this);
  186. fEditButton->SetTarget (this);
  187. fRemoveButton->SetTarget (this);
  188. fServerList->SetTarget (this);
  189. fEditButton->SetEnabled (false);
  190. fRemoveButton->SetEnabled (false);
  191. fOkButton->SetTarget (Window ());
  192. if (fOkButton->Frame ().bottom > Bounds ().Height ())
  193. Window ()->ResizeTo (Bounds ().Width (), fOkButton->Frame ().bottom + 5);
  194. }
  195. void
  196. NetPrefsServerView::AddServer (const ServerData * data)
  197. {
  198. BAutolock lock (Looper ());
  199. if (!lock.IsLocked ())
  200. return;
  201. BRow *row (new BRow);
  202. switch (data->state)
  203. {
  204. case SERVER_PRIMARY:
  205. row->SetField (new BStringField ("*"), 0);
  206. break;
  207. case SERVER_SECONDARY:
  208. row->SetField (new BStringField ("+"), 0);
  209. break;
  210. case SERVER_DISABLED:
  211. row->SetField (new BStringField ("-"), 0);
  212. break;
  213. }
  214. BString server ("");
  215. server = data->serverName;
  216. BStringField *serverField (new BStringField (server.String ()));
  217. row->SetField (serverField, 1);
  218. server = "";
  219. server << data->port;
  220. BStringField *portField (new BStringField (server.String ()));
  221. row->SetField (portField, 2);
  222. fServerList->AddRow (row);
  223. }
  224. void
  225. NetPrefsServerView::RemoveServer ()
  226. {
  227. BAutolock lock (Looper ());
  228. if (!lock.IsLocked ())
  229. return;
  230. BRow *row (fServerList->CurrentSelection ());
  231. if (row)
  232. {
  233. BStringField *field ((BStringField *) row->GetField (1));
  234. int32 count;
  235. ssize_t size;
  236. type_code type;
  237. fActiveNetwork->GetInfo ("server", &type, &count);
  238. const ServerData *data;
  239. for (int32 i = 0; i < count; i++)
  240. {
  241. fActiveNetwork->FindData ("server", B_ANY_TYPE, i, reinterpret_cast < const void **>(&data),
  242. &size);
  243. if (!strcmp (data->serverName, field->String ()))
  244. {
  245. fActiveNetwork->RemoveData ("server", i);
  246. break;
  247. }
  248. }
  249. fServerList->RemoveRow (row);
  250. delete row;
  251. }
  252. }
  253. void
  254. NetPrefsServerView::UpdateNetworkData (const ServerData * newServer)
  255. {
  256. if (newServer == NULL)
  257. return;
  258. type_code type;
  259. int32 count;
  260. ssize_t size;
  261. fActiveNetwork->GetInfo ("server", &type, &count);
  262. const ServerData *data (NULL);
  263. for (int32 i = 0; i < count; i++)
  264. {
  265. fActiveNetwork->FindData ("server", B_ANY_TYPE, i, reinterpret_cast < const void **>(&data), &size);
  266. if (!strcmp (newServer->serverName, data->serverName))
  267. {
  268. fActiveNetwork->ReplaceData ("server", B_RAW_TYPE, i, newServer, sizeof (ServerData));
  269. return;
  270. }
  271. }
  272. fActiveNetwork->AddData ("server", B_RAW_TYPE, newServer, sizeof (ServerData));
  273. }
  274. void
  275. NetPrefsServerView::SetNetworkData (BMessage * msg)
  276. {
  277. // this shouldn't theoretically be able to happen but better safe than sorry
  278. BLooper *looper (Looper());
  279. if (looper == NULL)
  280. return;
  281. BAutolock lock (Looper ());
  282. if (!lock.IsLocked ())
  283. return;
  284. // clear previous servers (if any)
  285. while (fServerList->CountRows () > 0)
  286. {
  287. BRow *row (fServerList->RowAt (0));
  288. fServerList->RemoveRow (row);
  289. delete row;
  290. }
  291. BString netString (S_PREFSERVER_SEL_STRING);
  292. netString += msg->FindString ("name");
  293. netString += ":";
  294. type_code type;
  295. int32 count;
  296. ssize_t size;
  297. const ServerData *data;
  298. msg->GetInfo ("server", &type, &count);
  299. for (int32 i = 0; i < count; i++)
  300. {
  301. msg->FindData ("server", B_ANY_TYPE, i, reinterpret_cast < const void **>(&data), &size);
  302. AddServer (data);
  303. }
  304. fActiveNetwork = msg;
  305. fSelectTitleString->SetText (netString.String ());
  306. fSelectTitleString->ResizeToPreferred ();
  307. }
  308. void
  309. NetPrefsServerView::MessageReceived (BMessage * msg)
  310. {
  311. switch (msg->what)
  312. {
  313. case M_SERVER_ITEM_SELECTED:
  314. {
  315. BRow *row (fServerList->CurrentSelection ());
  316. if (row)
  317. {
  318. fEditButton->SetEnabled (true);
  319. fRemoveButton->SetEnabled (true);
  320. }
  321. else
  322. {
  323. fEditButton->SetEnabled (false);
  324. fRemoveButton->SetEnabled (false);
  325. }
  326. }
  327. break;
  328. case M_SERVER_ADD_ITEM:
  329. {
  330. BMessenger msgr (fEntryWin);
  331. if (msgr.IsValid ())
  332. fEntryWin->Activate ();
  333. else
  334. {
  335. fEntryWin = new ServerEntryWindow (this, new BMessage (M_SERVER_RECV_DATA), NULL, 0);
  336. fEntryWin->Show ();
  337. }
  338. }
  339. break;
  340. case M_SERVER_EDIT_ITEM:
  341. {
  342. BMessenger msgr (fEntryWin);
  343. if (msgr.IsValid ())
  344. fEntryWin->Activate ();
  345. else
  346. {
  347. BRow *row (fServerList->CurrentSelection ());
  348. if (!row)
  349. break;
  350. int32 count (0);
  351. ssize_t size (0);
  352. type_code type;
  353. fActiveNetwork->GetInfo ("server", &type, &count);
  354. const ServerData *compData;
  355. for (int32 i = 0; i < count; i++)
  356. {
  357. fActiveNetwork->FindData ("server", B_RAW_TYPE, i, reinterpret_cast < const void **>(&compData), &size);
  358. if (!strcmp (compData->serverName, ((BStringField *) row->GetField (1))->String ()))
  359. break;
  360. }
  361. BMessage *invoke (new BMessage (M_SERVER_RECV_DATA));
  362. invoke->AddBool ("edit", true);
  363. fEntryWin = new ServerEntryWindow (this, invoke, compData, size);
  364. fEntryWin->Show ();
  365. }
  366. }
  367. break;
  368. case M_SERVER_REMOVE_ITEM:
  369. {
  370. RemoveServer ();
  371. fNetWin.SendMessage (M_SERVER_DATA_CHANGED);
  372. }
  373. break;
  374. case M_SERVER_RECV_DATA:
  375. {
  376. const ServerData *data;
  377. ssize_t size;
  378. Window ()->DisableUpdates ();
  379. msg->FindData ("server", B_RAW_TYPE, reinterpret_cast < const void **>(&data), &size);
  380. if (msg->HasBool ("edit"))
  381. RemoveServer ();
  382. UpdateNetworkData (data);
  383. AddServer (data);
  384. Window ()->EnableUpdates ();
  385. fNetWin.SendMessage (M_SERVER_DATA_CHANGED);
  386. }
  387. break;
  388. default:
  389. BView::MessageReceived (msg);
  390. break;
  391. }
  392. }