001: /*
002: * $Id: SortableListViewHeaders.java 461192 2006-06-28 06:37:16Z ehillenius $
003: * $Revision: 461192 $ $Date: 2006-06-28 08:37:16 +0200 (Wed, 28 Jun 2006) $
004: *
005: * ==================================================================== Licensed
006: * under the Apache License, Version 2.0 (the "License"); you may not use this
007: * file except in compliance with the License. You may obtain a copy of the
008: * License at
009: *
010: * http://www.apache.org/licenses/LICENSE-2.0
011: *
012: * Unless required by applicable law or agreed to in writing, software
013: * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
014: * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
015: * License for the specific language governing permissions and limitations under
016: * the License.
017: */
018: package wicket.examples.displaytag.list;
019:
020: import org.apache.commons.logging.Log;
021: import org.apache.commons.logging.LogFactory;
022:
023: import wicket.MarkupContainer;
024: import wicket.markup.ComponentTag;
025: import wicket.markup.MarkupStream;
026: import wicket.markup.html.WebMarkupContainer;
027: import wicket.markup.html.list.ListView;
028: import wicket.markup.resolver.IComponentResolver;
029:
030: /**
031: * This is a convenient component to create sorted list view headers very
032: * easily. It first scans the markup for <th wicket:id=".*" ..>> tags and
033: * automatically creates a SortableListViewHeader for each.
034: * <p>
035: * The component can only be used with <thead> tags.
036: *
037: * @see SortableListViewHeaderGroup
038: * @see SortableListViewHeader
039: * @author Juergen Donnerstag
040: */
041: public class SortableListViewHeaders extends WebMarkupContainer
042: implements IComponentResolver {
043: /** Logging. */
044: private static final Log log = LogFactory
045: .getLog(SortableListViewHeaders.class);
046:
047: /** Each SortableTableHeader (without 's) must be attached to a group. */
048: final private SortableListViewHeaderGroup group;
049:
050: /**
051: * Construct.
052: *
053: * @param id
054: * The component's id; must not be null
055: * @param listView
056: * the underlying ListView
057: */
058: public SortableListViewHeaders(final String id,
059: final ListView listView) {
060: super (id);
061:
062: this .group = new SortableListViewHeaderGroup(this , listView);
063: }
064:
065: /**
066: * Compare two object of the column to be sorted, assuming both Objects
067: * support compareTo().
068: *
069: * @see Comparable#compareTo(java.lang.Object)
070: * @param header
071: * @param o1
072: * @param o2
073: * @return compare result
074: */
075: protected int compareTo(final SortableListViewHeader header,
076: final Object o1, final Object o2) {
077: Comparable obj1 = getObjectToCompare(header, o1);
078: Comparable obj2 = getObjectToCompare(header, o2);
079: return obj1.compareTo(obj2);
080: }
081:
082: /**
083: * Get one of the two Object to be compared for sorting a column.
084: *
085: * @param header
086: * @param object
087: * @return comparable object
088: */
089: protected Comparable getObjectToCompare(
090: final SortableListViewHeader header, final Object object) {
091: return (Comparable) object;
092: }
093:
094: /**
095: *
096: * @param container
097: * @param markupStream
098: * @param tag
099: * @return true, if component got resolved
100: */
101: public boolean resolve(final MarkupContainer container,
102: final MarkupStream markupStream, final ComponentTag tag) {
103: if (tag.getName().equalsIgnoreCase("th")) {
104: // Get component name
105: final String componentId = tag.getId();
106: if ((componentId != null) && (get(componentId) == null)) {
107: autoAdd(new SortableListViewHeader(componentId, group) {
108: protected int compareTo(final Object o1,
109: final Object o2) {
110: return SortableListViewHeaders.this .compareTo(
111: this , o1, o2);
112: }
113:
114: protected Comparable getObjectToCompare(
115: final Object object) {
116: return SortableListViewHeaders.this
117: .getObjectToCompare(this , object);
118: }
119: });
120: return true;
121: }
122: }
123:
124: return false;
125: }
126:
127: /**
128: * Scan the related markup and attach a SortableListViewHeader to each
129: * <th> tag found.
130: *
131: * @see wicket.Component#onRender(MarkupStream)
132: */
133: protected void onRender(final MarkupStream markupStream) {
134: // Must be <thead> tag
135: ComponentTag tag = markupStream.getTag();
136: checkComponentTag(tag, "thead");
137:
138: // Continue with default behavior
139: super.onRender(markupStream);
140: }
141: }
|