/*
* File : ActivityBagEditor.java
* Created : 19-sep-2002 09:53
* 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.*;
import edu.xtec.jclic.edit.*;
import edu.xtec.jclic.project.JClicProjectEditor;
import edu.xtec.util.Messages;
import edu.xtec.util.Options;
import java.awt.Component;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.tree.MutableTreeNode;
/**
*
* @author Francesc Busquets (fbusquets@xtec.cat)
* @version 13.09.16
*/
public class ActivityBagEditor extends Editor {
public static ImageIcon icon;
public static EditorAction newActivityBagElementAction;
public static EditorAction copyActivityAttributesAction;
public static boolean actionsCreated;
private boolean initializing;
private static NewActivityPanel newActivityPanel=null;
/** Creates a new instance of ActivityBagEditor */
public ActivityBagEditor(ActivityBag ab) {
super(ab);
}
protected void createChildren() {
initializing=true;
ActivityBag ab=getActivityBag();
if(ab!=null){
int s=ab.size();
for(int i=0; i<s; i++){
ab.elementAt(i).getEditor(this);
}
}
initializing=false;
}
public EditorPanel createEditorPanel(Options options) {
return new ActivityBagEditorPanel(options);
}
public Class getEditorPanelClass() {
return ActivityBagEditorPanel.class;
}
@Override
public String getTitleKey(){
return "edit_activities";
}
public ActivityBag getActivityBag(){
return (ActivityBag)getUserObject();
}
public static Icon getIcon(){
if(icon==null)
icon=edu.xtec.util.ResourceManager.getImageIcon("icons/database.gif");
return icon;
}
@Override
public javax.swing.Icon getIcon(boolean leaf, boolean expanded){
return getIcon();
}
@Override
public String toString(){
return "Activity bag";
}
public Options getOptions(){
return getActivityBag().getProject().getBridge().getOptions();
}
public JClicProjectEditor getProjectEditor(){
return (JClicProjectEditor)getFirstParent(JClicProjectEditor.class);
}
public boolean createNewActivityBagElement(int index, Component dlgParent){
String actClassName=null, actName=null;
// Modified: 14-09-2010 - suggested by Camille Manoury
// On errors (empty class name, empty or repeated activity name...) prompt again
//
while(true){
if(newActivityPanel==null)
newActivityPanel=new NewActivityPanel(getOptions());
else
newActivityPanel.setActivityName(null);
if(!getOptions().getMessages().showInputDlg(dlgParent
, newActivityPanel
, "edit_act_newActivity"))
return false;
actClassName=newActivityPanel.gectActivityClassName();
if(actClassName==null){
getOptions().getMessages().showAlert(dlgParent, "edit_act_newActivity_error_noAct");
continue;
}
actName=newActivityPanel.getActivityName();
if(actName==null){
getOptions().getMessages().showAlert(dlgParent, "edit_act_newActivity_error_noName");
continue;
}
if(getActivityBag().getElementIndex(actName)>=0){
getOptions().getMessages().showAlert(dlgParent, "edit_media_rename_exists");
continue;
}
break;
}
// ------------------
Activity act;
try{
act=Activity.getActivity(actClassName, getProjectEditor().getProject());
act.name=actName;
} catch(Exception ex){
getOptions().getMessages().showErrorWarning(dlgParent, "edit_act_newActivity_error_creating", ex);
return false;
}
org.jdom.Element e=act.getJDomElement();
if(e==null){
getOptions().getMessages().showErrorWarning(dlgParent, "edit_act_newActivity_error_creating", null);
return false;
}
ActivityBagElement abe=new ActivityBagElement(act.getJDomElement());
ActivityBagElementEditor abeed=(ActivityBagElementEditor)abe.getEditor(null);
if(index<0)
index=getChildCount();
else
index=Math.min(index, getChildCount());
return insertEditor(abeed, true, index, true);
}
public void changeActivityClass(ActivityBagElementEditor abed, String newClassName) throws Exception{
abed.collectData();
ActivityBagElement abe=abed.getActivityBagElement();
abed.forgetActivityEditor();
Activity act=Activity.getActivity(newClassName, getProjectEditor().getProject());
act.setProperties(abe.getData(), null);
abe.setData(act.getJDomElement());
setModified(true);
}
@Override
public void setActionsOwner() {
allowDelete = allowCut = allowCopy = allowPaste = false;
super.setActionsOwner();
if(actionsCreated){
newActivityBagElementAction.setActionOwner(this);
}
}
@Override
public void clearActionsOwner(){
super.clearActionsOwner();
if(actionsCreated){
newActivityBagElementAction.setActionOwner(null);
}
}
public static void createActions(Options options){
createBasicActions(options);
if(!actionsCreated){
newActivityBagElementAction=new EditorAction("edit_act_newActivity", "icons/new_miniclic.png", "edit_act_newActivity_tooltip", options){
protected void doAction(Editor e){
Editor ch=null;
if(e instanceof ActivityBagElementEditor){
ch=e;
e=e.getEditorParent();
}
if(e instanceof ActivityBagEditor)
((ActivityBagEditor)e).createNewActivityBagElement(e.getNearestIndex(ch, true), getComponentSrc());
}
};
copyActivityAttributesAction=new EditorAction("edit_act_copyAttributes", "icons/copy_properties.gif", "edit_act_copyAttributes_tooltip", options){
protected void doAction(Editor e){
Editor ch=null;
//if(e instanceof ActivityBagElementEditor){
// ch=e;
// e=e.getEditorParent();
//}
if(e instanceof ActivityBagElementEditor){
CopyActivityAttributesPanel catrp=new CopyActivityAttributesPanel(this.options, (ActivityBagElementEditor)e);
catrp.showDialog(getComponentSrc());
}
}
};
actionsCreated=true;
}
}
@Override
public void insert(MutableTreeNode newChild, int childIndex){
super.insert(newChild, childIndex);
if(!initializing){
ActivityBagElement abe=((ActivityBagElementEditor)newChild).getActivityBagElement();
if(getActivityBag().getElementIndex(abe.getName())>=0){
String name=abe.getName();
int i=name.length()-1;
while(i>=0 && Character.isDigit(name.charAt(i)))
i--;
name=name.substring(0, i+1);
if(!name.endsWith("_"))
name=name+"_";
int suffix=2;
while(getActivityBag().getElementIndex(name+suffix)>=0)
suffix++;
abe.getData().setAttribute(Activity.NAME, name+suffix);
}
getActivityBag().insertElementAt(abe, childIndex);
}
}
@Override
public void remove(int childIndex){
super.remove(childIndex);
getActivityBag().removeElementAt(childIndex);
}
public boolean nameChanged(int type, String oldName, String newName){
boolean result=false;
Enumeration en=children();
while(en.hasMoreElements())
result|=((ActivityBagElementEditor)en.nextElement()).nameChanged(type, oldName, newName);
return result;
}
public int checkOrphanElements(Options options, Component parent, boolean prompt){
int result=Messages.YES;
List<String> v=new ArrayList<String>();
ActivityBagElement[] abel=getActivityBag().getElements();
ActivitySequenceEditor ased=getProjectEditor().getActivitySequenceEditor();
ActivitySequenceElement[] asel=ased.getActivitySequence().getElements();
for(int i=0; i<abel.length; i++){
String actName=abel[i].getName();
int j;
for(j=0; j<asel.length; j++){
if(asel[j].getActivityName().equals(actName))
break;
}
if(j==asel.length){
v.add(actName);
}
}
if(!v.isEmpty()){
boolean doIt=!prompt;
if(!doIt){
//result=options.getMessages().showQuestionDlg(parent, "edit_project_orphanActivities", null, true);
Object[] object=new Object[]{
options.getMsg("edit_project_orphanActivities"),
v.size()>10 ? (Object)(new javax.swing.JScrollPane(new javax.swing.JList(v.toArray()))) : (Object)v,
options.getMsg("edit_project_orphanActivities_prompt"),
};
result=options.getMessages().showQuestionDlgObj(parent, object, "edit_project_orphanActivities_title", "ync");
doIt=(result==Messages.YES);
}
if(doIt){
Iterator<String> it=v.iterator();
while(it.hasNext()){
ased.createNewSequenceElement(it.next(), null, -1);
}
}
}
return result;
}
}