From: Stefan F. <ste...@us...> - 2012-01-05 10:40:04
|
rails/algorithms/RevenueAdapter.java | 3 rails/ui/swing/ORPanel.java | 137 ++++++++++++++++------------------- 2 files changed, 68 insertions(+), 72 deletions(-) New commits: commit ccf5b2aa3e251ab06f29ec95cf90307ae77427f5 Author: Frederick Weld <fre...@gm...> Date: Wed Jan 4 17:07:03 2012 +0100 Routes of current company calculated asynchronously Polished the handling of route calculations. This was needed as a follow-up to introducing persistent route display of the current company. Achieved the following: - All route calculations are performed asynchronously (as it was already the case before for set-revenue route calculations). - ORPanel now only uses one revenue adapter for both use cases (current route display and set-revenue calculation). Signed-off-by: Stefan Frey <ste...@we...> diff --git a/rails/algorithms/RevenueAdapter.java b/rails/algorithms/RevenueAdapter.java index 9df031a..a08d47b 100644 --- a/rails/algorithms/RevenueAdapter.java +++ b/rails/algorithms/RevenueAdapter.java @@ -651,7 +651,8 @@ public final class RevenueAdapter implements Runnable { EventQueue.invokeLater( new Runnable() { public void run() { - revenueListener.revenueUpdate(revenue, finalResult); + //listener could have deregistered himself in the meantime + if (revenueListener != null) revenueListener.revenueUpdate(revenue, finalResult); } }); } diff --git a/rails/ui/swing/ORPanel.java b/rails/ui/swing/ORPanel.java index 6c1be18..c29ca74 100644 --- a/rails/ui/swing/ORPanel.java +++ b/rails/ui/swing/ORPanel.java @@ -116,10 +116,7 @@ implements ActionListener, KeyListener, RevenueListener { private PublicCompanyI orComp = null; - //for displaying routes of the currently active company - private RevenueAdapter currentRoutesRevenueAdapter = null; - - //for displaying routes of the "set revenue" step + private boolean isRevenueValueToBeSet = false; private RevenueAdapter revenueAdapter = null; private Thread revenueThread = null; @@ -718,7 +715,6 @@ implements ActionListener, KeyListener, RevenueListener { orUIManager.getMap().setTrainPaths(null); //but retain paths already existing before if (revenueAdapter != null) revenueAdapter.drawOptimalRunAsPath(orUIManager.getMap()); - if (currentRoutesRevenueAdapter != null) currentRoutesRevenueAdapter.drawOptimalRunAsPath(orUIManager.getMap()); orUIManager.getMap().repaint(); } } @@ -738,19 +734,14 @@ implements ActionListener, KeyListener, RevenueListener { undoButton.setEnabled(false); redoButton.setEnabled(false); - removeCurrentRoutes(); + disableRoutesDisplay(); } private void redrawRoutes() { - if (revenueAdapter != null && displayRevenueRoutes()) { + if (revenueAdapter != null && isDisplayRoutes()) { revenueAdapter.drawOptimalRunAsPath(orUIManager.getMap()); orUIManager.getMap().repaint(); } - if (currentRoutesRevenueAdapter != null && displayCurrentRoutes()) { - currentRoutesRevenueAdapter.drawOptimalRunAsPath(orUIManager.getMap()); - orUIManager.getMap().repaint(); - } - } public void actionPerformed(ActionEvent actor) { @@ -864,13 +855,14 @@ implements ActionListener, KeyListener, RevenueListener { /** * - * @return True if route calculation is active and if the routes of the currently - * active company are not displayed all the time (only if this is not the case, - * it makes sense to display routes for the set revenue step) + * @return True if route should be displayed (at least for the set revenue step) */ - private boolean displayRevenueRoutes() { - return (orUIManager.gameUIManager.getGameParameterAsBoolean(GuiDef.Parm.ROUTE_HIGHLIGHT) - && "no".equalsIgnoreCase(Config.get("map.displayCurrentRoutes"))); + private boolean isDisplayRoutes() { + return (orUIManager.gameUIManager.getGameParameterAsBoolean(GuiDef.Parm.ROUTE_HIGHLIGHT)); + } + + private boolean isSuggestRevenue() { + return (orUIManager.gameUIManager.getGameParameterAsBoolean(GuiDef.Parm.REVENUE_SUGGEST)); } /** @@ -878,39 +870,56 @@ implements ActionListener, KeyListener, RevenueListener { * @return True if the routes of the currently active company should be displayed. * As a prerequisite of this feature, route highlighting has to be enabled/supported. */ - private boolean displayCurrentRoutes() { - return (orUIManager.gameUIManager.getGameParameterAsBoolean(GuiDef.Parm.ROUTE_HIGHLIGHT) + private boolean isDisplayCurrentRoutes() { + return (isDisplayRoutes() && "yes".equalsIgnoreCase(Config.get("map.displayCurrentRoutes"))); } /** - * routes of the current company are removed from the map + * any routes currently displayed on the map are removed + * In addition, revenue adapter and its thread are interrupted / removed. */ - private void removeCurrentRoutes() { - if (currentRoutesRevenueAdapter != null) { - orUIManager.getMap().setTrainPaths(null); - currentRoutesRevenueAdapter = null; - orUIManager.getMap().repaint(); + private void disableRoutesDisplay() { + clearRevenueAdapter(); + orUIManager.getMap().setTrainPaths(null); + orUIManager.getMap().repaint(); + } + + private void clearRevenueAdapter() { + if (revenueThread != null) { + revenueThread.interrupt(); + revenueThread = null; + } + if (revenueAdapter != null) { + revenueAdapter.removeRevenueListener(); + revenueAdapter = null; } } - private void updateCurrentRoutes() { + private void updateCurrentRoutes(boolean isSetRevenueStep) { - //remove current routes also if display option is not active - //(as it could have just been turned off) - removeCurrentRoutes(); + // initialize and start the revenue adapter if routes to be displayed + // or revenue to be suggested in the revenue step + if (isDisplayCurrentRoutes() || (isSuggestRevenue() && isSetRevenueStep)) { + + //only consider revenue quantification for the set revenue step and only + //if suggest option is on + isRevenueValueToBeSet = isSetRevenueStep ? isSuggestRevenue() : false; - //calculate routes for the current company - if (displayCurrentRoutes()) { GameManagerI gm = orUIManager.getGameUIManager().getGameManager(); - currentRoutesRevenueAdapter = RevenueAdapter.createRevenueAdapter( - gm, orComp, gm.getCurrentPhase()); - currentRoutesRevenueAdapter.initRevenueCalculator(true); - currentRoutesRevenueAdapter.calculateRevenue(); - currentRoutesRevenueAdapter.drawOptimalRunAsPath(orUIManager.getMap()); - orUIManager.getMap().repaint(); + revenueAdapter = RevenueAdapter.createRevenueAdapter(gm, orComp, gm.getCurrentPhase()); + revenueAdapter.initRevenueCalculator(true); + revenueAdapter.addRevenueListener(this); + revenueThread = new Thread(revenueAdapter); + revenueThread.start(); + } else { + + //remove current routes also if display option is not active + //(as it could have just been turned off) + clearRevenueAdapter(); + disableRoutesDisplay(); } - + } public void initORCompanyTurn(PublicCompanyI orComp, int orCompIndex) { @@ -929,13 +938,15 @@ implements ActionListener, KeyListener, RevenueListener { button2.setEnabled(false); button3.setEnabled(false); - updateCurrentRoutes(); + updateCurrentRoutes(false); + } public void initTileLayingStep() { tileCaption.setHighlight(true); button1.setVisible(false); + } public void initTokenLayingStep() { @@ -944,6 +955,7 @@ implements ActionListener, KeyListener, RevenueListener { button1.setEnabled(false); button1.setVisible(false); button3.setEnabled(false); + } public void initRevenueEntryStep(int orCompIndex, SetDividend action) { @@ -959,46 +971,29 @@ implements ActionListener, KeyListener, RevenueListener { button1.setMnemonic(KeyEvent.VK_R); button1.setEnabled(true); button1.setVisible(true); - - // initialize and start the revenue adapter - if (orUIManager.gameUIManager.getGameParameterAsBoolean(GuiDef.Parm.REVENUE_SUGGEST)) { - revenueAdapter = initRevenueCalculation(orComp); - revenueThread = new Thread(revenueAdapter); - revenueThread.start(); - } + + //indicate interest in setting revenue values (and not only displaying routes) + updateCurrentRoutes(true); } - private RevenueAdapter initRevenueCalculation(PublicCompanyI company){ - GameManagerI gm = orUIManager.getGameUIManager().getGameManager(); - RevenueAdapter ra = RevenueAdapter.createRevenueAdapter(gm, company, gm.getCurrentPhase()); - ra.initRevenueCalculator(true); - ra.addRevenueListener(this); - return ra; - } - public void revenueUpdate(int bestRevenue, boolean finalResult) { - revenueSelect[orCompIndex].setValue(bestRevenue); + if (isRevenueValueToBeSet) { + revenueSelect[orCompIndex].setValue(bestRevenue); + } if (finalResult) { - if (displayRevenueRoutes()) { - revenueAdapter.drawOptimalRunAsPath(orUIManager.getMap()); - orUIManager.getMap().repaint(); + orUIManager.getMap().setTrainPaths(null); + revenueAdapter.drawOptimalRunAsPath(orUIManager.getMap()); + orUIManager.getMap().repaint(); + if (isRevenueValueToBeSet) { + orUIManager.addInformation("Best Run Value = " + bestRevenue + + " with " + Util.convertToHtml(revenueAdapter.getOptimalRunPrettyPrint(false))); + orUIManager.addDetail(Util.convertToHtml(revenueAdapter.getOptimalRunPrettyPrint(true))); } - orUIManager.addInformation("Best Run Value = " + bestRevenue + - " with " + Util.convertToHtml(revenueAdapter.getOptimalRunPrettyPrint(false))); - orUIManager.addDetail(Util.convertToHtml(revenueAdapter.getOptimalRunPrettyPrint(true))); } } public void stopRevenueUpdate() { - if (displayRevenueRoutes()) orUIManager.getMap().setTrainPaths(null); - if (revenueThread != null) { - revenueThread.interrupt(); - revenueThread = null; - } - if (revenueAdapter != null) { - revenueAdapter.removeRevenueListener(); - revenueAdapter = null; - } + isRevenueValueToBeSet = false; } |