Package org.richfaces.component

Source Code of org.richfaces.component.DialogCloseListenerImpl

/**
* License Agreement.
*
* Rich Faces - Natural Ajax for Java Server Faces (JSF)
*
* Copyright (C) 2007 Exadel, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1 as published by the Free Software Foundation.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
*/
package org.richfaces.component;

import javax.faces.application.ViewHandler;
import javax.faces.component.UIComponent;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;

import org.ajax4jsf.context.AjaxContext;
import org.ajax4jsf.event.AjaxEvent;

public class DialogCloseListenerImpl implements DialogCloseListener {
  public void processDialogClose(DialogCloseEvent event) {
    UIComponent c = event.getComponent();
    if(!(c instanceof UIDialogClose)) return;
    UIDialogClose component = (UIDialogClose)c;
    /*
     * If dialog is not going to be closed, nothing
     * to be done, new view has already been set by
     * navigation handler.
     */
    if(ActionPrefixHolder.PREFIX_NOCLOSE.equals(component.prefix)) return;

    FacesContext context = FacesContext.getCurrentInstance();

    /*
     * Save id of view that would be shown in the dialog
     * window if it had not to be closed. Renderer will pass
     * it to js function closeDialog()
     */
    UIViewRoot viewroot = context.getViewRoot();
    String viewId = viewroot.getViewId();
    if(component.isNullPath()) {
      viewId = "null";
    }
    String closeId = component.getClientId(context) + "_close";
        context.getExternalContext().getRequestMap().put(closeId, viewId);
        if(ActionPrefixHolder.PREFIX_CLOSEALL.equals(component.prefix)) {
          String closeAll = component.getClientId(context) + "_closeall";
            context.getExternalContext().getRequestMap().put(closeAll, viewId);
        }

        /*
         * We need to prevent new view rendering in dialog
         * window. So view set by navigation handler is
         * to be replaced with old view.
         */
        UIViewRoot oldRoot = event.getSourceViewRoot();
    String oldViewId = event.getSourceViewId();
    ViewHandler vh = UIDialogAction.getViewHandler(context);
//    UIViewRoot newRoot = vh.createView(context, oldViewId);
//    context.setViewRoot(newRoot);   
    UIViewRoot newRoot = null;
    try {
      if(oldViewId.equals(oldRoot.getViewId()) && !UIDialogAction.isServerMode(component)) {
        newRoot = oldRoot;
      }
    } catch (Exception e) {
      //ignore
    }
    if(newRoot == null) {
      newRoot = vh.createView(context, oldViewId);
    } else {
      try {
        Object st = oldRoot.saveState(context);
        newRoot.restoreState(context, st);
      } catch (Exception e) {
        e.printStackTrace();
      }
      context.getExternalContext().getRequestMap().put(AjaxContext.AJAX_CONTEXT_KEY, event.getAjaxContext());
    }

    context.setViewRoot(newRoot);
   
    Object nc = null;
    try {   
      nc = newRoot.findComponent(component.getClientId(context));
    } catch (Exception e) {
      //ignore
    }
    if(nc instanceof UIComponent) {
      UIComponent newComponent = (UIComponent)nc;
      try {
        AjaxEvent e = new AjaxEvent(newRoot);
        newRoot.queueEvent(e);
        e = new AjaxEvent(newComponent);
        newComponent.queueEvent(e);
      } catch (Exception exc) {
        System.out.println("Cannot queue event: " + newComponent.getClass().getName());
      }
    }

  }
 
}
TOP

Related Classes of org.richfaces.component.DialogCloseListenerImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.