2006-03-21 Alexander Olk <alex.olk@googlemail.com>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / ThemeWin32Classic.cs
index cf1eea64f4944f27db86427e6e44e8bad1ff89b0..b4da2611af4cfc42953cdd59f0ca3609e0307854 100644 (file)
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-// Copyright (c) 2004-2005 Novell, Inc.
+// Copyright (c) 2004-2006 Novell, Inc.
 //
 // Authors:
 //     Jordi Mas i Hernandez, jordi@ximian.com
 //     Peter Bartok, pbartok@novell.com
 //     John BouAntoun, jba-mono@optusnet.com.au
-//  Marek Safar, marek.safar@seznam.cz
+//     Marek Safar, marek.safar@seznam.cz
 //
 
 
@@ -95,13 +95,13 @@ namespace System.Windows.Forms
                protected SolidBrush GetControlBackBrush (Color c) {
                        if (c == DefaultControlBackColor)
                                return ResPool.GetSolidBrush (ColorControl);
-                       return new SolidBrush (c);
+                       return ResPool.GetSolidBrush (c);
                }
 
                protected SolidBrush GetControlForeBrush (Color c) {
                        if (c == DefaultControlForeColor)
                                return ResPool.GetSolidBrush (ColorControlText);
-                       return new SolidBrush (c);
+                       return ResPool.GetSolidBrush (c);
                }
                #endregion      // Internal Methods
 
@@ -150,7 +150,7 @@ namespace System.Windows.Forms
                        
                        // set up the button rectangle
                        buttonRectangle = button.ClientRectangle;
-                       if (button.has_focus) {
+                       if (button.has_focus || button.paint_as_acceptbutton) {
                                // shrink the rectangle for the normal button drawing inside the focus rectangle
                                borderRectangle = Rectangle.Inflate(buttonRectangle, -1, -1);
                        } else {
@@ -161,7 +161,7 @@ namespace System.Windows.Forms
                                DrawFlatStyleButton (dc, borderRectangle, button);
                        } else {
                                CPDrawButton(dc, borderRectangle, button.ButtonState);
-                               if (button.has_focus) {
+                               if (button.has_focus || button.paint_as_acceptbutton) {
                                        dc.DrawRectangle(ResPool.GetPen(button.ForeColor), borderRectangle);
                                }
                        }
@@ -605,6 +605,11 @@ namespace System.Windows.Forms
                        }
                        
                        /* Place the text; to be compatible with Windows place it after the checkbox has been drawn */
+
+                       // Windows seems to not wrap text in certain situations, this matches as close as I could get it
+                       if ((float)(checkbox.Font.Height * 1.5f) > text_rectangle.Height) {
+                               text_format.FormatFlags |= StringFormatFlags.NoWrap;
+                       }
                        if (checkbox.Enabled) {
                                sb = ResPool.GetSolidBrush(checkbox.ForeColor);
                                dc.DrawString(checkbox.Text, checkbox.Font, sb, text_rectangle, text_format);                   
@@ -666,7 +671,7 @@ namespace System.Windows.Forms
                                                ControlPaint.DrawBorder(graphics, checkbox_rectangle, checkbox.ForeColor, ButtonBorderStyle.Solid);
                                        } else {
                                                // draw sunken effect
-                                               CPDrawBorder3D (graphics, checkbox_rectangle, Border3DStyle.SunkenInner, Border3DSide.All, checkbox.BackColor);
+                                               CPDrawBorder3D (graphics, checkbox_rectangle, Border3DStyle.SunkenInner, Border3DSide.Left | Border3DSide.Right | Border3DSide.Top | Border3DSide.Bottom, checkbox.BackColor);
                                        }
                                } else {
                                        graphics.FillRectangle(ResPool.GetSolidBrush (ControlPaint.LightLight (checkbox.BackColor)), fill_rectangle);                           
@@ -745,23 +750,23 @@ namespace System.Windows.Forms
                        
                        /* Draw text*/
                        if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) {
-                               back_color = ThemeEngine.Current.ColorHighlight;
-                               fore_color = ThemeEngine.Current.ColorHighlightText;
+                               back_color = ColorHighlight;
+                               fore_color = ColorHighlightText;
                        }
                        else {
                                back_color = e.BackColor;
                                fore_color = e.ForeColor;
                        }
                        
-                       e.Graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush
+                       e.Graphics.FillRectangle (ResPool.GetSolidBrush
                                (back_color), item_rect);
 
                        e.Graphics.DrawString (ctrl.GetItemText (ctrl.Items[e.Index]), e.Font,
-                               ThemeEngine.Current.ResPool.GetSolidBrush (fore_color),
+                               ResPool.GetSolidBrush (fore_color),
                                item_rect, string_format);
                                        
                        if ((e.State & DrawItemState.Focus) == DrawItemState.Focus) {
-                               ThemeEngine.Current.CPDrawFocusRectangle (e.Graphics, item_rect,
+                               CPDrawFocusRectangle (e.Graphics, item_rect,
                                        fore_color, back_color);
                        }
                }
@@ -824,7 +829,7 @@ namespace System.Windows.Forms
                                DrawComboBoxEditDecorations (dc, ctrl, cl);
                        }
                        else {                  
-                               dc.DrawRectangle (ThemeEngine.Current.ResPool.GetPen (ThemeEngine.Current.ColorWindowFrame),
+                               dc.DrawRectangle (ResPool.GetPen (ColorWindowFrame),
                                        cl.X, cl.Y, cl.Width - 1, cl.Height - 1);
                        }                       
                }
@@ -837,24 +842,24 @@ namespace System.Windows.Forms
                        string_format.FormatFlags = StringFormatFlags.LineLimit;
                        
                        if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) {
-                               back_color = ThemeEngine.Current.ColorHighlight;
-                               fore_color = ThemeEngine.Current.ColorHighlightText;
+                               back_color = ColorHighlight;
+                               fore_color = ColorHighlightText;
                        }
                        else {
                                back_color = e.BackColor;
                                fore_color = e.ForeColor;
                        }                       
                                                        
-                       e.Graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (back_color), e.Bounds);
+                       e.Graphics.FillRectangle (ResPool.GetSolidBrush (back_color), e.Bounds);
 
                        if (e.Index != -1) {
                                e.Graphics.DrawString (ctrl.GetItemText (ctrl.Items[e.Index]), e.Font,
-                                       ThemeEngine.Current.ResPool.GetSolidBrush (fore_color),
+                                       ResPool.GetSolidBrush (fore_color),
                                        text_draw, string_format);
                        }
                        
                        if ((e.State & DrawItemState.Focus) == DrawItemState.Focus) {
-                               ThemeEngine.Current.CPDrawFocusRectangle (e.Graphics, e.Bounds, fore_color, back_color);
+                               CPDrawFocusRectangle (e.Graphics, e.Bounds, fore_color, back_color);
                        }
 
                        string_format.Dispose ();
@@ -916,7 +921,7 @@ namespace System.Windows.Forms
                                modified_area);
 
                        g.DrawString (grid.CaptionText, grid.CaptionFont,
-                               ThemeEngine.Current.ResPool.GetSolidBrush (grid.CaptionForeColor),
+                               ResPool.GetSolidBrush (grid.CaptionForeColor),
                                grid.grid_drawing.caption_area);                
                }
 
