/* This file is part of jpcsp. Jpcsp 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. Jpcsp 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 Jpcsp. If not, see <http://www.gnu.org/licenses/>. */ package jpcsp; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ComponentEvent; import java.awt.event.ComponentListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.security.Security; import java.text.MessageFormat; import java.util.*; import java.util.List; import javax.swing.*; import jpcsp.Allegrex.compiler.Profiler; import jpcsp.Allegrex.compiler.RuntimeContext; import jpcsp.autotests.AutoTestsRunner; import jpcsp.crypto.AES128; import jpcsp.Debugger.ElfHeaderInfo; import jpcsp.Debugger.ImageViewer; import jpcsp.Debugger.InstructionCounter; import jpcsp.Debugger.MemoryViewer; import jpcsp.Debugger.StepLogger; import jpcsp.Debugger.DisassemblerModule.DisassemblerFrame; import jpcsp.Debugger.DisassemblerModule.VfpuFrame; import jpcsp.GUI.CheatsGUI; import jpcsp.GUI.IMainGUI; import jpcsp.GUI.RecentElement; import jpcsp.GUI.SettingsGUI; import jpcsp.GUI.ControlsGUI; import jpcsp.GUI.LogGUI; import jpcsp.GUI.UmdBrowser; import jpcsp.GUI.UmdVideoPlayer; import jpcsp.HLE.HLEModuleManager; import jpcsp.HLE.Modules; import jpcsp.HLE.kernel.types.SceModule; import jpcsp.HLE.modules.IoFileMgrForUser; import jpcsp.HLE.modules.ModuleMgrForUser; import jpcsp.HLE.modules.sceDisplay; import jpcsp.HLE.modules.sceUtility; import jpcsp.filesystems.SeekableDataInput; import jpcsp.filesystems.umdiso.UmdIsoFile; import jpcsp.filesystems.umdiso.UmdIsoReader; import jpcsp.format.PSF; import jpcsp.graphics.GEProfiler; import jpcsp.graphics.VideoEngine; import jpcsp.hardware.Audio; import jpcsp.hardware.MemoryStick; import jpcsp.hardware.Screen; import jpcsp.log.LogWindow; import jpcsp.log.LoggingOutputStream; import jpcsp.network.proonline.ProOnlineNetworkAdapter; import jpcsp.remote.HTTPServer; import jpcsp.settings.Settings; import jpcsp.util.*; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.xml.DOMConfigurator; import com.jidesoft.plaf.LookAndFeelFactory; import jpcsp.Debugger.FileLogger.FileLoggerFrame; import jpcsp.hardware.Model; /** * * @author shadow */ public class MainGUI extends javax.swing.JFrame implements KeyListener, ComponentListener, MouseListener, IMainGUI { static { LWJGLFixer.fixOnce(); } private static final long serialVersionUID = -3647025845406693230L; private static Logger log = Emulator.log; public static final int MAX_RECENT = 10; Emulator emulator; UmdBrowser umdbrowser; UmdVideoPlayer umdvideoplayer; InstructionCounter instructioncounter; File loadedFile; boolean umdLoaded; boolean useFullscreen; JPopupMenu fullScreenMenu; private List<RecentElement> recentUMD = new LinkedList<RecentElement>(); private List<RecentElement> recentFile = new LinkedList<RecentElement>(); private final static String[] userDir = { "ms0/PSP/SAVEDATA", "ms0/PSP/GAME", "tmp" }; private static final String logConfigurationSettingLeft = " %1$-40s %3$c%2$s%4$c"; private static final String logConfigurationSettingRight = " %3$c%2$s%4$c %1$s"; private static final String logConfigurationSettingLeftPatch = " %1$-40s %3$c%2$s%4$c (%5$s)"; private static final String logConfigurationSettingRightPatch = " %3$c%2$s%4$c %1$s (%5$s)"; public static final int displayModeBitDepth = 32; public static final int preferredDisplayModeRefreshRate = 60; // Preferred refresh rate if 60Hz private DisplayMode displayMode; private SetLocationThread setLocationThread; private JComponent fillerLeft; private JComponent fillerRight; private JComponent fillerTop; private JComponent fillerBottom; private static boolean jideInitialized; // map to hold action listeners for menu entries in fullscreen mode private HashMap<KeyStroke, ActionListener[]> actionListenerMap; private boolean doUmdBuffering = false; private boolean runFromVsh = false; @Override public DisplayMode getDisplayMode() { return displayMode; } /** * Creates new form MainGUI */ public MainGUI() { System.setOut(new PrintStream(new LoggingOutputStream(Logger.getLogger("emu"), Level.INFO))); actionListenerMap = new HashMap<KeyStroke, ActionListener[]>(); // create log window in a local variable - see explanation further down LogWindow logwin = new LogWindow(); // create needed user directories for (String dirName : userDir) { File dir = new File(dirName); if (!dir.exists()) { dir.mkdirs(); } } emulator = new Emulator(this); Screen.start(); // must be done after initialising the Emulator class as State initialises // its elements indirectly via getting the pointer to MainGUI by means // of the Emulator class... State.logWindow = logwin; // next two lines are for overlay menus over joglcanvas JPopupMenu.setDefaultLightWeightPopupEnabled(false); ToolTipManager.sharedInstance().setLightWeightPopupEnabled(false); useFullscreen = Settings.getInstance().readBool("gui.fullscreen"); if (useFullscreen && !isDisplayable()) { setUndecorated(true); setLocation(0, 0); setSize(getFullScreenDimension()); setPreferredSize(getFullScreenDimension()); } String resolution = Settings.getInstance().readString("emu.graphics.resolution"); if (resolution != null && resolution.contains("x")) { int width = Integer.parseInt(resolution.split("x")[0]); int heigth = Integer.parseInt(resolution.split("x")[1]); changeScreenResolution(width, heigth); } initJide(); createComponents(); onUmdChange(); setTitle(MetaInformation.FULL_NAME); // add glcanvas to frame and pack frame to get the canvas size getContentPane().add(Modules.sceDisplayModule.getCanvas(), java.awt.BorderLayout.CENTER); Modules.sceDisplayModule.getCanvas().addKeyListener(this); Modules.sceDisplayModule.getCanvas().addMouseListener(this); addComponentListener(this); pack(); // Check if any plugins are available. xbrzCheck.setEnabled(false); String path = System.getProperty("java.library.path"); if (path != null && path.length() > 0) { File plugins = new File(path); String[] pluginList = plugins.list(); if (pluginList != null) { for (String list : pluginList) { if (list.contains("XBRZ4JPCSP")) { xbrzCheck.setEnabled(true); } } } } SwingUtilities.invokeLater(new Runnable() { @Override public void run() { // let the layout manager settle before setting the minimum size Modules.sceDisplayModule.setDisplayMinimumSize(); // as the console log window position depends on the main // window's size run this here if (Settings.getInstance().readBool("gui.snapLogwindow")) { updateConsoleWinPosition(); } } }); WindowPropSaver.loadWindowProperties(this); try { Image iconImage = new ImageIcon(ClassLoader.getSystemClassLoader().getResource("jpcsp/icon.png")).getImage(); this.setIconImages(Arrays.asList( iconImage.getScaledInstance(16, 16, Image.SCALE_SMOOTH), iconImage.getScaledInstance(32, 32, Image.SCALE_SMOOTH), iconImage )); } catch (Throwable t) { t.printStackTrace(); } } private Dimension getDimensionFromDisplay(int width, int height) { Insets insets = getInsets(); Dimension dimension = new Dimension( width + insets.left + insets.right, height + insets.top + insets.bottom); return dimension; } @Override public void setDisplayMinimumSize(int width, int height) { Dimension dim = getDimensionFromDisplay(width, height); dim.height += mainToolBar.getHeight(); dim.height += MenuBar.getHeight(); setMinimumSize(dim); } @Override public void setDisplaySize(int width, int height) { setSize(getDimensionFromDisplay(width, height)); } private void initJide() { if (!jideInitialized) { LookAndFeelFactory.installJideExtension(LookAndFeelFactory.VSNET_STYLE_WITHOUT_MENU); jideInitialized = true; } } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { filtersGroup = new javax.swing.ButtonGroup(); resGroup = new javax.swing.ButtonGroup(); frameSkipGroup = new javax.swing.ButtonGroup(); clockSpeedGroup = new javax.swing.ButtonGroup(); mainToolBar = new javax.swing.JToolBar(); RunButton = new javax.swing.JToggleButton(); PauseButton = new javax.swing.JToggleButton(); ResetButton = new javax.swing.JButton(); MenuBar = new javax.swing.JMenuBar(); FileMenu = new javax.swing.JMenu(); openUmd = new javax.swing.JMenuItem(); OpenFile = new javax.swing.JMenuItem(); RecentMenu = new javax.swing.JMenu(); switchUmd = new javax.swing.JMenuItem(); ejectMs = new javax.swing.JMenuItem(); jSeparator2 = new javax.swing.JSeparator(); SaveSnap = new javax.swing.JMenuItem(); LoadSnap = new javax.swing.JMenuItem(); ExportMenu = new javax.swing.JMenu(); ExportVisibleElements = new javax.swing.JMenuItem(); ExportAllElements = new javax.swing.JMenuItem(); jSeparator1 = new javax.swing.JSeparator(); ExitEmu = new javax.swing.JMenuItem(); OptionsMenu = new javax.swing.JMenu(); VideoOpt = new javax.swing.JMenu(); ResizeMenu = new javax.swing.JMenu(); oneTimeResize = new javax.swing.JCheckBoxMenuItem(); twoTimesResize = new javax.swing.JCheckBoxMenuItem(); threeTimesResize = new javax.swing.JCheckBoxMenuItem(); FiltersMenu = new javax.swing.JMenu(); noneCheck = new javax.swing.JCheckBoxMenuItem(); anisotropicCheck = new javax.swing.JCheckBoxMenuItem(); FrameSkipMenu = new javax.swing.JMenu(); FrameSkipNone = new javax.swing.JCheckBoxMenuItem(); FPS5 = new javax.swing.JCheckBoxMenuItem(); FPS10 = new javax.swing.JCheckBoxMenuItem(); FPS15 = new javax.swing.JCheckBoxMenuItem(); FPS20 = new javax.swing.JCheckBoxMenuItem(); FPS30 = new javax.swing.JCheckBoxMenuItem(); FPS60 = new javax.swing.JCheckBoxMenuItem(); ShotItem = new javax.swing.JMenuItem(); RotateItem = new javax.swing.JMenuItem(); AudioOpt = new javax.swing.JMenu(); MuteOpt = new javax.swing.JCheckBoxMenuItem(); ClockSpeedOpt = new javax.swing.JMenu(); ClockSpeed50 = new javax.swing.JCheckBoxMenuItem(); ClockSpeed75 = new javax.swing.JCheckBoxMenuItem(); ClockSpeedNormal = new javax.swing.JCheckBoxMenuItem(); ClockSpeed150 = new javax.swing.JCheckBoxMenuItem(); ClockSpeed200 = new javax.swing.JCheckBoxMenuItem(); ClockSpeed300 = new javax.swing.JCheckBoxMenuItem(); ControlsConf = new javax.swing.JMenuItem(); ConfigMenu = new javax.swing.JMenuItem(); DebugMenu = new javax.swing.JMenu(); ToolsSubMenu = new javax.swing.JMenu(); LoggerMenu = new javax.swing.JMenu(); ToggleLogger = new javax.swing.JCheckBoxMenuItem(); CustomLogger = new javax.swing.JMenuItem(); EnterDebugger = new javax.swing.JMenuItem(); EnterMemoryViewer = new javax.swing.JMenuItem(); EnterImageViewer = new javax.swing.JMenuItem(); VfpuRegisters = new javax.swing.JMenuItem(); ElfHeaderViewer = new javax.swing.JMenuItem(); FileLog = new javax.swing.JMenuItem(); InstructionCounter = new javax.swing.JMenuItem(); DumpIso = new javax.swing.JMenuItem(); ResetProfiler = new javax.swing.JMenuItem(); ClearTextureCache = new javax.swing.JMenuItem(); ClearVertexCache = new javax.swing.JMenuItem(); ExportISOFile = new javax.swing.JMenuItem(); CheatsMenu = new javax.swing.JMenu(); cwcheat = new javax.swing.JMenuItem(); LanguageMenu = new javax.swing.JMenu(); SystemLocale = new javax.swing.JMenuItem(); EnglishGB = new javax.swing.JMenuItem(); EnglishUS = new javax.swing.JMenuItem(); French = new javax.swing.JMenuItem(); German = new javax.swing.JMenuItem(); Lithuanian = new javax.swing.JMenuItem(); Spanish = new javax.swing.JMenuItem(); Catalan = new javax.swing.JMenuItem(); Portuguese = new javax.swing.JMenuItem(); PortugueseBR = new javax.swing.JMenuItem(); Japanese = new javax.swing.JMenuItem(); Russian = new javax.swing.JMenuItem(); Polish = new javax.swing.JMenuItem(); ChinesePRC = new javax.swing.JMenuItem(); ChineseTW = new javax.swing.JMenuItem(); Italian = new javax.swing.JMenuItem(); Greek = new javax.swing.JMenuItem(); PluginsMenu = new javax.swing.JMenu(); xbrzCheck = new javax.swing.JCheckBoxMenuItem(); HelpMenu = new javax.swing.JMenu(); About = new javax.swing.JMenuItem(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); setForeground(java.awt.Color.white); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent evt) { formWindowClosing(evt); } }); addComponentListener(new java.awt.event.ComponentAdapter() { public void componentResized(java.awt.event.ComponentEvent evt) { formComponentResized(evt); } }); mainToolBar.setFloatable(false); mainToolBar.setRollover(true); RunButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/PlayIcon.png"))); // NOI18N java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("jpcsp/languages/jpcsp"); // NOI18N RunButton.setText(bundle.getString("MainGUI.RunButton.text")); // NOI18N RunButton.setFocusable(false); RunButton.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT); RunButton.setIconTextGap(2); RunButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); RunButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { RunButtonActionPerformed(evt); } }); mainToolBar.add(RunButton); PauseButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/PauseIcon.png"))); // NOI18N PauseButton.setText(bundle.getString("MainGUI.PauseButton.text")); // NOI18N PauseButton.setFocusable(false); PauseButton.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT); PauseButton.setIconTextGap(2); PauseButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); PauseButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { PauseButtonActionPerformed(evt); } }); mainToolBar.add(PauseButton); ResetButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/StopIcon.png"))); // NOI18N ResetButton.setText(bundle.getString("MainGUI.ResetButton.text")); // NOI18N ResetButton.setFocusable(false); ResetButton.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT); ResetButton.setIconTextGap(2); ResetButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM); ResetButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ResetButtonActionPerformed(evt); } }); mainToolBar.add(ResetButton); getContentPane().add(mainToolBar, java.awt.BorderLayout.NORTH); FileMenu.setText(bundle.getString("MainGUI.FileMenu.text")); // NOI18N openUmd.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.CTRL_MASK)); openUmd.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/LoadUmdIcon.png"))); // NOI18N openUmd.setText(bundle.getString("MainGUI.openUmd.text")); // NOI18N openUmd.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { openUmdActionPerformed(evt); } }); FileMenu.add(openUmd); OpenFile.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.ALT_MASK)); OpenFile.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/LoadFileIcon.png"))); // NOI18N OpenFile.setText(bundle.getString("MainGUI.OpenFile.text")); // NOI18N OpenFile.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { OpenFileActionPerformed(evt); } }); FileMenu.add(OpenFile); RecentMenu.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/RecentIcon.png"))); // NOI18N RecentMenu.setText(bundle.getString("MainGUI.RecentMenu.text")); // NOI18N FileMenu.add(RecentMenu); switchUmd.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/LoadUmdIcon.png"))); // NOI18N switchUmd.setText(bundle.getString("MainGUI.switchUmd.text")); // NOI18N switchUmd.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { switchUmdActionPerformed(evt); } }); FileMenu.add(switchUmd); ejectMs.setText(bundle.getString("MainGUI.ejectMs.text")); // NOI18N ejectMs.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ejectMsActionPerformed(evt); } }); FileMenu.add(ejectMs); FileMenu.add(jSeparator2); SaveSnap.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.SHIFT_MASK)); SaveSnap.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/SaveStateIcon.png"))); // NOI18N SaveSnap.setText(bundle.getString("MainGUI.SaveSnap.text")); // NOI18N SaveSnap.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { SaveSnapActionPerformed(evt); } }); FileMenu.add(SaveSnap); LoadSnap.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_L, java.awt.event.InputEvent.SHIFT_MASK)); LoadSnap.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/LoadStateIcon.png"))); // NOI18N LoadSnap.setText(bundle.getString("MainGUI.LoadSnap.text")); // NOI18N LoadSnap.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { LoadSnapActionPerformed(evt); } }); FileMenu.add(LoadSnap); ExportMenu.setText(bundle.getString("MainGUI.ExportMenu.text")); // NOI18N ExportVisibleElements.setText(bundle.getString("MainGUI.ExportVisibleElements.text")); // NOI18N ExportVisibleElements.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ExportVisibleElementsActionPerformed(evt); } }); ExportMenu.add(ExportVisibleElements); ExportAllElements.setText(bundle.getString("MainGUI.ExportAllElements.text")); // NOI18N ExportAllElements.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ExportAllElementsActionPerformed(evt); } }); ExportMenu.add(ExportAllElements); FileMenu.add(ExportMenu); FileMenu.add(jSeparator1); ExitEmu.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_E, java.awt.event.InputEvent.CTRL_MASK)); ExitEmu.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/CloseIcon.png"))); // NOI18N ExitEmu.setText(bundle.getString("MainGUI.ExitEmu.text")); // NOI18N ExitEmu.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ExitEmuActionPerformed(evt); } }); FileMenu.add(ExitEmu); MenuBar.add(FileMenu); OptionsMenu.setText(bundle.getString("MainGUI.OptionsMenu.text")); // NOI18N VideoOpt.setText(bundle.getString("MainGUI.VideoOpt.text")); // NOI18N ResizeMenu.setText(bundle.getString("MainGUI.ResizeMenu.text")); // NOI18N resGroup.add(oneTimeResize); oneTimeResize.setSelected(true); oneTimeResize.setText("1x"); // NOI18N oneTimeResize.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { oneTimeResizeActionPerformed(evt); } }); ResizeMenu.add(oneTimeResize); resGroup.add(twoTimesResize); twoTimesResize.setText("2x"); // NOI18N twoTimesResize.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { twoTimesResizeActionPerformed(evt); } }); ResizeMenu.add(twoTimesResize); resGroup.add(threeTimesResize); threeTimesResize.setText("3x"); // NOI18N threeTimesResize.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { threeTimesResizeActionPerformed(evt); } }); ResizeMenu.add(threeTimesResize); VideoOpt.add(ResizeMenu); FiltersMenu.setText(bundle.getString("MainGUI.FiltersMenu.text")); // NOI18N filtersGroup.add(noneCheck); noneCheck.setSelected(true); noneCheck.setText(bundle.getString("MainGUI.noneCheck.text")); // NOI18N noneCheck.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { noneCheckActionPerformed(evt); } }); FiltersMenu.add(noneCheck); filtersGroup.add(anisotropicCheck); anisotropicCheck.setSelected(Settings.getInstance().readBool("emu.graphics.filters.anisotropic")); anisotropicCheck.setText(bundle.getString("MainGUI.anisotropicCheck.text")); // NOI18N anisotropicCheck.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { anisotropicCheckActionPerformed(evt); } }); FiltersMenu.add(anisotropicCheck); VideoOpt.add(FiltersMenu); FrameSkipMenu.setText(bundle.getString("MainGUI.FrameSkipMenu.text")); // NOI18N frameSkipGroup.add(FrameSkipNone); FrameSkipNone.setSelected(true); FrameSkipNone.setText(bundle.getString("MainGUI.FrameSkipNone.text")); // NOI18N FrameSkipNone.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { frameSkipNoneActionPerformed(evt); } }); FrameSkipMenu.add(FrameSkipNone); frameSkipGroup.add(FPS5); FPS5.setText("5 FPS"); // NOI18N FPS5.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { frameSkipFPS5ActionPerformed(evt); } }); FrameSkipMenu.add(FPS5); frameSkipGroup.add(FPS10); FPS10.setText("10 FPS"); // NOI18N FPS10.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { frameSkipFPS10ActionPerformed(evt); } }); FrameSkipMenu.add(FPS10); frameSkipGroup.add(FPS15); FPS15.setText("15 FPS"); // NOI18N FPS15.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { frameSkipFPS15ActionPerformed(evt); } }); FrameSkipMenu.add(FPS15); frameSkipGroup.add(FPS20); FPS20.setText("20 FPS"); // NOI18N FPS20.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { frameSkipFPS20ActionPerformed(evt); } }); FrameSkipMenu.add(FPS20); frameSkipGroup.add(FPS30); FPS30.setText("30 FPS"); // NOI18N FPS30.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { frameSkipFPS30ActionPerformed(evt); } }); FrameSkipMenu.add(FPS30); frameSkipGroup.add(FPS60); FPS60.setText("60 FPS"); // NOI18N FPS60.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { frameSkipFPS60ActionPerformed(evt); } }); FrameSkipMenu.add(FPS60); VideoOpt.add(FrameSkipMenu); ShotItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F5, 0)); ShotItem.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/ScreenshotIcon.png"))); // NOI18N ShotItem.setText(bundle.getString("MainGUI.ShotItem.text")); // NOI18N ShotItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ShotItemActionPerformed(evt); } }); VideoOpt.add(ShotItem); RotateItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F6, 0)); RotateItem.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/RotateIcon.png"))); // NOI18N RotateItem.setText(bundle.getString("MainGUI.RotateItem.text")); // NOI18N RotateItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { RotateItemActionPerformed(evt); } }); VideoOpt.add(RotateItem); OptionsMenu.add(VideoOpt); AudioOpt.setText(bundle.getString("MainGUI.AudioOpt.text")); // NOI18N MuteOpt.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_M, java.awt.event.InputEvent.SHIFT_MASK)); MuteOpt.setText(bundle.getString("MainGUI.MuteOpt.text")); // NOI18N MuteOpt.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { MuteOptActionPerformed(evt); } }); AudioOpt.add(MuteOpt); OptionsMenu.add(AudioOpt); ClockSpeedOpt.setText(bundle.getString("MainGUI.ClockSpeedOpt.text")); // NOI18N clockSpeedGroup.add(ClockSpeed50); ClockSpeed50.setText(bundle.getString("MainGUI.ClockSpeed50.text")); // NOI18N ClockSpeed50.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ClockSpeed50ActionPerformed(evt); } }); ClockSpeedOpt.add(ClockSpeed50); clockSpeedGroup.add(ClockSpeed75); ClockSpeed75.setText(bundle.getString("MainGUI.ClockSpeed75.text")); // NOI18N ClockSpeed75.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ClockSpeed75ActionPerformed(evt); } }); ClockSpeedOpt.add(ClockSpeed75); clockSpeedGroup.add(ClockSpeedNormal); ClockSpeedNormal.setSelected(true); ClockSpeedNormal.setText(bundle.getString("MainGUI.ClockSpeedNormal.text")); // NOI18N ClockSpeedNormal.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ClockSpeedNormalActionPerformed(evt); } }); ClockSpeedOpt.add(ClockSpeedNormal); clockSpeedGroup.add(ClockSpeed150); ClockSpeed150.setText(bundle.getString("MainGUI.ClockSpeed150.text")); // NOI18N ClockSpeed150.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ClockSpeed150ActionPerformed(evt); } }); ClockSpeedOpt.add(ClockSpeed150); clockSpeedGroup.add(ClockSpeed200); ClockSpeed200.setText(bundle.getString("MainGUI.ClockSpeed200.text")); // NOI18N ClockSpeed200.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ClockSpeed200ActionPerformed(evt); } }); ClockSpeedOpt.add(ClockSpeed200); clockSpeedGroup.add(ClockSpeed300); ClockSpeed300.setText(bundle.getString("MainGUI.ClockSpeed300.text")); // NOI18N ClockSpeed300.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ClockSpeed300ActionPerformed(evt); } }); ClockSpeedOpt.add(ClockSpeed300); OptionsMenu.add(ClockSpeedOpt); ControlsConf.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F11, 0)); ControlsConf.setText(bundle.getString("MainGUI.ControlsConf.text")); // NOI18N ControlsConf.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ControlsConfActionPerformed(evt); } }); OptionsMenu.add(ControlsConf); ConfigMenu.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F12, 0)); ConfigMenu.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/SettingsIcon.png"))); // NOI18N ConfigMenu.setText(bundle.getString("MainGUI.ConfigMenu.text")); // NOI18N ConfigMenu.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ConfigMenuActionPerformed(evt); } }); OptionsMenu.add(ConfigMenu); MenuBar.add(OptionsMenu); DebugMenu.setText(bundle.getString("MainGUI.DebugMenu.text")); // NOI18N ToolsSubMenu.setText(bundle.getString("MainGUI.ToolsSubMenu.text")); // NOI18N LoggerMenu.setText(bundle.getString("ConsoleWindow.title")); // NOI18N ToggleLogger.setText(bundle.getString("MainGUI.ToggleLogger.text")); // NOI18N ToggleLogger.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ToggleLoggerActionPerformed(evt); } }); LoggerMenu.add(ToggleLogger); CustomLogger.setText(bundle.getString("MainGUI.CustomLogger.text")); // NOI18N CustomLogger.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { CustomLoggerActionPerformed(evt); } }); LoggerMenu.add(CustomLogger); ToolsSubMenu.add(LoggerMenu); EnterDebugger.setText(bundle.getString("DisassemblerFrame.title")); // NOI18N EnterDebugger.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { EnterDebuggerActionPerformed(evt); } }); ToolsSubMenu.add(EnterDebugger); EnterMemoryViewer.setText(bundle.getString("MemoryViewer.title")); // NOI18N EnterMemoryViewer.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { EnterMemoryViewerActionPerformed(evt); } }); ToolsSubMenu.add(EnterMemoryViewer); EnterImageViewer.setText(bundle.getString("ImageViewer.title")); // NOI18N EnterImageViewer.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { EnterImageViewerActionPerformed(evt); } }); ToolsSubMenu.add(EnterImageViewer); VfpuRegisters.setText(bundle.getString("VfpuFrame.title")); // NOI18N VfpuRegisters.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { VfpuRegistersActionPerformed(evt); } }); ToolsSubMenu.add(VfpuRegisters); ElfHeaderViewer.setText(bundle.getString("ElfHeaderInfo.title")); // NOI18N ElfHeaderViewer.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ElfHeaderViewerActionPerformed(evt); } }); ToolsSubMenu.add(ElfHeaderViewer); FileLog.setText(bundle.getString("FileLoggerFrame.title")); // NOI18N FileLog.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { FileLogActionPerformed(evt); } }); ToolsSubMenu.add(FileLog); InstructionCounter.setText(bundle.getString("InstructionCounter.title")); // NOI18N InstructionCounter.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { InstructionCounterActionPerformed(evt); } }); ToolsSubMenu.add(InstructionCounter); DebugMenu.add(ToolsSubMenu); DumpIso.setText(bundle.getString("MainGUI.DumpIso.text")); // NOI18N DumpIso.setEnabled(false); DumpIso.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { DumpIsoActionPerformed(evt); } }); DebugMenu.add(DumpIso); ResetProfiler.setText(bundle.getString("MainGUI.ResetProfiler.text")); // NOI18N ResetProfiler.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ResetProfilerActionPerformed(evt); } }); DebugMenu.add(ResetProfiler); ClearTextureCache.setText(bundle.getString("MainGUI.ClearTextureCache.text")); // NOI18N ClearTextureCache.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ClearTextureCacheActionPerformed(evt); } }); DebugMenu.add(ClearTextureCache); ClearVertexCache.setText(bundle.getString("MainGUI.ClearVertexCache.text")); // NOI18N ClearVertexCache.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ClearVertexCacheActionPerformed(evt); } }); DebugMenu.add(ClearVertexCache); ExportISOFile.setText(bundle.getString("MainGUI.ExportISOFile.text")); // NOI18N ExportISOFile.setEnabled(false); ExportISOFile.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ExportISOFileActionPerformed(evt); } }); DebugMenu.add(ExportISOFile); MenuBar.add(DebugMenu); CheatsMenu.setText(bundle.getString("MainGUI.CheatsMenu.text")); // NOI18N cwcheat.setText("CWCheat"); // NOI18N cwcheat.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cwcheatActionPerformed(evt); } }); CheatsMenu.add(cwcheat); MenuBar.add(CheatsMenu); LanguageMenu.setText("Language"); // NOI18N SystemLocale.setText(bundle.getString("MainGUI.SystemLocale.text")); // NOI18N SystemLocale.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { SystemLocaleActionPerformed(evt); } }); LanguageMenu.add(SystemLocale); EnglishGB.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/flags/en_UK.png"))); // NOI18N java.util.ResourceBundle bundle1 = java.util.ResourceBundle.getBundle("jpcsp/languages/common"); // NOI18N EnglishGB.setText(bundle1.getString("englishUK")); // NOI18N EnglishGB.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { EnglishGBActionPerformed(evt); } }); LanguageMenu.add(EnglishGB); EnglishUS.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/flags/en_US.png"))); // NOI18N EnglishUS.setText(bundle1.getString("englishUS")); // NOI18N EnglishUS.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { EnglishUSActionPerformed(evt); } }); LanguageMenu.add(EnglishUS); French.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/flags/fr_FR.png"))); // NOI18N French.setText(bundle1.getString("french")); // NOI18N French.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { FrenchActionPerformed(evt); } }); LanguageMenu.add(French); German.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/flags/de_DE.png"))); // NOI18N German.setText(bundle1.getString("german")); // NOI18N German.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { GermanActionPerformed(evt); } }); LanguageMenu.add(German); Lithuanian.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/flags/lt_LT.png"))); // NOI18N Lithuanian.setText(bundle1.getString("lithuanian")); // NOI18N Lithuanian.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { LithuanianActionPerformed(evt); } }); LanguageMenu.add(Lithuanian); Spanish.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/flags/es_ES.png"))); // NOI18N Spanish.setText(bundle1.getString("spanish")); // NOI18N Spanish.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { SpanishActionPerformed(evt); } }); LanguageMenu.add(Spanish); Catalan.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/flags/es_CA.png"))); // NOI18N Catalan.setText(bundle1.getString("catalan")); // NOI18N Catalan.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { CatalanActionPerformed(evt); } }); LanguageMenu.add(Catalan); Portuguese.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/flags/pt_PT.png"))); // NOI18N Portuguese.setText(bundle1.getString("portuguese")); // NOI18N Portuguese.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { PortugueseActionPerformed(evt); } }); LanguageMenu.add(Portuguese); PortugueseBR.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/flags/pt_BR.png"))); // NOI18N PortugueseBR.setText(bundle1.getString("portuguesebr")); // NOI18N PortugueseBR.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { PortugueseBRActionPerformed(evt); } }); LanguageMenu.add(PortugueseBR); Japanese.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/flags/jp_JP.png"))); // NOI18N Japanese.setText(bundle1.getString("japanese")); // NOI18N Japanese.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { JapaneseActionPerformed(evt); } }); LanguageMenu.add(Japanese); Russian.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/flags/ru_RU.png"))); // NOI18N Russian.setText(bundle1.getString("russian")); // NOI18N Russian.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { RussianActionPerformed(evt); } }); LanguageMenu.add(Russian); Polish.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/flags/pl_PL.png"))); // NOI18N Polish.setText(bundle1.getString("polish")); // NOI18N Polish.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { PolishActionPerformed(evt); } }); LanguageMenu.add(Polish); ChinesePRC.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/flags/cn_CN.png"))); // NOI18N ChinesePRC.setText(bundle1.getString("simplifiedChinese")); // NOI18N ChinesePRC.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ChinesePRCActionPerformed(evt); } }); LanguageMenu.add(ChinesePRC); ChineseTW.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/flags/tw_TW.png"))); // NOI18N ChineseTW.setText(bundle1.getString("traditionalChinese")); // NOI18N ChineseTW.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ChineseTWActionPerformed(evt); } }); LanguageMenu.add(ChineseTW); Italian.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/flags/it_IT.png"))); // NOI18N Italian.setText(bundle1.getString("italian")); // NOI18N Italian.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ItalianActionPerformed(evt); } }); LanguageMenu.add(Italian); Greek.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/flags/gr_EL.png"))); // NOI18N Greek.setText(bundle1.getString("greek")); // NOI18N Greek.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { GreekActionPerformed(evt); } }); LanguageMenu.add(Greek); MenuBar.add(LanguageMenu); PluginsMenu.setText(bundle.getString("MainGUI.PluginsMenu.text")); // NOI18N xbrzCheck.setSelected(Settings.getInstance().readBool("emu.plugins.xbrz")); xbrzCheck.setText(bundle.getString("MainGUI.xbrzCheck.text")); // NOI18N xbrzCheck.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { xbrzCheckActionPerformed(evt); } }); PluginsMenu.add(xbrzCheck); MenuBar.add(PluginsMenu); HelpMenu.setText(bundle.getString("MainGUI.HelpMenu.text")); // NOI18N About.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F1, 0)); About.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/AboutIcon.png"))); // NOI18N About.setText(bundle.getString("MainGUI.About.text")); // NOI18N About.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { AboutActionPerformed(evt); } }); HelpMenu.add(About); MenuBar.add(HelpMenu); setJMenuBar(MenuBar); pack(); }// </editor-fold>//GEN-END:initComponents private void createComponents() { initComponents(); if (useFullscreen) { // Hide the menu bar and the toolbar in full screen mode MenuBar.setVisible(false); mainToolBar.setVisible(false); getContentPane().remove(mainToolBar); fillerLeft = new JLabel(); fillerRight = new JLabel(); fillerTop = new JLabel(); fillerBottom = new JLabel(); fillerLeft.setBackground(Color.BLACK); fillerRight.setBackground(Color.BLACK); fillerTop.setBackground(Color.BLACK); fillerBottom.setBackground(Color.BLACK); fillerLeft.setOpaque(true); fillerRight.setOpaque(true); fillerTop.setOpaque(true); fillerBottom.setOpaque(true); getContentPane().add(fillerLeft, BorderLayout.LINE_START); getContentPane().add(fillerRight, BorderLayout.LINE_END); getContentPane().add(fillerTop, BorderLayout.NORTH); getContentPane().add(fillerBottom, BorderLayout.SOUTH); makeFullScreenMenu(); } else { float viewportResizeScaleFactor = Modules.sceDisplayModule.getViewportResizeScaleFactor(); if (viewportResizeScaleFactor <= 1.5f) { oneTimeResize.setSelected(true); } else if (viewportResizeScaleFactor <= 2.5f) { twoTimesResize.setSelected(true); } else { threeTimesResize.setSelected(true); } } populateRecentMenu(); } private void changeLanguage(String language) { Settings.getInstance().writeString("emu.language", language); JpcspDialogManager.showInformation(this, "Language change will take effect after application restart."); } /** * Create a popup menu for use in full screen mode. In full screen mode, the * menu bar and the toolbar are not displayed. To keep a consistent user * interface, the popup menu is composed of the entries from the toolbar and * from the menu bar. * * Accelerators do not work natively as the popup menu must have focus for * them to work. Therefore the accelerators are copied and handled in the * KeyListener related code of MainGUI for fullscreen mode. */ private void makeFullScreenMenu() { fullScreenMenu = new JPopupMenu(); JMenuItem popupMenuItemRun = new JMenuItem(java.util.ResourceBundle.getBundle("jpcsp/languages/jpcsp").getString("MainGUI.RunButton.text")); popupMenuItemRun.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/PlayIcon.png"))); popupMenuItemRun.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(ActionEvent e) { RunButtonActionPerformed(e); } }); JMenuItem popupMenuItemPause = new JMenuItem(java.util.ResourceBundle.getBundle("jpcsp/languages/jpcsp").getString("MainGUI.PauseButton.text")); popupMenuItemPause.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/PauseIcon.png"))); popupMenuItemPause.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(ActionEvent e) { PauseButtonActionPerformed(e); } }); JMenuItem popupMenuItemReset = new JMenuItem(java.util.ResourceBundle.getBundle("jpcsp/languages/jpcsp").getString("MainGUI.ResetButton.text")); popupMenuItemReset.setIcon(new javax.swing.ImageIcon(getClass().getResource("/jpcsp/icons/StopIcon.png"))); popupMenuItemReset.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(ActionEvent e) { ResetButtonActionPerformed(e); } }); fullScreenMenu.add(popupMenuItemRun); fullScreenMenu.add(popupMenuItemPause); fullScreenMenu.add(popupMenuItemReset); fullScreenMenu.addSeparator(); // add all the menu entries from the MenuBar to the full screen menu while (MenuBar.getMenuCount() > 0) { fullScreenMenu.add(MenuBar.getMenu(0)); } // move the 'Exit' menu item from the 'File' menu // to the end of the full screen menu for convenience fullScreenMenu.addSeparator(); fullScreenMenu.add(ExitEmu); // the 'Resize' menu is not relevant in full screen mode VideoOpt.remove(ResizeMenu); // copy accelerators to actionListenerMap to have them handled in // MainGUI using the keyPressed event globalAccelFromMenu(fullScreenMenu); } /** * Add accelerators to the global action map of MainGUI. * * This function will traverse a MenuElement tree to find all JMenuItems and * to add accelerators if available for the given menu item. * * The element tree is traversed in a recursive manner. * * @param me The root menu element to start. */ private void globalAccelFromMenu(MenuElement me) { for (MenuElement element : me.getSubElements()) { // check for JMenu before JMenuItem, as JMenuItem is derived from JMenu if ((element instanceof JPopupMenu) || (element instanceof JMenu)) { // recursively do the same for underlying menus globalAccelFromMenu(element); } else if (element instanceof JMenuItem) { JMenuItem item = (JMenuItem) element; // only check if the accelerator exists (i.e. is not null) // if no ActionListeners exist, an empty array is returned if (item.getAccelerator() != null) { actionListenerMap.put(item.getAccelerator(), item.getActionListeners()); } } } } public static Dimension getFullScreenDimension() { DisplayMode displayMode; if (Emulator.getMainGUI().getDisplayMode() != null) { displayMode = Emulator.getMainGUI().getDisplayMode(); } else { displayMode = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDisplayMode(); } return new Dimension(displayMode.getWidth(), displayMode.getHeight()); // return GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds().getSize(); } @Override public void startWindowDialog(Window window) { GraphicsDevice localDevice = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); if (localDevice.getFullScreenWindow() != null) { localDevice.setFullScreenWindow(null); } window.setVisible(true); } @Override public void startBackgroundWindowDialog(Window window) { startWindowDialog(window); requestFocus(); Modules.sceDisplayModule.getCanvas().requestFocusInWindow(); } @Override public void endWindowDialog() { if (displayMode != null) { GraphicsDevice localDevice = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); if (localDevice.getFullScreenWindow() == null) { localDevice.setFullScreenWindow(this); setDisplayMode(); } if (useFullscreen) { setFullScreenDisplaySize(); } } } private void changeScreenResolution(int width, int height) { // Find the matching display mode with the preferred refresh rate // (or the highest refresh rate if the preferred refresh rate is not found). GraphicsDevice localDevice = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); DisplayMode[] displayModes = localDevice.getDisplayModes(); DisplayMode bestDisplayMode = null; for (int i = 0; displayModes != null && i < displayModes.length; i++) { DisplayMode dispMode = displayModes[i]; if (dispMode.getWidth() == width && dispMode.getHeight() == height && dispMode.getBitDepth() == displayModeBitDepth) { if (bestDisplayMode == null || (bestDisplayMode.getRefreshRate() < dispMode.getRefreshRate() && bestDisplayMode.getRefreshRate() != preferredDisplayModeRefreshRate)) { bestDisplayMode = dispMode; } } } if (bestDisplayMode != null) { changeScreenResolution(bestDisplayMode); } } private void setDisplayMode() { if (displayMode != null) { GraphicsDevice localDevice = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); localDevice.setDisplayMode(displayMode); if (setLocationThread == null) { // Set up a thread calling setLocation() at regular intervals. // It seems that the window location is sometimes lost when // changing the DisplayMode. setLocationThread = new SetLocationThread(); setLocationThread.setName("Set MainGUI Location Thread"); setLocationThread.setDaemon(true); setLocationThread.start(); } } } @Override public void setLocation() { if (displayMode != null && useFullscreen) { // FIXME When running in non-native resolution, the window is not displaying // if it is completely visible. It is only displaying if part of it is // hidden (e.g. outside screen borders). // This seems to be a Java bug. // Hack here is to move the window 1 pixel outside the screen so that // it gets displayed. if (fillerTop == null || fillerTop.getHeight() == 0) { if (getLocation().y != -1) { setLocation(0, -1); } } else if (fillerLeft.getWidth() == 0) { if (getLocation().x != -1) { setLocation(-1, 0); } } } } @Override public void setFullScreenDisplaySize() { Dimension size = new Dimension(sceDisplay.getResizedWidth(Screen.width), sceDisplay.getResizedHeight(Screen.height)); setFullScreenDisplaySize(size); } private void setFullScreenDisplaySize(Dimension size) { Dimension fullScreenSize = getFullScreenDimension(); setLocation(); if (size.width < fullScreenSize.width) { fillerLeft.setSize((fullScreenSize.width - size.width) / 2, fullScreenSize.height); fillerRight.setSize(fullScreenSize.width - size.width - fillerLeft.getWidth(), fullScreenSize.height); } else { fillerLeft.setSize(0, 0); fillerRight.setSize(1, fullScreenSize.height); setSize(fullScreenSize.width + 1, fullScreenSize.height); setPreferredSize(getSize()); } if (size.height < fullScreenSize.height) { fillerTop.setSize(fullScreenSize.width, (fullScreenSize.height - size.height) / 2); fillerBottom.setSize(fullScreenSize.width, fullScreenSize.height - size.height - fillerTop.getHeight()); } else { fillerTop.setSize(0, 0); fillerBottom.setSize(fullScreenSize.width, 1); setSize(fullScreenSize.width, fullScreenSize.height + 1); setPreferredSize(getSize()); } fillerLeft.setPreferredSize(fillerLeft.getSize()); fillerRight.setPreferredSize(fillerRight.getSize()); fillerTop.setPreferredSize(fillerTop.getSize()); fillerBottom.setPreferredSize(fillerBottom.getSize()); } private void changeScreenResolution(DisplayMode displayMode) { GraphicsDevice localDevice = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); if (localDevice.isFullScreenSupported()) { this.displayMode = displayMode; localDevice.setFullScreenWindow(this); setDisplayMode(); if (useFullscreen) { setSize(getFullScreenDimension()); setPreferredSize(getFullScreenDimension()); setLocation(); } if (log.isInfoEnabled()) { log.info(String.format("Changing resolution to %dx%d, %d bits, %d Hz", displayMode.getWidth(), displayMode.getHeight(), displayMode.getBitDepth(), displayMode.getRefreshRate())); } } } public LogWindow getConsoleWindow() { return State.logWindow; } private void populateRecentMenu() { RecentMenu.removeAll(); recentUMD.clear(); recentFile.clear(); Settings.getInstance().readRecent("umd", recentUMD); Settings.getInstance().readRecent("file", recentFile); for (RecentElement umd : recentUMD) { JMenuItem item = new JMenuItem(umd.toString()); item.addActionListener(new RecentElementActionListener(this, RecentElementActionListener.TYPE_UMD, umd.path)); RecentMenu.add(item); } if (!recentUMD.isEmpty() && !recentFile.isEmpty()) { RecentMenu.addSeparator(); } for (RecentElement file : recentFile) { JMenuItem item = new JMenuItem(file.toString()); item.addActionListener(new RecentElementActionListener(this, RecentElementActionListener.TYPE_FILE, file.path)); RecentMenu.add(item); } } private void EnterDebuggerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_EnterDebuggerActionPerformed if (State.debugger == null) { State.debugger = new DisassemblerFrame(emulator); } else { State.debugger.RefreshDebugger(false); } startWindowDialog(State.debugger); }//GEN-LAST:event_EnterDebuggerActionPerformed private void RunButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_RunButtonActionPerformed run(); }//GEN-LAST:event_RunButtonActionPerformed private JFileChooser makeJFileChooser() { final JFileChooser fc = new JFileChooser(); fc.setDialogTitle(java.util.ResourceBundle.getBundle("jpcsp/languages/jpcsp").getString("MainGUI.strOpenELFPBP.text")); fc.setCurrentDirectory(new java.io.File(".")); return fc; } private void OpenFileActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_OpenFileActionPerformed PauseEmu(); final JFileChooser fc = makeJFileChooser(); String lastOpenedFolder = Settings.getInstance().readString("gui.lastOpenedFileFolder"); if (lastOpenedFolder != null) { fc.setCurrentDirectory(new File(lastOpenedFolder)); } int returnVal = fc.showOpenDialog(this); if (userChooseSomething(returnVal)) { Settings.getInstance().writeString("gui.lastOpenedFileFolder", fc.getSelectedFile().getParent()); File file = fc.getSelectedFile(); switch (FileUtil.getExtension(file)) { case "iso": case "cso": loadUMD(file); break; default: loadFile(file); break; } } }//GEN-LAST:event_OpenFileActionPerformed private String pspifyFilename(String pcfilename) { // Files relative to ms0 directory if (pcfilename.startsWith("ms0")) { return "ms0:" + pcfilename.substring(3).replaceAll("\\\\", "/").toUpperCase(); } // Files with absolute path but also in ms0 directory try { String ms0path = new File("ms0").getCanonicalPath(); if (pcfilename.startsWith(ms0path)) { // Strip off absolute prefix return "ms0:" + pcfilename.substring(ms0path.length()).replaceAll("\\\\", "/"); } } catch (Exception e) { // Required by File.getCanonicalPath e.printStackTrace(); } // Files anywhere on user's hard drive, may not work // use host0:/ ? return pcfilename.replaceAll("\\\\", "/"); } public void loadFile(File file) { loadFile(file, false); } public void loadFile(File file, boolean isInternal) { java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("jpcsp/languages/jpcsp"); // NOI18N Model.setModel(Settings.getInstance().readInt("emu.model")); //This is where a real application would open the file. try { if (State.logWindow != null) { State.logWindow.clearScreenMessages(); } log.info(MetaInformation.FULL_NAME); umdLoaded = false; loadedFile = file; // Create a read-only memory-mapped file RandomAccessFile raf = new RandomAccessFile(file, "r"); ByteBuffer readbuffer; FileChannel roChannel = null; long size = raf.length(); // Do not try to map very large files, this would raise on OutOfMemory exception. if (size > 1 * 1024 * 1024) { byte[] bytes = new byte[(int) size]; int offset = 0; // Read large files by chunks. while (offset < bytes.length) { int len = raf.read(bytes, offset, Math.min(10 * 1024, bytes.length - offset)); if (len < 0) { break; } if (len > 0) { offset += len; } } readbuffer = ByteBuffer.wrap(bytes, 0, offset); } else { roChannel = raf.getChannel(); readbuffer = roChannel.map(FileChannel.MapMode.READ_ONLY, 0, (int) roChannel.size()); } SceModule module = emulator.load(pspifyFilename(file.getPath()), readbuffer); if (roChannel != null) { roChannel.close(); } raf.close(); boolean isHomebrew; if (isInternal) { isHomebrew = false; } else { PSF psf = module.psf; String title; String discId = State.DISCID_UNKNOWN_FILE; if (psf != null) { title = psf.getPrintableString("TITLE"); discId = psf.getString("DISC_ID"); if (discId == null) { discId = State.DISCID_UNKNOWN_FILE; } isHomebrew = psf.isLikelyHomebrew(); } else { title = file.getParentFile().getName(); isHomebrew = true; // missing psf, assume homebrew } setTitle(MetaInformation.FULL_NAME + " - " + title); addRecentFile(file, title); RuntimeContext.setIsHomebrew(isHomebrew); State.discId = discId; State.title = title; } // Strip off absolute file path if the file is inside our ms0 directory String filepath = file.getParent(); String ms0path = new File("ms0").getCanonicalPath(); if (filepath.startsWith(ms0path)) { filepath = filepath.substring(ms0path.length() - 3); // path must start with "ms0" } Modules.IoFileMgrForUserModule.setfilepath(filepath); Modules.IoFileMgrForUserModule.setIsoReader(null); jpcsp.HLE.Modules.sceUmdUserModule.setIsoReader(null); if (!isHomebrew && !isInternal) { Settings.getInstance().loadPatchSettings(); } if (!runFromVsh) { logStart(); } if (instructioncounter != null) { instructioncounter.RefreshWindow(); } StepLogger.clear(); StepLogger.setName(file.getPath()); } catch (GeneralJpcspException e) { JpcspDialogManager.showError(this, bundle.getString("MainGUI.strGeneralError.text") + ": " + e.getLocalizedMessage()); } catch (IOException e) { if (file.getName().contains("iso") || file.getName().contains("cso")) { JpcspDialogManager.showError(this, bundle.getString("MainGUI.strCriticalError.text") + ": " + bundle.getString("MainGUI.strWrongLoader.text")); } else { e.printStackTrace(); JpcspDialogManager.showError(this, bundle.getString("ioError") + ": " + e.getLocalizedMessage()); } } catch (Exception ex) { ex.printStackTrace(); if (ex.getMessage() != null) { JpcspDialogManager.showError(this, bundle.getString("MainGUI.strCriticalError.text") + ": " + ex.getLocalizedMessage()); } else { JpcspDialogManager.showError(this, bundle.getString("MainGUI.strCriticalError.text") + ": " + bundle.getString("MainGUI.strCheckConsole.text")); } } RefreshUI(); } private void addRecentFile(File file, String title) { String s = file.getPath(); for (int i = 0; i < recentFile.size(); ++i) { if (recentFile.get(i).path.equals(s)) { recentFile.remove(i--); } } recentFile.add(0, new RecentElement(s, title)); while (recentFile.size() > MAX_RECENT) { recentFile.remove(MAX_RECENT); } Settings.getInstance().writeRecent("file", recentFile); populateRecentMenu(); } private void removeRecentFile(String file) { // use Iterator to safely remove elements while traversing Iterator<RecentElement> it = recentFile.iterator(); while (it.hasNext()) { RecentElement re = it.next(); if (re.path.equals(file)) { it.remove(); } } Settings.getInstance().writeRecent("file", recentFile); populateRecentMenu(); } private void addRecentUMD(File file, String title) { if (file == null) { return; } try { String s = file.getCanonicalPath(); for (int i = 0; i < recentUMD.size(); ++i) { if (recentUMD.get(i).path.equals(s)) { recentUMD.remove(i--); } } recentUMD.add(0, new RecentElement(s, title)); while (recentUMD.size() > MAX_RECENT) { recentUMD.remove(MAX_RECENT); } Settings.getInstance().writeRecent("umd", recentUMD); populateRecentMenu(); } catch (IOException e) { e.printStackTrace(); } } private void removeRecentUMD(String file) { // use Iterator to safely remove elements while traversing Iterator<RecentElement> it = recentUMD.iterator(); while (it.hasNext()) { RecentElement re = it.next(); if (re.path.equals(file)) { it.remove(); } } Settings.getInstance().writeRecent("umd", recentUMD); populateRecentMenu(); } private void PauseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_PauseButtonActionPerformed pause(); }//GEN-LAST:event_PauseButtonActionPerformed private void ElfHeaderViewerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ElfHeaderViewerActionPerformed if (State.elfHeader == null) { State.elfHeader = new ElfHeaderInfo(); } else { State.elfHeader.RefreshWindow(); } startWindowDialog(State.elfHeader); }//GEN-LAST:event_ElfHeaderViewerActionPerformed private void EnterMemoryViewerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_EnterMemoryViewerActionPerformed if (State.memoryViewer == null) { State.memoryViewer = new MemoryViewer(); } else { State.memoryViewer.RefreshMemory(); } startWindowDialog(State.memoryViewer); }//GEN-LAST:event_EnterMemoryViewerActionPerformed private void EnterImageViewerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_EnterImageViewerActionPerformed if (State.imageViewer == null) { State.imageViewer = new ImageViewer(); } else { State.imageViewer.RefreshImage(); } startWindowDialog(State.imageViewer); }//GEN-LAST:event_EnterImageViewerActionPerformed private void AboutActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_AboutActionPerformed StringBuilder message = new StringBuilder(); message .append("<html>") .append("<h2>") .append(MetaInformation.FULL_NAME) .append("</h2>") .append("<hr/>") .append("Official site : <a href='") .append(MetaInformation.OFFICIAL_SITE) .append("'>") .append(MetaInformation.OFFICIAL_SITE) .append("</a><br/>") .append("Official forum : <a href='") .append(MetaInformation.OFFICIAL_FORUM) .append("'>") .append(MetaInformation.OFFICIAL_FORUM) .append("</a><br/>") .append("Official repository: <a href='") .append(MetaInformation.OFFICIAL_REPOSITORY) .append("'>") .append(MetaInformation.OFFICIAL_REPOSITORY) .append("</a><br/>") .append("<hr/>") .append("<i>Team:</i> <font color='gray'>") .append(MetaInformation.TEAM) .append("</font>") .append("</html>"); JOptionPane.showMessageDialog(this, message.toString(), MetaInformation.FULL_NAME, JOptionPane.INFORMATION_MESSAGE); }//GEN-LAST:event_AboutActionPerformed private void ConfigMenuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ConfigMenuActionPerformed if (State.settingsGUI == null) { State.settingsGUI = new SettingsGUI(); } else { State.settingsGUI.RefreshWindow(); } startWindowDialog(State.settingsGUI); }//GEN-LAST:event_ConfigMenuActionPerformed private void ExitEmuActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ExitEmuActionPerformed exitEmu(); }//GEN-LAST:event_ExitEmuActionPerformed private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing // this is only needed for the main screen, as it can be closed without // being deactivated first WindowPropSaver.saveWindowProperties(this); exitEmu(); }//GEN-LAST:event_formWindowClosing private void openUmdActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openUmdActionPerformed if (!runFromVsh) { PauseEmu(); } if (Settings.getInstance().readBool("emu.umdbrowser")) { umdbrowser = new UmdBrowser(this, getUmdPaths(false)); umdbrowser.setVisible(true); } else { final JFileChooser fc = makeJFileChooser(); String lastOpenedFolder = Settings.getInstance().readString("gui.lastOpenedUmdFolder"); if (lastOpenedFolder != null) { fc.setCurrentDirectory(new File(lastOpenedFolder)); } fc.setDialogTitle(java.util.ResourceBundle.getBundle("jpcsp/languages/jpcsp").getString("MainGUI.strOpenUMD.text")); int returnVal = fc.showOpenDialog(this); if (userChooseSomething(returnVal)) { Settings.getInstance().writeString("gui.lastOpenedUmdFolder", fc.getSelectedFile().getParent()); File file = fc.getSelectedFile(); loadAndRunUMD(file); } } }//GEN-LAST:event_openUmdActionPerformed private void switchUmdActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_switchUmdActionPerformed if (Settings.getInstance().readBool("emu.umdbrowser")) { umdbrowser = new UmdBrowser(this, getUmdPaths(false)); umdbrowser.setSwitchingUmd(true); umdbrowser.setVisible(true); } else { final JFileChooser fc = makeJFileChooser(); String lastOpenedFolder = Settings.getInstance().readString("gui.lastOpenedUmdFolder"); if (lastOpenedFolder != null) { fc.setCurrentDirectory(new File(lastOpenedFolder)); } fc.setDialogTitle(java.util.ResourceBundle.getBundle("jpcsp/languages/jpcsp").getString("MainGUI.switchUMD.text")); int returnVal = fc.showOpenDialog(this); if (userChooseSomething(returnVal)) { Settings.getInstance().writeString("gui.lastOpenedUmdFolder", fc.getSelectedFile().getParent()); File file = fc.getSelectedFile(); switchUMD(file); } } }//GEN-LAST:event_switchUmdActionPerformed private void ejectMsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ejectMsActionPerformed if (MemoryStick.isInserted()) { Modules.IoFileMgrForUserModule.hleEjectMemoryStick(); } else { Modules.IoFileMgrForUserModule.hleInsertMemoryStick(); } }//GEN-LAST:event_ejectMsActionPerformed @Override public void onMemoryStickChange() { ResourceBundle bundle = ResourceBundle.getBundle("jpcsp/languages/jpcsp"); if (MemoryStick.isInserted()) { ejectMs.setText(bundle.getString("MainGUI.ejectMs.text")); } else { ejectMs.setText(bundle.getString("MainGUI.insertMs.text")); } } public void RefreshUI() { ExportISOFile.setEnabled(umdLoaded); DumpIso.setEnabled(umdLoaded); } /** * Don't call this directly, see loadUMD(File file) */ private boolean loadUMD(UmdIsoReader iso, String bootPath) throws IOException { boolean success = false; try { UmdIsoFile bootBin = iso.getFile(bootPath); if (bootBin.length() != 0) { byte[] bootfile = new byte[(int) bootBin.length()]; bootBin.read(bootfile); ByteBuffer buf = ByteBuffer.wrap(bootfile); emulator.load("disc0:/" + bootPath, buf); success = true; } } catch (FileNotFoundException e) { System.out.println(e.getMessage()); } catch (GeneralJpcspException e) { } return success; } /** * Don't call this directly, see loadUMD(File file) */ private boolean loadUnpackedUMD(String filename) throws IOException, GeneralJpcspException { if (doUmdBuffering) { return false; } // Load unpacked BOOT.BIN as if it came from the umd File file = new File(filename); if (file.exists()) { RandomAccessFile raf = new RandomAccessFile(file, "r"); FileChannel roChannel = raf.getChannel(); ByteBuffer readbuffer = roChannel.map(FileChannel.MapMode.READ_ONLY, 0, (int) roChannel.size()); emulator.load("disc0:/PSP_GAME/SYSDIR/EBOOT.BIN", readbuffer); raf.close(); log.info("Using unpacked UMD EBOOT.BIN image"); return true; } return false; } public void loadAndRunUMD(File file) { loadUMD(file); if (!runFromVsh) { loadAndRun(); } } public void loadUMD(File file) { String filePath = file == null ? null : file.getPath(); UmdIsoReader.setDoIsoBuffering(doUmdBuffering); Model.setModel(Settings.getInstance().readInt("emu.model")); UmdIsoReader iso = null; boolean closeIso = false; try { iso = new UmdIsoReader(filePath); logStartIso(iso); if (runFromVsh) { Modules.sceUmdUserModule.hleUmdSwitch(iso); } else { closeIso = true; if (iso.hasFile("PSP_GAME/param.sfo")) { loadUMDGame(file); } else if (iso.hasFile("UMD_VIDEO/param.sfo")) { loadUMDVideo(file); } else if (iso.hasFile("UMD_AUDIO/param.sfo")) { loadUMDAudio(file); } else { // EBOOT.PBP contains an ELF file? byte[] pspData = iso.readPspData(); if (pspData != null) { loadFile(file); } } } } catch (IOException e) { // Ignore exception } finally { if (closeIso) { try { iso.close(); } catch (IOException e) { // Ignore exception } } } RefreshUI(); } public void switchUMD(File file) { try { // Raising an exception here means the ISO/CSO is not a PSP_GAME. UmdIsoReader iso = new UmdIsoReader(file.getPath()); iso.getFile("PSP_GAME/param.sfo"); log.info(String.format("Switching to the UMD %s", file)); Modules.sceUmdUserModule.hleUmdSwitch(iso); } catch (FileNotFoundException e) { // Ignore. } catch (IOException ioe) { // Ignore. } } public void loadUMDGame(File file) { java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("jpcsp/languages/jpcsp"); // NOI18N String filePath = file == null ? null : file.getPath(); try { if (State.logWindow != null) { State.logWindow.clearScreenMessages(); } logStart(); Modules.SysMemUserForUserModule.reset(); log.info(MetaInformation.FULL_NAME); umdLoaded = true; loadedFile = file; UmdIsoReader iso = new UmdIsoReader(filePath); UmdIsoFile psfFile = iso.getFile("PSP_GAME/param.sfo"); PSF psf = new PSF(); byte[] data = new byte[(int) psfFile.length()]; psfFile.read(data); psf.read(ByteBuffer.wrap(data)); String title = psf.getPrintableString("TITLE"); String discId = psf.getString("DISC_ID"); String titleFormat = "%s - %s"; if (discId == null) { discId = State.DISCID_UNKNOWN_UMD; } else { titleFormat += " [%s]"; } setTitle(String.format(titleFormat, MetaInformation.FULL_NAME, title, discId)); addRecentUMD(file, title); if (psf.isLikelyHomebrew()) { emulator.setFirmwareVersion(Loader.FIRMWAREVERSION_HOMEBREW); } else { emulator.setFirmwareVersion(psf.getString("PSP_SYSTEM_VER")); } RuntimeContext.setIsHomebrew(psf.isLikelyHomebrew()); State.discId = discId; State.umdId = null; try { UmdIsoFile umdDataBin = iso.getFile("UMD_DATA.BIN"); if (umdDataBin != null) { byte[] buffer = new byte[(int) umdDataBin.length()]; umdDataBin.readFully(buffer); umdDataBin.close(); String umdDataBinContent = new String(buffer).replace((char) 0, ' '); String[] parts = umdDataBinContent.split("\\|"); if (parts != null && parts.length >= 2) { State.umdId = parts[1]; } } } catch (FileNotFoundException e) { // Ignore exception } Settings.getInstance().loadPatchSettings(); // Set the memory model 32MB/64MB before loading the EBOOT.BIN int memorySize = Settings.getInstance().readInt("memorySize", 0); if (memorySize > 0) { log.info(String.format("Using memory size 0x%X from settings for %s", memorySize, State.discId)); Modules.SysMemUserForUserModule.setMemorySize(memorySize); } else { boolean hasMemory64MB = psf.getNumeric("MEMSIZE") == 1; if (Settings.getInstance().readBool("memory64MB")) { log.info(String.format("Using 64MB memory from settings for %s", State.discId)); hasMemory64MB = true; } Modules.SysMemUserForUserModule.setMemory64MB(hasMemory64MB); } if ((!discId.equals(State.DISCID_UNKNOWN_UMD) && loadUnpackedUMD(discId + ".BIN")) || // Try to load a previously decrypted EBOOT.BIN (faster) (!discId.equals(State.DISCID_UNKNOWN_UMD) && loadUnpackedUMD(Settings.getInstance().getDiscTmpDirectory() + "EBOOT.BIN")) || // Try to load the EBOOT.BIN (before the BOOT.BIN, same games have an invalid BOOT.BIN but a valid EBOOT.BIN) loadUMD(iso, "PSP_GAME/SYSDIR/EBOOT.OLD") || loadUMD(iso, "PSP_GAME/SYSDIR/EBOOT.BIN") || // As the last chance, try to load the BOOT.BIN loadUMD(iso, "PSP_GAME/SYSDIR/BOOT.BIN")) { State.title = title; Modules.IoFileMgrForUserModule.setfilepath("disc0/"); Modules.IoFileMgrForUserModule.setIsoReader(iso); Modules.sceUmdUserModule.setIsoReader(iso); if (instructioncounter != null) { instructioncounter.RefreshWindow(); } StepLogger.clear(); if (filePath != null) { StepLogger.setName(filePath); } } else { State.discId = State.DISCID_UNKNOWN_NOTHING_LOADED; throw new GeneralJpcspException(bundle.getString("MainGUI.strEncryptedBoot.text")); } } catch (GeneralJpcspException e) { JpcspDialogManager.showError(this, e.getLocalizedMessage()); } catch (IOException e) { e.printStackTrace(); JpcspDialogManager.showError(this, bundle.getString("MainGUI.strIOError.text") + " : " + e.getLocalizedMessage()); } catch (Exception ex) { ex.printStackTrace(); if (ex.getMessage() != null) { JpcspDialogManager.showError(this, bundle.getString("MainGUI.strCriticalError.text") + " : " + ex.getLocalizedMessage()); } else { JpcspDialogManager.showError(this, bundle.getString("MainGUI.strCriticalError.text") + " : " + bundle.getString("MainGUI.strCheckConsole.text")); } } } public void loadUMDVideo(File file) { java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("jpcsp/languages/jpcsp"); // NOI18N String filePath = file == null ? null : file.getPath(); try { if (State.logWindow != null) { State.logWindow.clearScreenMessages(); } logStart(); Modules.SysMemUserForUserModule.reset(); log.info(MetaInformation.FULL_NAME); umdLoaded = true; loadedFile = file; UmdIsoReader iso = new UmdIsoReader(filePath); UmdIsoFile psfFile = iso.getFile("UMD_VIDEO/param.sfo"); UmdIsoFile umdDataFile = iso.getFile("UMD_DATA.BIN"); PSF psf = new PSF(); byte[] data = new byte[(int) psfFile.length()]; psfFile.read(data); psf.read(ByteBuffer.wrap(data)); String title = psf.getPrintableString("TITLE"); String discId = psf.getString("DISC_ID"); if (discId == null) { byte[] umdDataId = new byte[10]; String umdDataIdString; umdDataFile.readFully(umdDataId, 0, 9); umdDataIdString = new String(umdDataId); if (umdDataIdString.equals("")) { discId = State.DISCID_UNKNOWN_UMD; } else { discId = umdDataIdString; } } setTitle(MetaInformation.FULL_NAME + " - " + title); addRecentUMD(file, title); emulator.setFirmwareVersion(psf.getString("PSP_SYSTEM_VER")); RuntimeContext.setIsHomebrew(false); Modules.SysMemUserForUserModule.setMemory64MB(psf.getNumeric("MEMSIZE") == 1); State.discId = discId; State.title = title; umdvideoplayer = new UmdVideoPlayer(this, iso); Modules.IoFileMgrForUserModule.setfilepath("disc0/"); Modules.IoFileMgrForUserModule.setIsoReader(iso); } catch (Exception ex) { ex.printStackTrace(); if (ex.getMessage() != null) { JpcspDialogManager.showError(this, bundle.getString("MainGUI.strCriticalError.text") + ": " + ex.getLocalizedMessage()); } else { JpcspDialogManager.showError(this, bundle.getString("MainGUI.strCriticalError.text") + ": " + bundle.getString("MainGUI.strCheckConsole.text")); } } } public void loadUMDAudio(File file) { java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("jpcsp/languages/jpcsp"); // NOI18N try { if (State.logWindow != null) { State.logWindow.clearScreenMessages(); } logStart(); Modules.SysMemUserForUserModule.reset(); log.info(MetaInformation.FULL_NAME); umdLoaded = true; loadedFile = file; UmdIsoReader iso = new UmdIsoReader(file.getPath()); UmdIsoFile psfFile = iso.getFile("UMD_AUDIO/param.sfo"); PSF psf = new PSF(); byte[] data = new byte[(int) psfFile.length()]; psfFile.read(data); psf.read(ByteBuffer.wrap(data)); String title = psf.getPrintableString("TITLE"); String discId = psf.getString("DISC_ID"); if (discId == null) { discId = State.DISCID_UNKNOWN_UMD; } setTitle(MetaInformation.FULL_NAME + " - " + title); addRecentUMD(file, title); emulator.setFirmwareVersion(psf.getString("PSP_SYSTEM_VER")); RuntimeContext.setIsHomebrew(false); Modules.SysMemUserForUserModule.setMemory64MB(psf.getNumeric("MEMSIZE") == 1); State.discId = discId; State.title = title; } catch (IllegalArgumentException iae) { // Ignore... } catch (Exception ex) { ex.printStackTrace(); if (ex.getMessage() != null) { JpcspDialogManager.showError(this, bundle.getString("MainGUI.strCriticalError.text") + ": " + ex.getLocalizedMessage()); } else { JpcspDialogManager.showError(this, bundle.getString("MainGUI.strCriticalError.text") + ": " + bundle.getString("MainGUI.strCheckConsole.text")); } } } private void logConfigurationSetting(String resourceKey, String settingKey, String value, boolean textLeft, boolean square) { boolean isSettingFromPatch = settingKey == null ? false : Settings.getInstance().isOptionFromPatch(settingKey); String format; if (isSettingFromPatch) { format = textLeft ? logConfigurationSettingLeftPatch : logConfigurationSettingRightPatch; } else { format = textLeft ? logConfigurationSettingLeft : logConfigurationSettingRight; } String text = resourceKey; try { java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("jpcsp/languages/jpcsp", new Locale("en")); text = bundle.getString(resourceKey); } catch (MissingResourceException mre) { // do nothing } log.info(String.format(format, text, value, square ? '[' : '(', square ? ']' : ')', "from patch file")); } private void logConfigurationSettingBool(String resourceKey, boolean value, boolean textLeft, boolean square) { logConfigurationSetting(resourceKey, null, value ? "X" : " ", textLeft, square); } private void logConfigurationSettingBool(String resourceKey, String settingKey, boolean textLeft, boolean square) { boolean value = Settings.getInstance().readBool(settingKey); logConfigurationSetting(resourceKey, settingKey, value ? "X" : " ", textLeft, square); } private void logConfigurationSettingInt(String resourceKey, String settingKey, boolean textLeft, boolean square) { int value = Settings.getInstance().readInt(settingKey); logConfigurationSetting(resourceKey, settingKey, Integer.toString(value), textLeft, square); } private void logConfigurationSettingString(String resourceKey, String settingKey, boolean textLeft, boolean square) { String value = Settings.getInstance().readString(settingKey); logConfigurationSetting(resourceKey, settingKey, value, textLeft, square); } private void logConfigurationSettingList(String resourceKey, String settingKey, String[] values, boolean textLeft, boolean square) { int valueIndex = Settings.getInstance().readInt(settingKey); String value = Integer.toString(valueIndex); if (values != null && valueIndex >= 0 && valueIndex < values.length) { value = values[valueIndex]; } logConfigurationSetting(resourceKey, settingKey, value, textLeft, square); } private void logConfigurationPanel(String resourceKey) { // jog here only in the English locale java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("jpcsp/languages/jpcsp", new Locale("en")); log.info(String.format("%s / %s", bundle.getString("SettingsGUI.title"), bundle.getString(resourceKey))); } private void logStart() { log.info(String.format("Java version: %s (%s)", System.getProperty("java.version"), System.getProperty("java.runtime.version"))); log.info(String.format("Java library path: %s", System.getProperty("java.library.path"))); logConfigurationSettings(); } private void logStartIso(UmdIsoReader iso) { if (!log.isInfoEnabled()) { return; } String[] paramSfoFiles = new String[] { "PSP_GAME/param.sfo", "UMD_VIDEO/param.sfo", "UMD_AUDIO/param.sfo" }; for (String paramSfoFile : paramSfoFiles) { if (iso.hasFile(paramSfoFile)) { try { UmdIsoFile psfFile = iso.getFile(paramSfoFile); PSF psf = new PSF(); byte[] data = new byte[(int) psfFile.length()]; psfFile.read(data); psf.read(ByteBuffer.wrap(data)); log.info(String.format("Content of %s:%s%s", paramSfoFile, System.lineSeparator(), psf)); } catch (IOException e) { // Ignore exception } } } try { UmdIsoFile umdDataBin = iso.getFile("UMD_DATA.BIN"); if (umdDataBin != null) { byte[] buffer = new byte[(int) umdDataBin.length()]; umdDataBin.readFully(buffer); umdDataBin.close(); String umdDataBinContent = new String(buffer).replace((char) 0, ' '); log.info(String.format("Content of UMD_DATA.BIN: '%s'", umdDataBinContent)); } } catch (FileNotFoundException e) { // Ignore exception } catch (IOException e) { // Ignore exception } } private void logConfigurationSettings() { if (!log.isInfoEnabled()) { return; } log.info("Using the following settings:"); // Log the configuration settings logConfigurationPanel("SettingsGUI.RegionPanel.title"); logConfigurationSettingList("SettingsGUI.languageLabel.text", sceUtility.SYSTEMPARAM_SETTINGS_OPTION_LANGUAGE, SettingsGUI.getImposeLanguages(), true, true); logConfigurationSettingList("SettingsGUI.buttonLabel.text", sceUtility.SYSTEMPARAM_SETTINGS_OPTION_BUTTON_PREFERENCE, SettingsGUI.getImposeButtons(), true, true); logConfigurationSettingList("SettingsGUI.daylightLabel.text", sceUtility.SYSTEMPARAM_SETTINGS_OPTION_DAYLIGHT_SAVING_TIME, SettingsGUI.getSysparamDaylightSavings(), true, true); logConfigurationSettingList("SettingsGUI.timeFormatLabel.text", sceUtility.SYSTEMPARAM_SETTINGS_OPTION_TIME_FORMAT, SettingsGUI.getSysparamTimeFormats(), true, true); logConfigurationSettingList("SettingsGUI.dateFormatLabel.text", sceUtility.SYSTEMPARAM_SETTINGS_OPTION_DATE_FORMAT, SettingsGUI.getSysparamDateFormats(), true, true); logConfigurationSettingList("SettingsGUI.wlanPowerLabel.text", sceUtility.SYSTEMPARAM_SETTINGS_OPTION_WLAN_POWER_SAVE, SettingsGUI.getSysparamWlanPowerSaves(), true, true); logConfigurationSettingList("SettingsGUI.adhocChannel.text", sceUtility.SYSTEMPARAM_SETTINGS_OPTION_ADHOC_CHANNEL, SettingsGUI.getSysparamAdhocChannels(), true, true); logConfigurationSettingInt("SettingsGUI.timezoneLabel.text", sceUtility.SYSTEMPARAM_SETTINGS_OPTION_TIME_ZONE, true, true); logConfigurationSettingString("SettingsGUI.nicknameLabel.text", sceUtility.SYSTEMPARAM_SETTINGS_OPTION_NICKNAME, true, true); logConfigurationPanel("SettingsGUI.VideoPanel.title"); logConfigurationSettingBool("SettingsGUI.useOpenglRenderer.text", !Settings.getInstance().readBool("emu.useSoftwareRenderer") && !Settings.getInstance().readBool("emu.useExternalSoftwareRenderer"), false, false); logConfigurationSettingBool("SettingsGUI.useSoftwareRenderer.text", "emu.useSoftwareRenderer", false, false); logConfigurationSettingBool("SettingsGUI.useExternalSoftwareRenderer.text", "emu.useExternalSoftwareRenderer", false, false); logConfigurationSettingBool("SettingsGUI.disableVBOCheck.text", "emu.disablevbo", false, true); logConfigurationSettingBool("SettingsGUI.onlyGEGraphicsCheck.text", "emu.onlyGEGraphics", false, true); logConfigurationSettingBool("SettingsGUI.useVertexCache.text", "emu.useVertexCache", false, true); logConfigurationSettingBool("SettingsGUI.shaderCheck.text", "emu.useshaders", false, true); logConfigurationSettingBool("SettingsGUI.geometryShaderCheck.text", "emu.useGeometryShader", false, true); logConfigurationSettingBool("SettingsGUI.disableUBOCheck.text", "emu.disableubo", false, true); logConfigurationSettingBool("SettingsGUI.enableVAOCheck.text", "emu.enablevao", false, true); logConfigurationSettingBool("SettingsGUI.enableGETextureCheck.text", "emu.enablegetexture", false, true); logConfigurationSettingBool("SettingsGUI.enableNativeCLUTCheck.text", "emu.enablenativeclut", false, true); logConfigurationSettingBool("SettingsGUI.enableDynamicShadersCheck.text", "emu.enabledynamicshaders", false, true); logConfigurationSettingBool("SettingsGUI.enableShaderStencilTestCheck.text", "emu.enableshaderstenciltest", false, true); logConfigurationSettingBool("SettingsGUI.enableShaderColorMaskCheck.text", "emu.enableshadercolormask", false, true); logConfigurationSettingBool("SettingsGUI.disableOptimizedVertexInfoReading.text", "emu.disableoptimizedvertexinforeading", false, true); logConfigurationSettingBool("SettingsGUI.saveStencilToMemory.text", "emu.saveStencilToMemory", false, true); logConfigurationPanel("SettingsGUI.MemoryPanel.title"); logConfigurationSettingBool("SettingsGUI.invalidMemoryCheck.text", "emu.ignoreInvalidMemoryAccess", false, true); logConfigurationSettingBool("SettingsGUI.ignoreUnmappedImports.text", "emu.ignoreUnmappedImports", false, true); logConfigurationSettingBool("SettingsGUI.useDebugMemory.text", "emu.useDebuggerMemory", false, true); logConfigurationPanel("SettingsGUI.CompilerPanel.title"); logConfigurationSettingBool("SettingsGUI.useCompiler.text", "emu.compiler", false, true); logConfigurationSettingBool("SettingsGUI.profileCheck.text", "emu.profiler", false, true); logConfigurationSettingInt("SettingsGUI.methodMaxInstructionsLabel.text", "emu.compiler.methodMaxInstructions", false, true); logConfigurationPanel("SettingsGUI.DisplayPanel.title"); logConfigurationSettingString("SettingsGUI.antiAliasLabel.text", "emu.graphics.antialias", true, true); logConfigurationSettingString("SettingsGUI.resolutionLabel.text", "emu.graphics.resolution", true, true); logConfigurationSettingBool("SettingsGUI.fullscreenCheck.text", "gui.fullscreen", false, true); logConfigurationPanel("SettingsGUI.MiscPanel.title"); logConfigurationSettingBool("SettingsGUI.useDebugFont.text", "emu.useDebugFont", false, true); logConfigurationPanel("SettingsGUI.CryptoPanel.title"); logConfigurationSettingBool("SettingsGUI.cryptoSavedata.text", "emu.cryptoSavedata", false, true); logConfigurationSettingBool("SettingsGUI.extractSavedataKey.text", "emu.extractSavedataKey", false, true); logConfigurationSettingBool("SettingsGUI.extractPGD.text", "emu.extractPGD", false, true); logConfigurationSettingBool("SettingsGUI.extractEboot.text", "emu.extractEboot", false, true); logConfigurationSettingBool("SettingsGUI.disableDLC.text", "emu.disableDLC", false, true); logConfigurationPanel("SettingsGUI.networkPanel.TabConstraints.tabTitle"); logConfigurationSettingBool("SettingsGUI.lanMultiPlayerRadioButton.text", "emu.lanMultiPlayer", false, false); logConfigurationSettingBool("SettingsGUI.netServerPortShiftRadioButton.text", "emu.netServerPortShift", false, false); logConfigurationSettingBool("SettingsGUI.netClientPortShiftRadioButton.text", "emu.netClientPortShift", false, false); logConfigurationSettingBool("SettingsGUI.enableProOnlineRadioButton.text", "emu.enableProOnline", false, false); logConfigurationSettingString("SettingsGUI.metaServerLabel.text", "network.ProOnline.metaServer", true, true); logConfigurationSettingString("SettingsGUI.broadcastAddressLabel.text", "network.broadcastAddress", true, true); } public void loadAndRun() { if (Settings.getInstance().readBool("emu.loadAndRun")) { RunEmu(); } } private void ResetButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ResetButtonActionPerformed reset(); }//GEN-LAST:event_ResetButtonActionPerformed private void resetEmu() { if (loadedFile != null) { PauseEmu(); RuntimeContext.reset(); HLEModuleManager.getInstance().stopModules(); if (umdLoaded) { loadUMD(loadedFile); } else { loadFile(loadedFile); } } } private void InstructionCounterActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_InstructionCounterActionPerformed PauseEmu(); if (State.instructionCounter == null) { State.instructionCounter = new InstructionCounter(); emulator.setInstructionCounter(State.instructionCounter); } else { State.instructionCounter.RefreshWindow(); } startWindowDialog(State.instructionCounter); }//GEN-LAST:event_InstructionCounterActionPerformed private void FileLogActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_FileLogActionPerformed if (State.fileLogger == null) { State.fileLogger = new FileLoggerFrame(); } startWindowDialog(State.fileLogger); }//GEN-LAST:event_FileLogActionPerformed private void VfpuRegistersActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_VfpuRegistersActionPerformed startWindowDialog(VfpuFrame.getInstance()); }//GEN-LAST:event_VfpuRegistersActionPerformed private void DumpIsoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_DumpIsoActionPerformed if (umdLoaded) { UmdIsoReader iso = Modules.IoFileMgrForUserModule.getIsoReader(); if (iso != null) { try { iso.dumpIndexFile("iso-index.txt"); } catch (IOException e) { // Ignore Exception } } } }//GEN-LAST:event_DumpIsoActionPerformed private void ResetProfilerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ResetProfilerActionPerformed Profiler.reset(); GEProfiler.reset(); }//GEN-LAST:event_ResetProfilerActionPerformed private void ClearTextureCacheActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ClearTextureCacheActionPerformed VideoEngine.getInstance().clearTextureCache(); }//GEN-LAST:event_ClearTextureCacheActionPerformed private void ClearVertexCacheActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ClearVertexCacheActionPerformed VideoEngine.getInstance().clearVertexCache(); }//GEN-LAST:event_ClearVertexCacheActionPerformed private void ExportISOFileActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ExportISOFileActionPerformed ResourceBundle bundle = ResourceBundle.getBundle("jpcsp/languages/jpcsp"); String fileName = JOptionPane.showInputDialog(null, bundle.getString("MainGUI.ExportISOFileQuestion.text"), "disc0:/"); if (fileName == null) { // Input cancelled return; } SeekableDataInput input = Modules.IoFileMgrForUserModule.getFile(fileName, IoFileMgrForUser.PSP_O_RDONLY); if (input == null) { // File does not exit JOptionPane.showMessageDialog(null, bundle.getString("MainGUI.FileDoesNotExist.text"), null, JOptionPane.ERROR_MESSAGE); return; } String exportFileName = fileName; if (exportFileName.contains("/")) { exportFileName = exportFileName.substring(exportFileName.lastIndexOf('/') + 1); } if (exportFileName.contains(":")) { exportFileName = exportFileName.substring(exportFileName.lastIndexOf(':') + 1); } try { OutputStream output = new FileOutputStream(exportFileName); byte[] buffer = new byte[10 * 1024]; long readLength = 0; long totalLength = input.length(); while (readLength < totalLength) { int length = (int) Math.min(totalLength - readLength, buffer.length); input.readFully(buffer, 0, length); output.write(buffer, 0, length); readLength += length; } output.close(); input.close(); log.info(String.format("Exported file '%s' to '%s'", fileName, exportFileName)); String messageFormat = bundle.getString("MainGUI.FileExported.text"); String message = MessageFormat.format(messageFormat, fileName, exportFileName); JOptionPane.showMessageDialog(null, message, null, JOptionPane.INFORMATION_MESSAGE); } catch (IOException e) { log.error(e); } }//GEN-LAST:event_ExportISOFileActionPerformed private void ShotItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ShotItemActionPerformed if (umdvideoplayer != null) { umdvideoplayer.takeScreenshot(); } Modules.sceDisplayModule.takeScreenshot(); }//GEN-LAST:event_ShotItemActionPerformed private void RotateItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_RotateItemActionPerformed sceDisplay screen = Modules.sceDisplayModule; java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("jpcsp/languages/jpcsp"); // NOI18N List<Object> options = new ArrayList<Object>(); options.add(bundle.getString("MainGUI.strRotate90CW.text")); options.add(bundle.getString("MainGUI.strRotate90CCW.text")); options.add(bundle.getString("MainGUI.strRotate180.text")); options.add(bundle.getString("MainGUI.strRotateMirror.text")); options.add(bundle.getString("MainGUI.strRotateNormal.text")); int jop = JOptionPane.showOptionDialog(null, bundle.getString("MainGUI.strChooseRotation.text"), bundle.getString("MainGUI.strRotate.text"), JOptionPane.UNDEFINED_CONDITION, JOptionPane.QUESTION_MESSAGE, null, options.toArray(), options.get(4)); if (jop != -1) { screen.rotate(jop); } }//GEN-LAST:event_RotateItemActionPerformed private void ExportVisibleElementsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ExportVisibleElementsActionPerformed State.exportGeNextFrame = true; State.exportGeOnlyVisibleElements = true; }//GEN-LAST:event_ExportVisibleElementsActionPerformed private void ExportAllElementsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ExportAllElementsActionPerformed State.exportGeNextFrame = true; State.exportGeOnlyVisibleElements = false; }//GEN-LAST:event_ExportAllElementsActionPerformed private byte safeRead8(int address) { byte value = 0; if (Memory.isAddressGood(address)) { value = (byte) Memory.getInstance().read8(address); } return value; } private void safeWrite8(byte value, int address) { if (Memory.isAddressGood(address)) { Memory.getInstance().write8(address, value); } } private void SaveSnapActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SaveSnapActionPerformed File f = new File("Snap_" + State.discId + ".bin"); BufferedOutputStream bOut = null; ByteBuffer cpuBuf = ByteBuffer.allocate(1024); Emulator.getProcessor().save(cpuBuf); try { bOut = new BufferedOutputStream(new FileOutputStream(f)); for (int i = 0x08000000; i <= 0x09ffffff; i++) { bOut.write(safeRead8(i)); } bOut.write(cpuBuf.array()); } catch (IOException e) { } finally { Utilities.close(bOut); } }//GEN-LAST:event_SaveSnapActionPerformed private void LoadSnapActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_LoadSnapActionPerformed File f = new File("Snap_" + State.discId + ".bin"); BufferedInputStream bIn = null; ByteBuffer cpuBuf = ByteBuffer.allocate(1024); try { bIn = new BufferedInputStream(new FileInputStream(f)); for (int i = 0x08000000; i <= 0x09ffffff; i++) { safeWrite8((byte) bIn.read(), i); } bIn.read(cpuBuf.array()); } catch (IOException e) { } finally { Utilities.close(bIn); } Emulator.getProcessor().load(cpuBuf); }//GEN-LAST:event_LoadSnapActionPerformed private void EnglishUSActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_EnglishUSActionPerformed changeLanguage("en_US"); }//GEN-LAST:event_EnglishUSActionPerformed private void FrenchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_FrenchActionPerformed changeLanguage("fr_FR"); }//GEN-LAST:event_FrenchActionPerformed private void GermanActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_GermanActionPerformed changeLanguage("de_DE"); }//GEN-LAST:event_GermanActionPerformed private void LithuanianActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_LithuanianActionPerformed changeLanguage("lt_LT"); }//GEN-LAST:event_LithuanianActionPerformed private void SpanishActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SpanishActionPerformed changeLanguage("es_ES"); }//GEN-LAST:event_SpanishActionPerformed private void CatalanActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CatalanActionPerformed changeLanguage("ca_ES"); }//GEN-LAST:event_CatalanActionPerformed private void PortugueseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_PortugueseActionPerformed changeLanguage("pt_PT"); }//GEN-LAST:event_PortugueseActionPerformed private void JapaneseActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_JapaneseActionPerformed changeLanguage("ja_JP"); }//GEN-LAST:event_JapaneseActionPerformed private void PortugueseBRActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_PortugueseBRActionPerformed changeLanguage("pt_BR"); }//GEN-LAST:event_PortugueseBRActionPerformed private void cwcheatActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cwcheatActionPerformed if (State.cheatsGUI == null) { State.cheatsGUI = new CheatsGUI(); } startWindowDialog(State.cheatsGUI); }//GEN-LAST:event_cwcheatActionPerformed private void RussianActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_RussianActionPerformed changeLanguage("ru_RU"); }//GEN-LAST:event_RussianActionPerformed private void PolishActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_PolishActionPerformed changeLanguage("pl_PL"); }//GEN-LAST:event_PolishActionPerformed private void ItalianActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ItalianActionPerformed changeLanguage("it_IT"); }//GEN-LAST:event_ItalianActionPerformed private void GreekActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_GreekActionPerformed changeLanguage("el_GR"); }//GEN-LAST:event_GreekActionPerformed private void ControlsConfActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ControlsConfActionPerformed startWindowDialog(new ControlsGUI()); }//GEN-LAST:event_ControlsConfActionPerformed private void MuteOptActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_MuteOptActionPerformed Audio.setMuted(!Audio.isMuted()); MuteOpt.setSelected(Audio.isMuted()); }//GEN-LAST:event_MuteOptActionPerformed private void ClockSpeedNormalActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ClockSpeedNormalActionPerformed // Set clock speed to 1/1 Emulator.setVariableSpeedClock(1, 1); }//GEN-LAST:event_ClockSpeedNormalActionPerformed private void ClockSpeed50ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ClockSpeed50ActionPerformed // Set clock speed to 1/2 Emulator.setVariableSpeedClock(1, 2); }//GEN-LAST:event_ClockSpeed50ActionPerformed private void ClockSpeed75ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ClockSpeed75ActionPerformed // Set clock speed to 3/4 Emulator.setVariableSpeedClock(3, 4); }//GEN-LAST:event_ClockSpeed75ActionPerformed private void ClockSpeed150ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ClockSpeed150ActionPerformed // Set clock speed to 3/2 Emulator.setVariableSpeedClock(3, 2); }//GEN-LAST:event_ClockSpeed150ActionPerformed private void ClockSpeed200ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ClockSpeed200ActionPerformed // Set clock speed to 2/1 Emulator.setVariableSpeedClock(2, 1); }//GEN-LAST:event_ClockSpeed200ActionPerformed private void ClockSpeed300ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ClockSpeed300ActionPerformed // Set clock speed to 3/1 Emulator.setVariableSpeedClock(3, 1); }//GEN-LAST:event_ClockSpeed300ActionPerformed private void ToggleLoggerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ToggleLoggerActionPerformed if (!State.logWindow.isVisible()) { updateConsoleWinPosition(); } State.logWindow.setVisible(!State.logWindow.isVisible()); ToggleLogger.setSelected(State.logWindow.isVisible()); }//GEN-LAST:event_ToggleLoggerActionPerformed private void CustomLoggerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_CustomLoggerActionPerformed if (State.logGUI == null) { State.logGUI = new LogGUI(this); } startWindowDialog(State.logGUI); }//GEN-LAST:event_CustomLoggerActionPerformed private void ChinesePRCActionPerformed(java.awt.event.ActionEvent evt) { changeLanguage("zh_CN"); } private void ChineseTWActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ChinesePRCActionPerformed changeLanguage("zh_TW"); }//GEN-LAST:event_ChinesePRCActionPerformed private void noneCheckActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_noneCheckActionPerformed VideoEngine.getInstance().setUseTextureAnisotropicFilter(false); Settings.getInstance().writeBool("emu.graphics.filters.anisotropic", false); }//GEN-LAST:event_noneCheckActionPerformed private void anisotropicCheckActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_anisotropicCheckActionPerformed VideoEngine.getInstance().setUseTextureAnisotropicFilter(true); Settings.getInstance().writeBool("emu.graphics.filters.anisotropic", anisotropicCheck.isSelected()); }//GEN-LAST:event_anisotropicCheckActionPerformed private void frameSkipNoneActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_frameSkipNoneActionPerformed Modules.sceDisplayModule.setDesiredFPS(0); Settings.getInstance().writeInt("emu.graphics.frameskip.desiredFPS", Modules.sceDisplayModule.getDesiredFPS()); }//GEN-LAST:event_frameSkipNoneActionPerformed private void frameSkipFPS5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_frameSkipFPS5ActionPerformed Modules.sceDisplayModule.setDesiredFPS(5); Settings.getInstance().writeInt("emu.graphics.frameskip.desiredFPS", Modules.sceDisplayModule.getDesiredFPS()); }//GEN-LAST:event_frameSkipFPS5ActionPerformed private void frameSkipFPS10ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_frameSkipFPS10ActionPerformed Modules.sceDisplayModule.setDesiredFPS(10); Settings.getInstance().writeInt("emu.graphics.frameskip.desiredFPS", Modules.sceDisplayModule.getDesiredFPS()); }//GEN-LAST:event_frameSkipFPS10ActionPerformed private void frameSkipFPS15ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_frameSkipFPS15ActionPerformed Modules.sceDisplayModule.setDesiredFPS(15); Settings.getInstance().writeInt("emu.graphics.frameskip.desiredFPS", Modules.sceDisplayModule.getDesiredFPS()); }//GEN-LAST:event_frameSkipFPS15ActionPerformed private void frameSkipFPS20ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_frameSkipFPS20ActionPerformed Modules.sceDisplayModule.setDesiredFPS(20); Settings.getInstance().writeInt("emu.graphics.frameskip.desiredFPS", Modules.sceDisplayModule.getDesiredFPS()); }//GEN-LAST:event_frameSkipFPS20ActionPerformed private void frameSkipFPS30ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_frameSkipFPS30ActionPerformed Modules.sceDisplayModule.setDesiredFPS(30); Settings.getInstance().writeInt("emu.graphics.frameskip.desiredFPS", Modules.sceDisplayModule.getDesiredFPS()); }//GEN-LAST:event_frameSkipFPS30ActionPerformed private void frameSkipFPS60ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_frameSkipFPS60ActionPerformed Modules.sceDisplayModule.setDesiredFPS(60); Settings.getInstance().writeInt("emu.graphics.frameskip.desiredFPS", Modules.sceDisplayModule.getDesiredFPS()); }//GEN-LAST:event_frameSkipFPS60ActionPerformed private void setViewportResizeScaleFactor(int viewportResizeScaleFactor) { Modules.sceDisplayModule.setViewportResizeScaleFactor(viewportResizeScaleFactor); pack(); if (umdvideoplayer != null) { umdvideoplayer.pauseVideo(); umdvideoplayer.setVideoPlayerResizeScaleFactor(this, viewportResizeScaleFactor); umdvideoplayer.resumeVideo(); } } private void oneTimeResizeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_oneTimeResizeActionPerformed setViewportResizeScaleFactor(1); }//GEN-LAST:event_oneTimeResizeActionPerformed private void twoTimesResizeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_twoTimesResizeActionPerformed setViewportResizeScaleFactor(2); }//GEN-LAST:event_twoTimesResizeActionPerformed private void threeTimesResizeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_threeTimesResizeActionPerformed setViewportResizeScaleFactor(3); }//GEN-LAST:event_threeTimesResizeActionPerformed private void SystemLocaleActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SystemLocaleActionPerformed changeLanguage("systemLocale"); }//GEN-LAST:event_SystemLocaleActionPerformed private void formComponentResized(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_formComponentResized updateConsoleWinPosition(); }//GEN-LAST:event_formComponentResized private void EnglishGBActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_EnglishGBActionPerformed changeLanguage("en_GB"); }//GEN-LAST:event_EnglishGBActionPerformed private void xbrzCheckActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_xbrzCheckActionPerformed Settings.getInstance().writeBool("emu.plugins.xbrz", xbrzCheck.isSelected()); }//GEN-LAST:event_xbrzCheckActionPerformed private void exitEmu() { if (umdvideoplayer != null) { umdvideoplayer.exit(); } ProOnlineNetworkAdapter.exit(); Modules.ThreadManForUserModule.exit(); Modules.sceDisplayModule.exit(); Modules.IoFileMgrForUserModule.exit(); VideoEngine.exit(); Screen.exit(); Emulator.exit(); System.exit(0); } public void updateConsoleWinPosition() { if (Settings.getInstance().readBool("gui.snapLogwindow")) { Point mainwindowPos = getLocation(); State.logWindow.setLocation(mainwindowPos.x, mainwindowPos.y + getHeight()); } } private void RunEmu() { emulator.RunEmu(); Modules.sceDisplayModule.getCanvas().requestFocusInWindow(); } private void TogglePauseEmu() { // This is a toggle, so can pause and unpause if (Emulator.run) { if (!Emulator.pause) { Emulator.PauseEmuWithStatus(Emulator.EMU_STATUS_PAUSE); } else { RunEmu(); } } } private void PauseEmu() { // This will only enter pause mode if (Emulator.run && !Emulator.pause) { Emulator.PauseEmuWithStatus(Emulator.EMU_STATUS_PAUSE); } } @Override public void RefreshButtons() { RunButton.setSelected(Emulator.run && !Emulator.pause); PauseButton.setSelected(Emulator.run && Emulator.pause); } @Override final public void onUmdChange() { // Only enable the menu entry "Switch UMD" when sceUmdReplacePermit has been called by the application. switchUmd.setEnabled(Modules.sceUmdUserModule.isUmdAllowReplace()); } /** * set the FPS portion of the title */ @Override public void setMainTitle(String message) { String oldtitle = getTitle(); int sub = oldtitle.indexOf("FPS:"); if (sub != -1) { String newtitle = oldtitle.substring(0, sub - 1); setTitle(newtitle + " " + message); } else { setTitle(oldtitle + " " + message); } } public static File[] getUmdPaths(boolean ignorePSPGame) { List<File> umdPaths = new LinkedList<File>(); umdPaths.add(new File(Settings.getInstance().readString("emu.umdpath") + "/")); for (int i = 1; true; i++) { String umdPath = Settings.getInstance().readString(String.format("emu.umdpath.%d", i), null); if (umdPath == null) { break; } if (!ignorePSPGame || !umdPath.equals("ms0\\PSP\\GAME")) { umdPaths.add(new File(umdPath + "/")); } } return umdPaths.toArray(new File[umdPaths.size()]); } private void printUsage() { System.err.println("Usage: java -Xmx512m -jar jpcsp.jar [OPTIONS]"); System.err.println(); System.err.println(" -d, --debugger Open debugger at start."); System.err.println(" -f, --loadfile FILE Load a file."); System.err.println(" Example: ms0/PSP/GAME/pspsolitaire/EBOOT.PBP"); System.err.println(" -u, --loadumd FILE Load a UMD. Example: umdimages/cube.iso"); System.err.println(" -r, --run Run loaded file or umd. Use with -f or -u option."); System.err.println(" -t, --tests Run the automated tests."); System.err.println(" --netClientPortShift N Increase Network client ports by N (when running 2 Jpcsp on the same computer)"); System.err.println(" --netServerPortShift N Increase Network server ports by N (when running 2 Jpcsp on the same computer)"); } private void processArgs(String[] args) { for (int i = 0; i < args.length; i++) { //System.err.println("Args: " + args[0]); if (args[i].equals("-t") || args[i].equals("--tests")) { //(new AutoTestsRunner()).run(); //loadFile(new File("pspautotests/tests/rtc/rtc.elf")); //RunEmu(); throw (new RuntimeException("Shouldn't get there")); } else if (args[i].equals("-d") || args[i].equals("--debugger")) { // hack: reuse this function EnterDebuggerActionPerformed(null); } else if (args[i].equals("-f") || args[i].equals("--loadfile")) { i++; if (i < args.length) { File file = new File(args[i]); if (file.exists()) { Modules.sceDisplayModule.setCalledFromCommandLine(); loadFile(file); } } else { printUsage(); break; } } else if (args[i].equals("-u") || args[i].equals("--loadumd")) { i++; if (i < args.length) { File file = new File(args[i]); if (file.exists()) { Modules.sceDisplayModule.setCalledFromCommandLine(); loadUMD(file); } } else { printUsage(); break; } } else if (args[i].equals("--bufferumd")) { doUmdBuffering = true; } else if (args[i].equals("--loadbufferedumd")) { doUmdBuffering = true; Modules.sceDisplayModule.setCalledFromCommandLine(); loadUMD(null); } else if (args[i].equals("-r") || args[i].equals("--run")) { RunEmu(); } else if (args[i].equals("--netClientPortShift")) { i++; if (i < args.length) { int netClientPortShift = Integer.parseInt(args[i]); Modules.sceNetAdhocModule.setNetClientPortShift(netClientPortShift); } else { printUsage(); break; } } else if (args[i].equals("--netServerPortShift")) { i++; if (i < args.length) { int netServerPortShift = Integer.parseInt(args[i]); Modules.sceNetAdhocModule.setNetServerPortShift(netServerPortShift); } else { printUsage(); break; } } else if (args[i].equals("--ProOnline")) { ProOnlineNetworkAdapter.setEnabled(true); } else if (args[i].equals("--vsh")) { runFromVsh = true; logStart(); setTitle(MetaInformation.FULL_NAME + " - VSH"); Emulator.getInstance().setFirmwareVersion(660); Modules.sceDisplayModule.setCalledFromCommandLine(); HTTPServer.processProxyRequestLocally = true; loadFile(new File("flash0/vsh/module/vshmain.prx"), true); ModuleMgrForUser moduleMgr = Modules.ModuleMgrForUserModule; // Use increasing start thread priorities to enforce the start order int startPriority = 0x11; moduleMgr.hleKernelLoadAndStartModule("flash0:/kd/vshbridge.prx", startPriority++); moduleMgr.hleKernelLoadAndStartModule("flash0:/vsh/module/paf.prx", startPriority++); moduleMgr.hleKernelLoadAndStartModule("flash0:/vsh/module/common_gui.prx", startPriority++); moduleMgr.hleKernelLoadAndStartModule("flash0:/vsh/module/common_util.prx", startPriority++); HLEModuleManager.getInstance().LoadFlash0Module("PSP_MODULE_AV_VAUDIO"); HLEModuleManager.getInstance().LoadFlash0Module("PSP_MODULE_AV_ATRAC3PLUS"); HLEModuleManager.getInstance().LoadFlash0Module("PSP_MODULE_AV_AVCODEC"); } else { printUsage(); break; } } } /** * @param args the command line arguments */ public static void main(String args[]) { DOMConfigurator.configure("LogSettings.xml"); // Re-enable all disabled algorithms as the PSP is allowing them Security.setProperty("jdk.certpath.disabledAlgorithms", ""); Security.setProperty("jdk.tls.disabledAlgorithms", ""); AES128.init(); HTTPServer.getInstance(); // prepare i18n String locale = Settings.getInstance().readString("emu.language"); if (!locale.equals("systemLocale")) { // extract language and country for Locale() String language = locale.substring(0, 2); String country = locale.substring(3, 5); Locale.setDefault(new Locale(language, country)); ResourceBundle.clearCache(); } if (args.length > 0) { if (args[0].equals("--tests")) { (new AutoTestsRunner()).run(); return; } } try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { e.printStackTrace(); } // add the window property saver class to the event listeners for // automatic persistent saving of the window positions if needed Toolkit.getDefaultToolkit().addAWTEventListener( new WindowPropSaver(), AWTEvent.WINDOW_EVENT_MASK); // final copy of args for use in inner class final String[] fargs = args; EventQueue.invokeLater(new Runnable() { @Override public void run() { Thread.currentThread().setName("GUI"); MainGUI maingui = new MainGUI(); maingui.setVisible(true); if (Settings.getInstance().readBool("gui.openLogwindow")) { State.logWindow.setVisible(true); maingui.ToggleLogger.setSelected(true); } maingui.processArgs(fargs); } }); } @Override public boolean isFullScreen() { return useFullscreen; } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JMenuItem About; private javax.swing.JMenu AudioOpt; private javax.swing.JMenuItem Catalan; private javax.swing.JMenu CheatsMenu; private javax.swing.JMenuItem ChinesePRC; private javax.swing.JMenuItem ChineseTW; private javax.swing.JMenuItem ClearTextureCache; private javax.swing.JMenuItem ClearVertexCache; private javax.swing.JCheckBoxMenuItem ClockSpeed150; private javax.swing.JCheckBoxMenuItem ClockSpeed200; private javax.swing.JCheckBoxMenuItem ClockSpeed300; private javax.swing.JCheckBoxMenuItem ClockSpeed50; private javax.swing.JCheckBoxMenuItem ClockSpeed75; private javax.swing.JCheckBoxMenuItem ClockSpeedNormal; private javax.swing.JMenu ClockSpeedOpt; private javax.swing.JMenuItem ConfigMenu; private javax.swing.JMenuItem ControlsConf; private javax.swing.JMenuItem CustomLogger; private javax.swing.JMenu DebugMenu; private javax.swing.JMenuItem DumpIso; private javax.swing.JMenuItem ElfHeaderViewer; private javax.swing.JMenuItem EnglishGB; private javax.swing.JMenuItem EnglishUS; private javax.swing.JMenuItem EnterDebugger; private javax.swing.JMenuItem EnterImageViewer; private javax.swing.JMenuItem EnterMemoryViewer; private javax.swing.JMenuItem ExitEmu; private javax.swing.JMenuItem ExportAllElements; private javax.swing.JMenuItem ExportISOFile; private javax.swing.JMenu ExportMenu; private javax.swing.JMenuItem ExportVisibleElements; private javax.swing.JCheckBoxMenuItem FPS10; private javax.swing.JCheckBoxMenuItem FPS15; private javax.swing.JCheckBoxMenuItem FPS20; private javax.swing.JCheckBoxMenuItem FPS30; private javax.swing.JCheckBoxMenuItem FPS5; private javax.swing.JCheckBoxMenuItem FPS60; private javax.swing.JMenuItem FileLog; private javax.swing.JMenu FileMenu; private javax.swing.JMenu FiltersMenu; private javax.swing.JMenu FrameSkipMenu; private javax.swing.JCheckBoxMenuItem FrameSkipNone; private javax.swing.JMenuItem French; private javax.swing.JMenuItem German; private javax.swing.JMenuItem Greek; private javax.swing.JMenu HelpMenu; private javax.swing.JMenuItem InstructionCounter; private javax.swing.JMenuItem Italian; private javax.swing.JMenuItem Japanese; private javax.swing.JMenu LanguageMenu; private javax.swing.JMenuItem Lithuanian; private javax.swing.JMenuItem LoadSnap; private javax.swing.JMenu LoggerMenu; private javax.swing.JMenuBar MenuBar; private javax.swing.JCheckBoxMenuItem MuteOpt; private javax.swing.JMenuItem OpenFile; private javax.swing.JMenu OptionsMenu; private javax.swing.JToggleButton PauseButton; private javax.swing.JMenu PluginsMenu; private javax.swing.JMenuItem Polish; private javax.swing.JMenuItem Portuguese; private javax.swing.JMenuItem PortugueseBR; private javax.swing.JMenu RecentMenu; private javax.swing.JButton ResetButton; private javax.swing.JMenuItem ResetProfiler; private javax.swing.JMenu ResizeMenu; private javax.swing.JMenuItem RotateItem; private javax.swing.JToggleButton RunButton; private javax.swing.JMenuItem Russian; private javax.swing.JMenuItem SaveSnap; private javax.swing.JMenuItem ShotItem; private javax.swing.JMenuItem Spanish; private javax.swing.JMenuItem SystemLocale; private javax.swing.JCheckBoxMenuItem ToggleLogger; private javax.swing.JMenu ToolsSubMenu; private javax.swing.JMenuItem VfpuRegisters; private javax.swing.JMenu VideoOpt; private javax.swing.JCheckBoxMenuItem anisotropicCheck; private javax.swing.ButtonGroup clockSpeedGroup; private javax.swing.JMenuItem cwcheat; private javax.swing.ButtonGroup filtersGroup; private javax.swing.ButtonGroup frameSkipGroup; private javax.swing.JSeparator jSeparator1; private javax.swing.JSeparator jSeparator2; private javax.swing.JToolBar mainToolBar; private javax.swing.JCheckBoxMenuItem noneCheck; private javax.swing.JCheckBoxMenuItem oneTimeResize; private javax.swing.JMenuItem openUmd; private javax.swing.ButtonGroup resGroup; private javax.swing.JMenuItem switchUmd; private javax.swing.JMenuItem ejectMs; private javax.swing.JCheckBoxMenuItem threeTimesResize; private javax.swing.JCheckBoxMenuItem twoTimesResize; private javax.swing.JCheckBoxMenuItem xbrzCheck; // End of variables declaration//GEN-END:variables private boolean userChooseSomething(int returnVal) { return returnVal == JFileChooser.APPROVE_OPTION; } @Override public void mousePressed(MouseEvent event) { if (useFullscreen && event.isPopupTrigger()) { fullScreenMenu.show(event.getComponent(), event.getX(), event.getY()); } } @Override public void mouseReleased(MouseEvent event) { if (useFullscreen && event.isPopupTrigger()) { fullScreenMenu.show(event.getComponent(), event.getX(), event.getY()); } } @Override public void mouseClicked(MouseEvent event) { } @Override public void mouseEntered(MouseEvent event) { } @Override public void mouseExited(MouseEvent event) { } @Override public void keyTyped(KeyEvent event) { } @Override public void keyPressed(KeyEvent event) { State.controller.keyPressed(event); // check if the stroke is a known accelerator and call the associated ActionListener(s) KeyStroke stroke = KeyStroke.getKeyStroke(event.getKeyCode(), event.getModifiers()); if (actionListenerMap.containsKey(stroke)) { for (ActionListener al : actionListenerMap.get(stroke)) { al.actionPerformed(new ActionEvent(event.getSource(), event.getID(), "")); } } } @Override public void keyReleased(KeyEvent event) { State.controller.keyReleased(event); } @Override public void componentHidden(ComponentEvent e) { } @Override public void componentMoved(ComponentEvent e) { if (State.logWindow.isVisible()) { updateConsoleWinPosition(); } } @Override public void componentResized(ComponentEvent e) { } @Override public void componentShown(ComponentEvent e) { } private class RecentElementActionListener implements ActionListener { public static final int TYPE_UMD = 0; public static final int TYPE_FILE = 1; private int type; private String path; private Component parent; public RecentElementActionListener(Component parent, int type, String path) { this.parent = parent; this.path = path; this.type = type; } @Override public void actionPerformed(ActionEvent e) { File file = new File(path); if (file.exists()) { if (type == TYPE_UMD) { loadUMD(file); } else { loadFile(file); } loadAndRun(); } else { ResourceBundle bundle = ResourceBundle.getBundle("jpcsp/languages/jpcsp"); String messageFormat = bundle.getString("MainGUI.RecentFileNotFound.text"); String message = MessageFormat.format(messageFormat, path); JpcspDialogManager.showError(parent, message); if (type == TYPE_UMD) { removeRecentUMD(path); } else { removeRecentFile(path); } } } } private static class SetLocationThread extends Thread { @Override public void run() { while (true) { try { // Wait for 1 second sleep(1000); } catch (InterruptedException e) { // Ignore Exception } Emulator.getMainGUI().setLocation(); } } } @Override public Rectangle getCaptureRectangle() { Insets insets = getInsets(); Rectangle canvasBounds = Modules.sceDisplayModule.getCanvas().getBounds(); Rectangle contentBounds = getContentPane().getBounds(); return new Rectangle(getX() + insets.left + contentBounds.x + canvasBounds.x, getY() + insets.top + contentBounds.y + canvasBounds.y, canvasBounds.width, canvasBounds.height); } @Override public void run() { if (umdvideoplayer != null) { umdvideoplayer.initVideo(); } RunEmu(); } @Override public void pause() { if (umdvideoplayer != null) { umdvideoplayer.pauseVideo(); } TogglePauseEmu(); } @Override public void reset() { resetEmu(); } }