Ejemplo n.º 1
0
        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;
                };
            }
        }
Ejemplo n.º 2
0
        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))));
        }
Ejemplo n.º 3
0
        internal override void SetMainWindowDecorations(Gtk.Window window)
        {
            NSWindow w = GtkQuartz.GetWindow(window);

            w.IsOpaque   = true;
            w.StyleMask |= NSWindowStyle.UnifiedTitleAndToolbar;
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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 ();
        }
Ejemplo n.º 6
0
        internal override void RemoveWindowShadow(Gtk.Window window)
        {
            if (window == null)
            {
                throw new ArgumentNullException("window");
            }
            NSWindow w = GtkQuartz.GetWindow(window);

            w.HasShadow = false;
        }
Ejemplo n.º 7
0
        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);
        }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
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"))));
        }
Ejemplo n.º 12
0
        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;
        }
Ejemplo n.º 13
0
        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);
        }
Ejemplo n.º 14
0
        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();
        }
Ejemplo n.º 15
0
        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);
            }
        }
Ejemplo n.º 17
0
        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;
                };
            }
        }
Ejemplo n.º 18
0
        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();
                }
            }
        }
Ejemplo n.º 20
0
        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;
        }
Ejemplo n.º 22
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);
        }
Ejemplo n.º 23
0
        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;
        }
Ejemplo n.º 24
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);
            }
        }
Ejemplo n.º 25
0
        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);
        }
Ejemplo n.º 26
0
        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 ();
        }
Ejemplo n.º 27
0
        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")));
        }
Ejemplo n.º 28
0
        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);
        }
Ejemplo n.º 29
0
        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);
        }
Ejemplo n.º 30
0
        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);
        }