1 #include "includes.hpp"
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"
12 wxTreeItemId null_item;
23 class RoomItem : public wxTreeItemData {
25 RoomItem(wxString name, bool newmsgs, int typ);
28 wxTreeItemId nextroom;
32 RoomItem::RoomItem(wxString name, bool newmsgs, int typ)
36 HasNewMessages = newmsgs;
51 BEGIN_EVENT_TABLE(RoomTree, wxTreeCtrl)
52 EVT_LEFT_DCLICK(RoomTree::OnLeftClick)
57 BEGIN_EVENT_TABLE(RoomTree, wxTreeCtrl)
58 EVT_TREE_ITEM_ACTIVATED(ROOMTREE_CTRL, RoomTree::OnDoubleClick)
64 RoomTree::RoomTree(wxMDIParentFrame *parent, CitClient *sock)
68 wxDefaultPosition, wxDefaultSize,
69 wxTR_HAS_BUTTONS | wxSUNKEN_BORDER,
81 void RoomTree::InitTreeIcons(void) {
82 TreeIcons = new wxImageList(16, 16);
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));
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));
96 SetImageList(TreeIcons);
100 // Load a tree with a room list
102 void RoomTree::LoadRoomList(void) {
103 wxString sendcmd, recvcmd, buf, floorname, roomname, transbuf;
106 int i, pos, floornum, where;
109 unsigned int roomflags;
113 // First, clear it out.
116 for (i=0; i<MAXFLOORS; ++i)
117 floorboards[i] = (wxTreeItemId) -1;
119 // Set the root with the name of the Citadel server.
126 // Create a fake floor for all of this user's mail rooms
127 mailfloor = AppendItem(
130 1, // FIX use an envelope icon here
132 new RoomItem(citsock->curr_user, FALSE, RI_CURRUSER)
137 // Bail out silently if we can't retrieve the floor list
138 if (citsock->serv_trans(sendcmd, recvcmd, transbuf) != 1) return;
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(
154 // Load the rooms with new messages into the tree
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)
166 where = floorboards[floornum];
172 new RoomItem(roomname, TRUE, RI_ROOM)
174 SetItemBold(item, TRUE);
175 SetItemBold(floorboards[floornum], TRUE);
176 if (prev == null_item)
179 ((RoomItem *)GetItemData(prev))->nextroom = item;
183 // Load the rooms with no new messages into the tree
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)
195 where = floorboards[floornum];
201 new RoomItem(roomname, FALSE, RI_ROOM)
206 // Create a bogus floor for zapped rooms
208 zapfloor = AppendItem(
213 new RoomItem("Zapped Rooms", FALSE, RI_ZAPPED)
217 sendcmd = "LZRM"; // List Zapped RooMs
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);
232 new RoomItem(roomname, FALSE, RI_ROOM)
238 wxTreeItemId sp = AppendItem(
243 new RoomItem("Global settings", FALSE, RI_NOTHING)
246 AppendItem(sp, "Identity",
249 new RoomItem("Identity", FALSE, RI_SERVPROPS)
252 AppendItem(sp, "Network",
255 new RoomItem("Network", FALSE, RI_SERVPROPS)
258 AppendItem(sp, "Security",
261 new RoomItem("Security", FALSE, RI_SERVPROPS)
264 Expand(GetRootItem());
266 // Demo of traversal -- do not use
267 // while (march_next != null_item) {
268 // wxTreeItemId foo = GetNextRoomId();
269 // cout << ((RoomItem *)GetItemData(foo))->RoomName << "\n";
278 void RoomTree::OnLeftClick(wxTreeEvent& evt) {
280 void RoomTree::OnDoubleClick(wxTreeEvent& evt) {
286 itemId = GetSelection();
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;
293 // Ok, it's a leaf node...
294 r = (RoomItem *)GetItemData(itemId);
297 switch (r->NodeType) {
300 new RoomView(citsock, citMyMDI, r->RoomName);
301 RoomList->DeleteAllItems();
302 RoomList->LoadRoomList();
306 RoomList->DeleteAllItems();
307 RoomList->LoadRoomList();
312 if (CurrServProps == NULL) {
313 CurrServProps = new ServProps(
314 citsock, citMyMDI, r->RoomName);
316 CurrServProps->ChangePanel(r->RoomName);
323 wxString RoomTree::GetNextRoom(void) {
326 wxTreeItemId RoomId = GetNextRoomId();
327 if (RoomId == null_item) {
330 rn = ((RoomItem *)GetItemData(RoomId))->RoomName;
337 wxTreeItemId RoomTree::GetNextRoomId(void) {
343 if (march_next == null_item)
346 march_next = ((RoomItem *)GetItemData(march_next))->nextroom;