/* * File : MenuEditor.java * Created : 05-jun-2002 17:01 * 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.activities.panels; import edu.xtec.jclic.*; import edu.xtec.jclic.bags.ActivitySequenceElement; import edu.xtec.jclic.boxes.ActiveBoxContent; import edu.xtec.jclic.boxes.BoxBase; import edu.xtec.jclic.edit.*; import edu.xtec.jclic.project.*; import edu.xtec.util.Options; import edu.xtec.util.StrUtils; import java.awt.Component; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JTree; import javax.swing.tree.TreePath; /** * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.29 */ public class MenuEditor extends Editor{ protected static ImageIcon icon; public static EditorAction newMenuElementAction, newMenuAction; public static boolean actionsCreated=false; protected ProjectLibrary projectLibrary; /** Creates new MenuEditor */ public MenuEditor(Menu menu) { super(menu); } protected void createChildren(){ Menu m=getMenu(); ProjectLibrary pl=getProjectLibrary(); if(pl!=null && !m.menuElements.isEmpty()){ for(int i=0; i<m.getMenuElementCount(); i++){ MenuElement me=m.getMenuElement(i); if(me.projectPath==null && me.sequence!=null && !MenuElement.RETURN_TAG.equals(me.sequence)){ try{ Activity act=Activity.getActivity(pl.activityBag.getElement(me.sequence).getData(), pl); if(act instanceof Menu) ((Menu)act).getEditor(this); } catch(Exception ex){ System.err.println("Error reading activity:\n"+ex); } } else me.getEditor(this); } } } public Class getEditorPanelClass() { return MenuEditorPanel.class; } public EditorPanel createEditorPanel(Options options) { return new MenuEditorPanel(options); } public Menu getMenu(){ return (Menu)getUserObject(); } public Options getOptions(){ return getMenu().getProject().getBridge().getOptions(); } protected void saveData(){ ProjectLibrary pl=getProjectLibrary(); if(pl!=null) pl.activityBag.addActivity(getMenu()); } public ProjectLibrary getProjectLibrary(){ if(projectLibrary==null){ Editor p=getEditorParent(); if(p!=null){ if(p instanceof ProjectLibraryEditor) projectLibrary=((ProjectLibraryEditor)p).getProjectLibrary(); else if(p instanceof MenuEditor) projectLibrary=((MenuEditor)p).getProjectLibrary(); } } return projectLibrary; } @Override public String toString(){ return getMenu().description; } @Override protected boolean canClone(){ return true; } @Override protected Editor getClone() throws Exception{ Menu menu=(Menu)getMenu().duplicate(); menu.name=Long.toString(System.currentTimeMillis()); MenuEditor me=(MenuEditor)menu.getEditor(null); me.projectLibrary=getProjectLibrary(); me.createChildren(); return me; } @Override public void setActionsOwner() { Editor e=getEditorParent(); allowDelete = allowCut = (e!=null && !(e instanceof ProjectLibraryEditor)); allowDelete = allowCut && getChildCount()==0; allowCopy = allowPaste=true; super.setActionsOwner(); newMenuElementAction.setActionOwner(this); newMenuAction.setActionOwner(e!=null ? this : null); } @Override public void clearActionsOwner(){ super.clearActionsOwner(); newMenuAction.setActionOwner(null); newMenuElementAction.setActionOwner(null); } public static Icon getIcon(){ if(icon==null) icon=edu.xtec.util.ResourceManager.getImageIcon("icons/file_open.gif"); return icon; } public void setDescription(String description){ Menu m=getMenu(); m.description=StrUtils.secureString(description, getOptions().getMsg("UNNAMED")); ActiveBoxContent[] messages=m.getMessages(); if(messages[Activity.MAIN]==null){ messages[Activity.MAIN]=new ActiveBoxContent(); messages[Activity.MAIN].setBoxBase(new BoxBase()); } messages[Activity.MAIN].setTextContent(m.description); MenuElement me=checkParentMenuElementRef(false, false, false, 0); if(me!=null) me.caption=m.description; } protected MenuElement checkParentMenuElementRef(boolean remove, boolean create, boolean move, int index){ MenuElement result=null; Menu m=getMenu(); if(getEditorParent() instanceof MenuEditor){ Menu pm=((MenuEditor)getEditorParent()).getMenu(); for(int i=0; i<pm.getMenuElementCount(); i++){ MenuElement me=pm.getMenuElement(i); if(me.projectPath==null && me.sequence!=null && me.sequence.equals(m.name)){ result=me; break; } } if(result!=null && (remove || move)){ pm.menuElements.remove(result); if(move) pm.menuElements.add(index, result); } else if(result==null && create){ index=Math.max(0, Math.min(index, m.getMenuElementCount())); result=new MenuElement(); result.sequence=m.name; result.caption=m.description; pm.menuElements.add(index, result); } } return result; } @Override public boolean moveUp(boolean updateSelection){ boolean result=super.moveUp(updateSelection); if(result) checkParentMenuElementRef(false, false, true, getParent().getIndex(this)); return result; } @Override public boolean moveDown(boolean updateSelection){ boolean result=super.moveDown(updateSelection); if(result) checkParentMenuElementRef(false, false, true, getParent().getIndex(this)); return result; } @Override public boolean insertEditor(Editor e, boolean asChild, int index, boolean updateSelection){ boolean result=false; if(!asChild) result=super.insertEditor(e, asChild, index, updateSelection); else{ if(e instanceof MenuEditor){ ProjectLibrary pl=getProjectLibrary(); if(pl!=null){ Menu m=((MenuEditor)e).getMenu(); // find last non-Menu index int i; for(i=0; i<getChildCount(); i++) if(!(getChildAt(i) instanceof MenuEditor)) break; if(index<0) index=i; else index=Math.min(index, i); pl.activityBag.addActivity(m); pl.activitySequence.add(new ActivitySequenceElement(m.name, true)); MenuEditor med=(MenuEditor)m.getEditor(this); med.checkParentMenuElementRef(false, true, false, index); result=super.insertEditor(med, true, index, updateSelection); } } else if(e instanceof MenuElementEditor){ MenuElement me=((MenuElementEditor)e).getMenuElement(); if(index<0) index=getChildCount(); else index=Math.min(index, getChildCount()); getMenu().menuElements.add(index, me); result=super.insertEditor(me.getEditor(this), true, index, updateSelection); } } return result; } public boolean createNewMenu(int index, boolean prompt, Component dlgParent){ boolean result=false; ProjectLibrary pl=getProjectLibrary(); if(pl!=null){ JTree ct=getCurrentTree(); TreePath savePath=null; if(ct!=null) savePath=ct.getSelectionPath(); Menu nm=new Menu(pl); nm.name=Long.toString(System.currentTimeMillis()); MenuEditor med=(MenuEditor)nm.getEditor(null); med.setDescription(getOptions().getMsg("menu_newMenuName")); if(prompt){ result=med.createEditorPanel(getOptions()).showDialog(med, "menu_newMenuElement_caption", dlgParent, true); } else{ result=true; } if(result){ result=insertEditor(med, true, index, true); } else if(savePath!=null && ct!=null){ ct.clearSelection(); ct.setSelectionPath(savePath); } } return result; } public boolean createNewMenuElement(int index, boolean prompt, Component dlgParent){ MenuElement me=new MenuElement(); boolean result; TreePath savePath=null; JTree ct=getCurrentTree(); MenuElementEditor mee; me.caption=getOptions().getMsg("menu_newMenuElementName"); if(ct!=null) savePath=ct.getSelectionPath(); mee=(MenuElementEditor)me.getEditor(null); mee.projectLibrary=getProjectLibrary(); mee.createChildren(); if(prompt){ result=mee.createEditorPanel(getOptions()).showDialog(mee, "menu_newMenuElement_caption", dlgParent, true); } else{ result=true; } if(index<0) index=getChildCount(); else index=Math.min(index, getChildCount()); if(result){ result=insertEditor(mee, true, index, true); } else if(savePath!=null && ct!=null){ ct.clearSelection(); ct.setSelectionPath(savePath); } return result; } @Override public boolean delete(boolean updateSelection){ boolean result=false; ProjectLibrary pl=getProjectLibrary(); String name=getMenu().name; Editor saveParent=getEditorParent(); if(name!=null && (result=super.delete(updateSelection))==true){ parent=saveParent; if(pl!=null){ ActivitySequenceElement ase=pl.activitySequence.getElementByTag(name, false); if(ase!=null) pl.activitySequence.remove(ase); pl.activityBag.removeElementByName(name); } checkParentMenuElementRef(true, false, false, 0); parent=null; } return result; } @Override public boolean canBeParentOf(Editor e){ return (e instanceof MenuElementEditor) || (e instanceof MenuEditor); } @Override public boolean canBeSiblingOf(Editor e){ if(getEditorParent() instanceof MenuEditor) return canBeParentOf(e); else return (e instanceof MenuElementEditor); } public static void createActions(Options options){ createBasicActions(options); if(!actionsCreated){ newMenuElementAction=new EditorAction("menu_newMenuElement_caption", "icons/new_miniclic.png", "menu_newMenuElement_tooltip", options){ protected void doAction(Editor e){ Editor ch=null; if(e instanceof MenuElementEditor){ ch=e; e=e.getEditorParent(); } if(e instanceof MenuEditor) ((MenuEditor)e).createNewMenuElement(e.getNearestIndex(ch, true), true, getComponentSrc()); } }; newMenuAction=new EditorAction("menu_newMenu_caption", "icons/new_folder.gif", "menu_newMenu_tooltip", options){ protected void doAction(Editor e){ if(e instanceof MenuElementEditor) e=e.getEditorParent(); if(e instanceof MenuEditor) ((MenuEditor)e).createNewMenu(-1, true, getComponentSrc()); } }; actionsCreated=true; } } }