Fixed tabs/spaces indentation mistake.
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / InternalWindowManager.cs
index 38cec587f4d11aa4a4d29fa43554bce5b50cd2d2..5acda6776cdb752c6bc119faeacca08f1530c0b2 100644 (file)
@@ -154,8 +154,7 @@ namespace System.Windows.Forms {
                                int x = Control.LowOrder ((int) m.LParam.ToInt32 ());
                                int y = Control.HighOrder ((int) m.LParam.ToInt32 ());
 
-                               form.PointToClient (ref x, ref y);
-                               y += TitleBarHeight;
+                               NCPointToClient (ref x, ref y);
 
                                FormPos pos = FormPosForCoords (x, y);
                                
@@ -198,14 +197,14 @@ namespace System.Windows.Forms {
                                }
                                return true;
 
-                       case Msg.WM_NCMOUSEMOVE:
-                               return HandleNCMouseMove (form, ref m);
-
+                               // Return true from these guys, otherwise win32 will mess up z-order
                        case Msg.WM_NCLBUTTONUP:
-                               return HandleNCLButtonUp (ref m);
+                               HandleNCLButtonUp (ref m);
+                               return true;
 
                        case Msg.WM_NCLBUTTONDOWN:
-                               return HandleNCLButtonDown (ref m);
+                               HandleNCLButtonDown (ref m);
+                               return true;
 
                        case Msg.WM_NCLBUTTONDBLCLK:
                                HandleNCLButtonDblClick (ref m);
@@ -237,9 +236,23 @@ namespace System.Windows.Forms {
                                break;
 
                        case Msg.WM_NCPAINT:
-                               PaintDecorations ();
+                               PaintEventArgs pe = XplatUI.PaintEventStart (form.Handle, false);
+
+                               Rectangle clip;
+                               // clip region is not correct on win32.
+                               // if (m.WParam.ToInt32 () > 1) {
+                               //      Region r = Region.FromHrgn (m.WParam);
+                               //      RectangleF rf = r.GetBounds (pe.Graphics);
+                               //      clip = new Rectangle ((int) rf.X, (int) rf.Y, (int) rf.Width, (int) rf.Height);
+                               //} else {      
+                               clip = new Rectangle (0, 0, form.Width, form.Height);
+                               //}
+
+                               ThemeEngine.Current.DrawManagedWindowDecorations (pe.Graphics, clip, this);
+                               XplatUI.PaintEventEnd (form.Handle, false);
                                return true;
                        }
+
                        return false;
                }
 
