001 // Copyright 2004, 2005 The Apache Software Foundation 002 // 003 // Licensed under the Apache License, Version 2.0 (the "License"); 004 // you may not use this file except in compliance with the License. 005 // You may obtain a copy of the License at 006 // 007 // http://www.apache.org/licenses/LICENSE-2.0 008 // 009 // Unless required by applicable law or agreed to in writing, software 010 // distributed under the License is distributed on an "AS IS" BASIS, 011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012 // See the License for the specific language governing permissions and 013 // limitations under the License. 014 015 package org.apache.tapestry.contrib.table.components.inserted; 016 017 import org.apache.tapestry.BaseComponent; 018 import org.apache.tapestry.IAsset; 019 import org.apache.tapestry.IRequestCycle; 020 import org.apache.tapestry.contrib.table.components.TableColumns; 021 import org.apache.tapestry.contrib.table.model.ITableColumn; 022 import org.apache.tapestry.contrib.table.model.ITableModel; 023 import org.apache.tapestry.contrib.table.model.ITableModelSource; 024 import org.apache.tapestry.contrib.table.model.ITableRendererListener; 025 import org.apache.tapestry.contrib.table.model.ITableSortingState; 026 import org.apache.tapestry.contrib.table.model.simple.SimpleTableColumn; 027 import org.apache.tapestry.event.PageDetachListener; 028 import org.apache.tapestry.event.PageEvent; 029 import org.apache.tapestry.util.ComponentAddress; 030 031 /** 032 * A component that renders the default column header. 033 * 034 * If the current column is sortable, it renders the header as a link. 035 * Clicking on the link causes the table to be sorted on that column. 036 * Clicking on the link again causes the sorting order to be reversed. 037 * 038 * @author mindbridge 039 */ 040 public abstract class SimpleTableColumnComponent 041 extends BaseComponent 042 implements ITableRendererListener, PageDetachListener 043 { 044 // transient 045 private ITableColumn m_objColumn; 046 private ITableModelSource m_objModelSource; 047 048 public SimpleTableColumnComponent() 049 { 050 init(); 051 } 052 053 /** 054 * @see org.apache.tapestry.event.PageDetachListener#pageDetached(PageEvent) 055 */ 056 public void pageDetached(PageEvent arg0) 057 { 058 init(); 059 } 060 061 private void init() 062 { 063 m_objColumn = null; 064 m_objModelSource = null; 065 } 066 067 068 /** 069 * @see org.apache.tapestry.contrib.table.model.ITableRendererListener#initializeRenderer(IRequestCycle, ITableModelSource, ITableColumn, Object) 070 */ 071 public void initializeRenderer( 072 IRequestCycle objCycle, 073 ITableModelSource objSource, 074 ITableColumn objColumn, 075 Object objRow) 076 { 077 m_objModelSource = objSource; 078 m_objColumn = objColumn; 079 } 080 081 public ITableModel getTableModel() 082 { 083 return m_objModelSource.getTableModel(); 084 } 085 086 public boolean getColumnSorted() 087 { 088 return m_objColumn.getSortable(); 089 } 090 091 public String getDisplayName() 092 { 093 if (m_objColumn instanceof SimpleTableColumn) { 094 SimpleTableColumn objSimpleColumn = (SimpleTableColumn) m_objColumn; 095 return objSimpleColumn.getDisplayName(); 096 } 097 return m_objColumn.getColumnName(); 098 } 099 100 public boolean getIsSorted() 101 { 102 ITableSortingState objSortingState = getTableModel().getSortingState(); 103 String strSortColumn = objSortingState.getSortColumn(); 104 return m_objColumn.getColumnName().equals(strSortColumn); 105 } 106 107 public IAsset getSortImage() 108 { 109 IAsset objImageAsset; 110 111 IRequestCycle objCycle = getPage().getRequestCycle(); 112 ITableSortingState objSortingState = getTableModel().getSortingState(); 113 if (objSortingState.getSortOrder() 114 == ITableSortingState.SORT_ASCENDING) 115 { 116 objImageAsset = 117 (IAsset) objCycle.getAttribute( 118 TableColumns.TABLE_COLUMN_ARROW_UP_ATTRIBUTE); 119 if (objImageAsset == null) 120 objImageAsset = getAsset("sortUp"); 121 } 122 else 123 { 124 objImageAsset = 125 (IAsset) objCycle.getAttribute( 126 TableColumns.TABLE_COLUMN_ARROW_DOWN_ATTRIBUTE); 127 if (objImageAsset == null) 128 objImageAsset = getAsset("sortDown"); 129 } 130 131 return objImageAsset; 132 } 133 134 public Object[] getColumnSelectedParameters() 135 { 136 return new Object[] { 137 new ComponentAddress(m_objModelSource), 138 m_objColumn.getColumnName()}; 139 } 140 141 public void columnSelected(IRequestCycle objCycle) 142 { 143 Object[] arrArgs = objCycle.getListenerParameters(); 144 ComponentAddress objAddr = (ComponentAddress) arrArgs[0]; 145 String strColumnName = (String) arrArgs[1]; 146 147 ITableModelSource objSource = 148 (ITableModelSource) objAddr.findComponent(objCycle); 149 ITableModel objModel = objSource.getTableModel(); 150 151 ITableSortingState objState = objModel.getSortingState(); 152 if (strColumnName.equals(objState.getSortColumn())) 153 objState.setSortColumn(strColumnName, !objState.getSortOrder()); 154 else 155 objState.setSortColumn( 156 strColumnName, 157 ITableSortingState.SORT_ASCENDING); 158 159 // ensure that the change is saved 160 objSource.fireObservedStateChange(); 161 } 162 163 }