From 80ad2ef6a32122592b92f4ec55ce2f3e2b3842cc Mon Sep 17 00:00:00 2001 From: Rafael Oliveira Date: Sat, 14 Mar 2020 15:53:18 -0700 Subject: [PATCH 1/3] shows dialog and properly saves map author and description --- data/strings/FreeColMessages.properties | 4 + .../client/control/MapEditorController.java | 47 +++-- src/net/sf/freecol/client/gui/Canvas.java | 180 ++++-------------- src/net/sf/freecol/client/gui/GUI.java | 88 +++------ src/net/sf/freecol/client/gui/SwingGUI.java | 95 +++------ .../client/gui/dialog/MapDetailsDialog.java | 65 +++++++ .../sf/freecol/common/model/MapDetails.java | 13 ++ src/net/sf/freecol/server/FreeColServer.java | 104 +++++----- 8 files changed, 238 insertions(+), 358 deletions(-) create mode 100644 src/net/sf/freecol/client/gui/dialog/MapDetailsDialog.java create mode 100644 src/net/sf/freecol/common/model/MapDetails.java diff --git a/data/strings/FreeColMessages.properties b/data/strings/FreeColMessages.properties index 72d45931bd..a172b77bf0 100644 --- a/data/strings/FreeColMessages.properties +++ b/data/strings/FreeColMessages.properties @@ -61,6 +61,7 @@ close=Close color=Color connect=Connect current=Current +description=Description false=False fill=Fill height=Height @@ -3548,6 +3549,9 @@ mapGeneratorOptionsDialog.badWidth=Map width (%width%) is too narrow, less than # MapSizeDialog mapSizeDialog.mapSize=Select map size +# MapAuthorshipDialog +mapAuthorshipDialog.mapAuthorship=Enter map details + # ModifierFormat modifierFormat.unknown=??? diff --git a/src/net/sf/freecol/client/control/MapEditorController.java b/src/net/sf/freecol/client/control/MapEditorController.java index 2dcd2f2b20..693405930a 100644 --- a/src/net/sf/freecol/client/control/MapEditorController.java +++ b/src/net/sf/freecol/client/control/MapEditorController.java @@ -19,37 +19,30 @@ package net.sf.freecol.client.control; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.logging.Logger; - -import javax.swing.SwingUtilities; -import javax.xml.stream.XMLStreamException; - import net.sf.freecol.FreeCol; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.gui.GUI; +import net.sf.freecol.common.model.MapDetails; import net.sf.freecol.common.FreeColException; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.io.FreeColDirectories; import net.sf.freecol.common.io.FreeColSavegameFile; -import net.sf.freecol.common.model.Game; -import net.sf.freecol.common.model.Map; -import net.sf.freecol.common.model.Nation; -import net.sf.freecol.common.model.Player; -import net.sf.freecol.common.model.Specification; -import net.sf.freecol.common.model.StringTemplate; -import net.sf.freecol.common.model.Tile; +import net.sf.freecol.common.model.*; import net.sf.freecol.common.option.MapGeneratorOptions; import net.sf.freecol.common.option.OptionGroup; -import net.sf.freecol.common.util.LogBuilder; import net.sf.freecol.server.FreeColServer; import net.sf.freecol.server.generator.MapGenerator; import net.sf.freecol.server.model.ServerGame; import net.sf.freecol.server.model.ServerPlayer; +import javax.swing.*; +import javax.xml.stream.XMLStreamException; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.logging.Logger; + /** * The map editor controller. @@ -191,23 +184,29 @@ public void newMap() { } /** - * Opens a dialog where the user should specify the filename - * and saves the game. + * Opens a dialog asking for map details and then a dialog + * where the user should specify the filename and saves + * the game. */ public void saveMapEditorGame() { File dir = FreeColDirectories.getUserMapsDirectory(); if (dir == null) dir = FreeColDirectories.getSaveDirectory(); - File file = getGUI() - .showSaveDialog(dir, FreeColDirectories.MAP_FILE_NAME); - if (file != null) saveMapEditorGame(file); + MapDetails mapDetails = getGUI().showMapDetailsDialog(); + + if (mapDetails != null) { + File file = getGUI() + .showSaveDialog(dir, FreeColDirectories.MAP_FILE_NAME); + if (file != null) saveMapEditorGame(file, mapDetails); + } } /** * Saves the game to the given file. * * @param file The {@code File}. + * @param mapDetails The {@code MapDetails}. */ - public void saveMapEditorGame(final File file) { + public void saveMapEditorGame(final File file, final MapDetails mapDetails) { final GUI gui = getGUI(); final Game game = getGame(); Map map = game.getMap(); @@ -221,7 +220,7 @@ public void saveMapEditorGame(final File file) { public void run() { try { BufferedImage thumb = gui.createMiniMapThumbNail(); - getFreeColServer().saveMapEditorGame(file, thumb); + getFreeColServer().saveMapEditorGame(file, thumb, mapDetails); SwingUtilities.invokeLater(() -> { gui.closeStatusPanel(); gui.requestFocusInWindow(); diff --git a/src/net/sf/freecol/client/gui/Canvas.java b/src/net/sf/freecol/client/gui/Canvas.java index 253c94f1b3..df235e11c8 100644 --- a/src/net/sf/freecol/client/gui/Canvas.java +++ b/src/net/sf/freecol/client/gui/Canvas.java @@ -19,167 +19,46 @@ package net.sf.freecol.client.gui; -import java.awt.Color; -import java.awt.Component; -import java.awt.Container; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.GraphicsDevice; -import java.awt.Image; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.RenderingHints; -import java.awt.event.ActionListener; -import java.awt.event.KeyListener; -import java.awt.event.MouseListener; -import java.awt.event.MouseMotionListener; -import java.awt.font.TextLayout; -import java.awt.geom.Rectangle2D; -import java.io.File; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.swing.ImageIcon; -import javax.swing.JComponent; -import javax.swing.JDesktopPane; -import javax.swing.JInternalFrame; -import javax.swing.JLayeredPane; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; -import javax.swing.SwingUtilities; -import javax.swing.UIManager; -import javax.swing.border.EmptyBorder; -import javax.swing.filechooser.FileFilter; -import javax.swing.plaf.basic.BasicInternalFrameUI; - import net.sf.freecol.FreeCol; import net.sf.freecol.client.ClientOptions; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.gui.action.FreeColAction; -import net.sf.freecol.client.gui.panel.AboutPanel; -import net.sf.freecol.client.gui.panel.BuildQueuePanel; -import net.sf.freecol.client.gui.dialog.CaptureGoodsDialog; -import net.sf.freecol.client.gui.panel.ChatPanel; -import net.sf.freecol.client.gui.dialog.ChooseFoundingFatherDialog; -import net.sf.freecol.client.gui.dialog.ClientOptionsDialog; -import net.sf.freecol.client.gui.panel.ColonyPanel; +import net.sf.freecol.client.gui.dialog.*; +import net.sf.freecol.client.gui.panel.*; import net.sf.freecol.client.gui.panel.colopedia.ColopediaPanel; -import net.sf.freecol.client.gui.panel.ColorChooserPanel; -import net.sf.freecol.client.gui.panel.report.CompactLabourReport; -import net.sf.freecol.client.gui.dialog.ConfirmDeclarationDialog; -import net.sf.freecol.client.gui.panel.DeclarationPanel; -import net.sf.freecol.client.gui.dialog.DifficultyDialog; -import net.sf.freecol.client.gui.dialog.DumpCargoDialog; -import net.sf.freecol.client.gui.dialog.EditOptionDialog; -import net.sf.freecol.client.gui.dialog.EditSettlementDialog; -import net.sf.freecol.client.gui.dialog.EmigrationDialog; -import net.sf.freecol.client.gui.dialog.EndTurnDialog; -import net.sf.freecol.client.gui.panel.ErrorPanel; -import net.sf.freecol.client.gui.panel.EuropePanel; -import net.sf.freecol.client.gui.panel.EventPanel; -import net.sf.freecol.client.gui.panel.FindSettlementPanel; -import net.sf.freecol.client.gui.dialog.FirstContactDialog; -import net.sf.freecol.client.gui.dialog.FreeColChoiceDialog; -import net.sf.freecol.client.gui.dialog.FreeColConfirmDialog; -import net.sf.freecol.client.gui.dialog.FreeColDialog; -import net.sf.freecol.client.gui.panel.FreeColPanel; -import net.sf.freecol.client.gui.dialog.FreeColStringInputDialog; -import net.sf.freecol.client.gui.dialog.GameOptionsDialog; -import net.sf.freecol.client.gui.panel.IndianSettlementPanel; -import net.sf.freecol.client.gui.panel.InformationPanel; +import net.sf.freecol.client.gui.panel.report.*; import net.sf.freecol.client.gui.panel.report.LabourData.UnitData; -import net.sf.freecol.client.gui.dialog.LoadDialog; -import net.sf.freecol.client.gui.dialog.LoadingSavegameDialog; -import net.sf.freecol.client.gui.panel.MainPanel; -import net.sf.freecol.client.gui.panel.MapEditorTransformPanel; -import net.sf.freecol.client.gui.dialog.MapGeneratorOptionsDialog; -import net.sf.freecol.client.gui.dialog.MapSizeDialog; -import net.sf.freecol.client.gui.dialog.MonarchDialog; -import net.sf.freecol.client.gui.dialog.NativeDemandDialog; -import net.sf.freecol.client.gui.dialog.NegotiationDialog; -import net.sf.freecol.client.gui.panel.NewPanel; -import net.sf.freecol.client.gui.dialog.Parameters; -import net.sf.freecol.client.gui.dialog.ParametersDialog; -import net.sf.freecol.client.gui.dialog.PreCombatDialog; -import net.sf.freecol.client.gui.panel.PurchasePanel; -import net.sf.freecol.client.gui.panel.RecruitPanel; -import net.sf.freecol.client.gui.panel.report.ReportCargoPanel; -import net.sf.freecol.client.gui.panel.report.ReportClassicColonyPanel; -import net.sf.freecol.client.gui.panel.report.ReportCompactColonyPanel; -import net.sf.freecol.client.gui.panel.report.ReportContinentalCongressPanel; -import net.sf.freecol.client.gui.panel.report.ReportEducationPanel; -import net.sf.freecol.client.gui.panel.report.ReportExplorationPanel; -import net.sf.freecol.client.gui.panel.report.ReportForeignAffairPanel; -import net.sf.freecol.client.gui.panel.report.ReportHighScoresPanel; -import net.sf.freecol.client.gui.panel.report.ReportHistoryPanel; -import net.sf.freecol.client.gui.panel.report.ReportIndianPanel; -import net.sf.freecol.client.gui.panel.report.ReportLabourDetailPanel; -import net.sf.freecol.client.gui.panel.report.ReportLabourPanel; -import net.sf.freecol.client.gui.panel.report.ReportMilitaryPanel; -import net.sf.freecol.client.gui.panel.report.ReportNavalPanel; -import net.sf.freecol.client.gui.panel.report.ReportPanel; -import net.sf.freecol.client.gui.panel.report.ReportProductionPanel; -import net.sf.freecol.client.gui.panel.report.ReportReligiousPanel; -import net.sf.freecol.client.gui.panel.report.ReportRequirementsPanel; -import net.sf.freecol.client.gui.panel.report.ReportTradePanel; -import net.sf.freecol.client.gui.panel.report.ReportTurnPanel; -import net.sf.freecol.client.gui.dialog.RiverStyleDialog; -import net.sf.freecol.client.gui.dialog.SaveDialog; -import net.sf.freecol.client.gui.dialog.ScaleMapSizeDialog; -import net.sf.freecol.client.gui.dialog.SelectAmountDialog; -import net.sf.freecol.client.gui.dialog.SelectDestinationDialog; -import net.sf.freecol.client.gui.dialog.SelectTributeAmountDialog; -import net.sf.freecol.client.gui.panel.ServerListPanel; -import net.sf.freecol.client.gui.panel.StartGamePanel; -import net.sf.freecol.client.gui.panel.StatisticsPanel; -import net.sf.freecol.client.gui.panel.StatusPanel; -import net.sf.freecol.client.gui.panel.TilePanel; -import net.sf.freecol.client.gui.panel.TradeRouteInputPanel; -import net.sf.freecol.client.gui.panel.TradeRoutePanel; -import net.sf.freecol.client.gui.panel.TrainPanel; -import net.sf.freecol.client.gui.panel.Utility; -import net.sf.freecol.client.gui.dialog.VictoryDialog; -import net.sf.freecol.client.gui.dialog.WarehouseDialog; -import net.sf.freecol.client.gui.panel.WorkProductionPanel; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.io.FreeColDataFile; import net.sf.freecol.common.metaserver.ServerInfo; -import net.sf.freecol.common.model.Colony; -import net.sf.freecol.common.model.DiplomaticTrade; -import net.sf.freecol.common.model.Direction; -import net.sf.freecol.common.model.FoundingFather; -import net.sf.freecol.common.model.FreeColGameObject; -import net.sf.freecol.common.model.FreeColObject; -import net.sf.freecol.common.model.Game; -import net.sf.freecol.common.model.Goods; -import net.sf.freecol.common.model.GoodsType; -import net.sf.freecol.common.model.HighScore; -import net.sf.freecol.common.model.IndianSettlement; -import net.sf.freecol.common.model.Location; -import net.sf.freecol.common.model.ModelMessage; +import net.sf.freecol.common.model.*; import net.sf.freecol.common.model.Monarch.MonarchAction; -import net.sf.freecol.common.model.PathNode; -import net.sf.freecol.common.model.Player; -import net.sf.freecol.common.model.Settlement; -import net.sf.freecol.common.model.Specification; -import net.sf.freecol.common.model.StringTemplate; -import net.sf.freecol.common.model.Tile; -import net.sf.freecol.common.model.TradeRoute; -import net.sf.freecol.common.model.TypeCountMap; -import net.sf.freecol.common.model.Unit; -import net.sf.freecol.common.model.UnitType; import net.sf.freecol.common.option.IntegerOption; import net.sf.freecol.common.option.Option; import net.sf.freecol.common.option.OptionGroup; -import static net.sf.freecol.common.util.CollectionUtils.*; -import static net.sf.freecol.common.util.StringUtils.*; import net.sf.freecol.common.util.Utils; +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import javax.swing.filechooser.FileFilter; +import javax.swing.plaf.basic.BasicInternalFrameUI; +import java.awt.*; +import java.awt.event.ActionListener; +import java.awt.event.KeyListener; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; +import java.awt.font.TextLayout; +import java.awt.geom.Rectangle2D; +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; + +import static net.sf.freecol.common.util.CollectionUtils.transform; +import static net.sf.freecol.common.util.StringUtils.lastPart; + /** * The main container for the other GUI components in FreeCol. This @@ -2786,4 +2665,13 @@ public void showVideoComponent(final Component vp, addKeyListener(kl); addCentered(vp, JLayeredPane.PALETTE_LAYER); } + + /** + * Display the map details dialog. + * + * @return The response returned by the dialog. + */ + public MapDetails showMapDetailsDialog() { + return showFreeColDialog(new MapDetailsDialog(freeColClient, frame), null); + } } diff --git a/src/net/sf/freecol/client/gui/GUI.java b/src/net/sf/freecol/client/gui/GUI.java index e5529a8971..40aca02135 100644 --- a/src/net/sf/freecol/client/gui/GUI.java +++ b/src/net/sf/freecol/client/gui/GUI.java @@ -19,83 +19,42 @@ package net.sf.freecol.client.gui; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.event.ActionListener; -import java.awt.Graphics2D; -import java.awt.image.BufferedImage; -import java.awt.Point; -import java.awt.Rectangle; -import java.io.File; -import java.io.InputStream; -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.Map; - -import javax.swing.ImageIcon; -import javax.swing.SwingUtilities; - import net.sf.freecol.FreeCol; import net.sf.freecol.client.ClientOptions; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.control.FreeColClientHolder; import net.sf.freecol.client.control.MapTransform; -import net.sf.freecol.client.gui.panel.BuildQueuePanel; -import net.sf.freecol.client.gui.panel.ColonyPanel; -import net.sf.freecol.client.gui.panel.ColorChooserPanel; -import net.sf.freecol.client.gui.panel.FreeColPanel; -import net.sf.freecol.client.gui.panel.MiniMap; -import net.sf.freecol.client.gui.panel.report.LabourData.UnitData; -import net.sf.freecol.client.gui.panel.TradeRouteInputPanel; import net.sf.freecol.client.gui.dialog.FreeColDialog; +import net.sf.freecol.common.model.MapDetails; import net.sf.freecol.client.gui.dialog.Parameters; +import net.sf.freecol.client.gui.panel.*; +import net.sf.freecol.client.gui.panel.report.LabourData.UnitData; import net.sf.freecol.common.FreeColException; import net.sf.freecol.common.debug.DebugUtils; import net.sf.freecol.common.debug.FreeColDebugger; import net.sf.freecol.common.i18n.Messages; -import net.sf.freecol.common.io.FreeColDirectories; import net.sf.freecol.common.metaserver.ServerInfo; -import net.sf.freecol.common.model.Ability; -import net.sf.freecol.common.model.Building; -import net.sf.freecol.common.model.Colony; -import net.sf.freecol.common.model.Constants.*; // Imports all ENUMS. -import net.sf.freecol.common.model.DiplomaticTrade; -import net.sf.freecol.common.model.Europe; -import net.sf.freecol.common.model.FoundingFather; -import net.sf.freecol.common.model.FreeColGameObject; -import net.sf.freecol.common.model.FreeColObject; -import net.sf.freecol.common.model.Game; -import net.sf.freecol.common.model.Goods; -import net.sf.freecol.common.model.GoodsType; -import net.sf.freecol.common.model.HighScore; -import net.sf.freecol.common.model.IndianNationType; -import net.sf.freecol.common.model.IndianSettlement; -import net.sf.freecol.common.model.Location; -import net.sf.freecol.common.model.ModelMessage; +import net.sf.freecol.common.model.*; +import net.sf.freecol.common.model.Constants.*; import net.sf.freecol.common.model.Monarch.MonarchAction; -import net.sf.freecol.common.model.Nation; -import net.sf.freecol.common.model.NationSummary; -import net.sf.freecol.common.model.PathNode; -import net.sf.freecol.common.model.Player; -import net.sf.freecol.common.model.Settlement; -import net.sf.freecol.common.model.Specification; -import net.sf.freecol.common.model.Stance; -import net.sf.freecol.common.model.StringTemplate; -import net.sf.freecol.common.model.Tension; -import net.sf.freecol.common.model.Tile; -import net.sf.freecol.common.model.TileType; -import net.sf.freecol.common.model.TradeRoute; -import net.sf.freecol.common.model.TypeCountMap; -import net.sf.freecol.common.model.Unit; -import net.sf.freecol.common.model.UnitType; import net.sf.freecol.common.option.Option; import net.sf.freecol.common.option.OptionGroup; import net.sf.freecol.common.resources.ResourceManager; +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionListener; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; + /** * The API and common reusable functionality for the overall GUI. @@ -2586,4 +2545,13 @@ public void showWorkProductionPanel(Unit unit) {} * Update all panels derived from the EuropePanel. */ public void updateEuropeanSubpanels() {} + + /** + * Show the mapAuthorshipDialog dialog. + + * @return The selected map authorship as a {@code MapAuthorship}. + */ + public MapDetails showMapDetailsDialog() { + return null; + } } diff --git a/src/net/sf/freecol/client/gui/SwingGUI.java b/src/net/sf/freecol/client/gui/SwingGUI.java index 67765361d3..dabbb67fdd 100644 --- a/src/net/sf/freecol/client/gui/SwingGUI.java +++ b/src/net/sf/freecol/client/gui/SwingGUI.java @@ -19,97 +19,44 @@ package net.sf.freecol.client.gui; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.DisplayMode; -import java.awt.Font; -import java.awt.Graphics2D; -import java.awt.GraphicsDevice; -import java.awt.GraphicsEnvironment; -import java.awt.HeadlessException; -import java.awt.MouseInfo; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.image.BufferedImage; -import java.beans.PropertyChangeEvent; -import java.io.File; -import java.io.InputStream; -import java.util.List; -import java.util.Locale; -import java.util.logging.Level; - -import javax.imageio.ImageIO; -import javax.swing.ImageIcon; -import javax.swing.JLabel; -import javax.swing.JWindow; -import javax.swing.Timer; - import net.sf.freecol.FreeCol; import net.sf.freecol.client.ClientOptions; import net.sf.freecol.client.FreeColClient; import net.sf.freecol.client.control.MapTransform; -import net.sf.freecol.client.gui.ImageLibrary; import net.sf.freecol.client.gui.animation.Animations; -import net.sf.freecol.client.gui.dialog.CaptureGoodsDialog; import net.sf.freecol.client.gui.dialog.FreeColDialog; +import net.sf.freecol.common.model.MapDetails; import net.sf.freecol.client.gui.dialog.Parameters; -import net.sf.freecol.client.gui.panel.BuildQueuePanel; -import net.sf.freecol.client.gui.panel.ColonyPanel; -import net.sf.freecol.client.gui.panel.ColorChooserPanel; -import net.sf.freecol.client.gui.panel.CornerMapControls; +import net.sf.freecol.client.gui.panel.*; import net.sf.freecol.client.gui.panel.report.LabourData.UnitData; -import net.sf.freecol.client.gui.panel.MapControls; -import net.sf.freecol.client.gui.panel.TradeRouteInputPanel; -import net.sf.freecol.client.gui.panel.Utility; import net.sf.freecol.client.gui.plaf.FreeColLookAndFeel; import net.sf.freecol.client.gui.video.VideoComponent; import net.sf.freecol.client.gui.video.VideoListener; import net.sf.freecol.common.FreeColException; import net.sf.freecol.common.i18n.Messages; import net.sf.freecol.common.metaserver.ServerInfo; -import net.sf.freecol.common.model.Colony; -import net.sf.freecol.common.model.Constants.IndianDemandAction; -import net.sf.freecol.common.model.DiplomaticTrade; -import net.sf.freecol.common.model.Europe; -import net.sf.freecol.common.model.FoundingFather; -import net.sf.freecol.common.model.FreeColGameObject; -import net.sf.freecol.common.model.FreeColObject; -import net.sf.freecol.common.model.Game; -import net.sf.freecol.common.model.Goods; -import net.sf.freecol.common.model.GoodsType; -import net.sf.freecol.common.model.HighScore; -import net.sf.freecol.common.model.IndianSettlement; -import net.sf.freecol.common.model.Location; -import net.sf.freecol.common.model.Map; -import net.sf.freecol.common.model.ModelMessage; +import net.sf.freecol.common.model.*; import net.sf.freecol.common.model.Monarch.MonarchAction; -import net.sf.freecol.common.model.Nation; -import net.sf.freecol.common.model.PathNode; -import net.sf.freecol.common.model.Player; -import net.sf.freecol.common.model.Settlement; -import net.sf.freecol.common.model.Specification; -import net.sf.freecol.common.model.StringTemplate; -import net.sf.freecol.common.model.Tile; -import net.sf.freecol.common.model.TileType; -import net.sf.freecol.common.model.TradeRoute; -import net.sf.freecol.common.model.TypeCountMap; -import net.sf.freecol.common.model.Unit; -import net.sf.freecol.common.model.UnitType; -import net.sf.freecol.common.model.WorkLocation; -import net.sf.freecol.common.option.BooleanOption; import net.sf.freecol.common.option.LanguageOption; import net.sf.freecol.common.option.LanguageOption.Language; import net.sf.freecol.common.option.Option; import net.sf.freecol.common.option.OptionGroup; import net.sf.freecol.common.resources.Video; import net.sf.freecol.common.util.Introspector; -import static net.sf.freecol.common.util.StringUtils.*; + +import javax.imageio.ImageIO; +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; +import java.awt.image.BufferedImage; +import java.beans.PropertyChangeEvent; +import java.io.File; +import java.io.InputStream; +import java.util.List; +import java.util.Locale; +import java.util.logging.Level; + +import static net.sf.freecol.common.util.StringUtils.lastPart; /** @@ -2073,4 +2020,12 @@ public void showWorkProductionPanel(Unit unit) { public void updateEuropeanSubpanels() { canvas.updateEuropeanSubpanels(); } + + /** + * {@inheritDoc} + */ + @Override + public MapDetails showMapDetailsDialog() { + return canvas.showMapDetailsDialog(); + } } diff --git a/src/net/sf/freecol/client/gui/dialog/MapDetailsDialog.java b/src/net/sf/freecol/client/gui/dialog/MapDetailsDialog.java new file mode 100644 index 0000000000..e80e21d56d --- /dev/null +++ b/src/net/sf/freecol/client/gui/dialog/MapDetailsDialog.java @@ -0,0 +1,65 @@ +package net.sf.freecol.client.gui.dialog; + +import net.sf.freecol.client.FreeColClient; +import net.sf.freecol.client.gui.panel.MigPanel; +import net.sf.freecol.client.gui.panel.Utility; + +import javax.swing.*; + +import net.miginfocom.swing.MigLayout; +import net.sf.freecol.common.model.MapDetails; + +/** + * A dialog for typing in the author and the description of the created map. + */ +public final class MapDetailsDialog extends FreeColInputDialog { + + private static final int COLUMNS = 5; + private static final int ROWS = 5; + + /** The author name. */ + private final JTextField authorName + = new JTextField(COLUMNS); + + /** The map description. */ + private final JTextArea mapDescription + = new JTextArea(ROWS, COLUMNS); + + public MapDetailsDialog(FreeColClient freeColClient, JFrame frame) { + super(freeColClient, frame); + + JLabel authorLabel = Utility.localizedLabel("name"); + authorLabel.setLabelFor(authorName); + + JLabel descriptionLabel = Utility.localizedLabel("description"); + descriptionLabel.setLabelFor(mapDescription); + + JPanel panel = new MigPanel(new MigLayout("wrap 2")); + panel.add(Utility.localizedHeader("mapAuthorshipDialog.mapAuthorship", true), + "span, align center"); + panel.add(authorLabel, "newline 20"); + panel.add(authorName); + panel.add(descriptionLabel); + panel.add(mapDescription); + + initializeInputDialog(frame, true, panel, null, "ok", "cancel"); + } + + @Override + protected MapDetails getInputValue() { + String author, description; + + author = authorName.getText(); + description = mapDescription.getText(); + + return new MapDetails(author, description); + } + + /** + * {@inheritDoc} + */ + @Override + public void requestFocus() { + this.authorName.requestFocus(); + } +} diff --git a/src/net/sf/freecol/common/model/MapDetails.java b/src/net/sf/freecol/common/model/MapDetails.java new file mode 100644 index 0000000000..9a9ffe9808 --- /dev/null +++ b/src/net/sf/freecol/common/model/MapDetails.java @@ -0,0 +1,13 @@ +package net.sf.freecol.common.model; + +public class MapDetails { + + public final String authorName; + + public final String mapDescription; + + public MapDetails(String authorName, String mapDescription) { + this.authorName = authorName; + this.mapDescription = mapDescription; + } +} diff --git a/src/net/sf/freecol/server/FreeColServer.java b/src/net/sf/freecol/server/FreeColServer.java index 54ff3acfac..baa1870980 100644 --- a/src/net/sf/freecol/server/FreeColServer.java +++ b/src/net/sf/freecol/server/FreeColServer.java @@ -19,31 +19,8 @@ package net.sf.freecol.server; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.net.BindException; -import java.net.InetAddress; -import java.net.Socket; -import java.net.UnknownHostException; -import java.nio.file.Files; -import java.util.ArrayList; -import java.util.List; -import java.util.Map.Entry; -import java.util.Properties; -import java.util.Random; -import java.util.Timer; -import java.util.function.Predicate; -import java.util.jar.JarEntry; -import java.util.jar.JarOutputStream; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.imageio.ImageIO; -import javax.xml.stream.XMLStreamException; - import net.sf.freecol.FreeCol; +import net.sf.freecol.common.model.MapDetails; import net.sf.freecol.common.FreeColException; import net.sf.freecol.common.FreeColSeed; import net.sf.freecol.common.debug.FreeColDebugger; @@ -53,54 +30,51 @@ import net.sf.freecol.common.io.FreeColXMLWriter; import net.sf.freecol.common.metaserver.MetaServerUtils; import net.sf.freecol.common.metaserver.ServerInfo; -import static net.sf.freecol.common.model.Constants.*; -import net.sf.freecol.common.model.FreeColObject; -import net.sf.freecol.common.model.Game; +import net.sf.freecol.common.model.*; import net.sf.freecol.common.model.Game.LogoutReason; -import net.sf.freecol.common.model.IndianSettlement; -import net.sf.freecol.common.model.Map; -import net.sf.freecol.common.model.Nation; -import net.sf.freecol.common.model.NationOptions; import net.sf.freecol.common.model.NationOptions.NationState; -import net.sf.freecol.common.model.Player; -import net.sf.freecol.common.model.Stance; -import net.sf.freecol.common.model.Specification; -import net.sf.freecol.common.model.StringTemplate; -import net.sf.freecol.common.model.Tension; -import net.sf.freecol.common.model.Unit; -import net.sf.freecol.common.networking.ChangeSet; +import net.sf.freecol.common.networking.*; import net.sf.freecol.common.networking.ChangeSet.See; -import net.sf.freecol.common.networking.Connection; -import net.sf.freecol.common.networking.GameStateMessage; -import net.sf.freecol.common.networking.LogoutMessage; -import net.sf.freecol.common.networking.Message; -import net.sf.freecol.common.networking.TrivialMessage; -import net.sf.freecol.common.networking.VacantPlayersMessage; -import net.sf.freecol.common.option.BooleanOption; import net.sf.freecol.common.option.GameOptions; import net.sf.freecol.common.option.MapGeneratorOptions; import net.sf.freecol.common.option.OptionGroup; -import static net.sf.freecol.common.util.CollectionUtils.*; import net.sf.freecol.common.util.LogBuilder; -import static net.sf.freecol.common.util.Utils.*; import net.sf.freecol.server.ai.AIInGameInputHandler; import net.sf.freecol.server.ai.AIMain; import net.sf.freecol.server.ai.AIPlayer; -import net.sf.freecol.server.control.Controller; -import net.sf.freecol.server.control.InGameController; -import net.sf.freecol.server.control.PreGameController; -import net.sf.freecol.server.control.ServerInputHandler; -import net.sf.freecol.server.control.UserConnectionHandler; +import net.sf.freecol.server.control.*; import net.sf.freecol.server.generator.MapGenerator; import net.sf.freecol.server.generator.SimpleMapGenerator; -import net.sf.freecol.server.generator.TerrainGenerator; import net.sf.freecol.server.model.ServerGame; -import net.sf.freecol.server.model.ServerIndianSettlement; import net.sf.freecol.server.model.ServerPlayer; import net.sf.freecol.server.model.Session; import net.sf.freecol.server.networking.DummyConnection; import net.sf.freecol.server.networking.Server; +import javax.imageio.ImageIO; +import javax.xml.stream.XMLStreamException; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.net.InetAddress; +import java.net.Socket; +import java.net.UnknownHostException; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.List; +import java.util.Map.Entry; +import java.util.Properties; +import java.util.Random; +import java.util.function.Predicate; +import java.util.jar.JarEntry; +import java.util.jar.JarOutputStream; +import java.util.logging.Level; +import java.util.logging.Logger; + +import static net.sf.freecol.common.model.Constants.IntegrityType; +import static net.sf.freecol.common.util.CollectionUtils.*; +import static net.sf.freecol.common.util.Utils.*; + /** * The main control class for the FreeCol server. This class both @@ -136,6 +110,9 @@ public final class FreeColServer { public static final String PUBLIC_SERVER_TAG = "publicServer"; public static final String SAVED_GAME_TAG = "savedGame"; public static final String SINGLE_PLAYER_TAG = "singleplayer"; + public static final String MAP_DETAILS_TAG = "mapDetails"; + public static final String AUTHOR_TAG = "author"; + public static final String DESCRIPTION_TAG = "description"; /** * The save game format used for saving games. @@ -789,16 +766,17 @@ public void sendToAll(Message msg, Player player) { * * @param file The file where the data will be written. * @param image A thumbnail image for the map. + * @param mapDetails Details about the map file * @exception IOException If a problem was encountered while trying * to open, write or close the file. */ - public void saveMapEditorGame(File file, BufferedImage image) + public void saveMapEditorGame(File file, BufferedImage image, MapDetails mapDetails) throws IOException { this.setAIMain(null); // Mask out spec while saving map. Specification spec = getSpecification(); getGame().setSpecification(null); - saveGame(file, MAP_EDITOR_NAME, null, null, image); + saveGame(file, MAP_EDITOR_NAME, null, null, image, mapDetails); getGame().setSpecification(spec); } @@ -813,7 +791,7 @@ public void saveMapEditorGame(File file, BufferedImage image) */ public void saveGame(File file, OptionGroup options, Unit active) throws IOException { - saveGame(file, null, options, active, null); + saveGame(file, null, options, active, null, null); } /** @@ -824,11 +802,12 @@ public void saveGame(File file, OptionGroup options, Unit active) * @param options Optional client options to save in the game. * @param active An optional active {@code Unit}. * @param image A thumbnail {@code Image} value to save in the game. + * @param mapAuthorship Map details {@code MapDetails} values to save in the game. * @exception IOException If a problem was encountered while trying * to open, write or close the file. */ private void saveGame(File file, String owner, OptionGroup options, - Unit active, BufferedImage image) throws IOException { + Unit active, BufferedImage image, MapDetails mapDetails) throws IOException { // Try to GC now before launching into the save, as a failure // here can lead to a corrupt saved game file (BR#3146). // Alas, gc is only advisory, but it is all we have got. @@ -867,6 +846,14 @@ private void saveGame(File file, String owner, OptionGroup options, xw.writeComment(FreeCol.getConfiguration().toString()); xw.writeCharacters("\n"); + if (mapDetails != null) { + xw.writeStartElement(MAP_DETAILS_TAG); + + xw.writeAttribute(AUTHOR_TAG, mapDetails.authorName); + xw.writeAttribute(DESCRIPTION_TAG, mapDetails.mapDescription); + xw.writeEndElement(); + } + xw.writeStartElement(SAVED_GAME_TAG); // Add the attributes: @@ -896,6 +883,7 @@ private void saveGame(File file, String owner, OptionGroup options, } xw.writeEndElement(); + xw.writeEndDocument(); } fos.closeEntry(); From a96706dd3825ea80b88685a2f4bf919bb5e8fb91 Mon Sep 17 00:00:00 2001 From: Rafael Oliveira Date: Sat, 14 Mar 2020 16:05:07 -0700 Subject: [PATCH 2/3] map converter now passes null to savemapeditorgame for the map details parameter --- src/net/sf/freecol/tools/MapConverter.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/net/sf/freecol/tools/MapConverter.java b/src/net/sf/freecol/tools/MapConverter.java index 593d25de80..e5d3baea69 100644 --- a/src/net/sf/freecol/tools/MapConverter.java +++ b/src/net/sf/freecol/tools/MapConverter.java @@ -19,14 +19,6 @@ package net.sf.freecol.tools; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; - -import javax.imageio.ImageIO; -import javax.xml.stream.XMLStreamException; - import net.sf.freecol.FreeCol; import net.sf.freecol.common.FreeColException; import net.sf.freecol.common.io.FreeColSavegameFile; @@ -34,6 +26,13 @@ import net.sf.freecol.common.model.Specification; import net.sf.freecol.server.FreeColServer; +import javax.imageio.ImageIO; +import javax.xml.stream.XMLStreamException; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; + /** * Convert map formats. @@ -70,7 +69,7 @@ public static void main(String[] args) throws Exception { FreeCol.getServerPort(), "mapTransformer"); System.out.println("Started server."); - server.saveMapEditorGame(out, thumbnail); + server.saveMapEditorGame(out, thumbnail, null); System.out.println("Saved updated savegame."); server.shutdown(); System.out.println("Shut down server."); From e67b945e36d9f15c59f6b4d61e2ae9c62da9efb6 Mon Sep 17 00:00:00 2001 From: Rafael Oliveira Date: Sat, 14 Mar 2020 16:09:15 -0700 Subject: [PATCH 3/3] start map action passes null map details --- src/net/sf/freecol/client/gui/action/StartMapAction.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/net/sf/freecol/client/gui/action/StartMapAction.java b/src/net/sf/freecol/client/gui/action/StartMapAction.java index 46a1b5c18d..5f02311944 100644 --- a/src/net/sf/freecol/client/gui/action/StartMapAction.java +++ b/src/net/sf/freecol/client/gui/action/StartMapAction.java @@ -19,15 +19,15 @@ package net.sf.freecol.client.gui.action; -import java.awt.event.ActionEvent; -import java.io.File; - import net.sf.freecol.client.FreeColClient; import net.sf.freecol.common.io.FreeColDirectories; import net.sf.freecol.common.model.Game; import net.sf.freecol.common.option.MapGeneratorOptions; import net.sf.freecol.common.option.OptionGroup; +import java.awt.event.ActionEvent; +import java.io.File; + /** * An action for starting a new game from the current map editor map. @@ -59,7 +59,7 @@ public void actionPerformed(ActionEvent ae) { || freeColClient.getGame().getMap() == null) return; File startFile = FreeColDirectories.getStartMapFile(); freeColClient.getMapEditorController() - .saveMapEditorGame(startFile); + .saveMapEditorGame(startFile, null); Game game = freeColClient.getGame(); OptionGroup options = game.getMapGeneratorOptions(); options.setFile(MapGeneratorOptions.IMPORT_FILE, startFile);