/*
* #%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.panel;
import org.gitools.datasources.biomart.BiomartService;
import org.gitools.datasources.biomart.BiomartServiceFactory;
import org.gitools.datasources.biomart.restful.model.AttributeDescription;
import org.gitools.datasources.biomart.restful.model.AttributePage;
import org.gitools.datasources.biomart.restful.model.DatasetInfo;
import org.gitools.datasources.biomart.restful.model.MartLocation;
import org.gitools.datasources.biomart.settings.BiomartSource;
import org.gitools.datasources.biomart.settings.BiomartSourceManager;
import org.gitools.ui.app.datasources.biomart.panel.AttributesTreeModel.AttributeWrapper;
import org.gitools.ui.core.pages.common.FilteredTreePanel;
import javax.swing.*;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* @noinspection ALL
*/
public class BiomartAttributePanel extends FilteredTreePanel {
private BiomartService port;
private MartLocation mart;
private DatasetInfo dataset;
private List<AttributePage> attrPages;
private final List<AttributeDescription> selectedAttr;
private final List<String> selectedAttrNames;
private final Set<String> selectedAttrNamesSet;
public static interface AttributeSelectionListener {
void selectionChanged();
}
private final List<AttributeSelectionListener> attributeSelectionListeners = new ArrayList<AttributeSelectionListener>();
public BiomartAttributePanel() {
super();
this.port = null;
this.mart = null;
this.dataset = null;
this.attrPages = null;
this.selectedAttr = new ArrayList<AttributeDescription>();
this.selectedAttrNames = new ArrayList<String>();
this.selectedAttrNamesSet = new HashSet<String>();
tree.setRootVisible(false);
tree.addTreeSelectionListener(new TreeSelectionListener() {
@Override
public void valueChanged(TreeSelectionEvent e) {
selectionChanged(e);
}
});
}
/*
public void setBiomartParameters(
MartServiceSoap port,
MartLocation mart,
DatasetInfo dataset) {
this.port = port;
this.mart = mart;
this.dataset = dataset;
loadAttributePages();
}
*/
public void setBiomartParameters(BiomartService port, MartLocation mart, DatasetInfo dataset) {
this.port = port;
this.mart = mart;
this.dataset = dataset;
loadAttributePages();
}
private void loadAttributePages() {
setControlsEnabled(false);
TreeNode node = new DefaultMutableTreeNode("Loading...");
TreeModel model = new DefaultTreeModel(node);
setModel(model);
//TODO fire loading starts
new Thread(new Runnable() {
@Override
public void run() {
loadingThread();
}
}).start();
}
public List<AttributeDescription> getSelectedAttributes() {
return selectedAttr;
}
public List<String> getSelectedAttributeNames() {
return selectedAttrNames;
}
//FIXME
private void loadingThread() {
try {
List<BiomartSource> lBs = BiomartSourceManager.getDefault().getSources();
BiomartSource bsrc = lBs.get(0);
BiomartService service = BiomartServiceFactory.createService(bsrc);
final List<AttributePage> pages = service.getAttributes(mart, dataset);
//BiomartCentralPortalSoapService.getDefault().getAttributes(mart, dataset);
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
setControlsEnabled(true);
setAttributePages(pages);
//TODO fire loading ends
}
});
} catch (Exception e) {
//TODO fire loading exception
e.printStackTrace();
}
}
private void selectionChanged(TreeSelectionEvent e) {
TreePath[] paths = e.getPaths();
if (paths == null) {
return;
}
StringBuilder sb = new StringBuilder();
for (TreePath sel : paths) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) sel.getLastPathComponent();
AttributeWrapper attrw = (AttributeWrapper) node.getUserObject();
AttributeDescription attribute = attrw.getType() == AttributeWrapper.NodeType.ATTRIBUTE ? (AttributeDescription) attrw.getObject() : null;
if (e.isAddedPath(sel)) {
if (attribute != null) {
if (!selectedAttrNamesSet.contains(attribute.getInternalName())) { // xrp: check if internal name instead
sb.setLength(0);
Object[] opath = sel.getPath();
if (opath.length > 1) {
sb.append(opath[1].toString());
for (int i = 2; i < opath.length; i++)
sb.append(" > ").append(opath[i].toString());
}
selectedAttr.add(attribute);
selectedAttrNames.add(sb.toString());
selectedAttrNamesSet.add(attribute.getInternalName()); // xrp: check if internal name instead
for (AttributeSelectionListener l : attributeSelectionListeners)
l.selectionChanged();
}
} else {
tree.getSelectionModel().removeSelectionPath(sel);
}
} else if (attribute != null) {
int i = selectedAttr.indexOf(attribute);
selectedAttr.remove(i);
selectedAttrNames.remove(i);
selectedAttrNamesSet.remove(attribute.getInternalName());// xrp: check if internal name instead
for (AttributeSelectionListener l : attributeSelectionListeners)
l.selectionChanged();
}
}
}
public void addAttributeSelectionListener(AttributeSelectionListener listener) {
attributeSelectionListeners.add(listener);
}
public void removeAttributeSelectionListener(AttributeSelectionListener listener) {
attributeSelectionListeners.remove(listener);
}
private void setControlsEnabled(boolean enabled) {
filterField.setEnabled(enabled);
//expandBtn.setEnabled(enabled);
//collapseBtn.setEnabled(enabled);
}
@Override
protected TreeModel updateModel(String filterText) {
if (attrPages == null) {
return null;
}
return new AttributesTreeModel(attrPages, filterText);
}
public synchronized void setAttributePages(List<AttributePage> attrPages) {
this.attrPages = attrPages;
final AttributesTreeModel model = attrPages == null ? null : new AttributesTreeModel(attrPages);
setModel(model);
expandAll();
}
public synchronized List<AttributePage> getAttributePages() {
return attrPages;
}
}