/* * File : EditorAction.java * Created : 14-jun-2002 20:38 * 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.edit; import edu.xtec.util.Options; import edu.xtec.util.ResourceManager; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JComponent; import javax.swing.KeyStroke; /** * This abstract class provides a base to create {@link javax.swing.Action} objects * related to {@link edu.xtec.jclic.edit.Editor}s. Derived classes must implement * only the <CODE>doAction</CODE> method, executing the required operations on the * supplied <CODE>Editor</CODE>. * @author Francesc Busquets (fbusquets@xtec.cat) * @version 13.08.28 */ public abstract class EditorAction extends AbstractAction{ ActionEvent ev; Editor editor; public Options options; public EditorAction(String nameKey, String iconKey, String toolTipKey, Options options){ super(options.getMsg(nameKey), ResourceManager.getImageIcon(iconKey)); this.options=options; if(toolTipKey!=null) putValue(AbstractAction.SHORT_DESCRIPTION, options.getMsg(toolTipKey)); String s=options.getMessages().get(nameKey+"_keys"); if(s!=null && s.length()>=2 && !s.startsWith(nameKey)){ putValue(Action.MNEMONIC_KEY, new Integer(s.charAt(0))); if(s.charAt(1)!='*'){ char ch=s.charAt(1); int key=(int)ch; int keyMod=KeyEvent.CTRL_MASK; if(ch=='#' && s.length()>2){ try{ int sep=s.indexOf('#', 2); String k; if(sep>0){ keyMod=Integer.parseInt(s.substring(sep+1)); k=s.substring(2, sep); } else{ k=s.substring(2); } key=Integer.parseInt(k); } catch(Exception ex){ System.err.println("Error initializing action keys\nBad expression: "+s); } } putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(key, keyMod)); } } setEnabled(false); } public final void actionPerformed(ActionEvent ev) { this.ev=ev; if(editor!=null) doAction(editor); } protected abstract void doAction(Editor e); protected Component getComponentSrc(){ Component result=null; if(ev!=null && ev.getSource() instanceof Component) result=(Component)ev.getSource(); return result; } protected JComponent getJComponentSrc(){ JComponent result=null; if(ev!=null && ev.getSource() instanceof JComponent) result=(JComponent)ev.getSource(); return result; } protected EditorPanel getEditorPanelSrc(){ Component cmp=getComponentSrc(); while(cmp!=null){ if(cmp instanceof EditorPanel) break; cmp=cmp.getParent(); } return (EditorPanel)cmp; } public void setActionOwner(Editor e){ editor=e; setEnabled(editor!=null); } }