X-Git-Url: https://code.citadel.org/?p=citadel.git;a=blobdiff_plain;f=webcit%2Ficonbar.c;h=e1ea9b0ec6cd3907d25f4031d314d6d639abe0a0;hp=ee856489066b01c6bf3808378a399bcb9849d0ba;hb=HEAD;hpb=cb549e62779e6f741880a061dbd268f0b4abb937 diff --git a/webcit/iconbar.c b/webcit/iconbar.c index ee8564890..e1ea9b0ec 100644 --- a/webcit/iconbar.c +++ b/webcit/iconbar.c @@ -1,45 +1,77 @@ /* - * $Id$ - * * Displays and customizes the iconbar. + * + * Copyright (c) 1996-2012 by the citadel.org team + * + * This program is open source software. You can redistribute it and/or + * modify it under the terms of the GNU General Public License, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. */ #include "webcit.h" - -/** Values for ib_displayas */ -#define IB_PICTEXT 0 /**< picture and text */ -#define IB_PICONLY 1 /**< just a picture */ -#define IB_TEXTONLY 2 /**< just text */ - - -void do_iconbar(void); -void do_iconbar_roomlist(void); - -/* - * Render the left side iconbar - */ -void do_selected_iconbar(void) { - if (WC->current_iconbar == current_iconbar_roomlist) { - do_iconbar_roomlist(); - } - else { - do_iconbar(); - } -} +/* Values for ib_displayas ... don't change these or you will break the templates */ +#define IB_PICTEXT 0 /* picture and text */ +#define IB_PICONLY 1 /* just a picture */ +#define IB_TEXTONLY 2 /* just text */ void DontDeleteThis(void *Data){} #define IconbarIsEnabled(a, b) IconbarIsENABLED(a, sizeof(a) - 1, b) -long IconbarIsENABLED(const char *key, size_t keylen, long defval) + +HashList *IB_Seeting_Order = NULL; +typedef struct _dflt_IB_Setting { + int DefVal; /* default value for non-set users */ + long n; /* counter for internal purposes */ + const char *Key; /* Stringvalue */ + long len; /* Length... */ +}dflt_IB_Setting; + +long nIBV = 0; +dflt_IB_Setting IconbarDefaults[] = { + {0, 0, HKEY("unused")}, + {0, 1, HKEY("ib_displayas")}, + {0, 2, HKEY("ib_logo")}, + {1, 3, HKEY("ib_summary")}, + {1, 4, HKEY("ib_inbox")}, + {1, 5, HKEY("ib_calendar")}, + {1, 6, HKEY("ib_contacts")}, + {1, 7, HKEY("ib_notes")}, + {1, 8, HKEY("ib_tasks")}, + {1, 9, HKEY("ib_rooms")}, + {1, 10, HKEY("ib_users")}, + {1, 11, HKEY("ib_chat")}, + {1, 12, HKEY("ib_advanced")}, + {1, 13, HKEY("ib_logoff")}, + {1, 14, HKEY("ib_citadel")}, + {0, 15, HKEY("")} +}; + +HashList *IBDfl = NULL; + + +long IconbarIsENABLED(long val, const char *key, size_t keylen) { - void *Data; - if (GetHash(WC->IconBarSetttings, key, keylen, - &Data)) - return (long) Data; + void *vIBDfl = NULL; + wcsession *WCC = WC; + + if ((WCC != NULL) && + (WCC->IBSettingsVec != NULL) && + (val < nIBV)) + { + return WCC->IBSettingsVec[val]; + } + if (GetHash(IBDfl, key, keylen, &vIBDfl)) { + dflt_IB_Setting *Set = (dflt_IB_Setting*)vIBDfl; + return Set->DefVal; + } else - return defval; + return 1; } #ifdef DBG_ICONBAR_HASH @@ -51,711 +83,87 @@ inline const char *PrintInt(void *Prefstr) } #endif -void LoadIconSettings(void) -{ - wcsession *WCC = WC; - StrBuf *iconbar = NULL; - StrBuf *buf; - StrBuf *key; - long val; - int i, nTokens; - - buf = NewStrBuf();; - key = NewStrBuf(); - WCC->current_iconbar = current_iconbar_menu; - if (WCC->IconBarSetttings == NULL) - WCC->IconBarSetttings = NewHash(1, NULL); - /** - * The initialized values of these variables also happen to - * specify the default values for users who haven't customized - * their iconbars. These should probably be set in a master - * configuration somewhere. - */ +/* + hprintf("Cache-Control: private\r\n"); +*/ - if (get_preference("iconbar", &iconbar)) { - nTokens = StrBufNum_tokens(iconbar, ','); - for (i=0; iIconBarSetttings, - ChrPtr(key), StrLength(key), - (void*)val, DontDeleteThis); - } - } -#ifdef DBG_ICONBAR_HASH - dbg_PrintHash(WCC->IconBarSetttings, PrintInt, NULL); -#endif +int ConditionalIsActiveStylesheet(StrBuf *Target, WCTemplputParams *TP) { + long testFor; + long lookAt; + long ib_displayas; - FreeStrBuf(&key); - FreeStrBuf(&buf); -} + lookAt = GetTemplateTokenNumber(Target, TP, 3, IB_PICTEXT); + testFor = GetTemplateTokenNumber(Target, TP, 2, IB_PICTEXT); -/** - * \brief draw the icon bar??? - */ -void do_iconbar(void) { - int ib_displayas = IB_PICTEXT; /**< pictures and text, pictures, text */ - - LoadIconSettings(); - ib_displayas = IconbarIsEnabled("ib_displayas", IB_PICTEXT); - -/** Site logo */ - if (IconbarIsEnabled("ib_logo", 0)) { - if (ib_displayas != IB_TEXTONLY) { - wprintf("
\" \" " - "
\n" - ); - } - wprintf("\n"); - } - -/** 'Powered by Citadel' logo */ - if (IconbarIsEnabled("ib_citadel", 1) && (ib_displayas != IB_TEXTONLY)) wprintf( - "
" - " " - "\"%s\" " - "
\n", - _("Find out more about Citadel"), - _("CITADEL") - ); - - wprintf("\n"); - - if (IconbarIsEnabled("ib_users", 0)) { - StrBufAppendPrintf(WC->trailing_javascript, - "new Ajax.PeriodicalUpdater('wholist', 'do_template?template=wholist_section', " - "{ method: 'get', frequency: 30 } ); \n" - ); - } + return (testFor == ib_displayas); } +void LoadIconSettings(StrBuf *iconbar, long lvalue) +{ + void *vIBDfl; + dflt_IB_Setting *Set; + const char *pCh = NULL; -/** - * \brief roomtree view of the iconbar - * If the user has toggled the icon bar over to a room list, here's where - * we generate its innerHTML... - */ -void do_iconbar_roomlist(void) { - int ib_displayas; - - WC->current_iconbar = current_iconbar_roomlist; + wcsession *WCC = WC; + StrBuf *buf; + StrBuf *key; + long val; - /** + buf = NewStrBuf(); + key = NewStrBuf(); + if (WCC->IBSettingsVec == NULL) + { + WCC->IBSettingsVec = (long*) malloc (nIBV * sizeof(long)); + } + /* * The initialized values of these variables also happen to * specify the default values for users who haven't customized * their iconbars. These should probably be set in a master * configuration somewhere. */ - LoadIconSettings(); + while (StrBufExtract_NextToken(buf, iconbar, &pCh, ',') >= 0) + { + StrBufExtract_token(key, buf, 0, '='); + val = StrBufExtract_long(buf, 1, '='); - ib_displayas = IconbarIsEnabled("ib_displayas", IB_PICTEXT); /* pictures and text, pictures, text */ - -/** Site logo */ - if (IconbarIsEnabled("ib_logo", 0)) { - if (ib_displayas != IB_TEXTONLY) { - wprintf("
\" \" " - "
\n" - ); - } - } + if (!GetHash(IBDfl, SKEY(key), &vIBDfl)) + continue; + Set = (dflt_IB_Setting*)vIBDfl; -/** 'Powered by Citadel' logo */ - if (IconbarIsEnabled("ib_citadel", 1) && (ib_displayas != IB_TEXTONLY)) wprintf( - "
" - " " - "\"%s\" " - "
\n", - _("Find out more about Citadel"), - _("CITADEL") - ); - - wprintf("\n"); - - /** embed the room list */ - list_all_rooms_by_floor("iconbar"); +#ifdef DBG_ICONBAR_HASH + dbg_PrintHash(WCC->IconBarSetttings, PrintInt, NULL); +#endif - wprintf("\n"); + FreeStrBuf(&key); + FreeStrBuf(&buf); } -/** - * \brief display a customized version of the iconbar - */ -void display_customize_iconbar(void) { - int i; - int bar = 0; - long val; - - int ib_displayas; - - LoadIconSettings(); - - output_headers(1, 1, 2, 0, 0, 0); - wprintf("
"); - wprintf("

"); - wprintf(_("Customize the icon bar")); - wprintf("

\n"); - - wprintf("
\n"); - - wprintf("
"); - - wprintf("
\n"); - wprintf("\n", WC->nonce); - - wprintf("\n"); - wprintf("\n"); - - bar = 1 - bar; - val = IconbarIsEnabled("ib_logo", 0); - wprintf("\n", - (bar ? "even" : "odd"), - (val ? "CHECKED" : ""),_("Yes"), - (!val ? "CHECKED" : ""),_("No"), - _("Site logo"), - _("An icon describing this site") - ); - - bar = 1 - bar; - val = IconbarIsEnabled("ib_summary", 1); - wprintf("\n", - (bar ? "even" : "odd"), - (val ? "CHECKED" : ""),_("Yes"), - (!val ? "CHECKED" : ""),_("No"), - _("Summary"), - _("Your summary page") - ); - - bar = 1 - bar; - val = IconbarIsEnabled("ib_inbox", 1); - wprintf("\n", - (bar ? "even" : "odd"), - (val ? "CHECKED" : ""),_("Yes"), - (!val ? "CHECKED" : ""),_("No"), - _("Mail (inbox)"), - _("A shortcut to your email Inbox") - ); - - bar = 1 - bar; - val = IconbarIsEnabled("ib_contacts", 1); - wprintf("\n", - (bar ? "even" : "odd"), - (val ? "CHECKED" : ""),_("Yes"), - (!val ? "CHECKED" : ""),_("No"), - _("Contacts"), - _("Your personal address book") - ); - - bar = 1 - bar; - val = IconbarIsEnabled("ib_notes", 1); - wprintf("\n", - (bar ? "even" : "odd"), - (val ? "CHECKED" : ""),_("Yes"), - (!val ? "CHECKED" : ""),_("No"), - _("Notes"), - _("Your personal notes") - ); - - bar = 1 - bar; - val = IconbarIsEnabled("ib_calendar", 1); - wprintf("\n", - (bar ? "even" : "odd"), - (val ? "CHECKED" : ""),_("Yes"), - (!val ? "CHECKED" : ""),_("No"), - _("Calendar"), - _("A shortcut to your personal calendar") - ); - - bar = 1 - bar; - val = IconbarIsEnabled("ib_tasks", 1); - wprintf("\n", - (bar ? "even" : "odd"), - (val ? "CHECKED" : ""),_("Yes"), - (!val ? "CHECKED" : ""),_("No"), - _("Tasks"), - _("A shortcut to your personal task list") - ); - - bar = 1 - bar; - val = IconbarIsEnabled("ib_rooms", 1); - wprintf("\n", - (bar ? "even" : "odd"), - (val ? "CHECKED" : ""),_("Yes"), - (!val ? "CHECKED" : ""),_("No"), - _("Rooms"), - _("Clicking this icon displays a list of all accessible " - "rooms (or folders) available.") - ); - - bar = 1 - bar; - val = IconbarIsEnabled("ib_users", 1); - wprintf("\n", - (bar ? "even" : "odd"), - (val ? "CHECKED" : ""),_("Yes"), - (!val ? "CHECKED" : ""),_("No"), - ((val > 1) ? "CHECKED" : ""),_("Yes with users list"), - _("Who is online?"), - _("Clicking this icon displays a list of all users " - "currently logged in.") - ); - - bar = 1 - bar; - val = IconbarIsEnabled("ib_chat", 1); - wprintf("\n", - (bar ? "even" : "odd"), - (val ? "CHECKED" : ""),_("Yes"), - (!val ? "CHECKED" : ""),_("No"), - _("Chat"), - _("Clicking this icon enters real-time chat mode " - "with other users in the same room.") - - ); - - bar = 1 - bar; - val = IconbarIsEnabled("ib_advanced", 1); - wprintf("\n", - (bar ? "even" : "odd"), - (val ? "CHECKED" : ""),_("Yes"), - (!val ? "CHECKED" : ""),_("No"), - _("Advanced options"), - _("Access to the complete menu of Citadel functions.") - - ); - - bar = 1 - bar; - val = IconbarIsEnabled("ib_citadel", 1); - wprintf("\n", - (bar ? "even" : "odd"), - (val ? "CHECKED" : ""),_("Yes"), - (!val ? "CHECKED" : ""),_("No"), - _("Citadel logo"), - _("Displays the 'Powered by Citadel' icon") - ); - - wprintf("
"); - wprintf(_("Display icons as:")); - wprintf(""); - ib_displayas = IconbarIsEnabled("ib_displayas",IB_PICTEXT); - for (i=0; i<=2; ++i) { - wprintf(""); - if (i == IB_PICTEXT) wprintf(_("pictures and text")); - if (i == IB_PICONLY) wprintf(_("pictures only")); - if (i == IB_TEXTONLY) wprintf(_("text only")); - wprintf("\n"); - } - wprintf("
\n"); - - wprintf(_("Select the icons you would like to see displayed " - "in the 'icon bar' menu on the left side of the " - "screen.")); - wprintf("
" - " %s    " - " %s
" - "
" - "\" \"" - "" - "%s
" - "%s" - "
" - " %s    " - " %s
" - "
" - "\" \"" - "" - "%s
" - "%s" - "
" - " %s    " - " %s
" - "
" - "\" \"" - "" - "%s
" - "%s" - "
" - " %s    " - " %s
" - "
" - "\" \"" - "" - "%s
" - "%s" - "
" - " %s    " - " %s
" - "
" - "\" \"" - "" - "%s
" - "%s" - "
" - " %s    " - " %s
" - "
" - "\" \"" - "" - "%s
" - "%s" - "
" - " %s    " - " %s
" - "
" - "\" \"" - "" - "%s
" - "%s" - "
" - " %s    " - " %s
" - "
" - "\" \"" - "" - "%s
" - "%s" - "
" - " %s    " - " %s
" - " %s" - "
" - "\" \"" - "" - "%s" - "
%s" - "
" - " %s    " - " %s
" - "
" - "\" \"" - "" - "%s
" - "%s" - "
" - " %s    " - " %s
" - "
" - "\" \"" - "" - "%s
" - "%s" - "
" - " %s    " - " %s
" - "
" - "\" \"" - "" - "%s
" - "%s" - "