@@ -279,7 +292,19 @@ namespace System.Windows.Forms {
 
                public virtual void PointToClient (ref int x, ref int y)
                {
-                       // toolwindows stay in screencoords
+                       // toolwindows stay in screencoords we just have to make sure
+                       // they obey the working area
+                       Rectangle working = SystemInformation.WorkingArea;
+
+                       if (x > working.Right)
+                               x = working.Right;
+                       if (x < working.Left)
+                               x = working.Left;
+
+                       if (y < working.Top)
+                               y = working.Top;
+                       if (y > working.Bottom)
+                               y = working.Bottom;
                }
 
                public virtual void PointToScreen (ref int x, ref int y)
@@ -295,7 +320,7 @@ namespace System.Windows.Forms {
                protected virtual void Activate ()
                {
                        // Hack to get a paint
-                       NativeWindow.WndProc (form.Handle, Msg.WM_NCPAINT, IntPtr.Zero, IntPtr.Zero);
+                       //NativeWindow.WndProc (form.Handle, Msg.WM_NCPAINT, IntPtr.Zero, IntPtr.Zero);
                        form.Refresh ();
                }
 
@@ -304,35 +329,33 @@ namespace System.Windows.Forms {
                        return true;
                }
 
+
                private void FormSizeChangedHandler (object sender, EventArgs e)
                {
                        ThemeEngine.Current.ManagedWindowSetButtonLocations (this);
-
-                       PaintDecorations ();
+                       Message m = new Message ();
+                       m.Msg = (int) Msg.WM_NCPAINT;
+                       m.HWnd = form.Handle;
+                       m.LParam = IntPtr.Zero;
+                       m.WParam = new IntPtr (1);
+                       XplatUI.SendMessage (ref m);
                }
 
-               private void PaintDecorations ()
-               {
-                       PaintEventArgs pe = XplatUI.PaintEventStart (form.Handle, false);
-                       ThemeEngine.Current.DrawManagedWindowDecorations (pe.Graphics, pe.ClipRectangle, this);
-
-                       if (IsMaximized) {
-                               MainMenu menu = form.ActiveMenu;
-                               DrawMaximizedButtons (pe, menu);
-                               if (menu != null)
-                                       menu.Draw (pe);
-                       }
-
-                       XplatUI.PaintEventEnd (form.Handle, false);
-               }
-
-               private void CreateButtons ()
+               protected void CreateButtons ()
                {
                        switch (form.FormBorderStyle) {
                        case FormBorderStyle.None:
                                close_button = null;
                                minimize_button = null;
                                maximize_button = null;
+                               if (IsMaximized || IsMinimized)
+                                       goto case FormBorderStyle.Sizable;
+                               break;
+                       case FormBorderStyle.FixedToolWindow:
+                       case FormBorderStyle.SizableToolWindow:
+                               close_button = new TitleButton (CaptionButton.Close, new EventHandler (CloseClicked));
+                               if (IsMaximized || IsMinimized)
+                                       goto case FormBorderStyle.Sizable;
                                break;
                        case FormBorderStyle.FixedSingle:
                        case FormBorderStyle.Fixed3D:
@@ -342,10 +365,6 @@ namespace System.Windows.Forms {
                                minimize_button = new TitleButton (CaptionButton.Minimize, new EventHandler (MinimizeClicked));
                                maximize_button = new TitleButton (CaptionButton.Maximize, new EventHandler (MaximizeClicked));
                                break;
-                       case FormBorderStyle.FixedToolWindow:
-                       case FormBorderStyle.SizableToolWindow:
-                               close_button = new TitleButton (CaptionButton.Close, new EventHandler (CloseClicked));
-                               break;
                        }
 
                        title_buttons [0] = close_button;
@@ -365,25 +384,22 @@ namespace System.Windows.Forms {
                {
                        Activate ();
 
-                       int x = Control.LowOrder ((int) m.LParam.ToInt32 ());
-                       int y = Control.HighOrder ((int) m.LParam.ToInt32 ());
-
                        start = Cursor.Position;
                        virtual_position = form.Bounds;
 
-                       form.PointToClient (ref x, ref y);
+                       int x = Control.LowOrder ((int) m.LParam.ToInt32 ());
+                       int y = Control.HighOrder ((int) m.LParam.ToInt32 ());
+                       
                        // Need to adjust because we are in NC land
-                       y += TitleBarHeight;
+                       NCPointToClient (ref x, ref y);
                        FormPos pos = FormPosForCoords (x, y);
-
+                       
                        if (pos == FormPos.TitleBar) {
                                HandleTitleBarDown (x, y);
                                return true;
                        }
 
                        if (IsSizable) {
-                               SetCursorForPos (pos);
-                       
                                if ((pos & FormPos.AnyEdge) == 0)
                                        return false;
 
@@ -444,48 +460,10 @@ namespace System.Windows.Forms {
                        return false;
                }
 
-               private bool HandleNCMouseMove (Form form, ref Message m)
-               {
-                       int x = Control.LowOrder ((int) m.LParam.ToInt32 ());
-                       int y = Control.HighOrder ((int) m.LParam.ToInt32 ());
-                       
-                       if (IsSizable) {
-                               form.PointToClient (ref x, ref y);
-                               y += TitleBarHeight;
-                       }
-
-                       return false;
-               }
-
                private void FormMouseLeave (ref Message m)
                {
                        form.ResetCursor ();
                }
-
-               private void SetCursorForPos (FormPos pos)
-               {
-                       switch (pos) {
-                       case FormPos.TopLeft:
-                       case FormPos.BottomRight:
-                               form.Cursor = Cursors.SizeNWSE;
-                               break;
-                       case FormPos.TopRight:
-                       case FormPos.BottomLeft:
-                               form.Cursor = Cursors.SizeNESW;
-                               break;
-                       case FormPos.Top:
-                       case FormPos.Bottom:
-                               form.Cursor = Cursors.SizeNS;
-                               break;
-                       case FormPos.Left:
-                       case FormPos.Right:
-                               form.Cursor = Cursors.SizeWE;
-                               break;
-                       default:
-                               form.ResetCursor ();
-                               break;
-                       }
-               }
        
                protected virtual void HandleWindowMove (Message m)
                {
@@ -537,6 +515,10 @@ namespace System.Windows.Forms {
                        get { return GetWindowState () == FormWindowState.Maximized; }
                }
 
+               public bool IsMinimized {
+                       get { return GetWindowState () == FormWindowState.Minimized; }
+               }
+
                public bool IsSizable {
                        get {
                                switch (form.FormBorderStyle) {
@@ -570,19 +552,6 @@ namespace System.Windows.Forms {
                        }
                }
 
-               public Size ButtonSize {
-                       get {
-                               int height = TitleBarHeight;
-                               if (IsToolWindow)
-                                       return new Size (SystemInformation.ToolWindowCaptionButtonSize.Width - 2,
-                                                       height - 5);
-                               if (form.FormBorderStyle == FormBorderStyle.None)
-                                       return Size.Empty;
-                               return new Size (SystemInformation.CaptionButtonSize.Width - 2,
-                                               height - 5);
-                       }
-               }
-
                protected void UpdateVP (Rectangle r)
                {
                        UpdateVP (r.X, r.Y, r.Width, r.Height);
@@ -624,15 +593,14 @@ namespace System.Windows.Forms {
 
                                form.Capture = false;
                                state = State.Idle;
+                               if (form.MdiContainer != null)
+                                       form.MdiContainer.SizeScrollBars();
                        }
                                
                        int x = Control.LowOrder ((int) m.LParam.ToInt32 ());
                        int y = Control.HighOrder ((int) m.LParam.ToInt32 ());
 
-                       form.PointToClient (ref x, ref y);
-
-                       // Need to adjust because we are in NC land
-                       y += TitleBarHeight;
+                       NCPointToClient (ref x, ref y);
 
                        foreach (TitleButton button in title_buttons) {
                                if (button != null && button.Rectangle.Contains (x, y)) {
@@ -655,9 +623,8 @@ namespace System.Windows.Forms {
                                        button.Caption, ButtonState.Normal);
                }
 
-               public virtual void DrawMaximizedButtons (PaintEventArgs pe, MainMenu menu)
+               public virtual void DrawMaximizedButtons (object sender, PaintEventArgs pe)
                {
-
                }
 
                protected virtual void CloseClicked (object sender, EventArgs e)
@@ -704,6 +671,12 @@ namespace System.Windows.Forms {
                {
                }
 
+               protected virtual void NCPointToClient(ref int x, ref int y) {
+                       form.PointToClient(ref x, ref y);
+                       y += TitleBarHeight;
+                       y += ThemeEngine.Current.ManagedWindowBorderWidth (this);
+               }
+
                protected FormPos FormPosForCoords (int x, int y)
                {
                        int bw = ThemeEngine.Current.ManagedWindowBorderWidth (this);