Colours menu

This commit is contained in:
Denis Molony 2017-01-14 12:40:58 +11:00
parent 263b687559
commit a91d26684e
12 changed files with 499 additions and 214 deletions

View File

@ -1,7 +1,5 @@
package com.bytezone.diskbrowser.applefile; package com.bytezone.diskbrowser.applefile;
import static com.bytezone.diskbrowser.applefile.HiResImage.palette;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.awt.image.DataBuffer; import java.awt.image.DataBuffer;
@ -17,7 +15,6 @@ public class DoubleHiResImage extends HiResImage
public DoubleHiResImage (String name, byte[] buffer, byte[] auxBuffer) public DoubleHiResImage (String name, byte[] buffer, byte[] auxBuffer)
{ {
super (name, buffer); super (name, buffer);
// switchColours ();
this.auxBuffer = auxBuffer; this.auxBuffer = auxBuffer;
createImage (); createImage ();
@ -26,7 +23,6 @@ public class DoubleHiResImage extends HiResImage
public DoubleHiResImage (String name, byte[] buffer) public DoubleHiResImage (String name, byte[] buffer)
{ {
super (name, buffer); super (name, buffer);
// switchColours ();
assert name.endsWith (".PAC") || name.endsWith ("A2FC"); assert name.endsWith (".PAC") || name.endsWith ("A2FC");
@ -87,7 +83,8 @@ public class DoubleHiResImage extends HiResImage
@Override @Override
protected void createColourImage () protected void createColourImage ()
{ {
int paletteNdx = paletteIndex % palette.length; Palette palette = paletteFactory.getCurrentPalette ();
int[] colours = palette.getColours ();
// image will be doubled horizontally // image will be doubled horizontally
image = new BufferedImage (140 * 2, 192, BufferedImage.TYPE_INT_RGB); image = new BufferedImage (140 * 2, 192, BufferedImage.TYPE_INT_RGB);
@ -108,8 +105,8 @@ public class DoubleHiResImage extends HiResImage
for (int px = 0; px < 28; px += 4) for (int px = 0; px < 28; px += 4)
{ {
int val = (value >> px) & 0x0F; int val = (value >> px) & 0x0F;
dataBuffer.setElem (ndx++, palette[paletteNdx][val]); dataBuffer.setElem (ndx++, colours[val]);
dataBuffer.setElem (ndx++, palette[paletteNdx][val]); // repeat pixel dataBuffer.setElem (ndx++, colours[val]); // repeat pixel
} }
} }
} }

View File

@ -4,176 +4,24 @@ import java.awt.image.BufferedImage;
import java.awt.image.DataBuffer; import java.awt.image.DataBuffer;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.IOException; import java.io.IOException;
import java.util.List;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import com.bytezone.diskbrowser.applefile.PaletteFactory.CycleDirection;
import com.bytezone.diskbrowser.prodos.ProdosConstants; import com.bytezone.diskbrowser.prodos.ProdosConstants;
import com.bytezone.diskbrowser.utilities.HexFormatter; import com.bytezone.diskbrowser.utilities.HexFormatter;
public abstract class HiResImage extends AbstractFile public abstract class HiResImage extends AbstractFile
{ {
protected static int[][] // protected static PaletteFactory paletteFactory = new PaletteFactory ();
palette = {
// my preferences
{ 0x000000, // 0 black A
0xFF0000, // 1 red C
0xA52A2A, // 2 brown E (8)
0xFFA500, // 3 orange G (9)
0x008000, // 4 dark green I
0x808080, // 5 grey1 K
0x90EE90, // 6 light green M (C)
0xFFFF00, // 7 yellow O (D)
0x00008B, // 8 dark blue B (2)
0x800080, // 9 purple D (3)
0xC0C0C0, // A grey2 F
0xFFC0CB, // B pink H
0x00BFFF, // C med blue J (6)
0x87CEFA, // D light blue L (7)
0x00FFFF, // E aqua N
0xFFFFFF // F white P
},
// Virtual II
{ 0x000000, // 0 black
0xDD0033, // 1 magenta
0x885500, // 2 brown (8)
0xFF6600, // 3 orange (9)
0x007722, // 4 dark green
0x555555, // 5 grey1
0x11DD00, // 6 light green (C)
0xFFFF00, // 7 yellow (D)
0x000099, // 8 dark blue (2)
0xDD22DD, // 9 purple (3)
0xAAAAAA, // A grey2
0xFF9988, // B pink
0x2222FF, // C med blue (6)
0x66AAFF, // D light blue (7)
0x44FF99, // E aqua
0xFFFFFF // F white
},
// Bill Buckels
{ 0x000000, // 0 black
0x9D0966, // 1 red
0x555500, // 2 brown
0xF25E00, // 3 orange
0x00761A, // 4 dk green
0x808080, // 5 gray
0x38CB00, // 6 lt green
0xD5D51A, // 7 yellow
0x2A2AE5, // 8 dk blue
0xC734FF, // 9 purple
0xC0C0C0, // A grey
0xFF89E5, // B pink
0x0DA1FF, // C med blue
0xAAAAFF, // D lt blue
0x62F699, // E aqua
0xFFFFFF // F white
},
// Kegs (BB)
{ rgb (0, 0, 0), // black */
rgb (221, 0, 51), // red */
rgb (136, 85, 34), // brown */
rgb (255, 102, 0), // orange */
rgb (0, 119, 0), // dk green */
rgb (85, 85, 85), // gray */
rgb (0, 221, 0), // lt green */
rgb (255, 255, 0), // yellow */
rgb (0, 0, 153), // dk blue */
rgb (221, 0, 221), // purple */
rgb (170, 170, 170), // grey */
rgb (255, 153, 136), // pink */
rgb (34, 34, 255), // med blue */
rgb (102, 170, 255), // lt blue */
rgb (0, 255, 153), // aqua */
rgb (255, 255, 255) // white
},
// Authentic (MP)
{ 0x000000, // black
0xD00030, // magenta
0x805000, // brown
0xF06000, // orange
0x007020, // dark green
0x505050, // grey1
0x10D000, // light green
0xF0F000, // yellow
0x000090, // dark blue
0xD020D0, // purple
0xA0A0A0, // grey2
0xF09080, // pink
0x2020F0, // med blue
0x60A0F0, // light blue
0x40F090, // aqua
0xFFFFFF // white
},
// Tweaked (MP)
{ 0x000000, // black
0xD00030, // magenta
0x805000, // brown
0xFF8000, // orange
0x008000, // dark green
0x808080, // grey1
0x00FF00, // light green
0xFFFF00, // yellow
0x000080, // dark blue
0xFF00FF, // purple
0xC0C0C0, // grey2
0xFF9080, // pink
0x0000FF, // med blue
0x60A0FF, // light blue
0x40FF90, // aqua
0xFFFFFF // white
},
// NTSC Corrected (MP)
{ 0x000000, // black
0x901740, // magenta
0x405400, // brown
0xD06A1A, // orange
0x006940, // dark green
0x808080, // grey1
0x2FBC1A, // light green
0xBFD35A, // yellow
0x402CA5, // dark blue
0xD043E5, // purple
0x808080, // grey2
0xFF96BF, // pink
0x2F95E5, // med blue
0xBFABFF, // light blue
0x6FE8BF, // aqua
0xFFFFFF // white
}, };
/*-
* Michael Pohoreski - The Apple II Forever Anthology
@reference: Technote tn-iigs-063 Master Color Values
Color Register Values
Color Reg LR HR DHR Master Authentic Tweaked NTSC
Name # # # Value Corrected
-----------------------------------------------------------------------------
Black 0 0 0,4 0 $0000 (00,00,00) (00,00,00) 00,00,00
(Magenta) Deep Red 1 1 1 $0D03 (D0,00,30) (D0,00,30) 90,17,40
Dark Blue 2 2 8 $0009 (00,00,90) (00,00,80) 40,2C,A5
(Violet) Purple 3 3 2 9 $0D2D (D0,20,D0) (FF,00,FF) D0,43,E5
Dark Green 4 4 4 $0072 (00,70,20) (00,80,00) 00,69,40
(Gray 1) Dark Gray 5 5 5 $0555 (50,50,50) (80,80,80) 80,80,80
(Blue) Medium Blue 6 6 6 C $022F (20,20,F0) (00,00,FF) 2F,95,E5
(Cyan) Light Blue 7 7 D $06AF (60,A0,F0) (60,A0,FF) BF,AB,FF
Brown 8 8 2 $0850 (80,50,00) (80,50,00) 40,54,00
Orange 9 9 5 3 $0F60 (F0,60,00) (FF,80,00) D0,6A,1A
(Gray 2) Light Gray A A A $0AAA (A0,A0,A0) (C0,C0,C0) 80,80,80
Pink B B B $0F98 (F0,90,80) (FF,90,80) FF,96,BF
(Green) Light Green C C 1 6 $01D0 (10,D0,00) (00,FF,00) 2F,BC,1A
Yellow D D 7 $0FF0 (F0,F0,00) (FF,FF,00) BF,D3,5A
(Aqua) Aquamarine E E E $04F9 (40,F0,90) (40,FF,90) 6F,E8,BF
White F F 3,7 F $0FFF (F0,F0,F0) (FF,FF,FF) FF,FF,FF
Legend:
LR: Lo-Res HR: Hi-Res DHR: Double Hi-Res
*/
private static final byte[] pngHeader = private static final byte[] pngHeader =
{ (byte) 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }; { (byte) 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A };
protected static boolean colourQuirks; protected static boolean colourQuirks;
protected static boolean monochrome; protected static boolean monochrome;
protected static int paletteIndex; // protected Palette palette;
protected int fileType; protected int fileType;
protected int auxType; protected int auxType;
@ -182,6 +30,7 @@ public abstract class HiResImage extends AbstractFile
public HiResImage (String name, byte[] buffer) public HiResImage (String name, byte[] buffer)
{ {
super (name, buffer); super (name, buffer);
// palette = paletteFactory.getCurrentPalette ();
} }
public HiResImage (String name, byte[] buffer, int loadAddress) public HiResImage (String name, byte[] buffer, int loadAddress)
@ -236,13 +85,21 @@ public abstract class HiResImage extends AbstractFile
protected abstract void createColourImage (); protected abstract void createColourImage ();
public void cyclePalette () public void setPalette (Palette palette)
{ {
++paletteIndex; paletteFactory.setCurrentPalette (palette);
if (!monochrome) if (!monochrome)
createImage (); createImage ();
} }
public Palette cyclePalette (CycleDirection direction)
{
Palette palette = paletteFactory.cyclePalette (direction);
if (!monochrome)
createImage ();
return palette;
}
public void setColourQuirks (boolean value) public void setColourQuirks (boolean value)
{ {
if (colourQuirks == value) if (colourQuirks == value)
@ -477,24 +334,13 @@ public abstract class HiResImage extends AbstractFile
return true; return true;
} }
// switch between lo-res and DHR indexing public static PaletteFactory getPaletteFactory ()
private void switchColours ()
{ {
int[] tbl = { 2, 3, 6, 7 }; return paletteFactory;
for (int i = 0; i < palette.length; i++)
for (int j = 0; j < tbl.length; j++)
{
int c = tbl[j];
int temp = palette[i][c];
palette[i][c] = palette[i][c + 6];
palette[i][c + 6] = temp;
}
} }
private static int rgb (int red, int green, int blue) public static List<Palette> getPalettes ()
{ {
System.out.printf ("%3d %3d %3d = 0x%06X%n", red, green, blue, return paletteFactory.getPalettes ();
(red << 16 | green << 8 | blue));
return red << 16 | green << 8 | blue;
} }
} }

View File

@ -89,7 +89,8 @@ public class OriginalHiResImage extends HiResImage
private void fillLine (int base) private void fillLine (int base)
{ {
int paletteNdx = paletteIndex % palette.length; Palette palette = paletteFactory.getCurrentPalette ();
int[] colours = palette.getColours ();
int max = Math.min (base + 40, buffer.length); int max = Math.min (base + 40, buffer.length);
int linePtr = 0; int linePtr = 0;
@ -107,7 +108,7 @@ public class OriginalHiResImage extends HiResImage
int column = (ptr + px) % 2; // is it in an odd or even column? int column = (ptr + px) % 2; // is it in an odd or even column?
line[linePtr++] = val == 0 ? 0 : // black pixel line[linePtr++] = val == 0 ? 0 : // black pixel
// palette[colourBit][column]; // coloured pixel - use lookup table // palette[colourBit][column]; // coloured pixel - use lookup table
palette[paletteNdx][paletteTable[colourBit][column]]; // coloured pixel - use lookup table colours[paletteTable[colourBit][column]]; // coloured pixel - use lookup table
} }
} }

