/*
* #%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 javax.swing.*;
import java.util.List;
/**
* @noinspection ALL
*/
public class FilterDescriptionPanel extends javax.swing.JPanel {
private final FilterCollectionPanel parentCollection;
private FilterDescription filterDescription;
private FilterComponent filterComponent;
private Integer currentHeight;
private Boolean renderPanel;
private Boolean renderLabel;
public FilterDescriptionPanel(FilterDescription description, FilterCollectionPanel collectionParent, boolean labelRendered) {
this.filterDescription = description;
this.parentCollection = collectionParent;
this.currentHeight = 0;
this.renderLabel = labelRendered;
if (filterDescription.getDisplayType() != null) {
this.renderPanel = true;
buildComponent();
} else if (filterDescription.getPointerDataset() != null) {
try {
DatasetInfo d = new DatasetInfo();
d.setName(filterDescription.getPointerDataset());
d.setInterface(filterDescription.getPointerInterface());
DatasetConfig configuration = getParentCollection().getFilterConfigurationPage().getBiomartService().getConfiguration(d);
buildPointerFilterComponents(configuration);
renderPanel = true;
} catch (final Exception ex) {
System.out.println("Pointer dataset :" + filterDescription.getPointerDataset() + " has not been found");
renderPanel = false;
return;
}
} else {
this.renderPanel = false;
}
}
/**
* BuildPointer elements with default options if it is the case
*
* @param configuration
* @param DefaultOptions
*/
private void buildPointerFilterComponents(DatasetConfig configuration) {
for (FilterPage page : configuration.getFilterPages())
if (!page.isHidden() && !page.isHideDisplay())
{
for (FilterGroup group : page.getFilterGroups())
if (!group.isHidden() && !group.isHideDisplay())
{
for (FilterCollection collection : group.getFilterCollections())
for (FilterDescription desc : collection.getFilterDescriptions())
if ((desc.getInternalName().equals(filterDescription.getPointerFilter())) && (!desc.isHideDisplay())) {
this.renderPanel = true;
// WARN: This code is for solving bugs in xml config avoiding build combos
// where it is not the case
// SOLUTION is check if component receives pushactions then it is a
// combo component!
if (parentCollection.getFilterConfigurationPage().
getDefaultSelecComposData().get(filterDescription.getPointerFilter()) != null) {
desc.setStyle("menu");
desc.setDisplayType("list");
}
filterDescription = desc;
buildComponent();
}
}
}
}
/**
* Builds components for the filterDescription
*/
private void buildComponent() {
String displayType = filterDescription.getDisplayType();
boolean multipleValues = filterDescription.getMultipleValues() == 1;
String style = filterDescription.getStyle();
String graph = filterDescription.getGraph();
FilterComponent child = null;
if (displayType.equals("container")) {
String displayStyleOption = filterDescription.getOptions().get(0).getDisplayType();
int multipleValuesOption = filterDescription.getOptions().get(0).getMultipleValues();
FilterComponent componentParent = new FilterSelectComponent(filterDescription, this);
Option filterOptions = filterDescription.getOptions().get(0);
if (displayStyleOption.equals("list")) {
if (multipleValuesOption == 1) {
child = new FilterCheckBoxComponent(filterOptions);
} else {
child = new FilterRadioComponent(filterOptions);
}
} else if (displayStyleOption.equals("text")) {
child = new FilterTextComponent(filterOptions);
}
componentParent.addChildComponent(child);
filterComponent = componentParent;
} else {
if (displayType.equals("list")) {
if (style.equals("menu") && (graph == null || !graph.equals("1"))) {
FilterSelectComponent selecComponent = new FilterSelectComponent(filterDescription, this);
//Retrieve PushAction Data from default option
parentCollection.getFilterConfigurationPage().storeSelecComponentsDefaultData(selecComponent.getPushActionData_defaultOption());
filterComponent = selecComponent;
} else if (style.equals("menu") && graph != null && graph.equals("1")) {
filterComponent = new FilterTextComponent(filterDescription, this);
} else if (multipleValues) {
filterComponent = new FilterCheckBoxComponent(filterDescription, this);
} else {
filterComponent = new FilterRadioComponent(filterDescription, this);
}
} else if (displayType.equals("text")) {
filterComponent = new FilterTextComponent(filterDescription, this);
} else {
System.out.println("Component " + filterDescription.getInternalName() + "has not been builded");
return;
}
}
currentHeight = filterComponent.getCurrentHeight();
this.removeAll();
//this.setLayout(new GridLayout(child != null? 2 : 1, 1));
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
this.add(filterComponent);
if (child != null) {
this.add(child);
currentHeight += child.getCurrentHeight();
}
validate();
}
/**
* 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() {
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 396, Short.MAX_VALUE));
layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGap(0, 298, Short.MAX_VALUE));
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
// End of variables declaration//GEN-END:variables
public FilterDescription getFilterDescription() {
return filterDescription;
}
public final FilterCollectionPanel getParentCollection() {
return parentCollection;
}
public List<Filter> getFilters() {
return filterComponent.getFilters();
}
/**
* @noinspection UnusedDeclaration
*/
public void setFilterComponents(FilterComponent components) {
this.filterComponent = components;
}
/**
* @noinspection UnusedDeclaration
*/
public Boolean isChild() {
return (filterDescription == null);
}
Integer getCurrentHeight() {
return currentHeight;
}
public Boolean getRenderPanel() {
return renderPanel;
}
public void setRenderPanel(Boolean rendered) {
this.renderPanel = rendered;
}
public Boolean getRenderLabel() {
return renderLabel;
}
public void setRenderLabel(Boolean renderLabel) {
this.renderLabel = renderLabel;
}
}