Changeset b33551d4


Ignore:
Timestamp:
Dec 14, 2017 2:46:31 PM (2 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
0722fd8
Parents:
e6251e7c
Message:

SusiMail?: Put prev/next targets in form, not in session object,
and use P-R-G (ticket #1373)

Location:
apps/susimail/src/src/i2p/susi
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • apps/susimail/src/src/i2p/susi/util/Folder.java

    re6251e7c rb33551d4  
    509509                return elements[0].equals( element );
    510510        }
     511       
     512        /**
     513         * Returns the page this element is on, using the current sort, or 1 if not found
     514         *
     515         * @param element
     516         * @since 0.9.33
     517         */
     518        public synchronized int getPageOf(O element)
     519        {
     520                if (pages <= 1)
     521                        return 1;
     522                if (elements == null)
     523                        return 1;
     524                int i = getIndexOf(element);
     525                if (i < 0)
     526                        return 1;
     527                return 1 + (i / getPageSize());
     528        }
    511529}
  • apps/susimail/src/src/i2p/susi/webmail/WebMail.java

    re6251e7c rb33551d4  
    120120       
    121121        /*
     122         * GET params
     123         */
     124        private static final String CUR_PAGE  = "page";
     125
     126        /*
    122127         * hidden params
    123128         */
    124129        private static final String SUSI_NONCE = "susiNonce";
    125130        private static final String B64UIDL = "b64uidl";
     131        private static final String PREV_B64UIDL = "prevb64uidl";
     132        private static final String NEXT_B64UIDL = "nextb64uidl";
     133        private static final String PREV_PAGE_NUM = "prevpagenum";
     134        private static final String NEXT_PAGE_NUM = "nextpagenum";
    126135
    127136        /*
     
    140149        private static final String DELETE = "delete";
    141150        private static final String REALLYDELETE = "really_delete";
     151        // also a GET param
    142152        private static final String SHOW = "show";
    143153        private static final String DOWNLOAD = "download";
     
    12961306        {
    12971307                if( buttonPressed( request, PREV ) ) {
    1298                         String uidl = sessionObject.folder.getPreviousElement(showUIDL);
     1308                        String b64UIDL = request.getParameter(PREV_B64UIDL);
     1309                        String uidl = Base64.decodeToString(b64UIDL);
    12991310                        if(uidl == null)
    13001311                                sessionObject.state = STATE_LIST;
     
    13021313                }
    13031314                if( buttonPressed( request, NEXT ) ) {
    1304                         String uidl = sessionObject.folder.getNextElement(showUIDL);
     1315                        String b64UIDL = request.getParameter(NEXT_B64UIDL);
     1316                        String uidl = Base64.decodeToString(b64UIDL);
    13051317                        if(uidl == null)
    13061318                                sessionObject.state = STATE_LIST;
     
    14071419         * process buttons of folder view
    14081420         * @param sessionObject
     1421         * @param page the current page
    14091422         * @param request
    1410          */
    1411         private static void processFolderButtons(SessionObject sessionObject, RequestWrapper request)
     1423         * @param return the new page
     1424         */
     1425        private static int processFolderButtons(SessionObject sessionObject, int page, RequestWrapper request)
    14121426        {
    14131427                /*
     
    14261440                }
    14271441                if( buttonPressed( request, PREVPAGE ) ) {
    1428                         sessionObject.pageChanged = true;
    1429                         sessionObject.folder.previousPage();
     1442                        String sp = request.getParameter(PREV_PAGE_NUM);
     1443                        if (sp != null) {
     1444                                try {
     1445                                        page = Integer.parseInt(sp);
     1446                                        sessionObject.pageChanged = true;
     1447                                } catch (NumberFormatException nfe) {}
     1448                        }
    14301449                }
    14311450                else if( buttonPressed( request, NEXTPAGE ) ) {
    1432                         sessionObject.pageChanged = true;
    1433                         sessionObject.folder.nextPage();
     1451                        String sp = request.getParameter(NEXT_PAGE_NUM);
     1452                        if (sp != null) {
     1453                                try {
     1454                                        page = Integer.parseInt(sp);
     1455                                        sessionObject.pageChanged = true;
     1456                                } catch (NumberFormatException nfe) {}
     1457                        }
    14341458                }
    14351459                else if( buttonPressed( request, FIRSTPAGE ) ) {
    14361460                        sessionObject.pageChanged = true;
    1437                         sessionObject.folder.firstPage();
     1461                        page = 1;
    14381462                }
    14391463                else if( buttonPressed( request, LASTPAGE ) ) {
    14401464                        sessionObject.pageChanged = true;
    1441                         sessionObject.folder.lastPage();
     1465                        page = sessionObject.folder.getPages();
    14421466                }
    14431467                else if( buttonPressed( request, DELETE ) ) {
     
    14721496                sessionObject.clear = buttonPressed( request, CLEAR );
    14731497                sessionObject.invert = buttonPressed( request, INVERT );
     1498                return page;
    14741499        }
    14751500
     
    17081733                       
    17091734                        if( sessionObject.state == STATE_LIST ) {
    1710                                 if (isPOST)
    1711                                         processFolderButtons( sessionObject, request );
     1735                                if (isPOST) {
     1736                                        int page = 1;
     1737                                        String sp = request.getParameter(CUR_PAGE);
     1738                                        if (sp != null) {
     1739                                                try {
     1740                                                        page = Integer.parseInt(sp);
     1741                                                } catch (NumberFormatException nfe) {}
     1742                                        }
     1743                                        int newPage = processFolderButtons(sessionObject, page, request);
     1744                                        // LIST is from SHOW page
     1745                                        if (newPage != page || buttonPressed(request, LIST)) {
     1746                                                // P-R-G
     1747                                                String q = '?' + CUR_PAGE + '=' + newPage;
     1748                                                sendRedirect(httpRequest, response, q);
     1749                                                return;
     1750                                        }
     1751                                }
    17121752                                processSortingButtons( sessionObject, request );
    17131753                                for( Iterator<String> it = sessionObject.folder.currentPageIterator(); it != null && it.hasNext(); ) {
     
    17281768                        String showUIDL = Base64.decodeToString(b64UIDL);
    17291769                        if( sessionObject.state == STATE_SHOW ) {
    1730                                 if (isPOST)
    1731                                         showUIDL = processMessageButtons(sessionObject, showUIDL, request);
     1770                                if (isPOST) {
     1771                                        String newShowUIDL = processMessageButtons(sessionObject, showUIDL, request);
     1772                                        if (newShowUIDL != null && !newShowUIDL.equals(showUIDL)) {
     1773                                                // P-R-G
     1774                                                String q = '?' + B64UIDL + '=' + Base64.encode(newShowUIDL);
     1775                                                sendRedirect(httpRequest, response, q);
     1776                                                return;
     1777                                        }
     1778                                }
    17321779                                // ?download=nnn&amp;b64uidl link (same for ?att) should be valid in any state
    17331780                                if (processDownloadLink(sessionObject, showUIDL, request, response)) {
     
    18691916
    18701917        /**
     1918         *  Redirect a POST to a GET (P-R-G), replacing the query string
     1919         *  @param q starting with '?' or null
     1920         *  @since 0.9.33 adapted from I2PSnarkServlet
     1921         */
     1922        private void sendRedirect(HttpServletRequest req, HttpServletResponse resp, String q) throws IOException {
     1923                String url = req.getRequestURL().toString();
     1924                StringBuilder buf = new StringBuilder(128);
     1925                int qq = url.indexOf('?');
     1926                if (qq >= 0)
     1927                        url = url.substring(0, qq);
     1928                buf.append(url);
     1929                if (q.length() > 0)
     1930                        buf.append(q.replace("&amp;", "&"));  // no you don't html escape the redirect header
     1931                resp.setHeader("Location", buf.toString());
     1932                resp.sendError(302, "Moved");
     1933        }
     1934
     1935        /**
    18711936         * Translate with the console bundle.
    18721937         * @since 0.9.27
     
    22862351                out.println(button( LOGOUT, _t("Logout") ));
    22872352                Folder<String> folder = sessionObject.folder;
    2288                 if (folder.getPages() > 1)
    2289                         showPageButtons(out, folder);
     2353                int page = 1;
     2354                if (folder.getPages() > 1) {
     2355                        String sp = request.getParameter(CUR_PAGE);
     2356                        if (sp != null) {
     2357                                try {
     2358                                        page = Integer.parseInt(sp);
     2359                                } catch (NumberFormatException nfe) {}
     2360                        }
     2361                        folder.setCurrentPage(page);
     2362                        showPageButtons(out, page, folder.getPages(), true);
     2363                }
    22902364                out.println("</div>");
    22912365
     
    23602434                        // show the buttons again if page is big
    23612435                        out.println("<tr class=\"bottombuttons\"><td colspan=\"9\" align=\"center\">");
    2362                         showPageButtons(out, folder);
     2436                        showPageButtons(out, page, folder.getPages(), false);
    23632437                        out.println("</td></tr>");
    23642438                }
     
    23962470         *  first prev next last
    23972471         */
    2398         private static void showPageButtons(PrintWriter out, Folder<?> folder) {
    2399                 out.println(
    2400                         "<table id=\"pagenav\"><tr><td>" +
    2401                         ( folder.isFirstPage() ?
    2402                                                 button2( FIRSTPAGE, _t("First") ) + "&nbsp;" + button2( PREVPAGE, _t("Previous") ) :
    2403                                                 button( FIRSTPAGE, _t("First") ) + "&nbsp;" + button( PREVPAGE, _t("Previous") ) ) +
    2404                         "</td><td>" +
    2405                         _t("Page {0} of {1}", folder.getCurrentPage(), folder.getPages()) +
    2406                         "</td><td>" +
    2407                         ( folder.isLastPage() ?
    2408                                                 button2( NEXTPAGE, _t("Next") ) + "&nbsp;" + button2( LASTPAGE, _t("Last") ) :
    2409                                                 button( NEXTPAGE, _t("Next") ) + "&nbsp;" + button( LASTPAGE, _t("Last") ) ) +
    2410                         "</td></tr></table>"
    2411 
    2412                 );
     2472        private static void showPageButtons(PrintWriter out, int page, int pages, boolean outputHidden) {
     2473                out.println("<table id=\"pagenav\"><tr><td>");
     2474                if (outputHidden)
     2475                        out.println("<input type=\"hidden\" name=\"" + CUR_PAGE + "\" value=\"" + page + "\">");
     2476                String t1 = _t("First");
     2477                String t2 = _t("Previous");
     2478                if (page <= 1) {
     2479                        out.println(button2(FIRSTPAGE, t1) + "&nbsp;" + button2(PREVPAGE, t2));
     2480                } else {
     2481                        if (outputHidden)
     2482                                out.println("<input type=\"hidden\" name=\"" + PREV_PAGE_NUM + "\" value=\"" + (page - 1) + "\">");
     2483                        out.println(button(FIRSTPAGE, t1) + "&nbsp;" + button(PREVPAGE, t2));
     2484                }
     2485                out.println("</td><td>" +
     2486                        _t("Page {0} of {1}", page, pages) +
     2487                        "</td><td>");
     2488                t1 = _t("Next");
     2489                t2 = _t("Last");
     2490                if (page >= pages) {
     2491                        out.println(button2(NEXTPAGE, t1) + "&nbsp;" + button2(LASTPAGE, t2));
     2492                } else {
     2493                        if (outputHidden)
     2494                                out.println("<input type=\"hidden\" name=\"" + NEXT_PAGE_NUM + "\" value=\"" + (page + 1) + "\">");
     2495                        out.println(button(NEXTPAGE, t1) + "&nbsp;" + button(LASTPAGE, t2));
     2496                }
     2497                out.println("</td></tr></table>");
    24132498        }
    24142499
     
    24462531                }
    24472532                out.println(button(LOGOUT, _t("Logout") ));
    2448                 // TODO make these GETs not POSTs so we have a consistent URL
     2533                // processRequest() will P-R-G the PREV and NEXT so we have a consistent URL
    24492534                out.println("<div id=\"messagenav\">");
     2535                Folder<String> folder = sessionObject.folder;
    24502536                if (hasHeader) {
    2451                         out.println(
    2452                                 ( sessionObject.folder.isFirstElement(showUIDL) ? button2(PREV, _t("Previous")) : button(PREV, _t("Previous")))
    2453                                  + spacer);
    2454                 }
     2537                        String uidl = folder.getPreviousElement(showUIDL);
     2538                        String text = _t("Previous");
     2539                        if (uidl == null || folder.isFirstElement(showUIDL)) {
     2540                                out.println(button2(PREV, text));
     2541                        } else {
     2542                                String b64UIDL = Base64.encode(uidl);
     2543                                out.println("<input type=\"hidden\" name=\"" + PREV_B64UIDL + "\" value=\"" + b64UIDL + "\">");
     2544                                out.println(button(PREV, text));
     2545                        }
     2546                        out.print(spacer);
     2547                }
     2548                int page = folder.getPageOf(showUIDL);
     2549                out.println("<input type=\"hidden\" name=\"" + CUR_PAGE + "\" value=\"" + page + "\">");
    24552550                out.println(button( LIST, _t("Back to Folder") ) + spacer);
    24562551                if (hasHeader) {
    2457                         out.println(
    2458                                 ( sessionObject.folder.isLastElement(showUIDL) ? button2(NEXT, _t("Next")) : button(NEXT, _t("Next"))));
     2552                        String uidl = folder.getNextElement(showUIDL);
     2553                        String text = _t("Next");
     2554                        if (uidl == null || folder.isLastElement(showUIDL)) {
     2555                                out.println(button2(NEXT, text));
     2556                        } else {
     2557                                String b64UIDL = Base64.encode(uidl);
     2558                                out.println("<input type=\"hidden\" name=\"" + NEXT_B64UIDL + "\" value=\"" + b64UIDL + "\">");
     2559                                out.println(button(NEXT, text));
     2560                        }
     2561                        out.print(spacer);
    24592562                }
    24602563                out.println("</div></div>");
Note: See TracChangeset for help on using the changeset viewer.