/* MP5ExecutablePanel.java created 2007-10-31 * */ package org.signalml.app.method.mp5; import static org.signalml.app.util.i18n.SvarogI18n._; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.io.File; import javax.swing.AbstractAction; import javax.swing.GroupLayout; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.GroupLayout.Alignment; import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import javax.swing.border.TitledBorder; import org.signalml.app.SvarogApplication; import org.signalml.app.model.components.validation.ValidationErrors; import org.signalml.app.util.IconUtils; import org.signalml.method.mp5.MP5LocalProcessExecutor; import org.signalml.plugin.export.view.FileChooser; import org.signalml.util.Util; /** MP5ExecutablePanel * * * @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o. */ public class MP5ExecutablePanel extends JPanel { private static final long serialVersionUID = 1L; private JTextField executableTextField; private JButton chooseExecutableButton; private FileChooser fileChooser; private File mp5Executable; public MP5ExecutablePanel(FileChooser fileChooser) { super(); this.fileChooser = fileChooser; initialize(); } private void initialize() { CompoundBorder border = new CompoundBorder( new TitledBorder(_("MP5 executable")), new EmptyBorder(3,3,3,3) ); setBorder(border); GroupLayout layout = new GroupLayout(this); this.setLayout(layout); layout.setAutoCreateContainerGaps(false); layout.setAutoCreateGaps(true); JLabel executableLabel = new JLabel(_("Path to binary")); GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup(); hGroup.addGroup( layout.createParallelGroup() .addComponent(executableLabel) ); hGroup.addGroup( layout.createParallelGroup() .addComponent(getExecutableTextField()) ); hGroup.addGroup( layout.createParallelGroup() .addComponent(getChooseExecutableButton()) ); layout.setHorizontalGroup(hGroup); GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup(); vGroup.addGroup( layout.createParallelGroup(Alignment.BASELINE) .addComponent(executableLabel) .addComponent(getExecutableTextField()) .addComponent(getChooseExecutableButton()) ); layout.setVerticalGroup(vGroup); } public JTextField getExecutableTextField() { if (executableTextField == null) { executableTextField = new JTextField(); executableTextField.setPreferredSize(new Dimension(300,25)); executableTextField.setEditable(false); } return executableTextField; } public JButton getChooseExecutableButton() { if (chooseExecutableButton == null) { chooseExecutableButton = new JButton(new ChooseExecutableAction()); } return chooseExecutableButton; } public void fillPanelFromModel(MP5LocalProcessExecutor executor) { String path = executor.getMp5ExecutablePath(); if (path == null) { mp5Executable = null; String osName = System.getProperty("os.name"); if (Util.WINDOWS_OS_PATTERN.matcher(osName).matches()) { File executable = new File(SvarogApplication.getSharedInstance().getStartupDir(), "native/windows/bin/mp5.exe"); if (executable.exists()) { if (executable.canExecute()) { mp5Executable = executable; } } } else if (Util.LINUX_OS_PATTERN.matcher(osName).matches()) { File executable = new File(SvarogApplication.getSharedInstance().getStartupDir(), "native/linux/bin/mp5"); if (executable.exists()) { if (!executable.canExecute()) { executable.setExecutable(true, true); } if (executable.canExecute()) { mp5Executable = executable; } } } else if (Util.MAC_OS_PATTERN.matcher(osName).matches()) { File executable = new File(SvarogApplication.getSharedInstance().getStartupDir(), "native/mac/bin/mp5"); if (executable.exists()) { if (!executable.canExecute()) { executable.setExecutable(true, true); } if (executable.canExecute()) { mp5Executable = executable; } } } else { // other os - do nothing } if (mp5Executable == null) { getExecutableTextField().setText(""); } else { getExecutableTextField().setText(mp5Executable.getAbsolutePath()); } } else { mp5Executable = new File(path); getExecutableTextField().setText(path); } } public void fillModelFromPanel(MP5LocalProcessExecutor executor) { if (mp5Executable == null) { executor.setMp5ExecutablePath(null); } else { executor.setMp5ExecutablePath(mp5Executable.getAbsolutePath()); } } public void validatePanel(ValidationErrors errors) { if (mp5Executable == null || !mp5Executable.exists() || !mp5Executable.canExecute()) { errors.addError(_("MP5 executable not found or not accessible")); } } protected class ChooseExecutableAction extends AbstractAction { private static final long serialVersionUID = 1L; public ChooseExecutableAction() { super(_("Choose...")); putValue(AbstractAction.SMALL_ICON, IconUtils.loadClassPathIcon("org/signalml/app/icon/find.png")); putValue(AbstractAction.SHORT_DESCRIPTION,_("Choose MP5 executable file")); } public void actionPerformed(ActionEvent ev) { File file = fileChooser.chooseExecutableFile(MP5ExecutablePanel.this.getTopLevelAncestor()); if (file == null) { return; } mp5Executable = file; getExecutableTextField().setText(mp5Executable.getAbsolutePath()); } } }