Skip to content

Commit

Permalink
Merge pull request #5203 from RPTools/release-1.16
Browse files Browse the repository at this point in the history
Merge 1.16 Campaign Macro Export fix into develop
  • Loading branch information
kwvanderlinde authored Feb 10, 2025
2 parents 56df2ec + a7c3195 commit e43e204
Show file tree
Hide file tree
Showing 5 changed files with 153 additions and 10 deletions.
2 changes: 2 additions & 0 deletions src/main/java/net/rptools/maptool/client/AppConstants.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,14 @@
import java.io.File;
import java.io.FilenameFilter;
import javax.imageio.ImageIO;
import net.rptools.maptool.language.I18N;
import net.rptools.maptool.model.Token;
import net.tsc.servicediscovery.ServiceGroup;

public class AppConstants {

public static final String APP_NAME = "MapTool";
public static final String APP_LOCAL_NAME = I18N.getString("ApplicationName");

public static final File UNZIP_DIR = AppUtil.getAppHome("resource");

Expand Down
36 changes: 36 additions & 0 deletions src/main/java/net/rptools/maptool/client/swing/SwingUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import java.awt.Window;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
Expand Down Expand Up @@ -373,4 +374,39 @@ public void mousePressed(MouseEvent e) {
});
return button;
}

/**
* Returns the first text input field for a JFileChooser. Which is usually the only field in a
* chooser.
*
* @param cont JFileChooser
* @return JTextField
*/
public static JTextField getFileChooserFilenameTextField(Container cont) {
List<JTextField> fields = getTextFields(cont, new ArrayList<>());
if (!fields.isEmpty()) {
return fields.getFirst();
} else {
return null;
}
}

