Hi,
I am using GWT 2.2 and the new CellTable sorting features, as described here
:
http://code.google.com/intl/fr-FR/webtoolkit/doc/latest/DevGuideUiCellTable.html

There is a strange error (Umbrella exception, nothing else) when I use the
columnSortHandler.setComparator(...) method.
I commented it out.

If i use the addColumnSortHandler(new ColumnSortEvent.Handler() {  ...}
method, it works.

However on one column only. I want to be able to sort the table, on
whichever column i click on.

So i'm stuck :
either i figure out what's wrong with the setComparator(..) method
or i use the addColumnSortHandler(...) and in that case i need to figure out
how to retrieve the name of the column
that is currently sorted.
Does anyone know what could be wrong ?
Thanks

Here is the code :
package com.francetelecom.voltage.gestion.presentation.client.mvp.view.impl;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import com.ft.v.g.presentation.client.GwtApplication;
import com.ft.v.g.presentation.client.mvp.presenter.ListPresenter;
import com.ft.v.g.presentation.client.mvp.view.ListView;
import com.ft.v.g.presentation.client.ui.RecherchePanel;
import com.ft.v.g.presentation.client.ui.SimpleHasFeedback;
import com.ft.v.model.DemandeBean;
import com.google.gwt.cell.client.ClickableTextCell;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.core.client.GWT;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
import com.google.gwt.text.shared.AbstractSafeHtmlRenderer;
import com.google.gwt.text.shared.SafeHtmlRenderer;
import com.google.gwt.user.cellview.client.CellTable;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.ColumnSortEvent;
import com.google.gwt.user.cellview.client.SimplePager;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler;
import com.google.gwt.user.cellview.client.SimplePager.TextLocation;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.view.client.Range;
import com.google.gwt.view.client.RangeChangeEvent;
import com.google.gwt.view.client.RangeChangeEvent.Handler;


public class DemandesListViewImpl extends Composite implements
ListView<DemandeBean> {


    private RecherchePanel rp = new RecherchePanel();

    private final CellTable<DemandeBean> demandeTable;
    private final SimplePager pager;
    private final static int PAGE_SIZE = 7;
    private List<DemandeBean> demandes;
    private SimpleHasFeedback feedback;

    private ListPresenter<DemandeBean> presenter;

    public DemandesListViewImpl() {



        feedback = new SimpleHasFeedback();
        // Create a CellTable.
        demandeTable = new CellTable<DemandeBean>();
        demandeTable.getElement().setId("marketlist");
        demandeTable.setPageSize(PAGE_SIZE);
        demandeTable.setRowCount(0, true);

        demandeTable.addRangeChangeHandler(new Handler() {

            public void onRangeChange(RangeChangeEvent event) {

                Range range = demandeTable.getVisibleRange();
                int start = range.getStart();
                int length = range.getLength();
                List<DemandeBean> toSet = new
ArrayList<DemandeBean>(length);
                for (int i = start; i < start + length && i <
demandes.size(); i++)
                    toSet.add(demandes.get(i));
                demandeTable.setRowData(start, toSet);

            }
        });

        // Create a Pager to control the table.
        SimplePager.Resources pagerResources = GWT
                .create(SimplePager.Resources.class);
        pager = new SimplePager(TextLocation.CENTER, pagerResources, false,
0,
                true);
        pager.setDisplay(demandeTable);

        // Create id column.
        TextColumn<DemandeBean> idColumn = new TextColumn<DemandeBean>() {

            @Override
            public String getValue(DemandeBean demande) {
                //return demande.getId().toString();
                return String.valueOf(demande.getIdDemande());
            }

        };

        // renderer for nameColumn
        SafeHtmlRenderer<String> nameColumnRenderer = new
AbstractSafeHtmlRenderer<String>() {

            public SafeHtml render(String object) {

                SafeHtmlBuilder builder = new SafeHtmlBuilder();
                builder.appendHtmlConstant("<a>");
                builder.appendEscaped(object);
                builder.appendHtmlConstant("</a>");
                return builder.toSafeHtml();
            }

        };

        // Create id column.
        TextColumn<DemandeBean> etatColumn = new TextColumn<DemandeBean>() {

            @Override
            public String getValue(DemandeBean demande) {
                return demande.getEtatDemande().getNomCourt().toString();

            }

        };


        // Date réception
        Column<DemandeBean, String> dateReceptionColumn = new
Column<DemandeBean, String>(
                new ClickableTextCell(nameColumnRenderer)) {

            @Override
            public String getValue(DemandeBean demandeBean) {

                //String dateReception =
demandeBean.getDateReception().toString();
                //Date converti =
VoltageUtils.convertirFormatDate(dateReception);

                return demandeBean.getDateReception().toString();
                //return converti.toString();
            }
        };


/*
        // Create name column.
        Column<DemandeBean, String> nameColumn = new Column<DemandeBean,
String>(
                new ClickableTextCell(nameColumnRenderer)) {

            @Override
            public String getValue(DemandeBean demandeBean) {
                return demandeBean.getName();
            }
        };

        nameColumn.setFieldUpdater(new FieldUpdater<DemandeBean, String>() {
            public void update(int index, DemandeBean demandeBean, String
value) {
                if (presenter != null) {
                    presenter.onEditClicked(demandeBean);
                }
            }
        }

        );
*/

        // renderer for nameColumn
        SafeHtmlRenderer<String> deleteColumnRenderer = new
AbstractSafeHtmlRenderer<String>() {

            public SafeHtml render(String object) {
                SafeHtmlBuilder builder = new SafeHtmlBuilder();

                builder.appendHtmlConstant("<a><img
src=\"images/btnDelete.gif\"/></a>");
                return builder.toSafeHtml();
            }

        };

        // delete column.
        Column<DemandeBean, String> deleteColumn = new Column<DemandeBean,
String>(
                new ClickableTextCell(deleteColumnRenderer)) {

            @Override
            public String getValue(DemandeBean demandeBean) {
                return GwtApplication.constantes.button_delete();
            }
        };

        deleteColumn.setFieldUpdater(new FieldUpdater<DemandeBean, String>()
{
            public void update(int index, DemandeBean demandeBean, String
value) {
                if (presenter != null) {
                    presenter.onDeleteClicked(demandeBean);
                }
            }
        }

        );

        /*
        // Create description column.
        TextColumn<DemandeBean> descriptionColumn = new
TextColumn<DemandeBean>() {

            @Override
            public String getValue(DemandeBean demande) {
                //return demande.getDescription();
                return demande.getAutorite();
            }
        };
        */



        // Colonne TYPE
        TextColumn<DemandeBean> typeColumn = new TextColumn<DemandeBean>() {

            @Override
            public String getValue(DemandeBean demande) {
                return demande.getTypeDemande();
            }
        };

        // Colonne MEDIA
        TextColumn<DemandeBean> mediaColumn = new TextColumn<DemandeBean>()
{

            @Override
            public String getValue(DemandeBean demande) {
                return demande.getTypeMedia();
            }
        };
        mediaColumn.setSortable(true);

        // Colonne Autorite
        TextColumn<DemandeBean> autoriteColumn = new
TextColumn<DemandeBean>() {

            @Override
            public String getValue(DemandeBean demande) {
                return demande.getAutorite();
            }
        };

        autoriteColumn.setSortable(true);


        /*

          List<DemandeBean> newData = new
ArrayList(demandeTable.getVisibleItems());

        //ListHandler<DemandeBean> columnSortHandler = new
ListHandler<DemandeBean>(demandes);
          ListHandler<DemandeBean> columnSortHandler = new
ListHandler<DemandeBean>(newData);
          GWT.log("taille newData : " + newData.size());



        columnSortHandler.setComparator(mediaColumn,  new
Comparator<DemandeBean>() {
            public int compare(DemandeBean o1, DemandeBean o2) {

                GWT.log("appel compare");
                if (o1 == o2) {
                    return 0;
                }
                // Compare the name columns.
                if (o1 != null) {
                    return (o2 != null) ?
o1.getTypeMedia().compareTo(o2.getTypeMedia()) : 1;

                    }
                return -1;
                }
            });
        demandeTable.addColumnSortHandler(columnSortHandler);

        */


        demandeTable.addColumnSortHandler(new ColumnSortEvent.Handler() {

           public void onColumnSort(ColumnSortEvent event) {

               // La colonne triée
               Column a = event.getColumn();


                GWT.log("appel de onColumnSort");
                 List<DemandeBean> newData = new
ArrayList(demandeTable.getVisibleItems());

                 if (event.isSortAscending()) {
                        GWT.log("Ordre ascendant");
                     Collections.sort(newData, new Comparator<DemandeBean>()
{
                            public int compare(DemandeBean o1, DemandeBean
o2) {
                                if (o1 == o2) {
                                    return 0;
                                    }
                                if (o1 != null) {
                                    return (o2 != null) ?
o1.getAutorite().compareTo(o2.getAutorite()) : 1;
                                    }
                                return -1;
                                }
                            }
                     );
                 } else {
                     GWT.log("Ordre descendant");
                     Collections.sort(newData, new Comparator<DemandeBean>()
{
                            public int compare(DemandeBean o1, DemandeBean
o2) {
                                if (o1 == o2) {
                                    return 0;
                                    }
                                if (o1 != null) {
                                    return (o2 != null) ?
o2.getAutorite().compareTo(o1.getAutorite()) : 1;
                                    }
                                return -1;
                                }
                            }
                     );
                 }
                 Range range = demandeTable.getVisibleRange();
                int start = range.getStart();
                 demandeTable.setRowData(start, newData);
               }
             });



        // Colonne operateur
        TextColumn<DemandeBean> operateurColumn = new
TextColumn<DemandeBean>() {

            @Override
            public String getValue(DemandeBean demande) {
                //return demande.getDescription();
                return demande.getOperateur();
            }
        };

        // Colonne operateur
        TextColumn<DemandeBean> urgenceColumn = new
TextColumn<DemandeBean>() {

            @Override
            public String getValue(DemandeBean demande) {
                //return demande.getDescription();
                return String.valueOf(demande.getNiveauUrgenceAutorite());
            }
        };

        // Colonne operateur
        TextColumn<DemandeBean> prestationColumn = new
TextColumn<DemandeBean>() {

            @Override
            public String getValue(DemandeBean demande) {
                //return demande.getDescription();
                return String.valueOf(demande.getPrestation());
            }
        };

        /*
        demandeTable.addColumn(idColumn,
                GwtApplication.constantes.column_marketId());
        demandeTable.addColumn(nameColumn,
                GwtApplication.constantes.column_marketName());
        demandeTable.addColumn(descriptionColumn,
                GwtApplication.constantes.column_marketDescription());
        demandeTable.addColumn(deleteColumn, "");
        */

        demandeTable.addColumn(deleteColumn, "");
        demandeTable.addColumn(etatColumn, "Etat");
        demandeTable.addColumn(idColumn, "N° demande");
        demandeTable.addColumn(autoriteColumn,"Autorité");

        demandeTable.getColumnSortList().push(autoriteColumn);


        demandeTable.addColumn(typeColumn,"Type");
        demandeTable.addColumn(prestationColumn,"Code");
        demandeTable.addColumn(mediaColumn, "Media");
        demandeTable.addColumn(urgenceColumn,"Urgence");

        demandeTable.addColumn(dateReceptionColumn,"Date réception");
        //demandeTable.addColumn(descriptionColumn,"ID_AUTORITE");

        //demandeTable.addColumn(operateurColumn,"Opérateur");


        initWidget(getDisplay());
    }

    private Widget getDisplay() {

        // main panel is content panel

        // content panel configuration

        FlowPanel content = new FlowPanel();
        content.getElement().setId("content");
        content.add(new HTML("<center><h2>"
                + GwtApplication.constantes.corbeilleDemandes_title() +
"</h2></center>"));

        content.add(rp);

        content.add(new HTML("<h4>"
                + GwtApplication.constantes.marketPage_result() + "</h4>"));
        content.add(feedback);





        content.add(demandeTable);
        content.add(pager);


        content.setWidth("100%");



        /*
        FlowPanel content = new FlowPanel();
        PaginatedTable table = new PaginatedTable(new TableTestModel());
        content.add(table);
        */

        return content;

    }

    public void setData(List<DemandeBean> demandes) {

        if (null != demandes) {
            GWT.log("setData : demandes pas nul");
        } else {
            GWT.log("setData : demandes est nul");
        }
        this.demandes = demandes;
        demandeTable.setRowCount(demandes.size(), true);
        demandeTable.setRowData(0, demandes);
        demandeTable.setVisible(!this.demandes.isEmpty());
        pager.setVisible(!this.demandes.isEmpty());
    }

    public void setPresenter(ListPresenter<DemandeBean> presenter) {
        this.presenter = presenter;
    }

    public void reset() {
        feedback.clear();
    }

    public void error() {
        feedback.error(GwtApplication.constantes.error_internal());
    }

    public void noData() {
        this.setData(new ArrayList<DemandeBean>());
        feedback.info(GwtApplication.messages.list_counter_none());
    }

    public boolean confirmDeletion(DemandeBean demandeBean) {
        return feedback.confirm(GwtApplication.messages

.deleteMarketPage_confirm(String.valueOf(demandeBean.getId())));

    }

}

-- 
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-web-toolkit?hl=en.

Reply via email to