package ru.jnano.swing.panel;
import javax.swing.JPanel;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.RowSpec;
import com.jgoodies.forms.factories.FormFactory;
import com.jgoodies.validation.Severity;
import com.jgoodies.validation.ValidationResultModel;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.File;
import org.jdesktop.beansbinding.BeanProperty;
import org.jdesktop.beansbinding.AutoBinding;
import org.jdesktop.beansbinding.Bindings;
import org.jdesktop.beansbinding.AutoBinding.UpdateStrategy;
import ru.jnano.swing.valid.GroupSwingValidation;
import ru.jnano.swing.valid.validators.DirExistsValidator;
import ru.jnano.swing.valid.validators.FileExistsValidator;
import ru.jnano.swing.valid.validators.IllegalChartSetInFileNameValidator;
public class SrcDstFileJPanel extends JPanel {
private SrcDstFileModel model;
private JTextField tfSrcFile;
private JTextField tfDstDir;
private JTextField tfFileName;
private JCheckBox chBEquilSrcFileName;
private GroupSwingValidation groupValid;
public SrcDstFileJPanel(SrcDstFileModel model, ValidationResultModel validationResultModel) {
if (model==null) model = new SrcDstFileModel();
this.model=model;
setLayout(new FormLayout(new ColumnSpec[] {
FormFactory.RELATED_GAP_COLSPEC,
FormFactory.DEFAULT_COLSPEC,
FormFactory.RELATED_GAP_COLSPEC,
ColumnSpec.decode("max(83dlu;default)"),
FormFactory.RELATED_GAP_COLSPEC,
ColumnSpec.decode("max(103dlu;default):grow"),
FormFactory.RELATED_GAP_COLSPEC,
FormFactory.DEFAULT_COLSPEC,},
new RowSpec[] {
FormFactory.RELATED_GAP_ROWSPEC,
FormFactory.DEFAULT_ROWSPEC,
FormFactory.RELATED_GAP_ROWSPEC,
FormFactory.DEFAULT_ROWSPEC,
FormFactory.RELATED_GAP_ROWSPEC,
FormFactory.DEFAULT_ROWSPEC,}));
JLabel label = new JLabel("\u0418\u0441\u0445\u043E\u0434\u043D\u044B\u0439 \u0444\u0430\u0439\u043B:");
add(label, "2, 2");
tfSrcFile = new JTextField();
tfSrcFile.setEditable(false);
add(tfSrcFile, "4, 2, 3, 1");
tfSrcFile.setColumns(10);
tfSrcFile.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent arg0) {
if (chBEquilSrcFileName.isSelected()){
tfFileName.setText(getFileName(tfSrcFile.getText()));
}
}
@Override
public void insertUpdate(DocumentEvent arg0) {
if (chBEquilSrcFileName.isSelected()){
tfFileName.setText(getFileName(tfSrcFile.getText()));
}
}
@Override
public void changedUpdate(DocumentEvent arg0) {
if (chBEquilSrcFileName.isSelected()){
tfFileName.setText(getFileName(tfSrcFile.getText()));
}
}
});
JButton btSelectSrcFile = new JButton("...");
btSelectSrcFile.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
JFileChooser fileChooser = new JFileChooser(tfSrcFile.getText());
int result = fileChooser.showOpenDialog(null);
if (result == JFileChooser.APPROVE_OPTION) {
tfSrcFile.setText(fileChooser.getSelectedFile().getPath());
}
}
});
add(btSelectSrcFile, "8, 2");
JLabel label_1 = new JLabel("\u041F\u0430\u043F\u043A\u0430 \u043D\u0430\u0437\u043D\u0430\u0447\u0435\u043D\u0438\u044F:");
add(label_1, "2, 4");
tfDstDir = new JTextField();
tfDstDir.setEditable(false);
add(tfDstDir, "4, 4, 3, 1");
tfDstDir.setColumns(10);
JButton btSelectDstDir = new JButton("...");
btSelectDstDir.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser(tfDstDir.getText());
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int result = fileChooser.showOpenDialog(null);
if (result == JFileChooser.APPROVE_OPTION) {
tfDstDir.setText(fileChooser.getSelectedFile().getPath());
}
}
});
add(btSelectDstDir, "8, 4");
JLabel label_2 = new JLabel("\u0418\u043C\u044F \u0444\u0430\u0439\u043B\u0430:");
add(label_2, "2, 6");
tfFileName = new JTextField();
add(tfFileName, "4, 6");
tfFileName.setColumns(10);
chBEquilSrcFileName = new JCheckBox("\u043A\u0430\u043A \u0443 \u0438\u0441\u0445. \u0444\u0430\u0439\u043B\u0430");
chBEquilSrcFileName.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent event) {
if (chBEquilSrcFileName.isSelected()){
tfFileName.setEditable(false);
tfFileName.setText(getFileName(tfSrcFile.getText()));
}else{
tfFileName.setEditable(true);
}
}
});
add(chBEquilSrcFileName, "6, 6, left, default");
initDataBindings();
if (validationResultModel!=null){
this.groupValid = new GroupSwingValidation(validationResultModel);
groupValid.add(tfSrcFile, new FileExistsValidator());
groupValid.add(tfDstDir, new DirExistsValidator(Severity.WARNING));
groupValid.add(tfFileName, new IllegalChartSetInFileNameValidator());
groupValid.validate();
}
}
protected void initDataBindings() {
BeanProperty<SrcDstFileModel, String> srcDstFileModelBeanProperty = BeanProperty.create("srcFile");
BeanProperty<JTextField, String> jTextFieldBeanProperty = BeanProperty.create("text");
AutoBinding<SrcDstFileModel, String, JTextField, String> autoBinding = Bindings.createAutoBinding(UpdateStrategy.READ_WRITE, model, srcDstFileModelBeanProperty, tfSrcFile, jTextFieldBeanProperty);
autoBinding.bind();
//
BeanProperty<SrcDstFileModel, String> srcDstFileModelBeanProperty_1 = BeanProperty.create("dstDir");
BeanProperty<JTextField, String> jTextFieldBeanProperty_1 = BeanProperty.create("text");
AutoBinding<SrcDstFileModel, String, JTextField, String> autoBinding_1 = Bindings.createAutoBinding(UpdateStrategy.READ_WRITE, model, srcDstFileModelBeanProperty_1, tfDstDir, jTextFieldBeanProperty_1);
autoBinding_1.bind();
//
BeanProperty<SrcDstFileModel, String> srcDstFileModelBeanProperty_2 = BeanProperty.create("nameFile");
BeanProperty<JTextField, String> jTextFieldBeanProperty_2 = BeanProperty.create("text");
AutoBinding<SrcDstFileModel, String, JTextField, String> autoBinding_2 = Bindings.createAutoBinding(UpdateStrategy.READ_WRITE, model, srcDstFileModelBeanProperty_2, tfFileName, jTextFieldBeanProperty_2);
autoBinding_2.bind();
}
private String getFileName(String path){
File file = new File(path);
if (file.isDirectory()) return "";
String fileName = file.getName();
int index = fileName.lastIndexOf(".");
if (index!=-1) fileName = fileName.substring(0, index);
return fileName;
}
}