All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.codename1.designer.Import9Patch Maven / Gradle / Ivy

The newest version!
/*
 * Copyright (c) 2012, Codename One and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Codename One designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Oracle in the LICENSE file that accompanied this code.
 *  
 * This code 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
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 * 
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 * 
 * Please contact Codename One through http://www.codenameone.com/ if you 
 * need additional information or have any questions.
 */
package com.codename1.designer;

import com.codename1.ui.Display;
import com.codename1.ui.EncodedImage;
import com.codename1.ui.util.EditableResources;
import java.awt.Component;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JComboBox;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.ListCellRenderer;
import javax.swing.SwingUtilities;

/**
 *
 * @author Shai Almog
 */
public class Import9Patch extends javax.swing.JDialog {
    private EditableResources res;
    private String theme;
    
    /** Creates new form Import9Patch */
    public Import9Patch(java.awt.Component parent, EditableResources res, String theme) {
        super((java.awt.Frame)SwingUtilities.windowForComponent(parent), true);
        this.res = res;
        this.theme = theme;
        initComponents();
        AddThemeEntry.initUIIDComboBox(uiidCombo);
        
        pack();
        setLocationByPlatform(true);
        setVisible(true);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // //GEN-BEGIN:initComponents
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        imageDirectory = new javax.swing.JTextField();
        pickDirectory = new javax.swing.JButton();
        jLabel3 = new javax.swing.JLabel();
        uiidCombo = new javax.swing.JComboBox();
        jLabel4 = new javax.swing.JLabel();
        styleState = new javax.swing.JComboBox();
        jPanel1 = new javax.swing.JPanel();
        jPanel2 = new javax.swing.JPanel();
        okButton = new javax.swing.JButton();
        cancelButton = new javax.swing.JButton();
        jLabel5 = new javax.swing.JLabel();
        imagesCombo = new javax.swing.JComboBox();

        FormListener formListener = new FormListener();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Import 9-Patch Files");

        jLabel1.setText("Select the directory where the 9-patch images are stored based on the directory hierarchy
convention used in the Android platform"); jLabel1.setName("jLabel1"); // NOI18N jLabel2.setText("Image Directory"); jLabel2.setName("jLabel2"); // NOI18N imageDirectory.setName("imageDirectory"); // NOI18N pickDirectory.setText("..."); pickDirectory.setName("pickDirectory"); // NOI18N pickDirectory.addActionListener(formListener); jLabel3.setText("Apply To"); jLabel3.setName("jLabel3"); // NOI18N uiidCombo.setEditable(true); uiidCombo.setName("uiidCombo"); // NOI18N jLabel4.setText("State"); jLabel4.setName("jLabel4"); // NOI18N styleState.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Unselected", "Selected", "Pressed", "Disabled" })); styleState.setName("styleState"); // NOI18N jPanel1.setName("jPanel1"); // NOI18N jPanel2.setName("jPanel2"); // NOI18N jPanel2.setLayout(new java.awt.GridLayout(1, 2)); okButton.setText("Apply"); okButton.setName("okButton"); // NOI18N okButton.addActionListener(formListener); jPanel2.add(okButton); cancelButton.setText("Close"); cancelButton.setName("cancelButton"); // NOI18N cancelButton.addActionListener(formListener); jPanel2.add(cancelButton); jPanel1.add(jPanel2); jLabel5.setText("Image"); jLabel5.setName("jLabel5"); // NOI18N imagesCombo.setName("imagesCombo"); // NOI18N org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .addContainerGap() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jLabel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup() .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(jLabel2) .add(jLabel3) .add(jLabel4)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING) .add(org.jdesktop.layout.GroupLayout.LEADING, imagesCombo, 0, 390, Short.MAX_VALUE) .add(org.jdesktop.layout.GroupLayout.LEADING, imageDirectory, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 390, Short.MAX_VALUE) .add(org.jdesktop.layout.GroupLayout.LEADING, styleState, 0, 390, Short.MAX_VALUE) .add(org.jdesktop.layout.GroupLayout.LEADING, uiidCombo, 0, 390, Short.MAX_VALUE)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(pickDirectory)))) .add(layout.createSequentialGroup() .add(224, 224, 224) .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .addContainerGap(210, Short.MAX_VALUE)) .add(layout.createSequentialGroup() .addContainerGap() .add(jLabel5) .addContainerGap(546, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING) .add(layout.createSequentialGroup() .add(11, 11, 11) .add(jLabel1, 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(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(jLabel2) .add(imageDirectory, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(pickDirectory)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(jLabel5) .add(imagesCombo, 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(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(uiidCombo, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(jLabel3)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED) .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE) .add(styleState, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(jLabel4)) .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 8, Short.MAX_VALUE) .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE) .add(9, 9, 9)) ); pack(); } // Code for dispatching events from components to event handlers. private class FormListener implements java.awt.event.ActionListener { FormListener() {} public void actionPerformed(java.awt.event.ActionEvent evt) { if (evt.getSource() == pickDirectory) { Import9Patch.this.pickDirectoryActionPerformed(evt); } else if (evt.getSource() == okButton) { Import9Patch.this.okButtonActionPerformed(evt); } else if (evt.getSource() == cancelButton) { Import9Patch.this.cancelButtonActionPerformed(evt); } } }//
//GEN-END:initComponents private void pickDirectoryActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_pickDirectoryActionPerformed File[] result = ResourceEditorView.showOpenFileChooserWithTitle("Select The Directory", true, "Directory"); if(result != null && result.length == 1) { imageDirectory.setText(result[0].getAbsolutePath()); } File drawableHdpi = new File(imageDirectory.getText() + File.separator + "drawable-hdpi"); File[] potentials = drawableHdpi.listFiles(new FileFilter() { @Override public boolean accept(File file) { return file.getName().endsWith(".9.png"); } }); if(potentials == null || potentials.length == 0) { JOptionPane.showMessageDialog(this, "Can't find 9-patch files in the hdpi directory", "Error", JOptionPane.ERROR_MESSAGE); return; } imagesCombo.setRenderer(new DefaultListCellRenderer() { @Override public Component getListCellRendererComponent(JList jlist, Object o, int i, boolean bln, boolean bln1) { if(o instanceof File) { o = ((File)o).getName(); } return super.getListCellRendererComponent(jlist, o, i, bln, bln1); } }); imagesCombo.setModel(new DefaultComboBoxModel(potentials)); }//GEN-LAST:event_pickDirectoryActionPerformed private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed dispose(); }//GEN-LAST:event_cancelButtonActionPerformed private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed try { File[] dirs = new File(imageDirectory.getText()).listFiles(new FileFilter() { @Override public boolean accept(File file) { return file.isDirectory(); } }); if(dirs.length == 0) { JOptionPane.showMessageDialog(this, "No directories found", "Error", JOptionPane.ERROR_MESSAGE); return; } File drawableHdpi = new File(imageDirectory.getText() + File.separator + "drawable-hdpi"); File drawableLdpi = new File(imageDirectory.getText() + File.separator + "drawable-ldpi"); File drawableMdpi = new File(imageDirectory.getText() + File.separator + "drawable-mdpi"); File drawableXHdpi = new File(imageDirectory.getText() + File.separator + "drawable-xhdpi"); if(!drawableHdpi.exists()) { JOptionPane.showMessageDialog(this, "Can't find the drawable-hdpi directory", "Error", JOptionPane.ERROR_MESSAGE); return; } drawableHdpi = (File)imagesCombo.getSelectedItem(); drawableLdpi = new File(drawableLdpi, drawableHdpi.getName()); drawableMdpi = new File(drawableMdpi, drawableHdpi.getName()); drawableXHdpi = new File(drawableXHdpi, drawableHdpi.getName()); List images = new ArrayList(); List densities = new ArrayList(); BufferedImage hdpi = ImageIO.read(drawableHdpi); images.add(hdpi); densities.add(Display.DENSITY_HIGH); BufferedImage ldpi = null; if(drawableLdpi.exists()) { ldpi = ImageIO.read(drawableLdpi); images.add(ldpi); densities.add(Display.DENSITY_LOW); } BufferedImage mdpi = null; if(drawableMdpi.exists()) { mdpi = ImageIO.read(drawableMdpi); images.add(mdpi); densities.add(Display.DENSITY_MEDIUM); } BufferedImage xhdpi = null; if(drawableXHdpi.exists()) { xhdpi = ImageIO.read(drawableXHdpi); images.add(xhdpi); densities.add(Display.DENSITY_VERY_HIGH); } create9Patch(images, densities); } catch (IOException ex) { ex.printStackTrace(); JOptionPane.showMessageDialog(this, "IO Error reading file", "Error", JOptionPane.ERROR_MESSAGE); } }//GEN-LAST:event_okButtonActionPerformed private void create9Patch(List biList, List densities) { List topLeftCodenameOne = new ArrayList(); List topRightCodenameOne = new ArrayList(); List bottomLeftCodenameOne = new ArrayList(); List bottomRightCodenameOne = new ArrayList(); List centerCodenameOne = new ArrayList(); List topImageCodenameOne = new ArrayList(); List bottomImageCodenameOne = new ArrayList(); List leftImageCodenameOne = new ArrayList(); List rightImageCodenameOne = new ArrayList(); for(BufferedImage bi : biList) { int left = 0; for(int x = 0 ; x < bi.getWidth() ; x++) { int pixel = bi.getRGB(x, 0); if((pixel & 0xff000000) == 0xff000000) { break; } left++; } int right = 0; for(int x = bi.getWidth() - 1 ; x > 0 ; x--) { int pixel = bi.getRGB(x, 0); if((pixel & 0xff000000) == 0xff000000) { break; } right++; } int top = 0; for(int y = 0 ; y < bi.getHeight() ; y++) { int pixel = bi.getRGB(0, y); if((pixel & 0xff000000) == 0xff000000) { break; } top++; } int bottom = 0; for(int y = bi.getHeight() - 1 ; y > 0 ; y--) { int pixel = bi.getRGB(0, y); if((pixel & 0xff000000) == 0xff000000) { break; } bottom++; } bi = bi.getSubimage(1, 1, bi.getWidth() - 2, bi.getHeight() - 2); top--; bottom--; left--; right--; BufferedImage topLeft = bi.getSubimage(0, 0, left, top); BufferedImage topRight = bi.getSubimage(bi.getWidth() - right, 0, right, top); BufferedImage bottomLeft = bi.getSubimage(0, bi.getHeight() - bottom, left, bottom); BufferedImage bottomRight = bi.getSubimage(bi.getWidth() - right, bi.getHeight() - bottom, right, bottom); BufferedImage center = bi.getSubimage(left, top, bi.getWidth() - right - left, bi.getHeight() - bottom - top); BufferedImage topImage = bi.getSubimage(left, 0, bi.getWidth() - left - right, top); BufferedImage bottomImage = bi.getSubimage(left, bi.getHeight() - bottom, bi.getWidth() - left - right, bottom); BufferedImage leftImage = bi.getSubimage(0, top, left, bi.getHeight() - top - bottom); BufferedImage rightImage = bi.getSubimage(bi.getWidth() - right, top, right, bi.getHeight() - top - bottom); topLeftCodenameOne.add(com.codename1.ui.EncodedImage.create(ImageBorderCuttingWizard.toPng(topLeft))); topRightCodenameOne.add(com.codename1.ui.EncodedImage.create(ImageBorderCuttingWizard.toPng(topRight))); bottomLeftCodenameOne.add(com.codename1.ui.EncodedImage.create(ImageBorderCuttingWizard.toPng(bottomLeft))); bottomRightCodenameOne.add(com.codename1.ui.EncodedImage.create(ImageBorderCuttingWizard.toPng(bottomRight))); centerCodenameOne.add(com.codename1.ui.EncodedImage.create(ImageBorderCuttingWizard.toPng(center))); topImageCodenameOne.add(com.codename1.ui.EncodedImage.create(ImageBorderCuttingWizard.toPng(topImage))); bottomImageCodenameOne.add(com.codename1.ui.EncodedImage.create(ImageBorderCuttingWizard.toPng(bottomImage))); leftImageCodenameOne.add(com.codename1.ui.EncodedImage.create(ImageBorderCuttingWizard.toPng(leftImage))); rightImageCodenameOne.add(com.codename1.ui.EncodedImage.create(ImageBorderCuttingWizard.toPng(rightImage))); } String prefix = (String)uiidCombo.getSelectedItem() + "."; switch(styleState.getSelectedIndex()) { case 1: prefix += "sel#"; break; case 2: prefix += "press#"; break; case 3: prefix += "dis#"; break; } com.codename1.ui.EncodedImage topLeftCodenameOneE = storeImage(topLeftCodenameOne, densities, prefix + " "); com.codename1.ui.EncodedImage topRightCodenameOneE = storeImage(topRightCodenameOne, densities, prefix + " "); com.codename1.ui.EncodedImage bottomLeftCodenameOneE = storeImage(bottomLeftCodenameOne, densities, prefix + " "); com.codename1.ui.EncodedImage bottomRightCodenameOneE = storeImage(bottomRightCodenameOne, densities, prefix + " "); com.codename1.ui.EncodedImage centerCodenameOneE = storeImage(centerCodenameOne, densities, prefix + " "); com.codename1.ui.EncodedImage topImageCodenameOneE = storeImage(topImageCodenameOne, densities, prefix + " "); com.codename1.ui.EncodedImage bottomImageCodenameOneE = storeImage(bottomImageCodenameOne, densities, prefix + " "); com.codename1.ui.EncodedImage leftImageCodenameOneE = storeImage(leftImageCodenameOne, densities, prefix + " "); com.codename1.ui.EncodedImage rightImageCodenameOneE = storeImage(rightImageCodenameOne, densities, prefix + " "); com.codename1.ui.plaf.Border b = com.codename1.ui.plaf.Border.createImageScaledBorder(topImageCodenameOneE, bottomImageCodenameOneE, leftImageCodenameOneE, rightImageCodenameOneE, topLeftCodenameOneE, topRightCodenameOneE, bottomLeftCodenameOneE, bottomRightCodenameOneE, centerCodenameOneE); Hashtable newTheme = new Hashtable(res.getTheme(theme)); newTheme.put(prefix + "border", b); res.setTheme(theme, newTheme); } private com.codename1.ui.EncodedImage storeImage(List imgs, List densities, String prefix) { int i = 1; while(res.containsResource(prefix + "_" + i + ".png")) { i++; } EditableResources.MultiImage multi = new EditableResources.MultiImage(); int[] dpis = new int[densities.size()]; com.codename1.ui.EncodedImage[] images = new com.codename1.ui.EncodedImage[dpis.length]; for(int iter = 0 ; iter < dpis.length ; iter++) { dpis[iter] = densities.get(iter); images[iter] = imgs.get(iter); } multi.setDpi(dpis); multi.setInternalImages(images); res.setMultiImage(prefix + "_" + i + ".png", multi); return multi.getBest(); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton cancelButton; private javax.swing.JTextField imageDirectory; private javax.swing.JComboBox imagesCombo; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JButton okButton; private javax.swing.JButton pickDirectory; private javax.swing.JComboBox styleState; private javax.swing.JComboBox uiidCombo; // End of variables declaration//GEN-END:variables }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy