/*
* #%L
* gitools-ui-app
* %%
* Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-3.0.html>.
* #L%
*/
package org.gitools.ui.app.datasources.biomart.wizard;
import org.gitools.datasources.biomart.BiomartService;
import org.gitools.datasources.biomart.restful.model.*;
import org.gitools.ui.app.datasources.biomart.filter.FilterCollectionPanel;
import org.gitools.ui.core.Application;
import org.gitools.ui.platform.dialog.ExceptionGlassPane;
import org.gitools.ui.platform.dialog.MessageStatus;
import org.gitools.ui.platform.wizard.AbstractWizardPage;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
/**
* @noinspection ALL
*/
public class BiomartFilterConfigurationPage extends AbstractWizardPage {
// Biomart Configuration Wrappers
private static class PageListWrapper {
private final FilterPage page;
public PageListWrapper(FilterPage dataset) {
this.page = dataset;
}
public FilterPage getFilterPage() {
return page;
}
@Override
public String toString() {
String res = page.getDisplayName();
if (res != null) {
res = res.replace(":", "");
}
return res;
}
}
private static class GroupListWrapper {
private final FilterGroup group;
public GroupListWrapper(FilterGroup dataset) {
this.group = dataset;
}
public FilterGroup getFilterGroup() {
return group;
}
@Override
public String toString() {
String res = group.getDisplayName();
if (res != null) {
res = res.replace(":", "");
}
return res;
}
}
private final Integer FILTER_PANEL_WEIGHT = 333;
private final Integer FILTER_PANEL_HEIGHT = 330;
private DatasetInfo dataset;
private DatasetConfig biomartConfig;
private BiomartService biomartService;
private FilterGroup lastGroupSelected;
private FilterPage lastPageSelected;
private final HashMap<String, Filter> filters;
private HashMap<FilterPage, CollectionsPanelsCache> collectionsCache; // Stores component panel selections
private Boolean reloadData; //determine whether update panel data
private HashMap<String, List<Option>> defaultSelecComposData; //Stores default selection component data
public static class CollectionsPanelsCache {
public final HashMap<FilterGroup, List<FilterCollectionPanel>> collections = new HashMap<FilterGroup, List<FilterCollectionPanel>>();
}
/*
* Default class constructor.
* Member attributes and graphic components are initialised
*
*/
public BiomartFilterConfigurationPage() {
initComponents();
lastGroupSelected = null;
lastPageSelected = null;
reloadData = true;
filters = new HashMap<String, Filter>();
collectionsCache = new HashMap<FilterPage, CollectionsPanelsCache>();
setComplete(true); //Next button always is true, input filters is not mandatory
filterPageCombo.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
if (filterPageCombo.getSelectedItem() != null) {
updateGroupFilterList(((PageListWrapper) filterPageCombo.getSelectedItem()).getFilterPage());
lastPageSelected = ((PageListWrapper) filterPageCombo.getSelectedItem()).getFilterPage();
}
}
}
});
filterGroupList.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (filterPageCombo.getModel().getSelectedItem() != null && filterGroupList.getSelectedValue() != null) {
updateCollectionControls(((PageListWrapper) filterPageCombo.getModel().getSelectedItem()).getFilterPage(), ((GroupListWrapper) filterGroupList.getSelectedValue()).getFilterGroup());
lastGroupSelected = ((GroupListWrapper) filterGroupList.getSelectedValue()).getFilterGroup();
}
}
});
}
/**
* This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
filterPageCombo = new javax.swing.JComboBox();
jLabel1 = new javax.swing.JLabel();
jSplitPane1 = new javax.swing.JSplitPane();
jPanel1 = new javax.swing.JPanel();
filterGroupList = new javax.swing.JList();
jPanel2 = new javax.swing.JPanel();
scrollPanel = new javax.swing.JScrollPane();
collectionsPanel = new javax.swing.JPanel();
setBorder(null);
jLabel1.setText("Page");
jSplitPane1.setDividerLocation(198);
jSplitPane1.setContinuousLayout(true);
filterGroupList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(jPanel1Layout.createSequentialGroup().addComponent(filterGroupList, javax.swing.GroupLayout.DEFAULT_SIZE, 186, Short.MAX_VALUE).addContainerGap()));
jPanel1Layout.setVerticalGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(jPanel1Layout.createSequentialGroup().addContainerGap().addComponent(filterGroupList, javax.swing.GroupLayout.DEFAULT_SIZE, 366, Short.MAX_VALUE).addContainerGap()));
jSplitPane1.setLeftComponent(jPanel1);
scrollPanel.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
scrollPanel.setViewportBorder(null);
collectionsPanel.setBorder(null);
javax.swing.GroupLayout collectionsPanelLayout = new javax.swing.GroupLayout(collectionsPanel);
collectionsPanel.setLayout(collectionsPanelLayout);
collectionsPanelLayout.setHorizontalGroup(collectionsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 350, Short.MAX_VALUE));
collectionsPanelLayout.setVerticalGroup(collectionsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 366, Short.MAX_VALUE));
scrollPanel.setViewportView(collectionsPanel);
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 362, Short.MAX_VALUE).addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(jPanel2Layout.createSequentialGroup().addContainerGap().addComponent(scrollPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 350, Short.MAX_VALUE))));
jPanel2Layout.setVerticalGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 390, Short.MAX_VALUE).addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(jPanel2Layout.createSequentialGroup().addContainerGap().addComponent(scrollPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 366, Short.MAX_VALUE).addContainerGap())));
jSplitPane1.setRightComponent(jPanel2);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup().addContainerGap().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING).addComponent(jSplitPane1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 566, Short.MAX_VALUE).addGroup(layout.createSequentialGroup().addComponent(jLabel1).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(filterPageCombo, 0, 522, Short.MAX_VALUE))).addContainerGap()));
layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(jLabel1).addComponent(filterPageCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(jSplitPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 390, Short.MAX_VALUE).addContainerGap()));
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel collectionsPanel;
private javax.swing.JList filterGroupList;
private javax.swing.JComboBox filterPageCombo;
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JSplitPane jSplitPane1;
private javax.swing.JScrollPane scrollPanel;
// End of variables declaration//GEN-END:variables
@Override
public JComponent createControls() {
return this;
}
/**
* Method called each time this class is shown in the application
* All components from collections panel are cleaned, to avoid wrong
* component visualisations
*/
@Override
public void updateControls() {
//Clean main collections panel
collectionsPanel.removeAll();
collectionsPanel.setPreferredSize(new Dimension(FILTER_PANEL_WEIGHT, FILTER_PANEL_HEIGHT));
filterGroupList.clearSelection();
lastGroupSelected = null;
lastPageSelected = null;
if (reloadData) {
setMessage(MessageStatus.PROGRESS, "Retrieving available filters ...");
new Thread(new Runnable() {
@Override
public void run() {
try {
defaultSelecComposData = new HashMap<String, List<Option>>();
initCollectionsCache();
updatePageFilterList();
if (filterPageCombo.getSelectedItem() != null) {
lastPageSelected = ((PageListWrapper) filterPageCombo.getSelectedItem()).getFilterPage();
setMessage(MessageStatus.INFO, "");
} else {
lastPageSelected = null;
setMessage(MessageStatus.INFO, " No filters are availables");
}
reloadData = false;
} catch (final Exception ex) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
setStatus(MessageStatus.ERROR);
setMessage(ex.getMessage());
}
});
ExceptionGlassPane dlg = new ExceptionGlassPane(Application.get(), ex);
dlg.setVisible(true);
System.out.println(ex);
}
}
}).start();
}
}
void updatePageFilterList() {
DefaultComboBoxModel model = new DefaultComboBoxModel();
if (biomartConfig.getFilterPages() != null) {
for (FilterPage p : biomartConfig.getFilterPages()) {
if (!p.isHidden() && !p.isHideDisplay()) {
model.addElement(new PageListWrapper(p));
updateGroupFilterList(p);
}
}
}
this.filterPageCombo.setModel(model);
}
private void updateGroupFilterList(FilterPage page) {
// Avoid update process when null value or unaltered filter group selection
if (lastPageSelected != null && lastPageSelected.getInternalName().equals(page.getInternalName())) {
return;
}
//Clean main collections panel
collectionsPanel.removeAll();
collectionsPanel.setPreferredSize(new Dimension(FILTER_PANEL_WEIGHT, FILTER_PANEL_HEIGHT));
lastGroupSelected = null;
DefaultListModel model = new DefaultListModel();
for (FilterGroup group : page.getFilterGroups()) {
if (!group.isHidden() && !group.isHideDisplay()) {
model.addElement(new GroupListWrapper(group));
updateCollectionsCache(page, group);
}
}
this.filterGroupList.setModel(model);
}
/**
* Stores in a field (memory) all Panels (collectionsPanels, descriptionPanels, components,...)
* but do not show them on the screen
*
* @param page
* @param group
*/
private void updateCollectionsCache(FilterPage page, FilterGroup group) {
FilterCollectionPanel collectionPanel;
List<FilterCollectionPanel> listCollections = new ArrayList<FilterCollectionPanel>();
for (FilterCollection collection : group.getFilterCollections()) {
if (!collection.isHidden() && !collection.isHideDisplay()) {
collectionPanel = new FilterCollectionPanel(collection, this);
if (collectionPanel.isPanelRendered()) {
listCollections.add(collectionPanel); //add collectionPanel in list
}
}
}
//add collectionPanel list in cache
collectionsCache.get(page).collections.put(group, listCollections);
}
/**
* Shows in the screen all collections panels which belongs to the group selected
*
* @param page
* @param group
*/
private void updateCollectionControls(FilterPage page, FilterGroup group) {
// Avoid update process when null value or unaltered filter group selection
if (filterGroupList.getSelectedValue() == null || (lastGroupSelected != null && lastGroupSelected.getInternalName().equals(group.getInternalName()))) {
return;
}
Integer collectionPanelHeight = 0;
collectionsPanel.removeAll();
collectionsPanel.repaint();
collectionsPanel.setLayout(new BoxLayout(collectionsPanel, BoxLayout.Y_AXIS));
//Check if collections have not been load previously (cache)
if (collectionsCache.get(page).collections.get(group).size() == 0) {
updateCollectionsCache(page, group);
}
for (FilterCollectionPanel col : collectionsCache.get(page).collections.get(group)) {
collectionsPanel.add(col);
collectionPanelHeight += col.getCurrentHeigh();
}
Dimension d = new Dimension(collectionsPanel.getWidth(), collectionPanelHeight);
collectionsPanel.setPreferredSize(d);
collectionsPanel.repaint();
scrollPanel.validate();
validate();
}
/**
* Loop through all groups and their collections.
* If checkBox collection checked the filter is annotated
*
* @return
*/
public Collection<Filter> getFilters() {
List<Filter> listFilters = new ArrayList<Filter>();
for (FilterPage page : collectionsCache.keySet())
for (FilterGroup group : collectionsCache.get(page).collections.keySet())
for (FilterCollectionPanel panel : collectionsCache.get(page).collections.get(group))
listFilters.addAll(panel.getFilters());
return listFilters;
}
/**
* Load global attributes and guess if reload data
*
* @param service
* @param dataset
*/
public void setSource(BiomartService service, DatasetConfig config) {
if (this.biomartConfig != null && this.biomartConfig.getDataset().equals(config.getDataset())) {
reloadData = false;
} else {
reloadData = true;
filterPageCombo.setModel(new DefaultComboBoxModel());
filterGroupList.setModel(new DefaultListModel());
collectionsPanel.removeAll();
collectionsPanel.repaint();
scrollPanel.validate();
validate();
}
this.biomartService = service;
this.biomartConfig = config;
}
/**
* Initialisation of the field which will contain all filter panels
*/
private void initCollectionsCache() {
if (collectionsCache == null) {
collectionsCache = new HashMap<FilterPage, CollectionsPanelsCache>();
} else {
collectionsCache.clear();
}
for (FilterPage page : biomartConfig.getFilterPages()) {
if (!page.isHidden() && !page.isHideDisplay()) {
collectionsCache.put(page, null);
CollectionsPanelsCache panels = new CollectionsPanelsCache();
for (FilterGroup group : page.getFilterGroups())
panels.collections.put(group, new ArrayList(0));
collectionsCache.put(page, panels);
}
}
}
public void setFilter(String name, Filter f) {
filters.put(name, f);
}
public void setFilters(HashMap<String, Filter> filters) {
filters.putAll(filters);
}
public void deleteFilter(String name) {
filters.remove(name);
}
public void deleteFilters(HashMap<String, Filter> delFilters) {
for (String name : delFilters.keySet())
filters.remove(name);
}
public BiomartService getBiomartService() {
return this.biomartService;
}
public DatasetConfig getDatasetConfig() {
return this.biomartConfig;
}
public HashMap<FilterPage, CollectionsPanelsCache> getCollectionsCache() {
return collectionsCache;
}
public void setCollectionsCache(HashMap<FilterPage, CollectionsPanelsCache> collectionsCache) {
this.collectionsCache = collectionsCache;
}
public HashMap<String, List<Option>> getDefaultSelecComposData() {
return defaultSelecComposData;
}
public void storeSelecComponentsDefaultData(HashMap<String, List<Option>> data) {
if (data.size() > 0) {
for (String key : data.keySet())
this.defaultSelecComposData.put(key, data.get(key));
}
}
/*
public void resetCollectionCache() {
if (collectionsCache == null) return;
for (FilterPage p : collectionsCache.keySet())
{
for(FilterGroup g : collectionsCache.get(p).collections.keySet())
{
for ( FilterCollectionPanel f : collectionsCache.get(p).collections.get(g))
this.remove(f);
}
collectionsCache.get(p).collections.clear();
}
collectionsCache.clear();
this.validate();
}
*/
}