package de.tud.kom.socom.web.client.achievements; import java.util.ArrayList; import java.util.List; import com.google.gwt.cell.client.AbstractCell; import com.google.gwt.cell.client.TextCell; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; import com.google.gwt.user.cellview.client.CellList; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.StackPanel; import com.google.gwt.user.client.ui.Widget; import com.google.gwt.view.client.SelectionChangeEvent; import com.google.gwt.view.client.SingleSelectionModel; import de.tud.kom.socom.web.client.SoComWebEntryPoint; import de.tud.kom.socom.web.client.sharedmodels.Achievement; import de.tud.kom.socom.web.client.sharedmodels.AchievementGame; import de.tud.kom.socom.web.client.sharedmodels.AchievementSummary; /** * Panel to show a users achievements. * * @author ngerwien * */ public class AchievementsPanel extends HorizontalAchievementsPanel { private List<AchievementGame> games; private Widget lastAchievementWidget; private int lastMenuPanelIndex; private List<SingleSelectionModel<String>> selectionModels; public AchievementsPanel(SoComWebEntryPoint entryPoint) { super(entryPoint); fetchContent(); initListeners(); lastAchievementWidget = null; this.setBorderWidth(2); } @Override protected void fetchContent() { entryPoint.getAchievementService().getGames(entryPoint.getUserId(), new AsyncCallback<List<AchievementGame>>() { @Override public void onSuccess(List<AchievementGame> result) { games = result; showContent(); } @Override public void onFailure(Throwable caught) { displayError(caught.toString()); } }); } @Override protected void showContent() { if (games.isEmpty()) { displayMessage("Keine Spiele mit achievements vorhanden."); return; } final StackPanel menuPanel = new StackPanel(); selectionModels = new ArrayList<SingleSelectionModel<String>>(); lastMenuPanelIndex = menuPanel.getSelectedIndex(); int gameIndex = 0; for(AchievementGame game : games) { final CellList<String> categoryList = new CellList<String>(new TextCell()); selectionModels.add(new SingleSelectionModel<String>()); menuPanel.addHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { if(lastMenuPanelIndex != menuPanel.getSelectedIndex()) { lastMenuPanelIndex = menuPanel.getSelectedIndex(); showAchievements(lastMenuPanelIndex, selectionModels.get(lastMenuPanelIndex).getSelectedObject()); } } }, ClickEvent.getType()); categoryList.setSelectionModel(selectionModels.get(gameIndex)); selectionModels.get(gameIndex).addSelectionChangeHandler(new SelectionChangeEvent.Handler() { @Override public void onSelectionChange(SelectionChangeEvent event) { int selectedIndex = menuPanel.getSelectedIndex(); String categoryName = selectionModels.get(selectedIndex).getSelectedObject(); if(categoryName != null) { showAchievements(selectedIndex, categoryName); } } }); categoryList.setRowCount(game.getAchievementCategories().size(), true); categoryList.setRowData(0, game.getAchievementCategories()); menuPanel.add(categoryList, game.getGameName()); gameIndex++; } add(menuPanel); } @Override protected void initListeners() { } private void showAchievements(int gameIndex, String categoryName) { if(lastAchievementWidget != null) { remove(lastAchievementWidget); } AchievementGame game = games.get(gameIndex); if(categoryName == AchievementGame.FirstCategory) { List<AchievementSummary> summary = new ArrayList<AchievementSummary>(); summary.add(new AchievementSummary(game.getAchievements())); CellList<AchievementSummary> summaryList = new CellList<AchievementSummary>(new AchievementSummaryCell()); summaryList.setRowCount(summary.size()); summaryList.setRowData(0, summary); lastAchievementWidget = summaryList; add(summaryList); } else { List<Achievement> achievements = game.getAchievements(categoryName); CellList<Achievement> achievementList = new CellList<Achievement>(new AchievementCell()); achievementList.setRowCount(achievements.size()); achievementList.setRowData(0, achievements); lastAchievementWidget = achievementList; add(achievementList); } } private class AchievementCell extends AbstractCell<Achievement> { @Override public void render(com.google.gwt.cell.client.Cell.Context context, Achievement value, SafeHtmlBuilder sb) { if(value != null) { sb.append(value.toSafeHtml()); } } } private class AchievementSummaryCell extends AbstractCell<AchievementSummary> { @Override public void render(com.google.gwt.cell.client.Cell.Context context, AchievementSummary value, SafeHtmlBuilder sb) { if(value != null) { sb.append(value.toSafeHtml()); } } } }