package ca.canucksoftware.themebuilder; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.Icon; import java.awt.Component; import java.awt.Container; import javax.swing.UIManager; import javax.swing.JButton; import java.io.*; import java.util.List; import java.util.LinkedList; import bmsi.util.*; public class CreatePatch extends javax.swing.JDialog { public File prevDir; public File patch; public String version; public String category; private File item1; private File item2; private String path; public CreatePatch(java.awt.Frame parent, String currVersion, List<String> versions, String currCategory) { super(parent); initComponents(); item1 = null; item2 = null; path = null; patch = null; version = currVersion; for(int i=0; i<versions.size(); i++) { jComboBox2.addItem("webOS " + versions.get(i)); } for(int i=0; i<jComboBox1.getItemCount(); i++) { String cat = ((String) jComboBox1.getItemAt(i)).toLowerCase().replaceAll(" ", "_"); if(cat.equals(currCategory)) { jComboBox1.setSelectedIndex(i); break; } } jComboBox2.setSelectedItem("webOS " + version); getContentPane().requestFocus(); } private String formatDest(String path) { String result = null; result = path.replace("\\", "/"); if(!result.startsWith("/")) result = "/" + result; return result; } private File loadFileChooser(javax.swing.filechooser.FileFilter ff, boolean isSave) { File result; JFileChooser fc = new JFileChooser(); //Create a file chooser fc.setAcceptAllFileFilterUsed(false); fc.setMultiSelectionEnabled(false); if(prevDir!=null) fc.setCurrentDirectory(prevDir); fc.setFileFilter(ff); if(!isSave) { fc.setDialogTitle(""); if (fc.showDialog(null, "Select") == JFileChooser.APPROVE_OPTION) { result = fc.getSelectedFile(); } else { result = null; } } else { fc.setDialogTitle("Save As..."); if(fc.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) { result = fc.getSelectedFile(); } else { result = null; } } if(result!=null) prevDir = result.getParentFile(); return result; } private List<String> fileToLines(File f) { List<String> lines = new LinkedList<String>(); String line = ""; try { BufferedReader in = new BufferedReader(new FileReader(f)); line = in.readLine(); while (line != null) { lines.add(line); line = in.readLine(); } in.close(); } catch (Exception e) { lines = null; } return lines; } private File linesToFile(List<String> lines, File f) { if(f.exists()) f.delete(); try { BufferedWriter out = new BufferedWriter(new FileWriter(f)); for(int i=0; i<lines.size(); i++) out.write(lines.get(i) + "\n"); out.flush(); out.close(); } catch (Exception e) { f = null; } return f; } public void closeAddContent() { dispose(); } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { jLayeredPane1 = new javax.swing.JLayeredPane(); jLayeredPane2 = new javax.swing.JLayeredPane(); jComboBox2 = new javax.swing.JComboBox(); jComboBox1 = new javax.swing.JComboBox(); jLabel2 = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel(); jLabel5 = new javax.swing.JLabel(); jLabel6 = new javax.swing.JLabel(); jTextField3 = new javax.swing.JTextField(); jLabel4 = new javax.swing.JLabel(); jButton2 = new javax.swing.JButton(); jTextField1 = new javax.swing.JTextField(); jTextField2 = new javax.swing.JTextField(); jButton3 = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(ca.canucksoftware.themebuilder.WebOSThemeBuilderApp.class).getContext().getResourceMap(CreatePatch.class); setTitle(resourceMap.getString("title")); // NOI18N setBackground(resourceMap.getColor("transfer.background")); // NOI18N setForeground(resourceMap.getColor("transfer.foreground")); // NOI18N setIconImage(null); setModal(true); setName("transfer"); // NOI18N setResizable(false); addWindowListener(new java.awt.event.WindowAdapter() { public void windowActivated(java.awt.event.WindowEvent evt) { formWindowActivated(evt); } public void windowClosed(java.awt.event.WindowEvent evt) { formWindowClosed(evt); } public void windowOpened(java.awt.event.WindowEvent evt) { formWindowOpened(evt); } }); jLayeredPane1.setName("jLayeredPane1"); // NOI18N jLayeredPane2.setBorder(javax.swing.BorderFactory.createLineBorder(resourceMap.getColor("jLayeredPane2.border.lineColor"))); // NOI18N jLayeredPane2.setName("jLayeredPane2"); // NOI18N jComboBox2.setName("jComboBox2"); // NOI18N jComboBox2.setBounds(130, 180, 180, 22); jLayeredPane2.add(jComboBox2, javax.swing.JLayeredPane.DEFAULT_LAYER); jComboBox1.setMaximumRowCount(13); jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "App Icons", "App Launcher", "Applications", "Boot Logo", "Enyo Widgets", "Exhibition", "Just Type", "Keyboard", "Lock Screen", "Quick Launcher", "Status Bar", "System Menus", "Wallpapers" })); jComboBox1.setSelectedIndex(2); jComboBox1.setName("jComboBox1"); // NOI18N jComboBox1.setBounds(130, 150, 180, 22); jLayeredPane2.add(jComboBox1, javax.swing.JLayeredPane.DEFAULT_LAYER); jLabel2.setFont(resourceMap.getFont("jLabel2.font")); // NOI18N jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N jLabel2.setName("jLabel2"); // NOI18N jLabel2.setBounds(20, 10, 100, 20); jLayeredPane2.add(jLabel2, javax.swing.JLayeredPane.DEFAULT_LAYER); jLabel3.setFont(resourceMap.getFont("jLabel3.font")); // NOI18N jLabel3.setText(resourceMap.getString("jLabel3.text")); // NOI18N jLabel3.setName("jLabel3"); // NOI18N jLabel3.setBounds(20, 40, 100, 20); jLayeredPane2.add(jLabel3, javax.swing.JLayeredPane.DEFAULT_LAYER); jLabel5.setFont(resourceMap.getFont("jLabel5.font")); // NOI18N jLabel5.setText(resourceMap.getString("jLabel5.text")); // NOI18N jLabel5.setName("jLabel5"); // NOI18N jLabel5.setBounds(20, 150, 110, 20); jLayeredPane2.add(jLabel5, javax.swing.JLayeredPane.DEFAULT_LAYER); jLabel6.setFont(resourceMap.getFont("jLabel6.font")); // NOI18N jLabel6.setText(resourceMap.getString("jLabel6.text")); // NOI18N jLabel6.setName("jLabel6"); // NOI18N jLabel6.setBounds(20, 180, 110, 20); jLayeredPane2.add(jLabel6, javax.swing.JLayeredPane.DEFAULT_LAYER); jTextField3.setName("jTextField3"); // NOI18N jTextField3.setBounds(20, 110, 410, 22); jLayeredPane2.add(jTextField3, javax.swing.JLayeredPane.DEFAULT_LAYER); jLabel4.setFont(resourceMap.getFont("jLabel4.font")); // NOI18N jLabel4.setText(resourceMap.getString("jLabel4.text")); // NOI18N jLabel4.setName("jLabel4"); // NOI18N jLabel4.setBounds(20, 80, 240, 20); jLayeredPane2.add(jLabel4, javax.swing.JLayeredPane.DEFAULT_LAYER); jButton2.setFont(resourceMap.getFont("jButton2.font")); // NOI18N jButton2.setText(resourceMap.getString("jButton2.text")); // NOI18N jButton2.setName("jButton2"); // NOI18N jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton2ActionPerformed(evt); } }); jButton2.setBounds(100, 220, 140, 25); jLayeredPane2.add(jButton2, javax.swing.JLayeredPane.DEFAULT_LAYER); jTextField1.setText(resourceMap.getString("jTextField1.text")); // NOI18N jTextField1.setFocusable(false); jTextField1.setName("jTextField1"); // NOI18N jTextField1.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { jTextField1MouseClicked(evt); } public void mousePressed(java.awt.event.MouseEvent evt) { jTextField1MousePressed(evt); } }); jTextField1.setBounds(130, 10, 300, 22); jLayeredPane2.add(jTextField1, javax.swing.JLayeredPane.DEFAULT_LAYER); jTextField2.setText(resourceMap.getString("jTextField2.text")); // NOI18N jTextField2.setName("jTextField2"); // NOI18N jTextField2.addMouseListener(new java.awt.event.MouseAdapter() { public void mousePressed(java.awt.event.MouseEvent evt) { jTextField2MousePressed(evt); } }); jTextField2.setBounds(130, 40, 300, 22); jLayeredPane2.add(jTextField2, javax.swing.JLayeredPane.DEFAULT_LAYER); jButton3.setFont(resourceMap.getFont("jButton3.font")); // NOI18N jButton3.setText(resourceMap.getString("jButton3.text")); // NOI18N jButton3.setName("jButton3"); // NOI18N jButton3.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton3ActionPerformed(evt); } }); jButton3.setBounds(260, 220, 79, 25); jLayeredPane2.add(jButton3, javax.swing.JLayeredPane.DEFAULT_LAYER); jLayeredPane2.setBounds(10, 10, 450, 260); jLayeredPane1.add(jLayeredPane2, javax.swing.JLayeredPane.DEFAULT_LAYER); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLayeredPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 470, Short.MAX_VALUE) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLayeredPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 279, javax.swing.GroupLayout.PREFERRED_SIZE) ); pack(); }// </editor-fold>//GEN-END:initComponents private void formWindowOpened(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowOpened }//GEN-LAST:event_formWindowOpened private void formWindowActivated(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowActivated }//GEN-LAST:event_formWindowActivated private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosed }//GEN-LAST:event_formWindowClosed private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed path = formatDest(jTextField3.getText().trim()); if(path.length()>1 && item1!=null && item2!=null) { patch = loadFileChooser(new PatchChooseFilter(), true); try { if(patch!=null) { if(!patch.getName().endsWith(".patch")) { patch = new File(patch.getCanonicalPath() + ".patch"); } UnifiedDiff uni = new UnifiedDiff(item1, item2); patch = uni.createDiff(patch, path); if(patch!=null) { List<String> patchContents = fileToLines(patch); if(patchContents!=null) { patchContents.set(0, "--- .orig" + path); patchContents.set(1, "+++ " + path); patch = linesToFile(patchContents, patch); if(patch!=null) { category = ((String) jComboBox1.getSelectedItem()).toLowerCase() .replaceAll(" ", "_"); version = ((String) jComboBox2.getSelectedItem()).replace("webOS ", ""); } else { JOptionPane.showMessageDialog(rootPane, "Error: unable to write to patch."); } } else { JOptionPane.showMessageDialog(rootPane, "Error: unable to read patch."); } } } } catch(Exception e) { patch = null; } closeAddContent(); } }//GEN-LAST:event_jButton2ActionPerformed private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton3ActionPerformed patch = null; closeAddContent(); }//GEN-LAST:event_jButton3ActionPerformed private void jTextField1MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTextField1MouseClicked }//GEN-LAST:event_jTextField1MouseClicked private void jTextField1MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTextField1MousePressed File tmp = loadFileChooser(new PatchableChooseFilter(), false); if(tmp!=null) { item1 = tmp; jTextField1.setText(item1.getPath()); } getContentPane().requestFocus(); }//GEN-LAST:event_jTextField1MousePressed private void jTextField2MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTextField2MousePressed File tmp = loadFileChooser(new PatchableChooseFilter(), false); if(tmp!=null) { item2 = tmp; jTextField2.setText(item2.getPath()); } getContentPane().requestFocus(); }//GEN-LAST:event_jTextField2MousePressed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton jButton2; private javax.swing.JButton jButton3; private javax.swing.JComboBox jComboBox1; private javax.swing.JComboBox jComboBox2; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JLayeredPane jLayeredPane1; private javax.swing.JLayeredPane jLayeredPane2; private javax.swing.JTextField jTextField1; private javax.swing.JTextField jTextField2; private javax.swing.JTextField jTextField3; // End of variables declaration//GEN-END:variables class PatchChooseFilter extends javax.swing.filechooser.FileFilter { private final String okFileExtension = ".patch"; public boolean accept(File f) { if (f.getName().toLowerCase().endsWith(okFileExtension) || f.isDirectory()) return true; return false; } public String getDescription() { return "Patch Files"; } } class PatchableChooseFilter extends javax.swing.filechooser.FileFilter { private final String[] okFileExtensions = new String[] {".html", ".css", ".js", ".json", ".conf", ".txt"}; public boolean accept(File f) { for (String extension : okFileExtensions) if (f.getName().toLowerCase().endsWith(extension) || f.isDirectory()) return true; return false; } public String getDescription() { return "Patchable Files"; } } }