\n" - "
" - "" - " " - "" - "
\n", - _("Save changes"), - _("Cancel") - ); - - wprintf("
\n"); - wDumpContent(2); -} - -/** - * \brief commit the changes of an edited iconbar ???? +/* + * save changes to iconbar settings */ void commit_iconbar(void) { + const StrBuf *MimeType; StrBuf *iconbar; StrBuf *buf; int i; - char *boxen[] = { - "ib_logo", - "ib_summary", - "ib_inbox", - "ib_calendar", - "ib_contacts", - "ib_notes", - "ib_tasks", - "ib_rooms", - "ib_users", - "ib_chat", - "ib_advanced", - "ib_logoff", - "ib_citadel" - }; if (!havebstr("ok_button")) { display_main_menu(); @@ -765,69 +173,171 @@ void commit_iconbar(void) { iconbar = NewStrBuf(); buf = NewStrBuf(); StrBufPrintf(iconbar, "ib_displayas=%d", ibstr("ib_displayas")); - for (i=0; i<(sizeof(boxen)/sizeof(char *)); ++i) { + for (i=0; i<(sizeof(IconbarDefaults)/sizeof(dflt_IB_Setting )); ++i) { char *Val; - if (!strcasecmp(BSTR(boxen[i]), "yes")) { + if (!strcasecmp(Bstr(IconbarDefaults[i].Key, + IconbarDefaults[i].len), + "yes")) + { Val = "1"; } - else if (!strcasecmp(BSTR(boxen[i]), "yeslist")) { + else if (!strcasecmp(Bstr(IconbarDefaults[i].Key, + IconbarDefaults[i].len), + "yeslist")) + { Val = "2"; } else { Val = "0"; } - StrBufPrintf(buf, ",%s=%s", boxen[i], Val); + StrBufPrintf(buf, ",%s=%s", IconbarDefaults[i].Key, Val); StrBufAppendBuf(iconbar, buf, 0); } FreeStrBuf(&buf); set_preference("iconbar", iconbar, 1); - output_headers(1, 1, 2, 0, 0, 0); - wprintf("
\n"); - wprintf("

