Skip to content

Commit

Permalink
Save windows locations in JSON application configuration
Browse files Browse the repository at this point in the history
  • Loading branch information
Borewit committed Feb 26, 2023
1 parent 688464e commit 19daed5
Show file tree
Hide file tree
Showing 9 changed files with 151 additions and 82 deletions.
2 changes: 2 additions & 0 deletions src/main/java/listfix/config/IAppOptions.java
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,6 @@ public interface IAppOptions extends IPlaylistOptions
* @return configured application font
*/
Font getAppFont();

IApplicationState getApplicationState();
}
3 changes: 3 additions & 0 deletions src/main/java/listfix/config/IApplicationConfiguration.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,7 @@ public interface IApplicationConfiguration
IAppOptions getAppOptions();

IMediaLibrary getMediaLibrary();

IApplicationState getApplicationState();

}
13 changes: 13 additions & 0 deletions src/main/java/listfix/config/IApplicationState.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package listfix.config;

import listfix.json.JsonFrameSettings;

import java.util.TreeMap;
import java.util.TreeSet;

public interface IApplicationState
{
TreeSet<String> getPlaylistsOpened();

TreeMap<String, JsonFrameSettings> getFramePositions();
}
12 changes: 9 additions & 3 deletions src/main/java/listfix/controller/ListFixController.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public final class ListFixController implements IApplicationConfiguration

public static final boolean FILE_SYSTEM_IS_CASE_SENSITIVE = File.separatorChar == '/';

private final Logger _logger = LogManager.getLogger(ListFixController.class);
private final Logger logger = LogManager.getLogger(ListFixController.class);
private static ListFixController _instance;

