Package com.yifanlu.PSXperiaTool.Interface

Source Code of com.yifanlu.PSXperiaTool.Interface.GUI

/*
* PSXperia Converter Tool - Logging
* Copyright (C) 2011 Yifan Lu (http://yifan.lu/)
*
* This program 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.
*
* This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
*/

package com.yifanlu.PSXperiaTool.Interface;

import com.android.sdklib.internal.build.SignedJarBuilder;
import com.yifanlu.PSXperiaTool.Extractor.CrashBandicootExtractor;
import com.yifanlu.PSXperiaTool.Logger;
import com.yifanlu.PSXperiaTool.PSXperiaTool;
import com.yifanlu.PSXperiaTool.ProgressMonitor;
import org.apache.commons.io.FileUtils;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.net.URISyntaxException;
import java.security.GeneralSecurityException;
import java.util.InputMismatchException;
import java.util.Properties;

public class GUI extends javax.swing.JFrame {

    /**
     * Creates new form GUI
     */
    public GUI() {
        initComponents();
    }

    /**
     * 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.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        tabbedPane = new javax.swing.JTabbedPane();
        informationPanel = new javax.swing.JPanel();
        licenseCheck1 = new javax.swing.JCheckBox();
        licenseCheck2 = new javax.swing.JCheckBox();
        licenseCheck3 = new javax.swing.JCheckBox();
        licenseCheck4 = new javax.swing.JCheckBox();
        textScrollPane = new javax.swing.JScrollPane();
        licenseText = new javax.swing.JTextArea();
        extractPanel = new javax.swing.JPanel();
        extractInformation = new javax.swing.JLabel();
        apkFileLabel = new javax.swing.JLabel();
        apkFileInput = new javax.swing.JTextField();
        zpakFileInput = new javax.swing.JTextField();
        extractOutputInput = new javax.swing.JTextField();
        zpakFileLabel = new javax.swing.JLabel();
        extractOutputLabel = new javax.swing.JLabel();
        chooseZpakFile = new javax.swing.JButton();
        chooseApkFile = new javax.swing.JButton();
        chooseOutputDir = new javax.swing.JButton();
        extractProgress = new javax.swing.JProgressBar();
        extractButton = new javax.swing.JButton();
        extractStatus = new javax.swing.JLabel();
        createPanel = new javax.swing.JPanel();
        chooseData = new javax.swing.JButton();
        dataInput = new javax.swing.JTextField();
        dataLabel = new javax.swing.JLabel();
        isoLabel = new javax.swing.JLabel();
        isoInput = new javax.swing.JTextField();
        chooseIso = new javax.swing.JButton();
        chooseIcon = new javax.swing.JButton();
        convertOutputInput = new javax.swing.JTextField();
        convertOutputLabel = new javax.swing.JLabel();
        chooseConvertOutput = new javax.swing.JButton();
        convertSeparator = new javax.swing.JSeparator();
        loadXmlButton = new javax.swing.JButton();
        gameInformationLabel = new javax.swing.JLabel();
        titleIdLabel = new javax.swing.JLabel();
        titleIdInput = new javax.swing.JTextField();
        nameInput = new javax.swing.JTextField();
        nameLabel = new javax.swing.JLabel();
        developerInput = new javax.swing.JTextField();
        developerLabel = new javax.swing.JLabel();
        publisherLabel = new javax.swing.JLabel();
        publisherInput = new javax.swing.JTextField();
        descriptionLabel = new javax.swing.JLabel();
        descriptionTextPane = new javax.swing.JScrollPane();
        descriptionTextInput = new javax.swing.JTextArea();
        convertProgress = new javax.swing.JProgressBar();
        parentalRatingLabel = new javax.swing.JLabel();
        parentalRatingInput = new javax.swing.JTextField();
        storeTypeLabel = new javax.swing.JLabel();
        storeTypeInput = new javax.swing.JTextField();
        analogModeCheckbox = new javax.swing.JCheckBox();
        convertButton = new javax.swing.JButton();
        getTitleIdButton = new javax.swing.JButton();
        iconImagePreview = new javax.swing.JLabel();
        convertStatus = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("PSXperia Tool");
        setName("PSXperia Tool"); // NOI18N
        setPreferredSize(new java.awt.Dimension(800, 540));
        setResizable(false);
        setSize(new java.awt.Dimension(800, 540));
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowOpened(java.awt.event.WindowEvent evt) {
                formWindowOpened(evt);
            }
        });

        tabbedPane.setPreferredSize(new java.awt.Dimension(800, 530));

        licenseCheck1.setText("Yes, I own a Xperia Play and the Crash Bandicoot APK");

        licenseCheck2.setText("Yes, I own the game(s) I will convert and have permission to use them");

        licenseCheck3.setText("Yes, I will not distribute/redistribute any of the files generated by this tool");

        licenseCheck4.setText("Yes, I understand this is a free tool and does not come with any warranties");

        licenseText.setColumns(20);
        licenseText.setEditable(false);
        licenseText.setLineWrap(true);
        licenseText.setRows(5);
        licenseText.setText("This tool is designed to allow you to convert PSX game(s) that you OWN and have permission to USE on your Android phone by modifying the files from the \"Crash Bandicoot\" game that is included with the Xperia Play. You must own these files too and the phone to obtain the necessary files. Please understand that piracy hurts the game industry and prevents developers from earning money for their hard work, so do not distribute any files you create with this tool. Finally, know that this tool is completely free and open source and should not be sold as is or part of any package. If you understand all of this, check the boxes and highlight my name below to enable the tool.\n\n-Yifan Lu\nhttp://yifan.lu/\nhttp://github.com/yifanlu/PSXperia\n");
        licenseText.setWrapStyleWord(true);
        licenseText.addCaretListener(new javax.swing.event.CaretListener() {
            public void caretUpdate(javax.swing.event.CaretEvent evt) {
                licenseTextCaretUpdate(evt);
            }
        });
        textScrollPane.setViewportView(licenseText);

        org.jdesktop.layout.GroupLayout informationPanelLayout = new org.jdesktop.layout.GroupLayout(informationPanel);
        informationPanel.setLayout(informationPanelLayout);
        informationPanelLayout.setHorizontalGroup(
                informationPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                        .add(informationPanelLayout.createSequentialGroup()
                                .addContainerGap()
                                .add(informationPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                        .add(textScrollPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 739, Short.MAX_VALUE)
                                        .add(licenseCheck4)
                                        .add(licenseCheck3)
                                        .add(licenseCheck2)
                                        .add(licenseCheck1))
                                .addContainerGap())
        );
        informationPanelLayout.setVerticalGroup(
                informationPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                        .add(org.jdesktop.layout.GroupLayout.TRAILING, informationPanelLayout.createSequentialGroup()
                                .addContainerGap()
                                .add(textScrollPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 328, Short.MAX_VALUE)
                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                .add(licenseCheck1)
                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                                .add(licenseCheck2)
                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                                .add(licenseCheck3)
                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                                .add(licenseCheck4)
                                .addContainerGap())
        );

        tabbedPane.addTab("Information", informationPanel);

        java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("com/yifanlu/PSXperiaTool/Interface/Strings"); // NOI18N
        extractInformation.setText(bundle.getString("extract.directions")); // NOI18N

        apkFileLabel.setText(bundle.getString("extract.apkfile")); // NOI18N

        zpakFileLabel.setText(bundle.getString("extract.zpakfile")); // NOI18N

        extractOutputLabel.setText(bundle.getString("extract.output")); // NOI18N

        chooseZpakFile.setText(bundle.getString("extract.choose")); // NOI18N
        chooseZpakFile.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                chooseZpakFileActionPerformed(evt);
            }
        });

        chooseApkFile.setText(bundle.getString("extract.choose")); // NOI18N
        chooseApkFile.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                chooseApkFileActionPerformed(evt);
            }
        });

        chooseOutputDir.setText(bundle.getString("extract.choose")); // NOI18N
        chooseOutputDir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                chooseOutputDirActionPerformed(evt);
            }
        });

        extractButton.setText(bundle.getString("extract.extract")); // NOI18N
        extractButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                extractButtonActionPerformed(evt);
            }
        });

        org.jdesktop.layout.GroupLayout extractPanelLayout = new org.jdesktop.layout.GroupLayout(extractPanel);
        extractPanel.setLayout(extractPanelLayout);
        extractPanelLayout.setHorizontalGroup(
                extractPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                        .add(org.jdesktop.layout.GroupLayout.TRAILING, extractPanelLayout.createSequentialGroup()
                                .addContainerGap()
                                .add(extractPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                                        .add(org.jdesktop.layout.GroupLayout.LEADING, extractStatus, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 739, Short.MAX_VALUE)
                                        .add(org.jdesktop.layout.GroupLayout.LEADING, extractInformation, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 739, Short.MAX_VALUE)
                                        .add(extractPanelLayout.createSequentialGroup()
                                                .add(extractPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                                        .add(org.jdesktop.layout.GroupLayout.TRAILING, extractPanelLayout.createSequentialGroup()
                                                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 5, Short.MAX_VALUE)
                                                                .add(extractPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                                                        .add(extractOutputLabel)
                                                                        .add(zpakFileLabel)
                                                                        .add(apkFileLabel))
                                                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                                                .add(extractPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false)
                                                                        .add(org.jdesktop.layout.GroupLayout.LEADING, zpakFileInput)
                                                                        .add(org.jdesktop.layout.GroupLayout.LEADING, extractOutputInput)
                                                                        .add(org.jdesktop.layout.GroupLayout.LEADING, apkFileInput, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 562, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
                                                        .add(org.jdesktop.layout.GroupLayout.TRAILING, extractProgress, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 639, Short.MAX_VALUE))
                                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                                .add(extractPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                                        .add(extractButton)
                                                        .add(chooseOutputDir)
                                                        .add(chooseApkFile)
                                                        .add(chooseZpakFile))))
                                .addContainerGap())
        );
        extractPanelLayout.setVerticalGroup(
                extractPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                        .add(extractPanelLayout.createSequentialGroup()
                                .addContainerGap()
                                .add(extractInformation, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                .add(18, 18, 18)
                                .add(extractPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                        .add(extractPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                                                .add(apkFileInput, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                                .add(chooseApkFile))
                                        .add(apkFileLabel))
                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                .add(extractPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                        .add(extractPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                                                .add(zpakFileInput, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                                .add(chooseZpakFile))
                                        .add(zpakFileLabel))
                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                .add(extractPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                        .add(extractPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                                                .add(extractOutputInput, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                                .add(chooseOutputDir))
                                        .add(extractOutputLabel))
                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 167, Short.MAX_VALUE)
                                .add(extractPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                                        .add(extractProgress, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                        .add(extractButton))
                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                .add(extractStatus, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 15, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                .addContainerGap())
        );

        extractInformation.getAccessibleContext().setAccessibleName(bundle.getString("extractDirections")); // NOI18N

        tabbedPane.addTab("Extract", extractPanel);

        chooseData.setText(bundle.getString("convert.choose")); // NOI18N
        chooseData.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                chooseDataActionPerformed(evt);
            }
        });

        dataInput.setToolTipText(bundle.getString("convert.extracted_data.tooltip")); // NOI18N

        dataLabel.setText(bundle.getString("convert.extracted_data")); // NOI18N

        isoLabel.setText(bundle.getString("convert.iso_input")); // NOI18N

        chooseIso.setText(bundle.getString("convert.choose")); // NOI18N
        chooseIso.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                chooseIsoActionPerformed(evt);
            }
        });

        chooseIcon.setText("Change Icon");
        chooseIcon.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                chooseIconActionPerformed(evt);
            }
        });

        convertOutputLabel.setText(bundle.getString("convert.output_directory")); // NOI18N

        chooseConvertOutput.setText(bundle.getString("convert.choose")); // NOI18N
        chooseConvertOutput.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                chooseConvertOutputActionPerformed(evt);
            }
        });

        loadXmlButton.setText(bundle.getString("convert.load_xml")); // NOI18N
        loadXmlButton.setToolTipText(bundle.getString("common.disabled_control")); // NOI18N
        loadXmlButton.setEnabled(false);

        gameInformationLabel.setText(bundle.getString("convert.game_information")); // NOI18N

        titleIdLabel.setText(bundle.getString("convert.title_id")); // NOI18N

        titleIdInput.setToolTipText(bundle.getString("convert.title_id.tooltip")); // NOI18N

        nameInput.setToolTipText(bundle.getString("convert.name.tooltip")); // NOI18N

        nameLabel.setText(bundle.getString("convert.name")); // NOI18N

        developerInput.setToolTipText(bundle.getString("convert.developer.tooltip")); // NOI18N

        developerLabel.setText(bundle.getString("convert.developer")); // NOI18N

        publisherLabel.setText(bundle.getString("convert.publisher")); // NOI18N

        publisherInput.setToolTipText(bundle.getString("convert.publisher.tooltip")); // NOI18N

        descriptionLabel.setText("Description:");

        descriptionTextInput.setColumns(20);
        descriptionTextInput.setLineWrap(true);
        descriptionTextInput.setRows(5);
        descriptionTextInput.setWrapStyleWord(true);
        descriptionTextPane.setViewportView(descriptionTextInput);

        parentalRatingLabel.setText(bundle.getString("convert.parental_rating")); // NOI18N

        parentalRatingInput.setToolTipText(bundle.getString("convert.parental_rating.tooltip")); // NOI18N

        storeTypeLabel.setText(bundle.getString("convert.store_type")); // NOI18N

        storeTypeInput.setToolTipText(bundle.getString("convert.store_type.tooltip")); // NOI18N

        analogModeCheckbox.setText(bundle.getString("convert.analog_mode")); // NOI18N
        analogModeCheckbox.setToolTipText(bundle.getString("convert.analog_mode.tooltip")); // NOI18N

        convertButton.setText(bundle.getString("convert.convert")); // NOI18N
        convertButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                convertButtonActionPerformed(evt);
            }
        });

        getTitleIdButton.setText(bundle.getString("convert.get_title_id")); // NOI18N
        getTitleIdButton.setToolTipText(bundle.getString("common.disabled_control")); // NOI18N
        getTitleIdButton.setEnabled(false);

        iconImagePreview.setBorder(javax.swing.BorderFactory.createEtchedBorder());

        org.jdesktop.layout.GroupLayout createPanelLayout = new org.jdesktop.layout.GroupLayout(createPanel);
        createPanel.setLayout(createPanelLayout);
        createPanelLayout.setHorizontalGroup(
                createPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                        .add(org.jdesktop.layout.GroupLayout.TRAILING, createPanelLayout.createSequentialGroup()
                                .addContainerGap()
                                .add(createPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                                        .add(org.jdesktop.layout.GroupLayout.LEADING, convertStatus, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 739, Short.MAX_VALUE)
                                        .add(org.jdesktop.layout.GroupLayout.LEADING, createPanelLayout.createSequentialGroup()
                                                .add(createPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                                                        .add(org.jdesktop.layout.GroupLayout.LEADING, createPanelLayout.createSequentialGroup()
                                                                .add(createPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                                                        .add(isoLabel)
                                                                        .add(dataLabel)
                                                                        .add(convertOutputLabel))
                                                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                                                .add(createPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                                                        .add(convertOutputInput, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 332, Short.MAX_VALUE)
                                                                        .add(isoInput, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 332, Short.MAX_VALUE)
                                                                        .add(dataInput, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 332, Short.MAX_VALUE))
                                                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                                                .add(createPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                                                        .add(chooseData)
                                                                        .add(chooseIso)
                                                                        .add(chooseConvertOutput)))
                                                        .add(org.jdesktop.layout.GroupLayout.LEADING, convertSeparator, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 552, Short.MAX_VALUE)
                                                        .add(createPanelLayout.createSequentialGroup()
                                                                .add(gameInformationLabel)
                                                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 123, Short.MAX_VALUE)
                                                                .add(getTitleIdButton)
                                                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                                                                .add(loadXmlButton))
                                                        .add(org.jdesktop.layout.GroupLayout.LEADING, createPanelLayout.createSequentialGroup()
                                                                .add(createPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                                                        .add(nameLabel)
                                                                        .add(developerLabel)
                                                                        .add(descriptionLabel))
                                                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                                                .add(createPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                                                        .add(descriptionTextPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 465, Short.MAX_VALUE)
                                                                        .add(createPanelLayout.createSequentialGroup()
                                                                                .add(nameInput, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 235, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                                                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                                                                .add(titleIdLabel)
                                                                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                                                                .add(titleIdInput, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 160, Short.MAX_VALUE))
                                                                        .add(createPanelLayout.createSequentialGroup()
                                                                                .add(developerInput, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 149, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                                                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                                                                .add(publisherLabel)
                                                                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                                                                .add(publisherInput, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 238, Short.MAX_VALUE)))))
                                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                                .add(createPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                                        .add(iconImagePreview, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 175, Short.MAX_VALUE)
                                                        .add(createPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false)
                                                                .add(org.jdesktop.layout.GroupLayout.TRAILING, chooseIcon, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                                                .add(parentalRatingLabel)
                                                                .add(parentalRatingInput)
                                                                .add(storeTypeLabel)
                                                                .add(storeTypeInput))
                                                        .add(analogModeCheckbox, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 174, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
                                        .add(createPanelLayout.createSequentialGroup()
                                                .add(convertProgress, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 637, Short.MAX_VALUE)
                                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                                .add(convertButton)
                                                .add(2, 2, 2)))
                                .addContainerGap())
        );
        createPanelLayout.setVerticalGroup(
                createPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                        .add(createPanelLayout.createSequentialGroup()
                                .addContainerGap()
                                .add(createPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                                        .add(createPanelLayout.createSequentialGroup()
                                                .add(createPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                                        .add(createPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                                                                .add(chooseData)
                                                                .add(dataInput, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                                                        .add(dataLabel))
                                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                                .add(createPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                                        .add(createPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                                                                .add(isoInput, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                                                .add(chooseIso))
                                                        .add(isoLabel))
                                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                                .add(createPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                                        .add(convertOutputLabel)
                                                        .add(createPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                                                                .add(convertOutputInput, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                                                .add(chooseConvertOutput)))
                                                .add(18, 18, 18)
                                                .add(convertSeparator, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 10, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 12, Short.MAX_VALUE)
                                                .add(createPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                                                        .add(loadXmlButton)
                                                        .add(gameInformationLabel)
                                                        .add(getTitleIdButton)))
                                        .add(iconImagePreview, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 177, Short.MAX_VALUE))
                                .add(18, 18, 18)
                                .add(createPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                        .add(titleIdInput, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                        .add(titleIdLabel)
                                        .add(nameInput, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                        .add(chooseIcon)
                                        .add(nameLabel))
                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                .add(createPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                        .add(createPanelLayout.createSequentialGroup()
                                                .add(parentalRatingLabel)
                                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                                .add(parentalRatingInput, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                                .add(storeTypeLabel)
                                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                                .add(storeTypeInput, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                                .add(analogModeCheckbox))
                                        .add(createPanelLayout.createSequentialGroup()
                                                .add(createPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                                        .add(developerLabel)
                                                        .add(developerInput, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                                        .add(publisherLabel)
                                                        .add(publisherInput, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                                                .add(18, 18, 18)
                                                .add(createPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                                                        .add(descriptionTextPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 93, Short.MAX_VALUE)
                                                        .add(descriptionLabel))))
                                .add(18, 18, 18)
                                .add(createPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                                        .add(convertButton)
                                        .add(convertProgress, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                                .add(convertStatus, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 14, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                .addContainerGap())
        );

        tabbedPane.addTab("Convert", createPanel);

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                        .add(tabbedPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 800, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
                layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                        .add(layout.createSequentialGroup()
                                .add(tabbedPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 528, Short.MAX_VALUE)
                                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void setFieldsFromProperties(Properties settings) {
        nameInput.setText(settings.getProperty("KEY_DISPLAY_NAME"));
        titleIdInput.setText(settings.getProperty("KEY_TITLE_ID"));
        developerInput.setText(settings.getProperty("KEY_DEVELOPER"));
        publisherInput.setText(settings.getProperty("KEY_PUBLISHER"));
        parentalRatingInput.setText(settings.getProperty("KEY_PARENTAL_RATING"));
        storeTypeInput.setText(settings.getProperty("KEY_STORE_TYPE"));
        descriptionTextInput.setText(settings.getProperty("KEY_DESCRIPTION"));
        analogModeCheckbox.setSelected(settings.getProperty("KEY_ANALOG_MODE").equals("YES") ? true : false);
        mIconImage = (File) settings.get("IconFile");
    }

    private void setPropertiesFromFields(Properties settings) {
        settings.setProperty("KEY_DISPLAY_NAME", nameInput.getText());
        settings.setProperty("KEY_TITLE_ID", titleIdInput.getText());
        settings.setProperty("KEY_DEVELOPER", developerInput.getText());
        settings.setProperty("KEY_PUBLISHER", publisherInput.getText());
        settings.setProperty("KEY_PARENTAL_RATING", parentalRatingInput.getText());
        settings.setProperty("KEY_STORE_TYPE", storeTypeInput.getText());
        settings.setProperty("KEY_DESCRIPTION", descriptionTextInput.getText());
        settings.setProperty("KEY_ANALOG_MODE", analogModeCheckbox.isSelected() ? "YES" : "NO");
        if (mIconImage != null)
            settings.put("IconFile", mIconImage);
    }

    private void formWindowOpened(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowOpened
        try {
            tabbedPane.setEnabled(false);

            // Start logging
            Logger.setGUIFrame(this);
            Logger.setLevel(Logger.DEBUG);
            try {
                File log = new File(mCurrentDir, "psxperia.log");
                if(log.exists())
                    log.delete();
                log.createNewFile();
                PrintStream stream = new PrintStream(log);
                Logger.setOutput(stream);
            } catch (IOException ex) {
                Logger.error("Cannot create log file");
            }

            dataInput.setText((new File(mCurrentDir, "/data")).getPath());
            extractOutputInput.setText((new File(mCurrentDir, "/data")).getPath());
            convertOutputInput.setText((new File(mCurrentDir, "/output")).getPath());
            if ((new File(mCurrentDir, "LICENSED")).exists()) {
                tabbedPane.setEnabled(true);
                tabbedPane.setSelectedIndex(2);
            }
            mSettings = new Properties();
            mSettings.loadFromXML(PSXperiaTool.class.getResourceAsStream("/resources/defaults.xml"));
            setFieldsFromProperties(mSettings);
            mThis = this;
        } catch (IOException ex) {
            Logger.error("Cannot read default settings.");
            ex.printStackTrace();
        }

    }//GEN-LAST:event_formWindowOpened

    private void licenseTextCaretUpdate(javax.swing.event.CaretEvent evt) {//GEN-FIRST:event_licenseTextCaretUpdate
        String selected = licenseText.getSelectedText();
        if (selected != null && selected.endsWith("Yifan Lu")) {
            if (licenseCheck1.isSelected() && licenseCheck2.isSelected() && licenseCheck3.isSelected() & licenseCheck4.isSelected()) {
                tabbedPane.setEnabled(true);
                try {
                    FileOutputStream out = new FileOutputStream(new File(mCurrentDir, "LICENSED"));
                    out.write(1);
                    out.close();
                } catch (IOException ex) {
                    Logger.error("Cannot save license status.");
                    ex.printStackTrace();
                }
            }
        }
    }//GEN-LAST:event_licenseTextCaretUpdate

    private void chooseApkFileActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chooseApkFileActionPerformed
        FILE_CHOOSER.setFileSelectionMode(JFileChooser.FILES_ONLY);
        int returnVal = FILE_CHOOSER.showOpenDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File file = FILE_CHOOSER.getSelectedFile();
            apkFileInput.setText(file.getPath());
        }
    }//GEN-LAST:event_chooseApkFileActionPerformed

    private void chooseZpakFileActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chooseZpakFileActionPerformed
        FILE_CHOOSER.setFileSelectionMode(JFileChooser.FILES_ONLY);
        int returnVal = FILE_CHOOSER.showOpenDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File file = FILE_CHOOSER.getSelectedFile();
            zpakFileInput.setText(file.getPath());
        }
    }//GEN-LAST:event_chooseZpakFileActionPerformed

    private void chooseOutputDirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chooseOutputDirActionPerformed
        FILE_CHOOSER.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int returnVal = FILE_CHOOSER.showOpenDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File file = FILE_CHOOSER.getSelectedFile();
            extractOutputInput.setText(file.getPath());
            dataInput.setText(file.getPath());
        }
    }//GEN-LAST:event_chooseOutputDirActionPerformed

    private void chooseDataActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chooseDataActionPerformed
        FILE_CHOOSER.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int returnVal = FILE_CHOOSER.showOpenDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File file = FILE_CHOOSER.getSelectedFile();
            extractOutputInput.setText(file.getPath());
            dataInput.setText(file.getPath());
        }
    }//GEN-LAST:event_chooseDataActionPerformed

    private void chooseIconActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chooseIconActionPerformed
        FILE_CHOOSER.setFileSelectionMode(JFileChooser.FILES_ONLY);
        int returnVal = FILE_CHOOSER.showOpenDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File file = FILE_CHOOSER.getSelectedFile();
            if (!file.getName().endsWith(".png")) {
                Logger.warning("Invalid PNG image.");
                return;
            }
            try {
                BufferedImage image = ImageIO.read(file);
                iconImagePreview.setIcon(new ImageIcon(image));
                mIconImage = file;
            } catch (IOException ex) {
                Logger.error("Cannot load image!");
                ex.printStackTrace();
            }
        }
    }//GEN-LAST:event_chooseIconActionPerformed

    private void chooseIsoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chooseIsoActionPerformed
        FILE_CHOOSER.setFileSelectionMode(JFileChooser.FILES_ONLY);
        int returnVal = FILE_CHOOSER.showOpenDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File file = FILE_CHOOSER.getSelectedFile();
            isoInput.setText(file.getPath());
        }
    }//GEN-LAST:event_chooseIsoActionPerformed

    private void chooseConvertOutputActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chooseConvertOutputActionPerformed
        FILE_CHOOSER.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int returnVal = FILE_CHOOSER.showOpenDialog(this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File file = FILE_CHOOSER.getSelectedFile();
            convertOutputInput.setText(file.getPath());
        }
    }//GEN-LAST:event_chooseConvertOutputActionPerformed

    private void convertButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_convertButtonActionPerformed
        Runnable run = new Runnable() {
            public void run() {
                try {
                    mThis.setEnabled(false);
                    convertButton.setEnabled(false);
                    CommandLine.verifyTitleID(titleIdInput.getText());
                    setPropertiesFromFields(mSettings);
                    File inputFile = new File(isoInput.getText());
                    File dataDir = new File(dataInput.getText());
                    File outputDir = new File(convertOutputInput.getText());
                    PSXperiaTool tool = new PSXperiaTool(mSettings, inputFile, dataDir, outputDir);
                    ProgressMonitor.ProgressCallback callback = new ProgressMonitor.ProgressCallback() {

                        public void nextStep(String string) {
                            convertStatus.setText(string);
                        }

                        public void stepsTook(int current, int max) {
                            convertProgress.setMaximum(max);
                            convertProgress.setValue(current);
                        }
                    };
                    tool.setCallback(callback);
                    tool.startBuild();
                    convertProgress.setValue(0);
                    convertButton.setEnabled(true);
                    mThis.setEnabled(true);
                } catch (InputMismatchException ex) {
                    Logger.error("Input error: %s", ex.getMessage());
                    ex.printStackTrace();
                } catch (InterruptedException ex) {
                    Logger.error("Cannot run build commands, are \"aapk\" and \"jarsigner\" in your system's PATH variable? Java says: %s", ex.getMessage());
                    ex.printStackTrace();
                } catch (IOException ex) {
                    Logger.error("Cannot build APK! Java says: %s", ex.getMessage());
                    ex.printStackTrace();
                } catch (GeneralSecurityException ex) {
                    Logger.error("Error signing JAR, Java says: %s", ex.getMessage());
                    ex.printStackTrace();
                } catch (SignedJarBuilder.IZipEntryFilter.ZipAbortException ex) {
                    Logger.error("Error signing JAR, Java says: %s", ex.getMessage());
                    ex.printStackTrace();
                } finally {
                    convertProgress.setValue(0);
                    convertButton.setEnabled(true);
                    mThis.setEnabled(true);
                }
            }
        };
        (new Thread(run)).start();
    }//GEN-LAST:event_convertButtonActionPerformed

    private void extractButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_extractButtonActionPerformed
        Runnable run = new Runnable() {
            public void run() {
                try {
                    mThis.setEnabled(false);
                    extractButton.setEnabled(false);
                    File inputApk = new File(apkFileInput.getText());
                    File inputZpak = new File(zpakFileInput.getText());
                    File outputDataDir = new File(extractOutputInput.getText());
                    if (!inputApk.exists()) {
                        Logger.error("Cannot find APK file!");
                        return;
                    }
                    if (!inputZpak.exists()) {
                        Logger.error("Cannot find ZPAK file!");
                        return;
                    }
                    CrashBandicootExtractor extract = new CrashBandicootExtractor(inputApk, inputZpak, outputDataDir);
                    ProgressMonitor.ProgressCallback callback = new ProgressMonitor.ProgressCallback() {

                        public void nextStep(String string) {
                            extractStatus.setText(string);
                        }

                        public void stepsTook(int current, int max) {
                            extractProgress.setMaximum(max);
                            extractProgress.setValue(current);
                        }
                    };
                    extract.setCallback(callback);
                    extract.extractApk();
                    extractProgress.setValue(0);
                    extractButton.setEnabled(true);
                    mThis.setEnabled(true);
                } catch (IOException ex) {
                    Logger.error("Cannot extract APK! Java says %s", ex.getMessage());
                    ex.printStackTrace();
                } catch (UnsupportedOperationException ex) {
                    Logger.error("Unsupported exception: %s", ex.getMessage());
                    ex.printStackTrace();
                } catch (Exception ex) {
                    Logger.error("Exception: %s", ex.getMessage());
                    ex.printStackTrace();
                } finally {
                    extractProgress.setValue(0);
                    extractButton.setEnabled(true);
                    mThis.setEnabled(true);
                }
            }
        };
        (new Thread(run)).start();
    }//GEN-LAST:event_extractButtonActionPerformed

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new GUI().setVisible(true);
            }
        });

    }

    private JFrame mThis;
    private static final JFileChooser FILE_CHOOSER = new JFileChooser();
    private static final File mCurrentDir = new File(new File(".").getAbsolutePath());
    private File mIconImage;
    private Properties mSettings;
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JCheckBox analogModeCheckbox;
    private javax.swing.JTextField apkFileInput;
    private javax.swing.JLabel apkFileLabel;
    private javax.swing.JButton chooseApkFile;
    private javax.swing.JButton chooseConvertOutput;
    private javax.swing.JButton chooseData;
    private javax.swing.JButton chooseIcon;
    private javax.swing.JButton chooseIso;
    private javax.swing.JButton chooseOutputDir;
    private javax.swing.JButton chooseZpakFile;
    private javax.swing.JButton convertButton;
    private javax.swing.JTextField convertOutputInput;
    private javax.swing.JLabel convertOutputLabel;
    private javax.swing.JProgressBar convertProgress;
    private javax.swing.JSeparator convertSeparator;
    private javax.swing.JLabel convertStatus;
    private javax.swing.JPanel createPanel;
    private javax.swing.JTextField dataInput;
    private javax.swing.JLabel dataLabel;
    private javax.swing.JLabel descriptionLabel;
    private javax.swing.JTextArea descriptionTextInput;
    private javax.swing.JScrollPane descriptionTextPane;
    private javax.swing.JTextField developerInput;
    private javax.swing.JLabel developerLabel;
    private javax.swing.JButton extractButton;
    private javax.swing.JLabel extractInformation;
    private javax.swing.JTextField extractOutputInput;
    private javax.swing.JLabel extractOutputLabel;
    private javax.swing.JPanel extractPanel;
    private javax.swing.JProgressBar extractProgress;
    private javax.swing.JLabel extractStatus;
    private javax.swing.JLabel gameInformationLabel;
    private javax.swing.JButton getTitleIdButton;
    private javax.swing.JLabel iconImagePreview;
    private javax.swing.JPanel informationPanel;
    private javax.swing.JTextField isoInput;
    private javax.swing.JLabel isoLabel;
    private javax.swing.JCheckBox licenseCheck1;
    private javax.swing.JCheckBox licenseCheck2;
    private javax.swing.JCheckBox licenseCheck3;
    private javax.swing.JCheckBox licenseCheck4;
    private javax.swing.JTextArea licenseText;
    private javax.swing.JButton loadXmlButton;
    private javax.swing.JTextField nameInput;
    private javax.swing.JLabel nameLabel;
    private javax.swing.JTextField parentalRatingInput;
    private javax.swing.JLabel parentalRatingLabel;
    private javax.swing.JTextField publisherInput;
    private javax.swing.JLabel publisherLabel;
    private javax.swing.JTextField storeTypeInput;
    private javax.swing.JLabel storeTypeLabel;
    private javax.swing.JTabbedPane tabbedPane;
    private javax.swing.JScrollPane textScrollPane;
    private javax.swing.JTextField titleIdInput;
    private javax.swing.JLabel titleIdLabel;
    private javax.swing.JTextField zpakFileInput;
    private javax.swing.JLabel zpakFileLabel;
    // End of variables declaration//GEN-END:variables
}
TOP

Related Classes of com.yifanlu.PSXperiaTool.Interface.GUI

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.