示例#1
0
 /// <summary>
 /// Gets the pad that is showing the output of a progress monitor
 /// </summary>
 /// <param name='monitor'>
 /// The monitor.
 /// </param>
 /// <remarks>
 /// For example, if you have a monitor 'm' created with a call to GetOutputProgressMonitor,
 /// GetPadForMonitor (m) will return the output pad.
 /// </remarks>
 public Pad GetPadForMonitor(ProgressMonitor monitor)
 {
     foreach (Pad pad in outputMonitors)
     {
         DefaultMonitorPad p = (DefaultMonitorPad)pad.Content;
         if (p.CurrentMonitor == monitor)
         {
             return(pad);
         }
     }
     return(null);
 }
示例#2
0
        /// <summary>
        /// Gets the pad that is showing the output of a progress monitor
        /// </summary>
        /// <param name='monitor'>
        /// The monitor.
        /// </param>
        /// <remarks>
        /// For example, if you have a monitor 'm' created with a call to GetOutputProgressMonitor,
        /// GetPadForMonitor (m) will return the output pad.
        /// </remarks>
        public Pad GetPadForMonitor(ProgressMonitor monitor)
        {
            // In general this method should not be called from a background thread since the returned object can only be used
            // from the UI thread. However, this method is commontly used to get the pad and provide it as argument for
            // GetStatusProgressMonitor. To avoid crashes in existing code, we allow this to be called from a non-UI thread.
            if (!Runtime.IsMainThread)
            {
                return(Runtime.RunInMainThread(() => GetPadForMonitor(monitor)).Result);
            }

            foreach (Pad pad in outputMonitors)
            {
                DefaultMonitorPad p = (DefaultMonitorPad)pad.Content;
                if (p.CurrentMonitor == monitor)
                {
                    return(pad);
                }
            }
            return(null);
        }
示例#3
0
        Pad CreateMonitorPad(string id, string title, string icon, bool bringToFront, bool allowMonitorReuse, bool show)
        {
            Pad pad = null;

            if (icon == null)
            {
                icon = Stock.OutputIcon;
            }

            if (id == null)
            {
                id = title;
            }

            int instanceCount = -1;

            if (allowMonitorReuse)
            {
                lock (outputMonitors) {
                    // Look for an available pad
                    for (int n = 0; n < outputMonitors.Count; n++)
                    {
                        Pad mpad = (Pad)outputMonitors [n];
                        DefaultMonitorPad mon = (DefaultMonitorPad)mpad.Content;
                        if (mon.TypeTag == id)
                        {
                            if (mon.InstanceNum > instanceCount)
                            {
                                instanceCount = mon.InstanceNum;
                            }
                            if (mon.AllowReuse)
                            {
                                pad = mpad;
                                break;
                            }
                        }
                    }
                }
                if (pad != null)
                {
                    if (bringToFront)
                    {
                        pad.BringToFront();
                    }
                    return(pad);
                }
            }

            instanceCount++;
            DefaultMonitorPad monitorPad = new DefaultMonitorPad(id, icon, instanceCount);

            string newPadId  = "OutputPad-" + id + "-" + instanceCount;
            string basePadId = "OutputPad-" + id + "-0";

            if (instanceCount > 0)
            {
                // Translate the title before adding the count
                title  = GettextCatalog.GetString(title);
                title += " (" + (instanceCount + 1) + ")";
            }

            if (show)
            {
                pad = IdeApp.Workbench.ShowPad(monitorPad, newPadId, title, basePadId + "/Center Bottom", DockItemStatus.AutoHide, icon);
            }
            else
            {
                pad = IdeApp.Workbench.AddPad(monitorPad, newPadId, title, basePadId + "/Center Bottom", DockItemStatus.AutoHide, icon);
            }

            monitorPad.StatusSourcePad = pad;
            pad.Sticky = true;
            lock (outputMonitors) {
                outputMonitors.Add(pad);
            }

            if (instanceCount > 0)
            {
                // Additional output pads will be destroyed when hidden
                pad.Window.PadHidden += (s, a) => {
                    // Workaround for crash reported in bug #18096. Look like MS.NET can't access private fields
                    // when the delegate is invoked through the remoting chain.
                    if (!a.SwitchingLayout)
                    {
                        DestroyPad(pad);
                    }
                };
            }

            if (bringToFront)
            {
                pad.Visible = true;
                pad.BringToFront();
            }

            return(pad);
        }
