/*
* File : ProjectLibrary.java
* Created : 04-jun-2002 10:37
* 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.*;
import edu.xtec.jclic.activities.panels.*;
import edu.xtec.jclic.bags.*;
import edu.xtec.jclic.boxes.ActiveBoxContent;
import edu.xtec.jclic.boxes.BoxBase;
import edu.xtec.jclic.edit.*;
import edu.xtec.jclic.fileSystem.FileSystem;
import edu.xtec.util.ResourceBridge;
import edu.xtec.util.ResourceManager;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.io.FileOutputStream;
import javax.swing.*;
/**
*
* @author Francesc Busquets (fbusquets@xtec.cat)
* @version 13.08.29
*/
public class ProjectLibrary extends JClicProject implements Editable{
public static final String LIBRARY_TYPE="library";
public static final String MSG_ID="library_";
/** Creates new ProjectLibrary */
private ProjectLibrary(ResourceBridge rb, FileSystem fileSystem, String fullPath) {
super(rb, fileSystem, fullPath);
type=LIBRARY_TYPE;
}
//public void load(org.jdom.Element e) throws Exception{
@Override
public void setProperties(org.jdom.Element e, Object aux) throws Exception{
type=null;
super.setProperties(e, aux);
if(!LIBRARY_TYPE.equals(type))
throw new Exception(bridge.getMsg("library_badFormat"));
}
public static ProjectLibrary createNewProjectLibrary(ResourceBridge rb, FileSystem fileSystem){
ProjectLibrary pl=new ProjectLibrary(rb, fileSystem, null);
pl.settings.title=rb.getMsg("library_newLibraryName");
Menu m=new Menu(pl);
m.name="main";
String description=rb.getMsg("library_mainMenu");
m.description=description;
/*
edu.xtec.jclic.boxes.ActiveBoxContent initMess=new edu.xtec.jclic.boxes.ActiveBoxContent();
initMess.setBoxBase(new edu.xtec.jclic.boxes.BoxBase());
initMess.setTextContent(description);
m.setMessage(Activity.MSG_TYPE[Activity.MAIN], initMess);
*/
ActiveBoxContent[] messages=m.getMessages();
messages[Activity.MAIN]=new ActiveBoxContent();
messages[Activity.MAIN].setBoxBase(new BoxBase());
messages[Activity.MAIN].setTextContent(description);
pl.activityBag.addActivity(m);
pl.activitySequence.add(new ActivitySequenceElement(m.name, true));
return pl;
}
public static ProjectLibrary getProjectLibrary(org.jdom.Element e, ResourceBridge rb, FileSystem fileSystem, String fullPath) throws Exception{
ProjectLibrary pl=new ProjectLibrary(rb, fileSystem, fullPath);
//pl.load(e);
pl.setProperties(e, null);
return pl;
}
public static ProjectLibrary loadProjectLibrary(String fullPath, ResourceBridge rb) throws Exception{
FileSystem fs=FileSystem.createFileSystem(fullPath, rb);
org.jdom.Document doc=fs.getXMLDocument(FileSystem.getFileNameOf(fullPath));
ProjectLibrary pl=new ProjectLibrary(rb, fs, fullPath);
//pl.load(doc.getRootElement());
pl.setProperties(doc.getRootElement(), null);
return pl;
}
public void save(String path) throws Exception{
if(path==null)
path=fullPath;
FileOutputStream fos=fileSystem.createSecureFileOutputStream(path);
saveDocument(fos);
fos.close();
}
@Override
public String toString(){
return settings.title;
}
@Override
public String getPublicName(){
//System.out.println("public name is: "+settings.title);
return settings.title;
}
public Menu getRootMenu(){
Menu result=null;
if(activitySequence.getSize()>0){
try{
ActivitySequenceElement ase=activitySequence.getElement(0, false);
if(ase!=null){
Activity act=Activity.getActivity(activityBag.getElement(ase.getActivityName()).getData(), this);
if(act instanceof Menu){
result=(Menu)act;
}
}
}
catch(Exception ex){
System.err.println("Error reading project library!\n"+ex);
}
}
return result;
}
@Override
public Editor getEditor(Editor parent){
return Editor.createEditor(getClass().getName()+"Editor", this, parent);
}
public boolean editProjectLibrary(Object parent){
ProjectLibraryDialog pld;
if(parent instanceof JDialog)
pld=new ProjectLibraryDialog(true, true, (JDialog)parent);
else
pld=new ProjectLibraryDialog(true, true);
pld.setVisible(true);
return pld.accept;
}
protected JComponent getRbComponent(){
if(bridge==null)
return null;
return bridge.getComponent();
}
protected String getRbMessage(String msg){
if(bridge==null){
return "";
}
return bridge.getMsg(msg);
}
class ProjectLibraryDialog extends edu.xtec.util.ExtendedJDialog{
ProjectLibraryEditor pled;
EditorTreePanel etp;
Menu result=null;
boolean accept=false;
//boolean modified=false;
boolean allowEdit, allowNewMenu;
Action selectAction, cancelAction;
ProjectLibraryDialog(boolean allowNewMenu, boolean allowEdit, JDialog parent){
super(parent, bridge.getMsg(MSG_ID+"caption"), true);
this.allowEdit=allowEdit;
this.allowNewMenu=allowNewMenu;
init();
}
ProjectLibraryDialog(boolean allowNewMenu, boolean allowEdit){
//super(rb.getComponent(), rb.getMsg(MSG_ID+"caption"), true);
super(getRbComponent(), getRbMessage(MSG_ID+"caption"), true);
this.allowEdit=allowEdit;
this.allowNewMenu=allowNewMenu;
init();
}
protected void init(){
buildActions();
pled=(ProjectLibraryEditor)getEditor(null);
etp=new EditorTreePanel(pled, bridge.getOptions(), !allowEdit, (allowEdit ? null : Menu.class))
{
@Override
protected void currentItemChanged(){
if(!allowEdit)
selectAction.setEnabled(currentItem!=null);
super.currentItemChanged();
}
};
getContentPane().add(etp, BorderLayout.CENTER);
JPanel buttonsPanel=new JPanel();
buttonsPanel.add(new JButton(selectAction));
buttonsPanel.add(new JButton(cancelAction));
/*
if(allowNewMenu || allowEdit){
buttonsPanel.add(new JButton(newFolderAction));
}
*/
getContentPane().add(buttonsPanel, BorderLayout.SOUTH);
pack();
centerOver(bridge.getComponent());
}
void buildActions(){
String s=allowEdit ? "select_caption_ok" : "select_caption";
selectAction=new AbstractAction(
bridge.getMsg(MSG_ID+s),
ResourceManager.getImageIcon(allowEdit ? "icons/commit_changes.gif" : "icons/file_open.gif")
){
public void actionPerformed(ActionEvent ev){
if(allowEdit && etp.getCurrentPanel()!=null){
etp.getCurrentPanel().save();
if(pled.isModified()){
pled.saveMenus(pled);
try{
save(null);
} catch(Exception ex){
bridge.getOptions().getMessages().showErrorWarning(getParent(), "FILE_ERR_SAVING", fullPath, ex, null);
}
}
}
if(etp.currentItem!=null && etp.currentItem instanceof MenuEditor){
result=((MenuEditor)etp.currentItem).getMenu();
}
else{
result=null;
if(!allowEdit)
return;
}
//modified=etp.modified;
accept=true;
setVisible(false);
}
};
selectAction.putValue(AbstractAction.SHORT_DESCRIPTION, bridge.getMsg(MSG_ID+s+"_tooltip"));
if(!allowEdit)
selectAction.setEnabled(false);
cancelAction=new AbstractAction(
bridge.getMsg(MSG_ID+"cancel_caption"),
ResourceManager.getImageIcon("icons/cancel.gif")
){
public void actionPerformed(ActionEvent ev){
result=null;
//modified=false;
accept=false;
setVisible(false);
}
};
cancelAction.putValue(AbstractAction.SHORT_DESCRIPTION, bridge.getMsg(MSG_ID+"cancel_tooltip"));
}
}
}