Hi Bernd, the sheet was already using a actionListener methodBinding to do the sort. The (mainly) only thing i did was to enable defining the methodBinding to use in the sheetTag.
Hmmm, when i started to write this mail, i thought it where mutch more complicated to change this to queue a SortActionEvent instead of an standard ActionEvent, because the event is generated in the CommandRendererBase, but i just got an idea how to catch and replace this ActionEvent with a SortActionEvent. This could be done in the queueEvent() method of UIData. Thoughts? Regards, Volker Bernd Bohmann wrote: > Hi Volker, > > I would prefer an actionListener and a SortActionEvent instead of a > sortActionListener. > > I don't like the x XYZActionListener. > > Can you change it? > > Regards > > Bernd > > [EMAIL PROTECTED] schrieb: > >> Author: weber >> Date: Fri Feb 24 15:37:31 2006 >> New Revision: 380866 >> >> URL: http://svn.apache.org/viewcvs?rev=380866&view=rev >> Log: >> add sortActionListener attribute to sheet >> >> Modified: >> >> incubator/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/ComponentUtil.java >> >> >> incubator/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/Sorter.java >> >> >> incubator/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/UIData.java >> >> >> incubator/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/taglib/component/SheetTag.java >> >> >> incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/TobagoDemoController.java >> >> >> incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/model/solar/SolarObject.java >> >> >> incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/overview/OverviewController.java >> >> >> incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/overview/SheetConfig.java >> >> >> incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/overview/sheetControl.jsp >> >> >> incubator/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/SheetRenderer.java >> >> >> incubator/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/resources/org/apache/myfaces/tobago/renderkit/html/standard/standard/script/tobago-sheet.js >> >> >> Modified: >> incubator/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/ComponentUtil.java >> >> URL: >> http://svn.apache.org/viewcvs/incubator/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/ComponentUtil.java?rev=380866&r1=380865&r2=380866&view=diff >> >> ============================================================================== >> >> --- >> incubator/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/ComponentUtil.java >> (original) >> +++ >> incubator/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/ComponentUtil.java >> Fri Feb 24 15:37:31 2006 >> @@ -23,30 +23,7 @@ >> >> import org.apache.commons.logging.Log; >> import org.apache.commons.logging.LogFactory; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_ACCESS_KEY; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_ACTION_STRING; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_ALIGN; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_DISABLED; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_FOR; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_HOVER; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_LABEL; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_LABEL_WITH_ACCESS_KEY; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_READONLY; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_RENDER_RANGE; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_RENDER_RANGE_EXTERN; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_SORTABLE; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_VALUE; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.COMMAND_TYPE_NAVIGATE; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.COMMAND_TYPE_RESET; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.COMMAND_TYPE_SCRIPT; >> -import static org.apache.myfaces.tobago.TobagoConstants.FACET_CHECKBOX; >> -import static org.apache.myfaces.tobago.TobagoConstants.FACET_LABEL; >> -import static org.apache.myfaces.tobago.TobagoConstants.FACET_RADIO; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.RENDERER_TYPE_OUT; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.RENDERER_TYPE_SELECT_BOOLEAN_CHECKBOX; >> >> -import static >> org.apache.myfaces.tobago.TobagoConstants.RENDERER_TYPE_SELECT_ONE_RADIO; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_CREATE_SPAN; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_ESCAPE; >> +import static org.apache.myfaces.tobago.TobagoConstants.*; >> import org.apache.myfaces.tobago.el.ConstantMethodBinding; >> import org.apache.myfaces.tobago.event.SheetStateChangeEvent; >> import org.apache.myfaces.tobago.renderkit.RendererBase; >> @@ -55,33 +32,22 @@ >> >> import javax.faces.FactoryFinder; >> import javax.faces.application.Application; >> -import javax.faces.component.ActionSource; >> -import javax.faces.component.EditableValueHolder; >> -import javax.faces.component.UIColumn; >> +import javax.faces.component.*; >> import javax.faces.component.UICommand; >> -import javax.faces.component.UIComponent; >> -import javax.faces.component.UIGraphic; >> import javax.faces.component.UIOutput; >> -import javax.faces.component.UIParameter; >> -import javax.faces.component.UISelectBoolean; >> import javax.faces.component.UISelectItem; >> -import javax.faces.component.UISelectItems; >> -import javax.faces.component.ValueHolder; >> import javax.faces.context.FacesContext; >> import javax.faces.convert.Converter; >> import javax.faces.el.MethodBinding; >> import javax.faces.el.ValueBinding; >> +import javax.faces.event.ActionEvent; >> import javax.faces.event.ActionListener; >> import javax.faces.model.SelectItem; >> import javax.faces.render.RenderKit; >> import javax.faces.render.RenderKitFactory; >> import javax.faces.webapp.UIComponentTag; >> import javax.servlet.jsp.JspException; >> -import java.util.ArrayList; >> -import java.util.Collection; >> -import java.util.Iterator; >> -import java.util.List; >> -import java.util.Map; >> +import java.util.*; >> >> public class ComponentUtil { >> >> @@ -90,6 +56,9 @@ >> private static final String RENDER_KEY_PREFIX >> = >> "org.apache.myfaces.tobago.component.ComponentUtil.RendererKeyPrefix_"; >> >> + private static final Class[] ACTION_LISTENER_ARGS = >> {ActionEvent.class}; >> + >> + >> private ComponentUtil() { >> } >> >> @@ -917,13 +886,27 @@ >> final Application application = facesContext.getApplication(); >> if (actionListener != null) { >> if (UIComponentTag.isValueReference(actionListener)) { >> - Class[] arguments = {javax.faces.event.ActionEvent.class}; >> MethodBinding binding >> - = application.createMethodBinding(actionListener, >> arguments); >> + = application.createMethodBinding(actionListener, >> ACTION_LISTENER_ARGS); >> command.setActionListener(binding); >> } else { >> throw new IllegalArgumentException( >> "Must be a valueReference (actionListener): " + >> actionListener); >> + } >> + } >> + } >> + >> + public static void setSortActionListener(UIData data, String >> actionListener) { >> + final FacesContext facesContext = FacesContext.getCurrentInstance(); >> + final Application application = facesContext.getApplication(); >> + if (actionListener != null) { >> + if (UIComponentTag.isValueReference(actionListener)) { >> + MethodBinding binding >> + = application.createMethodBinding(actionListener, >> ACTION_LISTENER_ARGS); >> + data.setSortActionListener(binding); >> + } else { >> + throw new IllegalArgumentException( >> + "Must be a valueReference (sortActionListener): " + >> actionListener); >> } >> } >> } >> >> Modified: >> incubator/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/Sorter.java >> >> URL: >> http://svn.apache.org/viewcvs/incubator/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/Sorter.java?rev=380866&r1=380865&r2=380866&view=diff >> >> ============================================================================== >> >> --- >> incubator/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/Sorter.java >> (original) >> +++ >> incubator/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/Sorter.java >> Fri Feb 24 15:37:31 2006 >> @@ -21,15 +21,12 @@ >> import org.apache.myfaces.tobago.TobagoConstants; >> import static org.apache.myfaces.tobago.TobagoConstants.ATTR_SORTABLE; >> import org.apache.myfaces.tobago.model.SheetState; >> -import org.apache.myfaces.tobago.model.SortableByApplication; >> import org.apache.myfaces.tobago.util.BeanComparator; >> import org.apache.myfaces.tobago.util.ValueBindingComparator; >> >> -import javax.faces.component.UIColumn; >> -import javax.faces.component.UIComponent; >> +import javax.faces.component.*; >> import javax.faces.component.UIInput; >> import javax.faces.component.UIOutput; >> -import javax.faces.component.UISelectBoolean; >> import javax.faces.context.FacesContext; >> import javax.faces.el.EvaluationException; >> import javax.faces.el.MethodBinding; >> @@ -37,11 +34,7 @@ >> import javax.faces.el.ValueBinding; >> import javax.faces.event.ActionEvent; >> import javax.faces.model.DataModel; >> -import java.util.Arrays; >> -import java.util.Collections; >> -import java.util.Comparator; >> -import java.util.Iterator; >> -import java.util.List; >> +import java.util.*; >> >> /** >> * User: weber >> @@ -52,8 +45,6 @@ >> >> private static final Log LOG = LogFactory.getLog(Sorter.class); >> >> - public static final String ID_PREFIX = "sorter_"; >> - >> >> public Object invoke(FacesContext facesContext, Object[] aobj) >> throws EvaluationException { >> @@ -63,87 +54,66 @@ >> if (LOG.isDebugEnabled()) { >> LOG.debug("sorterId = " + command.getId()); >> } >> - UIData data = (UIData) command.getParent(); >> + UIColumn column = (UIColumn) command.getParent(); >> + UIData data = (UIData) column.getParent(); >> + >> Object value = data.getValue(); >> if (value instanceof DataModel) { >> value = ((DataModel) value).getWrappedData(); >> } >> SheetState sheetState = data.getSheetState(facesContext); >> - int column = sheetState.getSortedColumn(); >> - boolean ascending = sheetState.isAscending(); >> >> Comparator comparator = null; >> >> - if (value instanceof SortableByApplication >> - || value instanceof List >> - || value instanceof Object[]) { >> + if (value instanceof List || value instanceof Object[]) { >> String sortProperty; >> >> - if (command.getId() != null && >> command.getId().startsWith(ID_PREFIX)) { >> - UIColumn uiColumn = null; >> - try { >> - int actualColumn = >> - Integer.parseInt( >> - command.getId().substring(ID_PREFIX.length())); >> - if (actualColumn == column) { >> - ascending = !ascending; >> - } else { >> - ascending = true; >> - column = actualColumn; >> - } >> - sheetState.setAscending(ascending); >> - sheetState.setSortedColumn(column); >> + try { >> + if (!updateSheetState(data, column, sheetState)) { >> + return null; >> + } >> >> - uiColumn = data.getRendererdColumns().get(column); >> - UIComponent child = >> getFirstSortableChild(uiColumn.getChildren()); >> - if (child != null) { >> - ValueBinding valueBinding = >> child.getValueBinding("value"); >> - String var = data.getVar(); >> - >> - if (valueBinding != null) { >> - if >> (isSimpleProperty(valueBinding.getExpressionString())) { >> - String expressionString = >> valueBinding.getExpressionString(); >> - if (expressionString.startsWith("#{") >> - && expressionString.endsWith("}")) { >> - expressionString = >> - expressionString.substring(2, >> - expressionString.length() - 1); >> - } >> - sortProperty = >> expressionString.substring(var.length() + 1); >> - >> - comparator = new BeanComparator(sortProperty, null, >> !ascending); >> - >> - if (LOG.isDebugEnabled()) { >> - LOG.debug("Sort property is " + sortProperty); >> - } >> - } else { >> - comparator = new >> ValueBindingComparator(facesContext, var, valueBinding, !ascending); >> + UIComponent child = >> getFirstSortableChild(column.getChildren()); >> + if (child != null) { >> + ValueBinding valueBinding = child.getValueBinding("value"); >> + String var = data.getVar(); >> + >> + if (valueBinding != null) { >> + if >> (isSimpleProperty(valueBinding.getExpressionString())) { >> + String expressionString = >> valueBinding.getExpressionString(); >> + if (expressionString.startsWith("#{") >> + && expressionString.endsWith("}")) { >> + expressionString = >> + expressionString.substring(2, >> + expressionString.length() - 1); >> } >> - } >> + sortProperty = >> expressionString.substring(var.length() + 1); >> >> - } else { >> - LOG.error("No sortable component found!"); >> - removeSortableAttribute(uiColumn); >> - return null; >> - } >> - } catch (Exception e) { >> - LOG.error("Error while extracting sortMethod :" + >> e.getMessage(), e); >> - if (uiColumn != null) { >> - removeSortableAttribute(uiColumn); >> + comparator = new BeanComparator( >> + sortProperty, null, !sheetState.isAscending()); >> + >> + if (LOG.isDebugEnabled()) { >> + LOG.debug("Sort property is " + sortProperty); >> + } >> + } else { >> + comparator = new ValueBindingComparator( >> + facesContext, var, valueBinding, >> !sheetState.isAscending()); >> + } >> } >> + >> + } else { >> + LOG.error("No sortable component found!"); >> + removeSortableAttribute(column); >> return null; >> } >> - } else { >> - LOG.error( >> - "Sorter.invoke() with illegal id in ActionEvent's >> source"); >> + } catch (Exception e) { >> + LOG.error("Error while extracting sortMethod :" + >> e.getMessage(), e); >> + if (column != null) { >> + removeSortableAttribute(column); >> + } >> return null; >> } >> >> - //if (value instanceof SortableByApplication) { >> - //((SortableByApplication) value).sortBy(sortProperty); >> - >> - // TODO ???? sortable by application >> - if (!(value instanceof SortableByApplication)) { >> // TODO: locale / comparator parameter? >> // don't compare numbers with Collator.getInstance() >> comparator >> // Comparator comparator = Collator.getInstance(); >> @@ -151,16 +121,43 @@ >> >> if (value instanceof List) { >> Collections.sort((List) value, comparator); >> - } else { // if (value instanceof Object[]) { >> + } else { // value is instanceof Object[] >> Arrays.sort((Object[]) value, comparator); >> } >> - } >> + >> } else { // DataModel?, ResultSet, Result or Object >> LOG.warn("Sorting not supported for type " >> + (value != null ? value.getClass().toString() : >> "null")); >> } >> } >> return null; >> + } >> + >> + private boolean updateSheetState(UIData data, UIColumn uiColumn, >> SheetState sheetState) { >> + int actualColumn = -1; >> + List<UIColumn> rendererdColumns = data.getRendererdColumns(); >> + for (int i = 0; i < rendererdColumns.size(); i++) { >> + if (uiColumn == rendererdColumns.get(i)) { >> + actualColumn = i; >> + break; >> + } >> + } >> + if (actualColumn == -1) { >> + LOG.warn("Can't find column to sort in rendered columns of >> sheet!"); >> + return false; >> + } >> + >> + int column = sheetState.getSortedColumn(); >> + boolean ascending = sheetState.isAscending(); >> + if (actualColumn == column) { >> + ascending = !ascending; >> + } else { >> + ascending = true; >> + column = actualColumn; >> + } >> + sheetState.setAscending(ascending); >> + sheetState.setSortedColumn(column); >> + return true; >> } >> >> private boolean isSimpleProperty(String expressionString) { >> >> Modified: >> incubator/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/UIData.java >> >> URL: >> http://svn.apache.org/viewcvs/incubator/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/UIData.java?rev=380866&r1=380865&r2=380866&view=diff >> >> ============================================================================== >> >> --- >> incubator/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/UIData.java >> (original) >> +++ >> incubator/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/component/UIData.java >> Fri Feb 24 15:37:31 2006 >> @@ -53,12 +53,14 @@ >> >> public static final String COMPONENT_TYPE = >> "org.apache.myfaces.tobago.Data"; >> >> + public static final String FACET_SORTER = "sorter"; >> + public static final String SORTER_ID = "sorter"; >> + >> private MethodBinding stateChangeListener; >> >> private List<Integer> widthList; >> >> - // TODO: should be removed? >> - private Sorter sorter; >> + private MethodBinding sortActionListener; >> >> private SheetState sheetState; >> >> @@ -320,10 +322,10 @@ >> private void updateSheetState(FacesContext facesContext) { >> SheetState state = getSheetState(facesContext); >> if (state != null) { >> - // ensure sorter >> -// getSorter(); >> -// state.setSortedColumn(sorter != null ? sorter.getColumn() : -1); >> -// state.setAscending(sorter != null && sorter.isAscending()); >> + // ensure sortActionListener >> +// getSortActionListener(); >> +// state.setSortedColumn(sortActionListener != null ? >> sortActionListener.getColumn() : -1); >> +// state.setAscending(sortActionListener != null && >> sortActionListener.isAscending()); >> state.setSelectedRows((List<Integer>) >> getAttributes().get(ATTR_SELECTED_LIST_STRING)); >> state.setColumnWidths((String) >> @@ -335,7 +337,7 @@ >> Object[] saveState = new Object[5]; >> saveState[0] = super.saveState(context); >> saveState[1] = sheetState; >> - saveState[2] = sorter; >> + saveState[2] = saveAttachedState(context, sortActionListener); >> saveState[3] = saveAttachedState(context, stateChangeListener); >> if (showHeaderSet) { >> saveState[4] = showHeader; >> @@ -347,7 +349,7 @@ >> Object[] values = (Object[]) savedState; >> super.restoreState(context, values[0]); >> sheetState = (SheetState) values[1]; >> - sorter = (Sorter) values[2]; >> + sortActionListener = (MethodBinding) >> restoreAttachedState(context, values[2]); >> stateChangeListener = (MethodBinding) >> restoreAttachedState(context, values[3]); >> if (values[4] != null) { >> showHeaderSet = true; >> @@ -376,17 +378,16 @@ >> return columns; >> } >> >> - // TODO: should be removed? >> - public Sorter getSorter() { >> - if (sorter != null) { >> - return sorter; >> + public MethodBinding getSortActionListener() { >> + if (sortActionListener != null) { >> + return sortActionListener; >> } else { >> return new Sorter(); >> } >> } >> >> - public void setSorter(Sorter sorter) { >> - this.sorter = sorter; >> + public void setSortActionListener(MethodBinding sortActionListener) { >> + this.sortActionListener = sortActionListener; >> } >> >> public void queueEvent(FacesEvent facesEvent) { >> >> Modified: >> incubator/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/taglib/component/SheetTag.java >> >> URL: >> http://svn.apache.org/viewcvs/incubator/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/taglib/component/SheetTag.java?rev=380866&r1=380865&r2=380866&view=diff >> >> ============================================================================== >> >> --- >> incubator/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/taglib/component/SheetTag.java >> (original) >> +++ >> incubator/tobago/trunk/tobago-core/src/main/java/org/apache/myfaces/tobago/taglib/component/SheetTag.java >> Fri Feb 24 15:37:31 2006 >> @@ -16,19 +16,7 @@ >> * limitations under the License. >> */ >> >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_COLUMNS; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_DIRECT_LINK_COUNT; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_FIRST; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_FORCE_VERTICAL_SCROLLBAR; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_INNER_WIDTH; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_ROWS; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_SHOW_DIRECT_LINKS; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_SHOW_HEADER; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_SHOW_PAGE_RANGE; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_SHOW_ROW_RANGE; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_STATE; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_VALUE; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_VAR; >> +import static org.apache.myfaces.tobago.TobagoConstants.*; >> import org.apache.myfaces.tobago.apt.annotation.BodyContentDescription; >> import org.apache.myfaces.tobago.apt.annotation.Tag; >> import org.apache.myfaces.tobago.apt.annotation.TagAttribute; >> @@ -59,6 +47,7 @@ >> private String forceVerticalScrollbar; >> private String state; >> private String stateChangeListener; >> + private String sortActionListener; >> >> public String getComponentType() { >> // TODO: implement uidata with overridden processUpdates to store >> state >> @@ -80,6 +69,7 @@ >> forceVerticalScrollbar = null; >> state = null; >> stateChangeListener = null; >> + sortActionListener = null; >> } >> >> protected void setProperties(UIComponent component) { >> @@ -101,6 +91,7 @@ >> data.getAttributes().put(ATTR_INNER_WIDTH, new Integer(-1)); >> ComponentUtil.setValueBinding(component, ATTR_STATE, state); >> ComponentUtil.setStateChangeListener(data, stateChangeListener); >> + ComponentUtil.setSortActionListener(data, sortActionListener); >> >> } >> >> @@ -280,5 +271,24 @@ >> public void setStateChangeListener(String stateChangeListener) { >> this.stateChangeListener = stateChangeListener; >> } >> + >> + /** >> + * MethodBinding representing an actionListener method that will be >> + * invoked when sorting was requested by the user. >> + * Use this if your application needs special handling for sorting >> columns. >> + * If this is not set and the sortable attribute column is not >> false the sheet >> + * implementation will use a default sort method. >> + * The expression must evaluate to a public method that takes an >> + * ActionEvent parameter, with a return type of void. >> + * The parent of the actionEvents source will be the UIColumn >> object for that >> + * the sorting is requested, >> + * <code>UIColumn column = >> (UIColumn)actionEvent.getSource().getParent()</code>. >> + */ >> + @TagAttribute >> + @UIComponentTagAttribute() >> + public void setSortActionListener(String sortActionListener) { >> + this.sortActionListener = sortActionListener; >> + } >> + >> } >> >> >> Modified: >> incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/TobagoDemoController.java >> >> URL: >> http://svn.apache.org/viewcvs/incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/TobagoDemoController.java?rev=380866&r1=380865&r2=380866&view=diff >> >> ============================================================================== >> >> --- >> incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/TobagoDemoController.java >> (original) >> +++ >> incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/TobagoDemoController.java >> Fri Feb 24 15:37:31 2006 >> @@ -61,6 +61,8 @@ >> >> private SolarObject[] solarArray; >> >> + private List<SolarObject> solarList; >> + >> private List<UIColumn> solarArrayColumns; >> >> private String solarArrayColumnLayout; >> @@ -148,6 +150,7 @@ >> = "**strong text**\n\n__emphasis__\n\nnormaler >> text\n\n__dieses " >> + "ist emphasis__\n\n**und nochmal strong**\n\n**__ strong >> und emphasis__**"; >> solarArray = SolarObject.getArray(); >> + solarList = SolarObject.getList(); >> solarArrayColumns = createSolarArrayColumns(); >> solarArrayColumnLayout = "3*; 3*; 3*"; >> >> @@ -292,6 +295,14 @@ >> >> public void setSolarArray(SolarObject[] solarArray) { >> this.solarArray = solarArray; >> + } >> + >> + public List<SolarObject> getSolarList() { >> + return solarList; >> + } >> + >> + public void setSolarList(List<SolarObject> solarList) { >> + this.solarList = solarList; >> } >> >> public List<UIColumn> getSolarArrayColumns() { >> >> Modified: >> incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/model/solar/SolarObject.java >> >> URL: >> http://svn.apache.org/viewcvs/incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/model/solar/SolarObject.java?rev=380866&r1=380865&r2=380866&view=diff >> >> ============================================================================== >> >> --- >> incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/model/solar/SolarObject.java >> (original) >> +++ >> incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/model/solar/SolarObject.java >> Fri Feb 24 15:37:31 2006 >> @@ -176,7 +176,17 @@ >> return array; >> } >> >> - public static List<SolarObject> getSatellites(String center) { >> + >> + public static List<SolarObject> getList() { >> + SolarObject[] array = getArray(); >> + List<SolarObject> list = new ArrayList<SolarObject>(array.length); >> + for (SolarObject object : array) { >> + list.add(object); >> + } >> + return list; >> + } >> + >> + public static List<SolarObject> getSatellites(String center) { >> List<SolarObject> collect = new ArrayList<SolarObject>(); >> SolarObject[] all = getArray(); >> for (int i = 0; i < all.length; i++) { >> >> Modified: >> incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/overview/OverviewController.java >> >> URL: >> http://svn.apache.org/viewcvs/incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/overview/OverviewController.java?rev=380866&r1=380865&r2=380866&view=diff >> >> ============================================================================== >> >> --- >> incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/overview/OverviewController.java >> (original) >> +++ >> incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/overview/OverviewController.java >> Fri Feb 24 15:37:31 2006 >> @@ -23,9 +23,12 @@ >> >> import org.apache.commons.logging.Log; >> import org.apache.commons.logging.LogFactory; >> +import org.apache.myfaces.tobago.component.Sorter; >> +import org.apache.myfaces.tobago.component.UIData; >> import org.apache.myfaces.tobago.context.ResourceManager; >> import org.apache.myfaces.tobago.context.ResourceManagerFactory; >> >> +import javax.faces.component.UICommand; >> import javax.faces.context.FacesContext; >> import javax.faces.event.ActionEvent; >> import javax.faces.model.SelectItem; >> @@ -109,6 +112,19 @@ >> >> public void click(ActionEvent actionEvent) { >> lastAction = actionEvent.getComponent().getId(); >> + } >> + >> + + public void sheetSorter(ActionEvent event) { >> + Object eventSource = event.getSource(); >> + UIData data = (UIData) ((UICommand) >> eventSource).getParent().getParent(); >> + List list = (List) data.getValue(); >> + Object sun = list.remove(0); >> + Object[] objects = new Object[1]; >> + objects[0] = event; >> + Sorter sorter = new Sorter(); >> + sorter.invoke(FacesContext.getCurrentInstance(), objects); >> + list.add(0, sun); >> } >> >> public boolean getShowPopup() { >> >> Modified: >> incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/overview/SheetConfig.java >> >> URL: >> http://svn.apache.org/viewcvs/incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/overview/SheetConfig.java?rev=380866&r1=380865&r2=380866&view=diff >> >> ============================================================================== >> >> --- >> incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/overview/SheetConfig.java >> (original) >> +++ >> incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/java/org/apache/myfaces/tobago/example/demo/overview/SheetConfig.java >> Fri Feb 24 15:37:31 2006 >> @@ -47,7 +47,7 @@ >> private boolean sheetConfigPopup; >> >> public SheetConfig() { >> - sheetPagingStart = 1; >> + sheetPagingStart = 0; >> sheetPagingLength = 7; >> sheetDirectLinkCount = 5; >> sheetDirectLinkCountItems = createSheetDirectLinkCountItems(); >> >> Modified: >> incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/overview/sheetControl.jsp >> >> URL: >> http://svn.apache.org/viewcvs/incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/overview/sheetControl.jsp?rev=380866&r1=380865&r2=380866&view=diff >> >> ============================================================================== >> >> --- >> incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/overview/sheetControl.jsp >> (original) >> +++ >> incubator/tobago/trunk/tobago-example/tobago-example-demo/src/main/webapp/overview/sheetControl.jsp >> Fri Feb 24 15:37:31 2006 >> @@ -106,7 +106,7 @@ >> </tc:toolBar> >> </f:facet> >> >> - <tc:sheet value="#{demo.solarArray}" id="sheet" >> + <tc:sheet value="#{demo.solarList}" id="sheet" >> columns="3*;1*;3*;3*;3*;3*" var="luminary" >> state="#{demo.sheetState}" >> >> showHeader="#{overviewController.sheetConfig.sheetShowHeader}" >> @@ -116,7 +116,8 @@ >> >> pagingStart="#{overviewController.sheetConfig.sheetPagingStart}" >> >> pagingLength="#{overviewController.sheetConfig.sheetPagingLength}" >> >> directLinkCount="#{overviewController.sheetConfig.sheetDirectLinkCount}" >> - stateChangeListener="#{demo.stateChangeListener}"> >> + stateChangeListener="#{demo.stateChangeListener}" >> + sortActionListener="#{overviewController.sheetSorter}"> >> <tc:column label="#{overviewBundle.solarArrayName}" >> id="name" sortable="true"> >> <tc:out value="#{luminary.name}" id="t_name" /> >> </tc:column> >> >> Modified: >> incubator/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/SheetRenderer.java >> >> URL: >> http://svn.apache.org/viewcvs/incubator/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/SheetRenderer.java?rev=380866&r1=380865&r2=380866&view=diff >> >> ============================================================================== >> >> --- >> incubator/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/SheetRenderer.java >> (original) >> +++ >> incubator/tobago/trunk/tobago-theme/tobago-theme-scarborough/src/main/java/org/apache/myfaces/tobago/renderkit/html/scarborough/standard/tag/SheetRenderer.java >> Fri Feb 24 15:37:31 2006 >> @@ -23,44 +23,11 @@ >> >> import org.apache.commons.logging.Log; >> import org.apache.commons.logging.LogFactory; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_ACTION_STRING; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_ALIGN; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_COMMAND_TYPE; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_DIRECT_LINK_COUNT; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_DISABLED; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_FOOTER_HEIGHT; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_FORCE_VERTICAL_SCROLLBAR; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_IMAGE; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_INLINE; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_LABEL; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_LAYOUT_HEIGHT; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_MENU_POPUP; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_MENU_POPUP_TYPE; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_SELECTED_LIST_STRING; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_SHOW_DIRECT_LINKS; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_SHOW_PAGE_RANGE; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_SHOW_ROW_RANGE; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_SORTABLE; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_STYLE; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_STYLE_BODY; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_STYLE_CLASS; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_STYLE_HEADER; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_TYPE; >> -import static org.apache.myfaces.tobago.TobagoConstants.ATTR_WIDTH_LIST; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.ATTR_WIDTH_LIST_STRING; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.COMMAND_TYPE_SCRIPT; >> -import static org.apache.myfaces.tobago.TobagoConstants.FACET_MENUPOPUP; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.FACET_PAGER_PAGE; >> -import static org.apache.myfaces.tobago.TobagoConstants.FACET_PAGER_ROW; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.RENDERER_TYPE_LINK; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.RENDERER_TYPE_MENUBAR; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.RENDERER_TYPE_MENUCOMMAND; >> -import static >> org.apache.myfaces.tobago.TobagoConstants.SUBCOMPONENT_SEP; >> +import static org.apache.myfaces.tobago.TobagoConstants.*; >> import org.apache.myfaces.tobago.ajax.api.AjaxRenderer; >> import org.apache.myfaces.tobago.ajax.api.AjaxUtils; >> import org.apache.myfaces.tobago.component.ComponentUtil; >> import org.apache.myfaces.tobago.component.Pager; >> -import org.apache.myfaces.tobago.component.Sorter; >> import org.apache.myfaces.tobago.component.UIColumnSelector; >> import org.apache.myfaces.tobago.component.UIData; >> import org.apache.myfaces.tobago.config.TobagoConfig; >> @@ -77,22 +44,13 @@ >> import org.apache.myfaces.tobago.webapp.TobagoResponseWriter; >> >> import javax.faces.application.Application; >> -import javax.faces.component.UIColumn; >> -import javax.faces.component.UICommand; >> -import javax.faces.component.UIComponent; >> -import javax.faces.component.UIPanel; >> -import javax.faces.component.UIViewRoot; >> +import javax.faces.component.*; >> import javax.faces.context.FacesContext; >> import javax.faces.context.ResponseWriter; >> import javax.faces.el.MethodBinding; >> import java.io.IOException; >> import java.text.MessageFormat; >> -import java.util.ArrayList; >> -import java.util.Collections; >> -import java.util.Iterator; >> -import java.util.List; >> -import java.util.Locale; >> -import java.util.Map; >> +import java.util.*; >> >> public class SheetRenderer extends RendererBase >> implements SheetRendererWorkaround, AjaxRenderer { >> @@ -774,7 +732,7 @@ >> String image1x1, int sortMarkerWidth) throws IOException { >> String sheetId = component.getClientId(facesContext); >> Application application = facesContext.getApplication(); >> - Sorter sorter = component.getSorter(); >> + MethodBinding sorter = component.getSortActionListener(); >> >> List columnWidths >> = (List) component.getAttributes().get(ATTR_WIDTH_LIST); >> @@ -797,18 +755,23 @@ >> ComponentUtil.getBooleanAttribute(column, >> ATTR_SORTABLE); >> if (sortable && !(column instanceof UIColumnSelector)) { >> - String sorterId = Sorter.ID_PREFIX + columnCount; >> + UICommand sortCommand = (UICommand) >> column.getFacet(UIData.FACET_SORTER); >> + if (sortCommand == null) { >> + String columnId = column.getClientId(facesContext); >> + String sorterId = >> columnId.substring(columnId.lastIndexOf(":") + 1 ) >> + + "_" + UIData.SORTER_ID; >> + sortCommand >> + = (UICommand) >> application.createComponent(UICommand.COMPONENT_TYPE); >> + sortCommand.setRendererType(RENDERER_TYPE_LINK); >> + sortCommand.setActionListener(sorter); >> + sortCommand.setId(sorterId); >> + column.getFacets().put(UIData.FACET_SORTER, >> sortCommand); + } >> + >> String onclick = "submitAction('" >> + ComponentUtil.findPage(component).getFormId(facesContext) >> - + "','" + component.getClientId(facesContext) + ":" + >> sorterId + "')"; >> + + "','" + sortCommand.getClientId(facesContext) + "')"; >> writer.writeAttribute("onclick", onclick, null); >> - UICommand sortCommand = (UICommand) >> - application.createComponent(UICommand.COMPONENT_TYPE); >> - sortCommand.setRendererType(RENDERER_TYPE_LINK); >> - sortCommand.setActionListener(sorter); >> - sortCommand.setId(sorterId); >> - component.getFacets().put(sorterId, sortCommand); >> - sortCommand.getClientId(facesContext); // this must called here >> to fix the ClientId >> >> writer.writeAttribute("title", >> ResourceManagerUtil.getPropertyNotNull(facesContext, "tobago", >> >> Modified: >> incubator/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/resources/org/apache/myfaces/tobago/renderkit/html/standard/standard/script/tobago-sheet.js >> >> URL: >> http://svn.apache.org/viewcvs/incubator/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/resources/org/apache/myfaces/tobago/renderkit/html/standard/standard/script/tobago-sheet.js?rev=380866&r1=380865&r2=380866&view=diff >> >> ============================================================================== >> >> --- >> incubator/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/resources/org/apache/myfaces/tobago/renderkit/html/standard/standard/script/tobago-sheet.js >> (original) >> +++ >> incubator/tobago/trunk/tobago-theme/tobago-theme-standard/src/main/resources/org/apache/myfaces/tobago/renderkit/html/standard/standard/script/tobago-sheet.js >> Fri Feb 24 15:37:31 2006 >> @@ -34,6 +34,9 @@ >> LOG.debug("New Sheet with id " + this.sheetId); >> }, >> >> + sortOnclickRegExp : >> + new RegExp("submitAction\\(('|\")(.*?)('|\") *, >> *('|\")(.*?)('|\")\\)"), >> + >> setup: function() { >> >> // setup sorting headers >> @@ -42,7 +45,18 @@ >> var headerBox = $(idPrefix + i++); >> while (headerBox) { >> if (headerBox.onclick) { >> + var match = >> this.sortOnclickRegExp.exec(headerBox.onclick.valueOf()); >> +// LOG.debug("match[0] = " + match[0]); >> +// LOG.debug("match[1] = " + match[1]); >> +// LOG.debug("*match[2] = " + match[2]); >> +// LOG.debug("match[3] = " + match[3]); >> +// LOG.debug("match[4] = " + match[4]); >> +// LOG.debug("*match[5] = " + match[5]); >> +// LOG.debug("match[6] = " + match[6]); >> +// headerBox.formId = match[2]; >> + headerBox.sorterId = match[5]; >> headerBox.onclick = null; >> +// LOG.debug("headerBox.id = " + headerBox.id); >> Event.observe(headerBox, "click", >> this.doSort.bindAsEventListener(this)); >> } >> headerBox = $(idPrefix + i++); >> @@ -97,10 +111,12 @@ >> >> doSort: function(event) { >> var element = Event.element(event); >> - var idx = element.id.lastIndexOf('_'); >> - idx = element.id.substring(idx + 1); >> - var action = this.sheetId + Tobago.componentSeparator + "sorter_" >> + idx; >> - this.reloadWithAction(action); >> + if (!element.sorterId) { >> + element = element.parentNode; >> + } >> +// LOG.debug("element.id = " + element.id); >> +// LOG.debug("sorterId = " + element.sorterId); >> + this.reloadWithAction(element.sorterId); >> }, >> >> doPagingDirect: function(event) { >> >> >> > -- Don't answer to From: address! Mail to this account are droped if not recieved via mailinglist. To contact me direct create the mail address by concatenating my forename to my senders domain.