View File

@ -0,0 +1,56 @@
package com.bytezone.diskbrowser.applefile;
public class Palette
{
/*-
* Michael Pohoreski - The Apple II Forever Anthology
@reference: Technote tn-iigs-063 Master Color Values
Color Register Values
Color Reg LR HR DHR Master Authentic Tweaked NTSC
Name # # # Value Corrected
-----------------------------------------------------------------------------
Black 0 0 0,4 0 $0000 (00,00,00) (00,00,00) 00,00,00
(Magenta) Deep Red 1 1 1 $0D03 (D0,00,30) (D0,00,30) 90,17,40
Dark Blue 2 2 8 $0009 (00,00,90) (00,00,80) 40,2C,A5
(Violet) Purple 3 3 2 9 $0D2D (D0,20,D0) (FF,00,FF) D0,43,E5
Dark Green 4 4 4 $0072 (00,70,20) (00,80,00) 00,69,40
(Gray 1) Dark Gray 5 5 5 $0555 (50,50,50) (80,80,80) 80,80,80
(Blue) Medium Blue 6 6 6 C $022F (20,20,F0) (00,00,FF) 2F,95,E5
(Cyan) Light Blue 7 7 D $06AF (60,A0,F0) (60,A0,FF) BF,AB,FF
Brown 8 8 2 $0850 (80,50,00) (80,50,00) 40,54,00
Orange 9 9 5 3 $0F60 (F0,60,00) (FF,80,00) D0,6A,1A
(Gray 2) Light Gray A A A $0AAA (A0,A0,A0) (C0,C0,C0) 80,80,80
Pink B B B $0F98 (F0,90,80) (FF,90,80) FF,96,BF
(Green) Light Green C C 1 6 $01D0 (10,D0,00) (00,FF,00) 2F,BC,1A
Yellow D D 7 $0FF0 (F0,F0,00) (FF,FF,00) BF,D3,5A
(Aqua) Aquamarine E E E $04F9 (40,F0,90) (40,FF,90) 6F,E8,BF
White F F 3,7 F $0FFF (F0,F0,F0) (FF,FF,FF) FF,FF,FF
Legend:
LR: Lo-Res HR: Hi-Res DHR: Double Hi-Res
*/
private final String name;
private final int[] colours;
public Palette (String name, int[] colours)
{
this.name = name;
this.colours = colours;
}
public String getName ()
{
return name;
}
public int[] getColours ()
{
return colours;
}
@Override
public String toString ()
{
return String.format ("Palette: %s", name);
}
}

