]> code.citadel.org Git - citadel.git/blob - daphne/roomtree.cpp
8bed5eb202391e4b4010fa1100ddbc926c1f307f
[citadel.git] / daphne / roomtree.cpp
1 #include "includes.hpp"
2
3 #ifdef __WXMOTIF__
4 #include "bitmaps/root.xpm"
5 #include "bitmaps/floor.xpm"
6 #include "bitmaps/newroom.xpm"
7 #include "bitmaps/oldroom.xpm"
8 #include "bitmaps/mailroom.xpm"
9 #endif
10
11
12 wxTreeItemId null_item;
13
14 enum {
15         RI_NOTHING,
16         RI_ROOM,
17         RI_CURRUSER,
18         RI_SERVPROPS
19 /*      RI_ZAPPED */
20 };
21
22
23 class RoomItem : public wxTreeItemData {
24 public:
25         RoomItem(wxString name, bool newmsgs, int typ);
26         wxString RoomName;
27         bool HasNewMessages;
28         wxTreeItemId nextroom;
29         int NodeType;
30 };
31
32 RoomItem::RoomItem(wxString name, bool newmsgs, int typ)
33         : wxTreeItemData() {
34
35         RoomName = name;
36         HasNewMessages = newmsgs;
37         nextroom = null_item;
38         NodeType = typ;
39 }
40
41
42
43
44
45 enum {
46
47         ROOMTREE_CTRL
48 };
49
50 BEGIN_EVENT_TABLE(RoomTree, wxTreeCtrl)
51         EVT_TREE_ITEM_ACTIVATED(ROOMTREE_CTRL, RoomTree::OnDoubleClick)
52 END_EVENT_TABLE()
53
54
55
56 RoomTree::RoomTree(wxMDIParentFrame *parent, CitClient *sock)
57                 : wxTreeCtrl(
58                         parent,
59                         ROOMTREE_CTRL,
60                         wxDefaultPosition, wxDefaultSize,
61                         wxTR_HAS_BUTTONS | wxSUNKEN_BORDER,
62                         wxDefaultValidator,
63                         "RoomList") {
64
65         citsock = sock;
66         citMyMDI = parent;
67         CurrServProps = NULL;
68         InitTreeIcons();
69
70 }
71
72
73 void RoomTree::InitTreeIcons(void) {
74         TreeIcons = new wxImageList(16, 16);
75 #ifdef __WXMOTIF__
76         TreeIcons->Add(*new wxBitmap(root_xpm));
77         TreeIcons->Add(*new wxBitmap(floor_xpm));
78         TreeIcons->Add(*new wxBitmap(newroom_xpm));
79         TreeIcons->Add(*new wxBitmap(oldroom_xpm));
80         TreeIcons->Add(*new wxBitmap(mailroom_xpm));
81 #else
82         TreeIcons->Add(*new wxBitmap("bitmaps/root.bmp", wxBITMAP_TYPE_BMP));
83         TreeIcons->Add(*new wxBitmap("bitmaps/floor.bmp", wxBITMAP_TYPE_BMP));
84         TreeIcons->Add(*new wxBitmap("bitmaps/newroom.bmp", wxBITMAP_TYPE_BMP));
85         TreeIcons->Add(*new wxBitmap("bitmaps/oldroom.bmp", wxBITMAP_TYPE_BMP));
86         TreeIcons->Add(*new wxBitmap("bitmaps/mailroom.bmp", wxBITMAP_TYPE_BMP));
87 #endif
88         SetImageList(TreeIcons);
89 }
90
91
92 // Load a tree with a room list
93 //
94 void RoomTree::LoadRoomList(void) {
95         wxString sendcmd, recvcmd, buf, floorname, roomname, transbuf;
96         wxTreeItemId item;
97         wxTreeItemId prev;
98         int i, pos, floornum, where;
99         int mailfloor;
100 /*      int zapfloor; */
101         unsigned int roomflags;
102
103         prev = null_item;
104
105         // First, clear it out.
106         DeleteAllItems();
107
108         for (i=0; i<MAXFLOORS; ++i)
109                 floorboards[i] = (wxTreeItemId) -1;
110
111         // Set the root with the name of the Citadel server.
112         AddRoot(
113                 citsock->HumanNode,
114                 0,
115                 -1,
116                 NULL);
117
118         // Create a fake floor for all of this user's mail rooms
119         mailfloor = AppendItem(
120                 GetRootItem(),
121                 citsock->curr_user,
122                 1,                      // FIX use an envelope icon here
123                 -1,
124                 new RoomItem(citsock->curr_user, FALSE, RI_CURRUSER)
125                 );
126
127                 
128         sendcmd = "LFLR";
129         // Bail out silently if we can't retrieve the floor list
130         if (citsock->serv_trans(sendcmd, recvcmd, transbuf) != 1) return;
131
132         // Load the floors one by one onto the tree
133         while (pos = transbuf.Find('\n', FALSE), (pos >= 0)) {
134                 buf = transbuf.Left(pos);
135                 transbuf = transbuf.Mid(pos+1);
136                 extract(floorname, buf, 1);
137                 floornum = extract_int(buf, 0);
138                 floorboards[floornum] = AppendItem(
139                         GetRootItem(),
140                         floorname,
141                         1,
142                         -1,
143                         NULL);
144         }
145
146         // Load the rooms with new messages into the tree
147         sendcmd = "LKRN";
148         if (citsock->serv_trans(sendcmd, recvcmd, transbuf) != 1) return;
149         while (pos = transbuf.Find('\n', FALSE), (pos >= 0)) {
150                 buf = transbuf.Left(pos);
151                 transbuf = transbuf.Mid(pos+1);
152                 extract(roomname, buf, 0);
153                 roomflags = extract_int(buf, 1);
154                 floornum = extract_int(buf, 2);
155                 if (roomflags & QR_MAILBOX)
156                         where = mailfloor;
157                 else
158                         where = floorboards[floornum];
159                 item = AppendItem(
160                         where,
161                         roomname,
162                         2,
163                         -1,
164                         new RoomItem(roomname, TRUE, RI_ROOM)
165                         );
166                 SetItemBold(item, TRUE);
167                 SetItemBold(floorboards[floornum], TRUE);
168                 if (prev == null_item)
169                         march_next = item;
170                 else
171                         ((RoomItem *)GetItemData(prev))->nextroom = item;
172                 prev = item;
173         }
174
175         // Load the rooms with no new messages into the tree
176         sendcmd = "LKRO";
177         if (citsock->serv_trans(sendcmd, recvcmd, transbuf) != 1) return;
178         while (pos = transbuf.Find('\n', FALSE), (pos >= 0)) {
179                 buf = transbuf.Left(pos);
180                 transbuf = transbuf.Mid(pos+1);
181                 extract(roomname, buf, 0);
182                 roomflags = extract_int(buf, 1);
183                 floornum = extract_int(buf, 2);
184                 if (roomflags & QR_MAILBOX)
185                         where = mailfloor;
186                 else
187                         where = floorboards[floornum];
188                 AppendItem(
189                         where,
190                         roomname,
191                         3,
192                         -1,
193                         new RoomItem(roomname, FALSE, RI_ROOM)
194                         );
195         }
196
197
198 /*      // Create a bogus floor for zapped rooms
199
200         zapfloor = AppendItem(
201                 GetRootItem(),
202                 "Zapped Rooms",
203                 1,
204                 -1,
205                 new RoomItem("Zapped Rooms", FALSE, RI_ZAPPED)
206                 );
207
208
209         sendcmd = "LZRM"; // List Zapped RooMs
210
211         if (citsock->serv_trans(sendcmd, recvcmd, transbuf) != 1) return;
212         while (pos = transbuf.Find('\n', FALSE), (pos >= 0)) {
213                 buf = transbuf.Left(pos);
214                 transbuf = transbuf.Mid(pos+1);
215                 extract(roomname, buf, 0);
216                 roomflags = extract_int(buf, 1);
217                 floornum = extract_int(buf, 2);
218                         where = zapfloor;
219                 AppendItem(
220                         where,
221                         roomname,
222                         4,
223                         -1,
224                         new RoomItem(roomname, FALSE, RI_ROOM)
225                         );
226         }
227
228 */
229
230         wxTreeItemId sp = AppendItem(
231                 GetRootItem(),
232                 "Global settings",
233                 -1,
234                 -1,
235                 new RoomItem("Global settings", FALSE, RI_NOTHING)
236                 );
237
238         AppendItem(sp, "Identity", 
239                 -1,
240                 -1,
241                 new RoomItem("Identity", FALSE, RI_SERVPROPS)
242                 );
243
244         AppendItem(sp, "Network", 
245                 -1,
246                 -1,
247                 new RoomItem("Network", FALSE, RI_SERVPROPS)
248                 );
249
250         AppendItem(sp, "Security", 
251                 -1,
252                 -1,
253                 new RoomItem("Security", FALSE, RI_SERVPROPS)
254                 );
255
256         Expand(GetRootItem());
257
258         // Demo of traversal -- do not use
259         // while (march_next != null_item) {
260         //      wxTreeItemId foo = GetNextRoomId();
261         //      cout << ((RoomItem *)GetItemData(foo))->RoomName << "\n";
262         //}
263
264
265 }
266
267
268
269
270 void RoomTree::OnDoubleClick(wxTreeEvent& evt) {
271         wxTreeItemId itemId;
272         int i;
273         RoomItem *r;
274
275         itemId = GetSelection();
276
277         // Don't do this unless it's a leaf node the user clicked on.
278         if (itemId == GetRootItem()) return;
279         for (i=0; i<MAXFLOORS; ++i)
280                 if (itemId == floorboards[i]) return;
281
282         // Ok, it's a leaf node...
283         r = (RoomItem *)GetItemData(itemId);
284
285         switch (r->NodeType) {
286
287         case RI_ROOM:
288                 new RoomView(citsock, citMyMDI, r->RoomName);
289                 RoomList->DeleteAllItems();
290                 RoomList->LoadRoomList();
291                 break;
292
293 /*      case RI_ZAPPED:
294                 RoomList->DeleteAllItems();
295                 RoomList->LoadRoomList(); 
296                 break; */
297
298
299         case RI_SERVPROPS:
300                 if (CurrServProps == NULL) {
301                         CurrServProps = new ServProps(
302                                 citsock, citMyMDI, r->RoomName);
303                 } else {
304                         CurrServProps->ChangePanel(r->RoomName);
305                 }
306                 break;
307
308         }
309 }
310
311 wxString RoomTree::GetNextRoom(void) {
312         wxString rn;
313
314         wxTreeItemId RoomId = GetNextRoomId();
315         if (RoomId == null_item) {
316                 rn = "_BASEROOM_";
317         } else {
318                 rn = ((RoomItem *)GetItemData(RoomId))->RoomName;
319         }
320         return rn;
321 }
322
323
324
325 wxTreeItemId RoomTree::GetNextRoomId(void) {
326
327         wxTreeItemId ret;
328
329         ret = march_next;
330
331         if (march_next == null_item)
332                 LoadRoomList();
333         else
334                 march_next = ((RoomItem *)GetItemData(march_next))->nextroom;
335
336         return ret;
337 }
338
339