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;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.prefs.Preferences;
|
|
|
|
|
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;
|
2016-02-21 00:00:57 +00:00
|
|
|
import com.bytezone.diskbrowser.applefile.HiResImage;
|
2016-03-14 22:35:22 +00:00
|
|
|
import com.bytezone.diskbrowser.applefile.VisicalcFile;
|
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,
|
|
|
|
// PreferenceChangeListener,
|
|
|
|
FileNodeSelectionListener, FontChangeListener
|
2015-06-01 09:35:51 +00:00
|
|
|
{
|
|
|
|
private static final int TEXT_WIDTH = 65;
|
|
|
|
|
|
|
|
JTextArea hexText;
|
|
|
|
JTextArea disassemblyText;
|
|
|
|
|
|
|
|
// these two panes are interchangeable
|
|
|
|
JScrollPane formattedPane;
|
|
|
|
JScrollPane imagePane;
|
|
|
|
|
|
|
|
JTextArea formattedText;
|
2016-02-21 00:00:57 +00:00
|
|
|
ImagePanel imagePanel; // internal class
|
2015-06-01 09:35:51 +00:00
|
|
|
|
|
|
|
boolean imageVisible = false;
|
|
|
|
|
|
|
|
// used to determine whether the text has been set
|
|
|
|
boolean formattedTextValid;
|
|
|
|
boolean hexTextValid;
|
|
|
|
boolean assemblerTextValid;
|
|
|
|
DataSource currentDataSource;
|
|
|
|
|
|
|
|
// private Font font;
|
|
|
|
final MenuHandler menuHandler;
|
|
|
|
|
|
|
|
public DataPanel (MenuHandler mh, Preferences prefs)
|
|
|
|
{
|
|
|
|
// String dataFontName =
|
2016-02-21 00:00:57 +00:00
|
|
|
// prefs.get (PreferencesDialog.prefsDataFont, PreferencesDialog.defaultFontName);
|
2015-06-01 09:35:51 +00:00
|
|
|
// System.out.println (dataFontName);
|
|
|
|
// int dataFontSize =
|
2016-02-21 00:00:57 +00:00
|
|
|
// prefs.getInt (PreferencesDialog.prefsDataFontSize,
|
|
|
|
// PreferencesDialog.defaultFontSize);
|
2015-06-01 09:35:51 +00:00
|
|
|
// font = new Font (dataFontName, Font.PLAIN, dataFontSize);
|
|
|
|
|
|
|
|
this.menuHandler = mh;
|
|
|
|
setTabPlacement (SwingConstants.BOTTOM);
|
|
|
|
|
|
|
|
formattedText = new JTextArea (10, TEXT_WIDTH);
|
|
|
|
formattedPane = setPanel (formattedText, "Formatted");
|
|
|
|
formattedText.setLineWrap (mh.lineWrapItem.isSelected ());
|
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);
|
2016-08-23 05:20:04 +00:00
|
|
|
imagePane.getVerticalScrollBar ().setUnitIncrement (50);
|
|
|
|
imagePane.getHorizontalScrollBar ().setUnitIncrement (25);
|
2015-06-01 09:35:51 +00:00
|
|
|
|
|
|
|
// setTabsFont (font);
|
|
|
|
// this.setMinimumSize (new Dimension (800, 200));
|
|
|
|
|
|
|
|
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");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
mh.lineWrapItem.setAction (new LineWrapAction (formattedText));
|
2016-02-21 00:00:57 +00:00
|
|
|
mh.colourQuirksItem.setAction (new ColourQuirksAction (this));
|
2016-02-22 10:58:15 +00:00
|
|
|
mh.monochromeItem.setAction (new MonochromeAction (this));
|
2016-03-14 22:35:22 +00:00
|
|
|
mh.debuggingItem.setAction (new DebuggingAction (this));
|
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)
|
|
|
|
{
|
|
|
|
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 ());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
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;
|
|
|
|
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 ())
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
try
|
|
|
|
{
|
|
|
|
setText (formattedText, dataSource.getText ());
|
|
|
|
}
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
setText (formattedText, e.toString ());
|
|
|
|
e.printStackTrace ();
|
|
|
|
}
|
|
|
|
hexTextValid = false;
|
|
|
|
assemblerTextValid = false;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
setText (hexText, dataSource.getHexDump ());
|
|
|
|
formattedTextValid = false;
|
|
|
|
assemblerTextValid = false;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
setText (disassemblyText, dataSource.getAssembler ());
|
|
|
|
hexTextValid = false;
|
|
|
|
formattedTextValid = false;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
System.out.println ("Invalid index selected in DataPanel");
|
|
|
|
}
|
|
|
|
|
|
|
|
BufferedImage image = dataSource.getImage ();
|
|
|
|
if (image == null)
|
2016-02-21 00:00:57 +00:00
|
|
|
removeImage ();
|
2015-06-01 09:35:51 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
imagePanel.setImage (image);
|
|
|
|
imagePane.setViewportView (imagePanel);
|
|
|
|
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 ()
|
|
|
|
{
|
|
|
|
this.setBackground (Color.gray);
|
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
}
|
|
|
|
|
|
|
|
if (width < 400)
|
|
|
|
scale = (400 - 1) / width + 1;
|
2016-02-24 04:45:07 +00:00
|
|
|
else
|
|
|
|
scale = 1;
|
2015-06-01 09:35:51 +00:00
|
|
|
if (scale > 4)
|
|
|
|
scale = 4;
|
|
|
|
|
|
|
|
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)
|
|
|
|
{
|
|
|
|
setDataSource (event.file.getDataSource ());
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void sectorSelected (SectorSelectedEvent event)
|
|
|
|
{
|
|
|
|
List<DiskAddress> sectors = event.getSectors ();
|
|
|
|
if (sectors == null || sectors.size () == 0)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (sectors.size () == 1)
|
|
|
|
setDataSource (event.getFormattedDisk ().getFormattedSector (sectors.get (0)));
|
|
|
|
else
|
|
|
|
setDataSource (new SectorList (event.getFormattedDisk (), sectors));
|
|
|
|
}
|
|
|
|
|
|
|
|
// @Override
|
|
|
|
// public void preferenceChange (PreferenceChangeEvent evt)
|
|
|
|
// {
|
|
|
|
// if (evt.getKey ().equals (PreferencesDialog.prefsDataFont))
|
|
|
|
// font = new Font (evt.getNewValue (), Font.PLAIN, font.getSize ());
|
|
|
|
// if (evt.getKey ().equals (PreferencesDialog.prefsDataFontSize))
|
2016-02-21 00:00:57 +00:00
|
|
|
// font = new Font (font.getFontName (),
|
|
|
|
// Font.PLAIN, Integer.parseInt (evt.getNewValue ()));
|
2015-06-01 09:35:51 +00:00
|
|
|
// setTabsFont (font);
|
|
|
|
// }
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void fileNodeSelected (FileNodeSelectedEvent event)
|
|
|
|
{
|
|
|
|
setSelectedIndex (0);
|
|
|
|
setDataSource (event.getFileNode ());
|
|
|
|
// FileNode node = event.getFileNode ();
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void changeFont (FontChangeEvent fontChangeEvent)
|
|
|
|
{
|
|
|
|
setTabsFont (fontChangeEvent.font);
|
|
|
|
}
|
|
|
|
}
|