View File

@ -0,0 +1,237 @@
package com.bytezone.diskbrowser.applefile;
import java.util.ArrayList;
import java.util.List;
public class PaletteFactory
{
private final List<Palette> palettes = new ArrayList<Palette> ();
private int currentPalette;
public PaletteFactory ()
{
palettes.add (new Palette ("Palette 1",
new int[] { 0x000000, // 0 black A
0xFF0000, // 1 red C
0xA52A2A, // 2 brown E (8)
0xFFA500, // 3 orange G (9)
0x008000, // 4 dark green I
0x808080, // 5 grey1 K
0x90EE90, // 6 light green M (C)
0xFFFF00, // 7 yellow O (D)
0x00008B, // 8 dark blue B (2)
0x800080, // 9 purple D (3)
0xC0C0C0, // A grey2 F
0xFFC0CB, // B pink H
0x00BFFF, // C med blue J (6)
0x87CEFA, // D light blue L (7)
0x00FFFF, // E aqua N
0xFFFFFF // F white P
}));
palettes.add (new Palette ("Virtual II",
new int[] { 0x000000, // 0 black
0xDD0033, // 1 magenta
0x885500, // 2 brown (8)
0xFF6600, // 3 orange (9)
0x007722, // 4 dark green
0x555555, // 5 grey1
0x11DD00, // 6 light green (C)
0xFFFF00, // 7 yellow (D)
0x000099, // 8 dark blue (2)
0xDD22DD, // 9 purple (3)
0xAAAAAA, // A grey2
0xFF9988, // B pink
0x2222FF, // C med blue (6)
0x66AAFF, // D light blue (7)
0x44FF99, // E aqua
0xFFFFFF // F white
}));
// Applewin new (BB)
palettes.add (new Palette ("Applewin (new)",
new int[] { 0x000000, // 0 black
0x9D0966, // 1 red
0x555500, // 2 brown
0xF25E00, // 3 orange
0x00761A, // 4 dk green
0x808080, // 5 gray
0x38CB00, // 6 lt green
0xD5D51A, // 7 yellow
0x2A2AE5, // 8 dk blue
0xC734FF, // 9 purple
0xC0C0C0, // A grey
0xFF89E5, // B pink
0x0DA1FF, // C med blue
0xAAAAFF, // D lt blue
0x62F699, // E aqua
0xFFFFFF // F white
}));
// Applewin old (BB)
palettes.add (new Palette ("Applewin (old)",
new int[] { rgb (0, 0, 0), // black */
rgb (208, 0, 48), // red */
rgb (128, 80, 0), // brown */
rgb (255, 128, 0), // orange */
rgb (0, 128, 0), // dk green */
rgb (128, 128, 128), // gray */
rgb (0, 255, 0), // lt green */
rgb (255, 255, 0), // yellow */
rgb (0, 0, 128), // dk blue */
rgb (255, 0, 255), // purple */
rgb (192, 192, 192), // grey */
rgb (255, 144, 128), // pink */
rgb (0, 0, 255), // med blue */
rgb (96, 160, 255), // lt blue */
rgb (64, 255, 144), // aqua */
rgb (255, 255, 255) // white
}));
// Kegs (BB)
palettes.add (new Palette ("Kegs",
new int[] { rgb (0, 0, 0), // black */
rgb (221, 0, 51), // red */
rgb (136, 85, 34), // brown */
rgb (255, 102, 0), // orange */
rgb (0, 119, 0), // dk green */
rgb (85, 85, 85), // gray */
rgb (0, 221, 0), // lt green */
rgb (255, 255, 0), // yellow */
rgb (0, 0, 153), // dk blue */
rgb (221, 0, 221), // purple */
rgb (170, 170, 170), // grey */
rgb (255, 153, 136), // pink */
rgb (34, 34, 255), // med blue */
rgb (102, 170, 255), // lt blue */
rgb (0, 255, 153), // aqua */
rgb (255, 255, 255) // white
}));
// Authentic (MP)
palettes.add (new Palette ("Authentic",
new int[] { 0x000000, // black
0xD00030, // magenta
0x805000, // brown
0xF06000, // orange
0x007020, // dark green
0x505050, // grey1
0x10D000, // light green
0xF0F000, // yellow
0x000090, // dark blue
0xD020D0, // purple
0xA0A0A0, // grey2
0xF09080, // pink
0x2020F0, // med blue
0x60A0F0, // light blue
0x40F090, // aqua
0xFFFFFF // white
}));
// Tweaked (MP)
palettes.add (new Palette ("Tweaked",
new int[] { 0x000000, // black
0xD00030, // magenta
0x805000, // brown
0xFF8000, // orange
0x008000, // dark green
0x808080, // grey1
0x00FF00, // light green
0xFFFF00, // yellow
0x000080, // dark blue
0xFF00FF, // purple
0xC0C0C0, // grey2
0xFF9080, // pink
0x0000FF, // med blue
0x60A0FF, // light blue
0x40FF90, // aqua
0xFFFFFF // white
}));
// NTSC Corrected (MP)
palettes.add (new Palette ("NTSC corrected",
new int[] { 0x000000, // black
0x901740, // magenta
0x405400, // brown
0xD06A1A, // orange
0x006940, // dark green
0x808080, // grey1
0x2FBC1A, // light green
0xBFD35A, // yellow
0x402CA5, // dark blue
0xD043E5, // purple
0x808080, // grey2
0xFF96BF, // pink
0x2F95E5, // med blue
0xBFABFF, // light blue
0x6FE8BF, // aqua
0xFFFFFF // white
}));
}
public enum CycleDirection
{
FORWARDS, BACKWARDS
}
public Palette cyclePalette (CycleDirection direction)
{
switch (direction)
{
case FORWARDS:
++currentPalette;
if (currentPalette >= palettes.size ())
currentPalette = 0;
break;
case BACKWARDS:
--currentPalette;
if (currentPalette < 0)
currentPalette = palettes.size () - 1;
break;
}
return getCurrentPalette ();
}
public List<Palette> getPalettes ()
{
return palettes;
}
public Palette getCurrentPalette ()
{
return palettes.get (currentPalette);
}
public int getCurrentPaletteIndex ()
{
return currentPalette;
}
public void setCurrentPalette (int index)
{
assert index >= 0 && index < palettes.size ();
currentPalette = index;
}
public void setCurrentPalette (Palette palette)
{
int count = 0;
for (Palette p : palettes)
{
if (p == palette)
{
currentPalette = count;
break;
}
++count;
}
}
public Palette get (int index)
{
return palettes.get (index);
}
private int rgb (int red, int green, int blue)
{
System.out.printf ("%3d %3d %3d = 0x%06X%n", red, green, blue,
(red << 16 | green << 8 | blue));
return red << 16 | green << 8 | blue;
}
}

