/*
* #%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.panel.AttributesTreeModel;
import org.gitools.ui.app.datasources.biomart.panel.AttributesTreeModel.AttributeWrapper;
import org.gitools.ui.core.Application;
import org.gitools.ui.core.pages.common.FilteredTreePage;
import org.gitools.ui.core.pages.common.FilteredTreePanel;
import org.gitools.ui.platform.dialog.ExceptionGlassPane;
import org.gitools.ui.platform.dialog.MessageStatus;
import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreeSelectionModel;
import java.util.ArrayList;
import java.util.List;
public class BiomartAttributePage extends FilteredTreePage {
private MartLocation mart;
private DatasetInfo dataset;
private List<AttributePage> attrPages;
private AttributeDescription attribute;
private BiomartService biomartService;
private DatasetConfig biomartConfig;
private Boolean reloadData; //determine whether update panel data
public BiomartAttributePage() {
super();
this.mart = null;
this.dataset = null;
this.attrPages = null;
}
@Override
public JComponent createControls() {
JComponent component = super.createControls();
panel.tree.setRootVisible(false);
panel.tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
panel.tree.addTreeSelectionListener(new TreeSelectionListener() {
@Override
public void valueChanged(TreeSelectionEvent e) {
selectionChanged();
}
});
return component;
}
@Override
public void updateControls() {
setComplete(false);
panel.setModel(new AttributesTreeModel(new ArrayList<AttributePage>(0)));
new Thread(new Runnable() {
@Override
public void run() {
try {
if (attrPages == null || reloadData) {
setStatus(MessageStatus.PROGRESS);
setMessage("Retrieving available attributes ...");
biomartConfig = biomartService.getConfiguration(dataset);
attrPages = biomartConfig.getAttributePages();
}
final AttributesTreeModel model = new AttributesTreeModel(attrPages);
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
FilteredTreePanel p = getTreePanel();
p.setModel(model);
p.expandAll();
setMessage(MessageStatus.INFO, "");
}
});
} catch (final Throwable cause) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
setStatus(MessageStatus.ERROR);
setMessage(cause.getClass().getSimpleName() + ": " + cause.getMessage());
ExceptionGlassPane dlg = new ExceptionGlassPane(Application.get(), cause);
dlg.setVisible(true);
}
});
}
}
}).start();
}
private void selectionChanged() {
final DefaultMutableTreeNode node = (DefaultMutableTreeNode) panel.tree.getLastSelectedPathComponent();
boolean complete = false;
if (node != null && (node.getUserObject() instanceof AttributeWrapper)) {
AttributeWrapper aw = (AttributeWrapper) node.getUserObject();
complete = aw.getType() == AttributeWrapper.NodeType.ATTRIBUTE;
if (complete) {
attribute = (AttributeDescription) aw.getObject();
}
}
setComplete(complete);
}
public void setSource(BiomartService biomartService, MartLocation mart, DatasetInfo dataset) {
if (this.dataset != null && this.dataset.getName().equals(dataset.getName())) {
reloadData = false;
} else {
reloadData = true;
}
this.biomartService = biomartService;
this.mart = mart;
this.dataset = dataset;
}
public synchronized void setAttributePages(List<AttributePage> attrPages) {
this.attrPages = attrPages;
reloadData = false;
}
public synchronized List<AttributePage> getAttributePages() {
return attrPages;
}
public AttributeDescription getAttribute() {
return attribute;
}
@Override
protected TreeModel createModel(String filterText) {
return new AttributesTreeModel(attrPages, filterText);
}
public DatasetConfig getBiomartConfig() {
return biomartConfig;
}
}