package husacct.control.presentation.util;
import husacct.ServiceProvider;
import husacct.common.dto.ApplicationDTO;
import husacct.common.locale.ILocaleService;
import husacct.common.services.IServiceListener;
import husacct.control.IControlService;
import husacct.control.task.MainController;
import husacct.control.task.configuration.ConfigurationManager;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class SetApplicationPanel extends JPanel{
private static final long serialVersionUID = 1L;
private JLabel pathLabel, applicationNameLabel, languageSelectLabel, versionLabel;
private JList<String> pathList;
public JTextField applicationNameText, versionText;
private JComboBox<String> languageSelect;
private JButton addButton, removeButton;
private String[] languages;
private DefaultListModel<String> pathListModel = new DefaultListModel<String>();
private JDialog dialogOwner;
private GridBagConstraints constraint = new GridBagConstraints();
private MainController mainController;
private IControlService controlService = ServiceProvider.getInstance().getControlService();
private ILocaleService localeService = ServiceProvider.getInstance().getLocaleService();
private String selectedFile =ConfigurationManager.getProperty("LastUsedAddedProjectPathPath");
public SetApplicationPanel(JDialog dialogOwner, MainController mainController){
this.setDialogOwner(dialogOwner);
this.mainController = mainController;
addComponents();
setListeners();
setDefaultValues();
}
public void addComponents(){
this.setLayout(new GridBagLayout());
this.languages = ServiceProvider.getInstance().getAnalyseService().getAvailableLanguages();
applicationNameLabel = new JLabel(localeService.getTranslatedString("ApplicationNameLabel"));
languageSelectLabel = new JLabel(localeService.getTranslatedString("LanguageSelectLabel"));
versionLabel = new JLabel(localeService.getTranslatedString("VersionLabel"));
pathLabel = new JLabel(localeService.getTranslatedString("PathLabel"));
addButton = new JButton(localeService.getTranslatedString("AddButton"));
removeButton = new JButton(localeService.getTranslatedString("RemoveButton"));
applicationNameText = new JTextField("myApplication", 20);
languageSelect = new JComboBox<String>(languages);
versionText = new JTextField(10);
pathList = new JList<String>(pathListModel);
pathList.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
pathList.setLayoutOrientation(JList.VERTICAL);
pathList.setVisibleRowCount(-1);
JScrollPane listScroller = new JScrollPane(pathList);
listScroller.setAlignmentX(Component.LEFT_ALIGNMENT);
removeButton.setEnabled(false);
add(applicationNameLabel, getConstraint(0, 0, 1, 1));
add(applicationNameText, getConstraint(1, 0, 2, 1));
add(languageSelectLabel, getConstraint(0, 1, 1, 1));
add(languageSelect, getConstraint(1, 1, 2, 1));
add(versionLabel, getConstraint(0, 2, 1, 1));
add(versionText, getConstraint(1, 2, 2, 1));
add(pathLabel, getConstraint(0, 3, 1, 1));
add(listScroller, getConstraint(0, 4, 2, 3, 200, 150));
add(addButton, getConstraint(2, 4, 1, 1));
add(removeButton, getConstraint(2, 5, 1, 1));
}
private void setListeners(){
pathList.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if(pathList.getSelectedIndex() >= 0){
removeButton.setEnabled(true);
} else {
removeButton.setEnabled(false);
}
}
});
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
showAddFileDialog();
}
});
removeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
pathListModel.remove(pathList.getSelectedIndex());
}
});
localeService.addServiceListener(new IServiceListener() {
@Override
public void update() {
applicationNameLabel.setText(localeService.getTranslatedString("ApplicationNameLabel"));
languageSelectLabel.setText(localeService.getTranslatedString("LanguageSelectLabel"));
versionLabel.setText(localeService.getTranslatedString("VersionLabel"));
pathLabel.setText(localeService.getTranslatedString("PathLabel"));
addButton.setText(localeService.getTranslatedString("AddButton"));
removeButton.setText(localeService.getTranslatedString("RemoveButton"));
}
});
}
private void showAddFileDialog() {
FileDialog fileChooser = new FileDialog(JFileChooser.DIRECTORIES_ONLY, localeService.getTranslatedString("AddButton"));
String pathToSelectedFileDir;
if((selectedFile != null) && (!selectedFile.equals(""))){
if(selectedFile.contains("\\")) {
pathToSelectedFileDir = selectedFile.substring(0, selectedFile.lastIndexOf('\\') + 1);
fileChooser.setCurrentDirectory(new File(pathToSelectedFileDir));
}
}
int returnVal = fileChooser.showDialog(this);
if(returnVal == JFileChooser.APPROVE_OPTION) {
selectedFile = fileChooser.getSelectedFile().getAbsolutePath();
pathListModel.add(pathListModel.size(), selectedFile);
ConfigurationManager.setProperty("LastUsedAddProjectPath", selectedFile);
}
}
private void setDefaultValues(){
ApplicationDTO applicationData = ServiceProvider.getInstance().getDefineService().getApplicationDetails();
applicationNameText.setText(applicationData.name);
versionText.setText(applicationData.version);
boolean applicationHasProject = applicationData.projects.size() > 0;
ArrayList<String> items = new ArrayList<String>();
if(applicationHasProject){
for(int i=0; i<languages.length; i++){
if(applicationData.projects.get(0).programmingLanguage.equals(languages[i])){
languageSelect.setSelectedIndex(i);
}
}
items = applicationData.projects.get(0).paths;
for (int i=0; i<items.size(); i++) {
pathListModel.add(i, items.get(i));
}
}
}
public ApplicationDTO getApplicationData(){
String name = applicationNameText.getText();
String language = languages[languageSelect.getSelectedIndex()];
String version = versionText.getText();
ArrayList<String> paths = new ArrayList<String>(Arrays.asList(Arrays.copyOf(pathListModel.toArray(), pathListModel.toArray().length, String[].class)));
ApplicationDTO applicationData = mainController.getApplicationController().createApplicationData(name, language, version, paths);
return applicationData;
}
private GridBagConstraints getConstraint(int gridx, int gridy, int gridwidth, int gridheight, int ipadx, int ipady){
constraint.fill = GridBagConstraints.BOTH;
constraint.insets = new Insets(3, 3, 3, 3);
constraint.ipadx = ipadx;
constraint.ipady = ipady;
constraint.gridx = gridx;
constraint.gridy = gridy;
constraint.gridwidth = gridwidth;
constraint.gridheight = gridheight;
return constraint;
}
private GridBagConstraints getConstraint(int gridx, int gridy, int gridwidth, int gridheight){
return getConstraint(gridx, gridy, gridwidth, gridheight, 0, 0);
}
public boolean dataValidated() {
String applicationName = applicationNameText.getText();
boolean showError = false;
String errorMessage = "";
if(applicationName == null || applicationName.length() < 1){
errorMessage = localeService.getTranslatedString("FieldEmptyError");
showError = true;
}else if (!Regex.matchRegex(Regex.nameWithSpacesRegex, applicationNameText.getText())) {
errorMessage = localeService.getTranslatedString("MustBeAlphaNumericError");
showError = true;
}else if(pathListModel.size() < 1){
errorMessage = localeService.getTranslatedString("NoPathsAdded");
showError = true;
}
if(showError){
controlService.showErrorMessage(errorMessage);
return false;
}
return true;
}
public JDialog getDialogOwner() {
return dialogOwner;
}
public void setDialogOwner(JDialog dialogOwner) {
this.dialogOwner = dialogOwner;
}
}