Ejemplo n.º 1
0
        }         // proc OnDeactivated

        public async Task <IPpsWindowPane> LoadAsync(IPpsWindowPaneManager paneManager, Type paneType, LuaTable arguments)
        {
            this.PaneManager = paneManager;

            var newPane = paneManager.CreateEmptyPane(this, paneType);

            try
            {
                using (var progress = this.DisableUI("Lade..."))
                    await newPane.LoadAsync(arguments);

                return(SetWindowPane(newPane));
            }
            catch
            {
                // clear new pane
                try { newPane.Dispose(); }
                catch { }

                throw;
            }
            finally
            {
                CommandManager.InvalidateRequerySuggested();
            }
        }         // func LoadAsync
Ejemplo n.º 2
0
        public static IPpsWindowPane CreateEmptyPane(this IPpsWindowPaneManager paneManager, IPpsWindowPaneHost paneHost, Type paneType)
        {
            var ti                   = paneType.GetTypeInfo();
            var ctorBest             = (ConstructorInfo)null;
            var ctoreBestParamLength = -1;

            if (!typeof(IPpsWindowPane).IsAssignableFrom(paneType))
            {
                throw new ArgumentException($"{paneType.Name} does not implement {nameof(IPpsWindowPane)}.");
            }

            // search for the longest constructor
            foreach (var ci in ti.GetConstructors())
            {
                var pi = ci.GetParameters();
                if (ctoreBestParamLength < pi.Length)
                {
                    ctorBest             = ci;
                    ctoreBestParamLength = pi.Length;
                }
            }
            if (ctorBest == null)
            {
                throw new ArgumentException($"'{ti.Name}' has no constructor.");
            }

            // create the argument set
            var parameterInfo = ctorBest.GetParameters();
            var paneArguments = new object[parameterInfo.Length];

            for (var i = 0; i < paneArguments.Length; i++)
            {
                var pi      = parameterInfo[i];
                var tiParam = pi.ParameterType.GetTypeInfo();
                if (tiParam.IsAssignableFrom(paneManager.Shell.GetType()))
                {
                    paneArguments[i] = paneManager.Shell;
                }
                else if (tiParam.IsAssignableFrom(typeof(IPpsWindowPaneManager)))
                {
                    paneArguments[i] = paneManager;
                }
                else if (tiParam.IsAssignableFrom(typeof(IPpsWindowPaneHost)))
                {
                    paneArguments[i] = paneHost;
                }
                else if (pi.HasDefaultValue)
                {
                    paneArguments[i] = pi.DefaultValue;
                }
                else
                {
                    throw new ArgumentException($"Unsupported argument '{pi.Name}' for type '{ti.Name}'.");
                }
            }

            // activate the pane
            return((IPpsWindowPane)Activator.CreateInstance(paneType, paneArguments));
        }         // func CreateEmptyPane
Ejemplo n.º 3
0
        }         // func GetPaneType

        /// <summary>Get default open pane mode</summary>
        /// <param name="paneManager">Pane manager to use.</param>
        /// <param name="arguments"></param>
        /// <returns></returns>
        public static PpsOpenPaneMode GetDefaultPaneMode(this IPpsWindowPaneManager paneManager, dynamic arguments)
        {
            if (arguments != null && arguments.Mode != null)
            {
                return(Procs.ChangeType <PpsOpenPaneMode>(arguments.Mode));
            }

            return(paneManager.Shell.GetOptionalValue("NewPaneMode", true) ? PpsOpenPaneMode.NewPane : PpsOpenPaneMode.ReplacePane);
        }         // func GetDefaultPaneMode
Ejemplo n.º 4
0
        /// <summary>Loads a pane of specific type with the givven arguments.</summary>
        /// <param name="paneManager">Pane manager to use.</param>
        /// <param name="arguments">Argument for the pane load function. This is pane specific.</param>
        /// <returns>A full inialized pane.</returns>
        /// <remarks>This function uses <c>AwaitTask</c>
        ///
        /// - <c>arguments.mode</c>: is the <see cref="PpsOpenPaneMode"/> (optional)
        /// - <c>arguments.paneType</c>: is the type as string or type, of the pane. (required)
        ///   Well known Pane types are:
        ///   - mask
        ///   - generic
        ///   - picture
        ///   - pdf
        /// </remarks>
        public static IPpsWindowPane LoadPane(this IPpsWindowPaneManager paneManager, LuaTable arguments = null)
        {
            var paneType = GetPaneType(paneManager, arguments);

            if (paneType == null)
            {
                throw new ArgumentException("Pane type is missing.");
            }

            return(paneManager.OpenPaneAsync(paneType, GetDefaultPaneMode(paneManager, arguments), arguments).AwaitTask());
        }         // func OpenPane
Ejemplo n.º 5
0
        }         // proc ClearWindowPane

        public void MoveWindowPane(IPpsWindowPaneManager targetPaneManager, PpsWindowPaneHost targetPaneHost)
        {
            var pane = CurrentPane;

            if (pane == null)
            {
                return;
            }

            // remove window from current host
            ClearWindowPane(pane);

            // copy window pane to new host
            targetPaneHost.PaneManager = targetPaneManager;
            targetPaneHost.SetWindowPane(pane);
        }         // proc MoveWindowPane
Ejemplo n.º 6
0
        }         // func CreateEmptyPane

        private static Type GetPaneType(IPpsWindowPaneManager paneManager, dynamic arguments)
        {
            var paneTypeValue = (object)arguments?.PaneType;

            switch (paneTypeValue)
            {
            case Type type:
                return(type);

            case LuaType luaType:
                return(luaType.Type);

            case string typeString:
                return(paneManager.Shell.GetPaneTypeFromString(typeString));

            case null:
                throw new ArgumentNullException("paneType");

            default:
                throw new ArgumentException("Could not parse pane type.", "paneType");
            }
        }         // func GetPaneType
Ejemplo n.º 7
0
        }         // func GetDefaultPaneMode

        /// <summary>Loads a generic wpf window pane <see cref="PpsGenericWpfWindowPane"/>.</summary>
        /// <param name="paneManager">Pane manager to use.</param>
        /// <param name="arguments">Argument for the pane load function. This is pane specific.</param>
        /// <returns>A full inialized pane.</returns>
        /// <remarks>This function uses <c>AwaitTask</c>
        ///
        /// - <c>arguments.mode</c>: is the <see cref="PpsOpenPaneMode"/> (optional)
        /// </remarks>
        public static IPpsWindowPane LoadGenericPane(this IPpsWindowPaneManager paneManager, LuaTable arguments = null)
        => paneManager.OpenPaneAsync(typeof(PpsGenericWpfWindowPane), PpsOpenPaneMode.Default, arguments).AwaitTask();