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