Skip to content

Commit

Permalink
Improve layout of Team Analyzer slightly (ho-dev#2037)
Browse files Browse the repository at this point in the history
* Team Analyzer improvements.

- Make sure to not block the UI thread when clicking the button, and disable the
button as now the downloads happen asynchronously.
- Add a module parameter to show/hide Special Events in the Team Analyzer tab
- Add a panel that displays high level information about the team being analyzed (WIP)

* Continue work on info panel.

* Cleanup of the code, and try to improve UI.

* More code cleanup.

* Cleanup, and add comments.

Also remove streak for now, as it requires to download further data from the server.

* Add Release notes.

* Address @wsbrenk's code review comments.
  • Loading branch information
tychobrailleur committed Apr 2, 2024
1 parent 658216d commit 5120f3e
Show file tree
Hide file tree
Showing 30 changed files with 565 additions and 391 deletions.
9 changes: 4 additions & 5 deletions src/main/java/core/db/DBManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -606,14 +606,13 @@ public void deleteSpielplanTabelle(int saison, int ligaId) {
}

/**
* lädt alle Spielpläne aus der DB
* Loads all the games schedules from the database.
*
* @param withFixtures inklusive der Paarungen ja/nein
* @return the spielplan [ ]
* @param withFixtures includes fixtures if set to <code>true</code>
* @return List<Spielplan> – List of all the {@link Spielplan}s.
*/
public List<Spielplan> getAllSpielplaene(boolean withFixtures) {
var ret = ((SpielplanTable) getTable(SpielplanTable.TABLENAME))
.getAllSpielplaene();
var ret = ((SpielplanTable) getTable(SpielplanTable.TABLENAME)).getAllSpielplaene();
if (withFixtures) {
for (Spielplan gameSchedule : ret) {
gameSchedule.addFixtures(loadFixtures(gameSchedule));
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/core/file/xml/ConvertXml2Hrf.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ private ConvertXml2Hrf() {
int teamId = HOVerwaltung.instance().getModel().getBasics().getTeamId();
Integer youthTeamId = HOVerwaltung.instance().getModel().getBasics().getYouthTeamId();

String teamDetails = mc.getTeamdetails(-1);
String teamDetails = mc.getTeamDetails(-1);

if (teamDetails == null) {
return null;
Expand Down
30 changes: 29 additions & 1 deletion src/main/java/core/file/xml/XMLManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -112,12 +112,40 @@ public static boolean xmlBoolValue(Element ele, String xmlKey, boolean def) {
}
}

/**
* Get the content of the tag <code>xmlKey</code> under the XML <code>element</code>,
* and inserts it into the <code>hash</code>, using <code>hashKey</code> as the entry key.
*
* <p>If the element is not found in the XML element, an empty string is returned.</p>
*
* @param hash {@link Map} into which the value of the XML element is inserted.
* @param element XML element from which the value is being read.
* @param xmlKey Name of the XML tag for which we get the value.
* @param hashKey Name of the key in <code>hash</code> when inserting the value.
*
* @return String – Value of the element <code>xmlKey</code> in <code>element</code> if present;
* empty string otherwise.
*/
public static String xmlValue2Hash(Map<String, String> hash, Element element, String xmlKey, String hashKey) {
var value = xmlValue(element, xmlKey);
var value = xmlValue(element, xmlKey);
hash.put(hashKey, value);
return value;
}

/**
* Get the content of the tag <code>key</code> under the XML <code>element</code>,
* and inserts it into the <code>hash</code>, using <code>key</code> as the entry key.
*
* <p>If the element is not found in the XML element, an empty string is returned.</p>
*
* @param hash {@link Map} into which the value of the XML element is inserted.
* @param element XML element from which the value is being read.
* @param key Name of the XML tag for which we get the value, and name of the key in <code>hash</code>
* when inserting the value.
*
* @return String – Value of the element <code>key</code> in <code>element</code> if present;
* empty string otherwise.
*/
public static String xmlValue2Hash(Map<String, String> hash, Element element, String key) {
return xmlValue2Hash(hash, element, key, key);
}
Expand Down
54 changes: 32 additions & 22 deletions src/main/java/core/file/xml/XMLTeamDetailsParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
Expand Down Expand Up @@ -60,8 +62,6 @@ private static Map<String, String> parseDetails(@Nullable Document doc, int team
Element ele, root;
Map<String, String> hash = new SafeInsertMap();

// HOLogger.instance().debug(XMLTeamDetailsParser.class, "parsing teamDetails for teamID: " + teamId);

if (doc == null) {
return hash;
}
Expand Down Expand Up @@ -89,26 +89,8 @@ private static Map<String, String> parseDetails(@Nullable Document doc, int team
}
hash.put("HasSupporter", supportStatus);

// We need to find the correct team

Element team = null;
ele = (Element) doc.getDocumentElement().getElementsByTagName("Teams").item(0);
if ( ele != null) {
root = ele;
NodeList list = root.getElementsByTagName("Team");
for (int i = 0; (list != null) && (i < list.getLength()); i++) {
team = (Element) list.item(i);

ele = (Element) team.getElementsByTagName("TeamID").item(0);
if (Integer.parseInt(XMLManager.getFirstChildNodeValue(ele)) == teamId) {
break;
}
}
}
else {
team = (Element)doc.getDocumentElement().getElementsByTagName("Team").item(0);
}

// We need to find the correct team in doc
final Element team = selectTeamWithId(doc, teamId);
if (team == null) {
return hash;
}
Expand Down Expand Up @@ -140,6 +122,8 @@ private static Map<String, String> parseDetails(@Nullable Document doc, int team
HOLogger.instance().log(XMLTeamDetailsParser.class, exp);
}

xmlValue2Hash(hash, team, "CountryName");

var fanclub = (Element) team.getElementsByTagName("Fanclub").item(0);
xmlValue2Hash(hash, fanclub, "FanclubSize");

Expand All @@ -152,6 +136,9 @@ private static Map<String, String> parseDetails(@Nullable Document doc, int team
root = (Element) team.getElementsByTagName("Region").item(0);
xmlValue2Hash(hash, root, "RegionID");

xmlValue2Hash(hash, team, "IsBot");
xmlValue2Hash(hash, team, "BotSince");

// Power Rating
Element PowerRating = (Element)doc.getDocumentElement().getElementsByTagName("PowerRating").item(0);
xmlValue2Hash(hash, PowerRating, "GlobalRanking");
Expand All @@ -170,6 +157,29 @@ private static Map<String, String> parseDetails(@Nullable Document doc, int team
return hash;
}

private static Element selectTeamWithId(Document doc, int teamId) {
Element team = null;
Element ele;
Element root;
ele = (Element) doc.getDocumentElement().getElementsByTagName("Teams").item(0);
if ( ele != null) {
root = ele;
NodeList list = root.getElementsByTagName("Team");
for (int i = 0; (list != null) && (i < list.getLength()); i++) {
team = (Element) list.item(i);

ele = (Element) team.getElementsByTagName("TeamID").item(0);
if (Integer.parseInt(XMLManager.getFirstChildNodeValue(ele)) == teamId) {
break;
}
}
}
else {
team = (Element) doc.getDocumentElement().getElementsByTagName("Team").item(0);
}
return team;
}

public static List<TeamInfo> getTeamInfoFromString(String input) {
List<TeamInfo> ret = new ArrayList<>();
if ( input.isEmpty() ) return ret;
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/core/gui/event/ChangeEventHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
public class ChangeEventHandler {

/** CopyOnWriteArrayList ensures thread-safety */
private List<ChangeListener> changeListeners = new CopyOnWriteArrayList<>();
private final List<ChangeListener> changeListeners = new CopyOnWriteArrayList<>();

public void addChangeListener(ChangeListener changeListener) {
changeListeners.add(changeListener);
Expand All @@ -22,7 +22,7 @@ public void removeChangeListener(ChangeListener changeListener) {
}
}

protected void fireChangeEvent(ChangeEvent event) {
public void fireChangeEvent(ChangeEvent event) {
for (ChangeListener listener : changeListeners) {
listener.stateChanged(event);
}
Expand Down
34 changes: 17 additions & 17 deletions src/main/java/core/gui/model/UserColumnController.java
Original file line number Diff line number Diff line change
Expand Up @@ -95,22 +95,22 @@ public static UserColumnController instance(){
*
*/
public void load() {
final DBManager dbZugriff = DBManager.instance();
final DBManager dbManager = DBManager.instance();

dbZugriff.loadHOColumModel(getMatchesModel());
dbZugriff.loadHOColumModel(getPlayerOverviewModel());
dbZugriff.loadHOColumModel(getLineupModel());
dbZugriff.loadHOColumModel(getAnalysis1Model());
dbZugriff.loadHOColumModel(getAnalysis2Model());
dbZugriff.loadHOColumModel(getMatchesOverview1ColumnModel());
dbManager.loadHOColumModel(getMatchesModel());
dbManager.loadHOColumModel(getPlayerOverviewModel());
dbManager.loadHOColumModel(getLineupModel());
dbManager.loadHOColumModel(getAnalysis1Model());
dbManager.loadHOColumModel(getAnalysis2Model());
dbManager.loadHOColumModel(getMatchesOverview1ColumnModel());

dbZugriff.loadHOColumModel(getYouthTrainingViewColumnModel());
dbZugriff.loadHOColumModel(getYouthPlayerOverviewColumnModel());
dbZugriff.loadHOColumModel(getYouthPlayerDetailsColumnModel());
dbZugriff.loadHOColumModel(getTeamAnalyzerRecapModell());
dbZugriff.loadHOColumModel(getTransferTableModel());
dbZugriff.loadHOColumModel(getPlayerTransferTableModel());
dbZugriff.loadHOColumModel(getSpecialEventsTableModel());
dbManager.loadHOColumModel(getYouthTrainingViewColumnModel());
dbManager.loadHOColumModel(getYouthPlayerOverviewColumnModel());
dbManager.loadHOColumModel(getYouthPlayerDetailsColumnModel());
dbManager.loadHOColumModel(getTeamAnalyzerRecapModel());
dbManager.loadHOColumModel(getTransferTableModel());
dbManager.loadHOColumModel(getPlayerTransferTableModel());
dbManager.loadHOColumModel(getSpecialEventsTableModel());
}

public SpecialEventsTableModel getSpecialEventsTableModel() {
Expand Down Expand Up @@ -191,7 +191,7 @@ public Vector<HOTableModel> getAllModels() {
v.add(getLineupModel());
v.add(getAnalysis1Model());
v.add(getAnalysis2Model());
v.add(getTeamAnalyzerRecapModell());
v.add(getTeamAnalyzerRecapModel());
// MatchesOverView1Model should not add in this vector, because columns should not be edit
return v;
}
Expand All @@ -216,8 +216,8 @@ public YouthPlayerDetailsTableModel getYouthPlayerDetailsColumnModel() {
return youthPlayerDetailsTableModel;
}

public RecapPanelTableModel getTeamAnalyzerRecapModell() {
if (teamAnalyzerRecapModel==null){
public RecapPanelTableModel getTeamAnalyzerRecapModel() {
if (teamAnalyzerRecapModel == null) {
teamAnalyzerRecapModel = new RecapPanelTableModel(ColumnModelId.TEAMANALYZERRECAP);
}
return teamAnalyzerRecapModel;
Expand Down
32 changes: 15 additions & 17 deletions src/main/java/core/model/series/SerieTableEntry.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package core.model.series;

public class SerieTableEntry implements Comparable<SerieTableEntry>{
import java.util.Arrays;

public class SerieTableEntry implements Comparable<SerieTableEntry> {
//~ Instance fields ----------------------------------------------------------------------------
public static final byte H_SIEG = 1;
public static final byte A_SIEG = 2;
Expand Down Expand Up @@ -43,9 +45,7 @@ public class SerieTableEntry implements Comparable<SerieTableEntry>{
* Creates a new instance of LigaTabellenEintrag
*/
public SerieTableEntry() {
for (int i = 0; i < m_aSerie.length; i++) {
m_aSerie[i] = UNKOWN;
}
Arrays.fill(m_aSerie, UNKOWN);
}

//~ Methods ------------------------------------------------------------------------------------
Expand Down Expand Up @@ -463,10 +463,10 @@ public final byte[] getSerie() {
}

public final String getSerieAsString() {
final StringBuffer buffer = new StringBuffer();
final StringBuilder buffer = new StringBuilder();

for (int i = 0; i < m_aSerie.length; i++) {
switch (m_aSerie[i]) {
for (byte b : m_aSerie) {
switch (b) {
case H_SIEG:
buffer.append(core.model.HOVerwaltung.instance().getLanguageString("SerieHeimSieg"));
break;
Expand Down Expand Up @@ -589,14 +589,14 @@ public final void addSerienEintrag(int index, byte serienInfo) {
* vergleicht die Einträge
*/
public final int compareTo(SerieTableEntry obj) {
if (obj instanceof SerieTableEntry) {
if (obj != null) {
final SerieTableEntry lte = (SerieTableEntry) obj;

if (m_iPunkte > lte.getPoints()) {
return -1;
} else if (m_iPunkte < lte.getPoints()) {
return 1;
} else if (m_iPunkte == lte.getPoints()) {
} else {
if (getGoalsDiff() > lte.getGoalsDiff()) {
return -1;
} else if (getGoalsDiff() < lte.getGoalsDiff()) {
Expand Down Expand Up @@ -646,14 +646,12 @@ public final boolean equals(Object obj) {
if (obj instanceof SerieTableEntry) {
lte = (SerieTableEntry) obj;

if ((lte.getAnzSpiele() == m_iAnzSpiele)
&& (lte.getPosition() == m_iPosition)
&& (lte.getPoints() == m_iPunkte)
&& (lte.getTeamName().equals(m_sTeamName))
&& (lte.getGoalsFor() == m_iToreFuer)
&& (lte.getGoalsAgainst() == m_iToreGegen)) {
return true;
}
return (lte.getAnzSpiele() == m_iAnzSpiele)
&& (lte.getPosition() == m_iPosition)
&& (lte.getPoints() == m_iPunkte)
&& (lte.getTeamName().equals(m_sTeamName))
&& (lte.getGoalsFor() == m_iToreFuer)
&& (lte.getGoalsAgainst() == m_iToreGegen);
}

return false;
Expand Down
33 changes: 13 additions & 20 deletions src/main/java/core/net/MyConnector.java
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ public String getHattrickXMLFile(String file){
* lädt die Tabelle
*/
public String getLeagueDetails(String leagueUnitId) {
String url = htUrl + "?file=leaguedetails&version=1.5&leagueLevelUnitID=" + leagueUnitId;
String url = htUrl + "?file=leaguedetails&version=1.6&leagueLevelUnitID=" + leagueUnitId;
return getCHPPWebFile(url);
}

Expand Down Expand Up @@ -446,13 +446,18 @@ public String getStaff(int teamId) {
/**
* Download team details
*/
public String getTeamdetails(int teamId) throws IOException {
String url = htUrl + "?file=teamdetails&version=3.5";
if (teamId > 0) {
url += ("&teamID=" + teamId);
}
public String getTeamDetails(int teamId) {
try {
String url = htUrl + "?file=teamdetails&version=3.6";
if (teamId > 0) {
url += ("&teamID=" + teamId);
}

return getCHPPWebFile(url);
return getCHPPWebFile(url);
} catch (Exception e) {
HOLogger.instance().log(getClass(), e);
}
return "";
}

/**
Expand Down Expand Up @@ -571,25 +576,13 @@ public void enableProxy(ProxySettings proxySettings) {
* Get the region id for a certain team.
*/
public String fetchRegionID(int teamId) {
String xml = fetchTeamDetails(teamId);
String xml = getTeamDetails(teamId);
if (!xml.isEmpty()){
return XMLTeamDetailsParser.fetchRegionID(xml);
}
return "-1";
}


public String fetchTeamDetails(int teamId)
{
try {
String xmlFile = htUrl + "?file=teamdetails&version=3.5&teamID=" + teamId;
return getCHPPWebFile(xmlFile);
} catch (Exception e) {
HOLogger.instance().log(getClass(), e);
}
return "";
}

public InputStream getFileFromWeb(String url, boolean displaysettingsScreen) {
if (displaysettingsScreen) {
// Show Screen
Expand Down
Loading

0 comments on commit 5120f3e

Please sign in to comment.