/*
* File : ActivitySequenceEditor.java
* Created : 08-apr-2003 12:51
* 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.Constants;
import edu.xtec.jclic.edit.Editor;
import edu.xtec.jclic.edit.EditorAction;
import edu.xtec.jclic.edit.EditorPanel;
import edu.xtec.jclic.fileSystem.FileSystem;
import edu.xtec.jclic.project.JClicProjectEditor;
import edu.xtec.util.ListComboModel;
import edu.xtec.util.Messages;
import edu.xtec.util.Options;
import edu.xtec.util.StrUtils;
import java.awt.Component;
import java.util.Enumeration;
import javax.swing.DefaultListModel;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.tree.MutableTreeNode;
/**
*
* @author Francesc Busquets (fbusquets@xtec.cat)
* @version 13.08.29
*/
public class ActivitySequenceEditor extends Editor{
public static ImageIcon icon;
protected DefaultListModel tagList;
private boolean initializing;
public static boolean actionsCreated;
public static EditorAction newActivitySequenceElementAction;
/** Creates a new instance of ActivitySequenceEditor */
public ActivitySequenceEditor(ActivitySequence ac) {
super(ac);
}
protected void createChildren() {
initializing=true;
ActivitySequence as=getActivitySequence();
int n=as.getSize();
for(int i=0; i<n; i++)
as.getElement(i, false).getEditor(this);
initializing=false;
}
public EditorPanel createEditorPanel(Options options) {
return new ActivitySequenceEditorPanel(options);
}
public Class getEditorPanelClass() {
return ActivitySequenceEditorPanel.class;
}
@Override
public String getTitleKey(){
return "edit_sequences";
}
public ActivitySequence getActivitySequence(){
return (ActivitySequence)getUserObject();
}
public static Icon getIcon(){
if(icon==null)
icon=edu.xtec.util.ResourceManager.getImageIcon("icons/sequence.gif");
return icon;
}
@Override
public javax.swing.Icon getIcon(boolean leaf, boolean expanded){
return getIcon();
}
@Override
public String toString(){
return "Activity sequence";
}
public Options getOptions(){
return getActivitySequence().getProject().getBridge().getOptions();
}
public JClicProjectEditor getProjectEditor(){
return (JClicProjectEditor)getFirstParent(JClicProjectEditor.class);
}
public void removeElementsWith(String activityName){
String act=StrUtils.nullableString(activityName);
if(act!=null){
// Added 03-Feb-2011
// Normalize the activity name
act=FileSystem.stdFn(act);
// ---
int i=0;
int numElements=getChildCount();
while(i<numElements){
numElements=getChildCount();
for(i=0; i<numElements; i++){
ActivitySequenceElementEditor asee=(ActivitySequenceElementEditor)getChildAt(i);
if(act.equals(asee.getActivitySequenceElement().getActivityName())){
remove(i);
break;
}
}
}
}
}
public boolean createNewSequenceElement(int index, boolean prompt, Component dlgParent){
String act=null, tag=null;
Messages msg=getOptions().getMessages();
if(prompt){
ListModel lm=getProjectEditor().getActivityBagEditor().getListModel();
if(lm.getSize()==0){
msg.showAlert(dlgParent, "edit_seq_newElement_error_emptyList");
return false;
}
JComboBox actCombo=new JComboBox(new ListComboModel(
getProjectEditor().getActivityBagEditor().getListModel()
));
actCombo.setToolTipText(msg.get("edit_seq_activity_tooltip"));
JTextField tagField=new JTextField();
tagField.setToolTipText(msg.get("edit_seq_tag_tooltip"));
JComponent[] prompt_objects=new JComponent[]{actCombo, tagField};
String[] prompt_keys=new String[] {"edit_seq_activity", "edit_seq_tag"};
String[] prompt_msg=new String[] {"edit_seq_newElement_msg"};
if(!msg.showInputDlg(dlgParent
, prompt_msg, prompt_keys, prompt_objects
, "edit_seq_newElement"))
return false;
act=StrUtils.nullableString(actCombo.getSelectedItem());
tag=StrUtils.nullableString(tagField.getText());
}
if(act==null){
msg.showAlert(dlgParent, "edit_seq_newElement_error_noAct");
return false;
}
return createNewSequenceElement(act, tag, index);
}
public boolean createNewSequenceElement(String actName, String tag, int index){
ActivitySequenceElement ase=new ActivitySequenceElement(actName);
if(tag!=null)
ase.setTag(tag);
ActivitySequenceElementEditor aseed=(ActivitySequenceElementEditor)ase.getEditor(null);
if(index<0)
index=getChildCount();
else
index=Math.min(index, getChildCount());
return insertEditor(aseed, true, index, true);
}
public ListModel getTagList(){
if(tagList==null){
tagList=new DefaultListModel();
Enumeration en=children();
while(en.hasMoreElements()){
ActivitySequenceElementEditor asee=(ActivitySequenceElementEditor)en.nextElement();
String tag=StrUtils.nullableString(asee.getActivitySequenceElement().getTag());
if(tag!=null)
tagList.addElement(tag);
}
}
return tagList;
}
public String getTag(String tag){
String result=null;
getTagList();
Enumeration en=tagList.elements();
while(en.hasMoreElements() && result==null){
String s=(String)en.nextElement();
if(s.equals(tag))
result=s;
}
return result;
}
@Override
public void insert(MutableTreeNode newChild, int childIndex){
super.insert(newChild, childIndex);
if(!initializing){
ActivitySequenceElementEditor asee=(ActivitySequenceElementEditor)newChild;
getActivitySequence().insertElementAt(asee.getActivitySequenceElement(), childIndex);
if(tagList!=null){
String tag=asee.getTag();
if(tag!=null && getTag(tag)==null){
tagList.addElement(tag);
}
}
}
}
@Override
public void remove(int childIndex){
ActivitySequenceElementEditor asee=(ActivitySequenceElementEditor)getChildAt(childIndex);
super.remove(childIndex);
getActivitySequence().remove(asee.getActivitySequenceElement());
if(tagList!=null && asee.getTag()!=null){
String s=getTag(asee.getTag());
if(s!=null)
tagList.removeElement(s);
}
}
public boolean nameChanged(int type, String oldName, String newName){
boolean result=false;
if((type & (Constants.T_ACTIVITY | Constants.T_SEQUENCE))!=0){
Enumeration en=children();
while(en.hasMoreElements())
result|=((ActivitySequenceElementEditor)en.nextElement()).nameChanged(type, oldName, newName);
}
return result;
}
@Override
public void setActionsOwner() {
allowDelete = allowCut = allowCopy = allowPaste = false;
super.setActionsOwner();
if(actionsCreated){
newActivitySequenceElementAction.setActionOwner(this);
}
}
@Override
public void clearActionsOwner(){
super.clearActionsOwner();
if(actionsCreated){
newActivitySequenceElementAction.setActionOwner(null);
}
}
public static void createActions(Options options){
createBasicActions(options);
if(!actionsCreated){
newActivitySequenceElementAction=new EditorAction("edit_seq_newElement", "icons/sequence_new.gif", "edit_seq_newElement_tooltip", options){
protected void doAction(Editor e){
Editor ch=null;
if(e instanceof ActivitySequenceElementEditor){
ch=e;
e=e.getEditorParent();
}
if(e instanceof ActivitySequenceEditor)
((ActivitySequenceEditor)e).createNewSequenceElement(e.getNearestIndex(ch, true), true, getComponentSrc());
}
};
actionsCreated=true;
}
}
}