| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- // Permission is hereby granted, free of charge, to any person obtaining
- // a copy of this software and associated documentation files (the
- // "Software"), to deal in the Software without restriction, including
- // without limitation the rights to use, copy, modify, merge, publish,
- // distribute, sublicense, and/or sell copies of the Software, and to
- // permit persons to whom the Software is furnished to do so, subject to
- // the following conditions:
- //
- // The above copyright notice and this permission notice shall be
- // included in all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- // 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) 2008 George Giolfan
- //
- // Authors:
- // George Giolfan ([email protected])
- using System.Drawing;
- using System.Windows.Forms.VisualStyles;
- namespace System.Windows.Forms.Theming.VisualStyles
- {
- class TabControlPainter : Default.TabControlPainter
- {
- static bool ShouldPaint (TabControl tabControl) {
- return ThemeVisualStyles.RenderClientAreas &&
- tabControl.Alignment == TabAlignment.Top &&
- tabControl.DrawMode == TabDrawMode.Normal;
- }
- protected override void DrawBackground (Graphics dc, Rectangle area, TabControl tab)
- {
- if (!ShouldPaint (tab)) {
- base.DrawBackground (dc, area, tab);
- return;
- }
- VisualStyleElement element = VisualStyleElement.Tab.Pane.Normal;
- if (!VisualStyleRenderer.IsElementDefined (element)) {
- base.DrawBackground (dc, area, tab);
- return;
- }
- Rectangle panel_rectangle = GetTabPanelRect (tab);
- if (panel_rectangle.IntersectsWith (area))
- new VisualStyleRenderer (element).DrawBackground (dc, panel_rectangle, area);
- }
- protected override int DrawTab (Graphics dc, TabPage page, TabControl tab, Rectangle bounds, bool is_selected)
- {
- if (!ShouldPaint (tab))
- return base.DrawTab (dc, page, tab, bounds, is_selected);
- VisualStyleElement element = GetVisualStyleElement (tab, page, is_selected);
- if (!VisualStyleRenderer.IsElementDefined (element))
- return base.DrawTab (dc, page, tab, bounds, is_selected);
- new VisualStyleRenderer (element).DrawBackground (dc, bounds);
- bounds.Inflate (
- -(tab.Padding.X),
- -(tab.Padding.Y));
- Rectangle text_area = bounds;
- if (tab.ImageList != null && page.ImageIndex >= 0 && page.ImageIndex < tab.ImageList.Images.Count) {
- int image_y = bounds.Y + (bounds.Height - tab.ImageList.ImageSize.Height) / 2;
- tab.ImageList.Draw (dc, new Point (bounds.X, image_y), page.ImageIndex);
- int image_occupied_space = tab.ImageList.ImageSize.Width + 2;
- text_area.X += image_occupied_space;
- text_area.Width -= image_occupied_space;
- }
- if (page.Text != null)
- dc.DrawString (page.Text, tab.Font, SystemBrushes.ControlText, text_area, DefaultFormatting);
- if (tab.Focused && is_selected && tab.ShowFocusCues)
- ControlPaint.DrawFocusRectangle (dc, bounds);
- return 0;
- }
- static VisualStyleElement GetVisualStyleElement (TabControl tabControl, TabPage tabPage, bool selected)
- {
- bool top_edge = tabPage.Row == tabControl.RowCount;
- int tab_page_index = tabControl.TabPages.IndexOf (tabPage);
- bool left_edge = true;
- int index;
- for (index = tabControl.SliderPos; index < tab_page_index; index++)
- if (tabControl.TabPages [index].Row == tabPage.Row) {
- left_edge = false;
- break;
- }
- bool right_edge = true;
- for (index = tab_page_index; index < tabControl.TabCount; index++)
- if (tabControl.TabPages [index].Row == tabPage.Row) {
- right_edge = false;
- break;
- }
- if (!tabPage.Enabled)
- #region Disabled
- if (top_edge)
- if (left_edge)
- if (right_edge)
- return VisualStyleElement.Tab.TopTabItem.Disabled;
- else
- return VisualStyleElement.Tab.TopTabItemLeftEdge.Disabled;
- else
- if (right_edge)
- return VisualStyleElement.Tab.TopTabItemRightEdge.Disabled;
- else
- return VisualStyleElement.Tab.TopTabItem.Disabled;
- else
- if (left_edge)
- if (right_edge)
- return VisualStyleElement.Tab.TabItem.Disabled;
- else
- return VisualStyleElement.Tab.TabItemLeftEdge.Disabled;
- else
- if (right_edge)
- return VisualStyleElement.Tab.TabItemRightEdge.Disabled;
- else
- return VisualStyleElement.Tab.TabItem.Disabled;
- #endregion
- else if (selected)
- #region Pressed
- if (top_edge)
- if (left_edge)
- if (right_edge)
- return VisualStyleElement.Tab.TopTabItem.Pressed;
- else
- return VisualStyleElement.Tab.TopTabItemLeftEdge.Pressed;
- else
- if (right_edge)
- return VisualStyleElement.Tab.TopTabItemRightEdge.Pressed;
- else
- return VisualStyleElement.Tab.TopTabItem.Pressed;
- else
- if (left_edge)
- if (right_edge)
- return VisualStyleElement.Tab.TabItem.Pressed;
- else
- return VisualStyleElement.Tab.TabItemLeftEdge.Pressed;
- else
- if (right_edge)
- return VisualStyleElement.Tab.TabItemRightEdge.Pressed;
- else
- return VisualStyleElement.Tab.TabItem.Pressed;
- #endregion
- else if (tabControl.EnteredTabPage == tabPage)
- #region Hot
- if (top_edge)
- if (left_edge)
- if (right_edge)
- return VisualStyleElement.Tab.TopTabItem.Hot;
- else
- return VisualStyleElement.Tab.TopTabItemLeftEdge.Hot;
- else
- if (right_edge)
- return VisualStyleElement.Tab.TopTabItemRightEdge.Hot;
- else
- return VisualStyleElement.Tab.TopTabItem.Hot;
- else
- if (left_edge)
- if (right_edge)
- return VisualStyleElement.Tab.TabItem.Hot;
- else
- return VisualStyleElement.Tab.TabItemLeftEdge.Hot;
- else
- if (right_edge)
- return VisualStyleElement.Tab.TabItemRightEdge.Hot;
- else
- return VisualStyleElement.Tab.TabItem.Hot;
- #endregion
- else
- #region Normal
- if (top_edge)
- if (left_edge)
- if (right_edge)
- return VisualStyleElement.Tab.TopTabItemBothEdges.Normal;
- else
- return VisualStyleElement.Tab.TopTabItemLeftEdge.Normal;
- else
- if (right_edge)
- return VisualStyleElement.Tab.TopTabItemRightEdge.Normal;
- else
- return VisualStyleElement.Tab.TopTabItem.Normal;
- else
- if (left_edge)
- if (right_edge)
- return VisualStyleElement.Tab.TabItemBothEdges.Normal;
- else
- return VisualStyleElement.Tab.TabItemLeftEdge.Normal;
- else
- if (right_edge)
- return VisualStyleElement.Tab.TabItemRightEdge.Normal;
- else
- return VisualStyleElement.Tab.TabItem.Normal;
- #endregion
- }
- public override bool HasHotElementStyles (TabControl tabControl)
- {
- if (!ShouldPaint (tabControl))
- return base.HasHotElementStyles (tabControl);
- return true;
- }
- protected override void DrawScrollButton (Graphics dc, Rectangle bounds, Rectangle clippingArea, ScrollButton button, PushButtonState state)
- {
- if (!ThemeVisualStyles.RenderClientAreas) {
- base.DrawScrollButton (dc, bounds, clippingArea, button, state);
- return;
- }
- VisualStyleElement element;
- if (button == ScrollButton.Left)
- switch (state) {
- case PushButtonState.Hot:
- element = VisualStyleElement.Spin.DownHorizontal.Hot;
- break;
- case PushButtonState.Pressed:
- element = VisualStyleElement.Spin.DownHorizontal.Pressed;
- break;
- default:
- element = VisualStyleElement.Spin.DownHorizontal.Normal;
- break;
- }
- else
- switch (state) {
- case PushButtonState.Hot:
- element = VisualStyleElement.Spin.UpHorizontal.Hot;
- break;
- case PushButtonState.Pressed:
- element = VisualStyleElement.Spin.UpHorizontal.Pressed;
- break;
- default:
- element = VisualStyleElement.Spin.UpHorizontal.Normal;
- break;
- }
- if (!VisualStyleRenderer.IsElementDefined (element)) {
- if (button == ScrollButton.Left)
- switch (state) {
- case PushButtonState.Hot:
- element = VisualStyleElement.ScrollBar.ArrowButton.LeftHot;
- break;
- case PushButtonState.Pressed:
- element = VisualStyleElement.ScrollBar.ArrowButton.LeftPressed;
- break;
- default:
- element = VisualStyleElement.ScrollBar.ArrowButton.LeftNormal;
- break;
- }
- else
- switch (state) {
- case PushButtonState.Hot:
- element = VisualStyleElement.ScrollBar.ArrowButton.RightHot;
- break;
- case PushButtonState.Pressed:
- element = VisualStyleElement.ScrollBar.ArrowButton.RightPressed;
- break;
- default:
- element = VisualStyleElement.ScrollBar.ArrowButton.RightNormal;
- break;
- }
- if (!VisualStyleRenderer.IsElementDefined (element)) {
- base.DrawScrollButton (dc, bounds, clippingArea, button, state);
- return;
- }
- }
- new VisualStyleRenderer (element).DrawBackground (dc, bounds, clippingArea);
- }
- }
- }
|