package com.mobilesorcery.sdk.capabilities.ui; import java.text.MessageFormat; import java.util.Map; import org.eclipse.core.resources.IProject; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTreeViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.ICheckStateProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import com.mobilesorcery.sdk.capabilities.core.AbstractChangeRequest; import com.mobilesorcery.sdk.capabilities.core.CompoundChangeRequest; import com.mobilesorcery.sdk.capabilities.core.IChangeRequest; public class ChangeRequestsPage extends WizardPage { public class ChangeRequestCheckStateProvider implements ICheckStateProvider { private Map<IProject, IChangeRequest> changeRequests; public ChangeRequestCheckStateProvider(Map<IProject, IChangeRequest> changeRequests) { this.changeRequests = changeRequests; } public boolean isChecked(Object element) { if (isGrayed(element)) { return false; } if (element instanceof IProject) { IChangeRequest changeRequest = changeRequests.get(element); return isChecked(changeRequest); } else if (element instanceof CompoundChangeRequest) { CompoundChangeRequest compoundChangeRequest = (CompoundChangeRequest) element; for (IChangeRequest changeRequest : compoundChangeRequest.getChangeRequests()) { if (!isChecked(changeRequest)) { return false; } return true; } } else if (element instanceof AbstractChangeRequest) { AbstractChangeRequest changeRequest = (AbstractChangeRequest) element; CompoundChangeRequest changeRequestParent = changeRequest.getParent(); return changeRequestParent != null && changeRequestParent.shouldApply(changeRequest); } return false; } public boolean isGrayed(Object element) { if (element instanceof IProject) { IChangeRequest changeRequest = changeRequests.get(element); return isGrayed(changeRequest); } else if (element instanceof CompoundChangeRequest) { CompoundChangeRequest compoundChangeRequest = (CompoundChangeRequest) element; IChangeRequest[] changeRequests = compoundChangeRequest.getChangeRequests(); int checkedCount = 0; for (IChangeRequest changeRequest : changeRequests) { if (isChecked(changeRequest) || isGrayed(changeRequest)) { checkedCount++; } } return checkedCount > 0 && changeRequests.length > checkedCount; } return false; } } public class ChangeRequestLabelProvider extends LabelProvider { public String getText(Object element) { if (element instanceof IProject) { return MessageFormat.format("Project: {0}", ((IProject) element).getName()); } return super.getText(element); } } public class ChangeRequestContentProvider implements ITreeContentProvider { private Map<IProject, IChangeRequest> input; public void dispose() { } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { this.input = (Map<IProject, IChangeRequest>) newInput; } public Object[] getElements(Object inputElement) { return input.keySet().toArray(); } public Object[] getChildren(Object parentElement) { if (parentElement instanceof IProject) { return getChangeRequests(input.get(parentElement)); } else if (parentElement instanceof CompoundChangeRequest) { return getChangeRequests((IChangeRequest) parentElement); } return new Object[0]; } private Object[] getChangeRequests(IChangeRequest changeRequest) { if (changeRequest instanceof CompoundChangeRequest) { return ((CompoundChangeRequest) changeRequest).getChangeRequests(); } else { return new Object[] { changeRequest }; } } public Object getParent(Object element) { return (element instanceof AbstractChangeRequest) ? ((AbstractChangeRequest) element).getParent(): null; } public boolean hasChildren(Object element) { return getChildren(element).length > 0; } } private Map<IProject, IChangeRequest> changeRequests; protected ChangeRequestsPage(Map<IProject, IChangeRequest> changeRequests) { super("change.requests", "Change Project Properties", null); this.changeRequests = changeRequests; } public void createControl(Composite parent) { Composite main = new Composite(parent, SWT.NONE); main.setLayout(new GridLayout(1, false)); Label desc = new Label(main, SWT.NONE); desc.setText("Select the changes to apply to the project(s)"); final CheckboxTreeViewer changeRequestsTree = new CheckboxTreeViewer(main); changeRequestsTree.setLabelProvider(new ChangeRequestLabelProvider()); final ChangeRequestContentProvider contentProvider = new ChangeRequestContentProvider(); changeRequestsTree.setContentProvider(contentProvider); changeRequestsTree.setCheckStateProvider(new ChangeRequestCheckStateProvider(changeRequests)); changeRequestsTree.setInput(changeRequests); changeRequestsTree.addCheckStateListener(new ICheckStateListener() { public void checkStateChanged(CheckStateChangedEvent event) { Object element = event.getElement(); Object parent = contentProvider.getParent(element); if (parent instanceof CompoundChangeRequest) { CompoundChangeRequest changeRequest = (CompoundChangeRequest) parent; IChangeRequest child = (IChangeRequest) event.getElement(); changeRequest.setShouldApply(child, event.getChecked()); if (child instanceof CompoundChangeRequest) { ((CompoundChangeRequest) child).setAllShouldApply(event.getChecked(), true); } } if (parent == null && element instanceof IProject) { IChangeRequest child = changeRequests.get((IProject) element); if (child instanceof CompoundChangeRequest) { ((CompoundChangeRequest) child).setAllShouldApply(event.getChecked(), true); } } changeRequestsTree.refresh(true); } }); changeRequestsTree.getTree().setLayoutData(new GridData(GridData.FILL_BOTH)); setControl(main); } }