void InitApp(CommandManager commandManager) { if (initedApp) { return; } commandManager.CommandActivating += OnCommandActivating; //mac-ify these command names commandManager.GetCommand(EditCommands.MonodevelopPreferences).Text = GettextCatalog.GetString("Preferences..."); commandManager.GetCommand(EditCommands.DefaultPolicies).Text = GettextCatalog.GetString("Custom Policies..."); commandManager.GetCommand(HelpCommands.About).Text = GettextCatalog.GetString("About {0}", BrandingService.ApplicationName); commandManager.GetCommand(MacIntegrationCommands.HideWindow).Text = GettextCatalog.GetString("Hide {0}", BrandingService.ApplicationName); commandManager.GetCommand(ToolCommands.AddinManager).Text = GettextCatalog.GetString("Add-in Manager..."); initedApp = true; IdeApp.Workbench.RootWindow.DeleteEvent += HandleDeleteEvent; if (MacSystemInformation.OsVersion >= MacSystemInformation.Lion) { IdeApp.Workbench.RootWindow.Realized += (sender, args) => { var win = GtkQuartz.GetWindow((Gtk.Window)sender); win.CollectionBehavior |= NSWindowCollectionBehavior.FullScreenPrimary; }; } }
public override bool IsModalDialogRunning() { var toplevels = GtkQuartz.GetToplevels(); // Check GtkWindow's Modal flag or for a visible NSPanel return(toplevels.Any(t => (t.Value != null && t.Value.Modal && t.Value.Visible) || (t.Key.IsVisible && (t.Key is NSPanel)))); }
internal override void SetMainWindowDecorations(Gtk.Window window) { NSWindow w = GtkQuartz.GetWindow(window); w.IsOpaque = true; w.StyleMask |= NSWindowStyle.UnifiedTitleAndToolbar; }
public override void PlaceWindow(Gtk.Window window, int x, int y, int width, int height) { NSWindow w = GtkQuartz.GetWindow(window); var dr = FromDesktopRect(new Gdk.Rectangle(x, y, width, height)); var r = w.FrameRectFor(dr); w.SetFrame(r, true); base.PlaceWindow(window, x, y, width, height); }
void InitApp(CommandManager commandManager) { if (initedApp) { return; } commandManager.CommandActivating += OnCommandActivating; //mac-ify these command names commandManager.GetCommand(EditCommands.MonodevelopPreferences).Text = GettextCatalog.GetString("Preferences..."); commandManager.GetCommand(EditCommands.DefaultPolicies).Text = GettextCatalog.GetString("Policies..."); commandManager.GetCommand(HelpCommands.About).Text = GetAboutCommandText(); commandManager.GetCommand(MacIntegrationCommands.HideWindow).Text = GetHideWindowCommandText(); commandManager.GetCommand(ToolCommands.AddinManager).Text = GettextCatalog.GetString("Extensions..."); initedApp = true; IdeApp.Workbench.RootWindow.DeleteEvent += HandleDeleteEvent; if (MacSystemInformation.OsVersion >= MacSystemInformation.Lion) { IdeApp.Workbench.RootWindow.Realized += (sender, args) => { var win = GtkQuartz.GetWindow((Gtk.Window)sender); win.CollectionBehavior |= NSWindowCollectionBehavior.FullScreenPrimary; }; } PatchGtkTheme(); NSNotificationCenter.DefaultCenter.AddObserver(NSCell.ControlTintChangedNotification, notif => Core.Runtime.RunInMainThread( delegate { Styles.LoadStyle(); PatchGtkTheme(); })); Styles.Changed += (s, a) => { var colorPanel = NSColorPanel.SharedColorPanel; if (colorPanel.ContentView?.Superview?.Window == null) { LoggingService.LogWarning("Updating shared color panel appearance failed, no valid window."); } IdeTheme.ApplyTheme(colorPanel.ContentView.Superview.Window); var appearance = colorPanel.ContentView.Superview.Window.Appearance; if (appearance == null) { appearance = NSAppearance.GetAppearance(IdeApp.Preferences.UserInterfaceTheme == Theme.Light ? NSAppearance.NameAqua : NSAppearance.NameVibrantDark); } // The subviews of the shared NSColorPanel do not inherit the appearance of the main panel window // and need to be updated recursively. UpdateColorPanelSubviewsAppearance(colorPanel.ContentView.Superview, appearance); }; // FIXME: Immediate theme switching disabled, until NSAppearance issues are fixed //IdeApp.Preferences.UserInterfaceTheme.Changed += (s,a) => PatchGtkTheme (); }
internal override void RemoveWindowShadow(Gtk.Window window) { if (window == null) { throw new ArgumentNullException("window"); } NSWindow w = GtkQuartz.GetWindow(window); w.HasShadow = false; }
internal override void AddChildWindow(Gtk.Window parent, Gtk.Window child) { NSWindow w = GtkQuartz.GetWindow(parent); child.Realize(); NSWindow overlay = GtkQuartz.GetWindow(child); overlay.SetExcludedFromWindowsMenu(true); w.AddChildWindow(overlay, NSWindowOrderingMode.Above); }
public override bool IsModalDialogRunning() { var toplevels = GtkQuartz.GetToplevels(); // Check GtkWindow's Modal flag or for a visible NSPanel var ret = toplevels .Where(x => !x.Key.DebugDescription.StartsWith("<_NSFullScreenTileDividerWindow", StringComparison.Ordinal)) .Any(t => (t.Value != null && t.Value.Modal && t.Value.Visible)); return(ret); }
internal static void ShowTipWindow() { var tipLoader = new TipLoader(); if (!tipLoader.LoadTips().Result) { return; } var oldMainWindow = NSApplication.SharedApplication.KeyWindow ?? NSApplication.SharedApplication.MainWindow ?? GtkQuartz.GetWindow(MessageService.RootWindow); using (var tipWindow = InflateFromNibResource <TipWindow> ("__xammac_content_TipWindow.nib")) { tipWindow.ParentWindow = oldMainWindow; tipWindow.MakeKeyAndOrderFront(tipWindow); tipWindow.ShowAtStartup = StartupHandler.ShowAtStartup; FilePath sharedAssetsPath = Mono.Addins.AddinManager.CurrentAddin.GetFilePath("content"); tipWindow.HandleUrlOpen = s => { if (s.IsFile) { return(false); } DesktopService.ShowUrl(s.ToString()); return(true); }; void nextMessage(object sender, EventArgs e) { string html; string basePath = sharedAssetsPath; try { var tip = tipLoader.GetNextTip(); basePath = System.IO.Path.GetDirectoryName(tip.Filename); html = new TipView(tip, sharedAssetsPath).GenerateString(); } catch (Exception ex) { html = $"<h1>Error</h1><p>{ex.ToString ()}</p>"; } tipWindow.LoadHtml(html, basePath); } tipWindow.NextTipClicked += nextMessage; nextMessage(null, null); tipWindow.Run(); StartupHandler.ShowAtStartup = tipWindow.ShowAtStartup; } GtkQuartz.FocusWindow(GtkQuartz.GetGtkWindow(oldMainWindow) ?? MessageService.RootWindow); }
public override bool GetIsFullscreen(Gtk.Window window) { if (MacSystemInformation.OsVersion < MacSystemInformation.Lion) { return(base.GetIsFullscreen(window)); } NSWindow nswin = GtkQuartz.GetWindow(window); return((nswin.StyleMask & NSWindowStyle.FullScreenWindow) != 0); }
public override bool IsModalDialogRunning() { var toplevels = GtkQuartz.GetToplevels(); // When we're looking for modal windows that don't belong to GTK, exclude // NSStatusBarWindow (which is visible on Mavericks when we're in fullscreen) and // NSToolbarFullscreenWindow (which is visible on Yosemite in fullscreen). return(toplevels.Any(t => t.Key.IsVisible && (t.Value == null || t.Value.Modal) && !(t.Key.DebugDescription.StartsWith("<NSStatusBarWindow") || t.Key.DebugDescription.StartsWith("<NSToolbarFullScreenWindow")))); }
internal override void SetMainWindowDecorations(Gtk.Window window) { NSWindow w = GtkQuartz.GetWindow(window); w.IsOpaque = false; var resource = "maintoolbarbg.png"; NSImage img = LoadImage(resource); w.BackgroundColor = NSColor.FromPatternImage(img); w.StyleMask |= NSWindowStyle.TexturedBackground; }
public override void PlaceWindow(Gtk.Window window, int x, int y, int width, int height) { if (window.GdkWindow == null) { return; // Not yet realized } NSWindow w = GtkQuartz.GetWindow(window); var dr = FromDesktopRect(new Gdk.Rectangle(x, y, width, height)); var r = w.FrameRectFor(dr); w.SetFrame(r, true); base.PlaceWindow(window, x, y, width, height); }
internal override void AttachMainToolbar(Gtk.VBox parent, IMainToolbarView toolbar) { var nativeToolbar = (MonoDevelop.MacIntegration.MainToolbar.MainToolbar)toolbar; NSWindow w = GtkQuartz.GetWindow(nativeToolbar.gtkWindow); if (MacSystemInformation.OsVersion >= MacSystemInformation.Yosemite) { w.TitleVisibility = NSWindowTitleVisibility.Hidden; } w.Toolbar = nativeToolbar.widget; nativeToolbar.Initialize(); }
public bool Run(SelectFileDialogData data) { NSSavePanel panel = null; try { bool directoryMode = data.Action != Gtk.FileChooserAction.Open; if (data.Action == Gtk.FileChooserAction.Save) { panel = new NSSavePanel(); } else { panel = new NSOpenPanel() { CanChooseDirectories = directoryMode, CanChooseFiles = !directoryMode, }; } SetCommonPanelProperties(data, panel); if (!directoryMode) { var popup = CreateFileFilterPopup(data, panel); if (popup != null) { panel.AccessoryView = popup; } } var action = RunPanel(data, panel); if (action) { data.SelectedFiles = GetSelectedFiles(panel); GtkQuartz.FocusWindow(data.TransientFor ?? MessageService.RootWindow); } else { GtkQuartz.FocusWindow(data.TransientFor ?? MessageService.RootWindow); } return(action); } finally { if (panel != null) { panel.Dispose(); } } }
public bool Run(SelectFileDialogData data) { using (var panel = CreatePanel(data, out var saveState)) { if (panel.RunModal() == 0) { GtkQuartz.FocusWindow(data.TransientFor ?? MessageService.RootWindow); return(false); } data.SelectedFiles = GetSelectedFiles(panel); GtkQuartz.FocusWindow(data.TransientFor ?? MessageService.RootWindow); return(true); } }
void InitApp(CommandManager commandManager) { if (initedApp) { return; } MacMainMenu.SetAppQuitCommand(CommandManager.ToCommandId(FileCommands.Exit)); MacMainMenu.AddCommandIDMappings(new Dictionary <object, CarbonCommandID> () { { CommandManager.ToCommandId(EditCommands.Copy), CarbonCommandID.Copy }, { CommandManager.ToCommandId(EditCommands.Cut), CarbonCommandID.Cut }, { CommandManager.ToCommandId(EditCommands.MonodevelopPreferences), CarbonCommandID.Preferences }, { CommandManager.ToCommandId(EditCommands.Redo), CarbonCommandID.Redo }, { CommandManager.ToCommandId(EditCommands.Undo), CarbonCommandID.Undo }, { CommandManager.ToCommandId(EditCommands.SelectAll), CarbonCommandID.SelectAll }, { CommandManager.ToCommandId(FileCommands.NewFile), CarbonCommandID.New }, { CommandManager.ToCommandId(FileCommands.OpenFile), CarbonCommandID.Open }, { CommandManager.ToCommandId(FileCommands.Save), CarbonCommandID.Save }, { CommandManager.ToCommandId(FileCommands.SaveAs), CarbonCommandID.SaveAs }, { CommandManager.ToCommandId(FileCommands.CloseFile), CarbonCommandID.Close }, { CommandManager.ToCommandId(FileCommands.Exit), CarbonCommandID.Quit }, { CommandManager.ToCommandId(FileCommands.ReloadFile), CarbonCommandID.Revert }, { CommandManager.ToCommandId(HelpCommands.About), CarbonCommandID.About }, { CommandManager.ToCommandId(HelpCommands.Help), CarbonCommandID.AppHelp }, { CommandManager.ToCommandId(MacIntegrationCommands.HideWindow), CarbonCommandID.Hide }, { CommandManager.ToCommandId(MacIntegrationCommands.HideOthers), CarbonCommandID.HideOthers }, }); //mac-ify these command names commandManager.GetCommand(EditCommands.MonodevelopPreferences).Text = GettextCatalog.GetString("Preferences..."); commandManager.GetCommand(EditCommands.DefaultPolicies).Text = GettextCatalog.GetString("Custom Policies..."); commandManager.GetCommand(HelpCommands.About).Text = GettextCatalog.GetString("About {0}", BrandingService.ApplicationName); commandManager.GetCommand(MacIntegrationCommands.HideWindow).Text = GettextCatalog.GetString("Hide {0}", BrandingService.ApplicationName); commandManager.GetCommand(ToolCommands.AddinManager).Text = GettextCatalog.GetString("Add-in Manager..."); initedApp = true; IdeApp.Workbench.RootWindow.DeleteEvent += HandleDeleteEvent; if (MacSystemInformation.OsVersion >= MacSystemInformation.Lion) { IdeApp.Workbench.RootWindow.Realized += (sender, args) => { var win = GtkQuartz.GetWindow((Gtk.Window)sender); win.CollectionBehavior |= NSWindowCollectionBehavior.FullScreenPrimary; }; } }
public override void SetIsFullscreen(Window window, bool isFullscreen) { if (MacSystemInformation.OsVersion < MacSystemInformation.Lion) { base.SetIsFullscreen(window, isFullscreen); return; } NSWindow nswin = GtkQuartz.GetWindow(window); if (isFullscreen != ((nswin.StyleMask & NSWindowStyle.FullScreenWindow) != 0)) { nswin.ToggleFullScreen(null); } }
public bool Run(SelectFileDialogData data) { NSSavePanel panel = null; try { if (data.Action == FileChooserAction.Save) { panel = new NSSavePanel(); } else { panel = new NSOpenPanel { CanChooseDirectories = (data.Action & FileChooserAction.FolderFlags) != 0, CanChooseFiles = (data.Action & FileChooserAction.FileFlags) != 0, CanCreateDirectories = (data.Action & FileChooserAction.CreateFolder) != 0, ResolvesAliases = false, }; } SetCommonPanelProperties(data, panel); if ((data.Action & FileChooserAction.FileFlags) != 0) { var popup = CreateFileFilterPopup(data, panel); if (popup != null) { panel.AccessoryView = popup; } } if (panel.RunModal() == 0) { GtkQuartz.FocusWindow(data.TransientFor ?? MessageService.RootWindow); return(false); } data.SelectedFiles = GetSelectedFiles(panel); GtkQuartz.FocusWindow(data.TransientFor ?? MessageService.RootWindow); return(true); } finally { if (panel != null) { panel.Dispose(); } } }
public override void SetIsFullscreen(Gtk.Window window, bool isFullscreen) { if (MacSystemInformation.OsVersion < MacSystemInformation.Lion) { base.SetIsFullscreen(window, isFullscreen); return; } NSWindow nswin = GtkQuartz.GetWindow(window); if (isFullscreen != ((nswin.StyleMask & NSWindowStyle.FullScreenWindow) != 0)) { //HACK: workaround for MonoMac not allowing null as argument MonoMac.ObjCRuntime.Messaging.void_objc_msgSend_IntPtr( nswin.Handle, MonoMac.ObjCRuntime.Selector.GetHandle("toggleFullScreen:"), IntPtr.Zero); } }
public override void Initialize() { base.Initialize(); var image = Xwt.Drawing.Image.FromResource(typeof(MacPlatformService).Assembly, "maintoolbarbg.png"); Window.Realized += delegate { NSWindow w = GtkQuartz.GetWindow(Window); w.IsOpaque = false; w.BackgroundColor = NSColor.FromPatternImage(image.ToBitmap().ToNSImage()); w.StyleMask |= NSWindowStyle.TexturedBackground; }; toolbar = new CustomToolbar(); toolbar.Background = (Gdk.Pixbuf)Xwt.Toolkit.Load(Xwt.ToolkitType.Gtk).GetNativeImage(image); toolbar.TitleBarHeight = MacPlatformService.GetTitleBarHeight(); MainBox.PackStart(toolbar, false, false, 0); ((Gtk.Box.BoxChild)MainBox [toolbar]).Position = 0; }
public bool Run(ExceptionDialogData data) { using (var alert = new NSAlert()) { alert.AlertStyle = NSAlertStyle.Critical; var pix = ImageService.GetPixbuf(Gtk.Stock.DialogError, Gtk.IconSize.Dialog); byte[] buf = pix.SaveToBuffer("tiff"); alert.Icon = new NSImage(NSData.FromArray(buf)); alert.MessageText = data.Title ?? "Some Message"; alert.InformativeText = data.Message ?? "Some Info"; if (data.Exception != null) { var text = new NSTextView(new RectangleF(0, 0, float.MaxValue, float.MaxValue)); text.HorizontallyResizable = true; text.TextContainer.ContainerSize = new SizeF(float.MaxValue, float.MaxValue); text.TextContainer.WidthTracksTextView = false; text.InsertText(new NSString(data.Exception.ToString())); text.Editable = false; var scrollView = new NSScrollView(new RectangleF(0, 0, 450, 150)) { HasHorizontalScroller = true, DocumentView = text, }; ; alert.AccessoryView = scrollView; } // Hack up a slightly wider than normal alert dialog. I don't know how to do this in a nicer way // as the min size constraints are apparently ignored. var frame = ((NSPanel)alert.Window).Frame; ((NSPanel)alert.Window).SetFrame(new RectangleF(frame.X, frame.Y, Math.Max(frame.Width, 600), frame.Height), true); int result = alert.RunModal() - (int)NSAlertButtonReturn.First; GtkQuartz.FocusWindow(data.TransientFor ?? MessageService.RootWindow); } return(true); }
public override void Initialize() { base.Initialize(); var resource = "maintoolbarbg.png"; Window.Realized += delegate { NSWindow w = GtkQuartz.GetWindow(Window); w.IsOpaque = false; NSImage img = MacPlatformService.LoadImage(resource); w.BackgroundColor = NSColor.FromPatternImage(img); w.StyleMask |= NSWindowStyle.TexturedBackground; }; toolbar = new CustomToolbar(); toolbar.Background = MonoDevelop.Components.CairoExtensions.LoadImage(typeof(MacPlatformService).Assembly, resource); toolbar.TitleBarHeight = MacPlatformService.GetTitleBarHeight(); MainBox.PackStart(toolbar, false, false, 0); ((Gtk.Box.BoxChild)MainBox [toolbar]).Position = 0; }
public bool Run(AddFileDialogData data) { using (var panel = CreatePanel(data, out NSPopUpButton popup)) { if (panel.RunModal() == 0) { GtkQuartz.FocusWindow(data.TransientFor ?? MessageService.RootWindow); return(false); } data.SelectedFiles = MacSelectFileDialogHandler.GetSelectedFiles(panel); var idx = popup.IndexOfSelectedItem - 2; if (idx >= 0) { data.OverrideAction = data.BuildActions[idx]; } GtkQuartz.FocusWindow(data.TransientFor ?? MessageService.RootWindow); return(true); } }
internal override MainToolbar CreateMainToolbar(Gtk.Window window) { NSWindow w = GtkQuartz.GetWindow(window); w.IsOpaque = false; var resource = "maintoolbarbg.png"; NSImage img = LoadImage(resource); var c = NSColor.FromPatternImage(img); w.BackgroundColor = c; w.StyleMask |= NSWindowStyle.TexturedBackground; var result = new MainToolbar() { Background = MonoDevelop.Components.CairoExtensions.LoadImage(typeof(MacPlatformService).Assembly, resource), TitleBarHeight = GetTitleBarHeight() }; return(result); }
void InitApp(CommandManager commandManager) { if (initedApp) { return; } commandManager.CommandActivating += OnCommandActivating; //mac-ify these command names commandManager.GetCommand(EditCommands.MonodevelopPreferences).Text = GettextCatalog.GetString("Preferences..."); commandManager.GetCommand(EditCommands.DefaultPolicies).Text = GettextCatalog.GetString("Custom Policies..."); commandManager.GetCommand(HelpCommands.About).Text = GetAboutCommandText(); commandManager.GetCommand(MacIntegrationCommands.HideWindow).Text = GetHideWindowCommandText(); commandManager.GetCommand(ToolCommands.AddinManager).Text = GettextCatalog.GetString("Add-in Manager..."); initedApp = true; IdeApp.Workbench.RootWindow.DeleteEvent += HandleDeleteEvent; BrandingService.ApplicationNameChanged += ApplicationNameChanged; if (MacSystemInformation.OsVersion >= MacSystemInformation.Lion) { IdeApp.Workbench.RootWindow.Realized += (sender, args) => { var win = GtkQuartz.GetWindow((Gtk.Window)sender); win.CollectionBehavior |= NSWindowCollectionBehavior.FullScreenPrimary; }; } PatchGtkTheme(); NSNotificationCenter.DefaultCenter.AddObserver(NSCell.ControlTintChangedNotification, notif => Runtime.RunInMainThread( delegate { Styles.LoadStyle(); PatchGtkTheme(); })); // FIXME: Immediate theme switching disabled, until NSAppearance issues are fixed //IdeApp.Preferences.UserInterfaceTheme.Changed += (s,a) => PatchGtkTheme (); }
public override bool IsModalDialogRunning() { var toplevels = GtkQuartz.GetToplevels(); return(toplevels.Any(t => t.Key.IsVisible && (t.Value == null || t.Value.Modal) && !t.Key.DebugDescription.StartsWith("<NSStatusBarWindow"))); }
public bool Run(ExceptionDialogData data) { using (var alert = new NSAlert { AlertStyle = NSAlertStyle.Critical }) { IdeTheme.ApplyTheme(alert.Window); alert.Icon = NSApplication.SharedApplication.ApplicationIconImage; alert.MessageText = data.Title ?? GettextCatalog.GetString("Error"); if (!string.IsNullOrEmpty(data.Message)) { alert.InformativeText = data.Message; } List <AlertButton> buttons = null; if (data.Buttons != null && data.Buttons.Length > 0) { buttons = data.Buttons.Reverse().ToList(); } if (buttons != null) { foreach (var button in buttons) { var label = button.Label; if (button.IsStockButton) { label = Gtk.Stock.Lookup(label).Label; } label = label.Replace("_", ""); //this message seems to be a standard Mac message since alert handles it specially if (button == AlertButton.CloseWithoutSave) { label = GettextCatalog.GetString("Don't Save"); } alert.AddButton(label); } } if (data.Exception != null) { var scrollSize = new CGSize(400, 130); const float spacing = 4; string title = GettextCatalog.GetString("View details"); string altTitle = GettextCatalog.GetString("Hide details"); var buttonFrame = new CGRect(0, 0, 0, 0); var button = new NSButton(buttonFrame) { BezelStyle = NSBezelStyle.Disclosure, Title = "", AlternateTitle = "", }; button.SetButtonType(NSButtonType.OnOff); button.SizeToFit(); var label = new MDClickableLabel(title) { Alignment = NSTextAlignment.Left, }; label.SizeToFit(); button.SetFrameSize(new CGSize(button.Frame.Width, NMath.Max(button.Frame.Height, label.Frame.Height))); label.SetFrameOrigin(new CGPoint(button.Frame.Width + 5, button.Frame.Y)); var text = new MyTextView(new CGRect(0, 0, float.MaxValue, float.MaxValue)) { HorizontallyResizable = true, }; text.TextContainer.ContainerSize = new CGSize(float.MaxValue, float.MaxValue); text.TextContainer.WidthTracksTextView = true; text.InsertText(new NSString(data.Exception.ToString())); text.Editable = false; var scrollView = new NSScrollView(new CGRect(CGPoint.Empty, CGSize.Empty)) { HasHorizontalScroller = true, HasVerticalScroller = true, }; var accessory = new NSView(new CGRect(0, 0, scrollSize.Width, button.Frame.Height)); accessory.AddSubview(scrollView); accessory.AddSubview(button); accessory.AddSubview(label); alert.AccessoryView = accessory; button.Activated += delegate { nfloat change; if (button.State == NSCellStateValue.On) { change = scrollSize.Height + spacing; label.StringValue = altTitle; scrollView.Hidden = false; scrollView.Frame = new CGRect(CGPoint.Empty, scrollSize); scrollView.DocumentView = text; } else { change = -(scrollSize.Height + spacing); label.StringValue = title; scrollView.Hidden = true; scrollView.Frame = new CGRect(CGPoint.Empty, CGSize.Empty); } var f = accessory.Frame; f.Height += change; accessory.Frame = f; var lf = label.Frame; lf.Y += change; label.Frame = lf; var bf = button.Frame; bf.Y += change; button.Frame = bf; label.SizeToFit(); var panel = alert.Window; var pf = panel.Frame; pf.Height += change; pf.Y -= change; panel.SetFrame(pf, true, true); //unless we assign the icon again, it starts nesting old icon into the warning icon alert.Icon = NSApplication.SharedApplication.ApplicationIconImage; alert.Layout(); }; label.OnMouseUp += (sender, e) => button.PerformClick(e.Event); } var result = (int)(nint)alert.RunModal() - (int)(long)NSAlertButtonReturn.First; data.ResultButton = buttons != null ? buttons [result] : null; GtkQuartz.FocusWindow(data.TransientFor ?? MessageService.RootWindow); } return(true); }
public bool Run(OpenFileDialogData data) { NSSavePanel panel = null; try { bool directoryMode = data.Action != Gtk.FileChooserAction.Open && data.Action != Gtk.FileChooserAction.Save; if (data.Action == Gtk.FileChooserAction.Save) { panel = new NSSavePanel(); } else { panel = new NSOpenPanel() { CanChooseDirectories = directoryMode, CanChooseFiles = !directoryMode, }; } MacSelectFileDialogHandler.SetCommonPanelProperties(data, panel); SelectEncodingPopUpButton encodingSelector = null; NSPopUpButton viewerSelector = null; NSButton closeSolutionButton = null; var box = new MDBox(LayoutDirection.Vertical, 2, 2); List <FileViewer> currentViewers = null; List <MDAlignment> labels = new List <MDAlignment> (); if (!directoryMode) { var filterPopup = MacSelectFileDialogHandler.CreateFileFilterPopup(data, panel); if (filterPopup != null) { var filterLabel = new MDAlignment(new MDLabel(GettextCatalog.GetString("Show files:")), true); var filterBox = new MDBox(LayoutDirection.Horizontal, 2, 0) { { filterLabel }, { new MDAlignment(filterPopup, true) { MinWidth = 200 } } }; labels.Add(filterLabel); box.Add(filterBox); } if (data.ShowEncodingSelector) { encodingSelector = new SelectEncodingPopUpButton(data.Action != Gtk.FileChooserAction.Save); encodingSelector.SelectedEncodingId = data.Encoding != null ? data.Encoding.CodePage : 0; var encodingLabel = new MDAlignment(new MDLabel(GettextCatalog.GetString("Encoding:")), true); var encodingBox = new MDBox(LayoutDirection.Horizontal, 2, 0) { { encodingLabel }, { new MDAlignment(encodingSelector, true) { MinWidth = 200 } } }; labels.Add(encodingLabel); box.Add(encodingBox); } if (data.ShowViewerSelector && panel is NSOpenPanel) { currentViewers = new List <FileViewer> (); viewerSelector = new NSPopUpButton() { Enabled = false, }; if (encodingSelector != null) { viewerSelector.Activated += delegate { var idx = viewerSelector.IndexOfSelectedItem; encodingSelector.Enabled = !(idx == 0 && currentViewers [0] == null); }; } var viewSelLabel = new MDLabel(GettextCatalog.GetString("Open with:")); var viewSelBox = new MDBox(LayoutDirection.Horizontal, 2, 0) { { viewSelLabel, true }, { new MDAlignment(viewerSelector, true) { MinWidth = 200 } } }; if (IdeApp.Workspace.IsOpen) { closeSolutionButton = new NSButton() { Title = GettextCatalog.GetString("Close current workspace"), Hidden = true, State = NSCellStateValue.On, }; closeSolutionButton.SetButtonType(NSButtonType.Switch); closeSolutionButton.SizeToFit(); viewSelBox.Add(closeSolutionButton, true); } box.Add(viewSelBox); } } if (labels.Count > 0) { float w = labels.Max(l => l.MinWidth); foreach (var l in labels) { l.MinWidth = w; l.XAlign = LayoutAlign.Begin; } } if (box.Count > 0) { box.Layout(); panel.AccessoryView = box.View; } panel.SelectionDidChange += delegate(object sender, EventArgs e) { var selection = MacSelectFileDialogHandler.GetSelectedFiles(panel); bool slnViewerSelected = false; if (viewerSelector != null) { FillViewers(currentViewers, viewerSelector, closeSolutionButton, selection); if (currentViewers.Count == 0 || currentViewers [0] != null) { if (closeSolutionButton != null) { closeSolutionButton.Hidden = true; } slnViewerSelected = false; } else { if (closeSolutionButton != null) { closeSolutionButton.Hidden = false; } slnViewerSelected = true; } box.Layout(); //re-center the accessory view in its parent, Cocoa does this for us initially and after //resizing the window, but we need to do it again after altering its layout var superFrame = box.View.Superview.Frame; var frame = box.View.Frame; //not sure why it's ceiling, but this matches the Cocoa layout frame.X = (float)Math.Ceiling((superFrame.Width - frame.Width) / 2); frame.Y = (float)Math.Ceiling((superFrame.Height - frame.Height) / 2); box.View.Frame = frame; } if (encodingSelector != null) { encodingSelector.Enabled = !slnViewerSelected; } }; if (panel.RunModal() == 0) { GtkQuartz.FocusWindow(data.TransientFor ?? MessageService.RootWindow); return(false); } data.SelectedFiles = MacSelectFileDialogHandler.GetSelectedFiles(panel); if (encodingSelector != null) { data.Encoding = encodingSelector.SelectedEncodingId > 0 ? Encoding.GetEncoding(encodingSelector.SelectedEncodingId) : null; } if (viewerSelector != null) { if (closeSolutionButton != null) { data.CloseCurrentWorkspace = closeSolutionButton.State != NSCellStateValue.Off; } data.SelectedViewer = currentViewers[viewerSelector.IndexOfSelectedItem]; } GtkQuartz.FocusWindow(data.TransientFor ?? MessageService.RootWindow); } catch (Exception ex) { LoggingService.LogError("Error in Open File dialog", ex); MessageService.ShowException(ex); } finally { if (panel != null) { panel.Dispose(); } } return(true); }
public bool Run(AlertDialogData data) { using (var alert = new NSAlert()) { alert.Window.Title = data.Title ?? BrandingService.ApplicationName; IdeTheme.ApplyTheme(alert.Window); bool stockIcon; if (data.Message.Icon == MonoDevelop.Ide.Gui.Stock.Error || data.Message.Icon == Gtk.Stock.DialogError) { alert.AlertStyle = NSAlertStyle.Critical; stockIcon = true; } else if (data.Message.Icon == MonoDevelop.Ide.Gui.Stock.Warning || data.Message.Icon == Gtk.Stock.DialogWarning) { alert.AlertStyle = NSAlertStyle.Critical; stockIcon = true; } else { alert.AlertStyle = NSAlertStyle.Informational; stockIcon = data.Message.Icon == MonoDevelop.Ide.Gui.Stock.Information; } if (!stockIcon && !string.IsNullOrEmpty(data.Message.Icon)) { var img = ImageService.GetIcon(data.Message.Icon, Gtk.IconSize.Dialog); // HACK: VK The icon is not rendered in dark style correctly // Use light variant and reder it here // as long as NSAppearance.NameVibrantDark is broken if (IdeTheme.UserInterfaceSkin == Skin.Dark) { alert.Icon = img.WithStyles("-dark").ToBitmap(GtkWorkarounds.GetScaleFactor()).ToNSImage(); } else { alert.Icon = img.ToNSImage(); } } else { //for some reason the NSAlert doesn't pick up the app icon by default alert.Icon = NSApplication.SharedApplication.ApplicationIconImage; } alert.MessageText = data.Message.Text; alert.InformativeText = data.Message.SecondaryText ?? ""; var buttons = data.Buttons.Reverse().ToList(); for (int i = 0; i < buttons.Count - 1; i++) { if (i == data.Message.DefaultButton) { var next = buttons[i]; for (int j = buttons.Count - 1; j >= i; j--) { var tmp = buttons[j]; buttons[j] = next; next = tmp; } break; } } var wrappers = new List <AlertButtonWrapper> (buttons.Count); foreach (var button in buttons) { var label = button.Label; if (button.IsStockButton) { label = Gtk.Stock.Lookup(label).Label; } label = label.Replace("_", ""); //this message seems to be a standard Mac message since alert handles it specially if (button == AlertButton.CloseWithoutSave) { label = GettextCatalog.GetString("Don't Save"); } var nsbutton = alert.AddButton(label); var wrapperButton = new AlertButtonWrapper(nsbutton, data.Message, button, alert); wrappers.Add(wrapperButton); nsbutton.Target = wrapperButton; nsbutton.Action = new ObjCRuntime.Selector("buttonActivatedAction"); } NSButton[] optionButtons = null; if (data.Options.Count > 0) { var box = new MDBox(LayoutDirection.Vertical, 2, 2); optionButtons = new NSButton[data.Options.Count]; for (int i = data.Options.Count - 1; i >= 0; i--) { var option = data.Options[i]; var button = new NSButton { Title = option.Text, Tag = i, State = option.Value? NSCellStateValue.On : NSCellStateValue.Off, }; button.SetButtonType(NSButtonType.Switch); optionButtons[i] = button; box.Add(new MDAlignment(button, true) { XAlign = LayoutAlign.Begin }); } box.Layout(); alert.AccessoryView = box.View; } NSButton applyToAllCheck = null; if (data.Message.AllowApplyToAll) { alert.ShowsSuppressionButton = true; applyToAllCheck = alert.SuppressionButton; applyToAllCheck.Title = GettextCatalog.GetString("Apply to all"); } // Hack up a slightly wider than normal alert dialog. I don't know how to do this in a nicer way // as the min size constraints are apparently ignored. var frame = alert.Window.Frame; alert.Window.SetFrame(new CGRect(frame.X, frame.Y, NMath.Max(frame.Width, 600), frame.Height), true); alert.Layout(); bool completed = false; if (data.Message.CancellationToken.CanBeCanceled) { data.Message.CancellationToken.Register(delegate { alert.InvokeOnMainThread(() => { if (!completed) { NSApplication.SharedApplication.AbortModal(); } }); }); } if (!data.Message.CancellationToken.IsCancellationRequested) { var result = (int)alert.RunModal() - (long)(int)NSAlertButtonReturn.First; completed = true; if (result >= 0 && result < buttons.Count) { data.ResultButton = buttons [(int)result]; } else { data.ResultButton = null; } } if (data.ResultButton == null || data.Message.CancellationToken.IsCancellationRequested) { data.SetResultToCancelled(); } if (optionButtons != null) { foreach (var button in optionButtons) { var option = data.Options[(int)button.Tag]; data.Message.SetOptionValue(option.Id, button.State != 0); } } if (applyToAllCheck != null && applyToAllCheck.State != 0) { data.ApplyToAll = true; } GtkQuartz.FocusWindow(data.TransientFor ?? MessageService.RootWindow); } return(true); }