cursor movement

This commit is contained in:
Denis Molony 2016-03-01 19:51:15 +11:00
parent fade0a4d7d
commit 49af924340
7 changed files with 72 additions and 80 deletions

View File

@ -1,10 +1,10 @@
package com.bytezone.diskbrowser.gui; package com.bytezone.diskbrowser.gui;
/*********************************************************************************************** /*****************************************************************************************
* JPanel used to display a scrolling JTree containing details of a single disk. The JTree * JPanel used to display a scrolling JTree containing details of a single disk. The JTree
* consists entirely of AppleFileSource objects. Any number of these objects are contained * consists entirely of AppleFileSource objects. Any number of these objects are contained
* in Catalog Panel, along with a single FileSystemTab. * in Catalog Panel, along with a single FileSystemTab.
***********************************************************************************************/ ****************************************************************************************/
import java.awt.Font; import java.awt.Font;
import java.util.Enumeration; import java.util.Enumeration;
@ -23,29 +23,27 @@ class AppleDiskTab extends AbstractTab
{ {
FormattedDisk disk; FormattedDisk disk;
public AppleDiskTab (FormattedDisk disk, DiskAndFileSelector selector, RedoHandler navMan, public AppleDiskTab (FormattedDisk disk, DiskAndFileSelector selector,
Font font, FileSelectedEvent event) RedoHandler redoHandler, Font font, FileSelectedEvent event)
{ {
super (navMan, selector, font); super (redoHandler, selector, font);
create (disk); create (disk);
navMan.fileSelected (event); redoHandler.fileSelected (event);
// System.out.println ("restoring a previous disk with a file selected");
} }
public AppleDiskTab (FormattedDisk disk, DiskAndFileSelector selector, RedoHandler navMan, public AppleDiskTab (FormattedDisk disk, DiskAndFileSelector selector,
Font font, SectorSelectedEvent event) RedoHandler redoHandler, Font font, SectorSelectedEvent event)
{ {
super (navMan, selector, font); super (redoHandler, selector, font);
create (disk); create (disk);
navMan.sectorSelected (event); redoHandler.sectorSelected (event);
// System.out.println ("restoring a previous disk with a sector selected");
} }
// This constructor is only called when lastFileUsed is not null, but the disk // This constructor is only called when lastFileUsed is not null, but the disk
// couldn't find the file entry. Either the file has been deleted, or it is a disk // couldn't find the file entry. Either the file has been deleted, or it is a disk
// with redefined files (Wizardry, Infocom etc). // with redefined files (Wizardry, Infocom etc).
public AppleDiskTab (FormattedDisk disk, DiskAndFileSelector selector, RedoHandler navMan, public AppleDiskTab (FormattedDisk disk, DiskAndFileSelector selector,
Font font, String lastFileUsed) RedoHandler navMan, Font font, String lastFileUsed)
{ {
super (navMan, selector, font); super (navMan, selector, font);
create (disk); create (disk);
@ -60,8 +58,8 @@ class AppleDiskTab extends AbstractTab
} }
// User is selecting a new disk from the catalog // User is selecting a new disk from the catalog
public AppleDiskTab (FormattedDisk disk, DiskAndFileSelector selector, RedoHandler navMan, public AppleDiskTab (FormattedDisk disk, DiskAndFileSelector selector,
Font font) RedoHandler navMan, Font font)
{ {
super (navMan, selector, font); super (navMan, selector, font);
create (disk); create (disk);

View File

@ -35,8 +35,8 @@ import com.bytezone.diskbrowser.gui.RedoHandler.RedoEvent;
import com.bytezone.diskbrowser.gui.RedoHandler.RedoListener; import com.bytezone.diskbrowser.gui.RedoHandler.RedoListener;
import com.bytezone.diskbrowser.gui.TreeBuilder.FileNode; import com.bytezone.diskbrowser.gui.TreeBuilder.FileNode;
class CatalogPanel extends JTabbedPane implements RedoListener, SectorSelectionListener, class CatalogPanel extends JTabbedPane
QuitListener, FontChangeListener implements RedoListener, SectorSelectionListener, QuitListener, FontChangeListener
// PreferenceChangeListener // PreferenceChangeListener
{ {
private static final String prefsLastDiskUsed = "Last disk used"; private static final String prefsLastDiskUsed = "Last disk used";
@ -50,11 +50,11 @@ class CatalogPanel extends JTabbedPane implements RedoListener, SectorSelectionL
private final List<AppleDiskTab> diskTabs = new ArrayList<AppleDiskTab> (); private final List<AppleDiskTab> diskTabs = new ArrayList<AppleDiskTab> ();
private final DocumentCreatorFactory lister; private final DocumentCreatorFactory lister;
private final DiskAndFileSelector selector = new DiskAndFileSelector (); private final DiskAndFileSelector selector = new DiskAndFileSelector ();
private final RedoHandler navMan; private final RedoHandler redoHandler;
private DuplicateAction duplicateAction; // this sux private DuplicateAction duplicateAction; // this sux
private CloseTabAction closeTabAction; private CloseTabAction closeTabAction;
public CatalogPanel (MenuHandler mh, RedoHandler navMan, Preferences prefs) public CatalogPanel (MenuHandler mh, RedoHandler redoHandler, Preferences prefs)
{ {
// String catalogFontName = // String catalogFontName =
// prefs.get (PreferencesDialog.prefsCatalogFont, PreferencesDialog.defaultFontName); // prefs.get (PreferencesDialog.prefsCatalogFont, PreferencesDialog.defaultFontName);
@ -63,7 +63,7 @@ class CatalogPanel extends JTabbedPane implements RedoListener, SectorSelectionL
// PreferencesDialog.defaultFontSize); // PreferencesDialog.defaultFontSize);
// this.font = new Font (catalogFontName, Font.PLAIN, catalogFontSize); // this.font = new Font (catalogFontName, Font.PLAIN, catalogFontSize);
this.lister = new DocumentCreatorFactory (mh); this.lister = new DocumentCreatorFactory (mh);
this.navMan = navMan; this.redoHandler = redoHandler;
selector.addDiskSelectionListener (lister.diskLister); selector.addDiskSelectionListener (lister.diskLister);
@ -113,8 +113,9 @@ class CatalogPanel extends JTabbedPane implements RedoListener, SectorSelectionL
else else
System.out.println ("no disk selected"); System.out.println ("no disk selected");
fileTab = new FileSystemTab (rootDirectoryFile, selector, navMan, font, diskEvent); fileTab =
fileTab.addTreeMouseListener (new MouseListener ()); // listen for disk selection new FileSystemTab (rootDirectoryFile, selector, redoHandler, font, diskEvent);
fileTab.addTreeMouseListener (new MouseListener ()); // listen for disk selection
lister.catalogLister.setNode (fileTab.getRootNode ()); lister.catalogLister.setNode (fileTab.getRootNode ());
insertTab ("Disk Tree", null, fileTab, "Display Apple disks", 0); insertTab ("Disk Tree", null, fileTab, "Display Apple disks", 0);
@ -129,19 +130,19 @@ class CatalogPanel extends JTabbedPane implements RedoListener, SectorSelectionL
if (afs != null) if (afs != null)
{ {
FileSelectedEvent fileEvent = FileSelectedEvent.create (this, afs); FileSelectedEvent fileEvent = FileSelectedEvent.create (this, afs);
tab = new AppleDiskTab (fd, selector, navMan, font, fileEvent); tab = new AppleDiskTab (fd, selector, redoHandler, font, fileEvent);
} }
else else
tab = new AppleDiskTab (fd, selector, navMan, font, lastFileUsed); tab = new AppleDiskTab (fd, selector, redoHandler, font, lastFileUsed);
} }
else if (!lastSectorsUsed.isEmpty ()) else if (!lastSectorsUsed.isEmpty ())
{ {
SectorSelectedEvent sectorEvent = SectorSelectedEvent sectorEvent =
SectorSelectedEvent.create (this, fd, lastSectorsUsed); SectorSelectedEvent.create (this, fd, lastSectorsUsed);
tab = new AppleDiskTab (fd, selector, navMan, font, sectorEvent); tab = new AppleDiskTab (fd, selector, redoHandler, font, sectorEvent);
} }
else else
tab = new AppleDiskTab (fd, selector, navMan, font); tab = new AppleDiskTab (fd, selector, redoHandler, font);
if (tab != null) if (tab != null)
{ {
@ -185,7 +186,7 @@ class CatalogPanel extends JTabbedPane implements RedoListener, SectorSelectionL
// try // try
// { // {
// This might throw a NoDisksFoundException // This might throw a NoDisksFoundException
FileSystemTab newFileTab = new FileSystemTab (root, selector, navMan, font); FileSystemTab newFileTab = new FileSystemTab (root, selector, redoHandler, font);
// is the user replacing an existing root folder? // is the user replacing an existing root folder?
if (fileTab != null) if (fileTab != null)
@ -220,7 +221,7 @@ class CatalogPanel extends JTabbedPane implements RedoListener, SectorSelectionL
tabNo++; tabNo++;
} }
AppleDiskTab tab = new AppleDiskTab (disk, selector, navMan, font); AppleDiskTab tab = new AppleDiskTab (disk, selector, redoHandler, font);
diskTabs.add (tab); diskTabs.add (tab);
add (tab, "D" + diskTabs.size ()); add (tab, "D" + diskTabs.size ());
if (activate) if (activate)
@ -324,6 +325,11 @@ class CatalogPanel extends JTabbedPane implements RedoListener, SectorSelectionL
} }
} }
@Override
public void restore (Preferences preferences)
{
}
// Pass through to DiskSelector // Pass through to DiskSelector
public void addDiskSelectionListener (DiskSelectionListener listener) public void addDiskSelectionListener (DiskSelectionListener listener)
{ {
@ -368,7 +374,7 @@ class CatalogPanel extends JTabbedPane implements RedoListener, SectorSelectionL
TreePath tp = tree.getPathForLocation (e.getX (), e.getY ()); TreePath tp = tree.getPathForLocation (e.getX (), e.getY ());
DefaultMutableTreeNode selectedNode = DefaultMutableTreeNode selectedNode =
(DefaultMutableTreeNode) tp.getLastPathComponent (); (DefaultMutableTreeNode) tp.getLastPathComponent ();
FileNode node = (FileNode) selectedNode.getUserObject (); FileNode node = (FileNode) selectedNode.getUserObject ();
if (node.file.isDirectory ()) if (node.file.isDirectory ())
lister.catalogLister.setNode (selectedNode); lister.catalogLister.setNode (selectedNode);
@ -431,11 +437,6 @@ class CatalogPanel extends JTabbedPane implements RedoListener, SectorSelectionL
// tab.setTreeFont (font); // tab.setTreeFont (font);
// } // }
@Override
public void restore (Preferences preferences)
{
}
@Override @Override
public void changeFont (FontChangeEvent fontChangeEvent) public void changeFont (FontChangeEvent fontChangeEvent)
{ {

View File

@ -126,6 +126,9 @@ public class DiskBrowser extends JFrame implements DiskSelectionListener, QuitLi
// prefs.addPreferenceChangeListener (catalogPanel); // prefs.addPreferenceChangeListener (catalogPanel);
// prefs.addPreferenceChangeListener (dataPanel); // prefs.addPreferenceChangeListener (dataPanel);
// restore the menuHandler items before they are referenced
quitAction.restore ();
// Remove the two optional panels if they were previously hidden // Remove the two optional panels if they were previously hidden
if (!menuHandler.showLayoutItem.isSelected ()) if (!menuHandler.showLayoutItem.isSelected ())
hideLayoutAction.set (false); hideLayoutAction.set (false);
@ -134,8 +137,6 @@ public class DiskBrowser extends JFrame implements DiskSelectionListener, QuitLi
// activate the highest panel now that the listeners are ready // activate the highest panel now that the listeners are ready
catalogPanel.activate (); catalogPanel.activate ();
quitAction.restore ();
} }
private JPanel addPanel (JComponent pane, String title, String location) private JPanel addPanel (JComponent pane, String title, String location)

View File

@ -212,6 +212,8 @@ class DiskLayoutImage extends JPanel implements Scrollable
setSelection (event.getSectors ()); setSelection (event.getSectors ());
fireSectorSelectionEvent (event); fireSectorSelectionEvent (event);
redo = false; redo = false;
requestFocusInWindow ();
} }
private void fireSectorSelectionEvent () private void fireSectorSelectionEvent ()
@ -251,7 +253,7 @@ class DiskLayoutImage extends JPanel implements Scrollable
case KeyEvent.VK_RIGHT: case KeyEvent.VK_RIGHT:
case KeyEvent.VK_UP: case KeyEvent.VK_UP:
case KeyEvent.VK_DOWN: case KeyEvent.VK_DOWN:
selectionHandler.keyPress (e); selectionHandler.cursorMove (disk.getDisk (), e);
fireSectorSelectionEvent (); fireSectorSelectionEvent ();
repaint (); repaint ();
} }

