1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19 package org.apache.myfaces.custom.sortheader;
20
21 import javax.faces.component.UIComponent;
22 import javax.faces.event.AbortProcessingException;
23 import javax.faces.event.ActionEvent;
24 import javax.faces.event.FacesEvent;
25
26 import org.apache.commons.logging.Log;
27 import org.apache.commons.logging.LogFactory;
28 import org.apache.myfaces.component.html.ext.HtmlCommandLink;
29 import org.apache.myfaces.component.html.ext.HtmlDataTable;
30
31 /**
32 * Clickable sort column header.
33 *
34 * Must be nested inside an extended data_table tag. This tag is
35 * derived from the standard command_link tag and has the additional
36 * attributes columnName and arrow.
37 *
38 * Note: In contrast to normal command links, the default for the
39 * "immediate" attribute is "true". This is desirable as it avoids
40 * validating all input fields in the enclosing form when the column
41 * sort order changes. HOWEVER when the table contains input
42 * components "immediate" must be set to false; otherwise input
43 * fields will render blank after a sort, or will show their old
44 * values (ie will not appear to sort though output fields in the
45 * table will sort) when sort ordering is changed.
46 *
47 * Unless otherwise specified, all attributes accept static values or EL expressions.
48 *
49 * @JSFComponent
50 * name = "t:commandSortHeader"
51 * class = "org.apache.myfaces.custom.sortheader.HtmlCommandSortHeader"
52 * tagClass = "org.apache.myfaces.custom.sortheader.HtmlCommandSortHeaderTag"
53 * @since 1.1.7
54 * @author Manfred Geiler (latest modification by $Author: lu4242 $)
55 * @version $Revision: 691856 $ $Date: 2008-09-03 21:40:30 -0500 (Wed, 03 Sep 2008) $
56 */
57 public abstract class AbstractHtmlCommandSortHeader
58 extends HtmlCommandLink
59 {
60 private static final Log log = LogFactory.getLog(AbstractHtmlCommandSortHeader.class);
61
62 public static final String COMPONENT_TYPE = "org.apache.myfaces.HtmlCommandSortHeader";
63 public static final String COMPONENT_FAMILY = "javax.faces.Command";
64 public static final String DEFAULT_RENDERER_TYPE = "org.apache.myfaces.SortHeader";
65
66 /*
67 public boolean isImmediate()
68 {
69 return true;
70 }
71 */
72
73 public void broadcast(FacesEvent event) throws AbortProcessingException
74 {
75 if (event instanceof ActionEvent)
76 {
77 HtmlDataTable dataTable = findParentDataTable();
78 if (dataTable == null)
79 {
80 log.error("CommandSortHeader has no MyFacesHtmlDataTable parent");
81 }
82 else
83 {
84 String colName = getColumnName();
85 String currentSortColumn = dataTable.getSortColumn();
86
87 boolean currentAscending = dataTable.isSortAscending();
88
89 if (colName.equals(currentSortColumn))
90 {
91 String propName = getPropertyName();
92 if (propName != null)
93 dataTable.setSortProperty(getPropertyName());
94
95 dataTable.setSortColumn(getColumnName());
96 dataTable.setSortAscending(!currentAscending);
97 }
98 else
99 {
100 dataTable.setSortProperty(getPropertyName());
101 dataTable.setSortColumn(getColumnName());
102 dataTable.setSortAscending(true);
103 }
104 }
105 }
106 super.broadcast(event);
107 }
108
109 public HtmlDataTable findParentDataTable()
110 {
111 UIComponent parent = getParent();
112 while (parent != null)
113 {
114 if (parent instanceof HtmlDataTable)
115 {
116 return (HtmlDataTable)parent;
117 }
118 parent = parent.getParent();
119 }
120 return null;
121 }
122
123 /**
124 * The name of this column. This name must uniquely identify this
125 * column among all other (sortable) columns in the same
126 * data_table. The sortColumn attribute of the embedding
127 * data_table reflects the current sort column (see extended
128 * data_table).
129 *
130 * @JSFProperty
131 * required="true"
132 */
133 public abstract String getColumnName();
134
135 /**
136 * The property name associated with this column. This name must
137 * be one of the properties of the row object by which the sorting
138 * should be performed. The sortProperty attribute of the
139 * embedding data_table reflects the current sort property
140 * (see extended data_table).
141 *
142 * @JSFProperty
143 */
144 public abstract String getPropertyName();
145
146 /**
147 * Indicates whether an arrow, that shows the sort direction
148 * should be rendered. Default: false
149 *
150 * @JSFProperty
151 * defaultValue = "false"
152 */
153 public abstract boolean isArrow();
154
155 }