/**
* Recursively search a container for JTextFields. Useful for extracting text fields from
* components like JFileChooser where it is not readily available.
*
* @param cont Container
* @param returnList List<JTextField
* @return List of JTextField
*/
public static List<JTextField> getTextFields(Container cont, List<JTextField> returnList) {
for (Component c : cont.getComponents()) {
if (c instanceof JTextField) {
returnList.add((JTextField) c);
} else if (c instanceof Container) {
returnList.addAll(getTextFields(((Container) c), returnList));
}
}
return returnList;
}
}
109 changes: 105 additions & 4 deletions src/main/java/net/rptools/maptool/client/ui/MapToolFrame.java
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,7 @@ public ChatNotificationTimers() {

public MapToolFrame(JMenuBar menuBar) {
// Set up the frame
super(AppConstants.APP_NAME);
super(AppConstants.APP_LOCAL_NAME);

this.menuBar = menuBar;

Expand Down Expand Up @@ -884,21 +884,117 @@ public JFileChooser getSaveCmpgnFileChooser() {
return saveCmpgnFileChooser;
}

public JFileChooser getSavePropsFileChooser() {
public JFileChooser getSaveCampaignPropsFileChooser() {
if (savePropsFileChooser == null) {
savePropsFileChooser = new JFileChooser();
savePropsFileChooser.setCurrentDirectory(AppPreferences.saveDirectory.get());
savePropsFileChooser.setSelectedFile(
new File(propertiesFilter.getDescription().replaceAll("\\s", "") + ".mtprops"));
savePropsFileChooser.addChoosableFileFilter(propertiesFilter);
savePropsFileChooser.setFileFilter(propertiesFilter);
savePropsFileChooser.setFileFilter(new FileNameExtensionFilter("JSON", "json"));
savePropsFileChooser.setFileFilter(new FileNameExtensionFilter("Text", "txt"));
savePropsFileChooser.setFileFilter(
new FileNameExtensionFilter(I18N.getText("file.ext.text"), "txt"));
savePropsFileChooser.setFileFilter(savePropsFileChooser.getChoosableFileFilters()[0]);
savePropsFileChooser.setDialogTitle(I18N.getText("msg.title.exportProperties"));

String[] extensions =
new String[] {"json", "txt", ((MTFileFilter) propertiesFilter).extensions[0]};
JTextField textField = SwingUtil.getFileChooserFilenameTextField(savePropsFileChooser);

// file type/extension change listener
savePropsFileChooser.addPropertyChangeListener(
JFileChooser.FILE_FILTER_CHANGED_PROPERTY,
evt -> {
File file = savePropsFileChooser.getSelectedFile();
String fName;
FileFilter fNew = (FileFilter) evt.getNewValue();

// using file name or name in text field
if (file == null) {
assert textField != null;
fName = textField.getText();
if (fName.isEmpty()) {
return;
}
} else if (fNew.accept(file)) {
// extension matches file, no further action
return;
} else {
fName = file.getName();
}
// just to stop accruing lots of extensions, remove them all
fName = removeExtensions(fName, extensions);

// add new extension to file name
if (fNew instanceof MTFileFilter) {
fName = String.format("%s.%s", fName, ((MTFileFilter) fNew).extensions[0]);
} else if (fNew instanceof FileNameExtensionFilter) {
fName =
String.format(
"%s.%s", fName, ((FileNameExtensionFilter) fNew).getExtensions()[0]);
}
// set with new file
if (file == null) {
savePropsFileChooser.setSelectedFile(new File(fName));
} else {
savePropsFileChooser.setSelectedFile(new File(file.getParentFile(), fName));
}
// update the text field
assert textField != null;
textField.setText(fName);
});

// the save action
savePropsFileChooser.addActionListener(
e -> {
if (e.getActionCommand().equals(JFileChooser.APPROVE_SELECTION)) {
File file = savePropsFileChooser.getSelectedFile();
if (file == null) {
return; // d'uh
}
FileFilter filter = savePropsFileChooser.getFileFilter();
String fileName = file.getName();
boolean isAcceptAll = savePropsFileChooser.getAcceptAllFileFilter().equals(filter);
if (!isAcceptAll && filter.accept(file)) {
// file name extension matches filter and is not "accept all"
return;
} else {
// clean the file name of extensions
fileName = removeExtensions(fileName, extensions);
}
// set the file with new extension appended
if (filter instanceof MTFileFilter || isAcceptAll) {
savePropsFileChooser.setSelectedFile(
new File(
savePropsFileChooser.getSelectedFile().getParentFile(),
String.format(
"%s.%s", fileName, ((MTFileFilter) propertiesFilter).extensions[0])));
} else if (filter instanceof FileNameExtensionFilter) {
savePropsFileChooser.setSelectedFile(
new File(
savePropsFileChooser.getSelectedFile().getParentFile(),
String.format(
"%s.%s",
fileName, ((FileNameExtensionFilter) filter).getExtensions()[0])));
}
}
});
}
savePropsFileChooser.setAcceptAllFileFilterUsed(true);
return savePropsFileChooser;
}

private String removeExtensions(String fileName, String... extensions) {
for (String extension : extensions) {
String replaceThis = "." + extension;
while (fileName.contains(replaceThis)) {
fileName = fileName.replace(replaceThis, "");
}
}
return fileName;
}

public JFileChooser getSaveTokenFileChooser() {
if (saveTokenFileChooser == null) {
saveTokenFileChooser = new JFileChooser();
Expand Down Expand Up @@ -1651,7 +1747,12 @@ public void setTitleViaRenderer(ZoneRenderer renderer) {
String versionString =
MapTool.getVersion().equals("unspecified") ? "Development" : "v" + MapTool.getVersion();
var title =
AppConstants.APP_NAME + " " + versionString + " - " + MapTool.getPlayer() + campaignName;
AppConstants.APP_LOCAL_NAME
+ " "
+ versionString
+ " - "
+ MapTool.getPlayer()
+ campaignName;

if (renderer != null) {
title += "-" + renderer.getZone().toString();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -417,23 +417,23 @@ private void initExportButton() {
copyUIToCampaign();
// END HACK

JFileChooser chooser = MapTool.getFrame().getSavePropsFileChooser();
JFileChooser fileChooser = MapTool.getFrame().getSaveCampaignPropsFileChooser();

boolean tryAgain = true;
while (tryAgain) {
if (chooser.showSaveDialog(MapTool.getFrame()) != JFileChooser.APPROVE_OPTION) {
if (fileChooser.showSaveDialog(MapTool.getFrame()) != JFileChooser.APPROVE_OPTION) {
return;
}
var installDir = AppUtil.getInstallDirectory().toAbsolutePath();
var saveDir = chooser.getSelectedFile().toPath().getParent().toAbsolutePath();
var saveDir = fileChooser.getSelectedFile().toPath().getParent().toAbsolutePath();
if (saveDir.startsWith(installDir)) {
MapTool.showWarning("msg.warning.savePropToInstallDir");
} else {
tryAgain = false;
}
}

File selectedFile = chooser.getSelectedFile();
File selectedFile = fileChooser.getSelectedFile();
if (selectedFile.exists()) {
if (selectedFile.getName().endsWith(".rpgame")) {
if (!MapTool.confirm("Import into game settings file?")) {
Expand All @@ -445,7 +445,7 @@ private void initExportButton() {
}
try {
if (selectedFile.getName().endsWith(".mtprops")) {
PersistenceUtil.saveCampaignProperties(campaign, chooser.getSelectedFile());
PersistenceUtil.saveCampaignProperties(campaign, fileChooser.getSelectedFile());
MapTool.showInformation("Properties Saved.");
} else {
MapTool.showMessage(
Expand All @@ -454,8 +454,9 @@ private void initExportButton() {
JOptionPane.INFORMATION_MESSAGE);
CampaignPropertiesDto campaignPropertiesDto =
MapTool.getCampaign().getCampaignProperties().toDto();
FileOutputStream fos = new FileOutputStream(chooser.getSelectedFile());
FileOutputStream fos = new FileOutputStream(fileChooser.getSelectedFile());
fos.write(JsonFormat.printer().print(campaignPropertiesDto).getBytes());
fos.close();
}

} catch (IOException ioe) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,9 @@
# anything with braces):
# http://download.oracle.com/javase/7/docs/api/java/text/MessageFormat.html
# Localization contributed by David Herman ("aku" on forums.rptools.net)

ApplicationName = MapTool

ActivityMonitorPanel.colorDefinition = Green\:Sending, Red\:Receiving

AppHomeDiskSpaceStatusBar.toolTip = Current free space in users home directory.
Expand Down

0 comments on commit e43e204

Please sign in to comment.