@@ -974,17 +979,12 @@ namespace System.Windows.Forms
 
                        current_clip.Dispose ();
                        g.ResetClip ();
-                       
-                       // This fills with background colour the unused part in the row headers
-                       if (rect_columnhdr.X + rect_columnhdr.Height < grid.ClientRectangle.X + grid.ClientRectangle.Width) {
                                
-                               Rectangle not_usedarea = columnshdrs_area_complete;                             
-                               not_usedarea.X = rect_columnhdr.X + rect_columnhdr.Width;
-                               not_usedarea.Width = grid.ClientRectangle.X + grid.ClientRectangle.Width - rect_columnhdr.X - rect_columnhdr.Height;
+                       Rectangle not_usedarea = columnshdrs_area_complete;                             
+                       not_usedarea.X = rect_columnhdr.X + rect_columnhdr.Width;
+                       not_usedarea.Width = grid.ClientRectangle.X + grid.ClientRectangle.Width - rect_columnhdr.X - rect_columnhdr.Height;            
+                       g.FillRectangle (ResPool.GetSolidBrush (grid.BackgroundColor), not_usedarea);
                        
-                               g.FillRectangle (ResPool.GetSolidBrush (grid.BackgroundColor),
-                                       not_usedarea);
-                       }
                }
 
                public override void DataGridPaintRowsHeaders (Graphics g, Rectangle clip, DataGrid grid)
@@ -992,9 +992,9 @@ namespace System.Windows.Forms
                        Rectangle rowshdrs_area_complete = grid.grid_drawing.rowshdrs_area;
                        rowshdrs_area_complete.Height = grid.grid_drawing.rowshdrs_maxheight;
                        Rectangle rect_row = new Rectangle ();
-                       rect_row.X = grid.grid_drawing.rowshdrs_area.X;
-                       int last_y = 0;
+                       rect_row.X = grid.grid_drawing.rowshdrs_area.X;                 
                        int rowcnt = grid.FirstVisibleRow + grid.VisibleRowCount;
+                       Rectangle not_usedarea = rowshdrs_area_complete;                        
 
                        if (rowcnt < grid.RowsCount) { // Paint one row more for partial rows
                                rowcnt++;
@@ -1008,25 +1008,14 @@ namespace System.Windows.Forms
                                rect_row.Y = grid.grid_drawing.rowshdrs_area.Y + ((row - grid.FirstVisibleRow) * grid.RowHeight);
 
                                if (clip.IntersectsWith (rect_row)) {
-                                       DataGridPaintRowHeader (g, rect_row, row, grid);
-                                       last_y = rect_row.Y;
+                                       DataGridPaintRowHeader (g, rect_row, row, grid);                                        
                                }
                        }
                        
                        g.ResetClip ();
-
-                       // This fills with background colour the unused part in the row headers
-                       if (last_y > 0 && rect_row.Y + rect_row.Height < grid.grid_drawing.cells_area.Y + grid.grid_drawing.cells_area.Height) {
-                               Rectangle not_usedarea = clip;
-                               not_usedarea.Intersect (rowshdrs_area_complete);
-                               
-                               not_usedarea.Y = rect_row.Y + rect_row.Height;
-                               not_usedarea.Height = rowshdrs_area_complete.Y + rowshdrs_area_complete.Height - rect_row.Height - rect_row.Y;
-                               g.FillRectangle (ResPool.GetSolidBrush (grid.BackgroundColor),
-                                       not_usedarea);
-                       }                       
-
-                       
+                       not_usedarea.Height = grid.grid_drawing.rowshdrs_maxheight - grid.grid_drawing.rowshdrs_area.Height;
+                       not_usedarea.Y = grid.grid_drawing.rowshdrs_area.Y + grid.grid_drawing.rowshdrs_area.Height;
+                       g.FillRectangle (ResPool.GetSolidBrush (grid.BackgroundColor), not_usedarea);
                }
                
                public override void DataGridPaintRowHeaderArrow (Graphics g, Rectangle bounds, DataGrid grid) 
@@ -1051,33 +1040,33 @@ namespace System.Windows.Forms
                        arrow[1] = P2;
                        arrow[2] = P3;
                        
