/*
* Copyright 2008 Jeff Dwyer
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.apress.progwt.client.college.gui;
import java.util.ArrayList;
import java.util.List;
import com.allen_sauer.gwt.dnd.client.DragEndEvent;
import com.allen_sauer.gwt.dnd.client.DragHandler;
import com.allen_sauer.gwt.dnd.client.DragStartEvent;
import com.allen_sauer.gwt.dnd.client.PickupDragController;
import com.allen_sauer.gwt.dnd.client.VetoDragException;
import com.allen_sauer.gwt.dnd.client.drop.IndexedDropController;
import com.allen_sauer.gwt.log.client.Log;
import com.apress.progwt.client.college.ServiceCache;
import com.apress.progwt.client.college.gui.ext.YesNoDialog;
import com.apress.progwt.client.domain.Application;
import com.apress.progwt.client.domain.School;
import com.apress.progwt.client.domain.User;
import com.apress.progwt.client.domain.commands.RemoveSchoolFromRankCommand;
import com.apress.progwt.client.domain.commands.SaveSchoolRankCommand;
import com.apress.progwt.client.domain.commands.SiteCommand;
import com.apress.progwt.client.rpc.EZCallback;
import com.apress.progwt.client.rpc.StdAsyncCallback;
import com.apress.progwt.client.suggest.CompleteListener;
import com.apress.progwt.client.suggest.SchoolCompleter;
import com.apress.progwt.client.util.Utilities;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
public class MyRankings extends Composite implements DragHandler,
MyPageTab {
private User user;
private VerticalPanel rankPanelPanel;
private List<CollegeEntry> rankedEntries = new ArrayList<CollegeEntry>();
private PickupDragController entryDragController;
private ServiceCache serviceCache;
private SchoolCompleter completer;
private Button completeB;
public MyRankings(ServiceCache serviceCache) {
this.serviceCache = serviceCache;
VerticalPanel mainPanel = new VerticalPanel();
rankPanelPanel = new VerticalPanel();
entryDragController = new PickupDragController(RootPanel.get(),
false);
IndexedDropController rankDropController = new IndexedDropController(
rankPanelPanel);
entryDragController.registerDropController(rankDropController);
entryDragController.addDragHandler(this);
HorizontalPanel completerP = new HorizontalPanel();
completer = new SchoolCompleter(serviceCache,
new CompleteListener<School>() {
public void completed(School result) {
addSchool(result);
}
});
completeB = new Button("Add School");
completeB.addClickListener(new ClickListener() {
public void onClick(Widget sender) {
completer.complete();
}
});
completerP.add(completer);
completerP.add(completeB);
completeB.setEnabled(false);
mainPanel.add(rankPanelPanel);
mainPanel.add(completerP);
initWidget(mainPanel);
}
private int addEntry(CollegeEntry entry) {
entryDragController.makeDraggable(entry, entry.getDragHandle());
int widgetCount = rankPanelPanel.getWidgetCount();
rankPanelPanel.add(entry);
rankedEntries.add(entry);
return widgetCount;
}
private void saveEntry(final CollegeEntry entry, int rank) {
SaveSchoolRankCommand comm = new SaveSchoolRankCommand(entry
.getApplication().getSchool(), user, rank);
serviceCache.executeCommand(comm, new EZCallback<SiteCommand>() {
public void onSuccess(SiteCommand success) {
SaveSchoolRankCommand rtn = (SaveSchoolRankCommand) success;
entry.getApplication().setId(rtn.getSavedApplicationID());
}
});
Utilities.reOrder(rankedEntries, entry, rank);
refreshRankings();
}
private void refreshRankings() {
int i = 1;
for (CollegeEntry entry : rankedEntries) {
entry.setSortOrder(i++);
}
}
public void addSchool(School school) {
Application schoolAndApp = new Application(school);
CollegeEntry entry = new CollegeEntry(user, schoolAndApp,
serviceCache, this);
int index = addEntry(entry);
saveEntry(entry, index);
}
public void onDragEnd(DragEndEvent event) {
Log.debug("DragEndEvent on: " + event);
Log
.debug("DragEndEvent on: "
+ ((DragEndEvent) event).toString());
try {
CollegeEntry entry = (CollegeEntry) event.getSource();
int index = rankPanelPanel.getWidgetIndex(entry);
Log.debug("new index " + index);
saveEntry(entry, index);
} catch (ClassCastException e) {
Log.error("MyPage: " + e);
}
Log.debug("event.getSource " + event.getSource().getClass());
}
public void onDragStart(DragStartEvent event) {
}
public void onPreviewDragEnd(DragEndEvent event)
throws VetoDragException {
}
public void onPreviewDragStart(DragStartEvent event)
throws VetoDragException {
}
public void refresh() {
// TODO Auto-generated method stub
}
public String getHistoryName() {
return "MyRankings";
}
public void load(User user) {
this.user = user;
List<Application> schoolAndApps = user.getSchoolRankings();
Log.debug("MyRankings.FOUND " + schoolAndApps.size()
+ " Schools ");
for (Application schoolAndApp : schoolAndApps) {
addEntry(new CollegeEntry(user, schoolAndApp, serviceCache,
this));
}
completeB.setEnabled(true);
refreshRankings();
}
public void promptForDelete(final CollegeEntry collegeEntry) {
YesNoDialog ynDialog = new YesNoDialog("Remove school?",
"Really remove "
+ collegeEntry.getApplication().getSchool()
.getName() + "?", new Command() {
public void execute() {
delete(collegeEntry);
}
});
ynDialog.center();
}
private void delete(final CollegeEntry collegeEntry) {
RemoveSchoolFromRankCommand command = new RemoveSchoolFromRankCommand(
collegeEntry.getApplication().getSchool(), user);
serviceCache.executeCommand(command,
new StdAsyncCallback<SiteCommand>("Remove Application") {
@Override
public void onSuccess(SiteCommand result) {
super.onSuccess(result);
rankPanelPanel.remove(collegeEntry);
rankedEntries.remove(collegeEntry);
refreshRankings();
}
});
}
}