Bug 1967551 - Remove native tabbox support. r=desktop-theme-reviewers,mac-reviewers,win-reviewers,tabbrowser-reviewers,gstoll,mstange,dao

Eventually I want to simplify a lot of how the theming code deals with
overriding border / padding, and this helps with that.

Since bug 1765076 this isn't used anywhere, so I think simplifying this
is the right trade-off. Thunderbird also doesn't use it.

Differential Revision: https://phabricator.services.mozilla.com/D250314
This commit is contained in:
Emilio Cobos Álvarez
2025-05-25 12:29:22 +00:00
committed by ealvarez@mozilla.com
parent 294861d1cd
commit 60ef90b355
14 changed files with 6 additions and 408 deletions

View File

@@ -191,28 +191,6 @@
.tabbrowser-tab { .tabbrowser-tab {
border: none; border: none;
/* FIXME: Are these styles really needed nowadays? */
&:is([visuallyselected], [multiselected]) {
/* overriding tabbox.css */
text-shadow: inherit;
@media (prefers-color-scheme: light) {
:root:not([lwtheme]) & {
/* overriding tabbox.css */
color: hsl(240, 5%, 5%);
}
}
}
}
#tabbrowser-tabs {
/* overriding tabbox.css */
font: message-box;
align-items: stretch;
margin-bottom: 0;
position: static;
z-index: auto;
} }
/* Bookmark drag and drop styles */ /* Bookmark drag and drop styles */

View File

