TileMangler/src/tm/ui/TMUI.java
lif 37e9e9935c Rename to "TileMangler"
Prefer not to have edgy references to child sexual assault in our tools.
Consider that victims of such violence may well grow up to become ROM
hackers just as often as the rest of us. Let's not be rude to them!
2024-02-01 20:32:34 -08:00

5034 lines
No EOL
166 KiB
Java

/*
*
* Copyright (C) 2003 Kent Hansen.
*
* This file is part of Tile Mangler.
*
* Tile Mangler is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Tile Mangler is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
package tm.ui;
import tm.*;
import tm.colorcodecs.*;
import tm.tilecodecs.*;
import tm.fileselection.*;
import tm.modaldialog.*;
import tm.treenodes.*;
import tm.utils.*;
import tm.threads.*;
import tm.filelistener.*;
import tm.canvases.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.border.*;
import javax.swing.filechooser.FileFilter;
import javax.swing.plaf.ButtonUI;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.ToolBarUI;
import java.util.Locale;
import java.util.Vector;
import java.util.Hashtable;
import java.util.StringTokenizer;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
/**
*
* The main UI window.
* Has a desktop for child frames, a menu, toolbars, a palette panel, and a statusbar.
* The code is mainly dominated by
* 1) setting up the various menus and toolbars; and
* 2) providing action handlers for menu items and tool buttons.
*
**/
public class TMUI extends JFrame {
private static String OS = System.getProperty("os.name").toLowerCase();
public static boolean isLinux = OS.indexOf("nix") >= 0 || OS.indexOf("nux") >= 0 || OS.indexOf("aix") > 0;
public static boolean isWindows = OS.indexOf("win") >= 0;
// tool types
public static final int SELECT_TOOL = 1;
public static final int ZOOM_TOOL = 2;
public static final int PICKUP_TOOL = 3;
public static final int BRUSH_TOOL = 4;
public static final int LINE_TOOL = 5;
public static final int FILL_TOOL = 6;
public static final int REPLACE_TOOL = 7;
public static final int MOVE_TOOL = 8;
private int tool = SELECT_TOOL;
private int previousTool;
private int maxRecentFiles = 10;
private Vector recentFiles = new Vector();
private Vector colorcodecs;
private Vector tilecodecs;
private Vector filefilters;
private Vector palettefilters;
private Vector filelisteners;
private TMSelectionCanvas copiedSelection=null;
// UI components
private mxScrollableDesktop desktop = new mxScrollableDesktop();
private TMStatusBar statusBar = new TMStatusBar();
private JToolBar toolBar = new JToolBar(JToolBar.HORIZONTAL);
private JToolBar toolPalette = new JToolBar(JToolBar.VERTICAL);
private JToolBar selectionToolBar = new JToolBar(JToolBar.VERTICAL);
private JToolBar navBar = new JToolBar(JToolBar.HORIZONTAL);
private JMenuBar menuBar = new JMenuBar();
private JPanel toolPane = new JPanel(); // the drawing tools and such
private JPanel toolBarPane = new JPanel(); // the program toolbars
private JPanel bottomPane = new JPanel(); // palette and statusbar
private TMPalettePane palettePane;
// file choosers
private TMApprovedFileOpenChooser fileOpenChooser = new TMApprovedFileOpenChooser();
private TMApprovedFileSaveChooser fileSaveChooser = new TMApprovedFileSaveChooser();
private TMApprovedFileOpenChooser bitmapOpenChooser = new TMApprovedFileOpenChooser();
private TMApprovedFileSaveChooser bitmapSaveChooser = new TMApprovedFileSaveChooser();
private TMApprovedFileOpenChooser paletteOpenChooser = new TMApprovedFileOpenChooser();
private TMBitmapFilters bmf = new TMBitmapFilters();
private TMFileFilter allFilter = new AllFilter();
// custom dialogs
private TMGoToDialog goToDialog;
private TMNewFileDialog newFileDialog;
private TMCustomCodecDialog customCodecDialog;
private TMStretchDialog stretchDialog;
private TMCanvasSizeDialog canvasSizeDialog;
private TMBlockSizeDialog blockSizeDialog;
private TMAddToTreeDialog addBookmarkDialog;
private TMAddToTreeDialog addPaletteDialog;
private TMOrganizeTreeDialog organizeBookmarksDialog;
private TMOrganizeTreeDialog organizePalettesDialog;
private TMNewPaletteDialog newPaletteDialog;
private TMPaletteSizeDialog paletteSizeDialog;
private TMImportInternalPaletteDialog importInternalPaletteDialog;
// toolbar buttons
ClassLoader cl = getClass().getClassLoader();
private ToolButton newButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/New24.png")));
private ToolButton openButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/Open24.png")));
private ToolButton saveButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/Save24.png")));
private ToolButton cutButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/Cut24.png")));
private ToolButton copyButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/Copy24.png")));
private ToolButton pasteButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/Paste24.png")));
private ToolButton undoButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/Undo24.png")));
private ToolButton redoButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/Redo24.png")));
private ToolButton gotoButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/Import24.png")));
private ToolButton addBookmarkButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/Bookmarks24.png")));
private ToolButton decWidthButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/DecWidth24.png")));
private ToolButton incWidthButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/IncWidth24.png")));
private ToolButton decHeightButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/DecHeight24.png")));
private ToolButton incHeightButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/IncHeight24.png")));
// navigation bar buttons
private ToolButton minusPageButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/Rewind24.png")));
private ToolButton minusRowButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/StepBack24.png")));
private ToolButton minusTileButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/Back24.png")));
private ToolButton minusByteButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/Minus24.png")));
private ToolButton plusByteButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/Plus24.png")));
private ToolButton plusTileButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/Forward24.png")));
private ToolButton plusRowButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/StepForward24.png")));
private ToolButton plusPageButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/FastForward24.png")));
// tool palette buttons
private ToolToggleButton selectButton = new ToolToggleButton(new ImageIcon(cl.getResource("tm/icons/light/Selection24.png")));
private ToolToggleButton zoomButton = new ToolToggleButton(new ImageIcon(cl.getResource("tm/icons/light/Zoom24.png")));
private ToolToggleButton pickupButton = new ToolToggleButton(new ImageIcon(cl.getResource("tm/icons/light/Dropper24.png")));
private ToolToggleButton brushButton = new ToolToggleButton(new ImageIcon(cl.getResource("tm/icons/light/Brush24.png")));
private ToolToggleButton lineButton = new ToolToggleButton(new ImageIcon(cl.getResource("tm/icons/light/Line24.png")));
private ToolToggleButton fillButton = new ToolToggleButton(new ImageIcon(cl.getResource("tm/icons/light/Fill24.png")));
private ToolToggleButton replaceButton = new ToolToggleButton(new ImageIcon(cl.getResource("tm/icons/light/ColorReplacer24.png")));
private ToolToggleButton moveButton = new ToolToggleButton(new ImageIcon(cl.getResource("tm/icons/light/Mover24.gif")));
// selection palette buttons
private ToolButton mirrorButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/Mirror24.png")));
private ToolButton flipButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/Flip24.png")));
private ToolButton rotateRightButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/RotateRight24.png")));
private ToolButton rotateLeftButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/RotateLeft24.png")));
private ToolButton shiftLeftButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/ShiftLeft24.png")));
private ToolButton shiftRightButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/ShiftRight24.png")));
private ToolButton shiftUpButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/ShiftUp24.png")));
private ToolButton shiftDownButton = new ToolButton(new ImageIcon(cl.getResource("tm/icons/light/ShiftDown24.png")));
// File menu
private JMenu fileMenu = new JMenu("File");
private JMenuItem newMenuItem = new JMenuItem("New...");
private JMenuItem openMenuItem = new JMenuItem("Open...");
private JMenu reopenMenu = new JMenu("Reopen");
private JMenuItem closeMenuItem = new JMenuItem("Close");
private JMenuItem closeAllMenuItem = new JMenuItem("Close All");
private JMenuItem saveMenuItem = new JMenuItem("Save");
private JMenuItem saveAsMenuItem = new JMenuItem("Save As...");
private JMenuItem saveAllMenuItem = new JMenuItem("Save All");
private JMenuItem exitMenuItem = new JMenuItem("Exit");
// Edit menu
private JMenu editMenu = new JMenu("Edit");
private JMenuItem undoMenuItem = new JMenuItem("Undo");
private JMenuItem redoMenuItem = new JMenuItem("Redo");
private JMenuItem cutMenuItem = new JMenuItem("Cut");
private JMenuItem copyMenuItem = new JMenuItem("Copy");
private JMenuItem pasteMenuItem = new JMenuItem("Paste");
private JMenuItem clearMenuItem = new JMenuItem("Clear");
private JMenuItem selectAllMenuItem = new JMenuItem("Select All");
private JMenuItem copyToMenuItem = new JMenuItem("Copy To...");
private JMenuItem pasteFromMenuItem = new JMenuItem("Paste From...");
// Image menu
private JMenu imageMenu = new JMenu("Image");
private JMenuItem mirrorMenuItem = new JMenuItem("Mirror");
private JMenuItem flipMenuItem = new JMenuItem("Flip");
private JMenuItem rotateRightMenuItem = new JMenuItem("Rotate Right");
private JMenuItem rotateLeftMenuItem = new JMenuItem("Rotate Left");
private JMenuItem shiftLeftMenuItem = new JMenuItem("Shift Left");
private JMenuItem shiftRightMenuItem = new JMenuItem("Shift Right");
private JMenuItem shiftUpMenuItem = new JMenuItem("Shift Up");
private JMenuItem shiftDownMenuItem = new JMenuItem("Shift Down");
private JMenuItem canvasSizeMenuItem = new JMenuItem("Canvas Size...");
private JMenuItem stretchMenuItem = new JMenuItem("Stretch...");
// View menu
private JMenu viewMenu = new JMenu("View");
private JCheckBoxMenuItem statusBarMenuItem = new JCheckBoxMenuItem("Statusbar");
private JCheckBoxMenuItem toolBarMenuItem = new JCheckBoxMenuItem("Toolbar");
private JMenu tileCodecMenu = new JMenu("Codec");
private JMenu zoomMenu = new JMenu("Zoom");
private JMenuItem zoomInMenuItem = new JMenuItem("In");
private JMenuItem zoomOutMenuItem = new JMenuItem("Out");
private JMenuItem _100MenuItem = new JMenuItem("100%");
private JMenuItem _200MenuItem = new JMenuItem("200%");
private JMenuItem _400MenuItem = new JMenuItem("400%");
private JMenuItem _800MenuItem = new JMenuItem("800%");
private JMenuItem _1600MenuItem = new JMenuItem("1600%");
private JMenuItem _3200MenuItem = new JMenuItem("3200%");
private JMenu blockSizeMenu = new JMenu("Block Size");
private JCheckBoxMenuItem sizeBlockToCanvasMenuItem = new JCheckBoxMenuItem("Full Canvas");
private JMenuItem customBlockSizeMenuItem = new JMenuItem("Custom...");
private JRadioButtonMenuItem rowInterleaveBlocksMenuItem = new JRadioButtonMenuItem("Row-interleave Blocks");
private JMenu modeMenu = new JMenu("Mode");
private JRadioButtonMenuItem _1DimensionalMenuItem = new JRadioButtonMenuItem("1-Dimensional");
private JRadioButtonMenuItem _2DimensionalMenuItem = new JRadioButtonMenuItem("2-Dimensional");
private JCheckBoxMenuItem blockGridMenuItem = new JCheckBoxMenuItem("Block Grid");
private JCheckBoxMenuItem tileGridMenuItem = new JCheckBoxMenuItem("Tile Grid");
private JCheckBoxMenuItem pixelGridMenuItem = new JCheckBoxMenuItem("Pixel Grid");
// Navigate menu
private JMenu navigateMenu = new JMenu("Navigate");
private JMenuItem goToMenuItem = new JMenuItem("Go To...");
private JMenuItem goToAgainMenuItem = new JMenuItem("Go To Again");
private JMenuItem addToBookmarksMenuItem = new JMenuItem("Add To Bookmarks...");
private JMenuItem organizeBookmarksMenuItem = new JMenuItem("Organize Bookmarks...");
// private JMenuItem saveBookmarksMenuItem = new JMenuItem("Save Bookmarks");
// Palette menu
private JMenu paletteMenu = new JMenu("Palette");
private JMenuItem editColorsMenuItem = new JMenuItem("Edit Colors...");
private JMenu colorCodecMenu = new JMenu("Format");
private JMenu paletteEndiannessMenu = new JMenu("Endianness");
private JRadioButtonMenuItem paletteLittleEndianMenuItem = new JRadioButtonMenuItem("Little");
private JRadioButtonMenuItem paletteBigEndianMenuItem = new JRadioButtonMenuItem("Big");
private JRadioButtonMenuItem dummyPaletteMenuItem = new JRadioButtonMenuItem();
private JMenuItem paletteSizeMenuItem = new JMenuItem("Size...");
private JMenuItem newPaletteMenuItem = new JMenuItem("New...");
private JMenu importPaletteMenu = new JMenu("Import From");
private JMenuItem importInternalPaletteMenuItem = new JMenuItem("This File...");
private JMenuItem importExternalPaletteMenuItem = new JMenuItem("Another File...");
private JMenuItem addToPalettesMenuItem = new JMenuItem("Add To Palettes...");
private JMenuItem organizePalettesMenuItem = new JMenuItem("Organize Palettes...");
// private JMenuItem savePalettesMenuItem = new JMenuItem("Save Palettes");
// private JMenuItem exportPaletteMenuItem = new JMenuItem("Export..."); // tpl, c, asm, java?
// Window menu
private JMenu windowMenu = new JMenu("Window");
private JMenuItem newWindowMenuItem = new JMenuItem("New Window");
private JMenuItem tileMenuItem = new JMenuItem("Tile");
private JMenuItem cascadeMenuItem = new JMenuItem("Cascade");
private JMenuItem arrangeIconsMenuItem = new JMenuItem("Arrange Icons");
// Help menu
private JMenu helpMenu = new JMenu("Help");
private JMenuItem helpTopicsMenuItem = new JMenuItem("Help Topics");
//private JMenuItem tipMenuItem = new JMenuItem("Tip of the Millennium..."); // Still say no to drugs, okay?
private JMenuItem aboutMenuItem = new JMenuItem("About Tile Mangler...");
// button groups
private ButtonGroup toolButtonGroup = new ButtonGroup();
private ButtonGroup colorCodecButtonGroup = new ButtonGroup();
private ButtonGroup tileCodecButtonGroup = new ButtonGroup();
private ButtonGroup paletteButtonGroup = new ButtonGroup();
private ButtonGroup modeButtonGroup = new ButtonGroup();
private ButtonGroup paletteEndiannessButtonGroup = new ButtonGroup();
private Hashtable tileCodecButtonHashtable = new Hashtable();
private Hashtable colorCodecButtonHashtable = new Hashtable();
private Hashtable paletteButtonHashtable = new Hashtable();
private Hashtable fileListenerHashtable = new Hashtable();
private Xlator xl;
private File settingsFile = new File("settings.xml");
private Locale locale = Locale.getDefault();
private boolean viewStatusBar=true;
private boolean viewToolBar=true;
private String lastPath = "";
public static Color MenuBG = SystemColor.menu;
public static Color WindowBG = SystemColor.window;
public static Color AsideBG = SystemColor.desktop;
public static Color FrameBG = SystemColor.scrollbar;
public static boolean DarkIcons = false;
private Border emptyBorder = BorderFactory.createEmptyBorder();
private JSeparator separator = new JSeparator();
/**
*
* Creates a Tile Mangler UI.
*
**/
public TMUI() {
super("Tile Mangler");
//I tried to change the UI but it seems innatural
/*try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
e.printStackTrace();
}*/
setIconImage(new ImageIcon(cl.getResource("tm/icons/TMIcon.gif")).getImage());
if (settingsFile.exists()) {
// load settings from file
loadSettings();
}
else {
// assume this is the first time program is run
selectLanguage();
// File bookmarksDir = new File("bookmarks");
// bookmarksDir.mkdir();
// copy bookmarks.dtd to bookmarksDir
// File palettesDir = new File("palettes");
// palettesDir.mkdir();
// copy palettes.dtd to palettesDir
/* File resourcesDir = new File("resources");
if (!resourcesDir.exists()) {
resourcesDir.mkdir();
File resourceDTDFile = new File(resourcesDir, "tmres.dtd");
try {
FileWriter fw = new FileWriter(resourceDTDFile);
fw.write(""+
"<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n"+
"<!ELEMENT tmres (bookmarks?, palettes?)>\n"+
"<!ELEMENT bookmarks (folder | bookmark)*>\n"+
"<!ELEMENT palettes (folder | palette)*>\n"+
"<!ELEMENT folder (name, (folder | bookmark | palette)*)>\n"+
"<!ELEMENT bookmark (description)>\n"+
"<!ATTLIST bookmark\n"+
" offset CDATA #REQUIRED\n"+
" width CDATA #REQUIRED\n"+
" height CDATA #REQUIRED\n"+
" mode (1D | 2D) #REQUIRED\n"+
" codec CDATA #REQUIRED\n"+
" palIndex CDATA #REQUIRED\n"+
" palette CDATA #IMPLIED\n"+
">\n"+
"<!ELEMENT palette (description, data?)>\n"+
"<!ATTLIST palette\n"+
" id ID #IMPLIED\n"+
" direct (yes | no) #REQUIRED\n"+
" codec CDATA #REQUIRED\n"+
" size CDATA #REQUIRED\n"+
" offset CDATA #IMPLIED\n"+
" endianness (little | big) \"little\"\n"+
">\n"+
"<!ELEMENT data (#PCDATA)>\n"+
"<!ELEMENT name (#PCDATA)>\n"+
"<!ELEMENT description (#PCDATA)>\n"+
"");
fw.close();
}
catch (Exception e) { }
}*/
}
setLocale(locale);
Locale.setDefault(locale);
JComponent.setDefaultLocale(this.locale);
if(DarkIcons){
newButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/New24.png")));
openButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/Open24.png")));
saveButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/Save24.png")));
cutButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/Cut24.png")));
copyButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/Copy24.png")));
pasteButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/Paste24.png")));
undoButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/Undo24.png")));
redoButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/Redo24.png")));
gotoButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/Import24.png")));
addBookmarkButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/Bookmarks24.png")));
decWidthButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/DecWidth24.png")));
incWidthButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/IncWidth24.png")));
decHeightButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/DecHeight24.png")));
incHeightButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/IncHeight24.png")));
minusPageButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/Rewind24.png")));
minusRowButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/StepBack24.png")));
minusTileButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/Back24.png")));
minusByteButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/Minus24.png")));
plusByteButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/Plus24.png")));
plusTileButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/Forward24.png")));
plusRowButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/StepForward24.png")));
plusPageButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/FastForward24.png")));
selectButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/Selection24.png")));
zoomButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/Zoom24.png")));
pickupButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/Dropper24.png")));
brushButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/Brush24.png")));
lineButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/Line24.png")));
fillButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/Fill24.png")));
replaceButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/ColorReplacer24.png")));
moveButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/Mover24.gif")));
mirrorButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/Mirror24.png")));
flipButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/Flip24.png")));
rotateRightButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/RotateRight24.png")));
rotateLeftButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/RotateLeft24.png")));
shiftLeftButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/ShiftLeft24.png")));
shiftRightButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/ShiftRight24.png")));
shiftUpButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/ShiftUp24.png")));
shiftDownButton.setIcon(new ImageIcon(cl.getResource("tm/icons/dark/ShiftDown24.png")));
}
separator.setForeground(Color.decode("#292929"));
//desktop.repaint();
// show splash screen
//new TMSplashScreen(this); // No need for a splash screen, it runs immediately on modern systems
// create a translator
try {
xl = new Xlator("languages/language", locale);
} catch (Exception e) {
JOptionPane.showMessageDialog(this,
xlate("Error reading language file:")+"\n"+e.getMessage(),
"Tile Mangler",
JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
///////// Translate items
// File menu
fileMenu.setText(xlate("File"));
newMenuItem.setText(xlate("New"));
openMenuItem.setText(xlate("Open"));
reopenMenu.setText(xlate("Reopen"));
closeMenuItem.setText(xlate("Close"));
closeAllMenuItem.setText(xlate("Close_All"));
saveMenuItem.setText(xlate("Save"));
saveAsMenuItem.setText(xlate("Save_As"));
saveAllMenuItem.setText(xlate("Save_All"));
exitMenuItem.setText(xlate("Exit"));
// Edit menu
editMenu.setText(xlate("Edit"));
undoMenuItem.setText(xlate("Undo"));
redoMenuItem.setText(xlate("Redo"));
cutMenuItem.setText(xlate("Cut"));
copyMenuItem.setText(xlate("Copy"));
pasteMenuItem.setText(xlate("Paste"));
clearMenuItem.setText(xlate("Clear"));
selectAllMenuItem.setText(xlate("Select_All"));
copyToMenuItem.setText(xlate("Copy_To"));
pasteFromMenuItem.setText(xlate("Paste_From"));
pasteFromMenuItem.setText(xlate("New_Selection"));
pasteFromMenuItem.setText(xlate("Apply_Selection"));
// Image menu
imageMenu.setText(xlate("Image"));
mirrorMenuItem.setText(xlate("Mirror"));
flipMenuItem.setText(xlate("Flip"));
rotateRightMenuItem.setText(xlate("Rotate_Right"));
rotateLeftMenuItem.setText(xlate("Rotate_Left"));
shiftLeftMenuItem.setText(xlate("Shift_Left"));
shiftRightMenuItem.setText(xlate("Shift_Right"));
shiftUpMenuItem.setText(xlate("Shift_Up"));
shiftDownMenuItem.setText(xlate("Shift_Down"));
canvasSizeMenuItem.setText(xlate("Canvas_Size"));
stretchMenuItem.setText(xlate("Stretch"));
// View menu
viewMenu.setText(xlate("View"));
statusBarMenuItem.setText(xlate("Statusbar"));
toolBarMenuItem.setText(xlate("Toolbar"));
tileCodecMenu.setText(xlate("Codec"));
zoomMenu.setText(xlate("Zoom"));
zoomInMenuItem.setText(xlate("In"));
zoomOutMenuItem.setText(xlate("Out"));
_100MenuItem.setText(xlate("100%"));
_200MenuItem.setText(xlate("200%"));
_400MenuItem.setText(xlate("400%"));
_800MenuItem.setText(xlate("800%"));
_1600MenuItem.setText(xlate("1600%"));
_3200MenuItem.setText(xlate("3200%"));
modeMenu.setText(xlate("Mode"));
_1DimensionalMenuItem.setText(xlate("1_Dimensional"));
_2DimensionalMenuItem.setText(xlate("2_Dimensional"));
blockSizeMenu.setText(xlate("Block_Size"));
sizeBlockToCanvasMenuItem.setText(xlate("Full_Canvas"));
customBlockSizeMenuItem.setText(xlate("Custom_Block_Size"));
rowInterleaveBlocksMenuItem.setText(xlate("Row_Interleave_Blocks"));
blockGridMenuItem.setText(xlate("Block_Grid"));
tileGridMenuItem.setText(xlate("Tile_Grid"));
pixelGridMenuItem.setText(xlate("Pixel_Grid"));
// Navigate menu
navigateMenu.setText(xlate("Navigate"));
goToMenuItem.setText(xlate("Go_To"));
goToAgainMenuItem.setText(xlate("Go_To_Again"));
addToBookmarksMenuItem.setText(xlate("Add_To_Bookmarks"));
organizeBookmarksMenuItem.setText(xlate("Organize_Bookmarks"));
// Palette menu
paletteMenu.setText(xlate("Palette"));
editColorsMenuItem.setText(xlate("Edit_Colors"));
colorCodecMenu.setText(xlate("Format"));
paletteEndiannessMenu.setText(xlate("Endianness"));
paletteLittleEndianMenuItem.setText(xlate("Little_Endian"));
paletteBigEndianMenuItem.setText(xlate("Big_Endian"));
paletteSizeMenuItem.setText(xlate("Size"));
newPaletteMenuItem.setText(xlate("New"));
importPaletteMenu.setText(xlate("Import_From"));
importInternalPaletteMenuItem.setText(xlate("This_File"));
importExternalPaletteMenuItem.setText(xlate("Another_File"));
addToPalettesMenuItem.setText(xlate("Add_To_Palettes"));
organizePalettesMenuItem.setText(xlate("Organize_Palettes"));
// Window menu
windowMenu.setText(xlate("Window"));
newWindowMenuItem.setText(xlate("New_Window"));
tileMenuItem.setText(xlate("Tile"));
cascadeMenuItem.setText(xlate("Cascade"));
arrangeIconsMenuItem.setText(xlate("Arrange_Icons"));
// Help menu
helpMenu.setText(xlate("Help"));
helpTopicsMenuItem.setText(xlate("Help_Topics"));
aboutMenuItem.setText(xlate("About_Tile_Mangler"));
UIManager.put("OptionPane.yesButtonText", xlate("Yes"));
UIManager.put("OptionPane.noButtonText", xlate("No"));
UIManager.put("OptionPane.cancelButtonText", xlate("Cancel"));
UIManager.put("OptionPane.okButtonText", xlate("OK"));
fileOpenChooser.setDialogTitle(xlate("Open_File_Dialog_Title"));
fileSaveChooser.setDialogTitle(xlate("Save_As_Dialog_Title"));
bitmapOpenChooser.setDialogTitle(xlate("Paste_From_Dialog_Title"));
bitmapSaveChooser.setDialogTitle(xlate("Copy_To_Dialog_Title"));
paletteOpenChooser.setDialogTitle(xlate("Open_Palette_Dialog_Title"));
///////// Read specs
try {
TMSpecReader.readSpecsFromFile(new File("tmspec.xml"));
}
catch (SAXParseException e) {
JOptionPane.showMessageDialog(this,
xlate("Parser_Parse_Error")+"\n"+
e.getMessage()+"\n"+
"("+e.getSystemId()+",\n"+
"line "+e.getLineNumber()+")\n",
"Tile Mangler",
JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
catch (SAXException e) {
JOptionPane.showMessageDialog(this,
xlate("Parser_Parse_Error")+"\n"+e.getMessage(),
"Tile Mangler",
JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
catch (ParserConfigurationException e) {
JOptionPane.showMessageDialog(this,
xlate("Parser_Config_Error")+"\n"+e.getMessage(),
"Tile Mangler",
JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
catch (IOException e) {
JOptionPane.showMessageDialog(this,
xlate("Parser_IO_Error")+"\n"+e.getMessage(),
"Tile Mangler",
JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
colorcodecs = TMSpecReader.getColorCodecs();
tilecodecs = TMSpecReader.getTileCodecs();
filefilters = TMSpecReader.getFileFilters();
palettefilters = TMSpecReader.getPaletteFilters();
filelisteners = TMSpecReader.getFileListeners();
tilecodecs.add(new _3BPPLinearTileCodec());
//////////
// create dialogs.
goToDialog = new TMGoToDialog(this, xl);
newFileDialog = new TMNewFileDialog(this, xl);
// customCodecDialog = new TMCustomCodecDialog(this, "Custom Codec", true, xl);
stretchDialog = new TMStretchDialog(this, xl);
canvasSizeDialog = new TMCanvasSizeDialog(this, xl);
blockSizeDialog = new TMBlockSizeDialog(this, xl);
addBookmarkDialog = new TMAddToTreeDialog(this, "Add_To_Bookmarks_Dialog_Title", xl);
addPaletteDialog = new TMAddToTreeDialog(this, "Add_To_Palettes_Dialog_Title", xl);
organizeBookmarksDialog = new TMOrganizeTreeDialog(this, "Organize_Bookmarks_Dialog_Title", xl);
organizePalettesDialog = new TMOrganizeTreeDialog(this, "Organize_Palettes_Dialog_Title", xl);
newPaletteDialog = new TMNewPaletteDialog(this, xl);
paletteSizeDialog = new TMPaletteSizeDialog(this, xl);
importInternalPaletteDialog = new TMImportInternalPaletteDialog(this, xl);
newPaletteDialog.setCodecs(colorcodecs);
importInternalPaletteDialog.setCodecs(colorcodecs);
//Set up the GUI.
// main contentpane
JPanel pane = new JPanel();
setContentPane(pane);
pane.setDoubleBuffered(true);
pane.setLayout(new BorderLayout());
// main toolbar
initToolBar();
initNavBar();
toolBarPane.setLayout(new FlowLayout(FlowLayout.LEFT));
toolBarPane.setBackground(MenuBG);
toolBarPane.add(toolBar);
toolBarPane.add(navBar);
pane.add(toolBarPane, BorderLayout.NORTH);
// desktop
pane.add(new JScrollPane(desktop), BorderLayout.CENTER);
// palette pane & statusbar
palettePane = new TMPalettePane(this);
//statusBar.setBorder(new BevelBorder(BevelBorder.LOWERED));
bottomPane.setLayout(new BorderLayout());
bottomPane.add(palettePane, BorderLayout.CENTER);
bottomPane.add(statusBar, BorderLayout.SOUTH);
pane.add(bottomPane, BorderLayout.SOUTH);
// tool palettes
initToolPalette();
initSelectionToolBar();
JPanel barPane = new JPanel();
//barPane.setLayout(new GridLayout(1, 2));
barPane.setBackground(AsideBG);
barPane.add(selectionToolBar);
barPane.add(toolPalette);
toolPane.setBackground(AsideBG);
toolPane.setLayout(new BorderLayout());
toolPane.add(barPane, BorderLayout.NORTH);
pane.add(toolPane, BorderLayout.WEST);
// menus
initMenuBar();
setJMenuBar(menuBar);
buildReopenMenu();
initTileCodecUIStuff();
buildColorCodecsMenu();
initPaletteOpenChooser();
// Set up file save chooser.
fileSaveChooser.setAcceptAllFileFilterUsed(false);
fileSaveChooser.addChoosableFileFilter(allFilter);
fileSaveChooser.setFileFilter(allFilter);
// Set up bitmap open chooser.
bitmapOpenChooser.setAcceptAllFileFilterUsed(false);
bitmapOpenChooser.addChoosableFileFilter(bmf.supported);
bitmapOpenChooser.addChoosableFileFilter(bmf.gif);
bitmapOpenChooser.addChoosableFileFilter(bmf.jpeg);
bitmapOpenChooser.addChoosableFileFilter(bmf.png);
bitmapOpenChooser.addChoosableFileFilter(bmf.bmp);
bitmapOpenChooser.addChoosableFileFilter(bmf.pcx);
bitmapOpenChooser.setFileFilter(bmf.supported);
// Set up bitmap save chooser.
bitmapSaveChooser.setAcceptAllFileFilterUsed(false);
bitmapSaveChooser.addChoosableFileFilter(bmf.gif);
bitmapSaveChooser.addChoosableFileFilter(bmf.jpeg);
bitmapSaveChooser.addChoosableFileFilter(bmf.png);
bitmapSaveChooser.addChoosableFileFilter(bmf.bmp);
bitmapSaveChooser.addChoosableFileFilter(bmf.pcx);
bitmapSaveChooser.setFileFilter(bmf.png);
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
doExitCommand();
}
public void windowActivated(WindowEvent e) {
setExtendedState(JFrame.NORMAL); // Hacky way to make it not run in full screen by default
// HACK to fix the GUI after running FCEU in fullscreen mode
// int state = getExtendedState();
// setExtendedState(JFrame.ICONIFIED);
// setExtendedState(state);
}
});
// Center the frame
int inset = 128;
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(inset, inset,
screenSize.width - inset*2,
screenSize.height-inset*2);
//Make dragging faster:
desktop.putClientProperty("JDesktopPane.dragMode", "outline");
// MDI menus and such shouldn't be shown until file loaded.
disableMDIStuff();
toolBarPane.setVisible(viewToolBar);
// Show and maximize.
setVisible(true);
setExtendedState(JFrame.MAXIMIZED_BOTH);
}
/**
*
* Saves program settings to file.
*
**/
public void saveSettings() {
StringBuffer sb = new StringBuffer();
sb.append("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n");
sb.append("<!DOCTYPE settings SYSTEM \"settings.dtd\">\n");
sb.append("<settings>\n");
sb.append(makePropertyTag("locale", locale.toString()));
sb.append(makePropertyTag("viewStatusBar", ""+viewStatusBar));
sb.append(makePropertyTag("viewToolBar", ""+viewToolBar));
sb.append(makePropertyTag("maxRecentFiles", ""+maxRecentFiles));
File recentFile = null;
//To remember last path
for (int i=0; i<recentFiles.size(); i++) {
recentFile = (File)recentFiles.get(i);
sb.append(makePropertyTag("recentFile", recentFile.getAbsolutePath()));
}
sb.append(makePropertyTag("lastPath", lastPath));
sb.append(makePropertyTag("MenuBG", "#"+Integer.toHexString(MenuBG.getRGB()).substring(2)));
sb.append(makePropertyTag("WindowBG", "#"+Integer.toHexString(WindowBG.getRGB()).substring(2)));
sb.append(makePropertyTag("AsideBG", "#"+Integer.toHexString(AsideBG.getRGB()).substring(2)));
sb.append(makePropertyTag("FrameBG", "#"+Integer.toHexString(FrameBG.getRGB()).substring(2)));
sb.append(makePropertyTag("DarkIcons", DarkIcons?"true":"false"));
sb.append("</settings>\n");
// write to file
try {
FileWriter fw = new FileWriter(settingsFile);
fw.write(sb.toString());
fw.close();
}
catch (Exception e) {
JOptionPane.showMessageDialog(this,
xlate("Save_Settings_Error")+"\n"+e.getMessage(),
"Tile Mangler",
JOptionPane.ERROR_MESSAGE);
}
}
/**
*
* Makes a property tag with the given key and value.
*
**/
public String makePropertyTag(String key, String value) {
return " <property key=\""+key+"\" value=\""+value+"\"/>\n";
}
/**
*
* Loads program settings from file.
*
**/
public void loadSettings() {
boolean loadedLocale = false;
Document doc = null;
try {
doc = XMLParser.parse(settingsFile);
}
catch (Exception e) {
JOptionPane.showMessageDialog(this,
xlate("Load_Settings_Error")+"\n"+e.getMessage(),
"Tile Mangler",
JOptionPane.ERROR_MESSAGE);
}
if (doc == null) return;
Element settings = doc.getDocumentElement();
NodeList properties = settings.getElementsByTagName("property");
// process all the properties
for (int i=0; i<properties.getLength(); i++) {
// get property (key, value) pair
Element property = (Element)properties.item(i);
String key = property.getAttribute("key");
String value = property.getAttribute("value");
// handle property
if (key.equals("locale")) {
StringTokenizer st = new StringTokenizer(value, "_");
if (st.countTokens() != 2) continue;
String language = st.nextToken();
String country = st.nextToken();
locale = new Locale(language, country);
loadedLocale = true;
}
if (key.equals("viewStatusBar")) {
viewStatusBar = value.equals("true");
}
else if (key.equals("viewToolBar")) {
viewToolBar = value.equals("true");
}
else if (key.equals("maxRecentFiles")) {
maxRecentFiles = Integer.parseInt(value);
}
else if (key.equals("recentFile")) {
File file = new File(value);
if (file.exists()) {
recentFiles.add(file);
}
}
else if (key.equals("lastPath")) {
lastPath = value;
}
else if (key.equals("MenuBG")) {
MenuBG = Color.decode(value);
}
else if (key.equals("WindowBG")) {
WindowBG = Color.decode(value);
}
else if (key.equals("AsideBG")) {
AsideBG = Color.decode(value);
}
else if (key.equals("FrameBG")) {
FrameBG = Color.decode(value);
}
else if (key.equals("DarkIcons")) {
DarkIcons = value.equals("true");
}
}
if(!loadedLocale) selectLanguage();
}
///////////////////////////////////////////////////////////////////////////////
// Begin long bunch of code for setting up menus, panels etc...
static class CButtonUI extends ButtonUI {
/*
* private static final CButtonUI buttonUI = new CButtonUI();
*
* ModifButtonUI() { }
*/
public static ComponentUI createUI(JComponent c) {
return new CButtonUI();
}
@Override
public void paint(Graphics g, JComponent c) {
final Color color1 = new Color(230, 255, 255, 0);
final Color color2 = new Color(255, 230, 255, 64);
final Color alphaColor = new Color(200, 200, 230, 64);
final Color color3 = new Color(alphaColor.getRed(), alphaColor.getGreen(), alphaColor.getBlue(), 0);
final Color color4 = new Color(alphaColor.getRed(), alphaColor.getGreen(), alphaColor.getBlue(), 64);
super.paint(g, c);
Graphics2D g2D = (Graphics2D) g;
GradientPaint gradient1 = new GradientPaint(0.0F, (float) c.getHeight() / (float) 2, color1, 0.0F, 0.0F,
color2);
Rectangle rec1 = new Rectangle(0, 0, c.getWidth(), c.getHeight() / 2);
g2D.setPaint(gradient1);
g2D.fill(rec1);
GradientPaint gradient2 = new GradientPaint(0.0F, (float) c.getHeight() / (float) 2, color3, 0.0F,
c.getHeight(), color4);
Rectangle rec2 = new Rectangle(0, c.getHeight() / 2, c.getWidth(), c.getHeight());
g2D.setPaint(gradient2);
g2D.fill(rec2);
}
/*
@Override
public void paintButtonPressed(Graphics g, AbstractButton b) {
paintText(g, b, b.getBounds(), b.getText());
g.setColor(Color.red.brighter());
g.fillRect(0, 0, b.getSize().width, b.getSize().height);
}
*/
public void paintBorder(Graphics g) {
}
/*
@Override
protected void paintFocus(Graphics g, AbstractButton b, Rectangle viewRect, Rectangle textRect,
Rectangle iconRect) {
}
*/
}
/**
*
* Sets up the toolbar.
*
**/
private void initToolBar() {
// New
//newButton.setUI(new CButtonUI());
//newButton.setContentAreaFilled(false);
toolBar.setBorder(null);
newButton.setBackground(MenuBG);
newButton.setToolTipText(newMenuItem.getText());
newButton.setFocusable(false);
newButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doNewCommand();
}
}
);
toolBar.add(newButton);
// Open
openButton.setBackground(MenuBG);
openButton.setToolTipText(openMenuItem.getText());
openButton.setFocusable(false);
openButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doOpenCommand();
}
}
);
toolBar.add(openButton);
// Save
saveButton.setBackground(MenuBG);
saveButton.setToolTipText(saveMenuItem.getText());
saveButton.setFocusable(false);
saveButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doSaveCommand();
}
}
);
toolBar.add(saveButton);
//
toolBar.add(separator);
// Cut
cutButton.setBackground(MenuBG);
cutButton.setToolTipText(cutMenuItem.getText());
cutButton.setFocusable(false);
cutButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doCutCommand();
}
}
);
toolBar.add(cutButton);
// Copy
copyButton.setBackground(MenuBG);
copyButton.setToolTipText(copyMenuItem.getText());
copyButton.setFocusable(false);
copyButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doCopyCommand();
}
}
);
toolBar.add(copyButton);
// Paste
pasteButton.setBackground(MenuBG);
pasteButton.setToolTipText(pasteMenuItem.getText());
pasteButton.setFocusable(false);
pasteButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doPasteCommand();
}
}
);
toolBar.add(pasteButton);
//
toolBar.add(separator);
// Undo
undoButton.setBackground(MenuBG);
undoButton.setToolTipText(undoMenuItem.getText());
undoButton.setFocusable(false);
undoButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doUndoCommand();
}
}
);
toolBar.add(undoButton);
// Redo
redoButton.setBackground(MenuBG);
redoButton.setToolTipText(redoMenuItem.getText());
redoButton.setFocusable(false);
redoButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doRedoCommand();
}
}
);
toolBar.add(redoButton);
//
toolBar.add(separator);
// Go To
gotoButton.setBackground(MenuBG);
gotoButton.setToolTipText(goToMenuItem.getText());
gotoButton.setFocusable(false);
gotoButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doGoToCommand();
}
}
);
toolBar.add(gotoButton);
// Add To Bookmarks...
addBookmarkButton.setBackground(MenuBG);
addBookmarkButton.setToolTipText(addToBookmarksMenuItem.getText());
addBookmarkButton.setFocusable(false);
addBookmarkButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doAddToBookmarksCommand();
}
}
);
toolBar.add(addBookmarkButton);
//
toolBar.add(separator);
// Decrease Width
decWidthButton.setBackground(MenuBG);
decWidthButton.setToolTipText(xlate("Decrease_Width"));
decWidthButton.setFocusable(false);
decWidthButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doDecreaseWidthCommand();
}
}
);
toolBar.add(decWidthButton);
// Increase Width
incWidthButton.setBackground(MenuBG);
incWidthButton.setToolTipText(xlate("Increase_Width"));
incWidthButton.setFocusable(false);
incWidthButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doIncreaseWidthCommand();
}
}
);
toolBar.add(incWidthButton);
// Decrease Height
decHeightButton.setBackground(MenuBG);
decHeightButton.setToolTipText(xlate("Decrease_Height"));
decHeightButton.setFocusable(false);
decHeightButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doDecreaseHeightCommand();
}
}
);
toolBar.add(decHeightButton);
// Increase Height
incHeightButton.setBackground(MenuBG);
incHeightButton.setToolTipText(xlate("Increase_Height"));
incHeightButton.setFocusable(false);
incHeightButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doIncreaseHeightCommand();
}
}
);
toolBar.add(incHeightButton);
//
toolBar.setFocusable(false);
toolBar.setFloatable(false);
}
/**
*
* Sets up the navigation bar.
*
**/
public void initNavBar() {
navBar.setBorder(null);
// Page Back
minusPageButton.setBackground(MenuBG);
minusPageButton.setToolTipText(xlate("Page_Back"));
minusPageButton.setFocusable(false);
minusPageButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doMinusPageCommand();
}
}
);
navBar.add(minusPageButton);
// Page Forward
plusPageButton.setBackground(MenuBG);
plusPageButton.setToolTipText(xlate("Page_Forward"));
plusPageButton.setFocusable(false);
plusPageButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doPlusPageCommand();
}
}
);
navBar.add(plusPageButton);
// Row Back
minusRowButton.setBackground(MenuBG);
minusRowButton.setToolTipText(xlate("Row_Back"));
minusRowButton.setFocusable(false);
minusRowButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doMinusRowCommand();
}
}
);
navBar.add(minusRowButton);
// Row Forward
plusRowButton.setBackground(MenuBG);
plusRowButton.setToolTipText(xlate("Row_Forward"));
plusRowButton.setFocusable(false);
plusRowButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doPlusRowCommand();
}
}
);
navBar.add(plusRowButton);
// Tile Back
minusTileButton.setBackground(MenuBG);
minusTileButton.setToolTipText(xlate("Tile_Back"));
minusTileButton.setFocusable(false);
minusTileButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doMinusTileCommand();
}
}
);
navBar.add(minusTileButton);
// Tile Forward
plusTileButton.setBackground(MenuBG);
plusTileButton.setToolTipText(xlate("Tile_Forward"));
plusTileButton.setFocusable(false);
plusTileButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doPlusTileCommand();
}
}
);
navBar.add(plusTileButton);
// Byte Back
minusByteButton.setBackground(MenuBG);
minusByteButton.setToolTipText(xlate("Byte_Back"));
minusByteButton.setFocusable(false);
minusByteButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doMinusByteCommand();
}
}
);
navBar.add(minusByteButton);
// Byte Forward
plusByteButton.setBackground(MenuBG);
plusByteButton.setToolTipText(xlate("Byte_Forward"));
plusByteButton.setFocusable(false);
plusByteButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doPlusByteCommand();
}
}
);
navBar.add(plusByteButton);
//
navBar.setFloatable(false);
navBar.setFocusable(false);
}
/**
*
* Sets up the tool palette.
*
**/
private void initToolPalette() {
toolPalette.setBorder(null);
toolPalette.setBackground(AsideBG);
// Selection
selectButton.setBackground(AsideBG);
selectButton.setToolTipText(xlate("Selection"));
selectButton.setFocusable(false);
selectButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
tool = SELECT_TOOL;
}
}
);
toolPalette.add(selectButton);
// Zoom
zoomButton.setBackground(AsideBG);
zoomButton.setToolTipText(xlate("Zoom"));
zoomButton.setFocusable(false);
zoomButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
tool = ZOOM_TOOL;
}
}
);
toolPalette.add(zoomButton);
// Dropper
pickupButton.setBackground(AsideBG);
pickupButton.setToolTipText(xlate("Dropper"));
pickupButton.setFocusable(false);
pickupButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
tool = PICKUP_TOOL;
}
}
);
toolPalette.add(pickupButton);
// Brush
brushButton.setBackground(AsideBG);
brushButton.setToolTipText(xlate("Brush"));
brushButton.setFocusable(false);
brushButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
tool = BRUSH_TOOL;
}
}
);
toolPalette.add(brushButton);
// Line
lineButton.setBackground(AsideBG);
lineButton.setToolTipText(xlate("Line"));
lineButton.setFocusable(false);
lineButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
tool = LINE_TOOL;
}
}
);
toolPalette.add(lineButton);
// Flood Fill
fillButton.setBackground(AsideBG);
fillButton.setToolTipText(xlate("Flood_Fill"));
fillButton.setFocusable(false);
fillButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
tool = FILL_TOOL;
}
}
);
toolPalette.add(fillButton);
// Color Replacer
replaceButton.setBackground(AsideBG);
replaceButton.setToolTipText(xlate("Color_Replacer"));
replaceButton.setFocusable(false);
replaceButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
tool = REPLACE_TOOL;
}
}
);
toolPalette.add(replaceButton);
// Mover
moveButton.setBackground(AsideBG);
moveButton.setToolTipText(xlate("Mover"));
moveButton.setFocusable(false);
moveButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
tool = MOVE_TOOL;
}
}
);
toolPalette.add(moveButton);
//
toolPalette.setFloatable(false);
toolPalette.setFocusable(false);
toolButtonGroup.add(selectButton);
toolButtonGroup.add(zoomButton);
toolButtonGroup.add(pickupButton);
toolButtonGroup.add(brushButton);
toolButtonGroup.add(lineButton);
toolButtonGroup.add(fillButton);
toolButtonGroup.add(replaceButton);
toolButtonGroup.add(moveButton);
selectButton.setSelected(true); // starting tool
//toolPalette.setBorder(new BevelBorder(BevelBorder.LOWERED));
}
/**
*
* Sets up the selection palette.
*
**/
public void initSelectionToolBar() {
selectionToolBar.setBorder(null);
// Mirror
mirrorButton.setBackground(AsideBG);
mirrorButton.setToolTipText(mirrorMenuItem.getText());
mirrorButton.setFocusable(false);
mirrorButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doMirrorCommand();
}
}
);
selectionToolBar.add(mirrorButton);
// Flip
flipButton.setBackground(AsideBG);
flipButton.setToolTipText(flipMenuItem.getText());
flipButton.setFocusable(false);
flipButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doFlipCommand();
}
}
);
selectionToolBar.add(flipButton);
// Rotate Right
rotateRightButton.setBackground(AsideBG);
rotateRightButton.setToolTipText(rotateRightMenuItem.getText());
rotateRightButton.setFocusable(false);
rotateRightButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doRotateRightCommand();
}
}
);
selectionToolBar.add(rotateRightButton);
// Rotate Left
rotateLeftButton.setBackground(AsideBG);
rotateLeftButton.setToolTipText(rotateLeftMenuItem.getText());
rotateLeftButton.setFocusable(false);
rotateLeftButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doRotateLeftCommand();
}
}
);
selectionToolBar.add(rotateLeftButton);
// Shift Left
shiftLeftButton.setBackground(AsideBG);
shiftLeftButton.setToolTipText(shiftLeftMenuItem.getText());
shiftLeftButton.setFocusable(false);
shiftLeftButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doShiftLeftCommand();
}
}
);
selectionToolBar.add(shiftLeftButton);
// Shift Right
shiftRightButton.setBackground(AsideBG);
shiftRightButton.setToolTipText(shiftRightMenuItem.getText());
shiftRightButton.setFocusable(false);
shiftRightButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doShiftRightCommand();
}
}
);
selectionToolBar.add(shiftRightButton);
// Shift Up
shiftUpButton.setBackground(AsideBG);
shiftUpButton.setToolTipText(shiftUpMenuItem.getText());
shiftUpButton.setFocusable(false);
shiftUpButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doShiftUpCommand();
}
}
);
selectionToolBar.add(shiftUpButton);
// Shift Down
shiftDownButton.setBackground(AsideBG);
shiftDownButton.setToolTipText(shiftDownMenuItem.getText());
shiftDownButton.setFocusable(false);
shiftDownButton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doShiftDownCommand();
}
}
);
selectionToolBar.add(shiftDownButton);
//
selectionToolBar.setFloatable(false);
selectionToolBar.setFocusable(false);
//selectionToolBar.setBorder(new BevelBorder(BevelBorder.LOWERED));
}
/**
*
* Sets up the menu bar.
*
**/
private void initMenuBar() {
// File menu
fileMenu.setMnemonic(KeyEvent.VK_F);
// New
newMenuItem.setMnemonic(KeyEvent.VK_N);
newMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, Event.CTRL_MASK));
newMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doNewCommand();
}
}
);
fileMenu.add(newMenuItem);
// Open
openMenuItem.setMnemonic(KeyEvent.VK_O);
openMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, Event.CTRL_MASK));
openMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doOpenCommand();
}
}
);
fileMenu.add(openMenuItem);
// Reopen
reopenMenu.setMnemonic(KeyEvent.VK_R);
fileMenu.add(reopenMenu);
// Close
closeMenuItem.setMnemonic(KeyEvent.VK_C);
closeMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doCloseCommand();
}
}
);
fileMenu.add(closeMenuItem);
// Close All
closeAllMenuItem.setMnemonic(KeyEvent.VK_E);
closeAllMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doCloseAllCommand();
}
}
);
fileMenu.add(closeAllMenuItem);
//
//fileMenu.add(separator);
// Save
saveMenuItem.setMnemonic(KeyEvent.VK_S);
saveMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, Event.CTRL_MASK));
saveMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doSaveCommand();
}
}
);
fileMenu.add(saveMenuItem);
// Save As
saveAsMenuItem.setMnemonic(KeyEvent.VK_A);
saveAsMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doSaveAsCommand();
}
}
);
fileMenu.add(saveAsMenuItem);
// Save All
saveAllMenuItem.setMnemonic(KeyEvent.VK_L);
saveAllMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doSaveAllCommand();
}
}
);
fileMenu.add(saveAllMenuItem);
//
fileMenu.add(separator);
// Exit
exitMenuItem.setMnemonic(KeyEvent.VK_X);
exitMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doExitCommand();
}
}
);
fileMenu.add(exitMenuItem);
menuBar.add(fileMenu);
// Edit menu
editMenu.setMnemonic(KeyEvent.VK_E);
// Undo
undoMenuItem.setMnemonic(KeyEvent.VK_U);
undoMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, Event.CTRL_MASK));
undoMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doUndoCommand();
}
}
);
editMenu.add(undoMenuItem);
// Redo
redoMenuItem.setMnemonic(KeyEvent.VK_R);
redoMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, Event.CTRL_MASK));
redoMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doRedoCommand();
}
}
);
editMenu.add(redoMenuItem);
//
editMenu.add(separator);
// Cut
cutMenuItem.setMnemonic(KeyEvent.VK_T);
cutMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, Event.CTRL_MASK));
cutMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doCutCommand();
}
}
);
editMenu.add(cutMenuItem);
// Copy
copyMenuItem.setMnemonic(KeyEvent.VK_C);
copyMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, Event.CTRL_MASK));
copyMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doCopyCommand();
}
}
);
editMenu.add(copyMenuItem);
// Paste
pasteMenuItem.setMnemonic(KeyEvent.VK_P);
pasteMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, Event.CTRL_MASK));
pasteMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doPasteCommand();
}
}
);
editMenu.add(pasteMenuItem);
// Clear
clearMenuItem.setMnemonic(KeyEvent.VK_L);
clearMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));
clearMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doClearCommand();
}
}
);
editMenu.add(clearMenuItem);
//
editMenu.add(separator);
// Select All
selectAllMenuItem.setMnemonic(KeyEvent.VK_S);
selectAllMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, Event.CTRL_MASK));
selectAllMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doSelectAllCommand();
}
}
);
editMenu.add(selectAllMenuItem);
//
editMenu.add(separator);
// Copy To...
copyToMenuItem.setMnemonic(KeyEvent.VK_O);
copyToMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doCopyToCommand();
}
}
);
editMenu.add(copyToMenuItem);
// Paste From...
pasteFromMenuItem.setMnemonic(KeyEvent.VK_F);
pasteFromMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doPasteFromCommand();
}
}
);
editMenu.add(pasteFromMenuItem);
menuBar.add(editMenu);
// View menu
viewMenu.setMnemonic(KeyEvent.VK_V);
// Codec submenu
viewMenu.add(tileCodecMenu);
// Zoom submenu
zoomMenu.setMnemonic(KeyEvent.VK_Z);
// In
zoomInMenuItem.setMnemonic(KeyEvent.VK_I);
zoomInMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doZoomInCommand();
}
}
);
zoomMenu.add(zoomInMenuItem);
// Out
zoomOutMenuItem.setMnemonic(KeyEvent.VK_O);
zoomOutMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doZoomOutCommand();
}
}
);
zoomMenu.add(zoomOutMenuItem);
//
zoomMenu.add(separator);
// 100%
_100MenuItem.setMnemonic(KeyEvent.VK_1);
_100MenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doZoomCommand(1.0);
}
}
);
zoomMenu.add(_100MenuItem);
// 200%
_200MenuItem.setMnemonic(KeyEvent.VK_2);
_200MenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doZoomCommand(2.0);
}
}
);
zoomMenu.add(_200MenuItem);
// 400%
_400MenuItem.setMnemonic(KeyEvent.VK_4);
_400MenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doZoomCommand(4.0);
}
}
);
zoomMenu.add(_400MenuItem);
// 800%
_800MenuItem.setMnemonic(KeyEvent.VK_8);
_800MenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doZoomCommand(8.0);
}
}
);
zoomMenu.add(_800MenuItem);
// 1600%
_1600MenuItem.setMnemonic(KeyEvent.VK_6);
_1600MenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doZoomCommand(16.0);
}
}
);
zoomMenu.add(_1600MenuItem);
// 3200%
_3200MenuItem.setMnemonic(KeyEvent.VK_3);
_3200MenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doZoomCommand(32.0);
}
}
);
zoomMenu.add(_3200MenuItem);
viewMenu.add(zoomMenu);
// Mode submenu
modeMenu.setMnemonic(KeyEvent.VK_M);
// 1-Dimensional
_1DimensionalMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doModeCommand(TileCodec.MODE_1D);
_1DimensionalMenuItem.setSelected(true);
}
}
);
modeMenu.add(_1DimensionalMenuItem);
// 2-Dimensional
_2DimensionalMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doModeCommand(TileCodec.MODE_2D);
_2DimensionalMenuItem.setSelected(true);
}
}
);
modeMenu.add(_2DimensionalMenuItem);
viewMenu.add(modeMenu);
// create button group for modes
modeButtonGroup.add(_1DimensionalMenuItem);
modeButtonGroup.add(_2DimensionalMenuItem);
//
viewMenu.add(separator);
// Block Size
blockSizeMenu.setMnemonic(KeyEvent.VK_B);
// Full Canvas
sizeBlockToCanvasMenuItem.setMnemonic(KeyEvent.VK_F);
sizeBlockToCanvasMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doSizeBlockToCanvasCommand();
}
}
);
blockSizeMenu.add(sizeBlockToCanvasMenuItem);
//
blockSizeMenu.add(separator);
// Custom Block Size
customBlockSizeMenuItem.setMnemonic(KeyEvent.VK_C);
customBlockSizeMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doCustomBlockSizeCommand();
}
}
);
blockSizeMenu.add(customBlockSizeMenuItem);
viewMenu.add(blockSizeMenu);
// Row-interleave Blocks
rowInterleaveBlocksMenuItem.setMnemonic(KeyEvent.VK_R);
rowInterleaveBlocksMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doRowInterleaveBlocksCommand();
}
}
);
viewMenu.add(rowInterleaveBlocksMenuItem);
//
viewMenu.add(separator);
// Block Grid
blockGridMenuItem.setMnemonic(KeyEvent.VK_V);
blockGridMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doBlockGridCommand();
}
}
);
viewMenu.add(blockGridMenuItem);
// Tile Grid
tileGridMenuItem.setMnemonic(KeyEvent.VK_A);
tileGridMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doTileGridCommand();
}
}
);
viewMenu.add(tileGridMenuItem);
// Pixel Grid
pixelGridMenuItem.setMnemonic(KeyEvent.VK_P);
pixelGridMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doPixelGridCommand();
}
}
);
viewMenu.add(pixelGridMenuItem);
//
viewMenu.add(separator);
// Statusbar
statusBarMenuItem.setMnemonic(KeyEvent.VK_S);
statusBarMenuItem.setSelected(viewStatusBar);
statusBarMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doStatusBarCommand();
}
}
);
viewMenu.add(statusBarMenuItem);
// Toolbar
toolBarMenuItem.setMnemonic(KeyEvent.VK_T);
toolBarMenuItem.setSelected(viewToolBar);
toolBarMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doToolBarCommand();
}
}
);
viewMenu.add(toolBarMenuItem);
menuBar.add(viewMenu);
// Image menu
imageMenu.setMnemonic(KeyEvent.VK_I);
// Mirror
mirrorMenuItem.setMnemonic(KeyEvent.VK_M);
mirrorMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_M, Event.CTRL_MASK));
mirrorMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doMirrorCommand();
}
}
);
imageMenu.add(mirrorMenuItem);
// Flip
flipMenuItem.setMnemonic(KeyEvent.VK_F);
flipMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, Event.CTRL_MASK));
flipMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doFlipCommand();
}
}
);
imageMenu.add(flipMenuItem);
//
imageMenu.add(separator);
// Rotate Right
rotateRightMenuItem.setMnemonic(KeyEvent.VK_O);
rotateRightMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doRotateRightCommand();
}
}
);
imageMenu.add(rotateRightMenuItem);
// Rotate Left
rotateLeftMenuItem.setMnemonic(KeyEvent.VK_A);
rotateLeftMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doRotateLeftCommand();
}
}
);
imageMenu.add(rotateLeftMenuItem);
//
imageMenu.add(separator);
// Shift Left
shiftLeftMenuItem.setMnemonic(KeyEvent.VK_L);
// shiftLeftMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, Event.SHIFT_MASK));
shiftLeftMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doShiftLeftCommand();
}
}
);
imageMenu.add(shiftLeftMenuItem);
// Shift Right
shiftRightMenuItem.setMnemonic(KeyEvent.VK_R);
// shiftRightMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, Event.SHIFT_MASK));
shiftRightMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doShiftRightCommand();
}
}
);
imageMenu.add(shiftRightMenuItem);
// Shift Up
shiftUpMenuItem.setMnemonic(KeyEvent.VK_U);
// shiftUpMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_UP, Event.SHIFT_MASK));
shiftUpMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doShiftUpCommand();
}
}
);
imageMenu.add(shiftUpMenuItem);
// Shift Down
shiftDownMenuItem.setMnemonic(KeyEvent.VK_D);
// shiftDownMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, Event.SHIFT_MASK));
shiftDownMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doShiftDownCommand();
}
}
);
imageMenu.add(shiftDownMenuItem);
//
imageMenu.add(separator);
// Canvas Size...
canvasSizeMenuItem.setMnemonic(KeyEvent.VK_S);
canvasSizeMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doCanvasSizeCommand();
}
}
);
imageMenu.add(canvasSizeMenuItem);
// Stretch...
stretchMenuItem.setMnemonic(KeyEvent.VK_E);
stretchMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doStretchCommand();
}
}
);
imageMenu.add(stretchMenuItem);
menuBar.add(imageMenu);
// Navigate menu
navigateMenu.setMnemonic(KeyEvent.VK_N);
// Go To
goToMenuItem.setMnemonic(KeyEvent.VK_G);
goToMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G, Event.CTRL_MASK));
goToMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doGoToCommand();
}
}
);
navigateMenu.add(goToMenuItem);
// Go To Again
goToAgainMenuItem.setMnemonic(KeyEvent.VK_A);
goToAgainMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0));
goToAgainMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doGoToAgainCommand();
}
}
);
navigateMenu.add(goToAgainMenuItem);
//
navigateMenu.add(separator);
// Add To Bookmarks
addToBookmarksMenuItem.setMnemonic(KeyEvent.VK_A);
addToBookmarksMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doAddToBookmarksCommand();
}
}
);
navigateMenu.add(addToBookmarksMenuItem);
// Organize Bookmarks
organizeBookmarksMenuItem.setMnemonic(KeyEvent.VK_O);
organizeBookmarksMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doOrganizeBookmarksCommand();
}
}
);
navigateMenu.add(organizeBookmarksMenuItem);
//
menuBar.add(navigateMenu);
// Palette menu
paletteMenu.setMnemonic(KeyEvent.VK_P);
// Edit Colors...
editColorsMenuItem.setMnemonic(KeyEvent.VK_E);
editColorsMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doEditColorsCommand();
}
}
);
paletteMenu.add(editColorsMenuItem);
// Format submenu
colorCodecMenu.setMnemonic(KeyEvent.VK_F);
paletteMenu.add(colorCodecMenu);
// Endianness submenu
paletteEndiannessMenu.setMnemonic(KeyEvent.VK_N);
// Little endian
paletteLittleEndianMenuItem.setMnemonic(KeyEvent.VK_L);
paletteLittleEndianMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doPaletteEndiannessCommand(ColorCodec.LITTLE_ENDIAN);
}
}
);
paletteEndiannessMenu.add(paletteLittleEndianMenuItem);
// Big endian
paletteBigEndianMenuItem.setMnemonic(KeyEvent.VK_B);
paletteBigEndianMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doPaletteEndiannessCommand(ColorCodec.BIG_ENDIAN);
}
}
);
paletteEndiannessMenu.add(paletteBigEndianMenuItem);
// create button group for palette endianness
paletteEndiannessButtonGroup.add(paletteLittleEndianMenuItem);
paletteEndiannessButtonGroup.add(paletteBigEndianMenuItem);
//
paletteMenu.add(paletteEndiannessMenu);
// Size...
paletteSizeMenuItem.setMnemonic(KeyEvent.VK_S);
paletteSizeMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doPaletteSizeCommand();
}
}
);
paletteMenu.add(paletteSizeMenuItem);
//
paletteMenu.add(separator);
// New...
newPaletteMenuItem.setMnemonic(KeyEvent.VK_N);
newPaletteMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doNewPaletteCommand();
}
}
);
paletteMenu.add(newPaletteMenuItem);
// Import From submenu
importPaletteMenu.setMnemonic(KeyEvent.VK_I);
// Import From This File...
importInternalPaletteMenuItem.setMnemonic(KeyEvent.VK_T);
importInternalPaletteMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doImportInternalPaletteCommand();
}
}
);
importPaletteMenu.add(importInternalPaletteMenuItem);
// Import From Another File...
importExternalPaletteMenuItem.setMnemonic(KeyEvent.VK_A);
importExternalPaletteMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doImportExternalPaletteCommand();
}
}
);
importPaletteMenu.add(importExternalPaletteMenuItem);
paletteMenu.add(importPaletteMenu);
//
paletteMenu.add(separator);
// Add To Palettes...
addToPalettesMenuItem.setMnemonic(KeyEvent.VK_A);
addToPalettesMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doAddToPalettesCommand();
}
}
);
paletteMenu.add(addToPalettesMenuItem);
// Organize Palettes...
organizePalettesMenuItem.setMnemonic(KeyEvent.VK_O);
organizePalettesMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doOrganizePalettesCommand();
}
}
);
paletteMenu.add(organizePalettesMenuItem);
menuBar.add(paletteMenu);
// Window menu
windowMenu.setMnemonic(KeyEvent.VK_W);
// New Window
newWindowMenuItem.setMnemonic(KeyEvent.VK_N);
newWindowMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doNewWindowCommand();
}
}
);
windowMenu.add(newWindowMenuItem);
//
windowMenu.add(separator);
// Tile
tileMenuItem.setMnemonic(KeyEvent.VK_T);
tileMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doTileCommand();
}
}
);
windowMenu.add(tileMenuItem);
// Cascade
cascadeMenuItem.setMnemonic(KeyEvent.VK_C);
cascadeMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doCascadeCommand();
}
}
);
windowMenu.add(cascadeMenuItem);
// Arrange Icons
arrangeIconsMenuItem.setMnemonic(KeyEvent.VK_I);
arrangeIconsMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doArrangeIconsCommand();
}
}
);
windowMenu.add(arrangeIconsMenuItem);
menuBar.add(windowMenu);
// Help menu
helpMenu.setMnemonic(KeyEvent.VK_H);
// Help Topics
helpTopicsMenuItem.setMnemonic(KeyEvent.VK_H);
helpTopicsMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0));
helpTopicsMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doHelpTopicsCommand();
}
}
);
helpMenu.add(helpTopicsMenuItem);
// About
aboutMenuItem.setMnemonic(KeyEvent.VK_A);
aboutMenuItem.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doAboutCommand();
}
}
);
helpMenu.add(aboutMenuItem);
menuBar.add(helpMenu);
}
//////////////////////////////////////////////////////////////////////////////
// Begin code for handling menu commands
/**
*
* Handles menu command "New".
* Prompts the user to enter the desired file size, then creates a new
* FileImage and a default view + palette.
*
**/
public void doNewCommand() {
// Show dialog for creating new file
//TMNewFileDialog newFileDialog = new TMNewFileDialog(this, xl);
int retVal = newFileDialog.showDialog();
if (retVal == JOptionPane.OK_OPTION) {
// create fileimage
FileImage img = new FileImage(newFileDialog.getFileSize());
new TMFileResources(img, this);
// create view for it
TileCodec tc = (TileCodec)tilecodecs.get(0); // default
TMPalette pal = new TMPalette("PAL000", TMPalette.defaultPalette, getColorCodecByID("CF01"), ColorCodec.LITTLE_ENDIAN, true);
addViewToDesktop(createView(img, tc, pal, TileCodec.MODE_1D));
}
}
/**
*
* Handles menu command "Open...".
* User selects file from standard file dialog, the file is
* opened and a default view + palette is assigned.
*
**/
public void doOpenCommand() {
// set to directory of selected file, if there is one
System.out.println(lastPath);
TMView view = getSelectedView();
if (view != null) {
this.fileOpenChooser.setCurrentDirectory(view.getFileImage().getFile().getParentFile());
} else if (new File(this.lastPath).exists()) {
this.fileOpenChooser.setCurrentDirectory(new File(this.lastPath));
} else {
this.fileOpenChooser.setCurrentDirectory(new File("."));
}
// have the user select a file
int retVal = fileOpenChooser.showOpenDialog(this);
if (retVal == JFileChooser.APPROVE_OPTION) {
// get the selected file and open it
File file = fileOpenChooser.getSelectedFile();
//updates the last path opened
lastPath = file.getPath().substring(0,file.getPath().lastIndexOf(File.separator));
openFile(file);
}
}
/**
*
* Handles menu command "Close".
* Closes a view. If it is the last (only) view of a FileImage,
* and the file is modified, the user is prompted to save the file.
*
**/
public void doCloseCommand() {
TMView view = getSelectedView();
if (view != null) {
FileImage img = view.getFileImage();
// check if it's the last view
if (img.getViews().length == 1) {
saveResources(img); // TODO
// check if saving required/desired
if (img.isModified()) {
int retVal = JOptionPane.showConfirmDialog(this,
xlate("Save_Changes_To")+" "+img.getName()+"?", "Tile Mangler",
JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE);
if (retVal == JOptionPane.YES_OPTION) {
doSaveCommand();
}
else if (retVal == JOptionPane.NO_OPTION) {
}
else if (retVal == JOptionPane.CANCEL_OPTION) {
return; // return to program without saving and/or closing
}
}
// remove potential file listener
fileListenerHashtable.remove(img.getContents());
}
// update recent files
File f = new File(img.getFile().getAbsolutePath());
addToRecentFiles(f);
buildReopenMenu();
// remove view from the FileImage and desktop
img.removeView(view);
desktop.remove(view);
view.dispose();
desktop.revalidate();
desktop.repaint();
img = null;
view = null;
System.gc();
}
desktop.setSelectedFrame(null);
JInternalFrame[] frames = desktop.getAllFrames();
if (frames.length == 0) {
// no more frames left on the desktop, hide MDI menus and toolbars
disableMDIStuff();
setTitle("Tile Mangler");
}
else {
// select a random frame (Swing doesn't do it for you...)
try {
frames[0].setSelected(true);
}
catch (Exception e) { }
}
}
/**
*
* Saves the resources for the given fileimage to a file in XML format.
*
**/
public void saveResources(FileImage img) {
// TODO: should only save if # bookmarks | # of palettes > 0?
File resourceFile = TMFileResources.getResourceFileFor(img.getFile());
try {
File res = new File("./resources");
if (!res.exists()) {
res.mkdir();
}
FileWriter fw = new FileWriter(resourceFile);
fw.write(img.getResources().toXML());
fw.close();
}
catch (Exception e) {
JOptionPane.showMessageDialog(this,
xlate("Save_Resources_Error")+"\n"+e.getMessage(),
"Tile Mangler",
JOptionPane.ERROR_MESSAGE);
}
}
public void saveBookmarks() {
// TODO
}
public void savePalettes() {
// TODO
}
/**
*
* Handles menu command "Close All".
* Does the same as "Close", only for all the current frames.
*
**/
public void doCloseAllCommand() {
JInternalFrame[] frames = desktop.getAllFrames();
for (int i=0; i<frames.length; i++) {
TMView view = (TMView)frames[i];
FileImage img = view.getFileImage();
if (img.getViews().length == 1) {
// check if saving required/desired
if (img.isModified()) {
int retVal = JOptionPane.showConfirmDialog(this,
xlate("Save_Changes_To")+" "+img.getName()+"?", "Tile Mangler",
JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE);
if (retVal == JOptionPane.YES_OPTION) {
try {
view.setSelected(true);
}
catch (java.beans.PropertyVetoException x) {
x.printStackTrace();
}
doSaveCommand();
}
else if (retVal == JOptionPane.NO_OPTION) {
}
else if (retVal == JOptionPane.CANCEL_OPTION) {
return;
}
}
// remove potential file listener
fileListenerHashtable.remove(img.getContents());
}
}
// remove them all
for (int i=0; i<frames.length; i++) {
TMView view = (TMView)frames[i];
FileImage img = view.getFileImage();
saveResources(img); // TODO
addToRecentFiles(new File(img.getFile().getAbsolutePath()));
// remove the view
img.removeView(view);
desktop.remove(view);
view.dispose();
}
buildReopenMenu();
desktop.setSelectedFrame(null);
desktop.revalidate();
desktop.repaint();
disableMDIStuff();
setTitle("Tile Mangler");
System.gc();
}
/**
*
* Handles menu command "Save".
*
**/
public void doSaveCommand() {
TMView view = getSelectedView();
if (view != null) {
FileImage img = view.getFileImage();
File file = img.getFile();
String ext = TMFileFilter.getExtension(file);
saveResources(img); // TODO
// if (img.isModified()) {
if (file.exists()) {
if (!file.canWrite()) {
JOptionPane.showMessageDialog(this,
xlate("File_Write_Error")+"\n"+file.getName(),
"Tile Mangler",
JOptionPane.ERROR_MESSAGE);
}
else {
FileSaverThread thread = null;
byte[] contents = img.getContents();
try {
thread = new FileSaverThread(contents, file);
}
catch (Exception e) {
JOptionPane.showMessageDialog(this,
xlate("File_Save_Error")+"\n"+e.getMessage(),
"Tile Mangler",
JOptionPane.ERROR_MESSAGE);
return;
}
// see if a filelistener should be notified
TMFileListener fl = (TMFileListener)fileListenerHashtable.get(contents);
if (fl != null) {
fl.fileSaving(contents, ext);
}
// save it!
new ProgressDialog(this, thread);
img.setModified(false);
setSaveButtonsEnabled(false);
if (fl != null) {
fl.fileLoaded(contents, ext);
}
}
}
else {
doSaveAsCommand();
}
// }
}
}
/**
*
* Handles menu command "Save As...".
*
**/
public void doSaveAsCommand() {
TMView view = getSelectedView();
if (view != null) {
fileSaveChooser.setCurrentDirectory(view.getFileImage().getFile().getParentFile());
fileSaveChooser.setSelectedFile(view.getFileImage().getFile());
int retVal = fileSaveChooser.showSaveDialog(this);
if (retVal == JFileChooser.APPROVE_OPTION) {
File file = fileSaveChooser.getSelectedFile();
view.getFileImage().setFile(file);
doSaveCommand();
setTitle("Tile Mangler - "+view.getTitle());
}
}
setSaveButtonsEnabled(false);
}
/**
*
* Handles menu command "Save All".
*
**/
public void doSaveAllCommand() {
JInternalFrame[] frames = desktop.getAllFrames();
for (int i=0; i<frames.length; i++) {
TMView view = (TMView)frames[i];
if (view.getFileImage().isModified()) {
try {
view.setSelected(true);
}
catch (java.beans.PropertyVetoException x) {
x.printStackTrace();
}
doSaveCommand();
}
}
setSaveButtonsEnabled(false);
}
/**
*
* Handles menu command "Exit".
*
**/
public void doExitCommand() {
doCloseAllCommand();
// if all frames were closed, the operation was successful and we can exit.
if (desktop.getAllFrames().length == 0) {
saveSettings();
System.exit(0);
}
}
/**
*
* Handles menu command "Undo".
* Extracts the top item in the Undo stack and undoes it.
* Moves the item to the Redo stack.
*
**/
public void doUndoCommand() {
TMView view = getSelectedView();
if (view != null) {
view.undo();
refreshUndoRedo();
fileImageModified(view.getFileImage());
}
}
/**
*
* Handles menu command "Redo".
* Extracts the top item in the Redo stack and redoes it.
* Moves the item to the Undo stack.
*
**/
public void doRedoCommand() {
TMView view = getSelectedView();
if (view != null) {
view.redo();
refreshUndoRedo();
fileImageModified(view.getFileImage());
}
}
/**
*
* Handles menu command "Cut".
* The current selection of the selected frame is cut to the
* central selection.
*
**/
public void doCutCommand() {
TMView view = getSelectedView();
if (view != null) {
// get the frame's selection
copiedSelection = view.getEditorCanvas().cutSelection();
// enable relevant buttons
pasteButton.setEnabled(true);
pasteMenuItem.setEnabled(true);
}
}
/**
*
* Handles menu command "Copy".
*
**/
public void doCopyCommand() {
TMView view = getSelectedView();
if (view != null) {
// get the frame's selection
copiedSelection = view.getEditorCanvas().copySelection();
// enable relevant buttons
pasteButton.setEnabled(true);
pasteMenuItem.setEnabled(true);
}
}
/**
*
* Handles menu command "Paste".
*
**/
public void doPasteCommand() {
TMView view = getSelectedView();
if (view != null) {
if (copiedSelection != null) {
// paste selection
view.getEditorCanvas().paste(copiedSelection);
}
}
}
/**
*
* Handles menu command "Clear".
*
**/
public void doClearCommand() {
TMView view = getSelectedView();
if (view != null) {
view.getEditorCanvas().clearSelection();
}
}
/**
*
* Handles menu command "Go To...".
* Shows a dialog where the user can enter an absolute or relative
* file offset to jump to. Then jumps to that offset.
*
**/
public void doGoToCommand() {
TMView view = getSelectedView();
if (view != null) {
//TMGoToDialog goToDialog = new TMGoToDialog(this, xl);
int retVal = goToDialog.showDialog();
if (retVal == JOptionPane.OK_OPTION) {
if (goToDialog.getMode() == TMGoToDialog.ABSOLUTE_MODE) {
view.setAbsoluteOffset(goToDialog.getOffset());
}
else { // RELATIVE_MODE
view.setRelativeOffset(goToDialog.getOffset());
}
view.repaint();
}
}
}
/**
*
* Handles menu command "Go To Again".
* Only applicable when the preceding "Go To..." was of relative type.
*
**/
public void doGoToAgainCommand() {
TMView view = getSelectedView();
if (view != null) {
if (goToDialog.getMode() == TMGoToDialog.ABSOLUTE_MODE) {
view.setAbsoluteOffset(goToDialog.getOffset());
}
else { // RELATIVE_MODE
view.setRelativeOffset(goToDialog.getOffset());
}
view.repaint();
}
}
/**
*
* Handles menu command "Select All".
*
**/
public void doSelectAllCommand() {
TMView view = getSelectedView();
if (view != null) {
view.getEditorCanvas().selectAll();
}
}
/**
*
* Handles menu command "Copy To...".
*
**/
public void doCopyToCommand() {
TMView view = getSelectedView();
if (view != null) {
int retVal = bitmapSaveChooser.showSaveDialog(this);
if (retVal == JFileChooser.APPROVE_OPTION) {
File file = bitmapSaveChooser.getSelectedFile();
try {
TMBitmapExporter.saveTileCanvasToFile(view.getEditorCanvas().getSelectionCanvas(), file);
} catch (Exception e) {
JOptionPane.showMessageDialog(this,
xlate("Save_Bitmap_Error")+"\n"+e.getMessage(),
"Tile Mangler",
JOptionPane.ERROR_MESSAGE);
}
}
}
}
/**
*
* Handles menu command "Paste From...".
*
**/
public void doPasteFromCommand() {
TMView view = getSelectedView();
if (view != null) {
if (new File(this.lastPath).exists()) {
this.bitmapOpenChooser.setCurrentDirectory(new File(this.lastPath));
} else {
this.bitmapOpenChooser.setCurrentDirectory(new File("."));
}
int retVal = bitmapOpenChooser.showOpenDialog(this);
if (retVal == JFileChooser.APPROVE_OPTION) {
File file = bitmapOpenChooser.getSelectedFile();
// paste it
TMTileCanvas bitmapCanvas = null;
try {
bitmapCanvas = TMBitmapImporter.loadTileCanvasFromFile(file);
}
catch (Exception e) {
JOptionPane.showMessageDialog(this,
xlate("Load_Bitmap_Error")+"\n"+e.getMessage(),
"Tile Mangler",
JOptionPane.ERROR_MESSAGE);
return;
}
TMSelectionCanvas selCanvas = new TMSelectionCanvas(
this, bitmapCanvas, 0, 0,
bitmapCanvas.getCols(),
bitmapCanvas.getRows()
);
view.getEditorCanvas().paste(selCanvas);
}
}
}
/**
*
* Handles menu command "Tile".
* Code ruthlessly stolen from some guy on the Java forums. Thanks and sorry. :)
*
**/
public void doTileCommand() {
JInternalFrame[] frames = desktop.getAllFrames();
// count frames that aren't iconized
int frameCount = 0;
for (int i = 0; i < frames.length; i++) {
if (!frames[i].isIcon())
frameCount++;
}
int rows = (int)Math.sqrt(frameCount);
int cols = frameCount / rows;
int extra = frameCount % rows;
// number of columns with an extra row
int width = desktop.getWidth() / cols;
int height = desktop.getHeight() / rows;
int r = 0;
int c = 0;
for (int i = 0; i < frames.length; i++) {
if (!frames[i].isIcon()) {
frames[i].reshape(c * width, r * height, width, height);
r++;
if (r == rows) {
r = 0;
c++;
if (c == cols - extra) {
// start adding an extra row
rows++;
height = desktop.getHeight() / rows;
}
}
}
}
desktop.revalidate();
}
/**
*
* Handles menu command "Cascade".
* Code ruthlessly stolen from some guy on the Java forums. Thanks and sorry. :)
*
**/
public void doCascadeCommand() {
int FRAME_OFFSET = 30;
int xpos = 0, ypos = 0;
JInternalFrame frames[] = desktop.getAllFrames();
int cascadeWidth = desktop.getBounds().width - 5;
int cascadeHeight = desktop.getBounds().height - 5;
int frameHeight = cascadeHeight - frames.length * FRAME_OFFSET;
int frameWidth = cascadeWidth - frames.length * FRAME_OFFSET;
for (int i = frames.length - 1; i >= 0; i--) {
if (!frames[i].isIcon()) {
frames[i].setLocation(xpos, ypos);
xpos += FRAME_OFFSET;
ypos += FRAME_OFFSET;
}
}
desktop.revalidate();
}
/**
*
* Handles menu command "Arrange Icons".
*
**/
public void doArrangeIconsCommand() {
JInternalFrame[] frames = desktop.getAllFrames();
int xpos=0;
int ypos=0;
for (int i=0; i<frames.length; i++) {
if (frames[i].isIcon()) {
JInternalFrame.JDesktopIcon icon = frames[i].getDesktopIcon();
icon.setLocation(xpos, desktop.getHeight() - icon.getHeight());
xpos += icon.getWidth();
}
}
desktop.revalidate();
}
/**
*
* Handles menu command "Help Topics".
*
**/
public void doHelpTopicsCommand() {
File localizedHelpFile = new File("docs/help_"+locale.toString()+".htm");
if (localizedHelpFile.exists()) {
BrowserControl.displayURL("file://"+localizedHelpFile.getAbsolutePath());
}
else {
BrowserControl.displayURL("file://docs/help.htm");
}
}
/**
*
* Handles menu command "Tip".
* Just a bogus dialog.
*
**/
public void doTipCommand() {
// Show Tip dialog
JOptionPane.showConfirmDialog(this,
xlate("Drugs_Message"), "Tile Mangler",
JOptionPane.YES_NO_OPTION, JOptionPane.INFORMATION_MESSAGE);
}
/**
*
* Handles menu command "About".
* Displays a small dialog with info about the program.
*
**/
public void doAboutCommand()
{
JOptionPane.showMessageDialog(this,
"Tile Mangler v0.20\nby SnowBro 2003-2005 (v0.16)\nby Dr. MefistO 2013 (v0.17.2)\nby Mewster 2014-2015 (v0.19)\nby toruzz 2020 (v0.20)", "Tile Mangler",
1);
}
/**
*
* Handles menu command "Tile Codec".
* Changes the tile codec for the current view to the specified one.
*
**/
public void doTileCodecCommand(TileCodec codec) {
TMView view = getSelectedView();
if (view != null) {
view.setTileCodec(codec);
refreshPalettePane();
refreshStatusBar();
refreshTileCodecSelection(view);
}
}
/**
*
* Handles menu command "Zoom".
* Zooms the current frame to the given scale (1.0 = 100%, 2.0 = 200% and so on)
*
**/
public void doZoomCommand(double scale) {
TMView view = getSelectedView();
if (view != null) {
view.setScale(scale);
}
}
/**
*
* Handles menu command "Zoom In".
* Scale += 1.0
*
**/
public void doZoomInCommand() {
TMView view = getSelectedView();
if (view != null) {
view.setScale(view.getScale()+1.0);
}
}
/**
*
* Handles menu command "Zoom Out".
* Scale -= 1.0
*
**/
public void doZoomOutCommand() {
TMView view = getSelectedView();
if (view != null) {
view.setScale(view.getScale()-1.0);
}
}
/**
*
* Handles menu command "Block Grid".
*
**/
public void doBlockGridCommand() {
TMView view = getSelectedView();
if (view != null) {
view.setBlockGridVisible(!view.isBlockGridVisible());
blockGridMenuItem.setSelected(view.isBlockGridVisible());
view.repaint();
}
}
/**
*
* Handles menu command "Tile Grid".
*
**/
public void doTileGridCommand() {
TMView view = getSelectedView();
if (view != null) {
view.setTileGridVisible(!view.isTileGridVisible());
tileGridMenuItem.setSelected(view.isTileGridVisible());
view.repaint();
}
}
/**
*
* Handles menu command "Pixel Grid".
*
**/
public void doPixelGridCommand() {
TMView view = getSelectedView();
if (view != null) {
view.setPixelGridVisible(!view.isPixelGridVisible());
pixelGridMenuItem.setSelected(view.isPixelGridVisible());
view.repaint();
}
}
/**
*
* Handles menu command "Statusbar".
* Toggles the statusbar visibility.
*
**/
public void doStatusBarCommand() {
viewStatusBar = !viewStatusBar;
statusBar.setVisible(viewStatusBar);
statusBarMenuItem.setSelected(viewStatusBar);
}
/**
*
* Handles menu command "Toolbar".
* Toggles the toolbar visibility.
*
**/
public void doToolBarCommand() {
viewToolBar = !viewToolBar;
toolBarPane.setVisible(viewToolBar);
toolBarMenuItem.setSelected(viewToolBar);
}
/**
*
* Handles menu command "New Window".
* Creates a new view for the current one.
* Duplicates view settings (offset, codec, width/height etc.)
*
**/
public void doNewWindowCommand() {
TMView view = getSelectedView();
if (view != null) {
FileImage img = view.getFileImage();
TMView newView = createView(img, view.getTileCodec(), view.getPalette(), view.getMode());
// TODO: Copy palette
newView.setPalIndex(view.getPalIndex());
newView.setFGColor(view.getFGColor());
newView.setBGColor(view.getBGColor());
newView.setAbsoluteOffset(view.getOffset());
newView.setGridSize(view.getCols(), view.getRows());
addViewToDesktop(newView);
}
}
/**
*
* Handles menu command "Mirror".
*
**/
public void doMirrorCommand() {
TMView view = getSelectedView();
if (view != null) {
view.getEditorCanvas().flipSelectionHorizontally();
}
}
/**
*
* Handles menu command "Flip".
*
**/
public void doFlipCommand() {
TMView view = getSelectedView();
if (view != null) {
view.getEditorCanvas().flipSelectionVertically();
}
}
/**
*
* Handles menu command "Rotate +90".
*
**/
public void doRotateRightCommand() {
TMView view = getSelectedView();
if (view != null) {
view.getEditorCanvas().rotateSelectionClockwise();
}
}
/**
*
* Handles menu command "Rotate Left".
*
**/
public void doRotateLeftCommand() {
TMView view = getSelectedView();
if (view != null) {
view.getEditorCanvas().rotateSelectionCounterClockwise();
}
}
/**
*
* Handles menu command "Shift Left".
*
**/
public void doShiftLeftCommand() {
TMView view = getSelectedView();
if (view != null) {
view.getEditorCanvas().shiftSelectionLeft();
}
}
/**
*
* Handles menu command "Shift Right".
*
**/
public void doShiftRightCommand() {
TMView view = getSelectedView();
if (view != null) {
view.getEditorCanvas().shiftSelectionRight();
}
}
/**
*
* Handles menu command "Shift Up".
*
**/
public void doShiftUpCommand() {
TMView view = getSelectedView();
if (view != null) {
view.getEditorCanvas().shiftSelectionUp();
}
}
/**
*
* Handles menu command "Shift Down".
*
**/
public void doShiftDownCommand() {
TMView view = getSelectedView();
if (view != null) {
view.getEditorCanvas().shiftSelectionDown();
}
}
/**
*
* Handles menu command "Stretch".
*
**/
public void doStretchCommand() {
TMView view = getSelectedView();
if (view != null) {
//TMStretchDialog stretchDialog = new TMStretchDialog(this, xl);
int retVal = stretchDialog.showDialog(view.getEditorCanvas().getSelectionCanvas().getCols(), view.getEditorCanvas().getSelectionCanvas().getRows());
if (retVal == JOptionPane.OK_OPTION) {
view.getEditorCanvas().stretchSelection(stretchDialog.getCols(), stretchDialog.getRows());
}
}
}
/**
*
* Handles menu command "Canvas Size".
*
**/
public void doCanvasSizeCommand() {
TMView view = getSelectedView();
if (view != null) {
//TMCanvasSizeDialog canvasSizeDialog = new TMCanvasSizeDialog(this, xl);
int retVal = canvasSizeDialog.showDialog(view.getCols(), view.getRows());
if (retVal == JOptionPane.OK_OPTION) {
view.setGridSize(canvasSizeDialog.getCols(), canvasSizeDialog.getRows());
view.setScale(view.getScale());
}
}
}
/**
*
* Handles menu command "Mode".
* Switches to the specified tile mode for the current frame.
* The valid modes are MODE_1D and MODE_2D.
*
**/
public void doModeCommand(int mode) {
TMView view = getSelectedView();
if (view != null) {
view.setMode(mode);
refreshStatusBar();
}
}
/**
*
*
*
**/
public void doSizeBlockToCanvasCommand() {
TMView view = getSelectedView();
if (view != null) {
view.setSizeBlockToCanvas(!view.getSizeBlockToCanvas());
sizeBlockToCanvasMenuItem.setSelected(view.getSizeBlockToCanvas());
}
}
/**
*
*
*
**/
public void doCustomBlockSizeCommand() {
TMView view = getSelectedView();
if (view != null) {
//TMBlockSizeDialog blockSizeDialog = new TMBlockSizeDialog(this, xl);
int retVal = blockSizeDialog.showDialog(view.getBlockWidth(), view.getBlockHeight());
if (retVal == JOptionPane.OK_OPTION) {
view.setSizeBlockToCanvas(false);
sizeBlockToCanvasMenuItem.setSelected(false);
view.setBlockDimensions(blockSizeDialog.getCols(), blockSizeDialog.getRows());
}
}
}
/**
*
*
*
**/
public void doRowInterleaveBlocksCommand() {
TMView view = getSelectedView();
if (view != null) {
view.setRowInterleaveBlocks(!view.getRowInterleaveBlocks());
rowInterleaveBlocksMenuItem.setSelected(view.getRowInterleaveBlocks());
}
}
/**
*
*
*
**/
public void doReopenCommand(File recentFile) {
if (recentFile.exists() && recentFile.canRead()) {
fileOpenChooser.setFileFilter(getTileCodecFilterForFile(recentFile));
openFile(recentFile);
recentFiles.remove(recentFile);
buildReopenMenu();
}
}
/**
*
* Handles the menu command "Custom Codec".
*
**/
public void doCustomCodecCommand() {
TMView view = getSelectedView();
if (view != null) {
customCodecDialog.setVisible(true);
int retVal = 0; // TODO
if (retVal == JOptionPane.OK_OPTION) {
// create the codec
int bpp = customCodecDialog.getBitsPerPixel();
int rmask = customCodecDialog.getRedMask();
int gmask = customCodecDialog.getBlueMask();
int bmask = customCodecDialog.getGreenMask();
int amask = customCodecDialog.getAlphaMask();
// int endianness = customCodecDialog.getEndianness();
String desc = customCodecDialog.getDescription();
DirectColorTileCodec codec = new DirectColorTileCodec("", bpp, rmask, gmask, bmask, amask, desc);
addTileCodec(codec);
view.setTileCodec(codec);
}
}
}
/**
*
* Navigation button press handlers.
*
**/
public void doHomeCommand() {
TMView view = getSelectedView();
if (view != null) {
view.setAbsoluteOffset(view.getMinOffset());
}
}
public void doMinusPageCommand() {
TMView view = getSelectedView();
if (view != null) {
view.setRelativeOffset(-view.getEditorCanvas().getPageIncrement());
}
}
public void doMinusRowCommand() {
TMView view = getSelectedView();
if (view != null) {
view.setRelativeOffset(-view.getEditorCanvas().getRowIncrement());
}
}
public void doMinusTileCommand() {
TMView view = getSelectedView();
if (view != null) {
view.setRelativeOffset(-view.getEditorCanvas().getTileIncrement());
}
}
public void doMinusByteCommand() {
TMView view = getSelectedView();
if (view != null) {
view.setRelativeOffset(-1);
}
}
public void doPlusByteCommand() {
TMView view = getSelectedView();
if (view != null) {
view.setRelativeOffset(1);
}
}
public void doPlusTileCommand() {
TMView view = getSelectedView();
if (view != null) {
view.setRelativeOffset(view.getEditorCanvas().getTileIncrement());
}
}
public void doPlusRowCommand() {
TMView view = getSelectedView();
if (view != null) {
view.setRelativeOffset(view.getEditorCanvas().getRowIncrement());
}
}
public void doPlusPageCommand() {
TMView view = getSelectedView();
if (view != null) {
view.setRelativeOffset(view.getEditorCanvas().getPageIncrement());
}
}
public void doEndCommand() {
TMView view = getSelectedView();
if (view != null) {
view.setRelativeOffset(view.getMaxOffset());
}
}
/**
*
* Handles the menu command "Add To Bookmarks".
*
**/
public void doAddToBookmarksCommand() {
TMView view = getSelectedView();
if (view != null) {
//TMAddToTreeDialog addBookmarkDialog = new TMAddToTreeDialog(this, "Add_To_Bookmarks_Dialog_Title", xl);
int retVal = addBookmarkDialog.showDialog(view.getFileImage().getResources().getBookmarksRoot());
if (retVal == JOptionPane.OK_OPTION) {
// Create & Add the bookmark
FolderNode folder = addBookmarkDialog.getFolder();
String description = addBookmarkDialog.getDescription();
BookmarkItemNode bookmark = view.createBookmark(addBookmarkDialog.getDescription());
/* view.addReversibleAction(
new ReversibleAddBookmarkAction(
bookmark
)
); */
folder.add(bookmark);
refreshBookmarksMenu();
}
}
}
/**
*
* Handles the menu command "Organize Bookmarks".
*
**/
public void doOrganizeBookmarksCommand() {
TMView view = getSelectedView();
if (view != null) {
//TMOrganizeTreeDialog organizeBookmarksDialog = new TMOrganizeTreeDialog(this, "Organize_Bookmarks_Dialog_Title", xl);
organizeBookmarksDialog.showDialog(view.getFileImage().getResources().getBookmarksRoot());
refreshBookmarksMenu();
}
}
/**
*
* Handles the menu command "Add To Palettes".
*
**/
public void doAddToPalettesCommand() {
TMView view = getSelectedView();
if (view != null) {
//TMAddToTreeDialog addPaletteDialog = new TMAddToTreeDialog(this, "Add_To_Palettes_Dialog_Title", xl);
int retVal = addPaletteDialog.showDialog(view.getFileImage().getResources().getPalettesRoot());
if (retVal == JOptionPane.OK_OPTION) {
// Add the palette
FolderNode folder = addPaletteDialog.getFolder();
String description = addPaletteDialog.getDescription();
PaletteItemNode palNode = new PaletteItemNode(view.getPalette(), description);
folder.add(palNode);
/* view.addReversibleAction(
new ReversibleAddPaletteAction(
palette
)
); */
refreshPalettesMenu();
}
}
}
/**
*
* Handles the menu command "Organize Palettes".
*
**/
public void doOrganizePalettesCommand() {
TMView view = getSelectedView();
if (view != null) {
//TMOrganizeTreeDialog organizePalettesDialog = new TMOrganizeTreeDialog(this, "Organize_Palettes_Dialog_Title", xl);
organizePalettesDialog.showDialog(view.getFileImage().getResources().getPalettesRoot());
refreshPalettesMenu();
}
}
/**
*
* Handles the menu command "Edit Colors".
*
**/
public void doEditColorsCommand() {
TMView view = getSelectedView();
if (view != null) {
JOptionPane.showMessageDialog(
this,
"Todo.\nDouble-click on a color in the palette below to edit it.",
"Tile Mangler",
JOptionPane.INFORMATION_MESSAGE
);
// let user edit the color
/* Color newColor = JColorChooser.showDialog(this, "Edit Color", new Color(view.getFGColor()));
if (newColor != null) {
int rgb = newColor.getRGB();
int colorIndex = vizualiser.getIndexOfColorAt(e.getX(), e.getY());
/* view.addReversibleAction(
new ReversiblePaletteEditAction(
view,
view.getPalette(),
colorIndex,
view.getPalette().getEntryRGB(colorIndex),
rgb
)
;*/
/*
view.getPalette().setEntryRGB(colorIndex, rgb);
ui.setFGColor(rgb);
view.getEditorCanvas().unpackPixels();
view.getEditorCanvas().redraw();
repaint();
}*/
}
}
/**
*
* Handles the menu command "Format Palette".
*
**/
public void doColorCodecCommand(ColorCodec codec) {
TMView view = getSelectedView();
if (view != null) {
view.getPalette().setCodec(codec);
view.getEditorCanvas().unpackPixels();
view.getEditorCanvas().redraw();
refreshPalettePane();
}
}
/**
*
* Handles the menu command "Set Palette Size".
*
**/
public void doPaletteSizeCommand() {
TMView view = getSelectedView();
if (view != null) {
//TMPaletteSizeDialog paletteSizeDialog = new TMPaletteSizeDialog(this, xl);
int retVal = paletteSizeDialog.showDialog(view.getPalette().getSize());
if (retVal == JOptionPane.OK_OPTION) {
view.getPalette().setSize(paletteSizeDialog.getPaletteSize());
// TODO: Check some stuff
refreshPalettePane();
}
}
}
/**
*
* Handles the menu command "New Palette".
*
**/
public void doNewPaletteCommand() {
TMView view = getSelectedView();
if (view != null) {
//TMNewPaletteDialog newPaletteDialog = new TMNewPaletteDialog(this, xl);
//newPaletteDialog.setCodecs(colorcodecs);
int retVal = newPaletteDialog.showDialog();
if (retVal == JOptionPane.OK_OPTION) {
// get input
int size = newPaletteDialog.getPaletteSize();
ColorCodec codec = newPaletteDialog.getCodec();
int endianness = newPaletteDialog.getEndianness();
// create the palette
TMPalette palette = new TMPalette("ID", size, codec, endianness);
// set the new palette
view.setPalette(palette);
refreshPalettePane();
refreshPalettesMenu();
}
}
}
/**
*
* Handles the menu command "Import Palette From This File".
*
**/
public void doImportInternalPaletteCommand() {
TMView view = getSelectedView();
if (view != null) {
//TMImportInternalPaletteDialog importInternalPaletteDialog = new TMImportInternalPaletteDialog(this, xl);
//importInternalPaletteDialog.setCodecs(colorcodecs);
int retVal = importInternalPaletteDialog.showDialog();
if (retVal == JOptionPane.OK_OPTION) {
// get input
int offset = importInternalPaletteDialog.getOffset();
int size = importInternalPaletteDialog.getPaletteSize();
ColorCodec codec = importInternalPaletteDialog.getCodec();
int endianness = importInternalPaletteDialog.getEndianness();
boolean copy = importInternalPaletteDialog.getCopy();
// create the palette
byte[] data = view.getFileImage().getContents();
TMPalette palette = new TMPalette("ID", data, offset, size, codec, endianness, copy, false);
// set the new palette
view.setPalette(palette);
refreshPalettePane();
refreshPalettesMenu();
}
}
}
/**
*
* Handles the menu command "Import Palette From Another File".
*
**/
public void doImportExternalPaletteCommand() {
TMView view = getSelectedView();
if (view != null) {
if (new File(this.lastPath).exists()) {
this.paletteOpenChooser.setCurrentDirectory(new File(this.lastPath));
} else {
this.paletteOpenChooser.setCurrentDirectory(new File("."));
}
// have the user select a file
int retVal = paletteOpenChooser.showOpenDialog(this);
if (retVal == JFileChooser.APPROVE_OPTION) {
// get the selected file
File file = paletteOpenChooser.getSelectedFile();
// figure out palette info based on file filter
FileFilter ff = paletteOpenChooser.getFileFilter();
if (!(ff instanceof TMPaletteFileFilter)) {
ff = getPaletteFilterForFile(file);
}
TMPaletteFileFilter pf = (TMPaletteFileFilter)ff;
int size = pf.getSize();
ColorCodec codec = getColorCodecByID(pf.getCodecID());
int offset = pf.getOffset();
int endianness = pf.getEndianness();
// create buffer to hold the palette data
byte[] data = new byte[size * codec.getBytesPerPixel()];
// read the palette data
RandomAccessFile raf=null;
try {
raf = new RandomAccessFile(file, "r");
raf.seek(offset);
raf.read(data);
raf.close();
}
catch (Exception e) {
JOptionPane.showMessageDialog(this,
xlate("Palette_Read_Error")+"\n"+e.getMessage(),
"Tile Mangler",
JOptionPane.ERROR_MESSAGE);
return;
}
// create the palette
TMPalette palette = new TMPalette("ID", data, 0, size, codec, endianness, true, false);
// set the new palette
view.setPalette(palette);
refreshPalettePane();
refreshPalettesMenu();
}
}
}
/**
*
* Handles menu command "Palette Endianness".
*
**/
public void doPaletteEndiannessCommand(int endianness) {
TMView view = getSelectedView();
if (view != null) {
view.getPalette().setEndianness(endianness);
}
}
/**
*
* Called when user has selected a bookmark to jump to from the Navigate menu.
*
**/
public void doGotoBookmarkCommand(BookmarkItemNode bookmark) {
TMView view = getSelectedView();
if (view != null) {
view.gotoBookmark(bookmark);
}
}
/**
*
* Called when user has selected a palette to use from the Palette menu.
*
**/
public void doSelectPaletteCommand(TMPalette palette) {
TMView view = getSelectedView();
if (view != null) {
view.setPalette(palette);
refreshPalettePane();
refreshPaletteEndiannessSelection(view);
refreshColorCodecSelection(view);
}
}
/**
*
*
*
**/
public void doDecreaseWidthCommand() {
TMView view = getSelectedView();
if (view != null) {
view.setGridSize(view.getCols()-1, view.getRows());
view.setScale(view.getScale());
}
}
/**
*
*
*
**/
public void doIncreaseWidthCommand() {
TMView view = getSelectedView();
if (view != null) {
view.setGridSize(view.getCols()+1, view.getRows());
view.setScale(view.getScale());
}
}
/**
*
*
*
**/
public void doDecreaseHeightCommand() {
TMView view = getSelectedView();
if (view != null) {
view.setGridSize(view.getCols(), view.getRows()-1);
view.setScale(view.getScale());
}
}
/**
*
*
*
**/
public void doIncreaseHeightCommand() {
TMView view = getSelectedView();
if (view != null) {
view.setGridSize(view.getCols(), view.getRows()+1);
view.setScale(view.getScale());
}
}
//////////////////////////////////////////////////////////////////////////////
/**
*
* Call this when a fileimage has been modified.
*
**/
public void fileImageModified(FileImage img) {
img.setModified(true);
setSaveButtonsEnabled(true);
saveAllMenuItem.setEnabled(true);
}
/**
*
* Sets enabled state of save buttons.
*
**/
public void setSaveButtonsEnabled(boolean b) {
saveButton.setEnabled(b);
saveMenuItem.setEnabled(b);
}
/**
*
* Sets enabled state of undo buttons.
*
**/
public void setUndoButtonsEnabled(boolean b) {
undoButton.setEnabled(b);
undoMenuItem.setEnabled(b);
}
/**
*
* Sets enabled state of redo buttons.
*
**/
public void setRedoButtonsEnabled(boolean b) {
redoButton.setEnabled(b);
redoMenuItem.setEnabled(b);
}
/**
*
* Hides/disables MDI-specific menus and buttons.
*
**/
public void disableMDIStuff() {
// Hide MDI menus
menuBar.remove(editMenu);
menuBar.remove(viewMenu);
menuBar.remove(imageMenu);
menuBar.remove(navigateMenu);
menuBar.remove(paletteMenu);
menuBar.remove(windowMenu);
// Hide some File menu items
closeMenuItem.setVisible(false);
closeAllMenuItem.setVisible(false);
saveMenuItem.setVisible(false);
saveAsMenuItem.setVisible(false);
saveAllMenuItem.setVisible(false);
// Hide some Toolbar buttons
saveButton.setVisible(false);
cutButton.setVisible(false);
copyButton.setVisible(false);
pasteButton.setVisible(false);
undoButton.setVisible(false);
redoButton.setVisible(false);
gotoButton.setVisible(false);
addBookmarkButton.setVisible(false);
decWidthButton.setVisible(false);
incWidthButton.setVisible(false);
decHeightButton.setVisible(false);
incHeightButton.setVisible(false);
// Hide navigation bar
navBar.setVisible(false);
// Hide tool pane
toolPane.setVisible(false);
// hide bottom pane
bottomPane.setVisible(false);
}
/**
*
* Shows/enables MDI-specific menus and buttons.
*
**/
public void enableMDIStuff() {
// Show MDI menus
menuBar.remove(helpMenu);
menuBar.add(editMenu);
menuBar.add(viewMenu);
menuBar.add(imageMenu);
menuBar.add(navigateMenu);
menuBar.add(paletteMenu);
menuBar.add(windowMenu);
menuBar.add(helpMenu);
// Show File menu items
closeMenuItem.setVisible(true);
closeAllMenuItem.setVisible(true);
saveMenuItem.setVisible(true);
saveAsMenuItem.setVisible(true);
saveAllMenuItem.setVisible(true);
saveAllMenuItem.setEnabled(false);
// TODO: Enable previously hidden menu items w/ key accelerators
// Show Toolbar buttons
saveButton.setVisible(true);
cutButton.setVisible(true);
copyButton.setVisible(true);
pasteButton.setVisible(true);
undoButton.setVisible(true);
redoButton.setVisible(true);
gotoButton.setVisible(true);
addBookmarkButton.setVisible(true);
decWidthButton.setVisible(true);
incWidthButton.setVisible(true);
decHeightButton.setVisible(true);
incHeightButton.setVisible(true);
// disable some buttons
saveButton.setEnabled(false);
pasteButton.setEnabled(false);
pasteMenuItem.setEnabled(false);
undoButton.setEnabled(false);
redoButton.setEnabled(false);
// Show navigation bar
navBar.setVisible(true);
// Show tool pane
toolPane.setVisible(true);
// Maybe show statusbar
statusBar.setVisible(viewStatusBar);
// show bottom pane
bottomPane.setVisible(true);
}
/**
*
* Adds a codec to the list of available codecs and creates a menu item for it.
*
**/
public void addTileCodec(TileCodec codec) {
TileCodecMenuItem codecMenuItem = new TileCodecMenuItem(codec);
tileCodecMenu.add(codecMenuItem);
tileCodecButtonGroup.add(codecMenuItem);
tileCodecButtonHashtable.put(codec, codecMenuItem);
}
/**
*
* Menu item that represents a tile codec.
*
**/
private class TileCodecMenuItem extends JRadioButtonMenuItem {
private TileCodec codec;
// Creates a TileCodecMenuItem for the given codec.
public TileCodecMenuItem(TileCodec codec) {
super(codec.getDescription()); // use description as button text
this.codec = codec;
// TODO: setToolTipText(exampleFormats)
addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doTileCodecCommand(((TileCodecMenuItem)e.getSource()).getCodec());
setSelected(true);
}
}
);
}
/**
*
* Gets the codec that the menu item represents.
*
**/
public TileCodec getCodec() {
return codec;
}
}
/**
*
* Gets the "successor" of the given codec, which is the next codec in
* the global list of codecs (with wraparound).
*
**/
public TileCodec getTileCodecSuccessor(TileCodec codec) {
int i = tilecodecs.indexOf(codec);
if (i == tilecodecs.size()-1) {
return (TileCodec)tilecodecs.get(0);
}
else {
return (TileCodec)tilecodecs.get(i+1);
}
}
/**
*
* Gets the "predecessor" of the given codec, which is the previous codec in
* the global list of codecs (with wraparound).
*
**/
public TileCodec getTileCodecPredecessor(TileCodec codec) {
int i = tilecodecs.indexOf(codec);
if (i == 0) {
return (TileCodec)tilecodecs.get(tilecodecs.size()-1);
}
else {
return (TileCodec)tilecodecs.get(i-1);
}
}
/**
*
* Just a JButton with very small insets, to avoid lots of whitespace around the
* ImageIcon.
*
**/
private class ToolButton extends JButton {
Insets insets=null;
public ToolButton(String text) {
super(text);
if(isWindows){
insets = new Insets(6,6,8,8);
}else{
insets = new Insets(4,4,5,5);
}
}
public ToolButton(ImageIcon icon) {
super(icon);
setBackground(MenuBG);
if(isWindows){
insets = new Insets(6,6,8,8);
}else{
insets = new Insets(4,4,5,5);
}
}
public Insets getInsets() {
return insets;
}
}
/**
*
* Just a JToggleButton with very small insets, to avoid lots of whitespace
* around the ImageIcon.
*
**/
private class ToolToggleButton extends JToggleButton {
Insets insets=null;
public ToolToggleButton(String text) {
super(text);
if(isWindows){
insets = new Insets(6,6,8,8);
}else{
insets = new Insets(4,4,5,5);
}
}
public ToolToggleButton(ImageIcon icon) {
super(icon);
setBackground(MenuBG);
if(isWindows){
insets = new Insets(6,6,8,8);
}else{
insets = new Insets(4,4,5,5);
}
}
public Insets getInsets() {
return insets;
}
}
/**
*
* Gets the foreground color for the current view.
*
**/
public int getFGColor() {
TMView view = getSelectedView();
if (view != null) {
return view.getFGColor();
}
return 0;
}
/**
*
* Gets the background color for the current view.
*
**/
public int getBGColor() {
TMView view = getSelectedView();
if (view != null) {
return view.getBGColor();
}
return 0;
}
/**
*
* Sets the foreground color for the current view.
*
**/
public void setFGColor(int fgColor) {
TMView view = getSelectedView();
if (view != null) {
view.setFGColor(fgColor);
palettePane.setFGColor(fgColor);
}
}
/**
*
* Sets the background color for the current view.
*
**/
public void setBGColor(int bgColor) {
TMView view = getSelectedView();
if (view != null) {
view.setBGColor(bgColor);
palettePane.setBGColor(bgColor);
}
}
/**
*
* Sets the palette index for the current view.
*
**/
public void setPalIndex(int palIndex) {
TMView view = getSelectedView();
if (view != null) {
view.setPalIndex(palIndex);
}
}
/**
*
* Gets the current tool.
*
**/
public int getTool() {
return tool;
}
/**
*
* Gets the desktop.
*
**/
public JDesktopPane getDesktop() {
return desktop;
}
public static int getColorIndex(int palIndex, int bpp) {
if (bpp > 8) bpp = 8;
int cols = 1 << bpp;
return palIndex * cols;
}
/**
*
* Creates a view with the given resources/attributes.
*
**/
public TMView createView(FileImage img, TileCodec tc, TMPalette pal, int mode) {
TMView view = new TMView(this, img, tc);
view.setMode(mode);
view.setPalette(pal);
return view;
}
/**
*
* Adds a view to the desktop.
*
**/
public void addViewToDesktop(TMView view) {
desktop.add(view);
try {
view.setSelected(true);
}
catch (java.beans.PropertyVetoException x) {
x.printStackTrace();
}
desktop.revalidate();
desktop.repaint();
if (desktop.getAllFrames().length == 1) {
// this is the first frame, show the MDI toolbars and menus
enableMDIStuff();
}
}
/**
*
* Initializes the View->Codec menu based on the tilecodecs present, and sets up
* the fileOpenChooser accordingly.
*
**/
private void initTileCodecUIStuff() {
buildTileCodecsMenu();
initFileOpenChooser();
}
/**
*
* Builds the View->Codec menu.
*
**/
private void buildTileCodecsMenu() {
tileCodecMenu.setMnemonic(KeyEvent.VK_C);
tileCodecMenu.removeAll();
for (int i=0; i<tilecodecs.size(); i++) {
addTileCodec((TileCodec)tilecodecs.get(i));
}
}
/**
*
* Builds the Palette->Format menu.
*
**/
private void buildColorCodecsMenu() {
colorCodecMenu.setMnemonic(KeyEvent.VK_F);
colorCodecMenu.removeAll();
for (int i=0; i<colorcodecs.size(); i++) {
addColorCodec((ColorCodec)colorcodecs.get(i));
}
}
/**
*
* Adds a codec to the list of available codecs and creates a menu item for it.
*
**/
public void addColorCodec(ColorCodec codec) {
ColorCodecMenuItem codecMenuItem = new ColorCodecMenuItem(codec);
colorCodecMenu.add(codecMenuItem);
colorCodecButtonGroup.add(codecMenuItem);
colorCodecButtonHashtable.put(codec, codecMenuItem);
}
/**
*
* Menu item that represents a color codec.
*
**/
private class ColorCodecMenuItem extends JRadioButtonMenuItem {
private ColorCodec codec;
// Creates a ColorCodecMenuItem for the given codec.
public ColorCodecMenuItem(ColorCodec codec) {
super(codec.getDescription()); // use description as button text
this.codec = codec;
addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doColorCodecCommand(((ColorCodecMenuItem)e.getSource()).getCodec());
setSelected(true);
}
}
);
}
/**
*
* Gets the codec that the menu item represents.
*
**/
public ColorCodec getCodec() {
return codec;
}
}
/**
*
* Sets up the file open chooser.
*
**/
private void initFileOpenChooser() {
fileOpenChooser.setAcceptAllFileFilterUsed(false);
fileOpenChooser.resetChoosableFileFilters();
// TODO: Sort alphabetically by description...
String extlist = "";
for (int i=0; i<filefilters.size(); i++) {
TMTileCodecFileFilter cff = (TMTileCodecFileFilter)filefilters.get(i);
fileOpenChooser.addChoosableFileFilter(cff);
if (i > 0) extlist += ",";
extlist += cff.getExtlist();
}
TMFileFilter supportedFilter = new TMFileFilter(extlist, xlate("All_Supported_Formats"));
fileOpenChooser.addChoosableFileFilter(supportedFilter);
fileOpenChooser.addChoosableFileFilter(allFilter);
fileOpenChooser.setFileFilter(supportedFilter);
}
/**
*
* Sets up the palette open chooser.
*
**/
private void initPaletteOpenChooser() {
paletteOpenChooser.setAcceptAllFileFilterUsed(false);
paletteOpenChooser.resetChoosableFileFilters();
String extlist = "";
for (int i=0; i<palettefilters.size(); i++) {
TMPaletteFileFilter pff = (TMPaletteFileFilter)palettefilters.get(i);
paletteOpenChooser.addChoosableFileFilter(pff);
if (i > 0) extlist += ",";
extlist += pff.getExtlist();
}
TMFileFilter supportedFilter = new TMFileFilter(extlist, xlate("All_Supported_Formats"));
paletteOpenChooser.addChoosableFileFilter(supportedFilter);
paletteOpenChooser.setFileFilter(supportedFilter);
}
/**
*
* Gets the color codec that has the specified ID, or null if no such codec exists.
*
**/
public ColorCodec getColorCodecByID(String codecID) {
for (int i=0; i<colorcodecs.size(); i++) {
ColorCodec cc = (ColorCodec)colorcodecs.get(i);
if (cc.getID().equals(codecID)) {
return cc;
}
}
return null;
}
/**
*
* Gets the tile codec that has the specified ID, or null if no such codec exists.
*
**/
public TileCodec getTileCodecByID(String codecID) {
for (int i=0; i<tilecodecs.size(); i++) {
TileCodec tc = (TileCodec)tilecodecs.get(i);
if (tc.getID().equals(codecID)) {
return tc;
}
}
return null;
}
/**
*
* Gets the default tile codec file filter for the specified file
* based on its extension.
*
**/
private TMTileCodecFileFilter getTileCodecFilterForFile(File file) {
for (int i=0; i<filefilters.size(); i++) {
TMTileCodecFileFilter cff = (TMTileCodecFileFilter)filefilters.get(i);
if (cff.accept(file)) {
return cff;
}
}
return (TMTileCodecFileFilter)filefilters.get(0);
}
/**
*
* Gets the default palette file filter for the specified file
* based on its extension.
*
**/
private TMPaletteFileFilter getPaletteFilterForFile(File file) {
for (int i=0; i<palettefilters.size(); i++) {
TMPaletteFileFilter pff = (TMPaletteFileFilter)palettefilters.get(i);
if (pff.accept(file)) {
return pff;
}
}
return (TMPaletteFileFilter)palettefilters.get(0);
}
/**
*
* Recognizes all files.
*
**/
private class AllFilter extends TMFileFilter {
public boolean accept(File f) {
return true;
}
public String getDescription() {
return xlate("All_Files");
}
}
/**
*
* Builds the menu containing all the bookmarks.
*
**/
private void buildBookmarksMenu(FolderNode root) {
// remove old bookmark menuitems, if any
while (navigateMenu.getItemCount() > 5) {
navigateMenu.remove(5);
}
TMTreeNode[] children = root.getChildren();
if (children.length == 0) {
// no bookmarks exist
}
else {
// add all the bookmarks
navigateMenu.add(separator);
for (int i=0; i<children.length; i++) {
addToBookmarksMenu(children[i], navigateMenu);
}
}
}
/**
*
* Recursive routine that adds the given node to the given menu.
* If the node is internal it is expanded into a menu of its own.
*
**/
public void addToBookmarksMenu(TMTreeNode node, JMenu menu) {
if (node instanceof BookmarkItemNode) {
menu.add(new BookmarkMenuItem((BookmarkItemNode)node));
}
else {
// folder
JMenu subMenu = new JMenu(node.toString());
TMTreeNode[] children = node.getChildren();
if (children.length == 0) {
// no bookmarks exist in this folder
JMenuItem emptyItem = new JMenuItem("("+xlate("Empty")+")");
emptyItem.setEnabled(false);
subMenu.add(emptyItem);
}
else {
// add all the child bookmarks/folders
for (int i=0; i<children.length; i++) {
addToBookmarksMenu(children[i], subMenu);
}
}
menu.add(subMenu);
}
}
/**
*
* Menu item that represents a bookmark.
*
**/
private class BookmarkMenuItem extends JMenuItem {
private BookmarkItemNode bookmark;
// creates a bookmarkmenu item for the given bookmark.
public BookmarkMenuItem(BookmarkItemNode bookmark) {
super(bookmark.getDescription());
this.bookmark = bookmark;
addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doGotoBookmarkCommand(((BookmarkMenuItem)e.getSource()).getBookmark());
}
}
);
setToolTipText(bookmark.getToolTipText());
}
public BookmarkItemNode getBookmark() {
return bookmark;
}
}
/**
*
* Builds the menu containing all the palettes.
*
**/
private void buildPalettesMenu(FolderNode root) {
// remove old palette menuitems, if any
while (paletteMenu.getItemCount() > 10) {
paletteMenu.remove(10);
}
paletteButtonHashtable.clear();
paletteButtonGroup = new ButtonGroup();
TMTreeNode[] children = root.getChildren();
if (children.length == 0) {
// no palettes exist (shouldn't be possible)
}
else {
// add all the palettes
paletteMenu.add(separator);
for (int i=0; i<children.length; i++) {
addToPalettesMenu(children[i], paletteMenu);
}
}
paletteButtonGroup.add(dummyPaletteMenuItem);
}
/**
*
* Recursive routine that adds the given node to the given menu.
* If the node is internal it is expanded into a menu of its own.
*
**/
public void addToPalettesMenu(TMTreeNode node, JMenu menu) {
if (node instanceof PaletteItemNode) {
// palette
PaletteItemNode paletteNode = (PaletteItemNode)node;
PaletteMenuItem paletteMenuItem = new PaletteMenuItem(paletteNode);
menu.add(paletteMenuItem);
paletteButtonGroup.add(paletteMenuItem);
paletteButtonHashtable.put(paletteNode.getPalette(), paletteMenuItem);
}
else {
// folder
JMenu subMenu = new JMenu(node.toString());
TMTreeNode[] children = node.getChildren();
if (children.length == 0) {
// no palettes exist in this folder
JMenuItem emptyItem = new JMenuItem("("+xlate("Empty")+")");
emptyItem.setEnabled(false);
subMenu.add(emptyItem);
}
else {
// add all the child palettes/folders
for (int i=0; i<children.length; i++) {
addToPalettesMenu(children[i], subMenu);
}
}
menu.add(subMenu);
}
}
/**
*
* Menu item that represents a bookmark.
*
**/
private class PaletteMenuItem extends JRadioButtonMenuItem {
private PaletteItemNode paletteNode;
// creates a palettemenu item for the given palette node.
public PaletteMenuItem(PaletteItemNode paletteNode) {
super(paletteNode.getDescription());
this.paletteNode = paletteNode;
addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doSelectPaletteCommand(((PaletteMenuItem)e.getSource()).getPalette());
}
}
);
setToolTipText(paletteNode.getToolTipText());
}
public TMPalette getPalette() {
return paletteNode.getPalette();
}
}
/**
*
* Updates various UI components (menus, statusbar, palette) to reflect the
* settings of the current frame.
*
**/
public void viewSelected(TMView view) {
setSaveButtonsEnabled(view.getFileImage().isModified());
// (un)check some menu items
TMEditorCanvas ec = view.getEditorCanvas();
blockGridMenuItem.setSelected(ec.isBlockGridVisible());
tileGridMenuItem.setSelected(ec.isTileGridVisible());
pixelGridMenuItem.setSelected(ec.isPixelGridVisible());
rowInterleaveBlocksMenuItem.setSelected(ec.getRowInterleaveBlocks());
refreshModeSelection(view);
refreshTileCodecSelection(view);
refreshBlockSizeSelection(view);
refreshPalettePane();
refreshStatusBar();
refreshBookmarksMenu();
refreshPalettesMenu();
refreshUndoRedo();
setTitle("Tile Mangler - "+view.getTitle());
}
/**
*
* Selects the correct menu item, according to the view's block size.
*
**/
public void refreshBlockSizeSelection(TMView view) {
sizeBlockToCanvasMenuItem.setSelected(view.getSizeBlockToCanvas());
}
/**
*
* Selects the correct menu item, according to the view's mode.
*
**/
public void refreshModeSelection(TMView view) {
// select the correct mode menu item
if (view.getMode() == TileCodec.MODE_1D) {
_1DimensionalMenuItem.setSelected(true);
}
else {
_2DimensionalMenuItem.setSelected(true);
}
}
/**
*
* Selects the correct menu item, according to the view's tile codec.
*
**/
public void refreshTileCodecSelection(TMView view) {
((TileCodecMenuItem)tileCodecButtonHashtable.get(view.getTileCodec())).setSelected(true);
}
/**
*
* Reloads the palette.
*
**/
public void refreshPalettePane() {
TMView view = getSelectedView();
if (view != null) {
palettePane.viewSelected(view);
}
}
/**
*
* Updates the Undo/Redo buttons text+status.
*
**/
public void refreshUndoRedo() {
TMView view = getSelectedView();
if (view != null) {
setUndoButtonsEnabled(view.canUndo());
if (view.canUndo()) {
undoMenuItem.setText(xlate("Undo")+" "+xlate(view.getFirstUndoableAction().getPresentationName()));
}
else {
undoMenuItem.setText(xlate("Cant_Undo"));
}
undoButton.setToolTipText(undoMenuItem.getText());
setRedoButtonsEnabled(view.canRedo());
if (view.canRedo()) {
redoMenuItem.setText(xlate("Redo")+" "+xlate(view.getFirstRedoableAction().getPresentationName()));
}
else {
redoMenuItem.setText(xlate("Cant_Redo"));
}
redoButton.setToolTipText(redoMenuItem.getText());
}
}
/**
*
* Sets the statusbar fields according to current view settings.
*
**/
public void refreshStatusBar() {
TMView view = getSelectedView();
if (view != null) {
statusBar.viewSelected(view);
}
}
/**
*
* Builds the bookmarks menu according to current file image.
*
**/
public void refreshBookmarksMenu() {
TMView view = getSelectedView();
if (view != null) {
buildBookmarksMenu(view.getFileImage().getResources().getBookmarksRoot());
}
}
/**
*
* Builds the palettes menu according to current file image.
*
**/
public void refreshPalettesMenu() {
TMView view = getSelectedView();
if (view != null) {
buildPalettesMenu(view.getFileImage().getResources().getPalettesRoot());
refreshPaletteSelection(view);
refreshPaletteEndiannessSelection(view);
refreshColorCodecSelection(view);
}
}
/**
*
* Refreshes the palette selection.
*
**/
public void refreshPaletteSelection(TMView view) {
PaletteMenuItem item = (PaletteMenuItem)paletteButtonHashtable.get(view.getPalette());
if (item != null) {
item.setSelected(true);
}
else {
dummyPaletteMenuItem.setSelected(true);
}
}
/**
*
* Refreshes the palette endianness.
*
**/
public void refreshPaletteEndiannessSelection(TMView view) {
if (view.getPalette().getEndianness() == ColorCodec.LITTLE_ENDIAN) {
paletteLittleEndianMenuItem.setSelected(true);
}
else {
paletteBigEndianMenuItem.setSelected(true);
}
}
/**
*
* Selects the correct menu item, according to the view's color codec.
*
**/
public void refreshColorCodecSelection(TMView view) {
((ColorCodecMenuItem)colorCodecButtonHashtable.get(view.getPalette().getCodec())).setSelected(true);
}
/**
*
* Opens the specified file.
*
**/
public void openFile(File file) {
System.gc();
// read file
FileLoaderThread thread = null;
try {
thread = new FileLoaderThread(file);
}
catch (OutOfMemoryError e) {
JOptionPane.showMessageDialog(this,
xlate("Out_Of_Memory")+"\n"+file.length()+" bytes needed to load file.", // i18n
"Tile Mangler",
JOptionPane.ERROR_MESSAGE);
return;
}
catch (Exception e) {
JOptionPane.showMessageDialog(this,
xlate("Load_File_Error")+"\n"+e.getMessage(),
"Tile Mangler",
JOptionPane.ERROR_MESSAGE);
return;
}
ProgressDialog dialog = new ProgressDialog(this, thread);
byte[] contents = thread.getContents();
// see if a filelistener should receive notification
String ext = TMFileFilter.getExtension(file);
for (int i=0; i<filelisteners.size(); i++) {
TMFileListener fl = (TMFileListener)filelisteners.get(i);
if (fl.doFormatDetect(contents, ext)) {
fileListenerHashtable.put(contents, fl);
fl.fileLoaded(contents, ext);
break;
}
}
// create fileimage
FileImage img = new FileImage(file, contents);
// create resources for it
File resourceFile = TMFileResources.getResourceFileFor(file);
if (resourceFile.exists()) {
// load the resources from XML document
try {
new TMFileResources(resourceFile, img, this);
}
catch (SAXException e) {
JOptionPane.showMessageDialog(this,
xlate("Parser_Parse_Error")+"\n"+e.getMessage(),
"Tile Mangler",
JOptionPane.ERROR_MESSAGE);
}
catch (ParserConfigurationException e) {
JOptionPane.showMessageDialog(this,
xlate("Parser_Config_Error")+"\n"+e.getMessage(),
"Tile Mangler",
JOptionPane.ERROR_MESSAGE);
}
catch (IOException e) {
JOptionPane.showMessageDialog(this,
xlate("Parser_IO_Error")+"\n"+e.getMessage(),
"Tile Mangler",
JOptionPane.ERROR_MESSAGE);
}
}
else {
// create default resources
new TMFileResources(img, this);
}
// figure out mode and codec based on file filter
FileFilter ff = fileOpenChooser.getFileFilter();
if (!(ff instanceof TMTileCodecFileFilter)) {
ff = getTileCodecFilterForFile(file);
}
int mode = ((TMTileCodecFileFilter)ff).getDefaultMode();
TileCodec tc = getTileCodecByID(((TMTileCodecFileFilter)ff).getCodecID());
TMPalette pal = new TMPalette("PAL000", TMPalette.defaultPalette, getColorCodecByID("CF01"), ColorCodec.LITTLE_ENDIAN, true);
addViewToDesktop(createView(img, tc, pal, mode));
// Remove file from recentFiles, if it's there
for (int i=0; i<recentFiles.size(); i++) {
File f = (File)recentFiles.get(i);
if (f.compareTo(file) == 0) {
recentFiles.remove(f);
buildReopenMenu();
break;
}
}
thread.killContentsRef();
thread = null;
System.gc();
}
/**
*
* Builds the menu containing most recently opened (closed) files.
*
**/
public void buildReopenMenu() {
reopenMenu.removeAll();
if (recentFiles.size() == 0) {
JMenuItem emptyItem = new JMenuItem("("+xlate("Empty")+")");
emptyItem.setEnabled(false);
reopenMenu.add(emptyItem);
}
else {
for (int i=0; i<recentFiles.size(); i++) {
File recentFile = (File)recentFiles.get(i);
reopenMenu.add(new RecentFileMenuItem(recentFile));
}
}
}
/**
*
* Menu item that represents a recently opened (closed) file.
*
**/
private class RecentFileMenuItem extends JMenuItem {
private File recentFile;
// creates a recentfilemenuitem for the given file.
public RecentFileMenuItem(File recentFile) {
super(recentFile.getName());
setToolTipText(recentFile.getAbsolutePath());
this.recentFile = recentFile;
addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
doReopenCommand(((RecentFileMenuItem)e.getSource()).getRecentFile());
}
}
);
}
public File getRecentFile() {
return recentFile;
}
}
/**
*
*
*
**/
public ColorCodec[] getColorCodecs() {
ColorCodec[] ccs = new ColorCodec[colorcodecs.size()];
for (int i=0; i<ccs.length; i++) {
ccs[i] = (ColorCodec)colorcodecs.get(i);
}
return ccs;
}
/**
*
* Lets the user select a locale from a combobox.
*
**/
public void selectLanguage() {
// figure out available translations
File dir = new File("./languages");
File[] files = dir.listFiles(new PropertiesFilter());
if ((files != null) && (files.length > 0)) {
Locale[] locales = new Locale[files.length];
String[] displayNames = new String[locales.length];
int defaultIndex=0;
for (int i=0; i<files.length; i++) {
String name = files[i].getName();
String language = name.substring(name.indexOf('_')+1, name.lastIndexOf('_'));
String country = name.substring(name.lastIndexOf('_')+1, name.lastIndexOf('.'));
locales[i] = new Locale(language, country);
displayNames[i] = locales[i].getDisplayName();
if (language.equals("en")) defaultIndex=i;
}
// ask user to select language
String selectedName = (String)JOptionPane.showInputDialog(this,
"Choose a locale:", "Tile Mangler",
JOptionPane.INFORMATION_MESSAGE, null,
displayNames, displayNames[defaultIndex]);
if (selectedName != null) {
// find selected one
for (int i=0; i<locales.length; i++) {
if (selectedName.equals(locales[i].getDisplayName())) {
// select this locale
this.locale = locales[i];
break;
}
}
}
}
else {
JOptionPane.showMessageDialog(this,
xlate("No language files found.\nPlease check your installation."),
"Tile Mangler",
JOptionPane.ERROR_MESSAGE);
}
}
/**
*
* File filter that recognizes filenames of the form
* language_xx_yy.properties
*
**/
private class PropertiesFilter implements FilenameFilter {
public boolean accept(File dir, String name) {
return (name.toLowerCase().startsWith("language")
&& (name.indexOf('_') != -1)
&& name.toLowerCase().endsWith(".properties"));
}
}
/**
*
* Attempts to translate the given key string by consulting a ResourceBundle.
* If no corresponding value is found, the key itself is returned.
*
**/
public String xlate(String key) {
try {
String value = xl.xlate(key);
return value;
}
catch (Exception e) {
return key;
}
}
/**
*
* Gets the selected view frame.
*
**/
public TMView getSelectedView() {
return (TMView)desktop.getSelectedFrame();
}
/**
*
* Adds the given file to the list of recently opened (closed) files.
*
**/
public void addToRecentFiles(File f) {
// make sure it's not already in the list
for (int i=0; i<recentFiles.size(); i++) {
File rf = (File)recentFiles.get(i);
if (rf.compareTo(f) == 0) {
recentFiles.remove(i);
break;
}
}
// add it
recentFiles.insertElementAt(f, 0);
// check for "overflow"
if (recentFiles.size() > maxRecentFiles) {
recentFiles.remove(maxRecentFiles-1);
}
}
}