edu.caltech.ipac.firefly.ui.searchui.CatalogSelectUI.java Source code

Java tutorial

Introduction

Here is the source code for edu.caltech.ipac.firefly.ui.searchui.CatalogSelectUI.java

Source

/*
 * License information at https://github.com/Caltech-IPAC/firefly/blob/master/License.txt
 */
package edu.caltech.ipac.firefly.ui.searchui;
/**
 * User: roby
 * Date: 2/5/14
 * Time: 1:44 PM
 */

import com.google.gwt.core.client.Scheduler;
import com.google.gwt.dom.client.Style;
import com.google.gwt.event.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.DockLayoutPanel;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Widget;
import edu.caltech.ipac.firefly.core.Application;
import edu.caltech.ipac.firefly.data.CatalogRequest;
import edu.caltech.ipac.firefly.data.DataSetInfo;
import edu.caltech.ipac.firefly.data.Param;
import edu.caltech.ipac.firefly.data.ServerParams;
import edu.caltech.ipac.firefly.data.ServerRequest;
import edu.caltech.ipac.firefly.data.TableServerRequest;
import edu.caltech.ipac.firefly.data.table.BaseTableData;
import edu.caltech.ipac.firefly.data.table.DataSet;
import edu.caltech.ipac.firefly.data.table.TableData;
import edu.caltech.ipac.firefly.data.table.TableDataView;
import edu.caltech.ipac.firefly.task.DataSetInfoFactory;
import edu.caltech.ipac.firefly.ui.GwtUtil;
import edu.caltech.ipac.firefly.ui.catalog.Catagory;
import edu.caltech.ipac.firefly.ui.catalog.Catalog;
import edu.caltech.ipac.firefly.ui.catalog.CatalogItem;
import edu.caltech.ipac.firefly.ui.catalog.Proj;
import edu.caltech.ipac.firefly.ui.input.SimpleInputField;
import edu.caltech.ipac.firefly.ui.table.AbstractLoader;
import edu.caltech.ipac.firefly.ui.table.SingleColDefinition;
import edu.caltech.ipac.firefly.ui.table.SingleColumnTablePanel;
import edu.caltech.ipac.firefly.ui.table.TablePanel;
import edu.caltech.ipac.firefly.util.WebAssert;
import edu.caltech.ipac.firefly.util.WebClassProperties;
import edu.caltech.ipac.firefly.util.event.WebEvent;
import edu.caltech.ipac.firefly.util.event.WebEventListener;
import edu.caltech.ipac.firefly.util.event.WebEventManager;
import edu.caltech.ipac.util.CollectionUtil;
import edu.caltech.ipac.util.StringUtils;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @author Trey Roby
 */
public class CatalogSelectUI implements DataTypeSelectUI {

    private static final WebClassProperties prop = new WebClassProperties(CatalogSelectUI.class);

    private DockLayoutPanel mainPanel = new DockLayoutPanel(Style.Unit.PX);
    private Catagory selectedCategory = null;
    private SingleColumnTablePanel catTable = new SingleColumnTablePanel(prop.getTitle("catalog"),
            new FilteredDatasetLoader());
    private Catalog currentCatalog = null;
    private final DataSetInfo dsInfo;
    private final SearchMaxChange searchMaxChange;
    private FlowPanel catDDContainerRight = new FlowPanel();

    private CatddEnhancedPanel catDD;
    private String selectedColumns = "";
    private String selectedConstraints = "";
    private String selectedDDForm = "";
    private CurrCatalogListener catListener;
    private List<String> catList;
    private SimpleInputField catSelectField;

    public CatalogSelectUI(DataSetInfo dsInfo, SearchMaxChange searchMaxChange) {
        this.dsInfo = dsInfo;
        this.searchMaxChange = searchMaxChange;
    }

