package edu.washington.cs.oneswarm.ui.gwt.client.newui.creation; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import edu.washington.cs.oneswarm.ui.gwt.client.OneSwarmDialogBox; import edu.washington.cs.oneswarm.ui.gwt.client.OneSwarmRPCClient; import edu.washington.cs.oneswarm.ui.gwt.client.newui.permissions.GroupsListSorter; import edu.washington.cs.oneswarm.ui.gwt.client.newui.permissions.MembershipList; import edu.washington.cs.oneswarm.ui.gwt.client.newui.permissions.MembershipListListener; import edu.washington.cs.oneswarm.ui.gwt.rpc.PermissionsGroup; public class AprioriPermissionsDialog extends OneSwarmDialogBox { public static final int WIDTH = 600; public static final int HEIGHT = 415; VerticalPanel mainPanel = new VerticalPanel(); boolean all_friends_added = false; private Button cancelButton = new Button("Cancel"); private Button okButton = new Button("Save"); List<PermissionsGroup> initial_groups = null; public AprioriPermissionsDialog(String inName, String inHeader, List<PermissionsGroup> initialGroups, final ApriorPermissionsCallback inCallback) { super(false, true, false); final boolean inF2F = initialGroups.contains(new PermissionsGroup( PermissionsGroup.ALL_FRIENDS)); final boolean inPublic = initialGroups.contains(new PermissionsGroup( PermissionsGroup.PUBLIC_INTERNET)); this.setText("Visibility: " + inName); initial_groups = initialGroups; Label headerLabel = new Label(inHeader); headerLabel.addStyleName(CSS_DIALOG_HEADER); headerLabel.setWidth(WIDTH + "px"); mainPanel.add(headerLabel); mainPanel.add(new Label("Loading...")); OneSwarmRPCClient.getService().getAllGroups(OneSwarmRPCClient.getSessionID(), new AsyncCallback<ArrayList<PermissionsGroup>>() { public void onFailure(Throwable caught) { caught.printStackTrace(); hide(); } public void onSuccess(ArrayList<PermissionsGroup> result) { initUI(result); } }); okButton.addClickListener(new ClickListener() { public void onClick(Widget sender) { okButton.setEnabled(false); inCallback.permissionsDefined(sharing_with_groups.getMembers()); hide(); } }); cancelButton.addClickListener(new ClickListener() { public void onClick(Widget sender) { hide(); inCallback.cancelled(); } }); mainPanel.setHeight(HEIGHT + "px"); this.setWidget(mainPanel); } MembershipList<PermissionsGroup> sharing_with_groups = null; private void initUI(final ArrayList<PermissionsGroup> all_groups) { mainPanel.remove(1); VerticalPanel bottomPane = new VerticalPanel(); bottomPane.setWidth(WIDTH + "px"); ArrayList<PermissionsGroup> swarm_groups = new ArrayList<PermissionsGroup>(); for (PermissionsGroup g : initial_groups) { swarm_groups.add(g); } ArrayList<PermissionsGroup> all_sub_shared = new ArrayList<PermissionsGroup>(); for (PermissionsGroup g : all_groups) { if (!swarm_groups.contains(g)) { all_sub_shared.add(g); } } final MembershipList<PermissionsGroup> available_groups = new MembershipList<PermissionsGroup>( "Available groups:", true, all_groups, swarm_groups, true, new GroupsListSorter()); sharing_with_groups = new MembershipList<PermissionsGroup>("Sharing with:", false, all_groups, all_sub_shared, true, new GroupsListSorter()); final PermissionsGroup public_net = new PermissionsGroup(PermissionsGroup.PUBLIC_INTERNET); final PermissionsGroup all_friends = new PermissionsGroup(PermissionsGroup.ALL_FRIENDS); Set<PermissionsGroup> hs = new HashSet<PermissionsGroup>(); hs.add(public_net); all_friends_added = false; for (PermissionsGroup g : swarm_groups) { if (g.isAllFriends()) { all_friends_added = true; } } available_groups.addListener(new MembershipListListener<PermissionsGroup>() { public void objectEvent(MembershipList<PermissionsGroup> list, PermissionsGroup inObject) { System.out.println("groups remove event: " + inObject); sharing_with_groups.restoreExcluded(inObject); /** * Here we are removing some group from available groups and * adding to sharing with. If we're adding something that's NOT * the 'public' group and we're in 'share with all friends' * mode, we need to remove all the more specific groups. */ if (all_friends_added && inObject.isPublicInternet() == false) { System.out.println("adding specific group when all friends is present"); all_friends_added = false; sharing_with_groups.addExcluded(all_friends); available_groups.restoreExcluded(all_friends); } /** * Here we are adding the 'all friends' object, so we need to * remove all the previous, more specific groups. */ else if (inObject.isAllFriends()) { all_friends_added = true; // need to remove anything more specific than this. for (PermissionsGroup g : all_groups) { if (g.isPublicInternet() == false && g.isAllFriends() == false) { sharing_with_groups.addExcluded(g); available_groups.restoreExcluded(g); } } } } }); sharing_with_groups.addListener(new MembershipListListener<PermissionsGroup>() { public void objectEvent(MembershipList<PermissionsGroup> list, PermissionsGroup inObject) { System.out.println("permitted remove event: " + inObject); available_groups.restoreExcluded(inObject); } }); HorizontalPanel hp = new HorizontalPanel(); hp.setWidth("100%"); hp.add(sharing_with_groups); available_groups.setWidth("100%"); hp.add(available_groups); hp.setSpacing(3); hp.setCellWidth(available_groups, "49%"); hp.setCellWidth(sharing_with_groups, "49%"); hp.setCellHorizontalAlignment(sharing_with_groups, HorizontalPanel.ALIGN_LEFT); hp.setCellHorizontalAlignment(available_groups, HorizontalPanel.ALIGN_RIGHT); bottomPane.add(hp); mainPanel.add(bottomPane); HorizontalPanel buttons_hp = new HorizontalPanel(); buttons_hp.add(cancelButton); buttons_hp.add(okButton); buttons_hp.setSpacing(3); mainPanel.add(buttons_hp); mainPanel.setCellHorizontalAlignment(buttons_hp, HorizontalPanel.ALIGN_RIGHT); } }