/* This file is part of Eternity II Editor. * * Eternity II Editor 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 3 of the License, or * (at your option) any later version. * * Eternity II Editor 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. * * You should have received a copy of the GNU General Public License * along with Eternity II Editor. If not, see <http://www.gnu.org/licenses/>. * * Eternity II Editor project is hosted on SourceForge: * http://sourceforge.net/projects/eternityii/ * and maintained by Yannick Kirschhoffer <alcibiade@alcibiade.org> */ package org.alcibiade.eternity.editor.gui; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.Toolkit; import java.awt.event.KeyEvent; import javax.swing.BorderFactory; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.KeyStroke; import javax.swing.text.Document; import javax.swing.text.PlainDocument; import org.alcibiade.eternity.editor.gui.action.AboutAction; import org.alcibiade.eternity.editor.gui.action.CopyGridAction; import org.alcibiade.eternity.editor.gui.action.E2CloneGridAction; import org.alcibiade.eternity.editor.gui.action.ExitAction; import org.alcibiade.eternity.editor.gui.action.FileNewAction; import org.alcibiade.eternity.editor.gui.action.FileOpenAction; import org.alcibiade.eternity.editor.gui.action.FileSaveAsAction; import org.alcibiade.eternity.editor.gui.action.FillGridAction; import org.alcibiade.eternity.editor.gui.action.FillGridBorderAction; import org.alcibiade.eternity.editor.gui.action.FillGridCenterAction; import org.alcibiade.eternity.editor.gui.action.FlipGridAction; import org.alcibiade.eternity.editor.gui.action.LoadGridAction; import org.alcibiade.eternity.editor.gui.action.PasteGridAction; import org.alcibiade.eternity.editor.gui.action.ResetGridAction; import org.alcibiade.eternity.editor.gui.action.ResizeGridAction; import org.alcibiade.eternity.editor.gui.action.RotateGridAction; import org.alcibiade.eternity.editor.gui.action.RotateGridCenterAction; import org.alcibiade.eternity.editor.gui.action.ShuffleGridAction; import org.alcibiade.eternity.editor.gui.action.SwitchQuadIdsGridAction; import org.alcibiade.eternity.editor.model.GridModel; public class EditorFrame extends JFrame { private static final long serialVersionUID = 1L; private static final int DEFAULT_SIZE = 7; public EditorFrame() { super("Eternity II"); // -- Grid components -- GridModel gridmodel = new GridModel(DEFAULT_SIZE); GridView grid = new GridView(gridmodel); grid.setPreferredSize(new Dimension(750, 750)); // -- Info panel -- Document scoreDocument = new PlainDocument(); Document statusDocument = new PlainDocument(); Document infosDocument = new PlainDocument(); JTextField statusTf = new JTextField(statusDocument, null, 16); JTextField scoreTf = new JTextField(scoreDocument, null, 16); JTextField infosTf = new JTextField(infosDocument, null, 16); statusTf.setEditable(false); scoreTf.setEditable(false); infosTf.setEditable(false); JPanel labels = new JPanel(new GridLayout(3, 1)); labels.add(new JLabel("Grid infos")); labels.add(new JLabel("Grid status")); labels.add(new JLabel("Score")); labels.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); JPanel infos = new JPanel(new GridLayout(3, 1)); infos.add(infosTf); infos.add(statusTf); infos.add(scoreTf); infos.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); JCheckBox showIds = new JCheckBox(new SwitchQuadIdsGridAction(grid)); JPanel infoPanel = new JPanel(new BorderLayout()); infoPanel.add(BorderLayout.WEST, labels); infoPanel.add(BorderLayout.CENTER, infos); infoPanel.add(BorderLayout.SOUTH, showIds); infoPanel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createCompoundBorder( BorderFactory.createTitledBorder("Grid Informations"), BorderFactory .createEmptyBorder(5, 5, 5, 5)), infoPanel.getBorder())); // -- Solver panel -- JPanel solvePanel = new SolverManager(grid); // -- Main frame -- JPanel partRight = new JPanel(new BorderLayout()); partRight.add(BorderLayout.NORTH, infoPanel); partRight.add(BorderLayout.CENTER, solvePanel); JPanel frameContent = new JPanel(new BorderLayout()); frameContent.add(BorderLayout.CENTER, grid); frameContent.add(BorderLayout.EAST, partRight); new GridAnalyst(grid, scoreDocument, statusDocument, infosDocument, showIds); setContentPane(frameContent); setJMenuBar(buildMenuBar(grid)); pack(); setDefaultCloseOperation(EXIT_ON_CLOSE); Dimension mysize = getSize(); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); setLocation(screenSize.width / 2 - (mysize.width / 2), screenSize.height / 2 - (mysize.height / 2)); } private JMenuBar buildMenuBar(GridView gridView) { int menuShortcutKeyMask = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); GridModel gridModel = gridView.getGridModel(); JMenuBar menubar = new JMenuBar(); JMenu mFile = new JMenu("File"); JMenuItem itemNew = new JMenuItem(new FileNewAction(gridModel, gridView, DEFAULT_SIZE)); mFile.add(itemNew); JMenuItem itemOpen = new JMenuItem(new FileOpenAction(gridModel, gridView, this)); itemOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, menuShortcutKeyMask)); mFile.add(itemOpen); JMenuItem itemSaveAs = new JMenuItem(new FileSaveAsAction(gridModel, gridView, this)); itemSaveAs.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, menuShortcutKeyMask)); mFile.add(itemSaveAs); JMenuItem itemQuit = new JMenuItem(new ExitAction()); itemQuit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, menuShortcutKeyMask)); mFile.add(itemQuit); JMenu mEdit = new JMenu("Edit"); JMenuItem itemCopy = new JMenuItem(new CopyGridAction(gridModel)); itemCopy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, menuShortcutKeyMask)); mEdit.add(itemCopy); JMenuItem itemPaste = new JMenuItem(new PasteGridAction(gridModel, gridView)); itemPaste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, menuShortcutKeyMask)); mEdit.add(itemPaste); JMenu mGrid = new JMenu("Grid"); mGrid.add(new JMenuItem(new ResetGridAction(gridModel, gridView))); mGrid.add(new JMenuItem(new ShuffleGridAction(gridModel, gridView))); JMenu mgRotate = new JMenu("Rotate"); mGrid.add(mgRotate); mgRotate.add(new JMenuItem(new RotateGridAction(gridModel, true, gridView))); mgRotate.add(new JMenuItem(new RotateGridAction(gridModel, false, gridView))); mgRotate.add(new JMenuItem(new RotateGridCenterAction(gridModel, true, gridView))); mgRotate.add(new JMenuItem(new RotateGridCenterAction(gridModel, false, gridView))); JMenu mgFlip = new JMenu("Flip"); mGrid.add(mgFlip); mgFlip.add(new JMenuItem(new FlipGridAction(gridModel, true, gridView))); mgFlip.add(new JMenuItem(new FlipGridAction(gridModel, false, gridView))); JMenu mgSize = new JMenu("Size"); mGrid.add(mgSize); mgSize.add(new JMenuItem(new ResizeGridAction(gridModel, 2, gridView))); mgSize.add(new JMenuItem(new ResizeGridAction(gridModel, 3, gridView))); mgSize.add(new JMenuItem(new ResizeGridAction(gridModel, 4, gridView))); mgSize.add(new JMenuItem(new ResizeGridAction(gridModel, 5, gridView))); mgSize.add(new JMenuItem(new ResizeGridAction(gridModel, 6, gridView))); mgSize.add(new JMenuItem(new ResizeGridAction(gridModel, 7, gridView))); mgSize.add(new JMenuItem(new ResizeGridAction(gridModel, 8, gridView))); mgSize.add(new JMenuItem(new ResizeGridAction(gridModel, 9, gridView))); mgSize.add(new JMenuItem(new ResizeGridAction(gridModel, 10, gridView))); mgSize.add(new JMenuItem(new ResizeGridAction(gridModel, 11, gridView))); mgSize.add(new JMenuItem(new ResizeGridAction(gridModel, 12, gridView))); mgSize.add(new JMenuItem(new ResizeGridAction(gridModel, 13, gridView))); mgSize.add(new JMenuItem(new ResizeGridAction(gridModel, 14, gridView))); mgSize.add(new JMenuItem(new ResizeGridAction(gridModel, 15, gridView))); mgSize.add(new JMenuItem(new ResizeGridAction(gridModel, 16, gridView))); JMenu mgFB = new JMenu("Whole board"); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 2, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 3, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 4, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 5, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 6, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 7, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 8, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 9, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 10, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 11, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 12, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 13, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 14, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 15, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 16, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 17, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 18, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 19, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 20, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 21, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 22, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 23, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 24, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 25, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 26, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 27, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 28, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 29, gridView))); mgFB.add(new JMenuItem(new FillGridAction(gridModel, 30, gridView))); JMenu mgFO = new JMenu("Border"); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 2, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 3, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 4, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 5, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 6, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 7, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 8, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 9, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 10, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 11, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 12, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 13, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 14, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 15, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 16, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 17, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 18, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 19, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 20, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 21, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 22, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 23, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 24, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 25, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 26, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 27, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 28, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 29, gridView))); mgFO.add(new JMenuItem(new FillGridBorderAction(gridModel, 30, gridView))); JMenu mgFI = new JMenu("Center"); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 2, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 3, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 4, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 5, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 6, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 7, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 8, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 9, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 10, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 11, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 12, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 13, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 14, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 15, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 16, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 17, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 18, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 19, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 20, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 21, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 22, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 23, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 24, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 25, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 26, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 27, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 28, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 29, gridView))); mgFI.add(new JMenuItem(new FillGridCenterAction(gridModel, 30, gridView))); JMenu mgFill = new JMenu("Auto Fill"); mgFill.add(mgFB); mgFill.add(mgFO); mgFill.add(mgFI); mgFill.add(new E2CloneGridAction(gridModel, gridView)); mGrid.add(mgFill); JMenu mgLoad = new JMenu("Load model"); mGrid.add(mgLoad); mgLoad.add(new JMenuItem(new LoadGridAction(gridModel, "org/alcibiade/eternity/editor/models/model_yannick_0204.txt", "2x2x4 Original", gridView))); mgLoad.add(new JMenuItem(new LoadGridAction(gridModel, "org/alcibiade/eternity/editor/models/model_yannick_0304.txt", "3x3x4 Original", gridView))); // mgLoad.add(new JMenuItem(new LoadGridAction(gridmodel, // "model_web_0404.txt", "4x4x4 Puzzle Web"))); mgLoad.add(new JMenuItem(new LoadGridAction(gridModel, "org/alcibiade/eternity/editor/models/model_yannick_0504.txt", "5x5x4 Original", gridView))); mgLoad.add(new JMenuItem(new LoadGridAction(gridModel, "org/alcibiade/eternity/editor/models/model_yannick_0505.txt", "5x5x5 Original", gridView))); mgLoad.add(new JMenuItem(new LoadGridAction(gridModel, "org/alcibiade/eternity/editor/models/model_yannick_0604.txt", "6x6x4 Original", gridView))); mgLoad.add(new JMenuItem(new LoadGridAction(gridModel, "org/alcibiade/eternity/editor/models/model_yannick_0606.txt", "6x6x6 Original", gridView))); mgLoad.add(new JMenuItem(new LoadGridAction(gridModel, "org/alcibiade/eternity/editor/models/model_yannick_0704.txt", "7x7x4 Original", gridView))); mgLoad.add(new JMenuItem(new LoadGridAction(gridModel, "org/alcibiade/eternity/editor/models/model_yannick_0706.txt", "7x7x6 Original", gridView))); mgLoad.add(new JMenuItem(new LoadGridAction(gridModel, "org/alcibiade/eternity/editor/models/model_yannick_1015.txt", "10x10x15 Original", gridView))); mgLoad.add(new JMenuItem(new LoadGridAction(gridModel, "org/alcibiade/eternity/editor/models/model_yannick_1116.txt", "11x11x16 Original", gridView))); mgLoad.add(new JMenuItem(new LoadGridAction(gridModel, "org/alcibiade/eternity/editor/models/model_yannick_1218.txt", "12x12x18 Original", gridView))); mgLoad.add(new JMenuItem(new LoadGridAction(gridModel, "org/alcibiade/eternity/editor/models/model_yannick_1623.txt", "16x16x23 Original", gridView))); JMenu mInfo = new JMenu("?"); mInfo.add(new JMenuItem(new AboutAction(this))); menubar.add(mFile); menubar.add(mEdit); menubar.add(mGrid); menubar.add(mInfo); return menubar; } }