001    /*
002      Copyright (C) 2003 Laurent Martelli <laurent@aopsys.com>
003    
004      This program is free software; you can redistribute it and/or modify
005      it under the terms of the GNU Lesser General Public License as
006      published by the Free Software Foundation; either version 2 of the
007      License, or (at your option) any later version.
008    
009      This program is distributed in the hope that it will be useful,
010      but WITHOUT ANY WARRANTY; without even the implied warranty of
011      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
012      GNU Lesser General Public License for more details.
013    
014      You should have received a copy of the GNU Lesser General Public
015      License along with this program; if not, write to the Free Software
016      Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
017      USA */
018    
019    package org.objectweb.jac.aspects.gui;
020    
021    import org.aopalliance.intercept.ConstructorInvocation;
022    import org.aopalliance.intercept.MethodInvocation;
023    import org.apache.log4j.Logger;
024    import org.objectweb.jac.core.AspectComponent;
025    import org.objectweb.jac.core.Display;
026    import org.objectweb.jac.core.Interaction;
027    import org.objectweb.jac.core.Wrapper;
028    
029    /**
030     * This wrapper displays a "Please wait message" for slow operations.
031     * @see org.objectweb.jac.aspects.gui.GuiAC#setSlowOperation(AbstractMethodItem,boolean)
032     */
033    public class WaitWrapper extends Wrapper {
034        static Logger logger = Logger.getLogger("gui.wait");
035    
036            public WaitWrapper(AspectComponent ac) {
037                    super(ac);
038            }
039    
040        public Object pleaseWait(Interaction interaction) {
041            DialogView page = null;
042            CustomizedDisplay display = null;
043            Object result = null;
044            try {
045                if (GuiAC.isSlowOperation(interaction.method)) {
046                    logger.debug("pleaseWait "+interaction);
047                    DisplayContext context =
048                        (DisplayContext)attr(GuiAC.DISPLAY_CONTEXT);
049                    if (context!=null) {
050                        display = context.getDisplay();
051                        page = 
052                            (DialogView)display.showRefreshMessage(
053                                "Please wait",
054                                "Please wait: "+interaction.method.getName()+" is running...");
055                    } else {
056                        logger.error("pleaseWait: no display context available for "+
057                                     interaction.method);
058                    }            
059                }
060                result = interaction.proceed();
061            } finally {
062                if (page!=null)
063                    page.waitForClose();
064            }
065            return result;
066        }
067    
068            public Object invoke(MethodInvocation invocation) throws Throwable {
069                    return pleaseWait((Interaction)invocation);
070            }
071    
072            public Object construct(ConstructorInvocation invocation) throws Throwable {
073                    return pleaseWait((Interaction)invocation);
074            }
075    }