/*
* File : MediaBagElementEditorPanel.java
* Created : 02-feb-2004 13:50
* 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.bags;
import edu.xtec.jclic.edit.Editor;
import edu.xtec.jclic.edit.EditorPanel;
import edu.xtec.jclic.fileSystem.FileSystem;
import edu.xtec.jclic.fileSystem.ZipFileSystem;
import edu.xtec.jclic.misc.Utils;
import edu.xtec.jclic.project.JClicProjectEditor;
import edu.xtec.util.Messages;
import edu.xtec.util.Options;
import edu.xtec.util.ProgressDialog;
import edu.xtec.util.StreamIO;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.EventObject;
import java.util.List;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
/**
*
* @author Francesc Busquets (fbusquets@xtec.cat)
* @version 13.08.14
*/
public class MediaBagElementEditorPanel extends EditorPanel {
protected ZipFileSystem.ExtendedZipEntry zipEntry;
protected ZipFileSystem zipFileSystem;
/** Creates new form MediaBagElementEditorPanel */
public MediaBagElementEditorPanel(Options options) {
super(options);
//MediaBagEditor.createActions(options);
//MediaBagElementEditor.createActions(options);
initComponents();
refList.addListSelectionListener(new ListSelectionListener(){
public void valueChanged(ListSelectionEvent e){
if(!e.getValueIsAdjusting()){
editActBtn.setEnabled(e.getFirstIndex()>=0);
}
}
});
postInit(250, false, false);
}
@Override
protected String getTitle(){
return options.getMsg("edit_media_title");
}
/** 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.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
mainPanel = new javax.swing.JPanel();
settingsPanel = new javax.swing.JPanel();
javax.swing.JLabel nameLb = new javax.swing.JLabel();
nameText = new javax.swing.JLabel();
chNameBtn = new javax.swing.JButton();
chNameBtn.addActionListener(this);
javax.swing.JLabel fileLb = new javax.swing.JLabel();
fileText = new javax.swing.JLabel();
chFileBtn = new javax.swing.JButton();
chFileBtn.addActionListener(this);
saveFileBtn = new javax.swing.JButton();
refreshFileBtn = new javax.swing.JButton();
refreshFileBtn.addActionListener(this);
javax.swing.JLabel typeLb = new javax.swing.JLabel();
typeTx = new javax.swing.JLabel();
javax.swing.JLabel sizeLb = new javax.swing.JLabel();
sizeTx = new javax.swing.JLabel();
zipIncludeChk = new javax.swing.JCheckBox();
zipIncludeChk.addActionListener(this);
refPanel = new javax.swing.JPanel();
refScroll = new javax.swing.JScrollPane();
refList = new javax.swing.JList();
editActBtn = new javax.swing.JButton();
editActBtn.addActionListener(this);
setLayout(new java.awt.BorderLayout());
mainPanel.setLayout(new java.awt.GridBagLayout());
settingsPanel.setLayout(new java.awt.GridBagLayout());
nameLb.setText(options.getMsg("edit_name"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
settingsPanel.add(nameLb, gridBagConstraints);
nameText.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
nameText.setMinimumSize(new java.awt.Dimension(200, 21));
nameText.setPreferredSize(new java.awt.Dimension(200, 21));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
settingsPanel.add(nameText, gridBagConstraints);
chNameBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/edit.gif"))); // NOI18N
chNameBtn.setToolTipText(options.getMsg("edit_media_change_name"));
chNameBtn.setText("");
chNameBtn.setMargin(new java.awt.Insets(2, 2, 2, 2));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
settingsPanel.add(chNameBtn, gridBagConstraints);
fileLb.setText(options.getMsg("edit_file"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
settingsPanel.add(fileLb, gridBagConstraints);
fileText.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
fileText.setMinimumSize(new java.awt.Dimension(200, 21));
fileText.setPreferredSize(new java.awt.Dimension(200, 21));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
settingsPanel.add(fileText, gridBagConstraints);
chFileBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/file_open.gif"))); // NOI18N
chFileBtn.setToolTipText(options.getMsg("edit_media_change_file"));
chFileBtn.setText("");
chFileBtn.setMargin(new java.awt.Insets(2, 2, 2, 2));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
settingsPanel.add(chFileBtn, gridBagConstraints);
saveFileBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/file_save.gif"))); // NOI18N
saveFileBtn.setToolTipText(options.getMsg("edit_media_save_file"));
saveFileBtn.setText("");
saveFileBtn.setMargin(new java.awt.Insets(2, 2, 2, 2));
saveFileBtn.addActionListener(this);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
settingsPanel.add(saveFileBtn, gridBagConstraints);
refreshFileBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/reset.gif"))); // NOI18N
refreshFileBtn.setToolTipText(options.getMsg("edit_media_refresh_file"));
refreshFileBtn.setText("");
refreshFileBtn.setMargin(new java.awt.Insets(2, 2, 2, 2));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
settingsPanel.add(refreshFileBtn, gridBagConstraints);
typeLb.setText(options.getMsg("edit_media_type"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
settingsPanel.add(typeLb, gridBagConstraints);
typeTx.setText("-");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
settingsPanel.add(typeTx, gridBagConstraints);
sizeLb.setText(options.getMsg("edit_media_size"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
settingsPanel.add(sizeLb, gridBagConstraints);
sizeTx.setText("0 Kb");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
settingsPanel.add(sizeTx, gridBagConstraints);
zipIncludeChk.setText(options.getMsg("edit_media_includeInZip"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
settingsPanel.add(zipIncludeChk, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
mainPanel.add(settingsPanel, gridBagConstraints);
refPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(options.getMsg("edit_media_referencedBy")));
refPanel.setMinimumSize(new java.awt.Dimension(180, 100));
refPanel.setPreferredSize(new java.awt.Dimension(180, 100));
refPanel.setLayout(new java.awt.BorderLayout());
refList.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
refListMouseClicked(evt);
}
});
refScroll.setViewportView(refList);
refPanel.add(refScroll, java.awt.BorderLayout.CENTER);
editActBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/miniclic.png"))); // NOI18N
editActBtn.setToolTipText(options.getMsg("edit_act_editActivity_tooltip"));
editActBtn.setText(options.getMsg("edit_act_editActivity"));
editActBtn.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
refPanel.add(editActBtn, java.awt.BorderLayout.SOUTH);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
mainPanel.add(refPanel, gridBagConstraints);
add(mainPanel, java.awt.BorderLayout.CENTER);
}// </editor-fold>//GEN-END:initComponents
private void refListMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_refListMouseClicked
if(refList.getSelectedValue()!=null && evt.getClickCount()==2){
editActivity(refList.getSelectedValue().toString());
}
}//GEN-LAST:event_refListMouseClicked
protected void editActivity(String activityName){
MediaBagElementEditor mbed=getMediaBagElementEditor();
if(mbed!=null && activityName!=null){
JClicProjectEditor prjed=(JClicProjectEditor)mbed.getFirstParent(JClicProjectEditor.class);
if(prjed!=null && prjed.getTestPlayerContainer()!=null){
prjed.getTestPlayerContainer().editActivity(activityName);
}
}
}
public boolean checkIfEditorValid(Editor e) {
return e instanceof MediaBagElementEditor;
}
protected MediaBagElementEditor getMediaBagElementEditor(){
return (MediaBagElementEditor)editor;
}
protected MediaBagElement getMediaBagElement(){
if(editor==null)
return null;
else
return getMediaBagElementEditor().getMediaBagElement();
}
protected MediaBag getMediaBag(){
if(editor==null)
return null;
else
return getMediaBagElementEditor().getMediaBag();
}
@Override
public void setEnabled(boolean enabled){
super.setEnabled(enabled);
if(!enabled){
chNameBtn.setEnabled(false);
chFileBtn.setEnabled(false);
saveFileBtn.setEnabled(false);
refreshFileBtn.setEnabled(false);
zipIncludeChk.setEnabled(false);
}
refList.setEnabled(enabled);
}
protected FileSystem fileSystem;
protected void fillData() {
MediaBagElementEditor mbed=getMediaBagElementEditor();
String fileName=mbed==null ? "" : mbed.getMediaBagElement().getFileName();
fileSystem= (mbed==null || mbed.getMediaBag()==null ? null : mbed.getMediaBag().getProject().getFileSystem());
if(fileSystem instanceof edu.xtec.jclic.fileSystem.ZipFileSystem){
zipFileSystem=(edu.xtec.jclic.fileSystem.ZipFileSystem)fileSystem;
zipEntry=zipFileSystem.getEntry(fileName);
} else{
zipFileSystem=null;
zipEntry=null;
}
String name=(mbed==null ? "" : mbed.getName());
nameText.setText(name);
nameText.setToolTipText(name);
chNameBtn.setEnabled(mbed!=null);
fileText.setText(fileName);
fileText.setToolTipText(fileName);
chFileBtn.setEnabled(mbed!=null);
saveFileBtn.setEnabled(zipEntry!=null);
refreshFileBtn.setEnabled(mbed!=null);
typeTx.setText(mbed==null
? ""
: mbed.getDescription(options));
long fSize=-1;
if(mbed!=null)
fSize=mbed.getFileSize();
sizeTx.setText(fSize<0
? ""
: options.getMessages().fileSize(fSize));
zipIncludeChk.setSelected(mbed==null ? true : mbed.getMediaBagElement().saveFlag);
zipIncludeChk.setEnabled(mbed!=null);
checkReferences();
}
protected void checkReferences(){
MediaBagElementEditor mbed=getMediaBagElementEditor();
List references=null;
if(mbed!=null){
references=mbed.listReferences();
}
refList.setListData(references==null ? new String[0] : references.toArray());
refList.setSelectedIndex(-1);
editActBtn.setEnabled(false);
}
/*
public boolean isModified(){
MediaBagElement mbe=getMediaBagElement();
return mbe!=null && mbe.saveFlag!=zipIncludeChk.isSelected();
}
*/
protected void saveData(){
MediaBagElementEditor mbed=getMediaBagElementEditor();
if(mbed!=null){
mbed.getMediaBagElement().saveFlag=zipIncludeChk.isSelected();
}
}
@Override
public boolean eventPerformed(EventObject ev){
if(ev!=null){
if(ev.getSource()==refreshFileBtn)
refreshFile();
else if(ev.getSource()==saveFileBtn)
saveFile();
else if(ev.getSource()==chFileBtn)
changeFileName();
else if(ev.getSource()==chNameBtn)
changeName();
else if(ev.getSource()==editActBtn && refList.getSelectedValue()!=null){
editActivity(refList.getSelectedValue().toString());
return false;
}
}
return true;
}
private void refreshFile(){
MediaBagElementEditor mbed=getMediaBagElementEditor();
if(mbed!=null){
if(zipEntry!=null){
if(!zipFileSystem.fileExists(getMediaBagElement().getFileName())){
options.getMessages().showAlert(this, "edit_media_warn_zipFileNotExternal");
return;
}
zipEntry.ignore=true;
zipEntry=null;
mbed.updateContent(this);
notifyChangesToParentPanel();
getEditor().setModified(true);
}
getMediaBagElement().setData(null);
//getEditor().fireEditorDataChanged(this);
}
}
private void saveFile() {
if(zipEntry!=null){
String fName=getMediaBagElement().getFileName();
String fNameDest=zipFileSystem.chooseFile(fName, true, null, options, "FILE_SAVE", this, false);
if(fNameDest!=null){
try{
OutputStream os=zipFileSystem.createSecureFileOutputStream(fNameDest);
int len=(int)zipFileSystem.getFileLength(fName);
InputStream is=zipFileSystem.getInputStream(fName);
StreamIO.writeStreamDlg(is, os, len, options.getMessages().get("filesystem_copyFile"), this, options);
} catch(Exception ex){
options.getMessages().showErrorWarning(this, "FILE_ERR_SAVING", ex);
}
}
}
}
private void changeFileName() {
MediaBagElementEditor mbed=getMediaBagElementEditor();
if(mbed!=null){
MediaBagElement mbe=mbed.getMediaBagElement();
Messages msg=options.getMessages();
String oldFileName=mbe.getFileName();
FileSystem fs=mbed.getMediaBag().getProject().getFileSystem();
int [] fileFilters=new int[]{Utils.getFileFilterCode(oldFileName)};
String newFileName=fs.chooseFile(oldFileName.replace('/', File.separatorChar), false, fileFilters, options, "edit_find_media", this, true);
if(newFileName!=null){
newFileName=newFileName.replace(File.separatorChar, '/');
if(mbed.changeFileName(newFileName, this, msg)){
notifyChangesToParentPanel();
}
}
}
}
private void changeName() {
final MediaBagElementEditor mbed=getMediaBagElementEditor();
if(mbed!=null){
Messages msg=options.getMessages();
final String oldName=getMediaBagElement().getName();
final String newName=msg.showInputDlg(MediaBagElementEditorPanel.this, "edit_media_rename", "edit_media_rename_prompt", oldName, "edit_media_rename_title", false);
if(newName!=null){
final ProgressDialog progressDialog=new ProgressDialog(this, options);
edu.xtec.util.SwingWorker sw=new edu.xtec.util.SwingWorker(){
@Override
public Object construct(){
mbed.rename(newName, MediaBagElementEditorPanel.this, options.getMessages());
return null;
}
@Override
public void finished(){
notifyChangesToParentPanel();
progressDialog.setVisible(false);
}
};
progressDialog.start("edit_media_rename", "edit_media_renaming", sw, false, false, false);
}
}
}
private void notifyChangesToParentPanel(){
MediaBagMultiEditorPanel mbep=(MediaBagMultiEditorPanel)getAWTAncestor(MediaBagMultiEditorPanel.class);
if(mbep!=null)
mbep.editorDataChanged(getEditor());
}
@Override
public void focusGained(java.awt.event.FocusEvent focusEvent) {
super.focusGained(focusEvent);
checkReferences();
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton chFileBtn;
private javax.swing.JButton chNameBtn;
private javax.swing.JButton editActBtn;
private javax.swing.JLabel fileText;
private javax.swing.JPanel mainPanel;
private javax.swing.JLabel nameText;
private javax.swing.JList refList;
private javax.swing.JPanel refPanel;
private javax.swing.JScrollPane refScroll;
private javax.swing.JButton refreshFileBtn;
private javax.swing.JButton saveFileBtn;
private javax.swing.JPanel settingsPanel;
private javax.swing.JLabel sizeTx;
private javax.swing.JLabel typeTx;
private javax.swing.JCheckBox zipIncludeChk;
// End of variables declaration//GEN-END:variables
}