
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!
5034 lines
No EOL
166 KiB
Java
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);
|
|
}
|
|
}
|
|
|
|
} |