* fix dropdown
authorWilfried Göesgens <willi@citadel.org>
Wed, 24 Dec 2008 10:46:20 +0000 (10:46 +0000)
committerWilfried Göesgens <willi@citadel.org>
Wed, 24 Dec 2008 10:46:20 +0000 (10:46 +0000)
* demand url parameters on goto* and friends
* add function to overwrite url params
* adjust the actual url so we don't gotonext on selecting s.th. from the dropdown

webcit/debian/rules
webcit/messages.c
webcit/msg_renderers.c
webcit/paramhandling.c
webcit/roomops.c
webcit/static/t/msg_listselector_bottom.html
webcit/static/t/msg_listselector_top.html
webcit/subst.c
webcit/webcit.h

index c837f23f917a0df3a7e1d5bd76b5a5d457316d5b..cea5888c32a41c50a65f3815cd872953296d44ba 100755 (executable)
@@ -19,7 +19,7 @@ ifneq (,$(findstring profiling,$(DEB_BUILD_OPTIONS)))
        PROFILE_ARGS= --with-gprof
 endif
 ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS)))
-       CFLAGS += -O0 -ggdb -rdynamic -MD -MP -D TECH_PREVIEW
+       CFLAGS += -O0 -ggdb -rdynamic -MD -MP -D TECH_PREVIEW -pedantic
        LDFLAGS += -pg 
        EXTRA_ARGS =  --with-backtrace
 else
index c159a055acf38399a4e693eafde6051224bf61ec..3291e45ac3fc4a0f9c9219e6865fc2b39936e3e5 100644 (file)
@@ -480,7 +480,7 @@ inline message_summary* GetMessagePtrAt(int n, HashList *Summ)
 }
 
 
-void DrawMessageDropdown(StrBuf *Selector, long maxmsgs, long startmsg)
+long DrawMessageDropdown(StrBuf *Selector, long maxmsgs, long startmsg)
 {
        StrBuf *TmpBuf;
        wcsession *WCC = WC;
@@ -488,6 +488,7 @@ void DrawMessageDropdown(StrBuf *Selector, long maxmsgs, long startmsg)
        int lo, hi, n;
        int i = 0;
        long StartMsg = 0;
+       long ret;
        void *vMsg;
        long hklen;
        const char *key;
@@ -495,12 +496,12 @@ void DrawMessageDropdown(StrBuf *Selector, long maxmsgs, long startmsg)
        int nItems;
        HashPos *At;
        long vector[16];
-       int nMessages = DEFAULT_MAXMSGS;
+       int nMessages = (lbstr("SortOrder") == 1)? DEFAULT_MAXMSGS : -DEFAULT_MAXMSGS;
 
        TmpBuf = NewStrBuf();
-       At = GetNewHashPos(WCC->summ, (lbstr("SortOrder") == 1)? -nMessages : nMessages);
+       At = GetNewHashPos(WCC->summ, nMessages);
        nItems = GetCount(WCC->summ);
-       
+       ret = abs(nMessages);
        vector[0] = 7;
        vector[1] = startmsg;
        vector[2] = maxmsgs;
@@ -509,21 +510,38 @@ void DrawMessageDropdown(StrBuf *Selector, long maxmsgs, long startmsg)
 
        while (!done) {
                lo = GetHashPosCounter(At);
-               if (lo + nMessages > nItems) {
-                       hi = nItems;
-               }
-               else {
-                       hi = lo + nMessages;
+               if (nMessages > 0) {
+                       if (lo + nMessages > nItems) {
+                               hi = nItems;
+                       }
+                       else {
+                               hi = lo + nMessages;
+                       }
+               } else {
+                       if (lo + nMessages <= 0) {
+                               hi = 1;
+                       }
+                       else {
+                               if (lo % abs(nMessages) != 0)
+                                       hi = lo + (lo % abs(nMessages) *
+                                                   (nMessages / abs(nMessages)));
+                               else
+                                       hi = lo + nMessages;
+                       }
                }
                done = !GetNextHashPos(WCC->summ, At, &hklen, &key, &vMsg);
                Msg = (message_summary*) vMsg;
                n = (Msg==NULL)? 0 : Msg->msgnum;
                if (i == 0)
                        StartMsg = n;
-               vector[4] = lo;
+               if ((vector[1] == n) && (lo - hi + 1 != nMessages)) {
+                       ret = abs(lo - hi + 1);
+               }
+               vector[4] = lo + 1;
                vector[5] = hi;
                vector[6] = n;
                FlushStrBuf(TmpBuf);
+               dbg_print_longvector(vector);
                DoTemplate(HKEY("select_messageindex"), TmpBuf, &vector, CTX_LONGVECTOR);
                StrBufAppendBuf(Selector, TmpBuf, 0);
                i++;
@@ -532,10 +550,12 @@ void DrawMessageDropdown(StrBuf *Selector, long maxmsgs, long startmsg)
        FlushStrBuf(TmpBuf);
        vector[1] = lbstr("maxmsgs") == 9999999;
        vector[2] = 0;
+       dbg_print_longvector(vector);
        DoTemplate(HKEY("select_messageindex_all"), TmpBuf, &vector, CTX_LONGVECTOR);
        StrBufAppendBuf(Selector, TmpBuf, 0);
        FreeStrBuf(&TmpBuf);
        DeleteHashPos(&At);
+       return ret;
 }
 
 void load_seen_flags(void)
@@ -679,6 +699,7 @@ void readloop(long oper)
                } 
 
                if (is_bbview) {
+                       SetAccessCommand(oper);
                        if (havebstr("SortOrder")) {
                                bbs_reverse = lbstr("SortOrder") == 2;
                        }
@@ -752,7 +773,7 @@ void readloop(long oper)
                BBViewToolBar = NewStrBuf();
                MessageDropdown = NewStrBuf();
 
-               DrawMessageDropdown(MessageDropdown, maxmsgs, startmsg);
+               maxmsgs = DrawMessageDropdown(MessageDropdown, maxmsgs, startmsg);
                
                DoTemplate(HKEY("msg_listselector_top"), BBViewToolBar, MessageDropdown, CTX_STRBUF);
                StrBufAppendBuf(WCC->WBuf, BBViewToolBar, 0);
@@ -800,7 +821,7 @@ void readloop(long oper)
                                if (lowest_displayed < 0) lowest_displayed = a;
                                highest_displayed = a;
                        
-                               ++num_displayed;
+                               num_displayed++;
                        }
                }
        }