@@ -119,6 +119,9 @@
} }
#tabbrowser-tabs { #tabbrowser-tabs {
/* Overriding tabbox.css */
border: 0;
/* Use a bigger flex value than the searchbar to prevent it from /* Use a bigger flex value than the searchbar to prevent it from
* taking all the toolbar space. */ * taking all the toolbar space. */
flex: 1000 1000; flex: 1000 1000;
@@ -1572,7 +1575,6 @@ tab-group {
flex-direction: column; flex-direction: column;
align-content: flex-start; align-content: flex-start;
grid-gap: var(--space-small); grid-gap: var(--space-small);
padding: 0; /* override tabbox.css on macOS */
&[overflow]::after { &[overflow]::after {
content: ""; content: "";

View File

@@ -1550,12 +1550,6 @@ pub enum Appearance {
/// A status bar in a main application window. /// A status bar in a main application window.
#[parse(condition = "ParserContext::chrome_rules_enabled")] #[parse(condition = "ParserContext::chrome_rules_enabled")]
Statusbar, Statusbar,
/// A single tab in a tab widget.
#[parse(condition = "ParserContext::chrome_rules_enabled")]
Tab,
/// The tab panels container.
#[parse(condition = "ParserContext::chrome_rules_enabled")]
Tabpanels,
/// A single toolbar button (with no associated dropdown). /// A single toolbar button (with no associated dropdown).
#[parse(condition = "ParserContext::chrome_rules_enabled")] #[parse(condition = "ParserContext::chrome_rules_enabled")]
Toolbarbutton, Toolbarbutton,

View File

@@ -8,7 +8,6 @@ toolkit.jar:
skin/classic/global/autocomplete.css skin/classic/global/autocomplete.css
skin/classic/global/global.css skin/classic/global/global.css
skin/classic/global/richlistbox.css skin/classic/global/richlistbox.css
skin/classic/global/tabbox.css
skin/classic/global/toolbar.css skin/classic/global/toolbar.css
skin/classic/global/icons/Authentication.png (icons/Authentication.png) skin/classic/global/icons/Authentication.png (icons/Authentication.png)

View File

@@ -10,7 +10,6 @@ toolkit.jar:
skin/classic/global/dialog.css skin/classic/global/dialog.css
skin/classic/global/global.css skin/classic/global/global.css
skin/classic/global/richlistbox.css skin/classic/global/richlistbox.css
skin/classic/global/tabbox.css
skin/classic/global/toolbar.css skin/classic/global/toolbar.css
skin/classic/global/wizard.css skin/classic/global/wizard.css
skin/classic/global/arrow/panelarrow-vertical.svg (arrow/panelarrow-vertical.svg) skin/classic/global/arrow/panelarrow-vertical.svg (arrow/panelarrow-vertical.svg)

View File

@@ -1,64 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/*
The default style of these tabs is that of an NSTabView with tabs at
the top in the "regular" size. These tabs can be used with or without
a tabbox element.
*/
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
tabbox {
margin: 0 5px;
}
tabpanels {
appearance: auto;
-moz-default-appearance: tabpanels;
padding: 33px 15px 15px;
}
tabs {
align-items: center;
font: menu;
padding: 0 10px;
margin-bottom: -12px;
position: relative;
/* Needs to sort on top of the tabbox, which is a grid container (and thus
* causes pseudo stacking contexts to be created) */
z-index: 1;
}
tab {
appearance: auto;
-moz-default-appearance: tab;
padding-top: 1px;
}
tab:-moz-focusring {
/* Tab focus rings need to overlay adjacent tabs. */
position: relative;
}
tab:where(:first-of-type) {
padding-inline-start: 2px;
}
tab:where(:last-of-type) {
padding-inline-end: 2px;
}
tab:where([visuallyselected]:not(:-moz-window-inactive)) {
color: #FFF;
}
.tab-middle {
padding: 1px 6px 2px;
}
.tabs-left,
.tabs-right {
flex: 1;
}

View File

@@ -43,6 +43,7 @@
skin/classic/global/popup.css (../../shared/popup.css) skin/classic/global/popup.css (../../shared/popup.css)
skin/classic/global/popupnotification.css (../../shared/popupnotification.css) skin/classic/global/popupnotification.css (../../shared/popupnotification.css)
skin/classic/global/splitter.css (../../shared/splitter.css) skin/classic/global/splitter.css (../../shared/splitter.css)
skin/classic/global/tabbox.css (../../shared/tabbox.css)
skin/classic/global/toolbarbutton.css (../../shared/toolbarbutton.css) skin/classic/global/toolbarbutton.css (../../shared/toolbarbutton.css)
skin/classic/global/tree/tree.css (../../shared/tree/tree.css) skin/classic/global/tree/tree.css (../../shared/tree/tree.css)
skin/classic/global/dirListing/dirListing.css (../../shared/dirListing/dirListing.css) skin/classic/global/dirListing/dirListing.css (../../shared/dirListing/dirListing.css)

View File

@@ -204,31 +204,20 @@ html|hr {
/* tabpanels and tabs */ /* tabpanels and tabs */
xul|tabpanels { xul|tabpanels {
appearance: none;
border: none; border: none;
padding: 0; padding: 0;
background-color: transparent;
color: inherit;
color-scheme: unset;
} }
xul|tabs { xul|tabs {
margin-bottom: 10px; margin-bottom: 10px;
border-bottom: 1px solid var(--in-content-border-color); border-bottom: 1px solid var(--in-content-border-color);
background-color: transparent;
color: inherit;
} }
xul|tab { xul|tab {
appearance: none;
margin: 0;
padding: 2px 20px 0; padding: 2px 20px 0;
min-height: 44px; min-height: 44px;
color: inherit;
background-color: transparent;
border-bottom: 2px solid transparent; border-bottom: 2px solid transparent;
transition: background-color 50ms ease 0s; transition: background-color 50ms ease 0s;
color-scheme: unset;
&:where(:hover) { &:where(:hover) {
border-bottom-color: var(--in-content-border-color); border-bottom-color: var(--in-content-border-color);

View File

@@ -8,7 +8,6 @@
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
/* ::::: tabs ::::: */ /* ::::: tabs ::::: */
tabs { tabs {

View File

@@ -6,7 +6,6 @@
toolkit.jar: toolkit.jar:
skin/classic/global/autocomplete.css skin/classic/global/autocomplete.css
skin/classic/global/tabbox.css
skin/classic/global/global.css skin/classic/global/global.css
skin/classic/global/printPageSetup.css skin/classic/global/printPageSetup.css
skin/classic/global/richlistbox.css skin/classic/global/richlistbox.css

View File

@@ -1,55 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* ===== tabbox.css =================================================
== Styles used by XUL tab-related elements.
======================================================================= */
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
/* ::::: tabpanels ::::: */
tabpanels {
appearance: auto;
-moz-default-appearance: tabpanels;
padding: 8px;
color: -moz-DialogText;
/* These don't have non-native theme support, so force them to light mode to
* use the native windows theme. */
color-scheme: light;
}
/* ::::: tab ::::: */
tab {
appearance: auto;
-moz-default-appearance: tab;
margin-top: 2px;
padding: 1px 4px 2px;
color: -moz-DialogText;
/* These don't have non-native theme support, so force them to light mode to
* use the native windows theme. */
color-scheme: light;
}
tab:where([visuallyselected]) {
margin-top: 0;
padding: 1px 6px 4px;
}
tab:where(:first-of-type[visuallyselected]) {
padding-inline: 5px;
}
.tab-text {
margin: 0 !important;
}
tab:focus-visible > .tab-middle {
outline: var(--default-focusring);
}
.tabs-right {
flex: 1;
}

View File

@@ -44,7 +44,7 @@ class nsNativeThemeCocoa : public mozilla::widget::ThemeCocoa {
eDisclosureButtonOpen eDisclosureButtonOpen
}; };
enum class SegmentType : uint8_t { eToolbarButton, eTab }; enum class SegmentType : uint8_t { eToolbarButton };
enum class OptimumState : uint8_t { eOptimum, eSubOptimum, eSubSubOptimum }; enum class OptimumState : uint8_t { eOptimum, eSubOptimum, eSubSubOptimum };
@@ -149,7 +149,6 @@ class nsNativeThemeCocoa : public mozilla::widget::ThemeCocoa {
eScale, // ScaleParams eScale, // ScaleParams
eMultilineTextField, // bool eMultilineTextField, // bool
eListBox, eListBox,
eTabPanel,
}; };
struct WidgetInfo { struct WidgetInfo {
@@ -199,9 +198,6 @@ class nsNativeThemeCocoa : public mozilla::widget::ThemeCocoa {
return WidgetInfo(Widget::eMultilineTextField, aParams); return WidgetInfo(Widget::eMultilineTextField, aParams);
} }
static WidgetInfo ListBox() { return WidgetInfo(Widget::eListBox, false); } static WidgetInfo ListBox() { return WidgetInfo(Widget::eListBox, false); }
static WidgetInfo TabPanel(bool aParams) {
return WidgetInfo(Widget::eTabPanel, aParams);
}
template <typename T> template <typename T>
T Params() const { T Params() const {

View File

@@ -1683,24 +1683,6 @@ void nsNativeThemeCocoa::DrawMeter(CGContextRef cgContext,
NS_OBJC_END_TRY_IGNORE_BLOCK NS_OBJC_END_TRY_IGNORE_BLOCK
} }
void nsNativeThemeCocoa::DrawTabPanel(CGContextRef cgContext,
const HIRect& inBoxRect,
bool aIsInsideActiveWindow) {
NS_OBJC_BEGIN_TRY_IGNORE_BLOCK;
HIThemeTabPaneDrawInfo tpdi;
tpdi.version = 1;
tpdi.state = aIsInsideActiveWindow ? kThemeStateActive : kThemeStateInactive;
tpdi.direction = kThemeTabNorth;
tpdi.size = kHIThemeTabSizeNormal;
tpdi.kind = kHIThemeTabKindNormal;
HIThemeDrawTabPane(&inBoxRect, &tpdi, cgContext, HITHEME_ORIENTATION);
NS_OBJC_END_TRY_IGNORE_BLOCK;
}
Maybe<nsNativeThemeCocoa::ScaleParams> Maybe<nsNativeThemeCocoa::ScaleParams>
nsNativeThemeCocoa::ComputeHTMLScaleParams(nsIFrame* aFrame, nsNativeThemeCocoa::ComputeHTMLScaleParams(nsIFrame* aFrame,
ElementState aEventState) { ElementState aEventState) {
@@ -1806,11 +1788,6 @@ struct SegmentedControlRenderSettings {
const NSString* widgetName; const NSString* widgetName;
}; };
static const CGFloat tabHeights[3] = {17, 20, 23};
static const SegmentedControlRenderSettings tabRenderSettings = {tabHeights,
@"tab"};
static const CGFloat toolbarButtonHeights[3] = {15, 18, 22}; static const CGFloat toolbarButtonHeights[3] = {15, 18, 22};
static const SegmentedControlRenderSettings toolbarButtonRenderSettings = { static const SegmentedControlRenderSettings toolbarButtonRenderSettings = {
@@ -1840,8 +1817,6 @@ static SegmentedControlRenderSettings RenderSettingsForSegmentType(
switch (aSegmentType) { switch (aSegmentType) {
case nsNativeThemeCocoa::SegmentType::eToolbarButton: case nsNativeThemeCocoa::SegmentType::eToolbarButton:
return toolbarButtonRenderSettings; return toolbarButtonRenderSettings;
case nsNativeThemeCocoa::SegmentType::eTab:
return tabRenderSettings;
} }
} }
@@ -2117,17 +2092,6 @@ Maybe<nsNativeThemeCocoa::WidgetInfo> nsNativeThemeCocoa::ComputeWidgetInfo(
case StyleAppearance::Listbox: case StyleAppearance::Listbox:
return Some(WidgetInfo::ListBox()); return Some(WidgetInfo::ListBox());
case StyleAppearance::Tab: {
SegmentParams params =
ComputeSegmentParams(aFrame, elementState, SegmentType::eTab);
params.pressed = params.pressed && !params.selected;
return Some(WidgetInfo::Segment(params));
}
case StyleAppearance::Tabpanels:
return Some(WidgetInfo::TabPanel(FrameIsInActiveWindow(aFrame)));
default: default:
break; break;
} }
@@ -2319,11 +2283,6 @@ void nsNativeThemeCocoa::RenderWidget(const WidgetInfo& aWidgetInfo,
}); });
break; break;
} }
case Widget::eTabPanel: {
bool isInsideActiveWindow = aWidgetInfo.Params<bool>();
DrawTabPanel(cgContext, macRect, isInsideActiveWindow);
break;
}
} }
// Reset the base CTM. // Reset the base CTM.
@@ -2377,9 +2336,6 @@ bool nsNativeThemeCocoa::CreateWebRenderCommandsForWidget(
case StyleAppearance::Textarea: case StyleAppearance::Textarea:
case StyleAppearance::Listbox: case StyleAppearance::Listbox:
case StyleAppearance::Tab:
case StyleAppearance::Tabpanels:
return false;
default: default:
return true; return true;
@@ -2541,8 +2497,7 @@ bool nsNativeThemeCocoa::GetWidgetOverflow(nsDeviceContext* aContext,
case StyleAppearance::Menulist: case StyleAppearance::Menulist:
case StyleAppearance::MozMenulistArrowButton: case StyleAppearance::MozMenulistArrowButton:
case StyleAppearance::Checkbox: case StyleAppearance::Checkbox:
case StyleAppearance::Radio: case StyleAppearance::Radio: {
case StyleAppearance::Tab: {
overflow.SizeTo(static_cast<int32_t>(kMaxFocusRingWidth), overflow.SizeTo(static_cast<int32_t>(kMaxFocusRingWidth),
static_cast<int32_t>(kMaxFocusRingWidth), static_cast<int32_t>(kMaxFocusRingWidth),
static_cast<int32_t>(kMaxFocusRingWidth), static_cast<int32_t>(kMaxFocusRingWidth),
@@ -2651,11 +2606,6 @@ LayoutDeviceIntSize nsNativeThemeCocoa::GetMinimumWidgetSize(
break; break;
} }
case StyleAppearance::Tab: {
result.SizeTo(0, tabHeights[miniControlSize]);
break;
}
case StyleAppearance::RangeThumb: { case StyleAppearance::RangeThumb: {
SInt32 width = 0; SInt32 width = 0;
SInt32 height = 0; SInt32 height = 0;
@@ -2690,7 +2640,6 @@ bool nsNativeThemeCocoa::WidgetAttributeChangeRequiresRepaint(
case StyleAppearance::MozSidebar: case StyleAppearance::MozSidebar:
case StyleAppearance::Statusbar: case StyleAppearance::Statusbar:
case StyleAppearance::Tooltip: case StyleAppearance::Tooltip:
case StyleAppearance::Tabpanels:
case StyleAppearance::Menupopup: case StyleAppearance::Menupopup:
case StyleAppearance::Progresschunk: case StyleAppearance::Progresschunk:
case StyleAppearance::ProgressBar: case StyleAppearance::ProgressBar:
@@ -2750,10 +2699,6 @@ bool nsNativeThemeCocoa::ThemeSupportsWidget(nsPresContext* aPresContext,
case StyleAppearance::Meter: case StyleAppearance::Meter:
case StyleAppearance::Meterchunk: case StyleAppearance::Meterchunk:
case StyleAppearance::Separator: case StyleAppearance::Separator:
case StyleAppearance::Tabpanels:
case StyleAppearance::Tab:
case StyleAppearance::Range: case StyleAppearance::Range:
return !IsWidgetStyled(aPresContext, aFrame, aAppearance); return !IsWidgetStyled(aPresContext, aFrame, aAppearance);
@@ -2810,7 +2755,6 @@ bool nsNativeThemeCocoa::ThemeNeedsComboboxDropmarker() { return false; }
bool nsNativeThemeCocoa::WidgetAppearanceDependsOnWindowFocus( bool nsNativeThemeCocoa::WidgetAppearanceDependsOnWindowFocus(
StyleAppearance aAppearance) { StyleAppearance aAppearance) {
switch (aAppearance) { switch (aAppearance) {
case StyleAppearance::Tabpanels:
case StyleAppearance::Menupopup: case StyleAppearance::Menupopup:
case StyleAppearance::Tooltip: case StyleAppearance::Tooltip:
case StyleAppearance::Separator: case StyleAppearance::Separator:

View File

@@ -490,9 +490,6 @@ mozilla::Maybe<UXThemeClass> nsNativeThemeWin::GetThemeClass(
case StyleAppearance::ProgressBar: case StyleAppearance::ProgressBar:
case StyleAppearance::Progresschunk: case StyleAppearance::Progresschunk:
return Some(UXThemeClass::Progress); return Some(UXThemeClass::Progress);
case StyleAppearance::Tab:
case StyleAppearance::Tabpanels:
return Some(UXThemeClass::Tab);
case StyleAppearance::Range: case StyleAppearance::Range:
case StyleAppearance::RangeThumb: case StyleAppearance::RangeThumb:
return Some(UXThemeClass::Trackbar); return Some(UXThemeClass::Trackbar);
@@ -715,32 +712,6 @@ nsresult nsNativeThemeWin::GetThemePartAndState(nsIFrame* aFrame,
aState = TS_NORMAL; aState = TS_NORMAL;
return NS_OK; return NS_OK;
} }
case StyleAppearance::Tabpanels: {
aPart = TABP_PANELS;
aState = TS_NORMAL;
return NS_OK;
}
case StyleAppearance::Tab: {
aPart = TABP_TAB;
if (!aFrame) {
aState = TS_NORMAL;
return NS_OK;
}
ElementState elementState = GetContentState(aFrame, aAppearance);
if (elementState.HasState(ElementState::DISABLED)) {
aState = TS_DISABLED;
return NS_OK;
}
if (IsSelectedTab(aFrame)) {
aPart = TABP_TAB_SELECTED;
aState = TS_ACTIVE; // The selected tab is always "pressed".
} else
aState = StandardGetState(aFrame, aAppearance, true);
return NS_OK;
}
case StyleAppearance::Menulist: { case StyleAppearance::Menulist: {
nsIContent* content = aFrame->GetContent(); nsIContent* content = aFrame->GetContent();
bool useDropBorder = content && content->IsHTMLElement(); bool useDropBorder = content && content->IsHTMLElement();
@@ -866,33 +837,6 @@ RENDER_AGAIN:
} }
#endif #endif
if (aAppearance == StyleAppearance::Tab) {
// For left edge and right edge tabs, we need to adjust the widget
// rects and clip rects so that the edges don't get drawn.
bool isLeft = IsLeftToSelectedTab(aFrame);
bool isRight = !isLeft && IsRightToSelectedTab(aFrame);
if (isLeft || isRight) {
// HACK ALERT: There appears to be no way to really obtain this value, so
// we're forced to just use the default value for Luna (which also happens
// to be correct for all the other skins I've tried).
int32_t edgeSize = 2;
// Armed with the size of the edge, we now need to either shift to the
// left or to the right. The clip rect won't include this extra area, so
// we know that we're effectively shifting the edge out of view (such that
// it won't be painted).
if (isLeft)
// The right edge should not be drawn. Extend our rect by the edge
// size.
widgetRect.right += edgeSize;
else
// The left edge should not be drawn. Move the widget rect's left coord
// back.
widgetRect.left -= edgeSize;
}
}
// widgetRect is the bounding box for a widget, yet the scale track is only // widgetRect is the bounding box for a widget, yet the scale track is only
// a small portion of this size, so the edges of the scale need to be // a small portion of this size, so the edges of the scale need to be
// adjusted to the real size of the track. // adjusted to the real size of the track.
@@ -1042,16 +986,6 @@ LayoutDeviceIntMargin nsNativeThemeWin::GetWidgetBorder(
result = GetCachedWidgetBorder(theme, themeClass.value(), aAppearance, part, result = GetCachedWidgetBorder(theme, themeClass.value(), aAppearance, part,
state); state);
// Remove the edges for tabs that are before or after the selected tab,
if (aAppearance == StyleAppearance::Tab) {
if (IsLeftToSelectedTab(aFrame))
// Remove the right edge, since we won't be drawing it.
result.right = 0;
else if (IsRightToSelectedTab(aFrame))
// Remove the left edge, since we won't be drawing it.
result.left = 0;
}
if (aFrame && (aAppearance == StyleAppearance::NumberInput || if (aFrame && (aAppearance == StyleAppearance::NumberInput ||
aAppearance == StyleAppearance::PasswordInput || aAppearance == StyleAppearance::PasswordInput ||
aAppearance == StyleAppearance::Textfield || aAppearance == StyleAppearance::Textfield ||
@@ -1175,7 +1109,6 @@ LayoutDeviceIntSize nsNativeThemeWin::GetMinimumWidgetSize(
case StyleAppearance::PasswordInput: case StyleAppearance::PasswordInput:
case StyleAppearance::Textfield: case StyleAppearance::Textfield:
case StyleAppearance::Progresschunk: case StyleAppearance::Progresschunk:
case StyleAppearance::Tabpanels:
case StyleAppearance::Listbox: case StyleAppearance::Listbox:
return {}; // Don't worry about it. return {}; // Don't worry about it.
default: default:
@@ -1243,7 +1176,6 @@ bool nsNativeThemeWin::WidgetAttributeChangeRequiresRepaint(
// Some widget types just never change state. // Some widget types just never change state.
if (aAppearance == StyleAppearance::Progresschunk || if (aAppearance == StyleAppearance::Progresschunk ||
aAppearance == StyleAppearance::ProgressBar || aAppearance == StyleAppearance::ProgressBar ||
aAppearance == StyleAppearance::Tabpanels ||
aAppearance == StyleAppearance::Separator) { aAppearance == StyleAppearance::Separator) {
return false; return false;
} }
@@ -1344,8 +1276,6 @@ bool nsNativeThemeWin::ClassicThemeSupportsWidget(nsIFrame* aFrame,
case StyleAppearance::Listbox: case StyleAppearance::Listbox:
case StyleAppearance::ProgressBar: case StyleAppearance::ProgressBar:
case StyleAppearance::Progresschunk: case StyleAppearance::Progresschunk:
case StyleAppearance::Tab:
case StyleAppearance::Tabpanels:
return true; return true;
default: default:
return false; return false;
@@ -1361,7 +1291,6 @@ LayoutDeviceIntMargin nsNativeThemeWin::ClassicGetWidgetBorder(
break; break;
case StyleAppearance::Listbox: case StyleAppearance::Listbox:
case StyleAppearance::Menulist: case StyleAppearance::Menulist:
case StyleAppearance::Tab:
case StyleAppearance::NumberInput: case StyleAppearance::NumberInput:
case StyleAppearance::PasswordInput: case StyleAppearance::PasswordInput:
case StyleAppearance::Textfield: case StyleAppearance::Textfield:
@@ -1415,8 +1344,6 @@ LayoutDeviceIntSize nsNativeThemeWin::ClassicGetMinimumWidgetSize(
case StyleAppearance::Textarea: case StyleAppearance::Textarea:
case StyleAppearance::Progresschunk: case StyleAppearance::Progresschunk:
case StyleAppearance::ProgressBar: case StyleAppearance::ProgressBar:
case StyleAppearance::Tab:
case StyleAppearance::Tabpanels:
// no minimum widget size // no minimum widget size
break; break;
@@ -1475,8 +1402,6 @@ nsresult nsNativeThemeWin::ClassicGetThemePartAndState(
case StyleAppearance::RangeThumb: case StyleAppearance::RangeThumb:
case StyleAppearance::Progresschunk: case StyleAppearance::Progresschunk:
case StyleAppearance::ProgressBar: case StyleAppearance::ProgressBar:
case StyleAppearance::Tab:
case StyleAppearance::Tabpanels:
// these don't use DrawFrameControl // these don't use DrawFrameControl
return NS_OK; return NS_OK;
default: default:
@@ -1484,100 +1409,6 @@ nsresult nsNativeThemeWin::ClassicGetThemePartAndState(
} }
} }
// Draw classic Windows tab
// (no system API for this, but DrawEdge can draw all the parts of a tab)
static void DrawTab(HDC hdc, const RECT& R, int32_t aPosition, bool aSelected,
bool aDrawLeft, bool aDrawRight) {
int32_t leftFlag, topFlag, rightFlag, lightFlag, shadeFlag;
RECT topRect, sideRect, bottomRect, lightRect, shadeRect;
int32_t selectedOffset, lOffset, rOffset;
selectedOffset = aSelected ? 1 : 0;
lOffset = aDrawLeft ? 2 : 0;
rOffset = aDrawRight ? 2 : 0;
// Get info for tab orientation/position (Left, Top, Right, Bottom)
switch (aPosition) {
case BF_LEFT:
leftFlag = BF_TOP;
topFlag = BF_LEFT;
rightFlag = BF_BOTTOM;
lightFlag = BF_DIAGONAL_ENDTOPRIGHT;
shadeFlag = BF_DIAGONAL_ENDBOTTOMRIGHT;
::SetRect(&topRect, R.left, R.top + lOffset, R.right, R.bottom - rOffset);
::SetRect(&sideRect, R.left + 2, R.top, R.right - 2 + selectedOffset,
R.bottom);
::SetRect(&bottomRect, R.right - 2, R.top, R.right, R.bottom);
::SetRect(&lightRect, R.left, R.top, R.left + 3, R.top + 3);
::SetRect(&shadeRect, R.left + 1, R.bottom - 2, R.left + 2, R.bottom - 1);
break;
case BF_TOP:
leftFlag = BF_LEFT;
topFlag = BF_TOP;
rightFlag = BF_RIGHT;
lightFlag = BF_DIAGONAL_ENDTOPRIGHT;
shadeFlag = BF_DIAGONAL_ENDBOTTOMRIGHT;
::SetRect(&topRect, R.left + lOffset, R.top, R.right - rOffset, R.bottom);
::SetRect(&sideRect, R.left, R.top + 2, R.right,
R.bottom - 1 + selectedOffset);
::SetRect(&bottomRect, R.left, R.bottom - 1, R.right, R.bottom);
::SetRect(&lightRect, R.left, R.top, R.left + 3, R.top + 3);
::SetRect(&shadeRect, R.right - 2, R.top + 1, R.right - 1, R.top + 2);
break;
case BF_RIGHT:
leftFlag = BF_TOP;
topFlag = BF_RIGHT;
rightFlag = BF_BOTTOM;
lightFlag = BF_DIAGONAL_ENDTOPLEFT;
shadeFlag = BF_DIAGONAL_ENDBOTTOMLEFT;
::SetRect(&topRect, R.left, R.top + lOffset, R.right, R.bottom - rOffset);
::SetRect(&sideRect, R.left + 2 - selectedOffset, R.top, R.right - 2,
R.bottom);
::SetRect(&bottomRect, R.left, R.top, R.left + 2, R.bottom);
::SetRect(&lightRect, R.right - 3, R.top, R.right - 1, R.top + 2);
::SetRect(&shadeRect, R.right - 2, R.bottom - 3, R.right, R.bottom - 1);
break;
case BF_BOTTOM:
leftFlag = BF_LEFT;
topFlag = BF_BOTTOM;
rightFlag = BF_RIGHT;
lightFlag = BF_DIAGONAL_ENDTOPLEFT;
shadeFlag = BF_DIAGONAL_ENDBOTTOMLEFT;
::SetRect(&topRect, R.left + lOffset, R.top, R.right - rOffset, R.bottom);
::SetRect(&sideRect, R.left, R.top + 2 - selectedOffset, R.right,
R.bottom - 2);
::SetRect(&bottomRect, R.left, R.top, R.right, R.top + 2);
::SetRect(&lightRect, R.left, R.bottom - 3, R.left + 2, R.bottom - 1);
::SetRect(&shadeRect, R.right - 2, R.bottom - 3, R.right, R.bottom - 1);
break;
default:
MOZ_CRASH();
}
// Background
::FillRect(hdc, &R, (HBRUSH)(COLOR_3DFACE + 1));
// Tab "Top"
::DrawEdge(hdc, &topRect, EDGE_RAISED, BF_SOFT | topFlag);
// Tab "Bottom"
if (!aSelected) ::DrawEdge(hdc, &bottomRect, EDGE_RAISED, BF_SOFT | topFlag);
// Tab "Sides"
if (!aDrawLeft) leftFlag = 0;
if (!aDrawRight) rightFlag = 0;
::DrawEdge(hdc, &sideRect, EDGE_RAISED, BF_SOFT | leftFlag | rightFlag);
// Tab Diagonal Corners
if (aDrawLeft) ::DrawEdge(hdc, &lightRect, EDGE_RAISED, BF_SOFT | lightFlag);
if (aDrawRight) ::DrawEdge(hdc, &shadeRect, EDGE_RAISED, BF_SOFT | shadeFlag);
}
void nsNativeThemeWin::DrawCheckedRect(HDC hdc, const RECT& rc, int32_t fore, void nsNativeThemeWin::DrawCheckedRect(HDC hdc, const RECT& rc, int32_t fore,
int32_t back, HBRUSH defaultBack) { int32_t back, HBRUSH defaultBack) {
static WORD patBits[8] = {0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55}; static WORD patBits[8] = {0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55};
@@ -1742,20 +1573,6 @@ RENDER_AGAIN:
break; break;
} }
// Draw Tab
case StyleAppearance::Tab: {
DrawTab(hdc, widgetRect, IsBottomTab(aFrame) ? BF_BOTTOM : BF_TOP,
IsSelectedTab(aFrame), !IsRightToSelectedTab(aFrame),
!IsLeftToSelectedTab(aFrame));
break;
}
case StyleAppearance::Tabpanels:
::DrawEdge(hdc, &widgetRect, EDGE_RAISED,
BF_SOFT | BF_MIDDLE | BF_LEFT | BF_RIGHT | BF_BOTTOM);
break;
default: default:
rv = NS_ERROR_FAILURE; rv = NS_ERROR_FAILURE;
break; break;