* Added an experimental new "portal view" to the room list options
authorArt Cancro <ajc@citadel.org>
Sat, 3 May 2003 04:52:32 +0000 (04:52 +0000)
committerArt Cancro <ajc@citadel.org>
Sat, 3 May 2003 04:52:32 +0000 (04:52 +0000)
webcit/ChangeLog
webcit/roomops.c
webcit/webcit.c
webcit/webcit.h

index fa7f5940957a79072531791642b447e8508272e6..4eb8ca383be6c0a0ed5990c831b703b78919552d 100644 (file)
@@ -1,4 +1,7 @@
 $Log$
+Revision 410.19  2003/05/03 04:52:32  ajc
+* Added an experimental new "portal view" to the room list options
+
 Revision 410.18  2003/05/02 03:23:41  ajc
 * Minor change to room list algorithm
 
@@ -1358,3 +1361,4 @@ Sun Dec  6 19:50:55 EST 1998 Art Cancro <ajc@uncnsrd.mt-kisco.ny.us>
 
 1998-12-03 Nathan Bryant <bryant@cs.usm.maine.edu>
        * webserver.c: warning fix
+
index a2c1f8f4ded2f4b8371d5e51e52cbae96a1a3082..31d7f0df3f4970af67bd599f6b5ac51aa6bc6135 100644 (file)
 #include <signal.h>
 #include "webcit.h"
 
+struct folder {
+       int floor;
+       char room[SIZ];
+       char name[SIZ];
+       int hasnewmsgs;
+       int is_mailbox;
+       int selectable;
+};
 
 char *viewdefs[] = {
        "Messages",
@@ -207,18 +215,11 @@ void listrms(char *variety)
 }
 
 
-
-
-
-
-
-
-
 /*
  * list all rooms by floor (only should get called from knrooms() because
  * that's where output_headers() is called from)
  */
-void list_all_rooms_by_floor(void)
+void tabular_room_list(void)
 {
        int a;
        char buf[SIZ];
@@ -262,6 +263,13 @@ void list_all_rooms_by_floor(void)
 }
 
 
+
+
+
+
+
+
+
 /*
  * list all forgotten rooms
  */