View File

@ -14,7 +14,7 @@ public class ColourQuirksAction extends AbstractAction
public ColourQuirksAction (DataPanel owner) public ColourQuirksAction (DataPanel owner)
{ {
super ("Colour quirks"); super ("Smear HGR");
putValue (Action.SHORT_DESCRIPTION, "Display pixels like a TV screen"); putValue (Action.SHORT_DESCRIPTION, "Display pixels like a TV screen");
putValue (Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke ("alt Q")); putValue (Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke ("alt Q"));
putValue (Action.MNEMONIC_KEY, KeyEvent.VK_Q); putValue (Action.MNEMONIC_KEY, KeyEvent.VK_Q);

View File

@ -3,6 +3,7 @@ package com.bytezone.diskbrowser.gui;
import java.awt.*; import java.awt.*;
import java.awt.geom.AffineTransform; import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.util.Enumeration;
import java.util.List; import java.util.List;
import java.util.prefs.Preferences; import java.util.prefs.Preferences;
@ -13,6 +14,8 @@ import javax.swing.event.ChangeListener;
import com.bytezone.common.FontAction.FontChangeEvent; import com.bytezone.common.FontAction.FontChangeEvent;
import com.bytezone.common.FontAction.FontChangeListener; import com.bytezone.common.FontAction.FontChangeListener;
import com.bytezone.diskbrowser.applefile.HiResImage; import com.bytezone.diskbrowser.applefile.HiResImage;
import com.bytezone.diskbrowser.applefile.Palette;
import com.bytezone.diskbrowser.applefile.PaletteFactory.CycleDirection;
import com.bytezone.diskbrowser.applefile.VisicalcFile; import com.bytezone.diskbrowser.applefile.VisicalcFile;
import com.bytezone.diskbrowser.disk.DiskAddress; import com.bytezone.diskbrowser.disk.DiskAddress;
import com.bytezone.diskbrowser.disk.SectorList; import com.bytezone.diskbrowser.disk.SectorList;
@ -42,19 +45,10 @@ class DataPanel extends JTabbedPane
boolean assemblerTextValid; boolean assemblerTextValid;
DataSource currentDataSource; DataSource currentDataSource;
// private Font font;
final MenuHandler menuHandler; final MenuHandler menuHandler;
public DataPanel (MenuHandler mh, Preferences prefs) public DataPanel (MenuHandler mh, Preferences prefs)
{ {
// String dataFontName =
// prefs.get (PreferencesDialog.prefsDataFont, PreferencesDialog.defaultFontName);
// System.out.println (dataFontName);
// int dataFontSize =
// prefs.getInt (PreferencesDialog.prefsDataFontSize,
// PreferencesDialog.defaultFontSize);
// font = new Font (dataFontName, Font.PLAIN, dataFontSize);
this.menuHandler = mh; this.menuHandler = mh;
setTabPlacement (SwingConstants.BOTTOM); setTabPlacement (SwingConstants.BOTTOM);
@ -80,9 +74,6 @@ class DataPanel extends JTabbedPane
imagePane.getVerticalScrollBar ().setUnitIncrement (50); imagePane.getVerticalScrollBar ().setUnitIncrement (50);
imagePane.getHorizontalScrollBar ().setUnitIncrement (25); imagePane.getHorizontalScrollBar ().setUnitIncrement (25);
// setTabsFont (font);
// this.setMinimumSize (new Dimension (800, 200));
addChangeListener (new ChangeListener () addChangeListener (new ChangeListener ()
{ {
@Override @Override
@ -130,19 +121,43 @@ class DataPanel extends JTabbedPane
mh.colourQuirksItem.setAction (new ColourQuirksAction (this)); mh.colourQuirksItem.setAction (new ColourQuirksAction (this));
mh.monochromeItem.setAction (new MonochromeAction (this)); mh.monochromeItem.setAction (new MonochromeAction (this));
mh.debuggingItem.setAction (new DebuggingAction (this)); mh.debuggingItem.setAction (new DebuggingAction (this));
mh.paletteItem.setAction (new PaletteAction (this));
// fill in the placeholders created by the MenuHandler
List<Palette> palettes = HiResImage.getPalettes ();
ButtonGroup buttonGroup = mh.paletteGroup;
Enumeration<AbstractButton> enumeration = buttonGroup.getElements ();
int ndx = 0;
while (enumeration.hasMoreElements ())
{
JCheckBoxMenuItem item = (JCheckBoxMenuItem) enumeration.nextElement ();
item.setAction (new PaletteAction (this, palettes.get (ndx++)));
}
mh.nextPaletteItem.setAction (new NextPaletteAction (this, buttonGroup));
mh.prevPaletteItem.setAction (new PreviousPaletteAction (this, buttonGroup));
} }
public void cyclePalette () public void selectPalette (Palette palette)
{ {
if (currentDataSource instanceof HiResImage) if (currentDataSource instanceof HiResImage)
{ {
HiResImage image = (HiResImage) currentDataSource; HiResImage image = (HiResImage) currentDataSource;
image.cyclePalette (); image.setPalette (palette);
imagePanel.setImage (image.getImage ()); imagePanel.setImage (image.getImage ());
} }
} }
public Palette cyclePalette (CycleDirection direction)
{
if (currentDataSource instanceof HiResImage)
{
HiResImage image = (HiResImage) currentDataSource;
Palette palette = image.cyclePalette (direction);
imagePanel.setImage (image.getImage ());
return palette;
}
return null;
}
public void setColourQuirks (boolean value) public void setColourQuirks (boolean value)
{ {
if (currentDataSource instanceof HiResImage) if (currentDataSource instanceof HiResImage)
@ -210,6 +225,7 @@ class DataPanel extends JTabbedPane
hexText.setText (""); hexText.setText ("");
disassemblyText.setText (""); disassemblyText.setText ("");
removeImage (); removeImage ();
menuHandler.colourMenu.setEnabled (false);
return; return;
} }
@ -244,11 +260,15 @@ class DataPanel extends JTabbedPane
BufferedImage image = dataSource.getImage (); BufferedImage image = dataSource.getImage ();
if (image == null) if (image == null)
{
removeImage (); removeImage ();
menuHandler.colourMenu.setEnabled (false);
}
else else
{ {
imagePanel.setImage (image); imagePanel.setImage (image);
imagePane.setViewportView (imagePanel); imagePane.setViewportView (imagePanel);
menuHandler.colourMenu.setEnabled (true);
if (!imageVisible) if (!imageVisible)
{ {
int selected = getSelectedIndex (); int selected = getSelectedIndex ();

View File

@ -1,5 +1,6 @@
package com.bytezone.diskbrowser.gui; package com.bytezone.diskbrowser.gui;
import java.awt.Toolkit;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
@ -15,9 +16,9 @@ public class DebuggingAction extends AbstractAction
public DebuggingAction (DataPanel owner) public DebuggingAction (DataPanel owner)
{ {
super ("Debugging"); super ("Debugging");
int mask = Toolkit.getDefaultToolkit ().getMenuShortcutKeyMask ();
putValue (Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke (KeyEvent.VK_D, mask));
putValue (Action.SHORT_DESCRIPTION, "Show debugging information"); putValue (Action.SHORT_DESCRIPTION, "Show debugging information");
putValue (Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke ("alt G"));
putValue (Action.MNEMONIC_KEY, KeyEvent.VK_G);
this.owner = owner; this.owner = owner;
} }

View File

@ -3,6 +3,8 @@ package com.bytezone.diskbrowser.gui;
import java.awt.Desktop; import java.awt.Desktop;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.util.Enumeration;
import java.util.List;
import java.util.prefs.Preferences; import java.util.prefs.Preferences;
import javax.swing.*; import javax.swing.*;
@ -13,6 +15,8 @@ import com.bytezone.common.OSXAdapter;
import com.bytezone.common.Platform; import com.bytezone.common.Platform;
import com.bytezone.common.QuitAction.QuitListener; import com.bytezone.common.QuitAction.QuitListener;
import com.bytezone.diskbrowser.applefile.HiResImage; import com.bytezone.diskbrowser.applefile.HiResImage;
import com.bytezone.diskbrowser.applefile.Palette;
import com.bytezone.diskbrowser.applefile.PaletteFactory;
import com.bytezone.diskbrowser.applefile.VisicalcFile; import com.bytezone.diskbrowser.applefile.VisicalcFile;
import com.bytezone.diskbrowser.disk.DataDisk; import com.bytezone.diskbrowser.disk.DataDisk;
import com.bytezone.diskbrowser.disk.FormattedDisk; import com.bytezone.diskbrowser.disk.FormattedDisk;
@ -27,12 +31,14 @@ public class MenuHandler
private static final String PREFS_COLOUR_QUIRKS = "colour quirks"; private static final String PREFS_COLOUR_QUIRKS = "colour quirks";
private static final String PREFS_MONOCHROME = "monochrome"; private static final String PREFS_MONOCHROME = "monochrome";
private static final String PREFS_DEBUGGING = "debugging"; private static final String PREFS_DEBUGGING = "debugging";
private static final String PREFS_PALETTE = "palette";
FormattedDisk currentDisk; FormattedDisk currentDisk;
JMenuBar menuBar = new JMenuBar (); JMenuBar menuBar = new JMenuBar ();
JMenu fileMenu = new JMenu ("File"); JMenu fileMenu = new JMenu ("File");
JMenu formatMenu = new JMenu ("Format"); JMenu formatMenu = new JMenu ("Format");
JMenu colourMenu = new JMenu ("Colours");
JMenu helpMenu = new JMenu ("Help"); JMenu helpMenu = new JMenu ("Help");
// File menu items // File menu items
@ -60,12 +66,16 @@ public class MenuHandler
JMenuItem colourQuirksItem = new JCheckBoxMenuItem ("Colour quirks"); JMenuItem colourQuirksItem = new JCheckBoxMenuItem ("Colour quirks");
JMenuItem monochromeItem = new JCheckBoxMenuItem ("Monochrome"); JMenuItem monochromeItem = new JCheckBoxMenuItem ("Monochrome");
JMenuItem debuggingItem = new JCheckBoxMenuItem ("Debugging"); JMenuItem debuggingItem = new JCheckBoxMenuItem ("Debugging");
JMenuItem paletteItem = new JMenuItem ("Cycle Palette"); JMenuItem nextPaletteItem = new JMenuItem ("Next Palette");
JMenuItem prevPaletteItem = new JMenuItem ("Previous Palette");
ButtonGroup paletteGroup = new ButtonGroup ();
public MenuHandler (Preferences prefs) public MenuHandler (Preferences prefs)
{ {
menuBar.add (fileMenu); menuBar.add (fileMenu);
menuBar.add (formatMenu); menuBar.add (formatMenu);
menuBar.add (colourMenu);
menuBar.add (helpMenu); menuBar.add (helpMenu);
fileMenu.add (rootItem); fileMenu.add (rootItem);
@ -87,6 +97,7 @@ public class MenuHandler
+ " PRINT SPC(12):\n" + "NEXT :\n" + "VTAB 5:\n" + "HTAB 24:\n" + "PRINT AB$\n"); + " PRINT SPC(12):\n" + "NEXT :\n" + "VTAB 5:\n" + "HTAB 24:\n" + "PRINT AB$\n");
fileMenu.add (duplicateItem); fileMenu.add (duplicateItem);
fileMenu.add (debuggingItem);
formatMenu.add (lineWrapItem); formatMenu.add (lineWrapItem);
formatMenu.add (showCatalogItem); formatMenu.add (showCatalogItem);
@ -105,12 +116,21 @@ public class MenuHandler
formatMenu.add (sector256Item); formatMenu.add (sector256Item);
formatMenu.add (sector512Item); formatMenu.add (sector512Item);
formatMenu.addSeparator (); // set placeholders for the palettes
List<Palette> palettes = HiResImage.getPalettes ();
for (int i = 0; i < palettes.size (); i++)
{
JCheckBoxMenuItem menuItem = new JCheckBoxMenuItem ("x");
paletteGroup.add (menuItem);
colourMenu.add (menuItem);
}
formatMenu.add (colourQuirksItem); colourMenu.addSeparator ();
formatMenu.add (monochromeItem); colourMenu.add (colourQuirksItem);
formatMenu.add (debuggingItem); colourMenu.add (monochromeItem);
formatMenu.add (paletteItem); colourMenu.addSeparator ();
colourMenu.add (nextPaletteItem);
colourMenu.add (prevPaletteItem);
helpMenu.add (new JMenuItem (new EnvironmentAction ())); helpMenu.add (new JMenuItem (new EnvironmentAction ()));
@ -184,6 +204,8 @@ public class MenuHandler
prefs.putBoolean (PREFS_COLOUR_QUIRKS, colourQuirksItem.isSelected ()); prefs.putBoolean (PREFS_COLOUR_QUIRKS, colourQuirksItem.isSelected ());
prefs.putBoolean (PREFS_MONOCHROME, monochromeItem.isSelected ()); prefs.putBoolean (PREFS_MONOCHROME, monochromeItem.isSelected ());
prefs.putBoolean (PREFS_DEBUGGING, debuggingItem.isSelected ()); prefs.putBoolean (PREFS_DEBUGGING, debuggingItem.isSelected ());
prefs.putInt (PREFS_PALETTE,
HiResImage.getPaletteFactory ().getCurrentPaletteIndex ());
} }
@Override @Override
@ -197,6 +219,21 @@ public class MenuHandler
monochromeItem.setSelected (prefs.getBoolean (PREFS_MONOCHROME, false)); monochromeItem.setSelected (prefs.getBoolean (PREFS_MONOCHROME, false));
debuggingItem.setSelected (prefs.getBoolean (PREFS_DEBUGGING, false)); debuggingItem.setSelected (prefs.getBoolean (PREFS_DEBUGGING, false));
int paletteIndex = prefs.getInt (PREFS_PALETTE, 0);
PaletteFactory paletteFactory = HiResImage.getPaletteFactory ();
paletteFactory.setCurrentPalette (paletteIndex);
Palette palette = paletteFactory.getCurrentPalette ();
Enumeration<AbstractButton> enumeration = paletteGroup.getElements ();
while (enumeration.hasMoreElements ())
{
JCheckBoxMenuItem item = (JCheckBoxMenuItem) enumeration.nextElement ();
if (item.getText ().equals (palette.getName ()))
{
item.setSelected (true);
break;
}
}
HiResImage.setDefaultColourQuirks (colourQuirksItem.isSelected ()); HiResImage.setDefaultColourQuirks (colourQuirksItem.isSelected ());
HiResImage.setDefaultMonochrome (monochromeItem.isSelected ()); HiResImage.setDefaultMonochrome (monochromeItem.isSelected ());
VisicalcFile.setDefaultDebug (debuggingItem.isSelected ()); VisicalcFile.setDefaultDebug (debuggingItem.isSelected ());

View File

@ -0,0 +1,45 @@
package com.bytezone.diskbrowser.gui;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.Enumeration;
import javax.swing.*;
import com.bytezone.diskbrowser.applefile.Palette;
import com.bytezone.diskbrowser.applefile.PaletteFactory.CycleDirection;
public class NextPaletteAction extends AbstractAction
{
private final DataPanel owner;
private final ButtonGroup buttonGroup;
public NextPaletteAction (DataPanel owner, ButtonGroup buttonGroup)
{
super ("Next Palette");
putValue (Action.SHORT_DESCRIPTION, "Select next color palette");
putValue (Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke ("alt N"));
putValue (Action.MNEMONIC_KEY, KeyEvent.VK_N);
this.owner = owner;
this.buttonGroup = buttonGroup;
}
@Override
public void actionPerformed (ActionEvent e)
{
Palette palette = owner.cyclePalette (CycleDirection.FORWARDS);
if (palette != null)
{
Enumeration<AbstractButton> enumeration = buttonGroup.getElements ();
while (enumeration.hasMoreElements ())
{
JCheckBoxMenuItem item = (JCheckBoxMenuItem) enumeration.nextElement ();
if (item.getText ().equals (palette.getName ()))
{
item.setSelected (true);
break;
}
}
}
}
}

View File

@ -1,28 +1,28 @@
package com.bytezone.diskbrowser.gui; package com.bytezone.diskbrowser.gui;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction; import javax.swing.AbstractAction;
import javax.swing.Action; import javax.swing.Action;
import javax.swing.KeyStroke;
import com.bytezone.diskbrowser.applefile.Palette;
public class PaletteAction extends AbstractAction public class PaletteAction extends AbstractAction
{ {
private final Palette palette;
private final DataPanel owner; private final DataPanel owner;
public PaletteAction (DataPanel owner) public PaletteAction (DataPanel owner, Palette palette)
{ {
super ("Cycle Palette"); super (palette.getName ());
putValue (Action.SHORT_DESCRIPTION, "Select next color palette"); putValue (Action.SHORT_DESCRIPTION, "Select color palette: " + palette.getName ());
putValue (Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke ("alt P"));
putValue (Action.MNEMONIC_KEY, KeyEvent.VK_P);
this.owner = owner; this.owner = owner;
this.palette = palette;
} }
@Override @Override
public void actionPerformed (ActionEvent e) public void actionPerformed (ActionEvent e)
{ {
owner.cyclePalette (); owner.selectPalette (palette);
} }
} }

View File

@ -0,0 +1,45 @@
package com.bytezone.diskbrowser.gui;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.util.Enumeration;
import javax.swing.*;
import com.bytezone.diskbrowser.applefile.Palette;
import com.bytezone.diskbrowser.applefile.PaletteFactory.CycleDirection;
public class PreviousPaletteAction extends AbstractAction
{
private final DataPanel owner;
private final ButtonGroup buttonGroup;
public PreviousPaletteAction (DataPanel owner, ButtonGroup buttonGroup)
{
super ("Previous Palette");
putValue (Action.SHORT_DESCRIPTION, "Select previous color palette");
putValue (Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke ("alt P"));
putValue (Action.MNEMONIC_KEY, KeyEvent.VK_P);
this.owner = owner;
this.buttonGroup = buttonGroup;
}
@Override
public void actionPerformed (ActionEvent e)
{
Palette palette = owner.cyclePalette (CycleDirection.BACKWARDS);
if (palette != null)
{
Enumeration<AbstractButton> enumeration = buttonGroup.getElements ();
while (enumeration.hasMoreElements ())
{
JCheckBoxMenuItem item = (JCheckBoxMenuItem) enumeration.nextElement ();
if (item.getText ().equals (palette.getName ()))
{
item.setSelected (true);
break;
}
}
}
}
}