package com.mobilesorcery.sdk.ui.internal.preferences;
import java.util.HashSet;
import java.util.TreeSet;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ICheckStateProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPreferencePage;
import com.mobilesorcery.sdk.core.MoSyncBuilder;
import com.mobilesorcery.sdk.core.MoSyncProject;
import com.mobilesorcery.sdk.core.PrivilegedAccess;
import com.mobilesorcery.sdk.ui.UIUtils;
import com.mobilesorcery.sdk.ui.UpdateListener;
import com.mobilesorcery.sdk.ui.UpdateListener.IUpdatableControl;
public class PrivilegedAccessPreferencePage extends PreferencePage implements IWorkbenchPreferencePage, IUpdatableControl {
private HashSet<MoSyncProject> shouldHaveAccess = new HashSet<MoSyncProject>();
private TreeSet<MoSyncProject> availableProjects = new TreeSet<MoSyncProject>(MoSyncProject.NAME_COMPARATOR);
private CheckboxTableViewer accessList;
private Button selectAll;
public PrivilegedAccessPreferencePage() {
super("Scripts");
}
@Override
public void init(IWorkbench workbench) {
for (String projectId : MoSyncProject.listAllProjects()) {
MoSyncProject project = MoSyncProject.create(projectId);
if (project != null && MoSyncBuilder.requiresPrivilegedAccess(project)) {
availableProjects.add(project);
if (PrivilegedAccess.getInstance().hasAccess(project)) {
shouldHaveAccess.add(project);
}
}
}
}
@Override
protected Control createContents(Composite parent) {
Composite main = new Composite(parent, SWT.NONE);
main.setLayout(UIUtils.newPrefsLayout(1));
Label instructions = new Label(main, SWT.NONE);
instructions.setText("Check projects that should have privileged access to run scripts during building.\n(Only projects that requires such privileged access are shown.)");
final UpdateListener updateListener = new UpdateListener(this);
accessList = CheckboxTableViewer.newCheckList(main, SWT.BORDER);
accessList.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
accessList.setContentProvider(new ArrayContentProvider());
accessList.setCheckStateProvider(new ICheckStateProvider() {
@Override
public boolean isGrayed(Object element) {
return false;
}
@Override
public boolean isChecked(Object element) {
return shouldHaveAccess.contains(element);
}
});
accessList.addCheckStateListener(new ICheckStateListener() {
@Override
public void checkStateChanged(CheckStateChangedEvent event) {
MoSyncProject project = (MoSyncProject) event.getElement();
if (event.getChecked()) {
shouldHaveAccess.add(project);
} else {
shouldHaveAccess.remove(project);
}
updateListener.handleEvent(null);
}
});
accessList.setLabelProvider(new LabelProvider() {
public String getText(Object element) {
return ((MoSyncProject) element).getName();
}
});
accessList.setInput(availableProjects.toArray());
selectAll = new Button(main, SWT.CHECK);
selectAll.setText("Select/deselect &All");
selectAll.addListener(SWT.Selection, new Listener() {
@Override
public void handleEvent(Event event) {
updateListener.setActive(false);
boolean allChecked = selectAll.getSelection();
accessList.setAllChecked(allChecked);
if (allChecked) {
shouldHaveAccess.addAll(availableProjects);
} else {
shouldHaveAccess.clear();
}
updateListener.setActive(true);
}
});
updateUI();
return main;
}
public void updateUI() {
boolean allSelected = availableProjects.size() == shouldHaveAccess.size();
boolean noneSelected = shouldHaveAccess.size() == 0;
selectAll.setSelection(allSelected);
selectAll.setGrayed(!allSelected && !noneSelected);
}
@Override
public boolean performOk() {
for (MoSyncProject project : availableProjects) {
PrivilegedAccess.getInstance().grantAccess(project, shouldHaveAccess.contains(project));
}
return super.performOk();
}
}