package edu.washington.cs.oneswarm.ui.gwt.client.newui.friends; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.RunAsyncCallback; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.HTML; 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.OneSwarmGWT; import edu.washington.cs.oneswarm.ui.gwt.client.OneSwarmRPCClient; import edu.washington.cs.oneswarm.ui.gwt.client.Updateable; import edu.washington.cs.oneswarm.ui.gwt.client.newui.OneSwarmCss; import edu.washington.cs.oneswarm.ui.gwt.client.newui.Strings; import edu.washington.cs.oneswarm.ui.gwt.client.newui.SwarmsBrowser; import edu.washington.cs.oneswarm.ui.gwt.rpc.FriendList; import edu.washington.cs.oneswarm.ui.gwt.rpc.StringTools; public class FriendsDetailsListPanel extends VerticalPanel implements Updateable { // public static final String SHOW_BLOCK_FRIENDS_COOKIE = // "ShowBlockedFriends"; VerticalPanel filesFlowPanel = this; private FriendsDetailsTable friendstable = null; private long mFriendsChangesCheck = 0; private FriendInfo datecalculationhelper = new FriendInfo(null); Date lastDate = null; private Label lastUpdatedTable = new Label(); private List<Button> buttonsNeedingSelectedItem = new ArrayList<Button>(); private Label loadingLabel; private CheckBox showBlockedCheckBox = new CheckBox("Show blocked friends"); private SwarmsBrowser mBrowser; public FriendsDetailsListPanel(SwarmsBrowser inBrowser) { mBrowser = inBrowser; GWT.runAsync(new RunAsyncCallback() { public void onFailure(Throwable reason) { } public void onSuccess() { // preloading if (mBrowser == null) { return; } onInitialized(); } }); } protected FriendsDetailsListPanel onInitialized() { setWidth("100%"); // DOM.setStyleAttribute(this.getElement(), "height", "200px"); loadingLabel = new Label("Loading..."); this.add(loadingLabel); // this.setCellHorizontalAlignment(loadingLabel, ALIGN_CENTER); /** * All the RPC logic should probably be pulled out to this class since * the overall view depends on whether or not the RPC return any friends * at all. */ friendstable = new FriendsDetailsTable(mBrowser, new FriendsDetailsTable.RefreshCallback() { boolean mFirstRun = true; public void refreshed(FriendList result) { if (mFirstRun) { FriendsDetailsListPanel.this.remove(loadingLabel); if (result.getFriendList().length > 0) { initUI(); } else { HTML msg = new HTML("<div id=\"" + OneSwarmCss.CSS_NOTHING_SHOWING + "\">" + Strings.get(Strings.NO_FRIENDS_MSG) + "</div>"); add(msg); } mFirstRun = false; } } }); return this; } public void initUI() { lastDate = new Date(); lastUpdatedTable.setText("Last updated: < 1 minute"); final Timer incrementlastUpdated = (new Timer() { public void run() { if (lastDate.getTime() + 60 * 1000 > System.currentTimeMillis()) { lastUpdatedTable.setText("Last updated: < 1 minute"); } else { lastUpdatedTable.setText("Last updated: " + StringTools.formatDateAppleLike(lastDate)); } } }); incrementlastUpdated.scheduleRepeating(5000); final Button refresh = new Button("Refresh"); final Button selectall = new Button("Select all"); final Button deselectall = new Button("Deselect all"); final Button selectNeverConnected = new Button("Select never connected"); final Button forceConnect = new Button("Force Connect"); final Button remove = new Button("Delete"); final Button block = new Button("Swap blocked"); final Button addfriend = new Button("Add Friend"); final Button refresh2 = new Button("Refresh"); final Button selectall2 = new Button("Select all"); final Button selectNeverConnected2 = new Button("Select never connected"); final Button deselectall2 = new Button("Deselect all"); final Button forceConnect2 = new Button("Force Connect"); final Button remove2 = new Button("Delete"); final Button block2 = new Button("Swap blocked"); final Button addfriend2 = new Button("Add Friend"); // final Button undelete = new Button("Undelete"); // final Button undelete2 = new Button("Undelete"); final Button swaplimited = new Button("Change Limited"); final Button swaplimited2 = new Button("Change Limited"); final Button swapchat = new Button("Chat Allowed"); final Button swapchat2 = new Button("Chat Allowed"); /** * Some code to make sure that buttons in this panel reflect the * selection state in the actual table */ buttonsNeedingSelectedItem.add(forceConnect); buttonsNeedingSelectedItem.add(forceConnect2); buttonsNeedingSelectedItem.add(remove); buttonsNeedingSelectedItem.add(remove2); buttonsNeedingSelectedItem.add(block); buttonsNeedingSelectedItem.add(block2); buttonsNeedingSelectedItem.add(swaplimited); buttonsNeedingSelectedItem.add(swaplimited2); buttonsNeedingSelectedItem.add(swapchat); buttonsNeedingSelectedItem.add(swapchat2); // initially, nothing is selected for (Button b : buttonsNeedingSelectedItem) { b.setEnabled(false); } remove2.addStyleName(OneSwarmCss.SMALL_BUTTON); selectall2.addStyleName(OneSwarmCss.SMALL_BUTTON); deselectall2.addStyleName(OneSwarmCss.SMALL_BUTTON); selectNeverConnected.addStyleName(OneSwarmCss.SMALL_BUTTON); selectNeverConnected2.addStyleName(OneSwarmCss.SMALL_BUTTON); forceConnect2.addStyleName(OneSwarmCss.SMALL_BUTTON); addfriend2.addStyleName(OneSwarmCss.SMALL_BUTTON); refresh2.addStyleName(OneSwarmCss.SMALL_BUTTON); remove.addStyleName(OneSwarmCss.SMALL_BUTTON); block.addStyleName(OneSwarmCss.SMALL_BUTTON); block2.addStyleName(OneSwarmCss.SMALL_BUTTON); selectall.addStyleName(OneSwarmCss.SMALL_BUTTON); deselectall.addStyleName(OneSwarmCss.SMALL_BUTTON); forceConnect.addStyleName(OneSwarmCss.SMALL_BUTTON); addfriend.addStyleName(OneSwarmCss.SMALL_BUTTON); refresh.addStyleName(OneSwarmCss.SMALL_BUTTON); // undelete.addStyleName(SaveLocationPanel.CSS_SMALL_BUTTON); // undelete2.addStyleName(SaveLocationPanel.CSS_SMALL_BUTTON); swaplimited.addStyleName(OneSwarmCss.SMALL_BUTTON); swaplimited2.addStyleName(OneSwarmCss.SMALL_BUTTON); swapchat.addStyleName(OneSwarmCss.SMALL_BUTTON); swapchat2.addStyleName(OneSwarmCss.SMALL_BUTTON); HorizontalPanel topcontrols = new HorizontalPanel(); HorizontalPanel top = new HorizontalPanel(); topcontrols.add(selectall2); topcontrols.add(deselectall2); topcontrols.add(selectNeverConnected2); topcontrols.add(forceConnect2); topcontrols.add(swaplimited2); topcontrols.add(swapchat2); topcontrols.add(remove2); topcontrols.add(block2); // topcontrols.add(undelete2); topcontrols.add(addfriend2); top.add(lastUpdatedTable); top.setCellVerticalAlignment(lastUpdatedTable, VerticalPanel.ALIGN_MIDDLE); top.setSpacing(3); top.add(refresh); top.add(showBlockedCheckBox); filesFlowPanel.add(top); filesFlowPanel.add(new Label(" ")); filesFlowPanel.add(topcontrols); showBlockedCheckBox.addClickHandler(new ClickHandler() { long lastClick = 0; // work-around for GWT bug wherein clicking on // label generates two back-to-back click events public void onClick(ClickEvent event) { if ((System.currentTimeMillis() - lastClick) < 100) { return; } lastClick = System.currentTimeMillis(); friendstable.setShowBlocked(showBlockedCheckBox.getValue()); System.out.println("showing blocked: " + showBlockedCheckBox.getValue()); friendstable.refresh(); } }); showBlockedCheckBox.setValue(false); friendstable.addSelectionCallback(new FriendsDetailsTable.SelectionCallback() { public void deselectedAll() { for (Button b : buttonsNeedingSelectedItem) { b.setEnabled(false); } } public void somethingSelected() { for (Button b : buttonsNeedingSelectedItem) { b.setEnabled(true); } } }); filesFlowPanel.add(friendstable); HorizontalPanel bottomcontrols = new HorizontalPanel(); bottomcontrols.add(selectall); bottomcontrols.add(deselectall); bottomcontrols.add(selectNeverConnected); bottomcontrols.add(forceConnect); bottomcontrols.add(swaplimited); bottomcontrols.add(swapchat); bottomcontrols.add(remove); bottomcontrols.add(block); // topcontrols.add(undelete); bottomcontrols.add(addfriend); filesFlowPanel.add(bottomcontrols); // filesFlowPanel.add(selectall); // filesFlowPanel.add(deselectall); // filesFlowPanel.add(forceConnect); // filesFlowPanel.add(swaplimited); // filesFlowPanel.add(swapchat); // filesFlowPanel.add(remove); // filesFlowPanel.add(undelete); // filesFlowPanel.add(addfriend); ClickListener clk = new ClickListener() { public void onClick(Widget w) { if (w.equals(selectall) || w.equals(selectall2)) { friendstable.selectall(); } else if (w.equals(deselectall) || w.equals(deselectall2)) { friendstable.deselectall(); } else if (w.equals(forceConnect) || w.equals(forceConnect2)) { friendstable.forceConnect(); } else if (w.equals(remove) || w.equals(remove2)) { lastDate = new Date(); lastUpdatedTable.setText("Last updated: " + StringTools.formatDateAppleLike(lastDate)); friendstable.removeClicked(); } else if (w.equals(block) || w.equals(block2)) { lastUpdatedTable.setText("Last updated: " + StringTools.formatDateAppleLike(lastDate)); friendstable.blockClicked(); } else if (w.equals(addfriend) || w.equals(addfriend2)) { friendstable.addFriends(); } else if (w.equals(refresh)) { lastDate = new Date(); lastUpdatedTable.setText("Last updated: " + StringTools.formatDateAppleLike(lastDate)); friendstable.refresh(); // } else if (w.equals(undelete) || w.equals(undelete2)){ // lastDate = new Date(); // lastUpdatedTable.setText("Last updated: " + // datecalculationhelper.appleLikeDate(lastDate)); // friendstable.undelete(); } else if (w.equals(swapchat) || w.equals(swapchat2)) { lastDate = new Date(); lastUpdatedTable.setText("Last updated: " + StringTools.formatDateAppleLike(lastDate)); friendstable.swapchat(); } else if (w.equals(swaplimited) || w.equals(swaplimited2)) { lastDate = new Date(); lastUpdatedTable.setText("Last updated: " + StringTools.formatDateAppleLike(lastDate)); friendstable.swaplimited(); } else if (w.equals(selectNeverConnected) || w.equals(selectNeverConnected2)) { friendstable.selectNeverConnected(); } else { } } }; selectall.addClickListener(clk); deselectall.addClickListener(clk); selectNeverConnected.addClickListener(clk); selectNeverConnected2.addClickListener(clk); forceConnect.addClickListener(clk); remove.addClickListener(clk); addfriend.addClickListener(clk); refresh.addClickListener(clk); selectall2.addClickListener(clk); deselectall2.addClickListener(clk); forceConnect2.addClickListener(clk); remove2.addClickListener(clk); addfriend2.addClickListener(clk); // undelete.addClickListener(clk); // undelete2.addClickListener(clk); swapchat.addClickListener(clk); swapchat2.addClickListener(clk); swaplimited.addClickListener(clk); swaplimited2.addClickListener(clk); block.addClickListener(clk); block2.addClickListener(clk); } protected void onAttach() { super.onAttach(); OneSwarmGWT.addToUpdateTask(this); } protected void onDetach() { super.onDetach(); OneSwarmGWT.removeFromUpdateTask(this); } public void update(int count) { /* * Checks if any changes have been made outside the friendstable (if a * change is made inside a friends-panel or a friend added/deleted) */ if ((mFriendsChangesCheck < System.currentTimeMillis())) { OneSwarmRPCClient.getService().recentFriendChanges(OneSwarmRPCClient.getSessionID(), new AsyncCallback<Boolean>() { public void onFailure(Throwable caught) { caught.printStackTrace(); } public void onSuccess(Boolean result) { if (result) { friendstable.refresh(); lastDate = new Date(); lastUpdatedTable.setText("Last updated: " + StringTools.formatDateAppleLike(lastDate)); } } }); mFriendsChangesCheck = System.currentTimeMillis() + 1000; } } }