index d9955e8e586b2fc8319be574ca3c9cc85bf6145f..90202273e07592b8d60dece96cb82675cee413af 100644 (file)
@@ -982,7 +982,18 @@ readloop_struct rlid[] = {
 
 
 
+void SetAccessCommand(long Oper)
+{
+       wcsession *WCC = WC;    
 
+       if (WCC->UrlFragment1 != NULL ) {
+               FlushStrBuf(WCC->UrlFragment1);
+               StrBufAppendBufPlain(WCC->UrlFragment1, 
+                                    rlid[Oper].name.Key, rlid[Oper].name.len, 0);
+       }
+       else 
+               WCC->UrlFragment1 = NewStrBufPlain(rlid[Oper].name.Key, rlid[Oper].name.len);
+}
                
 
 
index afa264f10352d44bb486bc0b285f59d9b8a03a89..2ebc3530536f8c7be3081d60276199958eb7c7df 100644 (file)
@@ -404,9 +404,25 @@ void tmplput_url_part(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, void *
                        UrlBuf = WCC->UrlFragment2;
                else
                        UrlBuf = WCC->UrlFragment3;
+               if (UrlBuf == NULL)  {
+                       lprintf(1, "urlbuf [%s] not set. (in '%s' line %ld);[%s]\n", 
+                               Tokens->Params[0]->Start,
+                               ChrPtr(Tokens->FileName),
+                               Tokens->Line,
+                               ChrPtr(Tokens->FlatToken));
+                       StrBufAppendPrintf(
+                               Target, 
+                               "<pre>\nurlbuf [%s] not set (in '%s' line %ld)\n[%s]\n</pre>\n", 
+                               Tokens->Params[0]->Start,
+                               ChrPtr(Tokens->FileName),
+                               Tokens->Line,
+                               ChrPtr(Tokens->FlatToken));
 
+
+
+               }
                StrBufAppendTemplate(Target, nArgs, Tokens, Context, ContextType,
-                                    UrlBuf, 1);
+                                    UrlBuf, 2);
        }
 }
 
index affe750aa0a109f659f29c2c084b16b9c214d847..958c25d6e282bbd8a2e37463b00abb7e97981560 100644 (file)
@@ -3844,13 +3844,13 @@ InitModule_ROOMOPS
        RegisterNamespace("ROOMNAME", 0, 1, tmplput_RoomName, 0);
 
        WebcitAddUrlHandler(HKEY("knrooms"), knrooms, 0);
-       WebcitAddUrlHandler(HKEY("gotonext"), _gotonext, 0);
-       WebcitAddUrlHandler(HKEY("skip"), gotonext, 0);
-       WebcitAddUrlHandler(HKEY("ungoto"), ungoto, 0);
-       WebcitAddUrlHandler(HKEY("dotgoto"), dotgoto, 0);
-       WebcitAddUrlHandler(HKEY("dotskip"), dotskip, 0);
+       WebcitAddUrlHandler(HKEY("gotonext"), _gotonext, NEED_URL);
+       WebcitAddUrlHandler(HKEY("skip"), gotonext, NEED_URL);
+       WebcitAddUrlHandler(HKEY("ungoto"), ungoto, NEED_URL);
+       WebcitAddUrlHandler(HKEY("dotgoto"), dotgoto, NEED_URL);
+       WebcitAddUrlHandler(HKEY("dotskip"), dotskip, NEED_URL);
        WebcitAddUrlHandler(HKEY("display_private"), _display_private, 0);
