package com.illumina.basespace.igv.ui.tree;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JTree;
import javax.swing.SwingWorker;
import org.broad.igv.ui.IGV;
import com.illumina.basespace.entity.AppResultCompact;
import com.illumina.basespace.entity.AppSession;
import com.illumina.basespace.entity.AppSessionCompact;
import com.illumina.basespace.entity.Project;
import com.illumina.basespace.entity.ProjectCompact;
import com.illumina.basespace.igv.BaseSpaceMain;
import com.illumina.basespace.igv.BaseSpaceMain.ClientContext;
import com.illumina.basespace.igv.ui.BaseSpaceHelper;
import com.illumina.basespace.igv.ui.ImageProvider;
import com.illumina.basespace.igv.ui.ProgressReport;
import com.illumina.basespace.param.QueryParams;
import com.illumina.basespace.property.ProjectReference;
import com.illumina.basespace.property.Property;
import com.illumina.basespace.util.TypeHelper;
public class ProjectNode extends BaseSpaceTreeNode<Project>
{
private int maxResults = 128;
private JPopupMenu menu;
private static final String INPUT_PROJECT = "Input.project-id";
private static final String OUTPUT_PROJECT = "Output.projects";
private static QueryParams params;
static
{
params = new QueryParams();
params.setSortDir(QueryParams.DESCENDING);
params.setSortBy("Id");
}
public ProjectNode(Project bean,UUID clientId,ClientContext clientContext)
{
super(bean,clientId,clientContext);
}
public JPopupMenu getPopupMenu()
{
if (menu != null)return menu;
menu = new JPopupMenu();
JMenuItem mi = new JMenuItem("Set Maximum Results");
mi.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
String result = JOptionPane.showInputDialog("Enter max results from API", String.valueOf(maxResults));
try
{
maxResults = Integer.parseInt(result);
}
catch(NumberFormatException nfe)
{
}
}
});
menu.add(mi);
return menu;
}
abstract class AppSessionWorker extends SwingWorker<List<BaseSpaceTreeNode<?>>,ProgressReport>
{
public void publishProgress(ProgressReport... chunks)
{
super.publish(chunks);
}
}
public void loadChildrenAsynch(final JTree tree)
{
final BaseSpaceTreeNode<?> treeNode = this;
BrowserDialog.instance().workInit(100);
AppSessionWorker worker = new AppSessionWorker()
{
@Override
protected List<BaseSpaceTreeNode<?>> doInBackground() throws Exception
{
List<BaseSpaceTreeNode<?>> decorators = new ArrayList<BaseSpaceTreeNode<?>>(64);
decorators.addAll(getAppSessionNodes(this));
return decorators;
}
@Override
protected void process(List<ProgressReport> chunks)
{
BrowserDialog.instance().workProgress(chunks);
}
@Override
protected void done()
{
try
{
List<BaseSpaceTreeNode<?>> decorators = get();
addChildren(tree,treeNode,decorators);
}
catch(Throwable t)
{
BrowserDialog.instance().workDone();
BaseSpaceHelper.showErrorDialog(IGV.getMainFrame(),t);
}
finally
{
BrowserDialog.instance().workDone();
}
}
};
BrowserDialog.instance().workStart();
worker.execute();
}
protected List<BaseSpaceTreeNode<?>>getAppSessionNodes(final AppSessionWorker worker)
{
List<AppSession> appSessions = new ArrayList<AppSession>();
List<AppSessionCompact> appSessionCompactList = new ArrayList<AppSessionCompact>();
if (getConfig().getAppSessionId() != null)
{
AppSession fullAppSession = BaseSpaceMain.instance().getApiClient(getClientId()).getAppSession(getConfig().getAppSessionId()).get();
Property[]props = fullAppSession.properties();
for(Property prop:props)
{
if (prop.getType().equalsIgnoreCase(TypeHelper.PROPERTY_PROJECT_ARRAY) && prop.getName().equalsIgnoreCase(OUTPUT_PROJECT) )
{
ProjectReference projectRef = (ProjectReference)prop;
if (projectRef.getContent().getId().equals(getBean().getId()))
{
worker.publishProgress(new ProgressReport(fullAppSession.getName()));
appSessions.add(fullAppSession);
}
}
}
}
else
{
List<AppResultCompact> appResults = new ArrayList<AppResultCompact>();
params.setLimit(maxResults);
appResults.addAll(Arrays.asList(BaseSpaceMain.instance().getApiClient(getClientId()).getAppResults(getBean(), params).items()));
appSessionCompactList.addAll(Arrays.asList(BaseSpaceMain.instance().getApiClient(getClientId()).getAppSessions(getConfig().getProjectId(), params).items()));
List<String>appSessionIds = new ArrayList<String>(512);
BrowserDialog.instance().setWorkMax( appResults.size());
}
List<BaseSpaceTreeNode<?>> decorators = new ArrayList<BaseSpaceTreeNode<?>>(appSessions.size());
for (AppSessionCompact obj : appSessionCompactList)
{
AppSessionNode an = new AppSessionNode(obj,getClientId(),getClientContext());
decorators.add(an);
}
return decorators;
}
private boolean isIdInArray(ProjectCompact[] projectCompact, String id) {
for(ProjectCompact p: projectCompact){
if(p.getId().equals(id))
return true;
}
return false;
}
@Override
public void renderNode(JTree tree, JLabel label, Project value, boolean selected, boolean expanded, boolean leaf,
int row, boolean hasFocus)
{
label.setText("<html><b>" + value.getName() + "</b>"
+ " Owned By " + value.getUserOwnedBy().getName() + "</html>");
label.setIcon(ImageProvider.instance().getIcon("org.png"));
}
}