/**
Expand All @@ -43,7 +43,7 @@ private ListFixController()

String oldPlaylistDirectory = this.applicationOptionsConfiguration.getConfig().getPlaylistsDirectory();
if (this.applicationOptionsConfiguration.getConfig().getPlaylistDirectories().isEmpty() && oldPlaylistDirectory != null && !oldPlaylistDirectory.isEmpty()) {
_logger.error(String.format("Migrating playlists directory: %s", oldPlaylistDirectory));
this.logger.error(String.format("Migrating playlists directory: %s", oldPlaylistDirectory));
this.applicationOptionsConfiguration.getConfig().getPlaylistDirectories().add(oldPlaylistDirectory);
this.mediaLibraryConfiguration.writeOnBackground();
}
Expand All @@ -60,7 +60,7 @@ private ListFixController()
showMediaDirWindow = true;

// This happens by design the first time the app is executed, so to minimize confusion, we disable console logging when we distribute listFix()
this._logger.error("Error initializing", e);
this.logger.error("Error initializing", e);
}
}

Expand All @@ -86,6 +86,12 @@ public IMediaLibrary getMediaLibrary()
return this.mediaLibraryConfiguration.getConfig();
}

@Override
public IApplicationState getApplicationState()
{
return this.applicationOptionsConfiguration.getConfig().getApplicationState();
}

public MediaLibraryConfiguration getMediaLibraryConfiguration()
{
return this.mediaLibraryConfiguration;
Expand Down
19 changes: 15 additions & 4 deletions src/main/java/listfix/json/JsonAppOptions.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import listfix.config.IAppOptions;
import listfix.config.IApplicationState;
import listfix.io.Constants;
import listfix.io.IPlaylistOptions;
import listfix.util.OperatingSystem;
Expand All @@ -22,20 +23,20 @@ public class JsonAppOptions implements IPlaylistOptions, IAppOptions
private int maxPlaylistHistoryEntries = 5;
private String lookAndFeel = OperatingSystem.isWindows() ? com.jgoodies.looks.windows.WindowsLookAndFeel.class.getName() : UIManager.getSystemLookAndFeelClassName();


@Deprecated // Replaced by playlistDirectories
private String playlistsDirectory;

private final TreeSet<String> playlistDirectories;
private final TreeSet<String> playlistDirectories = new TreeSet<>();

@JsonSerialize(using = JsonFontSerializer.class)
@JsonDeserialize(using = JsonFontDeserializer.class)
private Font appFont = new Font("SansSerif", Font.PLAIN, 11);
private int maxClosestResults = 20;
private String ignoredSmallWords = "an, and, dsp, in, my, of, the, to";
private boolean caseInsensitiveExactMatching = !Constants.FILE_SYSTEM_IS_CASE_SENSITIVE;

public JsonAppOptions() {
this.playlistDirectories = new TreeSet<>();
}
private JsonApplicationState applicationState = new JsonApplicationState();

public boolean getAutoLocateEntriesOnPlaylistLoad()
{
Expand Down Expand Up @@ -117,6 +118,7 @@ public Set<String> getPlaylistDirectories() {
/**
* @return The appFont
*/
@Override
public Font getAppFont()
{
return appFont;
Expand All @@ -133,6 +135,7 @@ public void setAppFont(Font appFont)
/**
* @return The maxClosestResults
*/
@Override
public int getMaxClosestResults()
{
return maxClosestResults;
Expand All @@ -149,6 +152,7 @@ public void setMaxClosestResults(int maxClosestResults)
/**
* @return The ignoredSmallWords
*/
@Override
public String getIgnoredSmallWords()
{
return ignoredSmallWords;
Expand All @@ -165,6 +169,7 @@ public void setIgnoredSmallWords(String ignoredSmallWords)
/**
* @return The caseInsensitiveExactMatching
*/
@Override
public boolean getCaseInsensitiveExactMatching()
{
return caseInsensitiveExactMatching;
Expand All @@ -177,4 +182,10 @@ public void setCaseInsensitiveExactMatching(boolean caseInsensitiveExactMatching
{
this.caseInsensitiveExactMatching = caseInsensitiveExactMatching;
}

@Override
public IApplicationState getApplicationState()
{
return this.applicationState;
}
}
32 changes: 32 additions & 0 deletions src/main/java/listfix/json/JsonApplicationState.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package listfix.json;

import listfix.config.IApplicationState;

import java.util.TreeMap;
import java.util.TreeSet;

public class JsonApplicationState implements IApplicationState
{
/**
* Keep track of playlist opened
*/
private final TreeSet<String> playlistsOpened = new TreeSet<>();

/**
* Keep track of frame positions
*/

private final TreeMap<String, JsonFrameSettings> framePositions = new TreeMap<>();

@Override
public TreeSet<String> getPlaylistsOpened()
{
return playlistsOpened;
}

@Override
public TreeMap<String, JsonFrameSettings> getFramePositions()
{
return this.framePositions;
}
}
9 changes: 9 additions & 0 deletions src/main/java/listfix/json/JsonFrameSettings.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package listfix.json;

public class JsonFrameSettings
{
public int x;
public int y;
public int width;
public int height;
}
12 changes: 10 additions & 2 deletions src/main/java/listfix/view/GUIScreen.java
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,8 @@ public void treeStructureChanged(TreeModelEvent e)
});

// Load the position the window was in when it was last closed.
WindowSaver.getInstance().loadSettings(this);
WindowSaver windowSaver = new WindowSaver(this._listFixController.getApplicationState());
windowSaver.loadSettings(this);

// Set the position of the divider in the left split pane.
_leftSplitPane.setDividerLocation(.7);
Expand Down Expand Up @@ -2012,7 +2013,14 @@ private void confirmCloseApp()
}
}

WindowSaver.getInstance().saveSettings();
try
{
this._listFixController.getApplicationConfiguration().write();
}
catch (IOException e)
{
_logger.error("Failed to save application settings", e);
}
System.exit(0);
}

Expand Down
131 changes: 58 additions & 73 deletions src/main/java/listfix/view/support/WindowSaver.java
Original file line number Diff line number Diff line change
@@ -1,44 +1,26 @@


package listfix.view.support;

import listfix.io.Constants;
import listfix.config.IApplicationState;
import listfix.json.JsonFrameSettings;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import javax.swing.*;
import java.awt.*;
import java.awt.event.AWTEventListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;

public final class WindowSaver implements AWTEventListener
{
private static final String PROP_FILE = Constants.DATA_DIR + "position.ini";
private static WindowSaver saver;
private Map framemap;
private static final Logger _logger = LogManager.getLogger(WindowSaver.class);
private IApplicationState applicationState;

private WindowSaver()
{
framemap = new HashMap();
}
private static final Logger _logger = LogManager.getLogger(WindowSaver.class);

public static WindowSaver getInstance()
public WindowSaver(IApplicationState applicationState)
{
if (saver == null)
{
saver = new WindowSaver();
}
return saver;
this.applicationState = applicationState;
}

@Override
Expand All @@ -62,63 +44,66 @@ public void eventDispatched(AWTEvent evt)
}
}

public void loadSettings(JFrame frame)
private JsonFrameSettings getFrameSettingsForFrame(Frame frame)
{
Properties settings = new Properties();
String name = frame.getName();
if ((new File(PROP_FILE)).exists())
final String name = frame.getName();
JsonFrameSettings frameSettings = applicationState.getFramePositions().get(name);
if (frameSettings == null)
{
try
{
settings.load(new FileInputStream(PROP_FILE));
int x = getInt(settings, name + ".x", 100);
int y = getInt(settings, name + ".y", 100);
int w = getInt(settings, name + ".w", 500);
int h = getInt(settings, name + ".h", 500);
frame.setLocation(x, y);
frame.setSize(new Dimension(w, h));
}
catch (IOException ex)
{
_logger.info(ex);
}
saver.framemap.put(name, frame);
frame.validate();
// Inialize frame settings with default values;
frameSettings = new JsonFrameSettings();
frameSettings.x = 250;
frameSettings.y = 250;
frameSettings.width = 500;
frameSettings.height = 500;
applicationState.getFramePositions().put(name, frameSettings);
}
return frameSettings;
}

public int getInt(Properties props, String name, int value)
public void loadSettings(Frame frame)
{
String v = props.getProperty(name);
if (v == null)
JsonFrameSettings frameSettings = getFrameSettingsForFrame(frame);
frame.setLocation(frameSettings.x, frameSettings.y);
frame.setSize(new Dimension(frameSettings.width, frameSettings.height));
frame.validate();

frame.addComponentListener(new ComponentListener()
{
return value;
}
return Integer.parseInt(v);
}
@Override
public void componentResized(ComponentEvent e)
{
if (e.getComponent() instanceof Frame)
{
Frame frame = (Frame) e.getComponent();
JsonFrameSettings frameSettings = WindowSaver.this.getFrameSettingsForFrame(frame);
frameSettings.width = frame.getWidth();
frameSettings.height = frame.getHeight();
}
}

public void saveSettings()
{
Properties settings = new Properties();
@Override
public void componentMoved(ComponentEvent e)
{
if (e.getComponent() instanceof Frame)
{
Frame frame = (Frame) e.getComponent();
JsonFrameSettings frameSettings = WindowSaver.this.getFrameSettingsForFrame(frame);
frameSettings.x = frame.getX();
frameSettings.y = frame.getY();
}
}

Iterator it = saver.framemap.keySet().iterator();
while (it.hasNext())
{
String name = (String) it.next();
JFrame frame = (JFrame) saver.framemap.get(name);
settings.setProperty(name + ".x", "" + frame.getX());
settings.setProperty(name + ".y", "" + frame.getY());
settings.setProperty(name + ".w", "" + frame.getWidth());
settings.setProperty(name + ".h", "" + frame.getHeight());
}
try
{
settings.store(new FileOutputStream(PROP_FILE), null);
}
catch (IOException e)
{
throw new RuntimeException(e);
}
@Override
public void componentShown(ComponentEvent e)
{
}

@Override
public void componentHidden(ComponentEvent e)
{
}
});
}

}

0 comments on commit 19daed5

Please sign in to comment.