示例#4
0
        Pad CreateMonitorPad(string id, string title, string icon, bool bringToFront, bool allowMonitorReuse, bool show)
        {
            Pad pad = null;

            if (icon == null)
            {
                icon = Stock.OutputIcon;
            }

            if (id == null)
            {
                id = title;
            }

            int instanceCount = -1;

            if (allowMonitorReuse)
            {
                lock (outputMonitors) {
                    // Look for an available pad
                    for (int n = 0; n < outputMonitors.Count; n++)
                    {
                        Pad mpad = (Pad)outputMonitors [n];
                        DefaultMonitorPad mon = (DefaultMonitorPad)mpad.Content;
                        if (mon.TypeTag == id)
                        {
                            if (mon.InstanceNum > instanceCount)
                            {
                                instanceCount = mon.InstanceNum;
                            }
                            if (mon.AllowReuse)
                            {
                                pad = mpad;
                                break;
                            }
                        }
                    }
                }
                if (pad != null)
                {
                    if (bringToFront)
                    {
                        pad.BringToFront();
                    }
                    return(pad);
                }
            }

            instanceCount++;
            DefaultMonitorPad monitorPad = new DefaultMonitorPad(id, icon, instanceCount);

            string newPadId  = "OutputPad-" + id + "-" + instanceCount;
            string basePadId = "OutputPad-" + id + "-0";

            if (instanceCount > 0)
            {
                // Translate the title before adding the count
                title  = GettextCatalog.GetString(title);
                title += " (" + (instanceCount + 1) + ")";
            }

            if (show)
            {
                pad = IdeApp.Workbench.ShowPad(monitorPad, newPadId, title, basePadId + "/Center Bottom", icon);
            }
            else
            {
                pad = IdeApp.Workbench.AddPad(monitorPad, newPadId, title, basePadId + "/Center Bottom", icon);
            }

            monitorPad.StatusSourcePad = pad;
            pad.Sticky = true;
            outputMonitors.Add(pad);

            if (instanceCount > 0)
            {
                // Additional output pads will be destroyed when hidden
                pad.Window.PadHidden += delegate {
                    outputMonitors.Remove(pad);
                    pad.Destroy();
                };
            }

            pad.AutoHide = true;

            if (bringToFront)
            {
                pad.Visible = true;
                pad.BringToFront();
            }

            return(pad);
        }
示例#5
0
        Pad CreateMonitorPad(string id, string title, string icon, bool bringToFront, bool allowMonitorReuse, bool show)
        {
            Pad pad = null;

            if (icon == null)
            {
                icon = Stock.OutputIcon;
            }

            string originalTitle = title;

            if (id == null)
            {
                id = originalTitle;
            }

            int instanceCount      = -1;
            int titleInstanceCount = 0;

            if (allowMonitorReuse)
            {
                var usedTitleIds = new List <int> ();
                lock (outputMonitors) {
                    // Look for an available pad
                    for (int n = 0; n < outputMonitors.Count; n++)
                    {
                        var mpad = outputMonitors [n];
                        DefaultMonitorPad mon = (DefaultMonitorPad)mpad.Content;
                        if (mon.TypeTag == id)
                        {
                            if (mon.InstanceNum > instanceCount)
                            {
                                instanceCount = mon.InstanceNum;
                            }
                            if (mon.Title == originalTitle && !mon.AllowReuse)
                            {
                                usedTitleIds.Add(mon.TitleInstanceNum);
                            }
                            if (mon.AllowReuse &&
                                (pad == null ||
                                 mon.Title == originalTitle))                             //Prefer reusing output with same title(project)
                            {
                                pad = mpad;
                            }
                        }
                    }
                }
                titleInstanceCount = usedTitleIds.Count;                //Set pesimisticly to largest possible number
                for (int i = 0; i < usedTitleIds.Count; i++)
                {
                    if (!usedTitleIds.Contains(i))
                    {
                        titleInstanceCount = i;                        //Find smallest free number
                        break;
                    }
                }
                if (titleInstanceCount > 0)
                {
                    title = originalTitle + $" ({titleInstanceCount})";
                }
                else
                {
                    title = originalTitle;
                }
                if (pad != null)
                {
                    if (bringToFront)
                    {
                        pad.BringToFront();
                    }
                    pad.Window.Title = title;
                    var mon = (DefaultMonitorPad)pad.Content;
                    mon.Title            = originalTitle;
                    mon.TitleInstanceNum = titleInstanceCount;
                    return(pad);
                }
            }

            instanceCount++;
            DefaultMonitorPad monitorPad = new DefaultMonitorPad(id, icon, instanceCount, originalTitle, titleInstanceCount);

            string newPadId  = "OutputPad-" + id + "-" + instanceCount;
            string basePadId = "OutputPad-" + id + "-0";

            if (show)
            {
                pad = IdeApp.Workbench.ShowPad(monitorPad, newPadId, title, basePadId + "/Center Bottom", DockItemStatus.AutoHide, icon);
            }
            else
            {
                pad = IdeApp.Workbench.AddPad(monitorPad, newPadId, title, basePadId + "/Center Bottom", DockItemStatus.AutoHide, icon);
            }

            monitorPad.StatusSourcePad = pad;
            pad.Sticky = true;
            lock (outputMonitors) {
                outputMonitors.Add(pad);
            }

            if (instanceCount > 0)
            {
                // Additional output pads will be destroyed when hidden
                pad.Window.PadHidden += (s, a) => {
                    // Workaround for crash reported in bug #18096. Look like MS.NET can't access private fields
                    // when the delegate is invoked through the remoting chain.
                    if (!a.SwitchingLayout)
                    {
                        DestroyPad(pad);
                    }
                };
            }

            if (bringToFront)
            {
                pad.Visible = true;
                pad.BringToFront();
            }

            return(pad);
        }