"); - wprintf(_("Customize the icon bar")); - wprintf("

\n"); - - wprintf("
\n"); - wprintf( - "
" - "" - " "); - wprintf(_("Your icon bar has been updated. Please select any of its " - "choices to continue.")); - wprintf("
\n"); - wDumpContent(2); + + begin_burst(); + MimeType = DoTemplate(HKEY("iconbar_save"), NULL, &NoCtx); + http_transmit_thing(ChrPtr(MimeType), 0); #ifdef DBG_ICONBAR_HASH dbg_PrintHash(WC->IconBarSetttings, PrintInt, NULL); #endif } -void tmplput_iconbar(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *Context, int ContextType) +/* + * Display the icon bar as long as we have an active session, + * and either the user is logged in or the server allows guest mode. + */ +void tmplput_iconbar(StrBuf *Target, WCTemplputParams *TP) { wcsession *WCC = WC; - if ((WCC != NULL) && (WCC->logged_in)) { - wprintf("
"); - do_selected_iconbar(); - /** check for instant messages (these display in a new window) */ - page_popup(); - wprintf("
"); + if ( (WCC != NULL) && + ((WCC->logged_in) || + ((WCC->serv_info != NULL) && + (WCC->serv_info->serv_supports_guest)) + ) ) + { + DoTemplate(HKEY("iconbar"), NULL, &NoCtx); } } + void -InitModule_ICONBAR +ServerShutdownModule_ICONBAR (void) { - WebcitAddUrlHandler(HKEY("iconbar_ajax_menu"), do_iconbar, AJAX); - WebcitAddUrlHandler(HKEY("iconbar_ajax_rooms"), do_iconbar_roomlist, AJAX); - WebcitAddUrlHandler(HKEY("display_customize_iconbar"), display_customize_iconbar, 0); - WebcitAddUrlHandler(HKEY("commit_iconbar"), commit_iconbar, 0); - RegisterNamespace("ICONBAR", 0, 0, tmplput_iconbar, 0); + DeleteHash(&IBDfl); +} + + +void +ServerStartModule_ICONBAR +(void) +{ + int i = 1; + IBDfl = NewHash(1, NULL); + + while (IconbarDefaults[i].len != 0) + { + Put(IBDfl, + IconbarDefaults[i].Key, + IconbarDefaults[i].len, + &IconbarDefaults[i], + reference_free_handler); + i++; + } +} + + +int ConditionalWholistExpanded(StrBuf *Target, WCTemplputParams *TP) +{ + int r = 0; + if (WC) r = WC->ib_wholist_expanded; + syslog(LOG_DEBUG, "ConditionalWholistExpanded() returns %d", r); + return(r); +} + + +int ConditionalRoomlistExpanded(StrBuf *Target, WCTemplputParams *TP) +{ + if (WC) return(WC->ib_roomlist_expanded); + return(0); +} + + + +/* + * Toggle the roomlist expanded state in session memory + */ +void toggle_roomlist_expanded_state(void) { + wcsession *WCC = WC; + + if (!WCC) { + wc_printf("no session"); + return; + } + + WCC->ib_roomlist_expanded = IBSTR("wstate"); + wc_printf("%d", WCC->ib_roomlist_expanded); + syslog(LOG_DEBUG, "ib_roomlist_expanded set to %d", WCC->ib_roomlist_expanded); } -/*@}*/ +/* + * Toggle the wholist expanded state in session memory + */ +void toggle_wholist_expanded_state(void) { + wcsession *WCC = WC; + + if (!WCC) { + wc_printf("no session"); + return; + } + + WCC->ib_wholist_expanded = IBSTR("wstate"); + wc_printf("%d", WCC->ib_wholist_expanded); + syslog(LOG_DEBUG, "ib_wholist_expanded set to %d", WCC->ib_wholist_expanded); +} + + +void +InitModule_ICONBAR +(void) +{ + long l; + + /*WebcitAddUrlHandler(HKEY("user_iconbar"), "", 0, doUserIconStylesheet, 0); */ + WebcitAddUrlHandler(HKEY("commit_iconbar"), "", 0, commit_iconbar, 0); + WebcitAddUrlHandler(HKEY("toggle_wholist_expanded_state"), "", 0, toggle_wholist_expanded_state, AJAX); + WebcitAddUrlHandler(HKEY("toggle_roomlist_expanded_state"), "", 0, toggle_roomlist_expanded_state, AJAX); + RegisterConditional("COND:ICONBAR:ACTIVE", 3, ConditionalIsActiveStylesheet, CTX_NONE); + RegisterNamespace("ICONBAR", 0, 0, tmplput_iconbar, NULL, CTX_NONE); + RegisterConditional("COND:ICONBAR:WHOLISTEXPANDED", 0, ConditionalWholistExpanded, CTX_NONE); + RegisterConditional("COND:ICONBAR:ROOMLISTEXPANDED", 0, ConditionalRoomlistExpanded, CTX_NONE); + + RegisterPreference("iconbar", _("Iconbar Setting"), PRF_STRING, LoadIconSettings); + l = 1; + while (IconbarDefaults[l].len != 0) + { + RegisterTokenParamDefine(IconbarDefaults[l].Key, + IconbarDefaults[l].len, l); + l ++; + } + nIBV = l; +} + + + +void +SessionDestroyModule_ICONBAR +(wcsession *sess) +{ + if (sess->IBSettingsVec != NULL) + free(sess->IBSettingsVec); +} +