View File

@ -12,7 +12,6 @@ import com.bytezone.diskbrowser.disk.DiskAddress;
class DiskLayoutSelection implements Iterable<DiskAddress> class DiskLayoutSelection implements Iterable<DiskAddress>
{ {
private final List<DiskAddress> highlights; private final List<DiskAddress> highlights;
private Disk currentDisk;
public DiskLayoutSelection () public DiskLayoutSelection ()
{ {
@ -21,8 +20,6 @@ class DiskLayoutSelection implements Iterable<DiskAddress>
public void doClick (Disk disk, DiskAddress da, boolean extend, boolean append) public void doClick (Disk disk, DiskAddress da, boolean extend, boolean append)
{ {
currentDisk = disk;
/* /*
* Single click without modifiers - just replace previous highlights with the new * Single click without modifiers - just replace previous highlights with the new
* sector. If there are no current highlights then even modifiers have the same * sector. If there are no current highlights then even modifiers have the same
@ -67,7 +64,7 @@ class DiskLayoutSelection implements Iterable<DiskAddress>
Collections.sort (highlights); Collections.sort (highlights);
} }
public void keyPress (KeyEvent e) public void cursorMove (Disk disk, KeyEvent e)
{ {
if (highlights.size () == 0) if (highlights.size () == 0)
{ {
@ -79,8 +76,8 @@ class DiskLayoutSelection implements Iterable<DiskAddress>
DiskAddress last = highlights.get (highlights.size () - 1); DiskAddress last = highlights.get (highlights.size () - 1);
highlights.clear (); highlights.clear ();
int totalBlocks = currentDisk.getTotalBlocks (); int totalBlocks = disk.getTotalBlocks ();
int rowSize = currentDisk.getTrackSize () / currentDisk.getBlockSize (); int rowSize = disk.getTrackSize () / disk.getBlockSize ();
switch (e.getKeyCode ()) switch (e.getKeyCode ())
{ {
@ -88,28 +85,28 @@ class DiskLayoutSelection implements Iterable<DiskAddress>
int block = first.getBlock () - 1; int block = first.getBlock () - 1;
if (block < 0) if (block < 0)
block = totalBlocks - 1; block = totalBlocks - 1;
highlights.add (currentDisk.getDiskAddress (block)); highlights.add (disk.getDiskAddress (block));
break; break;
case KeyEvent.VK_RIGHT: case KeyEvent.VK_RIGHT:
block = last.getBlock () + 1; block = last.getBlock () + 1;
if (block >= totalBlocks) if (block >= totalBlocks)
block = 0; block = 0;
highlights.add (currentDisk.getDiskAddress (block)); highlights.add (disk.getDiskAddress (block));
break; break;
case KeyEvent.VK_UP: case KeyEvent.VK_UP:
block = first.getBlock () - rowSize; block = first.getBlock () - rowSize;
if (block < 0) if (block < 0)
block += totalBlocks; block += totalBlocks;
highlights.add (currentDisk.getDiskAddress (block)); highlights.add (disk.getDiskAddress (block));
break; break;
case KeyEvent.VK_DOWN: case KeyEvent.VK_DOWN:
block = last.getBlock () + rowSize; block = last.getBlock () + rowSize;
if (block >= totalBlocks) if (block >= totalBlocks)
block -= totalBlocks; block -= totalBlocks;
highlights.add (currentDisk.getDiskAddress (block)); highlights.add (disk.getDiskAddress (block));
break; break;
} }
} }

View File

@ -74,7 +74,9 @@ public class MenuHandler
fileMenu.add (rootItem); fileMenu.add (rootItem);
fileMenu.addSeparator (); fileMenu.addSeparator ();
fileMenu.add (refreshTreeItem); fileMenu.add (refreshTreeItem);
addLauncherMenu (); addLauncherMenu ();
fileMenu.add (printItem); fileMenu.add (printItem);
fileMenu.addSeparator (); fileMenu.addSeparator ();
fileMenu.add (closeTabItem); fileMenu.add (closeTabItem);
@ -99,15 +101,21 @@ public class MenuHandler
formatMenu.add (showCatalogItem); formatMenu.add (showCatalogItem);
formatMenu.add (showLayoutItem); formatMenu.add (showLayoutItem);
formatMenu.add (showFreeSectorsItem); formatMenu.add (showFreeSectorsItem);
formatMenu.addSeparator (); formatMenu.addSeparator ();
formatMenu.add (interleave0Item); formatMenu.add (interleave0Item);
formatMenu.add (interleave1Item); formatMenu.add (interleave1Item);
formatMenu.add (interleave2Item); formatMenu.add (interleave2Item);
formatMenu.add (interleave3Item); formatMenu.add (interleave3Item);
formatMenu.addSeparator (); formatMenu.addSeparator ();
formatMenu.add (sector256Item); formatMenu.add (sector256Item);
formatMenu.add (sector512Item); formatMenu.add (sector512Item);
formatMenu.addSeparator (); formatMenu.addSeparator ();
formatMenu.add (colourQuirksItem); formatMenu.add (colourQuirksItem);
formatMenu.add (monochromeItem); formatMenu.add (monochromeItem);
@ -130,14 +138,6 @@ public class MenuHandler
dbItem.setEnabled (false); dbItem.setEnabled (false);
// preferences
lineWrapItem.setSelected (prefs.getBoolean (PREFS_LINE_WRAP, true));
showLayoutItem.setSelected (prefs.getBoolean (PREFS_SHOW_LAYOUT, true));
showCatalogItem.setSelected (prefs.getBoolean (PREFS_SHOW_CATALOG, true));
showFreeSectorsItem.setSelected (prefs.getBoolean (PREFS_SHOW_FREE_SECTORS, false));
colourQuirksItem.setSelected (prefs.getBoolean (PREFS_COLOUR_QUIRKS, false));
monochromeItem.setSelected (prefs.getBoolean (PREFS_MONOCHROME, false));
HiResImage.setDefaultColourQuirks (colourQuirksItem.isSelected ()); HiResImage.setDefaultColourQuirks (colourQuirksItem.isSelected ());
HiResImage.setDefaultMonochrome (monochromeItem.isSelected ()); HiResImage.setDefaultMonochrome (monochromeItem.isSelected ());
} }
@ -197,6 +197,17 @@ public class MenuHandler
prefs.putBoolean (PREFS_MONOCHROME, monochromeItem.isSelected ()); prefs.putBoolean (PREFS_MONOCHROME, monochromeItem.isSelected ());
} }
@Override
public void restore (Preferences prefs)
{
lineWrapItem.setSelected (prefs.getBoolean (PREFS_LINE_WRAP, true));
showLayoutItem.setSelected (prefs.getBoolean (PREFS_SHOW_LAYOUT, true));
showCatalogItem.setSelected (prefs.getBoolean (PREFS_SHOW_CATALOG, true));
showFreeSectorsItem.setSelected (prefs.getBoolean (PREFS_SHOW_FREE_SECTORS, false));
colourQuirksItem.setSelected (prefs.getBoolean (PREFS_COLOUR_QUIRKS, false));
monochromeItem.setSelected (prefs.getBoolean (PREFS_MONOCHROME, false));
}
@Override @Override
public void diskSelected (DiskSelectedEvent event) public void diskSelected (DiskSelectedEvent event)
{ {
@ -258,14 +269,4 @@ public class MenuHandler
((InterleaveAction) interleave3Item.getAction ()).setDisk (currentDisk); ((InterleaveAction) interleave3Item.getAction ()).setDisk (currentDisk);
} }
} }
@Override
public void restore (Preferences prefs)
{
// lineWrapItem.setSelected (prefs.getBoolean (PREFS_LINE_WRAP, true));
// showLayoutItem.setSelected (prefs.getBoolean (PREFS_SHOW_LAYOUT, true));
// showCatalogItem.setSelected (prefs.getBoolean (PREFS_SHOW_CATALOG, true));
// showFreeSectorsItem.setSelected (prefs.getBoolean (PREFS_SHOW_FREE_SECTORS, false));
// colourQuirksItem.setSelected (prefs.getBoolean (PREFS_COLOUR_QUIRKS, false));
}
} }

View File

@ -9,19 +9,11 @@ import java.util.EventListener;
import java.util.EventObject; import java.util.EventObject;
import java.util.List; import java.util.List;
import javax.swing.AbstractAction; import javax.swing.*;
import javax.swing.Action;
import javax.swing.ActionMap;
import javax.swing.ImageIcon;
import javax.swing.InputMap;
import javax.swing.JComponent;
import javax.swing.JRootPane;
import javax.swing.JToolBar;
import javax.swing.KeyStroke;
import javax.swing.event.EventListenerList; import javax.swing.event.EventListenerList;
class RedoHandler implements FileSelectionListener, DiskSelectionListener, SectorSelectionListener, class RedoHandler implements FileSelectionListener, DiskSelectionListener,
FileNodeSelectionListener SectorSelectionListener, FileNodeSelectionListener
{ {
private static final String base = "/com/bytezone/diskbrowser/icons/"; private static final String base = "/com/bytezone/diskbrowser/icons/";
EventListenerList listenerList = new EventListenerList (); EventListenerList listenerList = new EventListenerList ();
@ -87,7 +79,7 @@ class RedoHandler implements FileSelectionListener, DiskSelectionListener, Secto
@Override @Override
public void fileNodeSelected (FileNodeSelectedEvent event) public void fileNodeSelected (FileNodeSelectedEvent event)
{ {
if (!event.redo) // it's an event we just caused if (!event.redo) // it's an event we just caused
addEvent (new RedoEvent ("FileNodeEvent", event)); addEvent (new RedoEvent ("FileNodeEvent", event));
} }
@ -101,7 +93,7 @@ class RedoHandler implements FileSelectionListener, DiskSelectionListener, Secto
@Override @Override
public void sectorSelected (SectorSelectedEvent event) public void sectorSelected (SectorSelectedEvent event)
{ {
if (!event.redo) // it's an event we just caused if (!event.redo) // it's an event we just caused
addEvent (new RedoEvent ("SectorEvent", event)); addEvent (new RedoEvent ("SectorEvent", event));
} }