summaryrefslogtreecommitdiffstats
path: root/widget/nsNativeTheme.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--widget/nsNativeTheme.h199
1 files changed, 199 insertions, 0 deletions
diff --git a/widget/nsNativeTheme.h b/widget/nsNativeTheme.h
new file mode 100644
index 0000000000..b72b30a3e0
--- /dev/null
+++ b/widget/nsNativeTheme.h
@@ -0,0 +1,199 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* 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/. */
+
+// This defines a common base class for nsITheme implementations, to reduce
+// code duplication.
+
+#ifndef _NSNATIVETHEME_H_
+#define _NSNATIVETHEME_H_
+
+#include "nsAlgorithm.h"
+#include "nsAtom.h"
+#include "nsColor.h"
+#include "nsCOMPtr.h"
+#include "nsString.h"
+#include "nsMargin.h"
+#include "nsGkAtoms.h"
+#include "nsTArray.h"
+#include "nsINamed.h"
+#include "nsITimer.h"
+#include "nsIContent.h"
+
+class nsIFrame;
+class nsPresContext;
+
+namespace mozilla {
+class ComputedStyle;
+enum class StyleAppearance : uint8_t;
+class EventStates;
+} // namespace mozilla
+
+class nsNativeTheme : public nsITimerCallback, public nsINamed {
+ protected:
+ virtual ~nsNativeTheme() = default;
+
+ NS_DECL_ISUPPORTS
+ NS_DECL_NSITIMERCALLBACK
+ NS_DECL_NSINAMED
+
+ nsNativeTheme();
+
+ public:
+ enum ScrollbarButtonType {
+ eScrollbarButton_UpTop = 0,
+ eScrollbarButton_Down = 1 << 0,
+ eScrollbarButton_Bottom = 1 << 1
+ };
+
+ enum TreeSortDirection {
+ eTreeSortDirection_Descending,
+ eTreeSortDirection_Natural,
+ eTreeSortDirection_Ascending
+ };
+ // Returns the content state (hover, focus, etc), see EventStateManager.h
+ static mozilla::EventStates GetContentState(
+ nsIFrame* aFrame, mozilla::StyleAppearance aAppearance);
+
+ // Returns whether the widget is already styled by content
+ // Normally called from ThemeSupportsWidget to turn off native theming
+ // for elements that are already styled.
+ bool IsWidgetStyled(nsPresContext* aPresContext, nsIFrame* aFrame,
+ mozilla::StyleAppearance aAppearance);
+
+ // Accessors to widget-specific state information
+
+ bool IsDisabled(nsIFrame* aFrame, mozilla::EventStates aEventStates);
+
+ // RTL chrome direction
+ static bool IsFrameRTL(nsIFrame* aFrame);
+
+ static bool IsHTMLContent(nsIFrame* aFrame);
+
+ // button:
+ bool IsDefaultButton(nsIFrame* aFrame) {
+ return CheckBooleanAttr(aFrame, nsGkAtoms::_default);
+ }
+
+ bool IsButtonTypeMenu(nsIFrame* aFrame);
+
+ // checkbox:
+ bool IsChecked(nsIFrame* aFrame) {
+ return GetCheckedOrSelected(aFrame, false);
+ }
+
+ // radiobutton:
+ bool IsSelected(nsIFrame* aFrame) {
+ return GetCheckedOrSelected(aFrame, true);
+ }
+
+ static bool IsFocused(nsIFrame* aFrame) {
+ return CheckBooleanAttr(aFrame, nsGkAtoms::focused);
+ }
+
+ // scrollbar button:
+ int32_t GetScrollbarButtonType(nsIFrame* aFrame);
+
+ // tab:
+ bool IsSelectedTab(nsIFrame* aFrame) {
+ return CheckBooleanAttr(aFrame, nsGkAtoms::visuallyselected);
+ }
+
+ bool IsNextToSelectedTab(nsIFrame* aFrame, int32_t aOffset);
+
+ bool IsBeforeSelectedTab(nsIFrame* aFrame) {
+ return IsNextToSelectedTab(aFrame, -1);
+ }
+
+ bool IsAfterSelectedTab(nsIFrame* aFrame) {
+ return IsNextToSelectedTab(aFrame, 1);
+ }
+
+ bool IsLeftToSelectedTab(nsIFrame* aFrame) {
+ return IsFrameRTL(aFrame) ? IsAfterSelectedTab(aFrame)
+ : IsBeforeSelectedTab(aFrame);
+ }
+
+ bool IsRightToSelectedTab(nsIFrame* aFrame) {
+ return IsFrameRTL(aFrame) ? IsBeforeSelectedTab(aFrame)
+ : IsAfterSelectedTab(aFrame);
+ }
+
+ // button / toolbarbutton:
+ bool IsCheckedButton(nsIFrame* aFrame) {
+ return CheckBooleanAttr(aFrame, nsGkAtoms::checked);
+ }
+
+ bool IsSelectedButton(nsIFrame* aFrame) {
+ return CheckBooleanAttr(aFrame, nsGkAtoms::checked) ||
+ CheckBooleanAttr(aFrame, nsGkAtoms::selected);
+ }
+
+ bool IsOpenButton(nsIFrame* aFrame) {
+ return CheckBooleanAttr(aFrame, nsGkAtoms::open);
+ }
+
+ bool IsPressedButton(nsIFrame* aFrame);
+
+ // treeheadercell:
+ TreeSortDirection GetTreeSortDirection(nsIFrame* aFrame);
+ bool IsLastTreeHeaderCell(nsIFrame* aFrame);
+
+ // tab:
+ bool IsBottomTab(nsIFrame* aFrame);
+ bool IsFirstTab(nsIFrame* aFrame);
+
+ bool IsHorizontal(nsIFrame* aFrame);
+
+ // progressbar:
+ bool IsIndeterminateProgress(nsIFrame* aFrame,
+ mozilla::EventStates aEventStates);
+ bool IsVerticalProgress(nsIFrame* aFrame);
+
+ // meter:
+ bool IsVerticalMeter(nsIFrame* aFrame);
+
+ // textfield:
+ bool IsReadOnly(nsIFrame* aFrame) {
+ return CheckBooleanAttr(aFrame, nsGkAtoms::readonly);
+ }
+
+ // menupopup:
+ bool IsSubmenu(nsIFrame* aFrame, bool* aLeftOfParent);
+
+ // True if it's not a menubar item or menulist item
+ bool IsRegularMenuItem(nsIFrame* aFrame);
+
+ static bool CheckBooleanAttr(nsIFrame* aFrame, nsAtom* aAtom);
+ static int32_t CheckIntAttr(nsIFrame* aFrame, nsAtom* aAtom,
+ int32_t defaultValue);
+
+ // Helpers for progressbar.
+ static double GetProgressValue(nsIFrame* aFrame);
+ static double GetProgressMaxValue(nsIFrame* aFrame);
+
+ bool GetCheckedOrSelected(nsIFrame* aFrame, bool aCheckSelected);
+ bool GetIndeterminate(nsIFrame* aFrame);
+
+ bool QueueAnimatedContentForRefresh(nsIContent* aContent,
+ uint32_t aMinimumFrameRate);
+
+ nsIFrame* GetAdjacentSiblingFrameWithSameAppearance(nsIFrame* aFrame,
+ bool aNextSibling);
+
+ bool IsRangeHorizontal(nsIFrame* aFrame);
+
+ // scrollbar
+ static bool IsDarkBackground(nsIFrame* aFrame);
+ // custom scrollbar
+ typedef nscolor (*AutoColorGetter)(mozilla::ComputedStyle*);
+ static bool IsWidgetScrollbarPart(mozilla::StyleAppearance aAppearance);
+
+ private:
+ uint32_t mAnimatedContentTimeout;
+ nsCOMPtr<nsITimer> mAnimatedContentTimer;
+ AutoTArray<nsCOMPtr<nsIContent>, 20> mAnimatedContentList;
+};
+
+#endif // _NSNATIVETHEME_H_