/// <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); }
/// <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); }
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); }
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); }
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); }