    public Widget makeUI() {
        mainPanel.setSize("100%", "100%");
        selectedCategory = null;

        Proj proj = dsInfo.getCatProjInfo();

        DockLayoutPanel left = new DockLayoutPanel(Style.Unit.PX);
        mainPanel.addWest(left, 450);
        mainPanel.add(catDDContainerRight);

        // create category selection
        selectedCategory = proj.get(0);
        if (proj.getCatagoryCount() > 1) {
            catList = new ArrayList<String>(proj.getCatagoryCount());
            for (Catagory category : proj)
                catList.add(category.getCatagoryName());
            catSelectField = GwtUtil.createListBoxField("Category", "Choose Category", catList, catList.get(0));
            catSelectField.getField().getFocusWidget().setWidth("300px");
            left.addNorth(catSelectField, 25);
            GwtUtil.setPadding(catSelectField, 0, 0, 0, 10);
            //            catSelectField.addStyleName("left-floating");
            catSelectField.getField().addValueChangeHandler(new ValueChangeHandler<String>() {
                public void onValueChange(ValueChangeEvent<String> event) {
                    setSelectedCategory(catSelectField.getValue());
                }
            });
        } else {
            catSelectField = null;
            catList = null;
        }

        Window.addResizeHandler(new ResizeHandler() {
            public void onResize(ResizeEvent event) {
                if (GwtUtil.isOnDisplay(mainPanel))
                    mainPanel.onResize();
            }
        });

        Widget catTableWrapper = GwtUtil.wrap(catTable, 5, 5, 28, 5);

        catTable.addStyleName("standard-border");
        //        GwtUtil.setStyles(catTable, "position", "absolute",
        //                          "left", "10px",
        //                          "right", "20px",
        //                          "top", "0",
        //                          "bottom", "0",
        //                          "width", "auto");
        //        catTableWrapper.setSize("100%", "200px");
        //        catTableWrapper.addStyleName("left-floating");
        GwtUtil.setStyle(catTableWrapper, "position", "relative");
        left.add(catTableWrapper);
        //        GwtUtil.setMargin(catTable, 10, 0, 0, 20);

        WebEventManager wem = catTable.getEventManager();
        catListener = new CurrCatalogListener();
        wem.addListener(TablePanel.ON_ROWHIGHLIGHT_CHANGE, catListener);
        wem.addListener(TablePanel.ON_LOAD, catListener);
        wem.addListener(TablePanel.ON_INIT, new WebEventListener() {
            public void eventNotify(WebEvent ev) {
                postInit();
            }
        });

        Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
            public void execute() {
                catTable.init();
            }
        });

        return mainPanel;
    }

    private void setSelectedCategory(String categoryStr) {
        selectedCategory = getCatalogCategory(categoryStr);
        Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
            public void execute() {
                catTable.reloadTable(0);
            }
        });
    }

    private void updateDD() {
        catDDContainerRight.clear();

        if (!StringUtils.isEmpty(currentCatalog.getDDSearchProcessor())) {
            try {
                if (currentCatalog.getDDSearchProcessor().startsWith("LSST")) {
                    selectedDDForm = "none"; // no short or long form selection
                }
                catDD = new CatddEnhancedPanel(currentCatalog.getDDSearchProcessor(),
                        currentCatalog.getQueryCatName(), selectedColumns, "", selectedConstraints, selectedDDForm,
                        StringUtils.isEmpty(selectedColumns));
            } catch (Exception e) {
                WebAssert.argTst(false, "not sure what to do here");
            }
            catDDContainerRight.add(catDD);
        } else {
            catDD = null;
        }

    }

    private void postInit() {
        catTable.showToolBar(false);
        catTable.showColumnHeader(false);
        catTable.showPagingBar(false);
        catTable.showOptionsButton(false);
        //        table.getTable().setHeight("200px");

        catTable.getTable()
                .setTableDefinition(new SingleColDefinition(new CatalogItem("Results", catTable.getDataset())));
        catTable.reloadTable(0);
        catTable.getTable().highlightRow(0);
    }

    private String getSelectedCatRow() {
        int idx = catTable.getTable().getHighlightedRowIdx();
        return String.valueOf(idx);
    }

    private Catagory getCatalogCategory(String desc) {
        Catagory retval = null;
        Proj proj = dsInfo.getCatProjInfo();
        for (Catagory category : proj) {
            if (category.getCatagoryName().equals(desc)) {
                retval = category;
                break;
            }
        }
        return retval;
    }

    private DataSet makeCatalogDataset() {
        DataSet dataset = null;
        DataSetInfoFactory factory = Application.getDataSetFactory();
        if (factory.isAllDataSetsRetrieved()) {
            dataset = factory.getOriginalDataSet();
            if (selectedCategory != null) {
                dataset = dataset.subset(new CollectionUtil.FilterImpl<BaseTableData.RowData>() {
                    public boolean accept(BaseTableData.RowData testRow) {
                        boolean retval = false;
                        for (Catalog cat : selectedCategory) {
                            if (testRow.equals(cat.getDataSetRow())) {
                                retval = true;
                                break;
                            }
                        }
                        return retval;
                    }
                });
            }
        }
        return dataset;
    }

    public String getCatName() {
        return currentCatalog.getQueryCatName();
    }

    public String getTitle() {
        return currentCatalog.getProjStr() + "-" + currentCatalog.getQueryCatName();
    }

    //====================================================================
    // from DataTypeSelectUI interface
    //====================================================================

    public String getDataDesc() {
        return currentCatalog != null ? currentCatalog.getQueryCatName() : "catalog data";
    }

    public String makeRequestID() {
        if (selectedCategory != null) {
            return currentCatalog.getCatalogSearchProcessor();
        } else {
            return CatalogRequest.RequestType.GATOR_QUERY.getSearchProcessor();
        }
    }

    public List<Param> getFieldValues() {
        List<Param> list = new ArrayList<Param>(10);
        list.add(new Param(CatalogRequest.SEARCH_METHOD, CatalogRequest.Method.CONE.getDesc()));
        list.add(new Param(CatalogRequest.CATALOG, currentCatalog.getQueryCatName()));
        list.add(new Param(ServerParams.REQUESTED_DATA_SET, currentCatalog.getQueryCatName()));
        if (catDD != null)
            list.addAll(catDD.getFieldValues());
        //      list.add(new Param(CatalogRequest.USE, CatalogRequest.Use.DATA_PRIMARY.toString()));
        list.add(new Param(CatalogRequest.USE, CatalogRequest.Use.CATALOG_OVERLAY.toString()));
        if (catList != null) {
            list.add(new Param(CatalogRequest.CAT_INDEX, catList.indexOf(selectedCategory.getCatagoryName()) + ""));
        }
        list.add(new Param(CatalogRequest.CATALOG_PROJECT, dsInfo.getId()));
        return list;
    }

    public void setFieldValues(List<Param> list) {
        final ServerRequest r = new ServerRequest(null, list); // make a tmp request so I can use the request tools

        if (r.containsParam(CatalogRequest.CAT_INDEX)) {
            int idx = r.getIntParam(CatalogRequest.CAT_INDEX, 0);
            if (catList != null && catSelectField != null && catList.size() > idx) {
                setSelectedCategory(catList.get(idx));
                catSelectField.setValue(catList.get(idx));
            }
        }

        Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
            public void execute() {
                if (r.containsParam(CatalogRequest.CATALOG)) {
                    String tmpSelCol = r.getParam(CatalogRequest.SELECTED_COLUMNS);
                    String tmpCon = r.getParam(CatalogRequest.CONSTRAINTS);
                    String tmpDDForm = r.getParam(CatddEnhancedPanel.FORM_KEY);

                    if (!StringUtils.isEmpty(tmpSelCol) || !StringUtils.isEmpty(tmpCon)) {
                        selectedColumns = StringUtils.isEmpty(tmpSelCol) ? "" : tmpSelCol;
                        selectedConstraints = StringUtils.isEmpty(tmpCon) ? "" : tmpCon;
                        selectedDDForm = StringUtils.isEmpty(tmpDDForm) ? "" : tmpDDForm;
                    }
                    selectCatalog(r.getParam(CatalogRequest.CATALOG));
                }
            }
        });
    }

    public boolean validate() {
        return true;
    }

    public Iterator<Widget> iterator() {
        return new ArrayList<Widget>().iterator();
    }

    public void add(Widget w) {
        throw new UnsupportedOperationException("operation not allowed");
    }

    public void clear() {
        throw new UnsupportedOperationException("operation not allowed");
    }

    public boolean remove(Widget w) {
        throw new UnsupportedOperationException("operation not allowed");
    }

    private void updateCurrentCatalog() {
        if (catTable == null || catTable.getTable() == null)
            return;
        int idx = catTable.getTable().getHighlightedRowIdx();
        if (idx >= 0) {
            BaseTableData.RowData row = (BaseTableData.RowData) catTable.getTable().getRowValues().get(idx);
            currentCatalog = new Catalog(row);
            if (searchMaxChange != null)
                searchMaxChange.onSearchMaxChange(currentCatalog.getMaxArcSec());
            try {
                updateDD();
            } finally {
                Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
                    public void execute() {
                        selectedColumns = "";
                        selectedConstraints = "";
                        selectedDDForm = "";
                    }
                });

            }
        }
    }

    private void selectCatalog(String catName) {
        Catalog c;
        int idx = 0;
        if (catTable == null || catTable.getTable() == null)
            return;
        for (TableData.Row row : catTable.getTable().getRowValues()) {
            c = new Catalog(((BaseTableData.RowData) row));
            if (c.getQueryCatName().equals(catName)) {
                catTable.highlightRow(true, idx);
                break;
            }
            idx++;
        }

    }

    //====================================================================
    // Inner classes
    //====================================================================

    public class CurrCatalogListener implements WebEventListener {

        public void eventNotify(WebEvent ev) {
            // clear selected columns, and constraints,
            // when catalog is changed
            updateCurrentCatalog();
        }
    }

    public interface SearchMaxChange {
        void onSearchMaxChange(int maxArcSec);
    }

    private class FilteredDatasetLoader extends AbstractLoader<TableDataView> {

        @Override
        public void load(int offset, int pageSize, AsyncCallback<TableDataView> callback) {
            DataSet results = makeCatalogDataset();
            this.setCurrentData(results);
            callback.onSuccess(makeCatalogDataset());
        }

        public String getSourceUrl() {
            return null;
        }

        public TableServerRequest getRequest() {
            return null;
        }
    }

}