/*
* Copyright (C) 2012 Sony Mobile Communications AB
*
* This file is part of ApkAnalyser.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package analyser.gui;
import gui.AbstractMainFrame;
import gui.PathListPanel;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import com.l2fprod.common.swing.JDirectoryChooser;
public class ClassPathDialog extends JDialog
{
private static final long serialVersionUID = -5990095929676829206L;
protected PathListPanel m_classpathPanel;
protected PathListPanel m_midletPanel;
protected AbstractMainFrame m_mainFrame;
protected JTabbedPane m_classpathTab;
protected JDirectoryChooser m_sdkChooser;
protected File m_sdkFolder;
protected JButton m_buttonOk;
protected JButton m_buttonCancel;
protected JPanel m_sdkPanel;
protected JLabel m_sdkName;
private static final String INVALID_ANDROIDSDK_PATH = "Invalid path, please point to SDK/platforms/android-XX";
/**
* @param owner
* @param title
* @throws java.awt.HeadlessException
*/
public ClassPathDialog(AbstractMainFrame owner, String title) throws HeadlessException
{
super(owner, title);
m_mainFrame = owner;
initGui();
}
protected void initGui()
{
m_classpathPanel = new PathListPanel(m_mainFrame, true)
{
private static final long serialVersionUID = 5126338107317282302L;
@Override
protected String getFileListTitleText()
{
return "Add zip/jar/dex/odex/apk or class directory";
}
@Override
protected String getFilterSuffix()
{
return "zip;jar;dex;odex;apk";
}
@Override
protected String getFilterDescription()
{
return ".dex/.odex/.zip/.jar/.apk file or class directory";
}
};
m_classpathPanel.setMinimumSize(new Dimension(400, 350));
//m_classpathPanel.setBorder(BorderFactory.createTitledBorder("Classpaths"));
if (Settings.getAndroidSDK() != null) {
m_sdkFolder = new File(Settings.getAndroidSDK());
m_sdkChooser = new JDirectoryChooser(m_sdkFolder);
m_sdkName = new JLabel(m_sdkFolder.getPath());
} else {
m_sdkFolder = null;
m_sdkChooser = new JDirectoryChooser(new File(Settings.getDefaultPath()));
m_sdkName = new JLabel(INVALID_ANDROIDSDK_PATH);
}
m_sdkChooser.setControlButtonsAreShown(false);
m_sdkChooser.setMultiSelectionEnabled(false);
m_sdkChooser.setSelectedFile(m_sdkFolder);
m_sdkChooser.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(JFileChooser.SELECTED_FILE_CHANGED_PROPERTY)) {
File folder = (File) evt.getNewValue();
if (isValidAndroidSDKFolder(folder)) {
m_sdkFolder = folder;
m_sdkName.setText(folder.getPath());
m_buttonOk.setEnabled(true);
} else {
m_sdkFolder = null;
m_sdkName.setText(INVALID_ANDROIDSDK_PATH);
m_buttonOk.setEnabled(false);
}
}
}
});
JPanel jp = new JPanel();
jp.add(m_sdkName);
jp.setBorder(BorderFactory.createEtchedBorder());
m_sdkPanel = new JPanel(new BorderLayout());
m_sdkPanel.add(jp, BorderLayout.NORTH);
m_sdkPanel.add(m_sdkChooser, BorderLayout.CENTER);
m_classpathTab = new JTabbedPane(JTabbedPane.TOP);
m_classpathTab.addTab("Classpaths", m_classpathPanel);
m_classpathTab.addTab("Android SDK", m_sdkPanel);
m_classpathTab.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
m_buttonOk.setEnabled(m_classpathTab.getSelectedComponent() == m_classpathPanel
|| isValidAndroidSDKFolder(m_sdkFolder));
}
});
m_midletPanel = new PathListPanel(m_mainFrame)
{
private static final long serialVersionUID = 5331505988001756380L;
@Override
protected String getFileListTitleText()
{
return "Add midlet or APK or directory";
}
@Override
protected String getFilterSuffix()
{
return "jar;apk";
}
@Override
protected String getFilterDescription()
{
return "MIDlet or APK";
}
};
m_midletPanel.setMinimumSize(new Dimension(400, 350));
m_midletPanel.setBorder(BorderFactory.createTitledBorder("MIDlets or APK"));
JPanel pathPanel = new JPanel();
pathPanel.setLayout(new GridLayout(1, 2));
pathPanel.add(m_classpathTab);
pathPanel.add(m_midletPanel);
JPanel buttons = new JPanel();
buttons.setLayout(new FlowLayout(FlowLayout.RIGHT));
m_buttonOk = new JButton("OK");
m_buttonCancel = new JButton("Cancel");
m_buttonOk.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e)
{
apply();
close();
}
});
m_buttonCancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e)
{
close();
}
});
buttons.add(m_buttonOk);
buttons.add(m_buttonCancel);
if (Settings.getUseAndroidSDK()) {
m_classpathTab.setSelectedComponent(m_sdkPanel);
if (!isValidAndroidSDKFolder(m_sdkFolder)) {
m_buttonOk.setEnabled(false);
}
}
getContentPane().setLayout(new BorderLayout());
getContentPane().add(pathPanel, BorderLayout.CENTER);
getContentPane().add(buttons, BorderLayout.SOUTH);
m_classpathPanel.setPaths(Settings.getSelectableClasspath());
m_midletPanel.setPaths(Settings.getSelectableMidletsPath());
}
protected void apply()
{
if (m_sdkFolder != null) {
Settings.setAndroidSDK(m_sdkFolder.getPath());
}
Settings.setUseAndroidSDK(m_classpathTab.getSelectedComponent() == m_sdkPanel);
Settings.setClasspath(m_classpathPanel.getPaths());
Settings.setMidletsPath(m_midletPanel.getPaths());
}
protected void close()
{
setVisible(false);
}
private boolean isValidAndroidSDKFolder(File folder) {
if (folder == null
|| folder.listFiles() == null
|| folder.listFiles().length == 0) {
return false;
}
boolean valid = false;
File[] sub = folder.listFiles();
for (int i = 0; sub != null && i < sub.length; i++)
{
if (sub[i].isFile() && sub[i].getName().equals("android.jar")) {
valid = true;
}
}
return valid;
}
}