/*
* #%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.filter;
import org.gitools.datasources.biomart.restful.model.*;
import org.gitools.ui.app.datasources.biomart.wizard.BiomartFilterConfigurationPage.CollectionsPanelsCache;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class FilterSelectComponent extends FilterComponent {
// Biomart Configuration Wrappers
private static class OptionListWrapper {
private final Option option;
public OptionListWrapper(Option filterOption) {
this.option = filterOption;
}
public Option getOption() {
return option;
}
@Override
public String toString() {
String res = option.getDisplayName();
if (res != null) {
res = res.replace(":", "");
}
return res;
}
}
//Members of class
private String component;
private final Integer COMBO_HEIGHT = 45;
private final Integer LIST_HEIGHT = 190;
private final HashMap<Option, HashMap<String, List<Option>>> pushActions; // N options, each one with its list of components and options to show
public FilterSelectComponent(FilterDescription d, FilterDescriptionPanel collectionParent) {
super(d, collectionParent);
initComponents();
pushActions = new HashMap<>();
buildComponent();
if (component.equals("ComboBox") && pushActions.size() > 0) {
comboComponent.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
setPushOptionsComponent(((OptionListWrapper) comboComponent.getSelectedItem()).getOption());
}
}
});
}
}
/**
* 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() {
jScrollPane1 = new javax.swing.JScrollPane();
listComponent = new javax.swing.JList();
comboComponent = new javax.swing.JComboBox();
jScrollPane1.setViewportView(listComponent);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(jScrollPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 388, Short.MAX_VALUE).addComponent(comboComponent, javax.swing.GroupLayout.Alignment.TRAILING, 0, 388, Short.MAX_VALUE)).addContainerGap()));
layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addComponent(comboComponent, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE).addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)));
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JComboBox comboComponent;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JList listComponent;
// End of variables declaration//GEN-END:variables
//FIXME : Test initialisation String list of options
private void buildComponent() {
List<OptionListWrapper> options = InitListOptions();
if (filterDescription.getMultipleValues() == 0) {
component = "ComboBox";
comboComponent.setVisible(true);
comboComponent.setAlignmentY(TOP_ALIGNMENT);
jScrollPane1.setVisible(false);
listComponent.setVisible(false);
listComponent.setAlignmentY(BOTTOM_ALIGNMENT);
DefaultComboBoxModel m = new DefaultComboBoxModel();
for (OptionListWrapper o : options)
m.addElement(o);
comboComponent.setModel(m);
currentHeight = COMBO_HEIGHT;
//process pushActions
if (filterDescription != null) {
loadPushActions();
}
} else {
component = "List";
listComponent.setVisible(true);
listComponent.setAlignmentY(TOP_ALIGNMENT);
DefaultListModel m = new DefaultListModel();
for (OptionListWrapper o : options)
m.addElement(o);
listComponent.setModel(m);
comboComponent.setVisible(false);
comboComponent.setAlignmentY(BOTTOM_ALIGNMENT);
currentHeight = LIST_HEIGHT;
}
validate();
}
private void setPushOptionsComponent(Option optionSelected) {
//search and set component options
HashMap<FilterPage, CollectionsPanelsCache> collectionsCache = getDescriptionPanel().getParentCollection().getFilterConfigurationPage().getCollectionsCache();
FilterDescriptionPanel descriptionPanel = null;
FilterComponent filterCompo = null;
//System.out.println("Actions: "+pushActions.keySet());
for (FilterPage page : collectionsCache.keySet())
for (FilterGroup group : collectionsCache.get(page).collections.keySet()) {
//System.out.println("Group: "+group.getInternalName());
for (FilterCollectionPanel panel : collectionsCache.get(page).collections.get(group))
for (Component componentPanel : panel.getDescriptionsPanel().getComponents()) {
descriptionPanel = ((FilterDescriptionPanel) componentPanel);
for (Component compo : descriptionPanel.getComponents()) {
filterCompo = (FilterComponent) compo;
if (filterCompo.getFilterDescription() != null && filterCompo.getFilterDescription().getInternalName() != null) {
//System.out.println ("Component: "+filterCompo.getFilterDescription().getInternalName());
if (pushActions.get(optionSelected).get(filterCompo.getFilterDescription().getInternalName()) != null) {
//System.out.println ("options; "+ pushActions.get(optionSelected).get(filterCompo.getFilterDescription().getInternalName()));
filterCompo.setListOptions(pushActions.get(optionSelected).get(filterCompo.getFilterDescription().getInternalName()));
}
}
}
}
}
}
private List<OptionListWrapper> InitListOptions() {
List<OptionListWrapper> res = new ArrayList<>();
for (Option o : filterDescription.getOptions()) {
OptionListWrapper wrapper = new OptionListWrapper(o);
res.add(wrapper);
}
// Load default options from some component with push action
if (parentPanel != null && parentPanel.getParentCollection().getFilterConfigurationPage().getDefaultSelecComposData().size() > 0) {
if (parentPanel.getParentCollection().getFilterConfigurationPage().
getDefaultSelecComposData().get(filterDescription.getInternalName()) != null)
{
for (Option o : parentPanel.getParentCollection().getFilterConfigurationPage().
getDefaultSelecComposData().get(filterDescription.getInternalName())) {
OptionListWrapper wrapper = new OptionListWrapper(o);
res.add(wrapper);
}
}
}
return res;
}
/**
* Load PushActions of component
*/
private void loadPushActions() {
for (Option o : filterDescription.getOptions()) {
if (o.getPushactions() != null) {
HashMap<String, List<Option>> actions = new HashMap<>();
for (PushAction action : o.getPushactions()) {
actions.put(action.getRef(), action.getOptions());
}
pushActions.put(o, actions);
}
}
}
@Override
// FIXME : get Filter for selected value/s in list
public List<Filter> getFilters() {
List<Filter> filters = new ArrayList<>();
Filter f = null;
if (hasChild()) {
if (component.equals("ComboBox")) {
f = new Filter();
f.setName(((OptionListWrapper) comboComponent.getSelectedItem()).getOption().getInternalName());
f.setValue(getChildComponent().getFilters().get(0).getValue());
f.setRadio(getChildComponent().getFilters().get(0).getRadio());
filters.add(f);
} else {
for (Object optionWrapper : listComponent.getSelectedValues()) {
f = new Filter();
f.setName(((OptionListWrapper) optionWrapper).getOption().getInternalName());
f.setValue(getChildComponent().getFilters().get(0).getValue());
f.setRadio(getChildComponent().getFilters().get(0).getRadio());
filters.add(f);
}
}
} else {
f = new Filter();
f.setName(filterDescription.getInternalName());
if (component.equals("ComboBox")) {
if (comboComponent.getSelectedItem() != null) {
f.setValue(comboComponent.getSelectedItem().toString());
}
} else {
if (listComponent.getSelectedValues() != null && listComponent.getSelectedValues().length > 0) {
StringBuilder sb = new StringBuilder();
Object[] list = listComponent.getSelectedValues();
if (list.length > 0) {
sb.append(((OptionListWrapper) list[0]).getOption().getValue());
for (int i = 1; i < list.length; i++)
sb.append(",").append(((OptionListWrapper) list[i]).getOption().getValue());
}
f.setValue(sb.toString());
}
}
filters.add(f);
}
return filters;
}
@Override
//Always render filter from select component filter
public Boolean hasChanged() {
return true;
}
@Override
public void setListOptions(List<Option> optionList) {
if (this.component.equals("ComboBox")) {
DefaultComboBoxModel m = new DefaultComboBoxModel();
for (Option o : optionList)
m.addElement(new OptionListWrapper(o));
comboComponent.setModel(m);
} else {
DefaultListModel m = new DefaultListModel();
for (Option o : optionList)
m.addElement(new OptionListWrapper(o));
listComponent.setModel(m);
}
}
/**
* @noinspection UnusedDeclaration
*/
public HashMap<Option, HashMap<String, List<Option>>> getPushActions() {
return pushActions;
}
public HashMap<String, List<Option>> getPushActionData_defaultOption() {
if (pushActions.size() > 0)
{
if (component.equals("ComboBox"))
{
return pushActions.get(((OptionListWrapper) comboComponent.getSelectedItem()).getOption());
} else
{
return pushActions.get(((OptionListWrapper) listComponent.getSelectedValue()).getOption());
}
} else
{
return new HashMap<>();
}
}
}