package com.mobilesorcery.sdk.ui.internal.properties;
import java.util.TreeSet;
import org.eclipse.core.runtime.Path;
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.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.Control;
import org.eclipse.swt.widgets.Label;
import com.mobilesorcery.sdk.core.CoreMoSyncPlugin;
import com.mobilesorcery.sdk.core.security.IApplicationPermissions;
import com.mobilesorcery.sdk.ui.MoSyncPropertyPage;
public class PermissionsPropertyPage extends MoSyncPropertyPage {
public PermissionsPropertyPage() {
super(true);
}
public class PermissionsContentProvider implements ITreeContentProvider {
private final IApplicationPermissions permissions;
public PermissionsContentProvider(IApplicationPermissions permissions) {
this.permissions = permissions;
}
@Override
public Object[] getChildren(Object element) {
return permissions.getAvailablePermissions(element == null ? null : element.toString()).toArray();
}
@Override
public Object getParent(Object element) {
return null;
}
@Override
public boolean hasChildren(Object element) {
return getChildren(element).length > 0;
}
@Override
public Object[] getElements(Object input) {
return getChildren(null);
}
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object obj, Object obj1) {
}
}
private CheckboxTreeViewer permissionsList;
private IApplicationPermissions permissionsWorkingCopy;
private IApplicationPermissions permissions;
@Override
protected Control createContents(Composite parent) {
Composite main = new Composite(parent, SWT.NONE);
main.setLayout(new GridLayout(1, false));
Label permissionsLabel = new Label(main, SWT.NONE);
permissionsLabel.setText("&Select permissions for this project");
permissionsList = new CheckboxTreeViewer(main);
permissionsList.setLabelProvider(new LabelProvider() {
@Override
public String getText(Object element) {
String permission = (String) element;
Path permissionPath = new Path(permission);
return permissionPath.lastSegment();
}
});
permissions = getProject().getPermissions();
permissionsWorkingCopy = permissions.createWorkingCopy();
permissionsList.setContentProvider(new PermissionsContentProvider(permissionsWorkingCopy));
permissionsList.setCheckStateProvider(new ICheckStateProvider() {
@Override
public boolean isGrayed(Object element) {
String permission = (String) element;
TreeSet<String> available = new TreeSet<String>(permissionsWorkingCopy.getAvailablePermissions(permission));
if (available.isEmpty()) {
return false;
}
int availablePermissionCount = available.size();
available.removeAll(permissionsWorkingCopy.getRequestedPermissions(false));
int notRequiredPermissionCount = available.size();
boolean shouldBeGrayed = availablePermissionCount != notRequiredPermissionCount && notRequiredPermissionCount > 0;
return shouldBeGrayed;
}
@Override
public boolean isChecked(Object element) {
String permission = (String) element;
return isGrayed(element) || permissionsWorkingCopy.isPermissionRequested(permission);
}
});
setPermissionsWorkingCopy(permissionsWorkingCopy);
permissionsList.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
permissionsList.addCheckStateListener(new ICheckStateListener() {
@Override
public void checkStateChanged(CheckStateChangedEvent event) {
String permission = (String) event.getElement();
permissionsWorkingCopy.setRequestedPermission(permission, event.getChecked());
permissionsList.refresh(true);
}
});
return main;
}
private void setPermissionsWorkingCopy(IApplicationPermissions permissionsWorkingCopy) {
this.permissionsWorkingCopy = permissionsWorkingCopy;
permissionsList.setInput(permissionsWorkingCopy);
permissionsList.expandAll();
}
@Override
public void performDefaults() {
setPermissionsWorkingCopy(CoreMoSyncPlugin.getDefault().getDefaultPermissions(getProject()));
}
@Override
public boolean performOk() {
permissions.apply(permissionsWorkingCopy);
return true;
}
}