📄 tablerendererutil.java
字号:
package com.esri.solutions.jitk.web.faces.renderkit.xml;
import com.esri.adf.web.ADFException;
import com.esri.adf.web.data.results.ResultNode;
import com.esri.adf.web.util.XMLUtil;
import com.esri.solutions.jitk.common.resources.TextResources;
import com.esri.solutions.jitk.web.data.results.DefaultRowDataIntrospector;
import com.esri.solutions.jitk.web.data.results.EntityInfo;
import com.esri.solutions.jitk.web.data.results.FormatKit;
import com.esri.solutions.jitk.web.data.results.QueryResultNodeIntrospector;
import com.esri.solutions.jitk.web.data.results.RowDataIntrospector;
import com.esri.solutions.jitk.web.data.results.SelectableTableModel;
import com.esri.solutions.jitk.web.data.results.SimpleFormatKit;
import com.esri.solutions.jitk.web.data.results.SortedResultsTableModel;
import com.esri.solutions.jitk.web.data.results.TableModel;
import org.apache.log4j.Logger;
import org.w3c.dom.Element;
import java.util.Hashtable;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.Set;
public class TableRendererUtil {
private static final Logger log = Logger.getLogger(TableRendererUtil.class);
public static void renderTableXml(TableModel tableModel, String controlId,
Element parent) {
try {
int firstRow = 0;
int lastRow = tableModel.getRowCount();
Element headers = XMLUtil.createElement("headers", null, parent);
Element rows = XMLUtil.createElement("rows", null, parent);
if (isHasColumns(tableModel)) {
rows.setAttribute("record-count", String.valueOf(lastRow));
} else {
rows.setAttribute("record-count", String.valueOf(0));
}
rows.setAttribute("record-count-text",
TextResources.getResourceString(
"results.ui.label.table.RecordCount"));
if ((lastRow > 0) && (tableModel.getPageIndex() < 0)) {
tableModel.setPageIndex(0);
}
if ((tableModel.getPageSize() > 0) &&
(tableModel.getPageIndex() >= 0)) {
firstRow = tableModel.getPageSize() * tableModel.getPageIndex();
lastRow = firstRow + tableModel.getPageSize();
}
if (lastRow > tableModel.getRowCount()) {
lastRow = tableModel.getRowCount();
}
String[] includeColumns = null;
for (int i = firstRow; i < lastRow; i++) {
Object rowData = tableModel.getRowData(i);
RowDataIntrospector introspector = getRowDataIntrospector(rowData);
if (i == firstRow) {
includeColumns = encodeAndReturnColumns(introspector.getColumnNames(
rowData), tableModel, headers, controlId);
}
encodeRow(tableModel, rowData, includeColumns, introspector,
rows, controlId + "_" + i, i);
}
if (tableModel.getPageCount() > 1) {
Element pagings = XMLUtil.createElement("pagings", null, parent);
encodePagingPanel(tableModel.getPageIndex(),
tableModel.getPageCount(), pagings, controlId + "_pagings");
}
} catch (Exception ex) {
log.error("Unable to encode the table control.", ex);
throw new ADFException("Unable to encode the table control.", ex);
}
}
private static boolean isHasColumns(TableModel tableModel) {
boolean hasColumns = false;
if (tableModel.getRowCount() > 0) {
Object rowData = tableModel.getRowData(0);
RowDataIntrospector introspector = getRowDataIntrospector(rowData);
String[] columns = introspector.getColumnNames(rowData);
hasColumns = (boolean) (columns != null);
}
return hasColumns;
}
private static RowDataIntrospector getRowDataIntrospector(Object rowData) {
return (rowData instanceof ResultNode)
? new QueryResultNodeIntrospector() : new DefaultRowDataIntrospector();
}
private static void addElement(String name, Map<String, String> atts,
Element parent) {
Element element = XMLUtil.createElement(name, null, parent);
if ((atts != null) && !atts.isEmpty()) {
for (java.util.Iterator<Map.Entry<String, String>> i = atts.entrySet()
.iterator();
i.hasNext();) {
Map.Entry<String, String> att = i.next();
element.setAttribute(att.getKey(), att.getValue());
}
}
}
private static String[] encodeAndReturnColumns(String[] allColumns,
TableModel tableModel, Element parent, String clientIdPrefix) {
Set<String> columns = new LinkedHashSet<String>();
if (allColumns != null) {
EntityInfo entityInfo = tableModel.getEntityInfo();
List<String> excludeColumns = ((entityInfo != null) &&
(entityInfo.getExcludeColumns() != null) &&
!entityInfo.getExcludeColumns().isEmpty())
? entityInfo.getExcludeColumns() : null;
List<String> includeColumns = ((entityInfo != null) &&
(entityInfo.getIncludeColumns() != null) &&
!entityInfo.getIncludeColumns().isEmpty())
? entityInfo.getIncludeColumns() : null;
Map<String, String> displayNames = ((entityInfo != null) &&
(entityInfo.getDisplayNamesMap() != null) &&
!entityInfo.getDisplayNamesMap().isEmpty())
? entityInfo.getDisplayNamesMap() : null;
String sortByColumnName = "";
boolean isSortAscending = true;
if (tableModel instanceof SortedResultsTableModel) {
SortedResultsTableModel sortedTableModel = (SortedResultsTableModel) tableModel;
sortByColumnName = sortedTableModel.getSortByColumnName();
isSortAscending = sortedTableModel.isSortAscending();
}
for (int i = 0; i < allColumns.length; i++) {
if ((excludeColumns != null) &&
excludeColumns.contains(allColumns[i])) {
continue;
}
if ((includeColumns != null) &&
!includeColumns.contains(allColumns[i])) {
continue;
}
columns.add(allColumns[i]);
Hashtable<String, String> atts = new Hashtable<String, String>();
atts.put("id", clientIdPrefix + "_" + i);
atts.put("name",
(displayNames != null) ? displayNames.get(allColumns[i])
: allColumns[i]);
if ((sortByColumnName.length() > 0) &&
allColumns[i].equalsIgnoreCase(sortByColumnName)) {
atts.put("sorted", (isSortAscending) ? "asc" : "desc");
}
addElement("header", atts, parent);
}
}
return columns.toArray(new String[columns.size()]);
}
@SuppressWarnings("unchecked")
private static void encodeRow(TableModel tableModel, Object rowData,
String[] columns, RowDataIntrospector introspector, Element parent,
String clientId, int rowIndex) {
String[] actions = introspector.getActions(rowData);
Object[] values = introspector.getValues(rowData, columns);
// TODO: Need to be able to alter the format kit used by the
// renderer or to define a new format kit altogether.
FormatKit formatKit = new SimpleFormatKit();
// Do not create a row element if the results has no actions
// or values
if (isRowHasData(actions, values)) {
Element row = XMLUtil.createElement("row", null, parent);
row.setAttribute("id", clientId);
if (tableModel.getRowIndex() == rowIndex) {
row.setAttribute("selected", Boolean.toString(true));
} else {
row.setAttribute("selected", Boolean.toString(false));
}
if (tableModel instanceof SelectableTableModel) {
Set selected = ((SelectableTableModel) tableModel).getSelected();
row.setAttribute("selected",
Boolean.toString(selected.contains(clientId)));
}
if (actions != null) {
for (int i = 0; i < actions.length; i++) {
Element action = XMLUtil.createElement("action", null, row);
action.setAttribute("id", clientId + "_action_" + i);
action.setAttribute("name", actions[i]);
action.setAttribute("display-name",
getActionDisplayName(actions[i]));
}
}
if (values != null) {
for (int i = 0; i < values.length; i++) {
Element column = XMLUtil.createElement("column", null, row);
column.setAttribute("id", clientId + "_" + i);
column.setAttribute("value", formatKit.format(values[i]));
if (values[i] == null) {
column.setAttribute("is-null", "true");
}
}
}
}
}
private static boolean isRowHasData(String[] actions, Object[] values) {
return (((actions != null) && (actions.length > 0)) ||
(values != null));
}
private static void encodePagingPanel(int currentPage, int pageCount,
Element parent, String clientId) {
boolean isFirst = (currentPage == 0);
boolean isLast = (currentPage == (pageCount - 1));
FormatKit formatKit = new SimpleFormatKit();
Element column = XMLUtil.createElement("paging", null, parent);
column.setAttribute("id", clientId + "_first");
column.setAttribute("name", "first");
column.setAttribute("enabled", formatKit.format(!isFirst));
column.setAttribute("display-name", "First");
column = XMLUtil.createElement("paging", null, parent);
column.setAttribute("id", clientId + "_prev");
column.setAttribute("name", "previous");
column.setAttribute("enabled", formatKit.format(!isFirst));
column.setAttribute("display-name", "Previous");
Element action = XMLUtil.createElement("paging", null, parent);
action.setAttribute("id", clientId + "_next");
action.setAttribute("name", "next");
action.setAttribute("enabled", formatKit.format(!isLast));
action.setAttribute("display-name", "Next");
action = XMLUtil.createElement("paging", null, parent);
action.setAttribute("id", clientId + "_last");
action.setAttribute("name", "last");
action.setAttribute("enabled", formatKit.format(!isLast));
action.setAttribute("display-name", "Last");
for (int i = 1; i <= pageCount; i++) {
Element page = XMLUtil.createElement("page", null, parent);
page.setAttribute("id", clientId + "_" + formatKit.format(i));
page.setAttribute("value", formatKit.format(i));
page.setAttribute("name", "Page " + formatKit.format(i));
boolean selected = (i == (currentPage + 1));
page.setAttribute("selected", formatKit.format(selected));
}
}
private static String getActionDisplayName(String action) {
String displayName = action;
try {
// handle special case for 'View Metadata'
if (action.contains(";")) {
displayName = TextResources.getResourceString(
"results.ui.label.action." +
action.substring(0, action.indexOf(";"))) +
action.substring(action.indexOf(";"));
} else {
displayName = TextResources.getResourceString(
"results.ui.label.action." + action);
}
} catch (MissingResourceException ex) {
log.warn(String.format("Cannot find resource for action %1$s " +
"(results.ui.label.action.%1$s)", action));
}
return displayName;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -