package com.kolakcc.loljclient.controller; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.concurrent.ExecutionException; import javax.swing.JTable; import com.gvaneyck.rtmp.encoding.TypedObject; import com.kolakcc.loljclient.StartupClass; import com.kolakcc.loljclient.model.Division; import com.kolakcc.loljclient.model.InventoryRune; import com.kolakcc.loljclient.model.LoggedInSummoner; import com.kolakcc.loljclient.model.RecentGame; import com.kolakcc.loljclient.model.RunePage; import com.kolakcc.loljclient.model.Summoner; import com.kolakcc.loljclient.model.swing.DivisionEntryTableModel; import com.kolakcc.loljclient.model.swing.RecentGamesListModel; import com.kolakcc.loljclient.model.swing.RunesInventoryTableModel; import com.kolakcc.loljclient.util.NamedSwingWorker; import com.kolakcc.loljclient.util.SavedRecentGamesProvider; import com.kolakcc.loljclient.util.TOUtils; import com.kolakcc.loljclient.view.ProfileView; public class ProfileController extends KolaController implements MouseListener, ActionListener { ProfileView view; RecentGamesListModel gamesListModel; RunesInventoryTableModel runeInventoryModel; public ProfileController() { view = new ProfileView(); this.setView(view); view.addRecentGameMouseListener(this); view.addSearchActionListener(this); runeInventoryModel = new RunesInventoryTableModel(); view.setRuneInventoryModel(runeInventoryModel); loadProfileForPlayer(LoggedInSummoner.summonerData); } public void loadProfileForPlayer(final Summoner summoner) { view.setName(summoner.getSummonerName()); view.setTitle(summoner.getSummonerName()+"'s profile"); new NamedSwingWorker<TypedObject,Void>("getSummonerRunes") { protected TypedObject doInBackground() throws Exception { int id = StartupClass.Client.invoke("summonerRuneService", "getSummonerRuneInventory", new Object[] { summoner.getAccountID() }); //TODO: find out what this argument actually is for; you can't get other people's inventory return StartupClass.Client.getResult(id); } protected void done() { try { TypedObject result = get(); for (Object rune : result.getTO("data").getTO("body").getArray("summonerRunes")) { InventoryRune iRune = new InventoryRune((TypedObject) rune); ProfileController.this.runeInventoryModel.add(iRune); } view.setColumnSizes(); } catch (InterruptedException | ExecutionException e) { ProfileController.this.HandleException(e); } } }.execute(); new NamedSwingWorker<TypedObject, Void>("Recent Games") { public TypedObject doInBackground() throws Exception { int id = StartupClass.Client.invoke("playerStatsService", "getRecentGames", new Object[] { summoner.getAccountID() }); return StartupClass.Client.getResult(id).getTO("data") .getTO("body"); } public void done() { try { ProfileController.this.gamesListModel = new RecentGamesListModel(TOUtils.ArrayToTOArray(this.get().getArray("gameStatistics"))); int fromServer = ProfileController.this.gamesListModel.getSize(); if (summoner.getAccountID() == LoggedInSummoner.summonerData.getAccountID()) { ProfileController.this.gamesListModel.addGameList(SavedRecentGamesProvider.getSavedGames(LoggedInSummoner.summonerData)); ProfileController.this.gamesListModel.saveGames(LoggedInSummoner.summonerData); } int fromCache = ProfileController.this.gamesListModel.getSize() - fromServer; ProfileController.this.view.setAmountObject(new Object[] { new Integer(fromServer), new Integer(fromCache), new Integer(fromServer + fromCache) }); ProfileController.this.view.setRecentGamesModel(ProfileController.this.gamesListModel); ProfileController.this.mouseClicked(null); } catch (Exception e) { ProfileController.this.HandleException(e); } } }.execute(); new NamedSwingWorker<TypedObject, Void>("getAllLeaguesForPlayer") { public TypedObject doInBackground() throws Exception { int id = StartupClass.Client.invoke("leaguesServiceProxy", "getAllLeaguesForPlayer", new Object[] { summoner.getSummonerID() }); return StartupClass.Client.getResult(id).getTO("data") .getTO("body"); } public void done() { try { for (TypedObject league : TOUtils.ArrayToTOArray(get().getArray("summonerLeagues"))) { Division d = new Division(league); ProfileController.this.view.addLeague(d, ProfileController.this, ProfileController.this); } } catch (InterruptedException | ExecutionException e) { ProfileController.this.HandleException(e); } } }.execute(); for (RunePage runePage : summoner.getRunePages()) { view.addRunePage(runePage); } } protected void searchSummoner(final String searchString) { //clear all the things! runeInventoryModel.clear(); view.resetRunePages(); view.clearLeagues(); view.setName(searchString); new NamedSwingWorker<TypedObject, Void>("getSummonerByName") { @Override protected TypedObject doInBackground() throws Exception { int id = StartupClass.Client.invoke("summonerService", "getSummonerByName", new Object[] { searchString }); return StartupClass.Client.getResult(id); } protected void done() { try { TypedObject result = get().getTO("data"); if (result.containsKey("body")) getSummonerData(result.getTO("body").getDouble("acctId")); else throw new Exception(String.format("A summoner by the name of %s was not found.", searchString)); } catch (Exception e) { ProfileController.this.HandleException(e); } } }.execute(); } protected void getSummonerData(final double accountID) { //maybe move to the summoner class new NamedSwingWorker<TypedObject, Void>("getAllSummonerDataByAccount") { @Override protected TypedObject doInBackground() throws Exception { int id = StartupClass.Client.invoke("summonerService", "getAllPublicSummonerDataByAccount", new Object[] { accountID }); return StartupClass.Client.getResult(id); } protected void done() { try { TypedObject result = get(); Summoner searched = new Summoner(result.getTO("data").getTO("body")); loadProfileForPlayer(searched); } catch (InterruptedException | ExecutionException e) { ProfileController.this.HandleException(e); } } }.execute(); } public void mouseClicked(MouseEvent e) { if ((e == null) || (e.getSource() instanceof javax.swing.JList)) { if (this.gamesListModel.getSize() > 0) { RecentGame game = this.gamesListModel .getGameAt(view.getSelectedGameIndex()); view.setSelectedGame(game); } } else { if (e.getClickCount() == 2) { JTable entryTable = (JTable) e.getSource(); DivisionEntryTableModel model = (DivisionEntryTableModel) entryTable.getModel(); searchSummoner(model.getEntryAt(entryTable.getSelectedRow()).getPlayerOrTeamName()); // DivisionEntry.getID gives a summonerid } } } public void actionPerformed(ActionEvent e) { if ((e.getActionCommand().equals("Search")) || (e.getSource() instanceof javax.swing.JTextField)) { searchSummoner(view.getSearchString()); } else { view.filterCurrentDivisionTable(); } } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } }