better save/restore handling

This commit is contained in:
Denis Molony 2019-10-12 12:47:21 +10:00
parent a2f6839aac
commit 9be53fe921
8 changed files with 135 additions and 49 deletions

View File

@ -211,6 +211,16 @@ public class ApplesoftBasicProgram extends BasicProgram
alignPos = 0;
}
int ptr = endPtr + 2;
if (ptr < buffer.length)
{
int offset = HexFormatter.unsignedShort (buffer, 0);
int programLoadAddress = offset - getLineLength (0);
fullText.append ("\nExtra data:\n\n");
fullText.append (HexFormatter.formatNoHeader (buffer, ptr, buffer.length - ptr,
programLoadAddress + ptr));
}
if (fullText.length () > 0)
fullText.deleteCharAt (fullText.length () - 1); // remove last newline

View File

@ -277,6 +277,9 @@ public class AssemblerProgram extends AbstractFile
if ((buffer[ptr] & 0x80) != 0) // hi bit set
continue;
if (buffer[ptr] == 0x0D) // CR
continue;
if (ptr - start > 3)
stringLocations.add (new StringLocation (start, ptr - 1));

View File

@ -55,15 +55,15 @@ class CatalogPanel extends JTabbedPane
private CloseTabAction closeTabAction;
private final RootFolderData rootFolderData = new RootFolderData ();
public CatalogPanel (RedoHandler redoHandler, Preferences prefs)
public CatalogPanel (RedoHandler redoHandler)
{
this.redoHandler = redoHandler;
setTabPlacement (SwingConstants.BOTTOM);
setPreferredSize (new Dimension (360, 802)); // width, height
createTabs (prefs);
addChangeListener (new TabChangeListener ());
// createTabs (prefs);
// addChangeListener (new TabChangeListener ());
}
RootFolderData getRootFolderData ()
@ -84,6 +84,7 @@ class CatalogPanel extends JTabbedPane
rootFolderData.setRootFolder (rootDirectoryFile);
// move to restore()
String lastDiskUsed = prefs.get (prefsLastDiskUsed, "");
int lastDosUsed = prefs.getInt (prefsLastDosUsed, -1);
String lastFileUsed = prefs.get (prefsLastFileUsed, "");
@ -307,8 +308,10 @@ class CatalogPanel extends JTabbedPane
}
@Override
public void restore (Preferences preferences)
public void restore (Preferences prefs)
{
createTabs (prefs);
addChangeListener (new TabChangeListener ());
}
// Pass through to DiskSelector

View File

@ -5,7 +5,6 @@ import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.util.Enumeration;
import java.util.List;
import java.util.prefs.Preferences;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
@ -26,18 +25,18 @@ class DataPanel extends JTabbedPane
private static final int TEXT_WIDTH = 65;
private static final int BACKGROUND = 245;
JTextArea hexText;
JTextArea disassemblyText;
private final JTextArea formattedText;
private final JTextArea hexText;
private final JTextArea disassemblyText;
// these two panes are interchangeable
JScrollPane formattedPane;
JScrollPane imagePane;
private final JScrollPane formattedPane;
private final JScrollPane imagePane;
JTextArea formattedText;
ImagePanel imagePanel; // internal class
boolean debugMode;
private final ImagePanel imagePanel; // internal class
private boolean debugMode;
boolean imageVisible = false;
private boolean imageVisible = false;
// used to determine whether the text has been set
boolean formattedTextValid;
@ -47,14 +46,14 @@ class DataPanel extends JTabbedPane
final MenuHandler menuHandler;
public DataPanel (MenuHandler mh, Preferences prefs)
public DataPanel (MenuHandler mh)
{
this.menuHandler = mh;
setTabPlacement (SwingConstants.BOTTOM);
formattedText = new JTextArea (10, TEXT_WIDTH);
formattedPane = setPanel (formattedText, "Formatted");
formattedText.setLineWrap (prefs.getBoolean (MenuHandler.PREFS_LINE_WRAP, true));
// formattedText.setLineWrap (prefs.getBoolean (MenuHandler.PREFS_LINE_WRAP, true));
formattedText.setText ("Please use the 'File->Set HOME folder...' command to "
+ "\ntell DiskBrowser where your Apple disks are located."
+ "\n\nTo see the contents of a disk in more detail, double-click"
@ -165,6 +164,11 @@ class DataPanel extends JTabbedPane
return palette;
}
void setLineWrap (boolean lineWrap)
{
formattedText.setLineWrap (lineWrap);
}
public void setColourQuirks (boolean value)
{
if (currentDataSource instanceof HiResImage)

View File

@ -12,8 +12,6 @@ import java.util.prefs.Preferences;
import javax.swing.*;
import com.bytezone.common.Platform;
import com.bytezone.common.State;
import com.bytezone.diskbrowser.duplicates.RootFolderData;
public class DiskBrowser extends JFrame implements DiskSelectionListener, QuitListener
@ -23,19 +21,21 @@ public class DiskBrowser extends JFrame implements DiskSelectionListener, QuitLi
private final Preferences prefs = Preferences.userNodeForPackage (this.getClass ());
private WindowSaver windowSaver;
private static final String OS = System.getProperty ("os.name").toLowerCase ();
private static final boolean MAC = OS.startsWith ("mac os");
public DiskBrowser ()
{
super (windowTitle);
if (args.length > 0 && "-reset".equals (args[0]))
{
State state = new State (prefs);
state.clear ();
WindowState windowState = new WindowState (prefs);
windowState.clear ();
}
JToolBar toolBar = new JToolBar ("Toolbar", JToolBar.HORIZONTAL);
MenuHandler menuHandler = new MenuHandler (prefs);
// menuHandler.restore (prefs); // early !!
MenuHandler menuHandler = new MenuHandler ();
setJMenuBar (menuHandler.menuBar);
setLayout (new BorderLayout ());
@ -46,11 +46,11 @@ public class DiskBrowser extends JFrame implements DiskSelectionListener, QuitLi
toolBar.addSeparator ();
// create and add the left-hand catalog panel
CatalogPanel catalogPanel = new CatalogPanel (redoHandler, prefs);
CatalogPanel catalogPanel = new CatalogPanel (redoHandler);
JPanel catalogBorderPanel = addPanel (catalogPanel, "Catalog", BorderLayout.WEST);
// create and add the centre output panel
DataPanel dataPanel = new DataPanel (menuHandler, prefs);
DataPanel dataPanel = new DataPanel (menuHandler);
addPanel (dataPanel, "Output", BorderLayout.CENTER);
// create and add the right-hand disk layout panel
@ -161,6 +161,7 @@ public class DiskBrowser extends JFrame implements DiskSelectionListener, QuitLi
// restore the menuHandler items before they are referenced
fireRestoreEvent ();
diskLayoutPanel.setFree (menuHandler.showFreeSectorsItem.isSelected ());
dataPanel.setLineWrap (menuHandler.lineWrapItem.isSelected ());
// Remove the two optional panels if they were previously hidden
if (!menuHandler.showLayoutItem.isSelected ())
@ -213,12 +214,30 @@ public class DiskBrowser extends JFrame implements DiskSelectionListener, QuitLi
@Override
public void run ()
{
Platform.setLookAndFeel ();
setLookAndFeel ();
new DiskBrowser ().setVisible (true);
}
});
}
private static void setLookAndFeel ()
{
try
{
if (MAC)
{
UIManager.setLookAndFeel (UIManager.getSystemLookAndFeelClassName ());
System.setProperty ("apple.laf.useScreenMenuBar", "true");
}
else
UIManager.setLookAndFeel ("javax.swing.plaf.nimbus.NimbusLookAndFeel");
}
catch (Exception e)
{
e.printStackTrace ();
}
}
List<QuitListener> quitListeners = new ArrayList<> ();
public void addQuitListener (QuitListener listener)

View File

@ -10,7 +10,6 @@ import java.util.prefs.Preferences;
import javax.swing.*;
import com.bytezone.common.EnvironmentAction;
import com.bytezone.common.FontAction;
import com.bytezone.diskbrowser.applefile.*;
import com.bytezone.diskbrowser.disk.DataDisk;
@ -65,7 +64,7 @@ public class MenuHandler
JMenu applesoftMenu = new JMenu ("Applesoft");
JMenu assemblerMenu = new JMenu ("Assembler");
JMenu prodosMenu = new JMenu ("Prodos");
JMenu helpMenu = new JMenu ("Help");
// JMenu helpMenu = new JMenu ("Help");
// File menu items
final JMenuItem rootItem = new JMenuItem ("Set root folder...");
@ -115,7 +114,7 @@ public class MenuHandler
ButtonGroup paletteGroup = new ButtonGroup ();
public MenuHandler (Preferences prefs)
public MenuHandler ()
{
menuBar.add (fileMenu);
menuBar.add (formatMenu);
@ -123,7 +122,7 @@ public class MenuHandler
menuBar.add (applesoftMenu);
menuBar.add (assemblerMenu);
menuBar.add (prodosMenu);
menuBar.add (helpMenu);
// menuBar.add (helpMenu);
fileMenu.add (rootItem);
fileMenu.addSeparator ();
@ -235,7 +234,7 @@ public class MenuHandler
prodosSortDirectoriesItem.addActionListener (prodosPreferencesAction);
helpMenu.add (new JMenuItem (new EnvironmentAction ()));
// helpMenu.add (new JMenuItem (new EnvironmentAction ()));
sector256Item.setActionCommand ("256");
sector256Item.setAccelerator (KeyStroke.getKeyStroke ("alt 4"));
@ -256,12 +255,13 @@ public class MenuHandler
// this is done early because the CatalogPanel creates the previous disk used
// before restore() is called
prodosSortDirectoriesItem
.setSelected (prefs.getBoolean (PREFS_PRODOS_SORT_DIRECTORIES, true));
// what about all the other preferences???
// prodosSortDirectoriesItem
// .setSelected (prefs.getBoolean (PREFS_PRODOS_SORT_DIRECTORIES, true));
setBasicPreferences ();
setAssemblerPreferences ();
setProdosPreferences ();
// setBasicPreferences ();
// setAssemblerPreferences ();
// setProdosPreferences ();
}
private void setBasicPreferences ()
@ -334,10 +334,10 @@ public class MenuHandler
listener.setProdosPreferences (prodosPreferences);
}
void addHelpMenuAction (Action action, String functionName)
{
helpMenu.add (new JMenuItem (action));
}
// void addHelpMenuAction (Action action, String functionName)
// {
// helpMenu.add (new JMenuItem (action));
// }
private void addLauncherMenu ()
{
@ -417,12 +417,12 @@ public class MenuHandler
showAssemblerHeaderItem
.setSelected (prefs.getBoolean (PREFS_SHOW_ASSEMBLER_HEADER, true));
// prodosSortDirectoriesItem
// .setSelected (prefs.getBoolean (PREFS_PRODOS_SORT_DIRECTORIES, true));
prodosSortDirectoriesItem
.setSelected (prefs.getBoolean (PREFS_PRODOS_SORT_DIRECTORIES, true));
// setBasicPreferences ();
// setAssemblerPreferences ();
// setProdosPreferences ();
setBasicPreferences ();
setAssemblerPreferences ();
setProdosPreferences ();
int paletteIndex = prefs.getInt (PREFS_PALETTE, 0);
PaletteFactory paletteFactory = HiResImage.getPaletteFactory ();

View File

@ -24,8 +24,6 @@ public class WindowSaver
prefs.putInt (key + "Y", frame.getY ());
prefs.putInt (key + "Height", frame.getHeight ());
prefs.putInt (key + "Width", frame.getWidth ());
// System.out.printf ("Saving x:%d, y:%d, w:%d, h:%d%n", frame.getX (), frame.getY (),
// frame.getWidth (), frame.getHeight ());
}
public boolean restoreWindow ()
@ -37,22 +35,19 @@ public class WindowSaver
Dimension screen = java.awt.Toolkit.getDefaultToolkit ().getScreenSize ();
if (width < 0) // nothing to restore
if (width < 0) // nothing to restore
{
frame.setLocation (100, 100);
frame.setSize (1000, 600);
frame.setLocationRelativeTo (null); // centre
// System.out.printf ("Creating x:%d, y:%d, w:%d, h:%d%n", x, y, width, height);
return false;
}
// System.out.printf ("w:%d, sw:%f%n", width, screen.getWidth ());
if (width > screen.getWidth () - 15)
width = (int) (screen.getWidth () - 15);
frame.setSize (width, height);
frame.setLocation (x, y);
// System.out.printf ("Restoring x:%d, y:%d, w:%d, h:%d%n", x, y, width, height);
return true;
}

View File

@ -0,0 +1,52 @@
package com.bytezone.diskbrowser.gui;
import java.awt.Dimension;
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
import javax.swing.JFrame;
class WindowState
{
private static final String PREF_WINDOW_WIDTH = "WindowWidth";
private static final String PREF_WINDOW_HEIGHT = "WindowHeight";
private static final String PREF_WINDOW_STATE = "WindowExtendedState";
public Preferences preferences;
public WindowState (Preferences preferences)
{
this.preferences = preferences;
}
public void clear ()
{
try
{
preferences.clear ();
}
catch (BackingStoreException e)
{
e.printStackTrace ();
}
}
public Dimension getWindowSize (int defaultWidth, int defaultHeight)
{
int width = preferences.getInt (PREF_WINDOW_WIDTH, defaultWidth);
int height = preferences.getInt (PREF_WINDOW_HEIGHT, defaultHeight);
return new Dimension (width, height);
}
public int getExtendedState (int defaultState)
{
return preferences.getInt (PREF_WINDOW_STATE, defaultState);
}
public void save (JFrame window)
{
preferences.putInt (PREF_WINDOW_WIDTH, window.getWidth ());
preferences.putInt (PREF_WINDOW_HEIGHT, window.getHeight ());
preferences.putInt (PREF_WINDOW_STATE, window.getExtendedState ());
}
}