private void OnWindowOpen(int moduleId)
    {
        WindowStartUpEvent evt = new WindowStartUpEvent();

        evt.ModuleID = moduleId;
        OnWindowOpen(evt);
    }
    private void OnWindowOpen(WindowStartUpEvent param)
    {
        if (m_bIsOpeningAWindow)
        {
            // another window is loading, put this one into open queue and return;
            m_qOpenQueue.Enqueue(param);
            return;
        }

        m_bIsOpeningAWindow = true;
        int     moduleId   = param.ModuleID;
        int     instanceId = moduleId;
        IWindow tmpIns;

        // if key moduleId exist in m_dictInstanceMapper,
        // shows that this window is a uniqe window,
        // and it's in the cache;
        if (m_dictInstanceMapper.TryGetValue(instanceId, out tmpIns))
        {
            LinkedListNode <IWindow> node = m_llInstances.Find(tmpIns);
            m_llInstances.Remove(node);
            m_llInstances.AddFirst(node);

            tmpIns.StartListener();
            tmpIns.StartUp(param.Params);
            m_bIsOpeningAWindow = false;
            return;
        }

        // not in the cache, but it's not a uniqe window
        tmpIns = GetWinInstance(moduleId);
        //tmpIns.SetWindowInfo(moduleId);
        //if (!tmpIns.IsUniqeWindow())
        if (!WindowInfoMgr.GetWindowInfo(moduleId).UniqeWindow)
        {
            WinTemplate template;
            // resources is already loaded
            // create a new window immediately
            instanceId = GetInstanceID(moduleId);
            if (m_dictTemplateMapper.TryGetValue(moduleId, out template))
            {
                GameObject root = GameObject.Instantiate(template.Template) as GameObject;
                root.transform.SetParent(m_transWindowRoot, false);
                root.transform.SetAsLastSibling();
                root.SetActive(true);
                template.RefCnt += 1;
                LinkedListNode <WinTemplate> node = m_llWinTemplate.Find(template);
                m_llWinTemplate.Remove(node);
                m_llWinTemplate.AddFirst(template);
                m_dictInstanceMapper.Add(instanceId, tmpIns);
                m_dictTemplateMapper[moduleId] = template;
                tmpIns.BaseInit(moduleId, instanceId, root);
                tmpIns.Init();
                tmpIns.StartListener();
                tmpIns.StartUp(param.Params);
                m_bIsOpeningAWindow = false;
                return;
            }
        }

        IntermediateParams.WinLoadedParam winParam = new IntermediateParams.WinLoadedParam();
        winParam.ModuleID   = moduleId;
        winParam.InstanceID = instanceId;
        winParam.StartParam = param.Params;
        winParam.Instance   = tmpIns;
        string path = Path.GetUIPath(WindowInfoMgr.GetWindowInfo(moduleId).ResName);

        ResLoader.Load(path, OnWindowResLoaded, winParam);
    }