package eu.etaxonomy.taxeditor.preference.wizard;
import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.viewers.AbstractTreeViewer;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.widgets.Widget;
+import eu.etaxonomy.cdm.persistence.dto.TermDto;
+import eu.etaxonomy.cdm.persistence.dto.TermNodeDto;
import eu.etaxonomy.taxeditor.l10n.Messages;
import eu.etaxonomy.taxeditor.model.ImageResources;
private static final Font FONT_DEFAULT = JFaceResources.getFontRegistry().get(JFaceResources.DEFAULT_FONT);
private static final Font FONT_ITALIC = JFaceResources.getFontRegistry().getItalic(JFaceResources.DEFAULT_FONT);
- private static final Font FONT_BOLD = JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT);
- private CheckboxTreeViewer viewer;
- private Button btnCollapse;
- private Button btnExpand;
- private Button btnSelectAllChildren;
- private Button btnSelectDirectChildren;
+ protected static final Font FONT_BOLD = JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT);
+ protected CheckboxTreeViewer viewer;
+ protected Button btnCollapse;
+ protected Button btnExpand;
+ protected Button btnSelectAllChildren;
+ protected Button btnSelectDirectChildren;
protected Object[] checkedElements;
protected boolean allowTopLevelSelection = false;
+
public CheckBoxTreeComposite(Composite parent, ITreeContentProvider contentProvider, IBaseLabelProvider labelProvider, int style) {
super(parent, style);
GridLayout layout = new GridLayout();
return tree;
}
-
- protected void updateAfterUnCheckElement(TreeItem item) {
+
+ protected void updateAfterUnCheckElement(Object item) {
Object[] tempArray = new Object[checkedElements.length -1];
+
int index = 0;
for (Object o:checkedElements){
- if (o != null && !o.equals(item.getData())){
+ Object element = null;
+ if (item instanceof TreeItem) {
+ element = ((TreeItem)item).getData();
+ }else {
+ element = item;
+ }
+ if (o != null && !o.equals(element)){
tempArray[index] = o;
index++;
}
treeItem.setFont(FONT_DEFAULT);
}
}
+
}
for (TreeItem rootItem : rootItems) {
updateItem(rootItem);
}
+
}
/**
List<TreeItem> childItemList = Arrays.asList(childItems);
boolean allChecked = childItemList.stream().allMatch(childItem->childItem.getChecked());
childItemList.stream().forEach(childItem->childItem.setChecked(!allChecked));
- TreeItem parent = getRoot(treeItem);
- updateItem(parent);
+ if (!allChecked) {
+ for (TreeItem updateItem: childItemList) {
+ updateAfterCheckElement(updateItem);
+ }
+
+ }else {
+ for (TreeItem updateItem: childItemList) {
+ updateAfterUnCheckElement(updateItem);
+ }
+ }
+
+
}
}
else if(e.widget == btnSelectAllChildren){
Widget item = viewer.testFindItem(firstElement);
if(item instanceof TreeItem){
viewer.expandToLevel(firstElement, AbstractTreeViewer.ALL_LEVELS);
- viewer.setSubtreeChecked(firstElement, !((TreeItem) item).getFont().equals(FONT_BOLD));
- TreeItem parent = getRoot((TreeItem) item);
- updateItem(parent);
+ Set<TreeItem> childrenSet = getSubTreeItems((TreeItem)item);
+ Object[] children = childrenSet.toArray();
+ boolean checked = true;
+ if (children == null) {
+ return;
+ }
+ if (children != null && ((TreeItem)children[0]).getChecked()) {
+ checked = false;
+ }
+ viewer.setSubtreeChecked(firstElement, checked);
((TreeItem) item).setChecked(false);
+ Object[] checkedElements = viewer.getCheckedElements();
+
+ for (Object updateItem: children) {
+ if (((TreeItem)children[0]).getChecked()) {
+ updateAfterCheckElement(updateItem);
+ }else {
+ updateAfterUnCheckElement(updateItem);
+ }
+ }
+
}
}
}
- private TreeItem getRoot(TreeItem treeItem) {
+ private void updateAfterCheckElement(Object item) {
+ Set<Object> tempList = new HashSet<>();
+ if (checkedElements != null) {
+ Collections.addAll(tempList, checkedElements);
+ }
+ TermNodeDto checkedNode = null;
+ TermDto checkedTerm = null;
+ TreeItem treeItem = null;
+ if (item instanceof TreeItem) {
+ treeItem = (TreeItem) item;
+ if (treeItem.getData() instanceof TermNodeDto) {
+ checkedNode = (TermNodeDto)treeItem.getData();
+ checkedTerm = checkedNode.getTerm();
+ }else if (treeItem.getData() instanceof TermDto) {
+ checkedTerm = (TermDto)treeItem.getData();
+ }else {
+ return;
+ }
+ }else if (item instanceof TermNodeDto) {
+ checkedNode = (TermNodeDto)item;
+ checkedTerm = checkedNode.getTerm();
+ }else if (item instanceof TermDto) {
+ checkedTerm = (TermDto)item;
+ }else {
+ return;
+ }
+ if (checkedTerm != null) {
+ tempList.add(checkedTerm);
+ }
+
+ setCheckedElements(tempList.toArray());
+
+ }
+
+ protected TreeItem getRoot(TreeItem treeItem) {
TreeItem parent = treeItem;
while(parent.getParentItem()!=null){
parent = parent.getParentItem();
public Object[] getCheckedElements() {
return checkedElements;
}
+ private Set<TreeItem> getSubTreeItems(TreeItem parent) {
+ Set<TreeItem> children = new HashSet<>();
+
+ if (parent.getItems() != null) {
+ children.addAll(Arrays.asList(parent.getItems()));
+ for(TreeItem child : parent.getItems()) {
+ children.addAll(getSubTreeItems(child));
+ }
+ }
+ return children;
+ }
+
@Override
public void widgetDefaultSelected(SelectionEvent e) {