/*
* File : ProjectInstallerEditPanel.java
* Created : 02-sep-2004 12:08
* By : fbusquets
*
* JClic - Authoring and playing system for educational activities
*
* Copyright (C) 2000 - 2005 Francesc Busquets & Departament
* d'Educacio de la Generalitat de Catalunya
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 for more details (see the LICENSE file).
*/
package edu.xtec.jclic.project;
import edu.xtec.jclic.fileSystem.FileSystem;
import edu.xtec.jclic.misc.Utils;
import edu.xtec.util.JDomUtility;
import edu.xtec.util.Messages;
import edu.xtec.util.Options;
import edu.xtec.util.StrUtils;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
/**
*
* @author Francesc Busquets (fbusquets@xtec.cat)
* @version 13.09.17
*/
public class ProjectInstallerEditPanel extends javax.swing.JPanel implements ListSelectionListener, ActionListener{
Options options;
DefaultListModel availModel, filesModel;
/** Creates new form ProjectInstallerEditPanel */
public ProjectInstallerEditPanel(Options options) {
this.options=options;
availModel=new DefaultListModel();
filesModel=new DefaultListModel();
initComponents();
availFiles.addListSelectionListener(this);
includedFiles.addListSelectionListener(this);
addBtn.addActionListener(this);
removeBtn.addActionListener(this);
checkButtons();
}
/** 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.
*/
private void initComponents() {//GEN-BEGIN:initComponents
javax.swing.JLabel authLb;
javax.swing.JPanel buttonPanel;
javax.swing.JLabel descLb;
javax.swing.JPanel filesPanel;
javax.swing.JLabel folderLb;
java.awt.GridBagConstraints gridBagConstraints;
javax.swing.JLabel iconLb;
javax.swing.JLabel projectLb;
javax.swing.JLabel titleLb;
javax.swing.JLabel txtLb;
titleLb = new javax.swing.JLabel();
titleFld = new javax.swing.JTextField();
authLb = new javax.swing.JLabel();
authFld = new javax.swing.JTextField();
folderLb = new javax.swing.JLabel();
folderFld = new javax.swing.JTextField();
filesPanel = new javax.swing.JPanel();
availFilesSP = new javax.swing.JScrollPane();
availFiles = new javax.swing.JList();
addBtn = new javax.swing.JButton();
removeBtn = new javax.swing.JButton();
includedFilesSP = new javax.swing.JScrollPane();
includedFiles = new javax.swing.JList();
buttonPanel = new javax.swing.JPanel();
projectLb = new javax.swing.JLabel();
projectFld = new javax.swing.JTextField();
txtLb = new javax.swing.JLabel();
textFld = new javax.swing.JTextField();
iconLb = new javax.swing.JLabel();
iconFld = new javax.swing.JTextField();
descLb = new javax.swing.JLabel();
descFld = new javax.swing.JTextField();
setLayout(new java.awt.GridBagLayout());
titleLb.setLabelFor(titleFld);
titleLb.setText(options.getMsg("installer_title"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
add(titleLb, gridBagConstraints);
titleFld.setToolTipText(options.getMsg("installer_title_tooltip"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
add(titleFld, gridBagConstraints);
authLb.setLabelFor(authFld);
authLb.setText(options.getMsg("installer_authors"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
add(authLb, gridBagConstraints);
authFld.setToolTipText(options.getMsg("installer_authors_tooltip"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
add(authFld, gridBagConstraints);
folderLb.setLabelFor(folderFld);
folderLb.setText(options.getMsg("installer_folder"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
add(folderLb, gridBagConstraints);
folderFld.setToolTipText(options.getMsg("installer_folder_tooltip"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
add(folderFld, gridBagConstraints);
filesPanel.setLayout(new java.awt.GridBagLayout());
filesPanel.setBorder(new javax.swing.border.TitledBorder(options.getMsg("installer_files")));
filesPanel.setToolTipText(options.getMsg("installer_files_tooltip"));
availFilesSP.setPreferredSize(new java.awt.Dimension(120, 100));
availFiles.setToolTipText(options.getMsg("installer_files_available"));
availFiles.setModel(availModel);
availFilesSP.setViewportView(availFiles);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridheight = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 0.5;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
filesPanel.add(availFilesSP, gridBagConstraints);
addBtn.setToolTipText(options.getMsg("installer_files_add_tooltip"));
addBtn.setText(options.getMsg("installer_files_add"));
addBtn.setEnabled(false);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
filesPanel.add(addBtn, gridBagConstraints);
removeBtn.setToolTipText(options.getMsg("installer_files_tooltip"));
removeBtn.setText(options.getMsg("installer_files_remove"));
removeBtn.setEnabled(false);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
filesPanel.add(removeBtn, gridBagConstraints);
includedFilesSP.setPreferredSize(new java.awt.Dimension(120, 100));
includedFiles.setToolTipText(options.getMsg("installer_files_selected"));
includedFiles.setModel(filesModel);
includedFilesSP.setViewportView(includedFiles);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.gridheight = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 0.5;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
filesPanel.add(includedFilesSP, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
add(filesPanel, gridBagConstraints);
buttonPanel.setLayout(new java.awt.GridBagLayout());
buttonPanel.setBorder(new javax.swing.border.TitledBorder(options.getMsg("installer_button")));
buttonPanel.setToolTipText(options.getMsg("installer_button_tooltip"));
projectLb.setLabelFor(projectFld);
projectLb.setText(options.getMsg("installer_button_project"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
buttonPanel.add(projectLb, gridBagConstraints);
projectFld.setToolTipText(options.getMsg("installer_button_project_tooltip"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
buttonPanel.add(projectFld, gridBagConstraints);
txtLb.setLabelFor(textFld);
txtLb.setText(options.getMsg("installer_button_text"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
buttonPanel.add(txtLb, gridBagConstraints);
textFld.setToolTipText(options.getMsg("installer_button_text_tooltip"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
buttonPanel.add(textFld, gridBagConstraints);
iconLb.setLabelFor(iconFld);
iconLb.setText(options.getMsg("installer_button_icon"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
buttonPanel.add(iconLb, gridBagConstraints);
iconFld.setToolTipText(options.getMsg("installer_button_icon_tooltip"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
buttonPanel.add(iconFld, gridBagConstraints);
descLb.setLabelFor(descFld);
descLb.setText(options.getMsg("installer_button_description"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
buttonPanel.add(descLb, gridBagConstraints);
descFld.setToolTipText(options.getMsg("installer_button_description_tooltip"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
buttonPanel.add(descFld, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
add(buttonPanel, gridBagConstraints);
}//GEN-END:initComponents
private String suggestedFileName;
public void setValues(JClicProject prj){
suggestedFileName=null;
ProjectInstaller pi=null;
ProjectInstaller.IconItem ii;
FileSystem fs=prj.getFileSystem();
File base=new File(FileSystem.sysFn(fs.getFullFileNamePath(null)));
try{
File[] files=base.listFiles(Utils.getFileFilter(Utils.INSTALL_FF, options.getMessages()));
if(files!=null){
for(int i=0; i<files.length; i++){
if(files[i].isFile()){
suggestedFileName=files[i].getName();
pi=ProjectInstaller.getProjectInstaller(fs.getFullFileNamePath(suggestedFileName));
break;
}
}
}
} catch(Exception ex){
System.err.println("Error reading installer: "+ex);
}
if(suggestedFileName==null){
suggestedFileName=FileSystem.getValidFileName(prj.getName().trim())+".jclic.inst";
}
if(pi==null){
pi=new ProjectInstaller();
pi.projectTitle=prj.settings.title;
pi.baseFolder=base.getName();
StringBuilder sb=new StringBuilder();
if(prj.settings.authors!=null){
for(int i=0; i<prj.settings.authors.length; i++){
if(i>0)
sb.append(", ");
sb.append(prj.settings.authors[i].name);
}
}
pi.authors=sb.substring(0);
String projectFileName=prj.getFullPath();
if(projectFileName!=null)
projectFileName=FileSystem.getFileNameOf(projectFileName);
else
projectFileName=prj.getName()+".jclic.zip";
pi.addFile(projectFileName);
ii=pi.createIconItem();
ii.project=projectFileName;
ii.text=prj.settings.title;
ii.icon=prj.settings.iconFileName;
}
titleFld.setText(StrUtils.secureString(pi.projectTitle));
authFld.setText(StrUtils.secureString(pi.authors));
folderFld.setText(StrUtils.secureString(pi.baseFolder));
availModel.removeAllElements();
List<String> v=new ArrayList<String>();
FileSystem.exploreFiles(null, base, v, '/', null, 3, 300);
for (String v1 : v)
availModel.addElement(v1);
filesModel.removeAllElements();
for(int i=0; i<pi.files.size(); i++){
String s=pi.getFile(i);
if(availModel.contains(s))
availModel.removeElement(s);
filesModel.addElement(s);
}
ii=pi.getIconItem(0);
if(ii!=null){
projectFld.setText(StrUtils.secureString(ii.project));
textFld.setText(StrUtils.secureString(ii.text));
iconFld.setText(StrUtils.secureString(ii.icon));
descFld.setText(StrUtils.secureString(ii.description));
}
checkButtons();
}
private void checkButtons(){
addBtn.setEnabled(!availFiles.isSelectionEmpty());
removeBtn.setEnabled(!includedFiles.isSelectionEmpty());
}
public void valueChanged(ListSelectionEvent e){
if(!e.getValueIsAdjusting())
checkButtons();
}
public void actionPerformed(ActionEvent ev){
if(ev!=null && ev.getSource()!=null){
DefaultListModel src=null, dest=null;
JList list=null;
if(ev.getSource()==addBtn){
src=availModel;
dest=filesModel;
list=availFiles;
}
else if(ev.getSource()==removeBtn){
dest=availModel;
src=filesModel;
list=includedFiles;
}
if(dest!=null && src!=null & list!=null){
Object[] values=list.getSelectedValues();
if(values!=null){
for(int i=0; i<values.length; i++){
src.removeElement(values[i]);
dest.addElement(values[i]);
}
}
checkButtons();
}
}
}
public ProjectInstaller getProjectInstaller(Component parent){
ProjectInstaller result=new ProjectInstaller();
String errorKey=null;
result.projectTitle=StrUtils.nullableString(titleFld.getText());
result.authors=StrUtils.nullableString(authFld.getText());
result.baseFolder=StrUtils.nullableString(folderFld.getText());
int numFiles=filesModel.getSize();
for(int i=0; i<numFiles; i++)
result.addFile((String)filesModel.get(i));
ProjectInstaller.IconItem ii=result.createIconItem();
ii.project=StrUtils.nullableString(projectFld.getText());
ii.text=StrUtils.nullableString(textFld.getText());
ii.icon=StrUtils.nullableString(iconFld.getText());
ii.description=StrUtils.nullableString(descFld.getText());
if(result.projectTitle==null)
errorKey="noTitle";
else if(result.baseFolder==null)
errorKey="noBaseFolder";
else if(numFiles==0)
errorKey="noFilesSelected";
else if(ii.project==null)
errorKey="noProjectSelected";
else if(ii.text==null)
errorKey="noButtonText";
else if(!result.files.contains(ii.project))
errorKey="projectNotInFiles";
if(errorKey!=null)
options.getMessages().showErrorWarning(parent, "installer_error_"+errorKey, null);
return errorKey!=null ? null : result;
}
public static void createInstaller(JClicProject prj, Component parent){
Options options=prj.getBridge().getOptions();
Messages msg=options.getMessages();
ProjectInstallerEditPanel panel=new ProjectInstallerEditPanel(options);
panel.setValues(prj);
boolean exit=false;
while(!exit){
if(msg.showInputDlg(parent, panel, "installer_caption")){
ProjectInstaller result=panel.getProjectInstaller(parent);
if(result!=null){
int[] filters={Utils.INSTALL_FF};
FileSystem fs=prj.getFileSystem();
String fileName=fs.chooseFile(panel.suggestedFileName, true, filters, options, null, parent, false);
if(fileName!=null){
try{
FileOutputStream fos=fs.createSecureFileOutputStream(fileName);
JDomUtility.saveDocument(fos, new org.jdom.Document(result.getJDomElement(false)));
fos.close();
exit=true;
} catch(Exception ex){
options.getMessages().showErrorWarning(parent, null, ex);
}
}
else
exit=true;
}
}
else
exit=true;
}
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton addBtn;
private javax.swing.JTextField authFld;
private javax.swing.JList availFiles;
private javax.swing.JScrollPane availFilesSP;
private javax.swing.JTextField descFld;
private javax.swing.JTextField folderFld;
private javax.swing.JTextField iconFld;
private javax.swing.JList includedFiles;
private javax.swing.JScrollPane includedFilesSP;
private javax.swing.JTextField projectFld;
private javax.swing.JButton removeBtn;
private javax.swing.JTextField textFld;
private javax.swing.JTextField titleFld;
// End of variables declaration//GEN-END:variables
}