-       WebcitAddUrlHandler(HKEY("goto_private"), goto_private, 0);
+       WebcitAddUrlHandler(HKEY("goto_private"), goto_private, NEED_URL);
        WebcitAddUrlHandler(HKEY("zapped_list"), zapped_list, 0);
        WebcitAddUrlHandler(HKEY("display_zap"), display_zap, 0);
        WebcitAddUrlHandler(HKEY("zap"), zap, 0);
index e459afcf86e9a7d80d9457284cbcc79695d148e8..20c653137c84f59f1d0720814351a3cbd5d2a5fc 100644 (file)
@@ -6,7 +6,7 @@
 </select>
 
 <input type="radio" name="direction" value="" 
-  OnChange="location.href='<?URLPART(1)>?SortBy=date&SortOrder=2'"
+  OnChange="location.href='<?URLPART(0)>?SortBy=date&SortOrder=1'"
   <?%("COND:BSTR", 1, "SortOrder", 1, "checked", "")>
 >
 <?_("oldest to newest")> 
@@ -14,8 +14,8 @@
 &nbsp;&nbsp;&nbsp;&nbsp;
 
 <input type="radio" name="direction" value="" 
-  OnChange="location.href='<?URLPART(1)>?SortBy=date&SortOrder=1'"
-  <?%("COND:BSTR", 1, "SortOrder", 1, "", "checked")>
+  OnChange="location.href='<?URLPART(0)>?SortBy=date&SortOrder=2'"
+  <?%("COND:BSTR", 1, "SortOrder", 2, "checked", "")>
 >
 <?_("newest to oldest")>
 </p>
index 0c81f9cc1b2014f13c0b87698122b91b2a0656ff..3f4709b3cce367d0ff4b7dfcb7b2a3163816f585 100644 (file)
@@ -6,7 +6,7 @@
 </select>
 
 <input type="radio" name="direction" value="" 
-  OnChange="location.href='<?URLPART(1)>?SortBy=date&SortOrder=1'"
+  OnChange="location.href='<?URLPART(0)>?SortBy=date&SortOrder=1'"
   <?%("COND:BSTR", 1, "SortOrder", 1, "checked", "")>
 >
 <?_("oldest to newest")> 
@@ -14,7 +14,7 @@
 &nbsp;&nbsp;&nbsp;&nbsp;
 
 <input type="radio" name="direction" value="" 
-  OnChange="location.href='<?URLPART(1)>?SortBy=date&SortOrder=2'"
+  OnChange="location.href='<?URLPART(0)>?SortBy=date&SortOrder=2'"
   <?%("COND:BSTR", 1, "SortOrder", 2, "checked", "")>
 >
 <?_("newest to oldest")>
index a4c123594a2a3e7f267f9bdd2d6a2ce35e2acfbf..de4c18ee1d78bd7f9118712ced9084877e289988 100644 (file)
@@ -2105,7 +2105,22 @@ void tmplput_long_vector(StrBuf *Target, int nArgs, WCTemplateToken *Tokens, voi
        }
 }
 
+void dbg_print_longvector(long *LongVector)
+{
+       StrBuf *Buf = NewStrBufPlain(HKEY("Longvector: ["));
+       int nItems = LongVector[0];
+       int i;
+
+       for (i = 0; i < nItems; i++) {
+               if (i + 1 < nItems)
+                       StrBufAppendPrintf(Buf, "%d: %ld | ", i, LongVector[i]);
+               else
+                       StrBufAppendPrintf(Buf, "%d: %ld]\n", i, LongVector[i]);
 
+       }
+       lprintf(1, ChrPtr(Buf));
+       FreeStrBuf(&Buf);
+}
 
 int ConditionalLongVector(WCTemplateToken *Tokens, void *Context, int ContextType)
 {
index 73dce523e2ba77c7d9e76bf402bd6b00d055ec1f..bfed02edab22994b7421b7c87e507b738e57c138 100644 (file)
@@ -395,6 +395,7 @@ void RegisterSortFunc(const char *name, long len,
                      CompareFunc Reverse, 
                      long ContextType);
 
+void dbg_print_longvector(long *LongVector);
 
 /*
  * \brief Values for wcs_type
@@ -819,6 +820,7 @@ typedef struct _readloopstruct {
        ConstStr name;
        readloop_servcmd cmd;
 } readloop_struct;
+void SetAccessCommand(long Oper);
 void readloop(long oper);
 int  read_message(StrBuf *Target, const char *tmpl, long tmpllen, long msgnum, int printable_view, const StrBuf *section);
 void do_addrbook_view(addrbookent *addrbook, int num_ab);