/* * This library is part of OpenCms - * the Open Source Content Management System * * Copyright (c) Alkacon Software GmbH (http://www.alkacon.com) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * For further information about Alkacon Software GmbH, please see the * company website: http://www.alkacon.com * * For further information about OpenCms, please see the * project website: http://www.opencms.org * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package org.opencms.workplace.list; import org.opencms.i18n.CmsMessageContainer; import org.opencms.i18n.CmsMessages; import org.opencms.main.CmsIllegalArgumentException; import org.opencms.main.CmsIllegalStateException; import org.opencms.util.CmsStringUtil; import org.opencms.workplace.CmsWorkplace; import org.opencms.workplace.commons.CmsProgressThread; import org.opencms.workplace.tools.A_CmsHtmlIconButton; import org.opencms.workplace.tools.CmsHtmlIconButtonStyleEnum; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Locale; /** * The main class of the html list widget.<p> * * @since 6.0.0 */ public class CmsHtmlList { /** Standard list button location. */ public static final String ICON_LEFT = "list/leftarrow.png"; /** Standard list button location. */ public static final String ICON_RIGHT = "list/rightarrow.png"; /** Constant for item separator char used for coding/encoding multiselection. */ public static final String ITEM_SEPARATOR = "|"; /** Constant name for error message if no item has been selected. */ public static final String NO_SELECTION_HELP_VAR = "noSelHelp"; /** Constant name for error message if number of selected items does not match. */ public static final String NO_SELECTION_MATCH_HELP_VAR = "noSelMatchHelp"; /** Current displayed page number. */ protected int m_currentPage; /** Current sort order. */ protected CmsListOrderEnum m_currentSortOrder; /** Filtered list of items or <code>null</code> if no filter is set and not sorted. */ protected List<CmsListItem> m_filteredItems; /** Dhtml id. */ protected final String m_id; /** If this flag is set the list will be surrounded by a box. */ protected boolean m_isBoxed = true; /** Maximum number of items per page. */ protected int m_maxItemsPerPage = 20; /** Metadata for building the list. */ protected CmsListMetadata m_metadata; /** Display Name of the list. */ protected CmsMessageContainer m_name; /** Really content of the list. */ protected List<CmsListItem> m_originalItems = new ArrayList<CmsListItem>(); /** printable flag. */ protected boolean m_printable; /** Search filter text. */ protected String m_searchFilter = ""; /** Show the title of the list. */ protected boolean m_showTitle; /** The filtered content size, only used if data self managed. */ protected int m_size; /** Column name to be sorted. */ protected String m_sortedColumn; /** The total size, only used is data self managed. */ protected int m_totalSize; /** Items currently displayed. */ protected List<CmsListItem> m_visibleItems; /** The related workplace dialog object. */ protected transient A_CmsListDialog m_wp; /** * Default Constructor.<p> * * @param id unique id of the list, is used as name for controls and js functions and vars * @param name the display name * @param metadata the list's metadata */ public CmsHtmlList(String id, CmsMessageContainer name, CmsListMetadata metadata) { m_id = id; m_name = name; m_metadata = metadata; m_currentPage = 1; m_showTitle = true; } /** * Generates the list of html option elements for a html select control to select a page of a list.<p> * * @param nrPages the total number of pages * @param itemsPage the maximum number of items per page * @param nrItems the total number of items * @param curPage the current page * @param locale the locale * * @return html code */ public static String htmlPageSelector(int nrPages, int itemsPage, int nrItems, int curPage, Locale locale) { StringBuffer html = new StringBuffer(256); for (int i = 0; i < nrPages; i++) { int displayedFrom = (i * itemsPage) + 1; int displayedTo = ((i + 1) * itemsPage) < nrItems ? (i + 1) * itemsPage : nrItems; html.append("\t\t\t\t<option value='"); html.append(i + 1); html.append("'"); html.append((i + 1) == curPage ? " selected" : ""); html.append(">"); html.append(Messages.get().getBundle(locale).key( Messages.GUI_LIST_PAGE_ENTRY_3, new Integer(i + 1), new Integer(displayedFrom), new Integer(displayedTo))); html.append("</option>\n"); } return html.toString(); } /** * This method resets the content of the list (no the metadata).<p> */ public void clear() { if (m_originalItems != null) { m_originalItems.clear(); } m_filteredItems = null; synchronized (this) { if (m_visibleItems != null) { m_visibleItems.clear(); } } setSearchFilter(""); m_sortedColumn = null; } /** * Returns all list items in the list, may be not visible and sorted.<p> * * @return all list items */ public List<CmsListItem> getAllContent() { if (m_metadata.isSelfManaged()) { if (m_filteredItems != null) { return Collections.unmodifiableList(m_filteredItems); } else { return Collections.emptyList(); } } else { if (m_originalItems != null) { return Collections.unmodifiableList(m_originalItems); } else { return Collections.emptyList(); } } } /** * Returns the filtered list of list items.<p> * * Equals to <code>{@link #getAllContent()}</code> if no filter is set.<p> * * @return the filtered list of list items */ public List<CmsListItem> getContent() { if (m_filteredItems == null) { return getAllContent(); } else { return Collections.unmodifiableList(m_filteredItems); } } /** * returns the number of the current page.<p> * * @return the number of the current page */ public int getCurrentPage() { return m_currentPage; } /** * Returns all items of the current page.<p> * * @return all items of the current page, a list of {@link CmsListItem} objects */ public List<CmsListItem> getCurrentPageItems() { if (getSize() == 0) { return Collections.emptyList(); } if (m_metadata.isSelfManaged()) { return getContent(); } return Collections.unmodifiableList(getContent().subList(displayedFrom() - 1, displayedTo())); } /** * Returns the current used sort order.<p> * * @return the current used sort order */ public CmsListOrderEnum getCurrentSortOrder() { return m_currentSortOrder; } /** * Returns the id.<p> * * @return the id */ public String getId() { return m_id; } /** * This method returns the item identified by the parameter id.<p> * * Only current visible item can be retrieved using this method.<p> * * @param id the id of the item to look for * * @return the requested item or <code>null</code> if not found */ public CmsListItem getItem(String id) { Iterator<CmsListItem> it = getAllContent().iterator(); while (it.hasNext()) { CmsListItem item = it.next(); if (item.getId().equals(id)) { return item; } } return null; } /** * Returns the maximum number of items per page.<p> * * @return the maximum number of items per page */ public int getMaxItemsPerPage() { return m_maxItemsPerPage; } /** * Returns the metadata.<p> * * @return the metadata */ public CmsListMetadata getMetadata() { return m_metadata; } /** * Returns the name of the list.<p> * * @return the list's name */ public CmsMessageContainer getName() { return m_name; } /** * Returns the filtered number of pages.<p> * * Equals to <code>{@link #getTotalNumberOfPages()}</code> if no filter is set.<p> * * @return the filtered of pages */ public int getNumberOfPages() { return (int)Math.ceil((double)getSize() / getMaxItemsPerPage()); } /** * Returns the search filter.<p> * * @return the search filter */ public String getSearchFilter() { return m_searchFilter; } /** * Return the filtered number of items.<p> * * Equals to <code>{@link #getTotalSize()}</code> if no filter is set.<p> * * @return the filtered number of items */ public int getSize() { if (m_metadata.isSelfManaged() && (m_size != 0)) { return m_size; } return getContent().size(); } /** * Returns the sorted column's name.<p> * * @return the sorted column's name */ public String getSortedColumn() { return m_sortedColumn; } /** * Returns a filled list state.<p> * * @return the state of the list */ public CmsListState getState() { return new CmsListState(this); } /** * Returns the total number of pages.<p> * * @return the total number of pages */ public int getTotalNumberOfPages() { return (int)Math.ceil((double)getTotalSize() / getMaxItemsPerPage()); } /** * Return the total number of items.<p> * * @return the total number of items */ public int getTotalSize() { if (m_metadata.isSelfManaged() && (m_totalSize != 0)) { return m_totalSize; } return getAllContent().size(); } /** * Returns the workplace dialog object.<p> * * @return the workplace dialog object */ public A_CmsListDialog getWp() { return m_wp; } /** * Returns the isBoxed flag.<p> * * If this flag is set the list will be surrounded by a box.<p> * * @return the isBoxed flag */ public boolean isBoxed() { return m_isBoxed; } /** * Returns the printable flag.<p> * * @return the printable flag */ public boolean isPrintable() { return m_printable; } /** * Returns if the list title is shown.<p> * * @return true if the list title is shown, otherwise false */ public boolean isShowTitle() { return m_showTitle; } /** * Generates the csv output for the list.<p> * * @return csv output */ public String listCsv() { StringBuffer csv = new StringBuffer(5120); csv.append(m_metadata.csvHeader()); if (getContent().isEmpty()) { csv.append(m_metadata.csvEmptyList()); } else { Iterator<CmsListItem> itItems = getContent().iterator(); while (itItems.hasNext()) { CmsListItem item = itItems.next(); csv.append(m_metadata.csvItem(item)); } } return getWp().resolveMacros(csv.toString()); } /** * Generates the html code for the list.<p> * * @return html code */ public synchronized String listHtml() { // check if progress should be set in the thread CmsProgressThread thread = null; int progressOffset = 0; if (Thread.currentThread() instanceof CmsProgressThread) { thread = (CmsProgressThread)Thread.currentThread(); progressOffset = thread.getProgress(); } // this block has to be executed before calling htmlBegin() if (isPrintable()) { m_visibleItems = new ArrayList<CmsListItem>(getContent()); } else { m_visibleItems = new ArrayList<CmsListItem>(getCurrentPageItems()); } StringBuffer html = new StringBuffer(5120); html.append(htmlBegin()); if (!isPrintable()) { html.append(htmlTitle()); html.append(htmlToolBar()); } else { html.append("<style type='text/css'>\n"); html.append("td.listdetailitem, \n"); html.append(".linkdisabled {\n"); html.append("\tcolor: black;\n"); html.append("}\n"); html.append(".list th {\n"); html.append("\tborder: 1px solid black;\n"); html.append("}\n"); html.append(".list {\n"); html.append("\tborder: 1px solid black;\n"); html.append("}\n"); html.append("</style>"); } html.append("<table width='100%' cellpadding='1' cellspacing='0' class='list'>\n"); html.append(m_metadata.htmlHeader(this)); if (m_visibleItems.isEmpty()) { html.append(m_metadata.htmlEmptyTable()); } else { Iterator<CmsListItem> itItems = m_visibleItems.iterator(); boolean odd = true; int count = 0; while (itItems.hasNext()) { // set progress in thread count++; if (thread != null) { if (thread.isInterrupted()) { throw new CmsIllegalStateException(org.opencms.workplace.commons.Messages.get().container( org.opencms.workplace.commons.Messages.ERR_PROGRESS_INTERRUPTED_0)); } thread.setProgress(((count * (100 - progressOffset)) / m_visibleItems.size()) + progressOffset); thread.setDescription(org.opencms.workplace.commons.Messages.get().getBundle(thread.getLocale()).key( org.opencms.workplace.commons.Messages.GUI_PROGRESS_PUBLISH_STEP4_2, new Integer(count), new Integer(m_visibleItems.size()))); } CmsListItem item = itItems.next(); html.append(m_metadata.htmlItem(item, odd, isPrintable())); odd = !odd; } } html.append("</table>\n"); if (!isPrintable()) { html.append(htmlPagingBar()); } html.append(htmlEnd()); return getWp().resolveMacros(html.toString()); } /** * Generate the need js code for the list.<p> * * @return js code */ public String listJs() { StringBuffer js = new StringBuffer(1024); CmsMessages messages = Messages.get().getBundle(getWp().getLocale()); js.append("<script type='text/javascript' src='"); js.append(CmsWorkplace.getSkinUri()); js.append("jquery/unpacked/jquery.js'></script>\n"); js.append("<script type='text/javascript' src='"); js.append(CmsWorkplace.getSkinUri()); js.append("jquery/unpacked/jquery.hint.js'></script>\n"); js.append("<script type='text/javascript' src='"); js.append(CmsWorkplace.getSkinUri()); js.append("admin/javascript/list.js'></script>\n"); if (!m_metadata.getMultiActions().isEmpty()) { js.append("<script type='text/javascript'>\n"); js.append("\tvar "); js.append(NO_SELECTION_HELP_VAR); js.append(" = '"); js.append(CmsStringUtil.escapeJavaScript(messages.key(Messages.GUI_LIST_ACTION_NO_SELECTION_0))); js.append("';\n"); Iterator<CmsListMultiAction> it = m_metadata.getMultiActions().iterator(); while (it.hasNext()) { CmsListMultiAction action = it.next(); if (action instanceof CmsListRadioMultiAction) { CmsListRadioMultiAction rAction = (CmsListRadioMultiAction)action; js.append("\tvar "); js.append(NO_SELECTION_MATCH_HELP_VAR); js.append(rAction.getId()); js.append(" = '"); js.append(CmsStringUtil.escapeJavaScript(messages.key( Messages.GUI_LIST_ACTION_NO_SELECTION_MATCH_1, new Integer(rAction.getSelections())))); js.append("';\n"); } } js.append("</script>\n"); } return js.toString(); } /** * Returns a new list item for this list.<p> * * @param id the id of the item has to be unique * @return a new list item */ public CmsListItem newItem(String id) { return new CmsListItem(getMetadata(), id); } /** * Returns html code for printing the list.<p> * * @return html code */ public String printableHtml() { m_printable = true; String html = listHtml(); m_printable = false; return html; } /** * Removes an item from the list.<p> * * Keeping care of all the state like sorted column, sorting order, displayed page and search filter.<p> * * Try to use it instead of <code>{@link A_CmsListDialog#refreshList()}</code>.<p> * * @param id the id of the item to remove * * @return the removed list item */ public CmsListItem removeItem(String id) { CmsListItem item = getItem(id); if (item == null) { return null; } CmsListState state = null; if ((m_filteredItems != null) || (m_visibleItems != null)) { state = getState(); } m_originalItems.remove(item); if (m_filteredItems != null) { m_filteredItems.remove(item); } if (m_visibleItems != null) { m_visibleItems.remove(item); } if (state != null) { setState(state); } return item; } /** * Sets the isBoxed flag.<p> * * If this flag is set, the list will be surrounded by a box.<p> * * @param isBoxed the isBoxed flag to set */ public void setBoxed(boolean isBoxed) { m_isBoxed = isBoxed; } /** * Sets the list item to display in the list.<p> * * @param listItems a collection of {@link CmsListItem} objects */ public void setContent(Collection<CmsListItem> listItems) { if (m_metadata.isSelfManaged()) { m_filteredItems = new ArrayList<CmsListItem>(listItems); m_originalItems = null; } else { m_filteredItems = null; m_originalItems = new ArrayList<CmsListItem>(listItems); } } /** * Sets the current page.<p> * * @param currentPage the current page to set * * @throws CmsIllegalArgumentException if the argument is invalid */ public void setCurrentPage(int currentPage) throws CmsIllegalArgumentException { if (getSize() != 0) { if ((currentPage < 1) || (currentPage > getNumberOfPages())) { throw new CmsIllegalArgumentException(Messages.get().container( Messages.ERR_LIST_INVALID_PAGE_1, new Integer(currentPage))); } } m_currentPage = currentPage; } /** * Sets the maximum number of items per page.<p> * * @param maxItemsPerPage the maximum number of items per page to set */ public void setMaxItemsPerPage(int maxItemsPerPage) { this.m_maxItemsPerPage = maxItemsPerPage; } /** * Sets the name of the list.<p> * * @param name the name of the list */ public void setName(CmsMessageContainer name) { m_name = name; } /** * Sets the search filter.<p> * * @param searchFilter the search filter to set */ public void setSearchFilter(String searchFilter) { if (!m_metadata.isSearchable()) { return; } if (searchFilter == null) { searchFilter = ""; } m_searchFilter = searchFilter; boolean showAll = CmsStringUtil.isNotEmptyOrWhitespaceOnly(m_searchFilter); getMetadata().getSearchAction().getShowAllAction().setVisible(showAll); if (!m_metadata.isSelfManaged()) { if (CmsStringUtil.isEmptyOrWhitespaceOnly(searchFilter)) { // reset content if filter is empty m_filteredItems = null; } else { m_filteredItems = getMetadata().getSearchAction().filter(getAllContent(), m_searchFilter); } } String sCol = m_sortedColumn; m_sortedColumn = ""; if (CmsStringUtil.isNotEmptyOrWhitespaceOnly(sCol)) { CmsListOrderEnum order = getCurrentSortOrder(); setSortedColumn(sCol); if (order == CmsListOrderEnum.ORDER_DESCENDING) { setSortedColumn(sCol); } } setCurrentPage(1); } /** * Sets if the list title is shown.<p> * * @param showTitle true if the list title is shown, otherwise false */ public void setShowTitle(boolean showTitle) { m_showTitle = showTitle; } /** * Sets the current filtered size, only used if data self managed.<p> * * @param size the size to set */ public void setSize(int size) { m_size = size; } /** * Sets the sorted column.<p> * * @param sortedColumn the sorted column to set * * @throws CmsIllegalArgumentException if the <code>sortedColumn</code> argument is invalid */ public void setSortedColumn(String sortedColumn) throws CmsIllegalArgumentException { // check if the parameter is valid if ((getMetadata().getColumnDefinition(sortedColumn) == null) || !getMetadata().getColumnDefinition(sortedColumn).isSorteable()) { return; } // reset view setCurrentPage(1); // only reverse order if the column to sort is already sorted if (sortedColumn.equals(m_sortedColumn)) { if (m_currentSortOrder == CmsListOrderEnum.ORDER_ASCENDING) { m_currentSortOrder = CmsListOrderEnum.ORDER_DESCENDING; } else { m_currentSortOrder = CmsListOrderEnum.ORDER_ASCENDING; } if (!m_metadata.isSelfManaged()) { if (m_filteredItems == null) { m_filteredItems = new ArrayList<CmsListItem>(getAllContent()); } Collections.reverse(m_filteredItems); } return; } // sort new column m_sortedColumn = sortedColumn; m_currentSortOrder = CmsListOrderEnum.ORDER_ASCENDING; if (!m_metadata.isSelfManaged()) { if (m_filteredItems == null) { m_filteredItems = new ArrayList<CmsListItem>(getAllContent()); } I_CmsListItemComparator c = getMetadata().getColumnDefinition(sortedColumn).getListItemComparator(); Collections.sort(m_filteredItems, c.getComparator(sortedColumn, getWp().getLocale())); } } /** * Sets the list state.<p> * * This may involve sorting, filtering and paging.<p> * * @param listState the state to be set */ public void setState(CmsListState listState) { if (!m_metadata.isSelfManaged()) { m_filteredItems = null; } synchronized (this) { if (m_visibleItems != null) { m_visibleItems.clear(); } } setSearchFilter(listState.getFilter()); setSortedColumn(listState.getColumn()); if (listState.getOrder() == CmsListOrderEnum.ORDER_DESCENDING) { setSortedColumn(listState.getColumn()); } if (listState.getPage() > 0) { if (listState.getPage() <= getNumberOfPages()) { setCurrentPage(listState.getPage()); } else { setCurrentPage(1); } } } /** * Sets the total Size, only used if data self managed.<p> * * @param totalSize the total Size to set */ public void setTotalSize(int totalSize) { m_totalSize = totalSize; } /** * Sets the workplace dialog object.<p> * * @param wp the workplace dialog object to set */ public void setWp(A_CmsListDialog wp) { m_wp = wp; m_metadata.setWp(wp); } /** * Returns the number (from 1) of the first displayed item.<p> * * @return the number (from 1) of the first displayed item, or zero if the list is empty */ protected int displayedFrom() { if (getSize() != 0) { if (isPrintable()) { return 1; } else { return ((getCurrentPage() - 1) * getMaxItemsPerPage()) + 1; } } return 0; } /** * Returns the number (from 1) of the last displayed item.<p> * * @return the number (from 1) of the last displayed item, or zero if the list is empty */ protected int displayedTo() { if (getSize() != 0) { if (!isPrintable()) { if ((getCurrentPage() * getMaxItemsPerPage()) < getSize()) { return getCurrentPage() * getMaxItemsPerPage(); } } } return getSize(); } /** * Generates the initial html code.<p> * * @return html code */ protected String htmlBegin() { StringBuffer html = new StringBuffer(512); // help & confirmation text for actions if needed if (!isPrintable() && (m_visibleItems != null) && !m_visibleItems.isEmpty()) { Iterator<CmsListColumnDefinition> cols = getMetadata().getColumnDefinitions().iterator(); while (cols.hasNext()) { CmsListColumnDefinition col = cols.next(); Iterator<I_CmsListDirectAction> actions = col.getDirectActions().iterator(); while (actions.hasNext()) { I_CmsListDirectAction action = actions.next(); action.setItem(m_visibleItems.get(0)); html.append(action.helpTextHtml()); html.append(action.confirmationTextHtml()); } Iterator<CmsListDefaultAction> defActions = col.getDefaultActions().iterator(); while (defActions.hasNext()) { I_CmsListDirectAction action = defActions.next(); action.setItem(m_visibleItems.get(0)); html.append(action.helpTextHtml()); html.append(action.confirmationTextHtml()); } } } // start list code html.append("<div class='listArea'>\n"); if (isBoxed()) { html.append(getWp().dialogBlock(CmsWorkplace.HTML_START, m_name.key(getWp().getLocale()), false)); } html.append("\t\t<table width='100%' cellspacing='0' cellpadding='0' border='0'>\n"); html.append("\t\t\t<tr><td>\n"); return html.toString(); } /** * Generates the need html code for ending a list.<p> * * @return html code */ protected String htmlEnd() { StringBuffer html = new StringBuffer(512); html.append("\t\t\t</td></tr>\n"); html.append("\t\t</table>\n"); if (isBoxed()) { html.append(getWp().dialogBlock(CmsWorkplace.HTML_END, m_name.key(getWp().getLocale()), false)); } html.append("</div>\n"); return html.toString(); } /** * Generates the needed html code for the paging bar.<p> * * @return html code */ protected String htmlPagingBar() { if (getNumberOfPages() < 2) { return ""; } StringBuffer html = new StringBuffer(1024); CmsMessages messages = Messages.get().getBundle(getWp().getLocale()); html.append("<table width='100%' cellspacing='0' style='margin-top: 5px;'>\n"); html.append("\t<tr>\n"); html.append("\t\t<td class='main'>\n"); // prev button String id = "listPrev"; String name = messages.key(Messages.GUI_LIST_PAGING_PREVIOUS_NAME_0); String iconPath = ICON_LEFT; boolean enabled = getCurrentPage() > 1; String helpText = messages.key(Messages.GUI_LIST_PAGING_PREVIOUS_HELP_0); if (!enabled) { helpText = messages.key(Messages.GUI_LIST_PAGING_PREVIOUS_HELPDIS_0); } String onClic = "listSetPage('" + getId() + "', " + (getCurrentPage() - 1) + ")"; html.append(A_CmsHtmlIconButton.defaultButtonHtml( CmsHtmlIconButtonStyleEnum.SMALL_ICON_TEXT, id, name, helpText, enabled, iconPath, null, onClic)); html.append("\n"); // next button id = "listNext"; name = messages.key(Messages.GUI_LIST_PAGING_NEXT_NAME_0); iconPath = ICON_RIGHT; enabled = getCurrentPage() < getNumberOfPages(); helpText = messages.key(Messages.GUI_LIST_PAGING_NEXT_HELP_0); if (!enabled) { helpText = messages.key(Messages.GUI_LIST_PAGING_NEXT_HELPDIS_0); } onClic = "listSetPage('" + getId() + "', " + (getCurrentPage() + 1) + ")"; html.append(A_CmsHtmlIconButton.defaultButtonHtml( CmsHtmlIconButtonStyleEnum.SMALL_ICON_TEXT, id, name, helpText, enabled, iconPath, null, onClic)); html.append("\n"); // page selection list html.append("\t\t\t   "); html.append("\t\t\t<select name='listPageSet' id='id-page_set' onChange =\"listSetPage('"); html.append(getId()); html.append("', this.value);\" style='vertical-align: bottom;'>\n"); html.append(htmlPageSelector( getNumberOfPages(), getMaxItemsPerPage(), getSize(), getCurrentPage(), getWp().getLocale())); html.append("\t\t\t</select>\n"); html.append("\t\t\t   "); boolean isNotSearching = true; if (getMetadata().isSearchable()) { isNotSearching = CmsStringUtil.isEmptyOrWhitespaceOnly(m_searchFilter); } if (isNotSearching) { html.append(messages.key(Messages.GUI_LIST_PAGING_TEXT_2, new Object[] { m_name.key(getWp().getLocale()), new Integer(getTotalSize())})); } else { html.append(messages.key(Messages.GUI_LIST_PAGING_FILTER_TEXT_3, new Object[] { m_name.key(getWp().getLocale()), new Integer(getSize()), new Integer(getTotalSize())})); } html.append("\t\t</td>\n"); html.append("\t</tr>\n"); html.append("</table>\n"); return html.toString(); } /** * Returns the html for the title of the list.<p> * * @return html code */ protected String htmlTitle() { boolean showTitle = isShowTitle(); Iterator<I_CmsListAction> itIndepActions = getMetadata().getIndependentActions().iterator(); while (!showTitle && itIndepActions.hasNext()) { I_CmsListAction indepAction = itIndepActions.next(); showTitle = showTitle || indepAction.isVisible(); } Iterator<CmsListItemDetails> itItemDetails = getMetadata().getItemDetailDefinitions().iterator(); while (!showTitle && itItemDetails.hasNext()) { CmsListItemDetails itemDetail = itItemDetails.next(); showTitle = showTitle || itemDetail.getAction().isVisible(); } if (!showTitle) { // prevent empty table if there is nothing to display return ""; } StringBuffer html = new StringBuffer(512); CmsMessages messages = Messages.get().getBundle(getWp().getLocale()); html.append("<table width='100%' cellspacing='0'>"); html.append("\t<tr>\n"); if (isShowTitle()) { html.append("\t\t<td align='left'>\n"); html.append("\t\t\t"); boolean isNotSearching = true; if (getMetadata().isSearchable()) { isNotSearching = CmsStringUtil.isEmptyOrWhitespaceOnly(m_searchFilter); } if (getTotalNumberOfPages() > 1) { if (isNotSearching) { html.append(messages.key(Messages.GUI_LIST_TITLE_TEXT_4, new Object[] { m_name.key(getWp().getLocale()), new Integer(displayedFrom()), new Integer(displayedTo()), new Integer(getTotalSize())})); } else { html.append(messages.key(Messages.GUI_LIST_TITLE_FILTERED_TEXT_5, new Object[] { m_name.key(getWp().getLocale()), new Integer(displayedFrom()), new Integer(displayedTo()), new Integer(getSize()), new Integer(getTotalSize())})); } } else { if (isNotSearching) { html.append(messages.key(Messages.GUI_LIST_SINGLE_TITLE_TEXT_2, new Object[] { m_name.key(getWp().getLocale()), new Integer(getTotalSize())})); } else { html.append(messages.key(Messages.GUI_LIST_SINGLE_TITLE_FILTERED_TEXT_3, new Object[] { m_name.key(getWp().getLocale()), new Integer(getSize()), new Integer(getTotalSize())})); } } html.append("\n"); html.append("\t\t</td>\n\t\t"); } html.append(getMetadata().htmlActionBar()); html.append("\n\t</tr>\n"); html.append("</table>\n"); return html.toString(); } /** * Returns the html code for the toolbar (search bar + multiactions bar).<p> * * @return html code */ protected String htmlToolBar() { boolean showToolBar = getMetadata().isSearchable(); Iterator<CmsListMultiAction> itMultiActions = getMetadata().getMultiActions().iterator(); while (!showToolBar && itMultiActions.hasNext()) { CmsListMultiAction multiAction = itMultiActions.next(); showToolBar = showToolBar || multiAction.isVisible(); } if (!showToolBar) { // prevent empty table if there is nothing to display return ""; } StringBuffer html = new StringBuffer(512); html.append("<table width='100%' cellspacing='0' style='margin-bottom: 5px'>\n"); html.append("\t<tr>\n"); html.append(m_metadata.htmlSearchBar()); html.append(m_metadata.htmlMultiActionBar()); html.append("\t</tr>\n"); html.append("</table>\n"); return html.toString(); } /** * Sets the metadata for this list.<p> * * Should only be used by the <code>{@link A_CmsListDialog}</code> class * for temporally removing the metadata object while the list is saved in the * <code>{@link org.opencms.workplace.CmsWorkplaceSettings}</code>.<p> * * @param metadata the list metadata */ protected void setMetadata(CmsListMetadata metadata) { m_metadata = metadata; } }