dmolony-DiskBrowser/src/com/bytezone/diskbrowser/gui/DataPanel.java

442 lines
13 KiB
Java
Raw Normal View History

2015-06-01 09:35:51 +00:00
package com.bytezone.diskbrowser.gui;
2016-02-21 00:00:57 +00:00
import java.awt.*;
2015-06-01 09:35:51 +00:00
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
2017-01-14 01:40:58 +00:00
import java.util.Enumeration;
2015-06-01 09:35:51 +00:00
import java.util.List;
2016-02-21 00:00:57 +00:00
import javax.swing.*;
2015-06-01 09:35:51 +00:00
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import com.bytezone.common.FontAction.FontChangeEvent;
import com.bytezone.common.FontAction.FontChangeListener;
2019-08-15 07:02:40 +00:00
import com.bytezone.diskbrowser.applefile.*;
2017-01-14 01:40:58 +00:00
import com.bytezone.diskbrowser.applefile.PaletteFactory.CycleDirection;
2015-06-01 09:35:51 +00:00
import com.bytezone.diskbrowser.disk.DiskAddress;
import com.bytezone.diskbrowser.disk.SectorList;
2015-08-31 09:33:42 +00:00
class DataPanel extends JTabbedPane
implements DiskSelectionListener, FileSelectionListener, SectorSelectionListener,
2019-08-15 07:02:40 +00:00
FileNodeSelectionListener, FontChangeListener, BasicPreferencesListener,
AssemblerPreferencesListener
2015-06-01 09:35:51 +00:00
{
private static final int TEXT_WIDTH = 65;
2019-09-13 05:32:35 +00:00
private static final int BACKGROUND = 245;
2015-06-01 09:35:51 +00:00
2019-10-12 02:47:21 +00:00
private final JTextArea formattedText;
private final JTextArea hexText;
private final JTextArea disassemblyText;
2015-06-01 09:35:51 +00:00
// these two panes are interchangeable
2019-10-12 02:47:21 +00:00
private final JScrollPane formattedPane;
private final JScrollPane imagePane;
2015-06-01 09:35:51 +00:00
2019-10-12 02:47:21 +00:00
private final ImagePanel imagePanel; // internal class
private boolean debugMode;
2015-06-01 09:35:51 +00:00
2019-10-12 02:47:21 +00:00
private boolean imageVisible = false;
2015-06-01 09:35:51 +00:00
// used to determine whether the text has been set
boolean formattedTextValid;
boolean hexTextValid;
boolean assemblerTextValid;
DataSource currentDataSource;
final MenuHandler menuHandler;
2019-10-12 02:47:21 +00:00
public DataPanel (MenuHandler mh)
2015-06-01 09:35:51 +00:00
{
this.menuHandler = mh;
setTabPlacement (SwingConstants.BOTTOM);
formattedText = new JTextArea (10, TEXT_WIDTH);
formattedPane = setPanel (formattedText, "Formatted");
2019-10-12 02:47:21 +00:00
// formattedText.setLineWrap (prefs.getBoolean (MenuHandler.PREFS_LINE_WRAP, true));
2015-08-31 09:33:42 +00:00
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"
2016-11-24 13:00:02 +00:00
+ "\nthe disk. You will then be able to select individual files to "
+ "view completely.");
2015-06-01 09:35:51 +00:00
hexText = new JTextArea (10, TEXT_WIDTH);
setPanel (hexText, "Hex dump");
disassemblyText = new JTextArea (10, TEXT_WIDTH);
setPanel (disassemblyText, "Disassembly");
imagePanel = new ImagePanel ();
imagePane =
2015-08-31 09:33:42 +00:00
new JScrollPane (imagePanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
2016-08-23 10:24:26 +00:00
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
2019-09-13 05:32:35 +00:00
imagePane.setBorder (null);
2016-08-23 05:20:04 +00:00
imagePane.getVerticalScrollBar ().setUnitIncrement (50);
imagePane.getHorizontalScrollBar ().setUnitIncrement (25);
2015-06-01 09:35:51 +00:00
addChangeListener (new ChangeListener ()
{
@Override
public void stateChanged (ChangeEvent e)
{
switch (getSelectedIndex ())
{
case 0:
if (!formattedTextValid)
{
if (currentDataSource == null)
formattedText.setText ("");
else
setText (formattedText, currentDataSource.getText ());
formattedTextValid = true;
}
break;
case 1:
if (!hexTextValid)
{
if (currentDataSource == null)
hexText.setText ("");
else
setText (hexText, currentDataSource.getHexDump ());
hexTextValid = true;
}
break;
case 2:
if (!assemblerTextValid)
{
if (currentDataSource == null)
disassemblyText.setText ("");
else
setText (disassemblyText, currentDataSource.getAssembler ());
assemblerTextValid = true;
}
break;
default:
System.out.println ("Invalid index selected in DataPanel");
}
}
});
2019-08-08 10:01:56 +00:00
LineWrapAction lineWrapAction = new LineWrapAction ();
menuHandler.lineWrapItem.setAction (lineWrapAction);
lineWrapAction.addListener (formattedText);
2017-01-14 11:11:07 +00:00
menuHandler.colourQuirksItem.setAction (new ColourQuirksAction (this));
menuHandler.monochromeItem.setAction (new MonochromeAction (this));
menuHandler.debuggingItem.setAction (new DebuggingAction (this));
2017-01-14 01:40:58 +00:00
// fill in the placeholders created by the MenuHandler
List<Palette> palettes = HiResImage.getPalettes ();
2017-01-14 11:11:07 +00:00
ButtonGroup buttonGroup = menuHandler.paletteGroup;
2017-01-14 01:40:58 +00:00
Enumeration<AbstractButton> enumeration = buttonGroup.getElements ();
int ndx = 0;
while (enumeration.hasMoreElements ())
{
JCheckBoxMenuItem item = (JCheckBoxMenuItem) enumeration.nextElement ();
item.setAction (new PaletteAction (this, palettes.get (ndx++)));
}
2017-01-14 11:11:07 +00:00
menuHandler.nextPaletteItem.setAction (new NextPaletteAction (this, buttonGroup));
menuHandler.prevPaletteItem.setAction (new PreviousPaletteAction (this, buttonGroup));
2017-01-11 21:26:28 +00:00
}
2017-01-14 01:40:58 +00:00
public void selectPalette (Palette palette)
2017-01-11 21:26:28 +00:00
{
2017-01-14 11:11:07 +00:00
HiResImage.getPaletteFactory ().setCurrentPalette (palette);
2017-01-11 21:26:28 +00:00
if (currentDataSource instanceof HiResImage)
{
HiResImage image = (HiResImage) currentDataSource;
2017-01-14 11:11:07 +00:00
image.setPalette ();
2017-01-11 21:26:28 +00:00
imagePanel.setImage (image.getImage ());
}
2016-02-21 00:00:57 +00:00
}
2017-01-14 01:40:58 +00:00
public Palette cyclePalette (CycleDirection direction)
{
2017-01-14 11:11:07 +00:00
Palette palette = HiResImage.getPaletteFactory ().cyclePalette (direction);
2017-01-14 01:40:58 +00:00
if (currentDataSource instanceof HiResImage)
{
HiResImage image = (HiResImage) currentDataSource;
2017-01-14 11:15:45 +00:00
image.setPalette ();
2017-01-14 01:40:58 +00:00
imagePanel.setImage (image.getImage ());
}
2017-01-14 11:11:07 +00:00
return palette;
2017-01-14 01:40:58 +00:00
}
2019-10-12 02:47:21 +00:00
void setLineWrap (boolean lineWrap)
{
formattedText.setLineWrap (lineWrap);
}
2016-02-21 00:00:57 +00:00
public void setColourQuirks (boolean value)
{
if (currentDataSource instanceof HiResImage)
{
HiResImage image = (HiResImage) currentDataSource;
image.setColourQuirks (value);
imagePanel.setImage (image.getImage ());
}
2015-06-01 09:35:51 +00:00
}
2016-02-22 10:58:15 +00:00
public void setMonochrome (boolean value)
{
if (currentDataSource instanceof HiResImage)
{
HiResImage image = (HiResImage) currentDataSource;
image.setMonochrome (value);
imagePanel.setImage (image.getImage ());
}
}
2016-03-14 22:35:22 +00:00
public void setDebug (boolean value)
{
2018-07-28 12:00:02 +00:00
debugMode = value;
2017-01-25 01:38:00 +00:00
2016-03-14 22:35:22 +00:00
if (currentDataSource instanceof VisicalcFile)
{
VisicalcFile visicalcFile = (VisicalcFile) currentDataSource;
2016-07-29 12:28:11 +00:00
VisicalcFile.setDebug (value);
2016-03-14 22:35:22 +00:00
setText (formattedText, visicalcFile.getText ());
}
2017-02-04 00:38:27 +00:00
// should implement an interface for this
else if (currentDataSource instanceof HiResImage
|| currentDataSource instanceof QuickDrawFont)
2017-01-25 01:38:00 +00:00
{
setDataSource (currentDataSource); // toggles text/image
}
2016-03-14 22:35:22 +00:00
}
2015-06-01 09:35:51 +00:00
private void setTabsFont (Font font)
{
formattedText.setFont (font);
hexText.setFont (font);
disassemblyText.setFont (font);
imagePane.getVerticalScrollBar ().setUnitIncrement (font.getSize ());
}
public String getCurrentText ()
{
int index = getSelectedIndex ();
2015-08-31 09:33:42 +00:00
return index == 0 ? formattedText.getText ()
: index == 1 ? hexText.getText () : disassemblyText.getText ();
2015-06-01 09:35:51 +00:00
}
private JScrollPane setPanel (JTextArea outputPanel, String tabName)
{
outputPanel.setEditable (false);
outputPanel.setMargin (new Insets (5, 5, 5, 5));
JScrollPane outputScrollPane =
2015-08-31 09:33:42 +00:00
new JScrollPane (outputPanel, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
2016-02-21 00:00:57 +00:00
outputScrollPane.setBorder (null); // remove the ugly default border
2015-06-01 09:35:51 +00:00
add (outputScrollPane, tabName);
return outputScrollPane;
}
private void setDataSource (DataSource dataSource)
{
currentDataSource = dataSource;
2019-08-08 10:01:56 +00:00
2015-06-01 09:35:51 +00:00
if (dataSource == null)
{
formattedText.setText ("");
hexText.setText ("");
disassemblyText.setText ("");
2016-02-21 00:00:57 +00:00
removeImage ();
2015-06-01 09:35:51 +00:00
return;
}
switch (getSelectedIndex ())
{
2017-01-20 11:13:26 +00:00
case 0: // Formated/Image
2015-06-01 09:35:51 +00:00
try
{
setText (formattedText, dataSource.getText ());
}
catch (Exception e)
{
setText (formattedText, e.toString ());
e.printStackTrace ();
}
hexTextValid = false;
assemblerTextValid = false;
break;
2017-01-20 11:13:26 +00:00
case 1: // Hex Dump
2015-06-01 09:35:51 +00:00
setText (hexText, dataSource.getHexDump ());
formattedTextValid = false;
assemblerTextValid = false;
break;
2017-01-20 11:13:26 +00:00
case 2: // Disassembly
2015-06-01 09:35:51 +00:00
setText (disassemblyText, dataSource.getAssembler ());
hexTextValid = false;
formattedTextValid = false;
break;
2017-01-20 11:13:26 +00:00
2015-06-01 09:35:51 +00:00
default:
System.out.println ("Invalid index selected in DataPanel");
}
BufferedImage image = dataSource.getImage ();
2018-07-28 12:00:02 +00:00
if (image == null || debugMode)
2016-02-21 00:00:57 +00:00
removeImage ();
2015-06-01 09:35:51 +00:00
else
{
2017-01-14 20:58:07 +00:00
if (dataSource instanceof HiResImage)
{
((HiResImage) dataSource).checkPalette ();
image = dataSource.getImage ();
}
2015-06-01 09:35:51 +00:00
imagePanel.setImage (image);
imagePane.setViewportView (imagePanel);
2017-01-14 11:11:07 +00:00
2015-06-01 09:35:51 +00:00
if (!imageVisible)
{
int selected = getSelectedIndex ();
remove (formattedPane);
add (imagePane, "Formatted", 0);
setSelectedIndex (selected);
imageVisible = true;
}
}
}
2016-02-21 00:00:57 +00:00
private void removeImage ()
2015-06-01 09:35:51 +00:00
{
if (imageVisible)
{
int selected = getSelectedIndex ();
remove (imagePane);
add (formattedPane, "Formatted", 0);
setSelectedIndex (selected);
imageVisible = false;
}
}
private void setText (JTextArea textArea, String text)
{
textArea.setText (text);
textArea.setCaretPosition (0);
}
private class ImagePanel extends JPanel
{
private BufferedImage image;
private int scale = 1;
public ImagePanel ()
{
2019-09-13 05:32:35 +00:00
this.setBackground (new Color (BACKGROUND, BACKGROUND, BACKGROUND));
2015-06-01 09:35:51 +00:00
}
private void setImage (BufferedImage image)
{
this.image = image;
2016-03-24 00:17:09 +00:00
int width, height;
2015-06-01 09:35:51 +00:00
if (image != null)
{
Graphics2D g2 = image.createGraphics ();
g2.setRenderingHint (RenderingHints.KEY_ANTIALIASING,
2016-08-06 10:00:01 +00:00
RenderingHints.VALUE_ANTIALIAS_ON);
2016-03-24 00:17:09 +00:00
width = image.getWidth ();
height = image.getHeight ();
}
else
width = height = 0;
2015-06-01 09:35:51 +00:00
2017-01-20 11:13:26 +00:00
if (true)
{
2017-01-25 01:38:00 +00:00
if (width < 400 && width > 0)
2017-01-20 11:13:26 +00:00
scale = (400 - 1) / width + 1;
else
scale = 1;
if (scale > 4)
scale = 4;
}
2015-06-01 09:35:51 +00:00
setPreferredSize (new Dimension (width * scale, height * scale));
repaint ();
}
@Override
public void paintComponent (Graphics g)
{
super.paintComponent (g);
if (image != null)
{
Graphics2D g2 = ((Graphics2D) g);
g2.transform (AffineTransform.getScaleInstance (scale, scale));
2015-08-31 09:33:42 +00:00
g2.drawImage (image, (getWidth () - image.getWidth () * scale) / 2 / scale, 4,
2016-08-06 10:00:01 +00:00
this);
2015-06-01 09:35:51 +00:00
}
}
}
@Override
public void diskSelected (DiskSelectedEvent event)
{
setSelectedIndex (0);
setDataSource (null);
if (event.getFormattedDisk () != null)
setDataSource (event.getFormattedDisk ().getCatalog ().getDataSource ());
else
System.out.println ("bollocks in diskSelected()");
}
@Override
public void fileSelected (FileSelectedEvent event)
{
2019-08-08 10:01:56 +00:00
DataSource dataSource = event.file.getDataSource ();
setDataSource (dataSource);
2015-06-01 09:35:51 +00:00
}
@Override
public void sectorSelected (SectorSelectedEvent event)
{
List<DiskAddress> sectors = event.getSectors ();
if (sectors == null || sectors.size () == 0)
return;
if (sectors.size () == 1)
2017-11-25 20:12:59 +00:00
{
DiskAddress da = sectors.get (0);
2018-07-22 20:52:41 +00:00
if (da != null)
setDataSource (event.getFormattedDisk ().getFormattedSector (da));
2017-11-25 20:12:59 +00:00
}
2015-06-01 09:35:51 +00:00
else
setDataSource (new SectorList (event.getFormattedDisk (), sectors));
}
@Override
public void fileNodeSelected (FileNodeSelectedEvent event)
{
setSelectedIndex (0);
setDataSource (event.getFileNode ());
// FileNode node = event.getFileNode ();
}
@Override
public void changeFont (FontChangeEvent fontChangeEvent)
{
setTabsFont (fontChangeEvent.font);
}
2019-08-08 10:01:56 +00:00
@Override
public void setBasicPreferences (BasicPreferences basicPreferences)
{
2019-08-09 23:45:49 +00:00
if (currentDataSource instanceof ApplesoftBasicProgram)
2019-08-08 10:01:56 +00:00
setDataSource (currentDataSource);
}
2019-08-15 07:02:40 +00:00
@Override
public void setAssemblerPreferences (AssemblerPreferences assemblerPreferences)
{
if (currentDataSource instanceof AssemblerProgram)
setDataSource (currentDataSource);
}
2015-06-01 09:35:51 +00:00
}