package org.semanticsoft.vaaclipse.p2.install.ui.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.inject.Inject;
import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.repository.IRepository;
import org.semanticsoft.vaaclipse.p2.install.ui.IRepositoryExplorer;
import org.semanticsoft.vaaclipse.p2.iservice.IInstallNewSoftwareService;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.ui.CheckBox;
import com.vaadin.ui.Component;
import com.vaadin.ui.TreeTable;
/*******************************************************************************
* Copyright (c) 2012 Klevis Ramo and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Klevis Ramo - initial API and implementation
*******************************************************************************/
public class P2TreeTable implements IRepositoryExplorer {
private TreeTable treeTable;
private List<CheckBox> listRootChecks = new ArrayList<>();
private List<CheckBox> listChildChecks = new ArrayList<>();
private List<IInstallableUnit> selectedRepositoryRoot = new ArrayList<>();
private List<IInstallableUnit> selectedRepositoryChilds = new ArrayList<>();
private List<IInstallableUnit> loadRepository = new ArrayList<>();
private HashMap<String, List<CheckBox>> childsLinkedToRoot = new HashMap<>();
private IInstallNewSoftwareService installService;
private List<CheckBox> listCheckBoxChilds;
private String errorMessage;
public P2TreeTable(IInstallNewSoftwareService installService) {
super();
this.installService = installService;
initUI();
}
@Override
public Object getUIComponent() {
return treeTable;
}
com.vaadin.data.Property.ValueChangeListener checkBoxChildListener = new ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
// TODO Auto-generated method stub
selectedRepositoryChilds.clear();
for (CheckBox checkBox2 : listChildChecks) {
Boolean value2 = checkBox2.getValue();
String caption2 = checkBox2.getCaption();
for (IInstallableUnit iInstallableUnit2 : loadRepository) {
if (caption2.equals(iInstallableUnit2.getId())) {
if (value2) {
selectedRepositoryChilds.add(iInstallableUnit2);
}
}
}
}
}
};
ValueChangeListener checkBoxRootListener = new ValueChangeListener() {
@Override
public void valueChange(ValueChangeEvent event) {
// TODO Auto-generated method stub
selectedRepositoryRoot.clear();
for (CheckBox checkBox2 : listRootChecks) {
Boolean value2 = checkBox2.getValue();
String caption2 = checkBox2.getCaption();
for (IInstallableUnit iInstallableUnit2 : loadRepository) {
if (caption2.equals(iInstallableUnit2.getId())) {
if (value2) {
selectedRepositoryRoot.add(iInstallableUnit2);
}
boolean category = installService
.isCategory(iInstallableUnit2);
if (category) {
// check all childs
List<CheckBox> list = childsLinkedToRoot
.get(caption2);
for (CheckBox checkBox3 : list) {
checkBox3.setValue(value2);
}
}
}
}
}
}
};
@Override
public void addRepositories(List<IInstallableUnit> iInstallableUnits) {
clear();
ArrayList<IInstallableUnit> arrayList = new ArrayList<>();
loadRepository.addAll(iInstallableUnits);
for (IInstallableUnit iInstallableUnit : loadRepository) {
addRootItem(iInstallableUnit);
List<IInstallableUnit> extractFromCategory = installService
.extractFromCategory(iInstallableUnit);
arrayList.addAll(extractFromCategory);
addSubItems(extractFromCategory, iInstallableUnit);
}
loadRepository.addAll(arrayList);
}
private void clear() {
treeTable.removeAllItems();
selectedRepositoryChilds.clear();
selectedRepositoryRoot.clear();
loadRepository.clear();
childsLinkedToRoot.clear();
listRootChecks.clear();
listChildChecks.clear();
}
@Override
public void initUI() {
treeTable = new TreeTable("");
treeTable.addContainerProperty("Name", CheckBox.class, "");
treeTable.addContainerProperty("Version", String.class, "");
treeTable.setPageLength(5);
treeTable.setWidth("40em");
treeTable.setSelectable(true);
treeTable.setImmediate(true);
}
@Override
public void addRootItem(IInstallableUnit iInstallableUnit) {
CheckBox checkBox = new CheckBox(iInstallableUnit.getId());
treeTable.addItem(new Object[] { checkBox,
iInstallableUnit.getVersion().toString() },
iInstallableUnit.getId());
checkBox.addValueChangeListener(checkBoxRootListener);
listRootChecks.add(checkBox);
}
@Override
public void addRoottems(List<IInstallableUnit> iInstallableUnits) {
for (IInstallableUnit iInstallableUnit : iInstallableUnits) {
addRootItem(iInstallableUnit);
}
}
@Override
public void addSubItems(List<IInstallableUnit> childIInstallableUnits,
IInstallableUnit root) {
listCheckBoxChilds = new ArrayList<>();
for (IInstallableUnit iInstallableUnit : childIInstallableUnits) {
addSubItem(iInstallableUnit, root);
}
childsLinkedToRoot.put(root.getId(), listCheckBoxChilds);
}
@Override
public void addSubItem(IInstallableUnit childIInstallableUnit,
IInstallableUnit root) {
CheckBox checkBoxChild = new CheckBox(childIInstallableUnit.getId());
checkBoxChild.addValueChangeListener(checkBoxChildListener);
listChildChecks.add(checkBoxChild);
treeTable.addItem(new Object[] { checkBoxChild,
childIInstallableUnit.getVersion().toString() },
childIInstallableUnit.getId());
treeTable.setParent(childIInstallableUnit.getId(), root.getId());
listCheckBoxChilds.add(checkBoxChild);
}
@Override
public String errorMessage() {
// TODO Auto-generated method stub
return errorMessage;
}
@Override
public boolean validate() {
// TODO Auto-generated method stub
return false;
}
@Override
public List<IInstallableUnit> getRepositories() {
// TODO Auto-generated method stub
selectedRepositoryRoot.addAll(selectedRepositoryChilds);
return selectedRepositoryRoot;
}
}