@@ -1799,32 +1807,160 @@ void change_view(void) {
 
 
 /*
- * Show the room list in "folders" format.  (only should get called by
- * knrooms() because that's where output_headers() is called from)
+ * One big expanded tree list view --- like a folder list
  */
-void folders(void) {
+void do_folder_view(struct folder *fold, int max_folders, int num_floors) {
        char buf[SIZ];
+       int levels, oldlevels;
+       int nests = 0;
+       int i, k, t;
+
+       /* Output */
+       nests = 0;
+       levels = 0;
+       oldlevels = 0;
+       for (i=0; i<max_folders; ++i) {
+
+               levels = num_tokens(fold[i].name, '|');
+               if (levels > oldlevels) {
+                       for (k=0; k<(levels-oldlevels); ++k) {
+                               ++nests;
+                       }
+               }
+               if (levels < oldlevels) {
+                       for (k=0; k<(oldlevels-levels); ++k) {
+                               --nests;
+                       }
+               }
+               oldlevels = levels;
 
+               for (t=0; t<nests; ++t) wprintf("&nbsp;&nbsp;&nbsp;");
+               if (fold[i].selectable) {
+                       wprintf("<A HREF=\"/dotgoto?room=");
+                       urlescputs(fold[i].room);
+                       wprintf("\">");
+               }
+               else {
+                       wprintf("<i>");
+               }
+               if (fold[i].hasnewmsgs) wprintf("<B>");
+               extract(buf, fold[i].name, levels-1);
+               escputs(buf);
+               if (fold[i].hasnewmsgs) wprintf("</B>");
+               if (fold[i].selectable) {
+                       wprintf("</A>");
+               }
+               else {
+                       wprintf("</i>");
+               }
+               if (!strcasecmp(fold[i].name, "My Folders|Mail")) {
+                       wprintf(" (INBOX)");
+               }
+               wprintf("<BR>\n");
+       }
+       while (nests-- > 0) ;; 
+}
+
+/*
+ * Boxes and rooms and lists ... oh my!
+ */
+void do_rooms_view(struct folder *fold, int max_folders, int num_floors) {
+       char buf[SIZ];
        int levels, oldlevels;
-       int swap = 0;
+       int nests = 0;
+       int i, k, t;
+       int num_boxes = 0;
+       int boxes_per_column = 0;
+
+       boxes_per_column = (num_floors / 3);    /* three columns */
+       if (boxes_per_column < 1) boxes_per_column = 1;
+
+       /* Outer table (for columnization) */
+       wprintf("<TABLE BORDER=0 WIDTH=100%% CELLPADDING=5>"
+               "<TR><TD VALIGN=TOP>");
+
+       nests = 0;
+       levels = 0;
+       oldlevels = 0;
+       for (i=0; i<max_folders; ++i) {
+
+               levels = num_tokens(fold[i].name, '|');
+               if (levels > oldlevels) {
+                       for (k=0; k<(levels-oldlevels); ++k) {
+                               ++nests;
+                       }
+               }
+               if (levels < oldlevels) {
+                       for (k=0; k<(oldlevels-levels); ++k) {
+                               --nests;
+                       }
+               }
+
+               if ((levels == 1) && (oldlevels == 2)) {
+
+                       /* End inner box */
+                       wprintf("</TD></TR></TABLE><BR>\n");
+
+                       ++num_boxes;
+                       if ((num_boxes % boxes_per_column) == 0) {
+                               wprintf("</TD><TD VALIGN=TOP>\n");
+                       }
+               }
 
-       struct folder {
-               char room[SIZ];
-               char name[SIZ];
-               int hasnewmsgs;
-               int is_mailbox;
-               int selectable;
-       };
+               if (levels == 1) {
+                       /* Begin inner box */
+                       wprintf("<TABLE border=1 WIDTH=100%%><TR><TD>");
+               }
+
+
+               oldlevels = levels;
+
+               for (t=0; t<nests; ++t) wprintf("&nbsp;&nbsp;&nbsp;");
+               if (fold[i].selectable) {
+                       wprintf("<A HREF=\"/dotgoto?room=");
+                       urlescputs(fold[i].room);
+                       wprintf("\">");
+               }
+               else {
+                       wprintf("<i>");
+               }
+               if (fold[i].hasnewmsgs) wprintf("<B>");
+               extract(buf, fold[i].name, levels-1);
+               escputs(buf);
+               if (fold[i].hasnewmsgs) wprintf("</B>");
+               if (fold[i].selectable) {
+                       wprintf("</A>");
+               }
+               else {
+                       wprintf("</i>");
+               }
+               if (!strcasecmp(fold[i].name, "My Folders|Mail")) {
+                       wprintf(" (INBOX)");
+               }
+               wprintf("<BR>\n");
+       }
+       while (nests-- > 0) ;; 
+
+       wprintf("</TD></TR></TABLE>\n");
+}
+
+
+/*
+ * Show the room list.  (only should get called by
+ * knrooms() because that's where output_headers() is called from)
+ */
 
+void list_all_rooms_by_floor(char *viewpref) {
+       char buf[SIZ];
+       int swap = 0;
        struct folder *fold = NULL;
        struct folder ftmp;
        int max_folders = 0;
        int alloc_folders = 0;
-       int i, j, k, t;
+       int i, j;
        int ra_flags = 0;
        int flags = 0;
-       int floor;
-       int nests = 0;
+       int num_floors = 1;     /* add an extra one for private folders */
 
        /* Start with the mailboxes */
        max_folders = 1;
@@ -1846,6 +1982,7 @@ void folders(void) {
                memset(&fold[max_folders], 0, sizeof(struct folder));
                extract(fold[max_folders].name, buf, 1);
                ++max_folders;
+               ++num_floors;
        }
 
        /* Now add rooms */
@@ -1861,7 +1998,7 @@ void folders(void) {
                extract(fold[max_folders].room, buf, 0);
                ra_flags = extract_int(buf, 5);
                flags = extract_int(buf, 1);
-               floor = extract_int(buf, 2);
+               fold[max_folders].floor = extract_int(buf, 2);
                fold[max_folders].hasnewmsgs =
                        ((ra_flags & UA_HASNEWMSGS) ? 1 : 0 );
                if (flags & QR_MAILBOX) {
@@ -1869,7 +2006,7 @@ void folders(void) {
                }
                room_to_folder(fold[max_folders].name,
                                fold[max_folders].room,
-                               floor,
+                               fold[max_folders].floor,
                                fold[max_folders].is_mailbox);
                fold[max_folders].selectable = 1;
                ++max_folders;
@@ -1900,50 +2037,12 @@ void folders(void) {
                }
        }
 
-       /* Output */
-       nests = 0;
-       levels = 0;
-       oldlevels = 0;
-       for (i=0; i<max_folders; ++i) {
-
-               levels = num_tokens(fold[i].name, '|');
-               if (levels > oldlevels) {
-                       for (k=0; k<(levels-oldlevels); ++k) {
-                               ++nests;
-                       }
-               }
-               if (levels < oldlevels) {
-                       for (k=0; k<(oldlevels-levels); ++k) {
-                               --nests;
-                       }
-               }
-               oldlevels = levels;
-
-               for (t=0; t<nests; ++t) wprintf("&nbsp;&nbsp;&nbsp;");
-               if (fold[i].selectable) {
-                       wprintf("<A HREF=\"/dotgoto?room=");
-                       urlescputs(fold[i].room);
-                       wprintf("\">");
-               }
-               else {
-                       wprintf("<i>");
-               }
-               if (fold[i].hasnewmsgs) wprintf("<B>");
-               extract(buf, fold[i].name, levels-1);
-               escputs(buf);
-               if (fold[i].hasnewmsgs) wprintf("</B>");
-               if (fold[i].selectable) {
-                       wprintf("</A>");
-               }
-               else {
-                       wprintf("</i>");
-               }
-               if (!strcasecmp(fold[i].name, "My Folders|Mail")) {
-                       wprintf(" (INBOX)");
-               }
-               wprintf("<BR>\n");
+       if (!strcasecmp(viewpref, "folders")) {
+               do_folder_view(fold, max_folders, num_floors);
+       }
+       else {
+               do_rooms_view(fold, max_folders, num_floors);
        }
-       while (nests-- > 0) ;; 
 
        free(fold);
        wDumpContent(1);
@@ -1968,7 +2067,8 @@ void knrooms() {
 
        get_preference("roomlistview", listviewpref);
 
-       if (strcasecmp(listviewpref, "folders")) {
+       if ( (strcasecmp(listviewpref, "folders"))
+          && (strcasecmp(listviewpref, "boxes")) ) {
                strcpy(listviewpref, "rooms");
        }
 
@@ -1979,6 +2079,9 @@ void knrooms() {
        if (!strcasecmp(listviewpref, "rooms")) {
                wprintf("Room list");
        }
+       if (!strcasecmp(listviewpref, "boxes")) {
+               wprintf("Room list");
+       }
        if (!strcasecmp(listviewpref, "folders")) {
                wprintf("Folder list");
        }
@@ -2003,15 +2106,21 @@ void knrooms() {
                ( !strcasecmp(listviewpref, "folders") ? "SELECTED" : "" )
        );
 
+       wprintf("<OPTION %s VALUE=\"/knrooms&view=boxes\">"
+               "View as portal"
+               "</OPTION>\n",
+               ( !strcasecmp(listviewpref, "boxes") ? "SELECTED" : "" )
+       );
+
        wprintf("</SELECT></FORM></TD><TD>\n");
        offer_start_page();
        wprintf("</TD></TR></TABLE><BR>\n");
 
        /* Display the room list in the user's preferred format */
-       if (!strcasecmp(listviewpref, "folders")) {
-               folders();
+       if (!strcasecmp(listviewpref, "rooms")) {
+               tabular_room_list();
        }
        else {
-               list_all_rooms_by_floor();
+               list_all_rooms_by_floor(listviewpref);
        }
 }
index fc7931ebbd69045e26cb87a52e1f78fc9f9afcaa..30374d37b6bd3263785ad7ffccd7c7c6c22fecb7 100644 (file)
@@ -1112,8 +1112,6 @@ void session_loop(struct httprequest *req)
                create_user();
        } else if (!strcasecmp(action, "changeview")) {
                change_view();
-       } else if (!strcasecmp(action, "folders")) {
-               folders();
        } else if (!strcasecmp(action, "do_stuff_to_msgs")) {
                do_stuff_to_msgs();
        } else if (!strcasecmp(action, "change_start_page")) {
index ead83e788edd983d5038dcb68dca586fc51015d3..e1211c851a7a6b52917b5c2aebe117d163edd7bf 100644 (file)
@@ -242,7 +242,6 @@ void do_welcome(void);
 void do_logout(void);
 void display_main_menu(void);
 void display_advanced_menu(void);
-void list_all_rooms_by_floor(void);
 void slrp_highest(void);
 void gotonext(void);
 void ungoto(void);