/* ** 2012 May 27 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: ** May you do good and not evil. ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. */ package info.ata4.bspinfo.gui; import info.ata4.bspinfo.gui.models.EmbeddedTableModel; import info.ata4.bspinfo.gui.models.EntityTableModel; import info.ata4.bspinfo.gui.models.GameLumpTableModel; import info.ata4.bspinfo.gui.models.LumpTableModel; import info.ata4.bsplib.BspFile; import info.ata4.bsplib.BspFileFilter; import info.ata4.bsplib.BspFileReader; import info.ata4.bsplib.app.SourceApp; import info.ata4.bsplib.entity.Entity; import info.ata4.bsplib.lump.LumpType; import info.ata4.bsplib.struct.BspData; import info.ata4.bspsrc.BspSource; import info.ata4.bspsrc.modules.BspChecksum; import info.ata4.bspsrc.modules.BspCompileParams; import info.ata4.bspsrc.modules.BspDependencies; import info.ata4.bspsrc.modules.BspProtection; import info.ata4.bspsrc.modules.texture.TextureSource; import info.ata4.log.DialogHandler; import info.ata4.log.LogUtils; import info.ata4.util.gui.FileDrop; import info.ata4.util.gui.FileExtensionFilter; import info.ata4.util.gui.components.ByteSizeCellRenderer; import info.ata4.util.gui.components.DecimalFormatCellRenderer; import info.ata4.util.gui.components.ProgressCellRenderer; import java.awt.Cursor; import java.awt.Image; import java.awt.Toolkit; import java.io.File; import java.io.IOException; import java.net.URI; import java.net.URL; import java.nio.ByteOrder; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.*; import javax.swing.table.TableColumnModel; import javax.swing.table.TableModel; import org.apache.commons.lang3.StringUtils; /** * * @author Nico Bergemann <barracuda415 at yahoo.de> */ public class BspInfoFrame extends javax.swing.JFrame { private static final Logger L = LogUtils.getLogger(); public static final String NAME = "BSPInfo"; public static final String VERSION = BspSource.VERSION; private File currentFile; private BspFile bspFile; private BspFileReader bspReader; private FileDrop fdrop; /** * @param args the command line arguments */ public static void main(String args[]) { LogUtils.configure(); // set the system look and feel try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception ex) { L.warning("Failed to set SystemLookAndFeel"); } // create and display the form java.awt.EventQueue.invokeLater(new Runnable() { @Override public void run() { new BspInfoFrame().setVisible(true); } }); } /** * Creates new form BspToolFrame */ public BspInfoFrame() { initComponents(); initComponentsCustom(); // init file dropper fdrop = new FileDrop(this, new FileDrop.Listener() { @Override public void filesDropped(File[] files) { java.io.FileFilter filter = new BspFileFilter(); if (filter.accept(files[0])) { loadFile(files[0]); } } }); // add dialog log handler L.addHandler(new DialogHandler(this)); } public final void reset() { // general textFieldName.setText(null); textFieldVersion.setText(null); textFieldRevision.setText(null); textFieldCompressed.setText(null); textFieldEndian.setText(null); textFieldAppID.setText(null); textFieldGame.setText(null); linkLabelAppURL.setText(null); textFieldFileCRC.setText(null); textFieldMapCRC.setText(null); textFieldVbspParams.setText(null); textFieldVvisParams.setText(null); textFieldVradParams.setText(null); // protection checkBoxVmexEntity.setSelected(false); checkBoxVmexTexture.setSelected(false); checkBoxVmexBrush.setSelected(false); checkBoxIIDObfs.setSelected(false); checkBoxIIDTexHack.setSelected(false); checkBoxBSPProtect.setSelected(false); // lumps tableLumps.setModel(new LumpTableModel()); // entities textFieldTotalEnts.setText(null); textFieldBrushEnts.setText(null); textFieldPointEnts.setText(null); tableEntities.setModel(new EntityTableModel()); // dependencies textAreaMaterials.setText(null); textAreaSounds.setText(null); textAreaSoundScripts.setText(null); textAreaSoundscapes.setText(null); textAreaModels.setText(null); textAreaParticles.setText(null); // embedded files tableEmbedded.setModel(new EmbeddedTableModel()); // disable buttons extractLumpButton.setEnabled(false); extractAllLumpsButton.setEnabled(false); extractGameLumpButton.setEnabled(false); extractAllGameLumpsButton.setEnabled(false); extractEmbeddedButton.setEnabled(false); extractAllEmbeddedButton.setEnabled(false); extractEmbeddedZipButton.setEnabled(false); } public void loadFile(File file) { currentFile = file; setTitle(NAME + " " + VERSION + " - " + file.getName()); new Thread(new Runnable() { @Override public void run() { // clear form fields reset(); // set waiting cursor setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); try { // load BSP file bspFile = new BspFile(); bspFile.load(currentFile.toPath()); boolean compressed = bspFile.isCompressed(); bspReader = new BspFileReader(bspFile); bspReader.loadEntities(); BspData data = bspReader.getData(); // general textFieldName.setText(bspFile.getName()); textFieldVersion.setText(String.valueOf(bspFile.getVersion())); textFieldRevision.setText(String.valueOf(bspFile.getRevision())); textFieldCompressed.setText(compressed ? "Yes" : "No"); textFieldEndian.setText(bspFile.getByteOrder() == ByteOrder.LITTLE_ENDIAN ? "Little endian" : "Big endian"); if (data.entities != null && !data.entities.isEmpty()) { Entity worldspawn = data.entities.get(0); textFieldComment.setText(worldspawn.getValue("comment")); } SourceApp app = bspFile.getSourceApp(); textFieldAppID.setText(app.getAppID() > 0 ? String.valueOf(app.getAppID()) : "n/a"); textFieldGame.setText(app.getName()); URI steamStoreURI = app.getSteamStoreURI(); if (steamStoreURI != null) { linkLabelAppURL.setURI("Steam store link", steamStoreURI); } BspCompileParams cparams = new BspCompileParams(bspReader); textFieldVbspParams.setText(StringUtils.join(cparams.getVbspParams(), ' ')); if (cparams.isVvisRun()) { textFieldVvisParams.setText(StringUtils.join(cparams.getVvisParams(), ' ')); } else { textFieldVvisParams.setText("(not run)"); } if (cparams.isVradRun()) { textFieldVradParams.setText(StringUtils.join(cparams.getVradParams(), ' ')); } else { textFieldVradParams.setText("(not run)"); } // protection TextureSource texsrc = new TextureSource(bspReader); BspProtection prot = new BspProtection(bspReader, texsrc); prot.check(); checkBoxVmexEntity.setSelected(prot.hasEntityFlag()); checkBoxVmexTexture.setSelected(prot.hasTextureFlag()); checkBoxVmexBrush.setSelected(prot.hasBrushFlag()); checkBoxIIDObfs.setSelected(prot.hasObfuscatedEntities()); checkBoxIIDTexHack.setSelected(prot.hasModifiedTexinfo()); checkBoxBSPProtect.setSelected(prot.hasEncryptedEntities()); // lumps tableLumps.setModel(new LumpTableModel(bspFile)); // game lumps tableGameLumps.setModel(new GameLumpTableModel(bspFile)); // entities int brushEnts = 0; int pointEnts = 0; List<Entity> entities = bspReader.getData().entities; for (Entity ent : entities) { if (ent.getModelNum() > 0) { brushEnts++; } else { pointEnts++; } } int totalEnts = pointEnts + brushEnts; DecimalFormat df = new DecimalFormat("#,##0"); textFieldTotalEnts.setText(df.format(totalEnts)); textFieldBrushEnts.setText(df.format(brushEnts)); textFieldPointEnts.setText(df.format(pointEnts)); tableEntities.setModel(new EntityTableModel(bspReader)); // dependencies BspDependencies bspres = new BspDependencies(bspReader); fillTextArea(textAreaMaterials, bspres.getMaterials()); fillTextArea(textAreaSounds, bspres.getSoundFiles()); fillTextArea(textAreaSoundScripts, bspres.getSoundScripts()); fillTextArea(textAreaSoundscapes, bspres.getSoundscapes()); fillTextArea(textAreaModels, bspres.getModels()); fillTextArea(textAreaParticles, bspres.getParticles()); // embedded files tableEmbedded.setModel(new EmbeddedTableModel(bspFile)); // checksum (last step, takes most time) BspChecksum checksum = new BspChecksum(bspReader); textFieldFileCRC.setText(String.format("%x", checksum.getFileCRC())); textFieldMapCRC.setText(String.format("%x", checksum.getMapCRC())); // enable buttons extractLumpButton.setEnabled(true); extractAllLumpsButton.setEnabled(true); extractGameLumpButton.setEnabled(true); extractAllGameLumpsButton.setEnabled(true); extractEmbeddedButton.setEnabled(true); extractAllEmbeddedButton.setEnabled(true); extractEmbeddedZipButton.setEnabled(true); } catch (Exception ex) { L.log(Level.SEVERE, "Couldn't read BSP file", ex); } finally { // free previously opened files and resources System.gc(); // reset cursor setCursor(Cursor.getDefaultCursor()); } } }).start(); } private void fillTextArea(JTextArea textArea, Collection<String> strings) { for (String string : strings) { textArea.append(string); textArea.append("\n"); } } /** * 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() { openFileChooser = new javax.swing.JFileChooser(); saveDirectoryChooser = new javax.swing.JFileChooser(); saveZipFileChooser = new javax.swing.JFileChooser(); tabbedPane = new javax.swing.JTabbedPane(); panelGeneral = new javax.swing.JPanel(); panelGame = new javax.swing.JPanel(); linkLabelAppURL = new info.ata4.util.gui.components.URILabel(); textFieldAppID = new javax.swing.JTextField(); textFieldGame = new javax.swing.JTextField(); labelAppID = new javax.swing.JLabel(); labelGame = new javax.swing.JLabel(); panelHeaders = new javax.swing.JPanel(); textFieldEndian = new javax.swing.JTextField(); textFieldCompressed = new javax.swing.JTextField(); labelEndian = new javax.swing.JLabel(); labelCompressed = new javax.swing.JLabel(); textFieldVersion = new javax.swing.JTextField(); labelVersion = new javax.swing.JLabel(); textFieldName = new javax.swing.JTextField(); labelName = new javax.swing.JLabel(); textFieldRevision = new javax.swing.JTextField(); labelRevision = new javax.swing.JLabel(); labelComment = new javax.swing.JLabel(); textFieldComment = new javax.swing.JTextField(); panelChecksums = new javax.swing.JPanel(); labelFileCRC = new javax.swing.JLabel(); textFieldFileCRC = new javax.swing.JTextField(); labelMapCRC = new javax.swing.JLabel(); textFieldMapCRC = new javax.swing.JTextField(); panelCompileParams = new javax.swing.JPanel(); labelVbsp = new javax.swing.JLabel(); textFieldVbspParams = new javax.swing.JTextField(); labelVvis = new javax.swing.JLabel(); textFieldVvisParams = new javax.swing.JTextField(); labelVrad = new javax.swing.JLabel(); textFieldVradParams = new javax.swing.JTextField(); panelLumps = new javax.swing.JPanel(); scrollPaneLumps = new javax.swing.JScrollPane(); tableLumps = new javax.swing.JTable(); extractLumpButton = new javax.swing.JButton(); extractAllLumpsButton = new javax.swing.JButton(); panelGameLumps = new javax.swing.JPanel(); scrollPaneGameLumps = new javax.swing.JScrollPane(); tableGameLumps = new javax.swing.JTable(); extractGameLumpButton = new javax.swing.JButton(); extractAllGameLumpsButton = new javax.swing.JButton(); panelEntities = new javax.swing.JPanel(); jLabel3 = new javax.swing.JLabel(); textFieldPointEnts = new javax.swing.JTextField(); jLabel2 = new javax.swing.JLabel(); textFieldBrushEnts = new javax.swing.JTextField(); textFieldTotalEnts = new javax.swing.JTextField(); jLabel1 = new javax.swing.JLabel(); jScrollPane1 = new javax.swing.JScrollPane(); tableEntities = new javax.swing.JTable(); tabbedPaneDependencies = new javax.swing.JTabbedPane(); scrollPaneMaterials = new javax.swing.JScrollPane(); textAreaMaterials = new javax.swing.JTextArea(); scrollPaneSounds = new javax.swing.JScrollPane(); textAreaSounds = new javax.swing.JTextArea(); scrollPaneSoundScripts = new javax.swing.JScrollPane(); textAreaSoundScripts = new javax.swing.JTextArea(); scrollPaneSoundscapes = new javax.swing.JScrollPane(); textAreaSoundscapes = new javax.swing.JTextArea(); scrollPaneModels = new javax.swing.JScrollPane(); textAreaModels = new javax.swing.JTextArea(); scrollPaneParticles = new javax.swing.JScrollPane(); textAreaParticles = new javax.swing.JTextArea(); panelEmbedded = new javax.swing.JPanel(); scrollPaneEmbedded = new javax.swing.JScrollPane(); tableEmbedded = new javax.swing.JTable(); extractEmbeddedButton = new javax.swing.JButton(); extractAllEmbeddedButton = new javax.swing.JButton(); extractEmbeddedZipButton = new javax.swing.JButton(); panelProt = new javax.swing.JPanel(); panelVmex = new javax.swing.JPanel(); checkBoxVmexEntity = new info.ata4.util.gui.components.ReadOnlyCheckBox(); checkBoxVmexTexture = new info.ata4.util.gui.components.ReadOnlyCheckBox(); checkBoxVmexBrush = new info.ata4.util.gui.components.ReadOnlyCheckBox(); panelIID = new javax.swing.JPanel(); checkBoxIIDObfs = new info.ata4.util.gui.components.ReadOnlyCheckBox(); checkBoxIIDTexHack = new info.ata4.util.gui.components.ReadOnlyCheckBox(); panelOther = new javax.swing.JPanel(); checkBoxBSPProtect = new info.ata4.util.gui.components.ReadOnlyCheckBox(); menuBar = new javax.swing.JMenuBar(); menuFile = new javax.swing.JMenu(); openFileMenuItem = new javax.swing.JMenuItem(); openFileChooser.setFileFilter(new FileExtensionFilter("Source engine map file", "bsp")); saveDirectoryChooser.setDialogType(javax.swing.JFileChooser.SAVE_DIALOG); saveDirectoryChooser.setFileSelectionMode(javax.swing.JFileChooser.DIRECTORIES_ONLY); saveZipFileChooser.setAcceptAllFileFilterUsed(false); saveZipFileChooser.setDialogType(javax.swing.JFileChooser.SAVE_DIALOG); saveZipFileChooser.setFileFilter(new FileExtensionFilter("Zip file", "zip")); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); panelGame.setBorder(javax.swing.BorderFactory.createTitledBorder("Game")); linkLabelAppURL.setHorizontalAlignment(javax.swing.SwingConstants.LEFT); linkLabelAppURL.setText(" "); textFieldAppID.setEditable(false); textFieldGame.setEditable(false); labelAppID.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); labelAppID.setText("App-ID"); labelGame.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); labelGame.setText("Name"); javax.swing.GroupLayout panelGameLayout = new javax.swing.GroupLayout(panelGame); panelGame.setLayout(panelGameLayout); panelGameLayout.setHorizontalGroup( panelGameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelGameLayout.createSequentialGroup() .addContainerGap() .addGroup(panelGameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(labelGame) .addComponent(labelAppID)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(panelGameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelGameLayout.createSequentialGroup() .addComponent(textFieldAppID, javax.swing.GroupLayout.PREFERRED_SIZE, 57, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(linkLabelAppURL, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addComponent(textFieldGame)) .addContainerGap()) ); panelGameLayout.setVerticalGroup( panelGameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelGameLayout.createSequentialGroup() .addContainerGap() .addGroup(panelGameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(labelGame) .addComponent(textFieldGame, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(panelGameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(labelAppID) .addComponent(textFieldAppID, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(linkLabelAppURL, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); panelHeaders.setBorder(javax.swing.BorderFactory.createTitledBorder("Headers")); textFieldEndian.setEditable(false); textFieldCompressed.setEditable(false); labelEndian.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); labelEndian.setText("Endianness"); labelCompressed.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); labelCompressed.setText("Compressed"); textFieldVersion.setEditable(false); textFieldVersion.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { textFieldVersionActionPerformed(evt); } }); labelVersion.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); labelVersion.setText("Version"); textFieldName.setEditable(false); labelName.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); labelName.setText("Name"); textFieldRevision.setEditable(false); labelRevision.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); labelRevision.setText("Revision"); labelComment.setText("Comment"); textFieldComment.setEditable(false); javax.swing.GroupLayout panelHeadersLayout = new javax.swing.GroupLayout(panelHeaders); panelHeaders.setLayout(panelHeadersLayout); panelHeadersLayout.setHorizontalGroup( panelHeadersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelHeadersLayout.createSequentialGroup() .addContainerGap() .addGroup(panelHeadersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelHeadersLayout.createSequentialGroup() .addGroup(panelHeadersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(labelComment) .addComponent(labelCompressed)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(panelHeadersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelHeadersLayout.createSequentialGroup() .addComponent(textFieldCompressed, javax.swing.GroupLayout.PREFERRED_SIZE, 39, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(22, 22, 22) .addComponent(labelEndian) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(textFieldEndian)) .addComponent(textFieldComment))) .addGroup(panelHeadersLayout.createSequentialGroup() .addGap(25, 25, 25) .addGroup(panelHeadersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(labelName) .addComponent(labelVersion)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(panelHeadersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelHeadersLayout.createSequentialGroup() .addComponent(textFieldVersion, javax.swing.GroupLayout.PREFERRED_SIZE, 38, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(36, 36, 36) .addComponent(labelRevision) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(textFieldRevision)) .addComponent(textFieldName)))) .addContainerGap()) ); panelHeadersLayout.setVerticalGroup( panelHeadersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelHeadersLayout.createSequentialGroup() .addContainerGap() .addGroup(panelHeadersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(labelName) .addComponent(textFieldName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(panelHeadersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(labelVersion) .addComponent(textFieldVersion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(labelRevision) .addComponent(textFieldRevision, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(panelHeadersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(labelCompressed) .addComponent(textFieldCompressed, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(labelEndian) .addComponent(textFieldEndian, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(panelHeadersLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(labelComment) .addComponent(textFieldComment, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); panelChecksums.setBorder(javax.swing.BorderFactory.createTitledBorder("Checksums")); labelFileCRC.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); labelFileCRC.setText("File CRC"); labelFileCRC.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT); textFieldFileCRC.setEditable(false); labelMapCRC.setText("Map CRC"); textFieldMapCRC.setEditable(false); javax.swing.GroupLayout panelChecksumsLayout = new javax.swing.GroupLayout(panelChecksums); panelChecksums.setLayout(panelChecksumsLayout); panelChecksumsLayout.setHorizontalGroup( panelChecksumsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelChecksumsLayout.createSequentialGroup() .addContainerGap() .addComponent(labelFileCRC) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(textFieldFileCRC, javax.swing.GroupLayout.PREFERRED_SIZE, 66, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(labelMapCRC) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(textFieldMapCRC, javax.swing.GroupLayout.PREFERRED_SIZE, 66, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(37, Short.MAX_VALUE)) ); panelChecksumsLayout.setVerticalGroup( panelChecksumsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelChecksumsLayout.createSequentialGroup() .addContainerGap() .addGroup(panelChecksumsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelChecksumsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(labelMapCRC) .addComponent(textFieldMapCRC, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(panelChecksumsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(labelFileCRC) .addComponent(textFieldFileCRC, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); panelCompileParams.setBorder(javax.swing.BorderFactory.createTitledBorder("Detected compile parameters")); labelVbsp.setText("vbsp"); textFieldVbspParams.setEditable(false); labelVvis.setText("vvis"); textFieldVvisParams.setEditable(false); labelVrad.setText("vrad"); textFieldVradParams.setEditable(false); javax.swing.GroupLayout panelCompileParamsLayout = new javax.swing.GroupLayout(panelCompileParams); panelCompileParams.setLayout(panelCompileParamsLayout); panelCompileParamsLayout.setHorizontalGroup( panelCompileParamsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelCompileParamsLayout.createSequentialGroup() .addGap(20, 20, 20) .addGroup(panelCompileParamsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addComponent(labelVrad) .addComponent(labelVbsp) .addComponent(labelVvis)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addGroup(panelCompileParamsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(textFieldVradParams) .addComponent(textFieldVvisParams) .addComponent(textFieldVbspParams)) .addContainerGap()) ); panelCompileParamsLayout.setVerticalGroup( panelCompileParamsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelCompileParamsLayout.createSequentialGroup() .addContainerGap() .addGroup(panelCompileParamsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(labelVbsp) .addComponent(textFieldVbspParams, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(panelCompileParamsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(textFieldVvisParams, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(labelVvis)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(panelCompileParamsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(labelVrad) .addComponent(textFieldVradParams, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); javax.swing.GroupLayout panelGeneralLayout = new javax.swing.GroupLayout(panelGeneral); panelGeneral.setLayout(panelGeneralLayout); panelGeneralLayout.setHorizontalGroup( panelGeneralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelGeneralLayout.createSequentialGroup() .addContainerGap() .addGroup(panelGeneralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(panelHeaders, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(panelGame, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(panelChecksums, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(panelCompileParams, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) ); panelGeneralLayout.setVerticalGroup( panelGeneralLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelGeneralLayout.createSequentialGroup() .addContainerGap() .addComponent(panelHeaders, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(panelGame, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(panelChecksums, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(panelCompileParams, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(18, Short.MAX_VALUE)) ); tabbedPane.addTab("General", panelGeneral); tableLumps.setAutoCreateRowSorter(true); tableLumps.setModel(new LumpTableModel()); tableLumps.getTableHeader().setReorderingAllowed(false); scrollPaneLumps.setViewportView(tableLumps); extractLumpButton.setText("Extract"); extractLumpButton.setEnabled(false); extractLumpButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { extractLumpButtonActionPerformed(evt); } }); extractAllLumpsButton.setText("Extract all"); extractAllLumpsButton.setEnabled(false); extractAllLumpsButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { extractAllLumpsButtonActionPerformed(evt); } }); javax.swing.GroupLayout panelLumpsLayout = new javax.swing.GroupLayout(panelLumps); panelLumps.setLayout(panelLumpsLayout); panelLumpsLayout.setHorizontalGroup( panelLumpsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelLumpsLayout.createSequentialGroup() .addContainerGap() .addGroup(panelLumpsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(scrollPaneLumps, javax.swing.GroupLayout.DEFAULT_SIZE, 305, Short.MAX_VALUE) .addGroup(panelLumpsLayout.createSequentialGroup() .addComponent(extractLumpButton) .addGap(18, 18, 18) .addComponent(extractAllLumpsButton) .addGap(0, 0, Short.MAX_VALUE))) .addContainerGap()) ); panelLumpsLayout.setVerticalGroup( panelLumpsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelLumpsLayout.createSequentialGroup() .addContainerGap() .addComponent(scrollPaneLumps, javax.swing.GroupLayout.DEFAULT_SIZE, 412, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(panelLumpsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(extractLumpButton) .addComponent(extractAllLumpsButton)) .addContainerGap()) ); tabbedPane.addTab("Lumps", panelLumps); tableGameLumps.setAutoCreateRowSorter(true); tableGameLumps.setModel(new GameLumpTableModel()); tableGameLumps.getTableHeader().setReorderingAllowed(false); scrollPaneGameLumps.setViewportView(tableGameLumps); extractGameLumpButton.setText("Extract"); extractGameLumpButton.setEnabled(false); extractGameLumpButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { extractGameLumpButtonActionPerformed(evt); } }); extractAllGameLumpsButton.setText("Extract all"); extractAllGameLumpsButton.setEnabled(false); extractAllGameLumpsButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { extractAllGameLumpsButtonActionPerformed(evt); } }); javax.swing.GroupLayout panelGameLumpsLayout = new javax.swing.GroupLayout(panelGameLumps); panelGameLumps.setLayout(panelGameLumpsLayout); panelGameLumpsLayout.setHorizontalGroup( panelGameLumpsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelGameLumpsLayout.createSequentialGroup() .addContainerGap() .addGroup(panelGameLumpsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(scrollPaneGameLumps, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE) .addGroup(panelGameLumpsLayout.createSequentialGroup() .addComponent(extractGameLumpButton) .addGap(18, 18, 18) .addComponent(extractAllGameLumpsButton) .addGap(0, 139, Short.MAX_VALUE))) .addContainerGap()) ); panelGameLumpsLayout.setVerticalGroup( panelGameLumpsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelGameLumpsLayout.createSequentialGroup() .addContainerGap() .addComponent(scrollPaneGameLumps, javax.swing.GroupLayout.DEFAULT_SIZE, 412, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(panelGameLumpsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(extractGameLumpButton) .addComponent(extractAllGameLumpsButton)) .addContainerGap()) ); tabbedPane.addTab("Game lumps", panelGameLumps); jLabel3.setText("Point"); textFieldPointEnts.setEditable(false); jLabel2.setText("Brush"); textFieldBrushEnts.setEditable(false); textFieldTotalEnts.setEditable(false); jLabel1.setText("Total"); tableEntities.setAutoCreateRowSorter(true); tableEntities.setModel(new EntityTableModel()); jScrollPane1.setViewportView(tableEntities); javax.swing.GroupLayout panelEntitiesLayout = new javax.swing.GroupLayout(panelEntities); panelEntities.setLayout(panelEntitiesLayout); panelEntitiesLayout.setHorizontalGroup( panelEntitiesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelEntitiesLayout.createSequentialGroup() .addContainerGap() .addGroup(panelEntitiesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelEntitiesLayout.createSequentialGroup() .addComponent(jLabel3) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(textFieldPointEnts, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(textFieldBrushEnts, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(textFieldTotalEnts, javax.swing.GroupLayout.PREFERRED_SIZE, 60, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, Short.MAX_VALUE)) .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)) .addContainerGap()) ); panelEntitiesLayout.setVerticalGroup( panelEntitiesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelEntitiesLayout.createSequentialGroup() .addContainerGap() .addGroup(panelEntitiesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel3) .addComponent(textFieldPointEnts, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel2) .addComponent(textFieldBrushEnts, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel1) .addComponent(textFieldTotalEnts, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 410, Short.MAX_VALUE) .addContainerGap()) ); tabbedPane.addTab("Entities", panelEntities); textAreaMaterials.setColumns(20); textAreaMaterials.setEditable(false); textAreaMaterials.setFont(new java.awt.Font("Monospaced", 0, 12)); // NOI18N textAreaMaterials.setRows(5); scrollPaneMaterials.setViewportView(textAreaMaterials); tabbedPaneDependencies.addTab("Materials", scrollPaneMaterials); textAreaSounds.setColumns(20); textAreaSounds.setFont(new java.awt.Font("Monospaced", 0, 12)); // NOI18N textAreaSounds.setRows(5); scrollPaneSounds.setViewportView(textAreaSounds); tabbedPaneDependencies.addTab("Sounds", scrollPaneSounds); textAreaSoundScripts.setColumns(20); textAreaSoundScripts.setFont(new java.awt.Font("Monospaced", 0, 12)); // NOI18N textAreaSoundScripts.setRows(5); scrollPaneSoundScripts.setViewportView(textAreaSoundScripts); tabbedPaneDependencies.addTab("Sound scripts", scrollPaneSoundScripts); textAreaSoundscapes.setColumns(20); textAreaSoundscapes.setFont(new java.awt.Font("Monospaced", 0, 12)); // NOI18N textAreaSoundscapes.setRows(5); scrollPaneSoundscapes.setViewportView(textAreaSoundscapes); tabbedPaneDependencies.addTab("Soundscapes", scrollPaneSoundscapes); textAreaModels.setColumns(20); textAreaModels.setFont(new java.awt.Font("Monospaced", 0, 12)); // NOI18N textAreaModels.setRows(5); scrollPaneModels.setViewportView(textAreaModels); tabbedPaneDependencies.addTab("Models", scrollPaneModels); textAreaParticles.setColumns(20); textAreaParticles.setFont(new java.awt.Font("Monospaced", 0, 12)); // NOI18N textAreaParticles.setRows(5); scrollPaneParticles.setViewportView(textAreaParticles); tabbedPaneDependencies.addTab("Particles", scrollPaneParticles); tabbedPane.addTab("Dependencies", tabbedPaneDependencies); tableEmbedded.setAutoCreateRowSorter(true); tableEmbedded.setModel(new EmbeddedTableModel()); tableEmbedded.setSelectionMode(javax.swing.ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); scrollPaneEmbedded.setViewportView(tableEmbedded); extractEmbeddedButton.setText("Extract"); extractEmbeddedButton.setEnabled(false); extractEmbeddedButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { extractEmbeddedButtonActionPerformed(evt); } }); extractAllEmbeddedButton.setText("Extract all"); extractAllEmbeddedButton.setEnabled(false); extractAllEmbeddedButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { extractAllEmbeddedButtonActionPerformed(evt); } }); extractEmbeddedZipButton.setText("Extract Zip file"); extractEmbeddedZipButton.setEnabled(false); extractEmbeddedZipButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { extractEmbeddedZipButtonActionPerformed(evt); } }); javax.swing.GroupLayout panelEmbeddedLayout = new javax.swing.GroupLayout(panelEmbedded); panelEmbedded.setLayout(panelEmbeddedLayout); panelEmbeddedLayout.setHorizontalGroup( panelEmbeddedLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelEmbeddedLayout.createSequentialGroup() .addContainerGap() .addGroup(panelEmbeddedLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(scrollPaneEmbedded, javax.swing.GroupLayout.DEFAULT_SIZE, 305, Short.MAX_VALUE) .addGroup(panelEmbeddedLayout.createSequentialGroup() .addComponent(extractEmbeddedButton) .addGap(18, 18, 18) .addComponent(extractAllEmbeddedButton) .addGap(18, 18, 18) .addComponent(extractEmbeddedZipButton) .addGap(0, 0, Short.MAX_VALUE))) .addContainerGap()) ); panelEmbeddedLayout.setVerticalGroup( panelEmbeddedLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelEmbeddedLayout.createSequentialGroup() .addContainerGap() .addComponent(scrollPaneEmbedded, javax.swing.GroupLayout.DEFAULT_SIZE, 412, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(panelEmbeddedLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(extractEmbeddedButton) .addComponent(extractAllEmbeddedButton) .addComponent(extractEmbeddedZipButton)) .addContainerGap()) ); tabbedPane.addTab("Embedded files", panelEmbedded); panelVmex.setBorder(javax.swing.BorderFactory.createTitledBorder("VMEX")); checkBoxVmexEntity.setText("Entity flag"); checkBoxVmexEntity.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT); checkBoxVmexEntity.setIconTextGap(6); checkBoxVmexTexture.setText("Texture flag"); checkBoxVmexTexture.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT); checkBoxVmexTexture.setIconTextGap(6); checkBoxVmexBrush.setText("Protector brush"); checkBoxVmexBrush.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT); checkBoxVmexBrush.setIconTextGap(6); javax.swing.GroupLayout panelVmexLayout = new javax.swing.GroupLayout(panelVmex); panelVmex.setLayout(panelVmexLayout); panelVmexLayout.setHorizontalGroup( panelVmexLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelVmexLayout.createSequentialGroup() .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(panelVmexLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(checkBoxVmexBrush, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(checkBoxVmexTexture, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(checkBoxVmexEntity, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap()) ); panelVmexLayout.setVerticalGroup( panelVmexLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelVmexLayout.createSequentialGroup() .addComponent(checkBoxVmexEntity, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(checkBoxVmexTexture, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(checkBoxVmexBrush, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) ); panelIID.setBorder(javax.swing.BorderFactory.createTitledBorder("IID")); checkBoxIIDObfs.setText("Entity obfuscation"); checkBoxIIDObfs.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT); checkBoxIIDObfs.setIconTextGap(6); checkBoxIIDTexHack.setText("Nodraw texture hack"); checkBoxIIDTexHack.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT); checkBoxIIDTexHack.setIconTextGap(6); javax.swing.GroupLayout panelIIDLayout = new javax.swing.GroupLayout(panelIID); panelIID.setLayout(panelIIDLayout); panelIIDLayout.setHorizontalGroup( panelIIDLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelIIDLayout.createSequentialGroup() .addContainerGap(17, Short.MAX_VALUE) .addGroup(panelIIDLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(checkBoxIIDTexHack, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(checkBoxIIDObfs, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addContainerGap()) ); panelIIDLayout.setVerticalGroup( panelIIDLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelIIDLayout.createSequentialGroup() .addComponent(checkBoxIIDObfs, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(checkBoxIIDTexHack, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) ); panelOther.setBorder(javax.swing.BorderFactory.createTitledBorder("Other")); checkBoxBSPProtect.setText("BSPProtect"); checkBoxBSPProtect.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT); checkBoxBSPProtect.setIconTextGap(6); javax.swing.GroupLayout panelOtherLayout = new javax.swing.GroupLayout(panelOther); panelOther.setLayout(panelOtherLayout); panelOtherLayout.setHorizontalGroup( panelOtherLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelOtherLayout.createSequentialGroup() .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(checkBoxBSPProtect, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap()) ); panelOtherLayout.setVerticalGroup( panelOtherLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(checkBoxBSPProtect, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) ); javax.swing.GroupLayout panelProtLayout = new javax.swing.GroupLayout(panelProt); panelProt.setLayout(panelProtLayout); panelProtLayout.setHorizontalGroup( panelProtLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelProtLayout.createSequentialGroup() .addContainerGap() .addGroup(panelProtLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addComponent(panelVmex, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(panelIID, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(panelOther, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap(151, Short.MAX_VALUE)) ); panelProtLayout.setVerticalGroup( panelProtLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(panelProtLayout.createSequentialGroup() .addContainerGap() .addComponent(panelVmex, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(panelIID, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(panelOther, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(233, Short.MAX_VALUE)) ); tabbedPane.addTab("Protection", panelProt); menuFile.setText("File"); openFileMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.CTRL_MASK)); openFileMenuItem.setText("Open"); openFileMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { openFileMenuItemActionPerformed(evt); } }); menuFile.add(openFileMenuItem); menuBar.add(menuFile); setJMenuBar(menuBar); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(tabbedPane) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(tabbedPane) .addContainerGap()) ); pack(); }// </editor-fold>//GEN-END:initComponents private void initComponentsCustom() { // add version to title setTitle(NAME + " " + VERSION); // instant awesome, just add icons! try { URL iconUrl = getClass().getResource("resources/icon.png"); Image icon = Toolkit.getDefaultToolkit().createImage(iconUrl); setIconImage(icon); } catch (Exception ex) { // meh, don't care } DecimalFormat largeFormat = new DecimalFormat("#,##0"); // set table column widths and special renderers TableColumnModel tcm; // lump table tcm = tableLumps.getColumnModel(); tcm.getColumn(0).setPreferredWidth(30); tcm.getColumn(1).setPreferredWidth(150); tcm.getColumn(4).setPreferredWidth(40); tcm.getColumn(2).setCellRenderer(new ByteSizeCellRenderer(false)); tcm.getColumn(3).setCellRenderer(new ProgressCellRenderer()); tableLumps.setAutoCreateColumnsFromModel(false); // game lump table tcm = tableGameLumps.getColumnModel(); tcm.getColumn(0).setPreferredWidth(30); tcm.getColumn(3).setPreferredWidth(40); tcm.getColumn(1).setCellRenderer(new ByteSizeCellRenderer(false)); tcm.getColumn(2).setCellRenderer(new ProgressCellRenderer()); tableGameLumps.setAutoCreateColumnsFromModel(false); // entity table tcm = tableEntities.getColumnModel(); tcm.getColumn(0).setPreferredWidth(250); tcm.getColumn(1).setPreferredWidth(50); tcm.getColumn(1).setCellRenderer(new DecimalFormatCellRenderer(largeFormat)); tableEntities.setAutoCreateColumnsFromModel(false); // embedded table tcm = tableEmbedded.getColumnModel(); tcm.getColumn(0).setPreferredWidth(250); tcm.getColumn(1).setPreferredWidth(50); tcm.getColumn(1).setCellRenderer(new ByteSizeCellRenderer(false)); tableEmbedded.setAutoCreateColumnsFromModel(false); } private void openFileMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openFileMenuItemActionPerformed int result = openFileChooser.showOpenDialog(this); if (result != JFileChooser.APPROVE_OPTION) { return; } loadFile(openFileChooser.getSelectedFile()); }//GEN-LAST:event_openFileMenuItemActionPerformed private void extractLumpButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_extractLumpButtonActionPerformed int[] selected = tableLumps.getSelectedRows(); if (selected.length == 0) { return; } saveDirectoryChooser.setCurrentDirectory(currentFile); int result = saveDirectoryChooser.showSaveDialog(this); if (result != JFileChooser.APPROVE_OPTION) { return; } File dest = saveDirectoryChooser.getSelectedFile(); // set waiting cursor setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); try { int files = 0; TableModel model = tableLumps.getModel(); RowSorter sorter = tableLumps.getRowSorter(); for (int index : selected) { index = sorter.convertRowIndexToModel(index); int lumpIndex = (Integer) model.getValueAt(index, 0); LumpType lumpType = LumpType.get(lumpIndex, bspFile.getVersion()); try { BspFileUtils.extractLump(bspFile, dest, lumpType); files++; } catch (IOException ex) { L.log(Level.WARNING, "Couldn't extract lump " + lumpType, ex); } } JOptionPane.showMessageDialog(this, "Successfully extracted " + files + " lumps."); } finally { // reset cursor setCursor(Cursor.getDefaultCursor()); } }//GEN-LAST:event_extractLumpButtonActionPerformed private void extractAllLumpsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_extractAllLumpsButtonActionPerformed saveDirectoryChooser.setCurrentDirectory(currentFile); int result = saveDirectoryChooser.showSaveDialog(this); if (result != JFileChooser.APPROVE_OPTION) { return; } File dest = saveDirectoryChooser.getSelectedFile(); // set waiting cursor setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); try { BspFileUtils.extractLumps(bspFile, dest); JOptionPane.showMessageDialog(this, "Successfully extracted all lumps."); } catch (IOException ex) { L.log(Level.WARNING, "Couldn't extract lumps", ex); } finally { // reset cursor setCursor(Cursor.getDefaultCursor()); } }//GEN-LAST:event_extractAllLumpsButtonActionPerformed private void extractGameLumpButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_extractGameLumpButtonActionPerformed int[] selected = tableGameLumps.getSelectedRows(); if (selected.length == 0) { return; } saveDirectoryChooser.setCurrentDirectory(currentFile); int result = saveDirectoryChooser.showSaveDialog(this); if (result != JFileChooser.APPROVE_OPTION) { return; } File dest = saveDirectoryChooser.getSelectedFile(); // set waiting cursor setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); try { int files = 0; TableModel model = tableGameLumps.getModel(); RowSorter sorter = tableGameLumps.getRowSorter(); for (int index : selected) { index = sorter.convertRowIndexToModel(index); String id = (String) model.getValueAt(index, 0); try { BspFileUtils.extractGameLump(bspFile, dest, id); files++; } catch (IOException ex) { L.log(Level.WARNING, "Couldn't extract game lump " + id, ex); } } JOptionPane.showMessageDialog(this, "Successfully extracted " + files + " game lumps."); } finally { // reset cursor setCursor(Cursor.getDefaultCursor()); } }//GEN-LAST:event_extractGameLumpButtonActionPerformed private void extractAllGameLumpsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_extractAllGameLumpsButtonActionPerformed saveDirectoryChooser.setCurrentDirectory(currentFile); int result = saveDirectoryChooser.showSaveDialog(this); if (result != JFileChooser.APPROVE_OPTION) { return; } File dest = saveDirectoryChooser.getSelectedFile(); // set waiting cursor setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); try { BspFileUtils.extractGameLumps(bspFile, dest); JOptionPane.showMessageDialog(this, "Successfully extracted all game lumps."); } catch (IOException ex) { L.log(Level.WARNING, "Couldn't extract lumps", ex); } finally { // reset cursor setCursor(Cursor.getDefaultCursor()); } }//GEN-LAST:event_extractAllGameLumpsButtonActionPerformed private void extractEmbeddedButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_extractEmbeddedButtonActionPerformed int[] selected = tableEmbedded.getSelectedRows(); if (selected.length == 0) { return; } saveDirectoryChooser.setCurrentDirectory(currentFile); int result = saveDirectoryChooser.showSaveDialog(this); if (result != JFileChooser.APPROVE_OPTION) { return; } File dest = saveDirectoryChooser.getSelectedFile(); // set waiting cursor setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); List<String> names = new ArrayList<>(); TableModel model = tableEmbedded.getModel(); RowSorter sorter = tableEmbedded.getRowSorter(); for (int index : selected) { index = sorter.convertRowIndexToModel(index); names.add((String) model.getValueAt(index, 0)); } try { bspFile.getPakFile().unpack(dest.toPath(), names); JOptionPane.showMessageDialog(this, "Successfully extracted " + names.size() + " embedded files."); } catch (IOException ex) { L.log(Level.WARNING, "Couldn't extract embedded files", ex); } finally { // reset cursor setCursor(Cursor.getDefaultCursor()); } }//GEN-LAST:event_extractEmbeddedButtonActionPerformed private void extractAllEmbeddedButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_extractAllEmbeddedButtonActionPerformed saveDirectoryChooser.setCurrentDirectory(currentFile); int result = saveDirectoryChooser.showSaveDialog(this); if (result != JFileChooser.APPROVE_OPTION) { return; } File dest = saveDirectoryChooser.getSelectedFile(); // set waiting cursor setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); try { bspFile.getPakFile().unpack(dest.toPath(), false); JOptionPane.showMessageDialog(this, "Successfully extracted all embedded files."); } catch (IOException ex) { L.log(Level.WARNING, "Couldn't extract embedded files", ex); } finally { // reset cursor setCursor(Cursor.getDefaultCursor()); } }//GEN-LAST:event_extractAllEmbeddedButtonActionPerformed private void extractEmbeddedZipButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_extractEmbeddedZipButtonActionPerformed saveZipFileChooser.setSelectedFile(new File(currentFile.getParent(), bspFile.getName() + ".zip")); int result = saveZipFileChooser.showSaveDialog(this); if (result != JFileChooser.APPROVE_OPTION) { return; } File dest = saveZipFileChooser.getSelectedFile(); // set waiting cursor setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); try { bspFile.getPakFile().unpack(dest.toPath(), true); JOptionPane.showMessageDialog(this, "Successfully extracted embedded Zip file."); } catch (IOException ex) { L.log(Level.WARNING, "Couldn't extract embedded Zip file", ex); } finally { // reset cursor setCursor(Cursor.getDefaultCursor()); } }//GEN-LAST:event_extractEmbeddedZipButtonActionPerformed private void textFieldVersionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_textFieldVersionActionPerformed // TODO add your handling code here: }//GEN-LAST:event_textFieldVersionActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private info.ata4.util.gui.components.ReadOnlyCheckBox checkBoxBSPProtect; private info.ata4.util.gui.components.ReadOnlyCheckBox checkBoxIIDObfs; private info.ata4.util.gui.components.ReadOnlyCheckBox checkBoxIIDTexHack; private info.ata4.util.gui.components.ReadOnlyCheckBox checkBoxVmexBrush; private info.ata4.util.gui.components.ReadOnlyCheckBox checkBoxVmexEntity; private info.ata4.util.gui.components.ReadOnlyCheckBox checkBoxVmexTexture; private javax.swing.JButton extractAllEmbeddedButton; private javax.swing.JButton extractAllGameLumpsButton; private javax.swing.JButton extractAllLumpsButton; private javax.swing.JButton extractEmbeddedButton; private javax.swing.JButton extractEmbeddedZipButton; private javax.swing.JButton extractGameLumpButton; private javax.swing.JButton extractLumpButton; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JLabel labelAppID; private javax.swing.JLabel labelComment; private javax.swing.JLabel labelCompressed; private javax.swing.JLabel labelEndian; private javax.swing.JLabel labelFileCRC; private javax.swing.JLabel labelGame; private javax.swing.JLabel labelMapCRC; private javax.swing.JLabel labelName; private javax.swing.JLabel labelRevision; private javax.swing.JLabel labelVbsp; private javax.swing.JLabel labelVersion; private javax.swing.JLabel labelVrad; private javax.swing.JLabel labelVvis; private info.ata4.util.gui.components.URILabel linkLabelAppURL; private javax.swing.JMenuBar menuBar; private javax.swing.JMenu menuFile; private javax.swing.JFileChooser openFileChooser; private javax.swing.JMenuItem openFileMenuItem; private javax.swing.JPanel panelChecksums; private javax.swing.JPanel panelCompileParams; private javax.swing.JPanel panelEmbedded; private javax.swing.JPanel panelEntities; private javax.swing.JPanel panelGame; private javax.swing.JPanel panelGameLumps; private javax.swing.JPanel panelGeneral; private javax.swing.JPanel panelHeaders; private javax.swing.JPanel panelIID; private javax.swing.JPanel panelLumps; private javax.swing.JPanel panelOther; private javax.swing.JPanel panelProt; private javax.swing.JPanel panelVmex; private javax.swing.JFileChooser saveDirectoryChooser; private javax.swing.JFileChooser saveZipFileChooser; private javax.swing.JScrollPane scrollPaneEmbedded; private javax.swing.JScrollPane scrollPaneGameLumps; private javax.swing.JScrollPane scrollPaneLumps; private javax.swing.JScrollPane scrollPaneMaterials; private javax.swing.JScrollPane scrollPaneModels; private javax.swing.JScrollPane scrollPaneParticles; private javax.swing.JScrollPane scrollPaneSoundScripts; private javax.swing.JScrollPane scrollPaneSounds; private javax.swing.JScrollPane scrollPaneSoundscapes; private javax.swing.JTabbedPane tabbedPane; private javax.swing.JTabbedPane tabbedPaneDependencies; private javax.swing.JTable tableEmbedded; private javax.swing.JTable tableEntities; private javax.swing.JTable tableGameLumps; private javax.swing.JTable tableLumps; private javax.swing.JTextArea textAreaMaterials; private javax.swing.JTextArea textAreaModels; private javax.swing.JTextArea textAreaParticles; private javax.swing.JTextArea textAreaSoundScripts; private javax.swing.JTextArea textAreaSounds; private javax.swing.JTextArea textAreaSoundscapes; private javax.swing.JTextField textFieldAppID; private javax.swing.JTextField textFieldBrushEnts; private javax.swing.JTextField textFieldComment; private javax.swing.JTextField textFieldCompressed; private javax.swing.JTextField textFieldEndian; private javax.swing.JTextField textFieldFileCRC; private javax.swing.JTextField textFieldGame; private javax.swing.JTextField textFieldMapCRC; private javax.swing.JTextField textFieldName; private javax.swing.JTextField textFieldPointEnts; private javax.swing.JTextField textFieldRevision; private javax.swing.JTextField textFieldTotalEnts; private javax.swing.JTextField textFieldVbspParams; private javax.swing.JTextField textFieldVersion; private javax.swing.JTextField textFieldVradParams; private javax.swing.JTextField textFieldVvisParams; // End of variables declaration//GEN-END:variables }