-                       g.FillPolygon (ThemeEngine.Current.ResPool.GetSolidBrush 
+                       g.FillPolygon (ResPool.GetSolidBrush 
                                (grid.CurrentTableStyle.CurrentHeaderForeColor), arrow, FillMode.Winding);
                }
 
                public override void DataGridPaintRowHeader (Graphics g, Rectangle bounds, int row, DataGrid grid)
                {
                        // Background
-                       g.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (grid.CurrentTableStyle.CurrentHeaderBackColor),
+                       g.FillRectangle (ResPool.GetSolidBrush (grid.CurrentTableStyle.CurrentHeaderBackColor),
                                bounds);
                                
                        if (grid.FlatMode == false) {
                                
                                // Paint Borders
-                               g.DrawLine (ThemeEngine.Current.ResPool.GetPen (ThemeEngine.Current.ColorControlLight),
+                               g.DrawLine (ResPool.GetPen (ColorControlLight),
                                        bounds.X, bounds.Y, bounds.X + bounds.Width, bounds.Y);
        
-                               g.DrawLine (ThemeEngine.Current.ResPool.GetPen (ThemeEngine.Current.ColorControlLight),
+                               g.DrawLine (ResPool.GetPen (ColorControlLight),
                                        bounds.X, bounds.Y + 1, bounds.X, bounds.Y + bounds.Height - 1);
        
-                               g.DrawLine (ThemeEngine.Current.ResPool.GetPen (ThemeEngine.Current.ColorControlDark),
+                               g.DrawLine (ResPool.GetPen (ColorControlDark),
                                        bounds.X + bounds.Width - 1, bounds.Y + 1 , bounds.X + bounds.Width - 1, bounds.Y + bounds.Height - 1);
        
-                               g.DrawLine (ThemeEngine.Current.ResPool.GetPen (ThemeEngine.Current.ColorControlDark),
+                               g.DrawLine (ResPool.GetPen (ColorControlDark),
                                        bounds.X, bounds.Y + bounds.Height -1, bounds.X + bounds.Width, bounds.Y  + bounds.Height -1);
                        }
 
-                       if (grid.ShowEditRow && row == grid.RowsCount  && !(row == grid.CurrentCell.RowNumber && grid.is_changing == true)) {
+                       if (grid.ShowEditRow && grid.RowsCount > 0 && row == grid.RowsCount  && !(row == grid.CurrentCell.RowNumber && grid.is_changing == true)) {
                                
                                g.DrawString ("*", grid.grid_drawing.font_newrow, ResPool.GetSolidBrush (grid.CurrentTableStyle.CurrentHeaderForeColor),
                                        bounds);
@@ -1088,7 +1077,7 @@ namespace System.Windows.Forms
        
                                        if (grid.is_changing == true) {
                                                g.DrawString ("...", grid.Font,
-                                                       ThemeEngine.Current.ResPool.GetSolidBrush (grid.CurrentTableStyle.CurrentHeaderForeColor),
+                                                       ResPool.GetSolidBrush (grid.CurrentTableStyle.CurrentHeaderForeColor),
                                                        bounds);
        
                                        } else {
@@ -1108,7 +1097,7 @@ namespace System.Windows.Forms
 
                        int rowcnt = grid.FirstVisibleRow + grid.VisibleRowCount;
                        
-                       if (grid.ShowEditRow) {
+                       if (grid.ShowEditRow && grid.RowsCount > 0) {
                                rowcnt--;
                        }                       
 
@@ -1125,20 +1114,19 @@ namespace System.Windows.Forms
                                }
                        }
                        
-                       if (grid.ShowEditRow && grid.FirstVisibleRow + grid.VisibleRowCount == grid.RowsCount + 1) {
+                       if (grid.ShowEditRow && grid.RowsCount > 0 && grid.FirstVisibleRow + grid.VisibleRowCount == grid.RowsCount + 1) {
                                rect_row.Y = cells.Y + ((rowcnt - grid.FirstVisibleRow) * grid.RowHeight);
                                if (clip.IntersectsWith (rect_row)) {
                                        DataGridPaintRow (g, rowcnt, rect_row, true, grid);
                                }
-                       }
-                       
+                       }                       
+
                        not_usedarea.Height = cells.Y + cells.Height - rect_row.Y - rect_row.Height;
                        not_usedarea.Y = rect_row.Y + rect_row.Height;
                        not_usedarea.Width = rect_row.Width = cells.Width;
-                       not_usedarea.X = cells.X;                       
-
-                       g.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (grid.BackgroundColor),
-                               not_usedarea);                  
+                       not_usedarea.X = cells.X;
+                       
+                       g.FillRectangle (ResPool.GetSolidBrush (grid.BackgroundColor), not_usedarea);
                }
                
                public override void DataGridPaintRow (Graphics g, int row, Rectangle row_rect, bool is_newrow, DataGrid grid)
@@ -1180,13 +1168,13 @@ namespace System.Windows.Forms
 
                                if (is_newrow) {
                                        grid.CurrentTableStyle.GridColumnStyles[column].PaintNewRow (g, rect_cell, 
-                                               ThemeEngine.Current.ResPool.GetSolidBrush (backcolor),
-                                               ThemeEngine.Current.ResPool.GetSolidBrush (forecolor));                                         
+                                               ResPool.GetSolidBrush (backcolor),
+                                               ResPool.GetSolidBrush (forecolor));                                             
                                        
                                } else {
                                        grid.CurrentTableStyle.GridColumnStyles[column].Paint (g, rect_cell, grid.ListManager, row,
-                                               ThemeEngine.Current.ResPool.GetSolidBrush (backcolor),
-                                               ThemeEngine.Current.ResPool.GetSolidBrush (forecolor),
+                                               ResPool.GetSolidBrush (backcolor),
+                                               ResPool.GetSolidBrush (forecolor),
                                                grid.RightToLeft == RightToLeft.Yes);
                                }
 
@@ -1200,7 +1188,7 @@ namespace System.Windows.Forms
                                not_usedarea.Width = row_rect.X + row_rect.Width - rect_cell.X - rect_cell.Width;
                                not_usedarea.Y = row_rect.Y;
                                not_usedarea.Height = row_rect.Height;
-                               g.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (grid.BackgroundColor),
+                               g.FillRectangle (ResPool.GetSolidBrush (grid.BackgroundColor),
                                        not_usedarea);
                        }
                }
@@ -1214,7 +1202,7 @@ namespace System.Windows.Forms
                        if (!dtp.ShowUpDown && clip_rectangle.IntersectsWith (dtp.ClientRectangle)) {
                                // draw the outer border
                                Rectangle button_bounds = dtp.ClientRectangle;
-                               this.CPDrawBorder3D (dc, button_bounds, Border3DStyle.Sunken, Border3DSide.All, dtp.BackColor);
+                               this.CPDrawBorder3D (dc, button_bounds, Border3DStyle.Sunken, Border3DSide.Left | Border3DSide.Right | Border3DSide.Top | Border3DSide.Bottom, dtp.BackColor);
                                
                                // deflate by the border width
                                if (clip_rectangle.IntersectsWith (dtp.drop_down_arrow_rect)) {
@@ -1230,11 +1218,11 @@ namespace System.Windows.Forms
                        // render the date part
                        if (clip_rectangle.IntersectsWith (dtp.date_area_rect)) {
                                // fill the background
-                               dc.FillRectangle (ResPool.GetSolidBrush (ThemeEngine.Current.ColorWindow), dtp.date_area_rect);
+                               dc.FillRectangle (ResPool.GetSolidBrush (ColorWindow), dtp.date_area_rect);
                                
                                // fill the currently highlighted area
                                if (dtp.hilight_date_area != Rectangle.Empty) {
-                                       dc.FillRectangle (ResPool.GetSolidBrush (ThemeEngine.Current.ColorHighlight), dtp.hilight_date_area);
+                                       dc.FillRectangle (ResPool.GetSolidBrush (ColorHighlight), dtp.hilight_date_area);
                                }
                                
                                // draw the text part
@@ -1365,7 +1353,7 @@ namespace System.Windows.Forms
                                else
                                        dc.DrawString (label.pieces[i].text, label.GetPieceFont (label.pieces[i]), ResPool.GetSolidBrush (color),
                                                label.pieces[i].rect.X, label.pieces[i].rect.Y);
-                                               
+
                                if (label.pieces[i].focused) {                                  
                                        CPDrawFocusRectangle (dc, label.pieces[i].rect, label.ForeColor, label.BackColor);
                                }
@@ -1399,23 +1387,23 @@ namespace System.Windows.Forms
                        StringFormat string_format = ctrl.GetFormatString ();
                        
                        if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) {
-                               back_color = ThemeEngine.Current.ColorHighlight;
-                               fore_color = ThemeEngine.Current.ColorHighlightText;
+                               back_color = ColorHighlight;
+                               fore_color = ColorHighlightText;
                        }
                        else {
                                back_color = e.BackColor;
                                fore_color = e.ForeColor;
                        }
                        
-                       e.Graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush
+                       e.Graphics.FillRectangle (ResPool.GetSolidBrush
                                (back_color), e.Bounds);
 
                        e.Graphics.DrawString (ctrl.GetItemText (ctrl.Items[e.Index]), e.Font,
-                               ThemeEngine.Current.ResPool.GetSolidBrush (fore_color),
+                               ResPool.GetSolidBrush (fore_color),
                                e.Bounds.X, e.Bounds.Y, string_format);
                                        
                        if ((e.State & DrawItemState.Focus) == DrawItemState.Focus) {
-                               ThemeEngine.Current.CPDrawFocusRectangle (e.Graphics, e.Bounds,
+                               CPDrawFocusRectangle (e.Graphics, e.Bounds,
                                        fore_color, back_color);
                        }
                }
@@ -1424,31 +1412,16 @@ namespace System.Windows.Forms
 
                #region ListView
                // Drawing
-               public override void DrawListView (Graphics dc, Rectangle clip, ListView control)
+               public override void DrawListViewItems (Graphics dc, Rectangle clip, ListView control)
                {
-                       bool details = (control.View == View.Details);
-                       Rectangle client_area_nohdrs;                   
-                       DrawListViewHeader (dc, clip, control);
-                       
-                       if (details && control.Columns.Count > 0) {
-                               client_area_nohdrs = control.client_area;
-                               client_area_nohdrs.Y += control.Columns[0].Ht;
-                               client_area_nohdrs.Height -= control.Columns[0].Ht;
-                               dc.SetClip (client_area_nohdrs);                                
-                       } else
-                               dc.SetClip (control.client_area);
-                       
+                       bool details = control.View == View.Details;
+
                        dc.FillRectangle (ResPool.GetSolidBrush (control.BackColor), clip);                                             
-                                               
-                       // In case of details view draw the items only if
-                       // columns are non-zero                 
-                       if (!details || control.Columns.Count > 0) {
-                               int first = control.FirstVisibleIndex;  
-                               
-                               for (int i = first; i <= control.LastItemIndex; i ++) {                                 
-                                       if (clip.IntersectsWith (control.Items[i].GetBounds (ItemBoundsPortion.Entire)))
-                                               DrawListViewItem (dc, control, control.Items[i]);
-                               }                               
+                       int first = control.FirstVisibleIndex;  
+
+                       for (int i = first; i <= control.LastVisibleIndex; i ++) {                                      
+                               if (clip.IntersectsWith (control.Items[i].GetBounds (ItemBoundsPortion.Entire)))
+                                       DrawListViewItem (dc, control, control.Items [i]);
                        }       
                        
                        // draw the gridlines
@@ -1494,7 +1467,7 @@ namespace System.Windows.Forms
 
                }
                
-               private void DrawListViewHeader (Graphics dc, Rectangle clip, ListView control)
+               public override void DrawListViewHeader (Graphics dc, Rectangle clip, ListView control)
                {       
                        bool details = (control.View == View.Details);
                                
@@ -1503,48 +1476,61 @@ namespace System.Windows.Forms
                                dc.FillRectangle (ResPool.GetSolidBrush (control.BackColor),
                                                  0, 0, control.TotalWidth, control.Font.Height + 5);
                                if (control.Columns.Count > 0) {
-                                       if (control.HeaderStyle == ColumnHeaderStyle.Clickable) {
-                                               foreach (ColumnHeader col in control.Columns) {
-                                                       Rectangle rect = col.Rect;
-                                                       rect.X -= control.h_marker;
-                                                       this.CPDrawButton (dc, rect,
-                                                                          (col.Pressed ?
-                                                                           ButtonState.Pushed :
-                                                                           ButtonState.Normal));
-                                                       dc.DrawString (col.Text, ThemeEngine.Current.DefaultFont,
-                                                                      ResPool.GetSolidBrush
-                                                                      (this.ColorControlText),
-                                                                       rect.X + 3,
-                                                                       rect.Y + rect.Height/2 + 1,
-                                                                       col.Format);
-                                               }
-                                       }
-                                       // Non-clickable columns
-                                       else {
-                                               foreach (ColumnHeader col in control.Columns) {
-                                                       Rectangle rect = col.Rect;
-                                                       rect.X -= control.h_marker;
-                                                       this.CPDrawButton (dc, rect, ButtonState.Flat);
-                                                       dc.DrawString (col.Text, ThemeEngine.Current.DefaultFont,
-                                                                      ResPool.GetSolidBrush
-                                                                      (this.ColorControlText),
-                                                                       rect.X + 3,
-                                                                       rect.Y + rect.Height/2 + 1,
-                                                                       col.Format);
-                                               }
+                                       foreach (ColumnHeader col in control.Columns) {
+                                               Rectangle rect = col.Rect;
+                                               rect.X -= control.h_marker;
+                                               ButtonState state;
+                                               if (control.HeaderStyle == ColumnHeaderStyle.Clickable)
+                                                       state = col.Pressed ? ButtonState.Pushed : ButtonState.Normal;
+                                               else
+                                                       state = ButtonState.Flat;
+                                               this.CPDrawButton (dc, rect, state);
+                                               rect.X += 3;
+                                               rect.Width -= 8;
+                                               if (rect.Width <= 0)
+                                                       continue;
+                                               dc.DrawString (col.Text, DefaultFont,
+                                                              ResPool.GetSolidBrush (ColorControlText),
+                                                              rect, col.Format);
                                        }
                                }
                        }
                }
 
+               public override void DrawListViewHeaderDragDetails (Graphics dc, ListView view, ColumnHeader col, int target_x)
+               {
+                       Rectangle rect = col.Rect;
+                       rect.X -= view.h_marker;
+                       Color color = Color.FromArgb (0x7f, ColorControlDark.R, ColorControlDark.G, ColorControlDark.B);
+                       dc.FillRectangle (ResPool.GetSolidBrush (color), rect);
+                       rect.X += 3;
+                       rect.Width -= 8;
+                       if (rect.Width <= 0)
+                               return;
+                       color = Color.FromArgb (0x7f, ColorControlText.R, ColorControlText.G, ColorControlText.B);
+                       dc.DrawString (col.Text, DefaultFont, ResPool.GetSolidBrush (color), rect, col.Format);
+                       Pen pen = new Pen (ColorHighlight, 2);
+                       dc.DrawLine (pen, target_x, 0, target_x, col.Rect.Height);
+               }
+
                // draws the ListViewItem of the given index
-               private void DrawListViewItem (Graphics dc, ListView control, ListViewItem item)
+               protected virtual void DrawListViewItem (Graphics dc, ListView control, ListViewItem item)
                {                               
+                       int col_offset;
+                       if (control.View == View.Details && control.Columns.Count > 0)
+                               col_offset = control.Columns [0].Rect.X;
+                       else
+                               col_offset = 0;
+                       
                        Rectangle rect_checkrect = item.CheckRectReal;
+                       rect_checkrect.X += col_offset;
                        Rectangle rect_iconrect = item.GetBounds (ItemBoundsPortion.Icon);
+                       rect_iconrect.X += col_offset;
                        Rectangle full_rect = item.GetBounds (ItemBoundsPortion.Entire);
+                       full_rect.X += col_offset;
                        Rectangle text_rect = item.GetBounds (ItemBoundsPortion.Label);                 
-                       
+                       text_rect.X += col_offset;
+
                        if (control.CheckBoxes) {
                                if (control.StateImageList == null) {
                                        // Make sure we've got at least a line width of 1
@@ -1610,7 +1596,10 @@ namespace System.Windows.Forms
                        // draw the item text                   
                        // format for the item text
                        StringFormat format = new StringFormat ();
-                       format.LineAlignment = StringAlignment.Center;
+                       if (control.View == View.SmallIcon)
+                               format.LineAlignment = StringAlignment.Near;
+                       else
+                               format.LineAlignment = StringAlignment.Center;
                        if (control.View == View.LargeIcon)
                                format.Alignment = StringAlignment.Center;
                        else
@@ -1623,7 +1612,7 @@ namespace System.Windows.Forms
                                if (control.View == View.Details) {
                                        if (control.FullRowSelect) {
                                                // fill the entire rect excluding the checkbox                                          
-                                               full_rect.Location = item.LabelRect.Location;
+                                               full_rect.Location = item.GetBounds (ItemBoundsPortion.Label).Location;
                                                dc.FillRectangle (this.ResPool.GetSolidBrush
                                                                  (this.ColorHighlight), full_rect);
                                        }
@@ -1670,14 +1659,14 @@ namespace System.Windows.Forms
 
                                        // set the format for subitems
                                        format.FormatFlags = StringFormatFlags.NoWrap;
-                                       format.Alignment = StringAlignment.Near;
 
                                        // 0th subitem is the item already drawn
                                        for (int index = 1; index < count; index++) {
                                                subItem = subItems [index];
                                                col = control.Columns [index];
-                                               sub_item_rect.X = col.Rect.Left;
-                                               sub_item_rect.Width = col.Wd;
+                                               format.Alignment = col.Format.Alignment;
+                                               sub_item_rect.X = col.Rect.Left + 3;
+                                               sub_item_rect.Width = col.Wd - 6;
                                                sub_item_rect.X -= control.h_marker;
 
                                                SolidBrush sub_item_back_br = null;
@@ -1766,8 +1755,11 @@ namespace System.Windows.Forms
                        item.X = x;
                        item.Y = y;
 
-                       if (item.Visible == false)
+                       if (item.Visible == false) {
+                               item.Width = 0;
+                               item.Height = 0;
                                return;
+                       }
 
                        if (item.Separator == true) {
                                item.Height = SEPARATOR_HEIGHT / 2;
@@ -1783,25 +1775,25 @@ namespace System.Windows.Forms
                                return;
                        } else {                
                                SizeF size;
-                               size =  dc.MeasureString (item.Text, ThemeEngine.Current.MenuFont);
+                               size =  dc.MeasureString (item.Text, MenuFont);
                                item.Width = (int) size.Width;
                                item.Height = (int) size.Height;
        
                                if (!menuBar) {
                                        if (item.Shortcut != Shortcut.None && item.ShowShortcut) {
-                                               item.XTab = ThemeEngine.Current.MenuCheckSize.Width + MENU_TAB_SPACE + (int) size.Width;
-                                               size =  dc.MeasureString (" " + item.GetShortCutText (), ThemeEngine.Current.MenuFont);
+                                               item.XTab = MenuCheckSize.Width + MENU_TAB_SPACE + (int) size.Width;
+                                               size =  dc.MeasureString (" " + item.GetShortCutText (), MenuFont);
                                                item.Width += MENU_TAB_SPACE + (int) size.Width;
                                        }
        
-                                       item.Width += 4 + (ThemeEngine.Current.MenuCheckSize.Width * 2);
+                                       item.Width += 4 + (MenuCheckSize.Width * 2);
                                } else {
                                        item.Width += MENU_BAR_ITEMS_SPACE;
                                        x += item.Width;
                                }
        
-                               if (item.Height < ThemeEngine.Current.MenuHeight)
-                                       item.Height = ThemeEngine.Current.MenuHeight;
+                               if (item.Height < MenuHeight)
+                                       item.Height = MenuHeight;
                        }
                }
                
@@ -1882,7 +1874,7 @@ namespace System.Windows.Forms
                public override void DrawMenuBar (Graphics dc, Menu menu, Rectangle rect)
                {
                        if (menu.Height == 0)
-                               ThemeEngine.Current.CalcMenuBarSize (dc, menu, rect.Width);
+                               CalcMenuBarSize (dc, menu, rect.Width);
                                
                        bool keynav = (menu as MainMenu).tracker.Navigating;
                        HotkeyPrefix hp = always_draw_hotkeys || keynav ? HotkeyPrefix.Show : HotkeyPrefix.Hide;
@@ -1890,7 +1882,7 @@ namespace System.Windows.Forms
                        string_format_menu_text.HotkeyPrefix = hp;
 
                        rect.Height = menu.Height;
-                       dc.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (menu.Wnd.BackColor), rect);
+                       dc.FillRectangle (ResPool.GetSolidBrush(ColorMenu), rect);
                                                
                        for (int i = 0; i < menu.MenuItems.Count; i++) {
                                MenuItem item = menu.MenuItems [i];
@@ -1898,7 +1890,7 @@ namespace System.Windows.Forms
                                item_rect.X += rect.X;
                                item_rect.Y += rect.Y;
                                item.MenuHeight = menu.Height;
-                               item.PerformDrawItem (new DrawItemEventArgs (dc, ThemeEngine.Current.MenuFont, item_rect, i, item.Status));                     
+                               item.PerformDrawItem (new DrawItemEventArgs (dc, MenuFont, item_rect, i, item.Status));                 
                        }                               
                }               
                
@@ -1916,17 +1908,17 @@ namespace System.Windows.Forms
                                string_format = string_format_menu_text;
 
                        if (item.Separator == true) {
-                               e.Graphics.DrawLine (ThemeEngine.Current.ResPool.GetPen (ThemeEngine.Current.ColorControlDark),
+                               e.Graphics.DrawLine (ResPool.GetPen (ColorControlDark),
                                        e.Bounds.X, e.Bounds.Y, e.Bounds.X + e.Bounds.Width, e.Bounds.Y);
 
-                               e.Graphics.DrawLine (ThemeEngine.Current.ResPool.GetPen (ThemeEngine.Current.ColorControlLight),
+                               e.Graphics.DrawLine (ResPool.GetPen (ColorControlLight),
                                        e.Bounds.X, e.Bounds.Y + 1, e.Bounds.X + e.Bounds.Width, e.Bounds.Y + 1);
 
                                return;
                        }
 
                        if (!item.MenuBar)
-                               rect_text.X += ThemeEngine.Current.MenuCheckSize.Width;
+                               rect_text.X += MenuCheckSize.Width;
 
                        if (item.BarBreak) { /* Draw vertical break bar*/
                                Rectangle rect = e.Bounds;
@@ -1934,10 +1926,10 @@ namespace System.Windows.Forms
                                rect.Width = 3;
                                rect.Height = item.MenuHeight - 6;
 
-                               e.Graphics.DrawLine (ThemeEngine.Current.ResPool.GetPen (ThemeEngine.Current.ColorControlDark),
+                               e.Graphics.DrawLine (ResPool.GetPen (ColorControlDark),
                                        rect.X, rect.Y , rect.X, rect.Y + rect.Height);
 
-                               e.Graphics.DrawLine (ThemeEngine.Current.ResPool.GetPen (ThemeEngine.Current.ColorControlLight),
+                               e.Graphics.DrawLine (ResPool.GetPen (ColorControlLight),
                                        rect.X + 1, rect.Y , rect.X +1, rect.Y + rect.Height);
                        }                       
                        
@@ -1945,22 +1937,22 @@ namespace System.Windows.Forms
                        Color color_back;
                        
                        if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) {
-                               color_text = ThemeEngine.Current.ColorHighlightText;
-                               color_back = ThemeEngine.Current.ColorHighlight;
+                               color_text = ColorHighlightText;
+                               color_back = ColorHighlight;
                        } else {
-                               color_text = ThemeEngine.Current.ColorMenuText;
-                               color_back = ThemeEngine.Current.ColorMenu;
+                               color_text = ColorMenuText;
+                               color_back = ColorMenu;
                        }
 
                        /* Draw background */
                        Rectangle rect_back = e.Bounds;
                        rect_back.X++;
                        rect_back.Width -=2;
-                       e.Graphics.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (color_back), rect_back);
+                       e.Graphics.FillRectangle (ResPool.GetSolidBrush (color_back), rect_back);
                        
                        if (item.Enabled) {
                                e.Graphics.DrawString (item.Text, e.Font,
-                                       ThemeEngine.Current.ResPool.GetSolidBrush (color_text),
+                                       ResPool.GetSolidBrush (color_text),
                                        rect_text, string_format);
 
                                if (!item.MenuBar && item.Shortcut != Shortcut.None && item.ShowShortcut) {
@@ -1969,7 +1961,7 @@ namespace System.Windows.Forms
                                        rect.X = item.XTab;
                                        rect.Width -= item.XTab;
 
-                                       e.Graphics.DrawString (str, e.Font, ThemeEngine.Current.ResPool.GetSolidBrush (color_text),
+                                       e.Graphics.DrawString (str, e.Font, ResPool.GetSolidBrush (color_text),
                                                rect, string_format_menu_shortcut);
                                }
                        } else {
@@ -1980,8 +1972,8 @@ namespace System.Windows.Forms
                        /* Draw arrow */
                        if (item.MenuBar == false && item.IsPopup || item.MdiList) {
 
-                               int cx = ThemeEngine.Current.MenuCheckSize.Width;
-                               int cy = ThemeEngine.Current.MenuCheckSize.Height;
+                               int cx = MenuCheckSize.Width;
+                               int cy = MenuCheckSize.Height;
                                Bitmap  bmp = new Bitmap (cx, cy);
                                Graphics gr = Graphics.FromImage (bmp);
                                Rectangle rect_arrow = new Rectangle (0, 0, cx, cy);
@@ -2004,8 +1996,8 @@ namespace System.Windows.Forms
                        if (item.MenuBar == false && item.Checked) {
 
                                Rectangle area = e.Bounds;
-                               int cx = ThemeEngine.Current.MenuCheckSize.Width;
-                               int cy = ThemeEngine.Current.MenuCheckSize.Height;
+                               int cx = MenuCheckSize.Width;
+                               int cy = MenuCheckSize.Height;
                                Bitmap  bmp = new Bitmap (cx, cy);
                                Graphics gr = Graphics.FromImage (bmp);
                                Rectangle rect_arrow = new Rectangle (0, 0, cx, cy);
@@ -2026,33 +2018,33 @@ namespace System.Windows.Forms
                public override void DrawPopupMenu (Graphics dc, Menu menu, Rectangle cliparea, Rectangle rect)
                {
 
-                       dc.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush
-                               (ThemeEngine.Current.ColorMenu), cliparea);
+                       dc.FillRectangle (ResPool.GetSolidBrush
+                               (ColorMenu), cliparea);
 
                        /* Draw menu borders */
-                       dc.DrawLine (ThemeEngine.Current.ResPool.GetPen (ThemeEngine.Current.ColorHighlightText),
+                       dc.DrawLine (ResPool.GetPen (ColorHighlightText),
                                rect.X, rect.Y, rect.X + rect.Width, rect.Y);
 
-                       dc.DrawLine (ThemeEngine.Current.ResPool.GetPen (ThemeEngine.Current.ColorHighlightText),
+                       dc.DrawLine (ResPool.GetPen (ColorHighlightText),
                                rect.X, rect.Y, rect.X, rect.Y + rect.Height);
 
-                       dc.DrawLine (ThemeEngine.Current.ResPool.GetPen (ThemeEngine.Current.ColorControlDark),
+                       dc.DrawLine (ResPool.GetPen (ColorControlDark),
                                rect.X + rect.Width - 1 , rect.Y , rect.X + rect.Width - 1, rect.Y + rect.Height);
 
-                       dc.DrawLine (ThemeEngine.Current.ResPool.GetPen (ThemeEngine.Current.ColorControlDarkDark),
+                       dc.DrawLine (ResPool.GetPen (ColorControlDarkDark),
                                rect.X + rect.Width, rect.Y , rect.X + rect.Width, rect.Y + rect.Height);
 
-                       dc.DrawLine (ThemeEngine.Current.ResPool.GetPen (ThemeEngine.Current.ColorControlDark),
+                       dc.DrawLine (ResPool.GetPen (ColorControlDark),
                                rect.X , rect.Y + rect.Height - 1 , rect.X + rect.Width - 1, rect.Y + rect.Height -1);
 
-                       dc.DrawLine (ThemeEngine.Current.ResPool.GetPen (ThemeEngine.Current.ColorControlDarkDark),
+                       dc.DrawLine (ResPool.GetPen (ColorControlDarkDark),
                                rect.X , rect.Y + rect.Height, rect.X + rect.Width - 1, rect.Y + rect.Height);
 
                        for (int i = 0; i < menu.MenuItems.Count; i++)
                                if (cliparea.IntersectsWith (menu.MenuItems [i].bounds)) {
                                        MenuItem item = menu.MenuItems [i];
                                        item.MenuHeight = menu.Height;
-                                       item.PerformDrawItem (new DrawItemEventArgs (dc, ThemeEngine.Current.MenuFont,
+                                       item.PerformDrawItem (new DrawItemEventArgs (dc, MenuFont,
                                                item.bounds, i, item.Status));
                        }
                }
@@ -2430,7 +2422,7 @@ namespace System.Windows.Forms
                                dc.DrawRectangle (SystemPens.ControlDark, button_rect);
                        }
                        else {
-                               CPDrawBorder3D (dc, button_rect, Border3DStyle.Raised, Border3DSide.All);
+                               CPDrawBorder3D (dc, button_rect, Border3DStyle.Raised, Border3DSide.Left | Border3DSide.Right | Border3DSide.Top | Border3DSide.Bottom);
                        }
                        // draw the arrow
                        dc.FillPolygon (SystemBrushes.ControlText, arrow_path);                 
@@ -2615,7 +2607,7 @@ namespace System.Windows.Forms
                        increment = block_width + space_betweenblocks;
 
                        /* Draw border */
-                       CPDrawBorder3D (dc, ctrl.ClientRectangle, Border3DStyle.SunkenInner, Border3DSide.All & ~Border3DSide.Middle, ColorControl);
+                       CPDrawBorder3D (dc, ctrl.ClientRectangle, Border3DStyle.SunkenInner, Border3DSide.Left | Border3DSide.Right | Border3DSide.Top | Border3DSide.Bottom & ~Border3DSide.Middle, ColorControl);
                        
                        /* Draw Blocks */
                        block_rect = new Rectangle (client_area.X, client_area.Y, block_width, client_area.Height);
@@ -2829,8 +2821,6 @@ namespace System.Windows.Forms
                
                protected virtual void RadioButton_DrawText(RadioButton radio_button, Rectangle text_rectangle, Graphics dc, StringFormat text_format)
                {
-                       SolidBrush sb;
-                       
                        // offset the text if it's pressed and a button
                        if (radio_button.Appearance == Appearance.Button) {
                                if (radio_button.Checked || (radio_button.Capture && radio_button.FlatStyle != FlatStyle.Flat)) {
@@ -2842,11 +2832,14 @@ namespace System.Windows.Forms
                        } 
                        
                        /* Place the text; to be compatible with Windows place it after the radiobutton has been drawn */                       
-                       dc.DrawString (radio_button.Text, radio_button.Font, ThemeEngine.Current.ResPool.GetSolidBrush (radio_button.ForeColor), text_rectangle, text_format);
-                       
+
+                       // Windows seems to not wrap text in certain situations, this matches as close as I could get it
+                       if ((float)(radio_button.Font.Height * 1.5f) > text_rectangle.Height) {
+                               text_format.FormatFlags |= StringFormatFlags.NoWrap;
+                       }
+
                        if (radio_button.Enabled) {
-                               sb = ResPool.GetSolidBrush(radio_button.ForeColor);
-                               dc.DrawString(radio_button.Text, radio_button.Font, sb, text_rectangle, text_format);
+                               dc.DrawString (radio_button.Text, radio_button.Font, ResPool.GetSolidBrush (radio_button.ForeColor), text_rectangle, text_format);
                        } else if (radio_button.FlatStyle == FlatStyle.Flat) {
                                dc.DrawString(radio_button.Text, radio_button.Font, ResPool.GetSolidBrush (ControlPaint.DarkDark (this.ColorControl)), text_rectangle, text_format);
                        } else {
@@ -3178,7 +3171,7 @@ namespace System.Windows.Forms
                                Border3DStyle border_style = Border3DStyle.SunkenInner;
                                if (panel.BorderStyle == StatusBarPanelBorderStyle.Raised)
                                        border_style = Border3DStyle.RaisedOuter;
-                               CPDrawBorder3D(dc, area, border_style, Border3DSide.All, ColorControl);
+                               CPDrawBorder3D(dc, area, border_style, Border3DSide.Left | Border3DSide.Right | Border3DSide.Top | Border3DSide.Bottom, panel.Parent.BackColor);
                        }
 
                        if (panel.Style == StatusBarPanelStyle.OwnerDraw) {
@@ -3403,9 +3396,9 @@ namespace System.Windows.Forms
                                }
 
                                if (is_selected) {
-                                       CPDrawBorder3D (dc, bounds, Border3DStyle.Sunken, Border3DSide.All);
+                                       CPDrawBorder3D (dc, bounds, Border3DStyle.Sunken, Border3DSide.Left | Border3DSide.Right | Border3DSide.Top | Border3DSide.Bottom);
                                } else if (tab.Appearance != TabAppearance.FlatButtons) {
-                                       CPDrawBorder3D (dc, bounds, Border3DStyle.Raised, Border3DSide.All);
+                                       CPDrawBorder3D (dc, bounds, Border3DStyle.Raised, Border3DSide.Left | Border3DSide.Right | Border3DSide.Top | Border3DSide.Bottom);
                                }
 
                                interior = new Rectangle (bounds.Left + 2, bounds.Top + 2, bounds.Width - 4, bounds.Height - 4);
@@ -3507,33 +3500,33 @@ namespace System.Windows.Forms
 
                                        break;
                                }
+                       }
 
-                               if (tab.DrawMode == TabDrawMode.Normal && page.Text != null) {
-                                       if (tab.Alignment == TabAlignment.Left) {
-                                               int wo = interior.Width / 2;
-                                               int ho = interior.Height / 2;
-                                               dc.TranslateTransform (interior.X + wo, interior.Y + ho);
-                                               dc.RotateTransform (180);
-                                               dc.DrawString (page.Text, page.Font, ThemeEngine.Current.ResPool.GetSolidBrush (SystemColors.ControlText), 0, 0, string_format);
-                                               dc.ResetTransform ();
-                                       } else {
-                                               dc.DrawString (page.Text, page.Font,
-                                                               ThemeEngine.Current.ResPool.GetSolidBrush (SystemColors.ControlText),
-                                                               interior, string_format);
-                                       }
-                               } else if (page.Text != null) {
-                                       DrawItemState state = DrawItemState.None;
-                                       if (page == tab.SelectedTab)
-                                               state |= DrawItemState.Selected;
-                                       DrawItemEventArgs e = new DrawItemEventArgs (dc,
-                                                       tab.Font, bounds, tab.IndexForTabPage (page),
-                                                       state, page.ForeColor, page.BackColor);
-                                       tab.OnDrawItemInternal (e);
-                                       return res;
-                               }
+                       if (tab.DrawMode == TabDrawMode.Normal && page.Text != null) {
+                               if (tab.Alignment == TabAlignment.Left) {
+                                       int wo = interior.Width / 2;
+                                       int ho = interior.Height / 2;
+                                       dc.TranslateTransform (interior.X + wo, interior.Y + ho);
+                                       dc.RotateTransform (180);
+                                       dc.DrawString (page.Text, page.Font, ResPool.GetSolidBrush (SystemColors.ControlText), 0, 0, string_format);
+                                       dc.ResetTransform ();
+                               } else {
+                                       dc.DrawString (page.Text, page.Font,
+                                                       ResPool.GetSolidBrush (SystemColors.ControlText),
+                                                       interior, string_format);
+                               }
+                       } else if (page.Text != null) {
+                               DrawItemState state = DrawItemState.None;
+                               if (page == tab.SelectedTab)
+                                       state |= DrawItemState.Selected;
+                               DrawItemEventArgs e = new DrawItemEventArgs (dc,
+                                               tab.Font, bounds, tab.IndexForTabPage (page),
+                                               state, page.ForeColor, page.BackColor);
+                               tab.OnDrawItemInternal (e);
+                               return res;
                        }
 
-                       if (page.Focused) {
+                       if (page.parent.Focused && is_selected) {
                                CPDrawFocusRectangle (dc, interior, tab.ForeColor, tab.BackColor);
                        }
 
@@ -3613,7 +3606,7 @@ namespace System.Windows.Forms
                                        /* Draw the button frame, only if it is not a separator */
                                        if (flat) { 
                                                if (button.Pushed || button.Pressed) {
-                                                       CPDrawBorder3D (dc, buttonArea, Border3DStyle.SunkenOuter, Border3DSide.All, ColorControl);
+                                                       CPDrawBorder3D (dc, buttonArea, Border3DStyle.SunkenOuter, Border3DSide.Left | Border3DSide.Right | Border3DSide.Top | Border3DSide.Bottom, ColorControl);
                                                } else if (button.Hilight) {
                                                        dc.DrawRectangle (ResPool.GetPen (ColorControlText), buttonArea);
                                                        if (! ddRect.IsEmpty) {
@@ -3626,7 +3619,7 @@ namespace System.Windows.Forms
                                        else { // normal toolbar
                                                if (button.Pushed || button.Pressed) {
                                                        CPDrawBorder3D (dc, buttonArea, Border3DStyle.SunkenInner,
-                                                               Border3DSide.All, ColorControl);
+                                                               Border3DSide.Left | Border3DSide.Right | Border3DSide.Top | Border3DSide.Bottom, ColorControl);
                                                        if (! ddRect.IsEmpty) {
                                                                CPDrawBorder3D (dc, ddRect, Border3DStyle.SunkenInner,
                                                                        Border3DSide.Left, ColorControl);
@@ -3635,7 +3628,7 @@ namespace System.Windows.Forms
                                                }
                                                else {
                                                        CPDrawBorder3D (dc, buttonArea, Border3DStyle.RaisedInner,
-                                                               Border3DSide.All, ColorControl);
+                                                               Border3DSide.Left | Border3DSide.Right | Border3DSide.Top | Border3DSide.Bottom, ColorControl);
                                                        if (! ddRect.IsEmpty) {
                                                                CPDrawBorder3D (dc, ddRect, Border3DStyle.RaisedInner,
                                                                        Border3DSide.Left, ColorControl);
@@ -3688,7 +3681,7 @@ namespace System.Windows.Forms
                                                        button.Parent.ImageList.Draw (dc, imgRect.X, imgRect.Y, imgRect.Width, 
                                                                imgRect.Height, button.ImageIndex);
                                                else {
-                                                       dc.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (ColorGrayText), imgRect);
+                                                       dc.FillRectangle (ResPool.GetSolidBrush (ColorGrayText), imgRect);
                                                        ControlPaint.DrawBorder3D (dc, imgRect, Border3DStyle.SunkenOuter,
                                                                Border3DSide.Right | Border3DSide.Bottom);
                                                }
@@ -3706,7 +3699,7 @@ namespace System.Windows.Forms
                                                        button.Parent.ImageList.Draw (dc, imgRect.X, imgRect.Y, imgRect.Width,
                                                                imgRect.Height, button.ImageIndex);
                                                else {
-                                                       dc.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (ColorGrayText), imgRect);
+                                                       dc.FillRectangle (ResPool.GetSolidBrush (ColorGrayText), imgRect);
                                                        ControlPaint.DrawBorder3D (dc, imgRect, Border3DStyle.SunkenOuter,
                                                                Border3DSide.Right | Border3DSide.Bottom);
                                                }
@@ -3725,7 +3718,7 @@ namespace System.Windows.Forms
                                                        button.Parent.ImageList.Draw (dc, imgRect.X, imgRect.Y, imgRect.Width,
                                                                imgRect.Height, button.ImageIndex);
                                                else {
-                                                       dc.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (ColorGrayText), imgRect);
+                                                       dc.FillRectangle (ResPool.GetSolidBrush (ColorGrayText), imgRect);
                                                        CPDrawBorder3D (dc, imgRect, Border3DStyle.SunkenOuter,
                                                                Border3DSide.Right | Border3DSide.Bottom, ColorControl);
                                                }
@@ -3744,7 +3737,7 @@ namespace System.Windows.Forms
                                                        button.Parent.ImageList.Draw (dc, imgRect.X, imgRect.Y, imgRect.Width,
                                                                imgRect.Height, button.ImageIndex);
                                                else {
-                                                       dc.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (ColorGrayText), imgRect);
+                                                       dc.FillRectangle (ResPool.GetSolidBrush (ColorGrayText), imgRect);
                                                        CPDrawBorder3D (dc, imgRect, Border3DStyle.SunkenOuter,
                                                                Border3DSide.Right | Border3DSide.Bottom, ColorControl);
                                                }
@@ -3778,7 +3771,7 @@ namespace System.Windows.Forms
                                                button.Parent.ImageList.Draw (dc, imgRect.X, imgRect.Y, imgRect.Width, imgRect.Height,
                                                        button.ImageIndex);
                                        else {
-                                               dc.FillRectangle (ThemeEngine.Current.ResPool.GetSolidBrush (ColorGrayText), imgRect);
+                                               dc.FillRectangle (ResPool.GetSolidBrush (ColorGrayText), imgRect);
                                                CPDrawBorder3D (dc, imgRect, Border3DStyle.SunkenOuter,
                                                        Border3DSide.Right | Border3DSide.Bottom, ColorControl);
                                        }
@@ -3856,6 +3849,7 @@ namespace System.Windows.Forms
                        float pixels_betweenticks;
                        const int space_from_right = 8;
                        const int space_from_left = 8;
+                       const int space_from_bottom = 11;
                        Rectangle area = tb.ClientRectangle;
                        
                        switch (tb.TickStyle)   {
@@ -3904,19 +3898,19 @@ namespace System.Windows.Forms
                        
                        /* Convert thumb position from mouse position to value*/
                        if (mouse_value) {
-                               
-                               if (value_pos >= channel_startpoint.Y)
-                                       value_pos = (int)(((float) (value_pos - channel_startpoint.Y)) / pixels_betweenticks);
+                               if (value_pos < thumb_area.Bottom)
+                                       value_pos = (int) ((thumb_area.Bottom - value_pos) / pixels_betweenticks);
                                else
                                        value_pos = 0;                  
 
                                if (value_pos + tb.Minimum > tb.Maximum)
                                        value_pos = tb.Maximum - tb.Minimum;
-                                
+
                                tb.Value = value_pos + tb.Minimum;
                        }                       
-                       
-                       thumb_pos.Y = channel_startpoint.Y + (int) (pixels_betweenticks * (float) value_pos);
+
+                       // thumb_pos.Y = channel_startpoint.Y ; // + (int) (pixels_betweenticks * (float) value_pos);
+                       thumb_pos.Y = thumb_area.Bottom - space_from_bottom - (int) (pixels_betweenticks * (float) value_pos);
                        
                        /* Draw thumb fixed 10x22 size */
                        thumb_pos.Width = 10;
@@ -4753,7 +4747,7 @@ namespace System.Windows.Forms
                        } else {
                                pen=new Pen(Color.White, 1);
                                if (enabled==true) {
-                                       sb=ThemeEngine.Current.ResPool.GetSolidBrush (Color.Black);
+                                       sb=ResPool.GetSolidBrush (Color.Black);
                                } else {
                                        sb=ResPool.GetSolidBrush (ColorControl);
                                }
@@ -4974,8 +4968,6 @@ namespace System.Windows.Forms
 
                /* Scroll button: regular button + direction arrow */
                public override void CPDrawScrollButton (Graphics dc, Rectangle area, ScrollButton type, ButtonState state) {
-                       bool enabled = (state == ButtonState.Inactive) ? false: true;                   
-                                       
                        DrawScrollButtonPrimitive (dc, area, state);
 
                        // A lot of the following is adapted from the rewind project
@@ -5075,10 +5067,7 @@ namespace System.Windows.Forms
                public  override void CPDrawStringDisabled (Graphics graphics, string s, Font font, Color color, RectangleF layoutRectangle,
                        StringFormat format) {                  
 
-                       layoutRectangle.Offset(1.0f, 1.0f);
-                       graphics.DrawString(s, font, ResPool.GetSolidBrush (ControlPaint.Light(color, 95)), layoutRectangle, format);                   
-                       layoutRectangle.Offset(-1.0f, -1.0f);
-                       graphics.DrawString(s, font, ResPool.GetSolidBrush (ControlPaint.Light(color, 50)), layoutRectangle, format);
+                       graphics.DrawString(s, font, ResPool.GetSolidBrush (ColorGrayText), layoutRectangle, format);
                        
                }
 
@@ -5275,7 +5264,7 @@ namespace System.Windows.Forms
                        still look like MS's scaled caption buttons. (as opposed to scaling a bitmap)
                */
 
-               private static void DrawCaptionHelper(Graphics graphics, Color color, Pen pen, int lineWidth, int shift, Rectangle captionRect, CaptionButton button) {
+               private void DrawCaptionHelper(Graphics graphics, Color color, Pen pen, int lineWidth, int shift, Rectangle captionRect, CaptionButton button) {
                        switch(button) {
                        case CaptionButton.Close: {
                                pen.StartCap=LineCap.Triangle;
@@ -5298,7 +5287,7 @@ namespace System.Windows.Forms
                                sf.LineAlignment=StringAlignment.Center;
 
 
-                               graphics.DrawString("?", font, ThemeEngine.Current.ResPool.GetSolidBrush (color), captionRect.X+captionRect.Width/2+shift, captionRect.Y+captionRect.Height/2+shift+lineWidth/2, sf);
+                               graphics.DrawString("?", font, ResPool.GetSolidBrush (color), captionRect.X+captionRect.Width/2+shift, captionRect.Y+captionRect.Height/2+shift+lineWidth/2, sf);
 
                                sf.Dispose();                           
                                font.Dispose();