/****************************************************************************
**
** Definition of TQStyle class
**
** Created : 980616
**
** Copyright (C) 1992-2008 Trolltech ASA.  All rights reserved.
**
** This file is part of the kernel module of the TQt GUI Toolkit.
**
** This file may be used under the terms of the GNU General
** Public License versions 2.0 or 3.0 as published by the Free
** Software Foundation and appearing in the files LICENSE.GPL2
** and LICENSE.GPL3 included in the packaging of this file.
** Alternatively you may (at your option) use any later version
** of the GNU General Public License if such license has been
** publicly approved by Trolltech ASA (or its successors, if any)
** and the KDE Free TQt Foundation.
**
** Please review the following information to ensure GNU General
** Public Licensing requirements will be met:
** http://trolltech.com/products/qt/licenses/licensing/opensource/.
** If you are unsure which license is appropriate for your use, please
** review the following information:
** http://trolltech.com/products/qt/licenses/licensing/licensingoverview
** or contact the sales department at sales@trolltech.com.
**
** This file may be used under the terms of the Q Public License as
** defined by Trolltech ASA and appearing in the file LICENSE.TQPL
** included in the packaging of this file.  Licensees holding valid TQt
** Commercial licenses may use this file in accordance with the TQt
** Commercial License Agreement provided with the Software.
**
** This file is provided "AS IS" with NO WARRANTY OF ANY KIND,
** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted
** herein.
**
**********************************************************************/
#ifndef TQSTYLE_H
#define TQSTYLE_H

#ifndef QT_H
#include "ntqobject.h"
#include "ntqpixmap.h"
#include "ntqcolor.h"
#include "ntqiconset.h"
#include "ntqtabbar.h"
#include "ntqtoolbutton.h"
#endif // QT_H


#ifndef QT_NO_STYLE

class TQPopupMenu;
class TQStylePrivate;
class TQMenuItem;
class TQTab;
class TQListViewItem;
class TQCheckListItem;

class TQStyleOption {
public:
    enum StyleOptionDefault { Default };

    TQStyleOption(StyleOptionDefault=Default) : def(TRUE), tb(NULL), cli(NULL), tbh(NULL) {}

    // Note: we don't use default arguments since that is unnecessary
    // initialization.
    TQStyleOption(int in1) :
	def(FALSE), tb(NULL), i1(in1), cli(NULL), tbh(NULL) {}
    TQStyleOption(int in1, int in2) :
	def(FALSE), tb(NULL), i1(in1), i2(in2), cli(NULL), tbh(NULL) {}
    TQStyleOption(int in1, int in2, int in3, int in4) :
	def(FALSE), tb(NULL), i1(in1), i2(in2), i3(in3), i4(in4), cli(NULL), tbh(NULL) {}
    TQStyleOption(TQMenuItem* m) : def(FALSE), mi(m), tb(NULL), cli(NULL), tbh(NULL) {}
    TQStyleOption(TQMenuItem* m, int in1) : def(FALSE), mi(m), tb(NULL), i1(in1), cli(NULL), tbh(NULL) {}
    TQStyleOption(TQMenuItem* m, int in1, int in2) : def(FALSE), mi(m), tb(NULL), i1(in1), i2(in2), cli(NULL), tbh(NULL) {}
    TQStyleOption(const TQColor& c) : def(FALSE), tb(NULL), cl(&c), cli(NULL), tbh(NULL) {}
    TQStyleOption(TQTab* t) : def(FALSE), tb(t), cli(NULL), tbh(NULL) {}
    TQStyleOption(TQListViewItem* i) : def(FALSE), tb(NULL), li(i), cli(NULL), tbh(NULL) {}
    TQStyleOption(TQCheckListItem* i) : def(FALSE), tb(NULL), cli(i), tbh(NULL) {}
    TQStyleOption(TQt::ArrowType a) : def(FALSE), tb(NULL), i1((int)a), cli(NULL), tbh(NULL) {}
    TQStyleOption(const TQRect& r) : def(FALSE), tb(NULL), i1(r.x()), i2(r.y()), i3(r.width()), i4(r.height()), cli(NULL), tbh(NULL) {}
    TQStyleOption(TQWidget *w) : def(FALSE), tb(NULL), cli(NULL), p1((void*)w), tbh(NULL) {}

    bool isDefault() const { return def; }

    int day() const { return i1; }

    int lineWidth() const { return i1; }
    int midLineWidth() const { return i2; }
    int frameShape() const { return i3; }
    int frameShadow() const { return i4; }

    int headerSection() const { return i1; }
    TQMenuItem* menuItem() const { return mi; }
    int maxIconWidth() const { return i1; }
    int tabWidth() const { return i2; }

    const TQColor& color() const { return *cl; }

    TQTab* tab() const { return tb; }

    TQCheckListItem* checkListItem() const { return cli; }
    TQListViewItem* listViewItem() const { return li; }

    TQt::ArrowType arrowType() const { return (TQt::ArrowType)i1; }
    TQRect rect() const { return TQRect( i1, i2, i3, i4 ); }
    TQWidget* widget() const { return (TQWidget*)p1; }

    TQStyleOption(TQTab* t, TQTab* h) : def(FALSE), tb(t), cli(NULL), tbh(h) {}
    TQTab* hoverTab() const { return tbh; }

private:
    // NOTE: none of these components have constructors.
    bool def;
    bool b1,b2,b3; // reserved
    TQMenuItem* mi;
    TQTab* tb;
    TQListViewItem* li;
    const TQColor* cl;
    int i1, i2, i3, i4;
    int i5, i6; // reserved
    TQCheckListItem* cli;
    void *p1, *p2, *p3, *p4; // reserved
    TQTab* tbh;
    // (padded to 64 bytes on some architectures)
};

class TQStyleHintReturn; // not defined yet

typedef TQMap<TQ_UINT32, TQSize> DialogButtonSizeMap;
typedef TQMap<TQ_INT32, TQ_INT32> TabIdentifierIndexMap;

class TQStyleControlElementGenericWidgetData;

class TQStyleControlElementPopupMenuData {
	public:
		//
};

class TQStyleControlElementCheckListItemData {
	public:
		bool dataValid;
		bool enabled;
		bool hasParent;
		int height;
};

class TQStyleControlElementListViewData {
	public:
		bool rootDecorated;
		int itemMargin;
};

class TQStyleControlElementSpinWidgetData {
	public:
		TQ_UINT32 buttonSymbols;
		TQRect upRect;
		TQRect downRect;
		bool upEnabled;
		bool downEnabled;
};

class TQStyleControlElementTitleBarData {
	public:
		bool hasWindow;
		bool usesActiveColor;
		int windowState;
		TQString visibleText;
};

class TQStyleControlElementDockWidgetData {
	public:
		bool hasDockArea;
		bool closeEnabled;
		TQt::Orientation areaOrientation;
};

class TQStyleControlElementToolBarWidgetData {
	public:
		TQt::Orientation orientation;
};

class TQStyleControlElementGenericWidgetData {
	public:
		TQStringList widgetObjectTypes;
		bool allDataPopulated;
		TQt::WFlags wflags;
		TQt::WindowState windowState;
		TQPixmap bgPixmap;
		TQBrush bgBrush;
		TQColor bgColor;
		TQPoint bgOffset;
		TQt::BackgroundMode backgroundMode;
		TQColor fgColor;
		TQColorGroup colorGroup;
		TQRect geometry;
		TQRect rect;
		TQPoint pos;
		TQPixmap icon;
		TQPalette palette;
		TQFont font;
};

class TQStyleControlElementTabBarData {
	public:
		int tabCount;
		int currentTabIndex;
		TQTabBar::Shape shape;
		TabIdentifierIndexMap identIndexMap;
#ifdef Q_QDOC
#else
		TQStyleControlElementGenericWidgetData cornerWidgets[4];
#endif

		enum CornerWidgetLocation {
			CWL_TopLeft			= 0,
			CWL_TopRight			= 1,
			CWL_BottomLeft			= 2,
			CWL_BottomRight			= 3
		};
};

class Q_EXPORT TQStyleControlElementData {
	public:
		TQStringList widgetObjectTypes;
		bool allDataPopulated;
		TQt::WFlags wflags;
		TQt::WindowState windowState;
		TQPixmap bgPixmap;
		TQBrush bgBrush;
		TQColor bgColor;
		TQPoint bgOffset;
		TQt::BackgroundMode backgroundMode;
		TQPixmap fgPixmap;
		TQColor fgColor;
		TQColorGroup colorGroup;
		TQRect geometry;
		TQRect rect;
		TQPoint pos;
		TQPixmap icon;
		TQIconSet iconSet;
		TQString text;
		TQt::Orientation orientation;
		TQColor activeItemPaletteBgColor;
		TQPalette palette;
		int totalSteps;
		int currentStep;
		TQ_UINT32 tickMarkSetting;
		int tickInterval;
		int minSteps;
		int maxSteps;
		int startStep;
		int pageStep;
		int lineStep;
		int dlgVisibleButtons;
		DialogButtonSizeMap dlgVisibleSizeHints;
		TQString progressText;
		TQString textLabel;
		TQFont font;
		int percentageVisible;
		TQStyleControlElementDockWidgetData dwData;
		TQToolButton::TextPosition toolButtonTextPosition;
		int popupDelay;
		TQStyleControlElementTitleBarData titleBarData;
		TQStyleControlElementSpinWidgetData spinWidgetData;
		TQStyleControlElementGenericWidgetData parentWidgetData;
		TQStyleControlElementGenericWidgetData viewportData;
		TQStyleControlElementListViewData listViewData;
		TQStyleControlElementTabBarData tabBarData;
		TQStyleControlElementCheckListItemData checkListItemData;
		TQ_UINT32 comboBoxLineEditFlags;
		TQ_UINT32 frameStyle;
		TQRect sliderRect;
		TQPainter* activePainter;
		TQStyleControlElementToolBarWidgetData toolBarData;

	public:
		TQStyleControlElementData();
};

class Q_EXPORT TQStyleWidgetActionRequestData {
	public:
		TQStyleWidgetActionRequestData();
		TQStyleWidgetActionRequestData(int metric1, int metric2=0);
		TQStyleWidgetActionRequestData(TQPalette palette, bool informWidgets = FALSE, const char* className = 0);
		TQStyleWidgetActionRequestData(TQFont font, bool informWidgets = FALSE, const char* className = 0);
		TQStyleWidgetActionRequestData(TQRect rect);
		TQStyleWidgetActionRequestData(TQPaintEvent* paintEvent);
		~TQStyleWidgetActionRequestData();
	public:
		bool bool1;
		bool bool2;
		int metric1;
		int metric2;
		TQPalette palette;
		TQFont font;
		TQRect rect;
		const char * cstr;
		TQString string;
		TQPaintEvent * paintEvent;
};

typedef TQStyleWidgetActionRequestData TQStyleApplicationActionRequestData;

class Q_EXPORT TQStyle: public TQObject
{
    TQ_OBJECT

public:
    TQStyle();
    virtual ~TQStyle();

    enum ControlElementFlags {
	CEF_None			= 0x00000000,
	CEF_IsDefault			= 0x00000001,
	CEF_AutoDefault			= 0x00000002,
	CEF_IsActive			= 0x00000004,
	CEF_IsDown			= 0x00000008,
	CEF_IsOn			= 0x00000010,
	CEF_IsEnabled			= 0x00000020,
	CEF_BiState			= 0x00000040,
	CEF_HasFocus			= 0x00000080,
	CEF_IsMenuWidget		= 0x00000100,
	CEF_IsContainerEmpty		= 0x00000200,
	CEF_CenterIndicator		= 0x00000400,
	CEF_IndicatorFollowsStyle	= 0x00000800,
	CEF_UsesTextLabel		= 0x00001000,
	CEF_UsesBigPixmap		= 0x00002000,
	CEF_UseGenericParameters	= 0x00004000,
	CEF_HasParentWidget		= 0x00008000,
	CEF_HasPopupMenu		= 0x00010000,
	CEF_IsCheckable			= 0x00020000,
	CEF_HasFocusProxy		= 0x00040000,
	CEF_IsEditable			= 0x00080000,
	CEF_IsFlat			= 0x00100000,
	CEF_IsActiveWindow		= 0x00200000,
	CEF_IsTopLevel			= 0x00400000,
	CEF_IsVisible			= 0x00800000,
	CEF_HasMouse			= 0x01000000
    };

    // New TQStyle API - most of these should probably be pure virtual

    // Old API
    // DEPRECATED
    virtual void polish( TQWidget * );

    // New API
    virtual void polish( TQStyleControlElementData ceData, ControlElementFlags elementFlags, void * );

    // Old API
    // DEPRECATED
    virtual void unPolish( TQWidget * );

    // New API
    virtual void unPolish( TQStyleControlElementData ceData, ControlElementFlags elementFlags, void * );

    // Old API
    // DEPRECATED
    virtual void polish( TQApplication * );

    // New API
    virtual void applicationPolish( TQStyleControlElementData ceData, ControlElementFlags elementFlags, void * );

    // Old API
    // DEPRECATED
    virtual void unPolish( TQApplication * );

    // New API
    virtual void applicationUnPolish( TQStyleControlElementData ceData, ControlElementFlags elementFlags, void * );

    virtual void polish( TQPalette & );

    // Old API
    // DEPRECATED
    virtual void polishPopupMenu( TQPopupMenu* );

    // New API
    virtual void polishPopupMenu( TQStyleControlElementData ceData, ControlElementFlags elementFlags, void * ) = 0;

    virtual TQRect itemRect( TQPainter *p, const TQRect &r,
			    int flags, bool enabled,
			    const TQPixmap *pixmap,
			    const TQString &text, int len = -1 ) const;

    virtual void drawItem( TQPainter *p, const TQRect &r,
			   int flags, const TQColorGroup &g, bool enabled,
			   const TQPixmap *pixmap, const TQString &text,
			   int len = -1, const TQColor *penColor = 0 ) const;

    enum PrimitiveElement {
	PE_ButtonCommand,
	PE_ButtonDefault,
	PE_ButtonBevel,
	PE_ButtonTool,
	PE_ButtonDropDown,

	PE_FocusRect,

	PE_ArrowUp,
	PE_ArrowDown,
	PE_ArrowRight,
	PE_ArrowLeft,

	PE_SpinWidgetUp,
	PE_SpinWidgetDown,
	PE_SpinWidgetPlus,
	PE_SpinWidgetMinus,

	PE_Indicator,
	PE_IndicatorMask,
	PE_ExclusiveIndicator,
	PE_ExclusiveIndicatorMask,

	PE_DockWindowHandle,
	PE_DockWindowSeparator,
	PE_DockWindowResizeHandle,

	PE_Splitter,

	PE_Panel,
	PE_PanelPopup,
	PE_PanelMenuBar,
	PE_PanelDockWindow,

	PE_TabBarBase,

	PE_HeaderSection,
	PE_HeaderArrow,
	PE_StatusBarSection,

	PE_GroupBoxFrame,

	PE_Separator,

	PE_SizeGrip,

	PE_CheckMark,

	PE_ScrollBarAddLine,
	PE_ScrollBarSubLine,
	PE_ScrollBarAddPage,
	PE_ScrollBarSubPage,
	PE_ScrollBarSlider,
	PE_ScrollBarFirst,
	PE_ScrollBarLast,

	PE_ProgressBarChunk,

	PE_PanelLineEdit,
	PE_PanelTabWidget,

	PE_WindowFrame,

	PE_CheckListController,
	PE_CheckListIndicator,
	PE_CheckListExclusiveIndicator,

	PE_PanelGroupBox,
	PE_RubberBand,

	PE_HeaderSectionMenu,

	PE_PanelScrollBar,
	PE_MenuItemIndicatorFrame,
	PE_MenuItemIndicatorIconFrame,
	PE_MenuItemIndicatorCheck,

	// do not add any values below/greater this
	PE_CustomBase =			0xf000000
    };

    enum StyleFlags {
	Style_Default = 		0x00000000,
	Style_Enabled = 		0x00000001,
	Style_Raised =			0x00000002,
	Style_Sunken =	 		0x00000004,
	Style_Off =			0x00000008,
	Style_NoChange =		0x00000010,
	Style_On =			0x00000020,
	Style_Down =			0x00000040,
	Style_Horizontal =		0x00000080,
	Style_HasFocus =		0x00000100,
	Style_Top =			0x00000200,
	Style_Bottom =			0x00000400,
	Style_FocusAtBorder =		0x00000800,
	Style_AutoRaise =		0x00001000,
	Style_MouseOver =		0x00002000,
	Style_Up =			0x00004000,
	Style_Selected =	 	0x00008000,
	Style_Active =			0x00010000,
	Style_ButtonDefault =		0x00020000
    };
    typedef uint SFlags;

    // Old API
    // DEPRECATED
    virtual void drawPrimitive( PrimitiveElement pe,
				TQPainter *p,
				const TQRect &r,
				const TQColorGroup &cg,
				SFlags flags = Style_Default,
				const TQStyleOption& = TQStyleOption::Default ) const;

    // New API
    virtual void drawPrimitive( PrimitiveElement pe,
				TQPainter *p,
				TQStyleControlElementData ceData,
				ControlElementFlags elementFlags,
				const TQRect &r,
				const TQColorGroup &cg,
				SFlags flags = Style_Default,
				const TQStyleOption& = TQStyleOption::Default ) const = 0;


    enum ControlElement {
	CE_PushButton,
	CE_PushButtonLabel,

	CE_CheckBox,
	CE_CheckBoxLabel,

	CE_RadioButton,
	CE_RadioButtonLabel,

	CE_TabBarTab,
	CE_TabBarLabel,

	CE_ProgressBarGroove,
	CE_ProgressBarContents,
	CE_ProgressBarLabel,

	CE_PopupMenuItem,
	CE_MenuBarItem,

	CE_ToolButtonLabel,
	CE_MenuBarEmptyArea,
	CE_PopupMenuScroller,
	CE_DockWindowEmptyArea,
	CE_PopupMenuVerticalExtra,
	CE_PopupMenuHorizontalExtra,

	CE_ToolBoxTab,
	CE_HeaderLabel,

	// do not add any values below/greater than this
	CE_CustomBase =		0xf0000000
    };

    // Old API
    // DEPRECATED
    virtual void drawControl( ControlElement element,
			      TQPainter *p,
			      const TQWidget *widget,
			      const TQRect &r,
			      const TQColorGroup &cg,
			      SFlags how = Style_Default,
			      const TQStyleOption& = TQStyleOption::Default ) const;

    // New API
    virtual void drawControl( ControlElement element,
			      TQPainter *p,
			      TQStyleControlElementData ceData,
			      ControlElementFlags elementFlags,
			      const TQRect &r,
			      const TQColorGroup &cg,
			      SFlags how = Style_Default,
			      const TQStyleOption& = TQStyleOption::Default,
			      const TQWidget *widget = 0 /* compat, will likely go away */ ) const = 0;

    // Old API
    // DEPRECATED
    virtual void drawControlMask( ControlElement element,
				  TQPainter *p,
				  const TQWidget *widget,
				  const TQRect &r,
				  const TQStyleOption& = TQStyleOption::Default ) const;

    // New API
    virtual void drawControlMask( ControlElement element,
				  TQPainter *p,
				  TQStyleControlElementData ceData,
				  ControlElementFlags elementFlags,
				  const TQRect &r,
				  const TQStyleOption& = TQStyleOption::Default,
				  const TQWidget *widget = 0 /* compat, will likely go away */ ) const = 0;

    enum SubRect {
	SR_PushButtonContents,
	SR_PushButtonFocusRect,

	SR_CheckBoxIndicator,
	SR_CheckBoxContents,
	SR_CheckBoxFocusRect,

	SR_RadioButtonIndicator,
	SR_RadioButtonContents,
	SR_RadioButtonFocusRect,

	SR_ComboBoxFocusRect,

	SR_SliderFocusRect,

	SR_DockWindowHandleRect,

	SR_ProgressBarGroove,
	SR_ProgressBarContents,
	SR_ProgressBarLabel,

	SR_ToolButtonContents,

	SR_DialogButtonAccept,
	SR_DialogButtonReject,
	SR_DialogButtonApply,
	SR_DialogButtonHelp,
	SR_DialogButtonAll,
	SR_DialogButtonAbort,
	SR_DialogButtonIgnore,
	SR_DialogButtonRetry,
	SR_DialogButtonCustom,

	SR_ToolBoxTabContents,

	// do not add any values below/greater than this
	SR_CustomBase =		0xf0000000
    };

    // Old API
    // DEPRECATED
    virtual TQRect subRect( SubRect r, const TQWidget *widget ) const;

    // New API
    virtual TQRect subRect( SubRect r, const TQStyleControlElementData ceData, const ControlElementFlags elementFlags, const TQWidget *widget ) const = 0;


    enum ComplexControl{
	CC_SpinWidget,
	CC_ComboBox,
	CC_ScrollBar,
	CC_Slider,
	CC_ToolButton,
	CC_TitleBar,
	CC_ListView,

	// do not add any values below/greater than this
	CC_CustomBase =		0xf0000000
    };

    enum SubControl {
	SC_None =			0x00000000,

	SC_ScrollBarAddLine =		0x00000001,
	SC_ScrollBarSubLine =		0x00000002,
	SC_ScrollBarAddPage =		0x00000004,
	SC_ScrollBarSubPage =		0x00000008,
	SC_ScrollBarFirst =		0x00000010,
	SC_ScrollBarLast =		0x00000020,
	SC_ScrollBarSlider =		0x00000040,
	SC_ScrollBarGroove =		0x00000080,

	SC_SpinWidgetUp =		0x00000001,
	SC_SpinWidgetDown =		0x00000002,
	SC_SpinWidgetFrame =		0x00000004,
	SC_SpinWidgetEditField =	0x00000008,
	SC_SpinWidgetButtonField =	0x00000010,

	SC_ComboBoxFrame =		0x00000001,
	SC_ComboBoxEditField =		0x00000002,
	SC_ComboBoxArrow =		0x00000004,
	SC_ComboBoxListBoxPopup =	0x00000008,

	SC_SliderGroove =		0x00000001,
	SC_SliderHandle = 		0x00000002,
	SC_SliderTickmarks = 		0x00000004,

	SC_ToolButton =			0x00000001,
	SC_ToolButtonMenu =		0x00000002,

	SC_TitleBarLabel =		0x00000001,
	SC_TitleBarSysMenu =		0x00000002,
	SC_TitleBarMinButton =		0x00000004,
	SC_TitleBarMaxButton =		0x00000008,
	SC_TitleBarCloseButton =	0x00000010,
	SC_TitleBarNormalButton =	0x00000020,
	SC_TitleBarShadeButton =	0x00000040,
	SC_TitleBarUnshadeButton =	0x00000080,

	SC_ListView =			0x00000001,
	SC_ListViewBranch =		0x00000002,
	SC_ListViewExpand =		0x00000004,

	SC_All =			0xffffffff
    };
    typedef uint SCFlags;


    // Old API
    // DEPRECATED
    virtual void drawComplexControl( ComplexControl control,
				     TQPainter *p,
				     const TQWidget *widget,
				     const TQRect &r,
				     const TQColorGroup &cg,
				     SFlags how = Style_Default,
#ifdef Q_QDOC
				     SCFlags sub = SC_All,
#else
				     SCFlags sub = (uint)SC_All,
#endif
				     SCFlags subActive = SC_None,
				     const TQStyleOption& = TQStyleOption::Default ) const;

    virtual void drawComplexControl( ComplexControl control,
				     TQPainter *p,
				     TQStyleControlElementData ceData,
				     ControlElementFlags elementFlags,
				     const TQRect &r,
				     const TQColorGroup &cg,
				     SFlags how = Style_Default,
#ifdef Q_QDOC
				     SCFlags sub = SC_All,
#else
				     SCFlags sub = (uint)SC_All,
#endif
				     SCFlags subActive = SC_None,
				     const TQStyleOption& = TQStyleOption::Default,
				     const TQWidget *widget = 0 ) const = 0;

    // Old API
    // DEPRECATED
    virtual void drawComplexControlMask( ComplexControl control,
					 TQPainter *p,
					 const TQWidget *widget,
					 const TQRect &r,
					 const TQStyleOption& = TQStyleOption::Default ) const;

    // New API
    virtual void drawComplexControlMask( ComplexControl control,
					 TQPainter *p,
					 const TQStyleControlElementData ceData,
					 const ControlElementFlags elementFlags,
					 const TQRect &r,
					 const TQStyleOption& = TQStyleOption::Default,
					 const TQWidget *widget = 0 ) const = 0;

    // Old API
    // DEPRECATED
    virtual TQRect querySubControlMetrics( ComplexControl control,
					  const TQWidget *widget,
					  SubControl sc,
					  const TQStyleOption& = TQStyleOption::Default ) const;

    // New API
    virtual TQRect querySubControlMetrics( ComplexControl control,
					  TQStyleControlElementData ceData,
					  ControlElementFlags elementFlags,
					  SubControl sc,
					  const TQStyleOption& = TQStyleOption::Default,
					  const TQWidget *widget = 0 ) const = 0;

    // Old API
    // DEPRECATED
    virtual SubControl querySubControl( ComplexControl control,
					const TQWidget *widget,
					const TQPoint &pos,
					const TQStyleOption& = TQStyleOption::Default ) const;

    // New API
    virtual SubControl querySubControl( ComplexControl control,
					TQStyleControlElementData ceData,
					ControlElementFlags elementFlags,
					const TQPoint &pos,
					const TQStyleOption& = TQStyleOption::Default,
					const TQWidget *widget = 0 ) const = 0;


    enum PixelMetric {
	PM_ButtonMargin,
	PM_ButtonDefaultIndicator,
	PM_MenuButtonIndicator,
	PM_ButtonShiftHorizontal,
	PM_ButtonShiftVertical,

	PM_DefaultFrameWidth,
	PM_SpinBoxFrameWidth,

	PM_MaximumDragDistance,

	PM_ScrollBarExtent,
	PM_ScrollBarSliderMin,

	PM_SliderThickness,	       	// total slider thickness
	PM_SliderControlThickness,    	// thickness of the business part
	PM_SliderLength,		// total length of slider
	PM_SliderTickmarkOffset,	//
	PM_SliderSpaceAvailable,	// available space for slider to move

	PM_DockWindowSeparatorExtent,
	PM_DockWindowHandleExtent,
	PM_DockWindowFrameWidth,

	PM_MenuBarFrameWidth,

	PM_TabBarTabOverlap,
	PM_TabBarTabHSpace,
	PM_TabBarTabVSpace,
	PM_TabBarBaseHeight,
	PM_TabBarBaseOverlap,

	PM_ProgressBarChunkWidth,

	PM_SplitterWidth,
	PM_TitleBarHeight,

	PM_IndicatorWidth,
	PM_IndicatorHeight,
	PM_ExclusiveIndicatorWidth,
	PM_ExclusiveIndicatorHeight,
	PM_PopupMenuScrollerHeight,
	PM_CheckListButtonSize,
	PM_CheckListControllerSize,
	PM_PopupMenuFrameHorizontalExtra,
	PM_PopupMenuFrameVerticalExtra,

	PM_DialogButtonsSeparator,
	PM_DialogButtonsButtonWidth,
	PM_DialogButtonsButtonHeight,

	PM_MDIFrameWidth,
	PM_MDIMinimizedWidth,
	PM_HeaderMargin,
	PM_HeaderMarkSize,
	PM_HeaderGripMargin,
	PM_TabBarTabShiftHorizontal,
	PM_TabBarTabShiftVertical,
	PM_TabBarScrollButtonWidth,

	PM_MenuBarItemSpacing,
	PM_ToolBarItemSpacing,

	PM_MenuIndicatorFrameHBorder,
	PM_MenuIndicatorFrameVBorder,
	PM_MenuIconIndicatorFrameHBorder,
	PM_MenuIconIndicatorFrameVBorder,

	PM_ArrowSize,

	// do not add any values below/greater than this
	PM_CustomBase =		0xf0000000
    };

    // Old API
    // DEPRECATED
    virtual int pixelMetric( PixelMetric metric,
			     const TQWidget *widget = 0 ) const;

    // New API
    virtual int pixelMetric( PixelMetric metric,
			     TQStyleControlElementData ceData,
			     ControlElementFlags elementFlags,
			     const TQWidget *widget = 0 ) const = 0;


    enum ContentsType {
	CT_PushButton,
	CT_CheckBox,
	CT_RadioButton,
	CT_ToolButton,
	CT_ComboBox,
	CT_Splitter,
	CT_DockWindow,
	CT_ProgressBar,
	CT_PopupMenuItem,
	CT_TabBarTab,
	CT_Slider,
	CT_Header,
	CT_LineEdit,
	CT_MenuBar,
	CT_SpinBox,
	CT_SizeGrip,
	CT_TabWidget,
	CT_DialogButtons,

	// do not add any values below/greater than this
	CT_CustomBase =		0xf0000000
    };

    // Old API
    // DEPRECATED
    virtual TQSize sizeFromContents( ContentsType contents,
				    const TQWidget *widget,
				    const TQSize &contentsSize,
				    const TQStyleOption& = TQStyleOption::Default ) const;

    virtual TQSize sizeFromContents( ContentsType contents,
				    TQStyleControlElementData ceData,
				    ControlElementFlags elementFlags,
				    const TQSize &contentsSize,
				    const TQStyleOption& = TQStyleOption::Default,
				    const TQWidget *widget = 0 ) const = 0;

    enum StyleHint  {
	// ...
	// the general hints
	// ...
       	// disabled text should be etched, ala Windows
	SH_EtchDisabledText,

	// the GUI style enum, argh!
	SH_GUIStyle,

	// ...
	// widget specific hints
	// ...
	SH_ScrollBar_BackgroundMode,
	SH_ScrollBar_MiddleClickAbsolutePosition,
	SH_ScrollBar_ScrollWhenPointerLeavesControl,

	// TQEvent::Type - which mouse event to select a tab
	SH_TabBar_SelectMouseType,

	SH_TabBar_Alignment,

	SH_Header_ArrowAlignment,

	// bool - sliders snap to values while moving, ala Windows
	SH_Slider_SnapToValue,

	// bool - key presses handled in a sloppy manner - ie. left on a vertical
	// slider subtracts a line
	SH_Slider_SloppyKeyEvents,

	// bool - center button on progress dialogs, ala Motif, else right aligned
	// perhaps this should be a TQt::Alignment value
	SH_ProgressDialog_CenterCancelButton,

	// TQt::AlignmentFlags - text label alignment in progress dialogs
	// Center on windows, Auto|VCenter otherwize
	SH_ProgressDialog_TextLabelAlignment,

	// bool - right align buttons on print dialog, ala Windows
	SH_PrintDialog_RightAlignButtons,

	// bool - 1 or 2 pixel space between the menubar and the dockarea, ala Windows
	// this *REALLY* needs a better name
	SH_MainWindow_SpaceBelowMenuBar,

	// bool - select the text in the line edit about the listbox when selecting
	// an item from the listbox, or when the line edit receives focus, ala Windows
	SH_FontDialog_SelectAssociatedText,

	// bool - allows disabled menu items to be active
	SH_PopupMenu_AllowActiveAndDisabled,

	// bool - pressing space activates item, ala Motif
	SH_PopupMenu_SpaceActivatesItem,

	// int - number of milliseconds to wait before opening a submenu
	// 256 on windows, 96 on motif
	SH_PopupMenu_SubMenuPopupDelay,

	// bool - should scrollviews draw their frame only around contents (ala Motif),
	// or around contents, scrollbars and corner widgets (ala Windows) ?
	SH_ScrollView_FrameOnlyAroundContents,

	// bool - menubars items are navigatable by pressing alt, followed by using
	// the arrow keys to select the desired item
	SH_MenuBar_AltKeyNavigation,

	// bool - mouse tracking in combobox dropdown lists
	SH_ComboBox_ListMouseTracking,

	// bool - mouse tracking in popupmenus
	SH_PopupMenu_MouseTracking,

	// bool - mouse tracking in menubars
	SH_MenuBar_MouseTracking,

	// bool - gray out selected items when loosing focus
	SH_ItemView_ChangeHighlightOnFocus,

	// bool - supports shared activation among modeless widgets
	SH_Widget_ShareActivation,

	// bool - workspace should just maximize the client area
	SH_Workspace_FillSpaceOnMaximize,

	// bool - supports popup menu comboboxes
	SH_ComboBox_Popup,

	// bool - titlebar has no border
	SH_TitleBar_NoBorder,

	// bool - stop scrollbar at mouse
	SH_ScrollBar_StopMouseOverSlider,

	//bool - blink cursort with selected text
	SH_BlinkCursorWhenTextSelected,

	//bool - richtext selections extend the full width of the docuemnt
	SH_RichText_FullWidthSelection,

	//bool - popupmenu supports scrolling instead of multicolumn mode
	SH_PopupMenu_Scrollable,

	// TQt::AlignmentFlags - text label vertical alignment in groupboxes
	// Center on windows, Auto|VCenter otherwize
	SH_GroupBox_TextLabelVerticalAlignment,

	// TQt::TQRgb - text label color in groupboxes
	SH_GroupBox_TextLabelColor,

	// bool - popupmenu supports sloppy submenus
	SH_PopupMenu_SloppySubMenus,

	// TQt::TQRgb - table grid color
	SH_Table_GridLineColor,

	// TQChar - Unicode character for password char
	SH_LineEdit_PasswordCharacter,

	// TQDialogButtons::Button - default button
	SH_DialogButtons_DefaultButton,

	// TQToolBox - Boldness of the selected page title
	SH_ToolBox_SelectedPageTitleBold,

	//bool - if a tabbar prefers not to have scroller arrows
	SH_TabBar_PreferNoArrows,

	//bool - if left button should cause an absolute position
	SH_ScrollBar_LeftClickAbsolutePosition,

	// TQEvent::Type - which mouse event to select a list view expansion
	SH_ListViewExpand_SelectMouseType,

	//bool - if underline for accelerators
	SH_UnderlineAccelerator,

	// bool - TQToolButton - if tool buttons should use a 3D frame
	// when the mouse is over the button
	SH_ToolButton_Uses3D,

	// bool - hide underlined accelerators uless Alt key is currently down
	SH_HideUnderlineAcceleratorWhenAltUp,

	// int - width of menu check column
	SH_MenuIndicatorColumnWidth,

	// do not add any values below/greater than this
	SH_CustomBase =		0xf0000000
    };

    // Old API
    // DEPRECATED
    virtual int styleHint( StyleHint stylehint,
			   const TQWidget *widget = 0,
			   const TQStyleOption& = TQStyleOption::Default,
			   TQStyleHintReturn* returnData = 0
			   ) const;

    // New API
    virtual int styleHint( StyleHint stylehint,
			   TQStyleControlElementData ceData,
			   ControlElementFlags elementFlags,
			   const TQStyleOption& = TQStyleOption::Default,
			   TQStyleHintReturn* returnData = 0,
			   const TQWidget *widget = 0
			   ) const = 0;


    enum StylePixmap {
	SP_TitleBarMinButton,
	SP_TitleBarMaxButton,
	SP_TitleBarCloseButton,
	SP_TitleBarNormalButton,
	SP_TitleBarShadeButton,
	SP_TitleBarUnshadeButton,
	SP_DockWindowCloseButton,
	SP_MessageBoxInformation,
	SP_MessageBoxWarning,
	SP_MessageBoxCritical,
	SP_MessageBoxQuestion,

	// do not add any values below/greater than this
	SP_CustomBase =		0xf0000000
    };

    // Old API
    // DEPRECATED
    virtual TQPixmap stylePixmap( StylePixmap stylepixmap,
				 const TQWidget *widget = 0,
				 const TQStyleOption& = TQStyleOption::Default ) const;

    virtual TQPixmap stylePixmap( StylePixmap stylepixmap,
				 TQStyleControlElementData ceData,
				 ControlElementFlags elementFlags,
				 const TQStyleOption& = TQStyleOption::Default,
				 const TQWidget *widget = 0 ) const = 0;


    // Old API
    // DEPRECATED
    static TQRect visualRect( const TQRect &logical, const TQWidget *w );

    // New API
    static TQRect visualRect( const TQRect &logical, const TQStyleControlElementData ceData, const ControlElementFlags elementFlags );

    static TQRect visualRect( const TQRect &logical, const TQRect &bounding );


    // Object event handling API
    typedef TQMap<void*, TQStyle*> ObjectEventSourceToHandlerMap;
    typedef TQMap<void*, TQStyleControlElementData> ObjectEventSourceDataToHandlerMap;
    typedef TQMap<void*, ControlElementFlags> ObjectEventSourceFlagsToHandlerMap;
    typedef bool (*EventHandlerInstallationHook)(TQStyleControlElementData ceData, ControlElementFlags elementFlags, void* source, TQStyle* handler);
    typedef bool (*EventHandlerRemovalHook)(TQStyleControlElementData ceData, ControlElementFlags elementFlags, void* source, TQStyle* handler);
    void installObjectEventHandler( TQStyleControlElementData ceData, ControlElementFlags elementFlags, void* source, TQStyle* handler );
    void removeObjectEventHandler( TQStyleControlElementData ceData, ControlElementFlags elementFlags, void* source, TQStyle* handler );
    void setEventHandlerInstallationHook( EventHandlerInstallationHook );
    void setEventHandlerRemovalHook( EventHandlerRemovalHook hook );
    virtual bool objectEventHandler( TQStyleControlElementData ceData, ControlElementFlags elementFlags, void* source, TQEvent *e );

    enum WidgetActionRequest {
	WAR_Repaint,
	WAR_RepaintRect,
	WAR_EnableMouseTracking,
	WAR_DisableMouseTracking,
	WAR_SetAutoMask,
	WAR_UnSetAutoMask,
	WAR_SetCheckable,
	WAR_UnSetCheckable,
	WAR_FrameSetStyle,
	WAR_FrameSetLineWidth,
	WAR_SetLayoutMargin,
	WAR_SetPalette,
	WAR_SetBackgroundMode,
	WAR_SetBackgroundOrigin,
	WAR_SetFont,
	WAR_RepaintAllAccelerators,
	WAR_SetDefault,
	WAR_UnSetDefault,
	WAR_SendPaintEvent
    };

    typedef bool (*WidgetActionRequestHook)(TQStyleControlElementData ceData, ControlElementFlags elementFlags, void* source, WidgetActionRequest request, TQStyleWidgetActionRequestData requestData);
    void setWidgetActionRequestHook( WidgetActionRequestHook );
    virtual bool widgetActionRequest( TQStyleControlElementData ceData, ControlElementFlags elementFlags, void* source, WidgetActionRequest request, TQStyleWidgetActionRequestData requestData = TQStyleWidgetActionRequestData() );

    enum ApplicationActionRequest {
	AAR_SetPalette,
	AAR_SetFont
    };

    typedef bool (*ApplicationActionRequestHook)(TQStyleControlElementData ceData, ControlElementFlags elementFlags, void* source, ApplicationActionRequest request, TQStyleApplicationActionRequestData requestData);
    void setApplicationActionRequestHook( ApplicationActionRequestHook );
    virtual bool applicationActionRequest( TQStyleControlElementData ceData, ControlElementFlags elementFlags, void* source, ApplicationActionRequest request, TQStyleApplicationActionRequestData requestData = TQStyleApplicationActionRequestData() );

    // Old 2.x TQStyle API

#ifndef QT_NO_COMPAT
    int defaultFrameWidth() const
    {
	return pixelMetric( PM_DefaultFrameWidth, TQStyleControlElementData(), CEF_None );
    }
    void tabbarMetrics( const TQWidget* t,
			int& hf, int& vf, int& ov ) const
    {
	hf = pixelMetric( PM_TabBarTabHSpace, TQStyleControlElementData(), CEF_None, t );
	vf = pixelMetric( PM_TabBarTabVSpace, TQStyleControlElementData(), CEF_None, t );
	ov = pixelMetric( PM_TabBarBaseOverlap, TQStyleControlElementData(), CEF_None, t );
    }
    TQSize scrollBarExtent() const
    {
	return TQSize(pixelMetric(PM_ScrollBarExtent, TQStyleControlElementData(), CEF_None),
		     pixelMetric(PM_ScrollBarExtent, TQStyleControlElementData(), CEF_None));
    }
#endif

public:
    virtual bool eventFilter( TQObject *, TQEvent * );
    bool acceleratorsShown() const;

protected:
    void acceleratorKeypressEventMonitor( TQObject *, TQEvent * );

private:
    TQStylePrivate * d;

#if defined(TQ_DISABLE_COPY)
    TQStyle( const TQStyle & );
    TQStyle& operator=( const TQStyle & );
#endif

    EventHandlerInstallationHook m_eventHandlerInstallationHook;
    EventHandlerRemovalHook m_eventHandlerRemovalHook;
    WidgetActionRequestHook m_widgetActionRequestHook;
    ApplicationActionRequestHook m_applicationActionRequestHook;
    ObjectEventSourceToHandlerMap m_objectEventSourceToHandlerMap;
    ObjectEventSourceDataToHandlerMap m_objectEventSourceDataToHandlerMap;
    ObjectEventSourceFlagsToHandlerMap m_objectEventSourceFlagsToHandlerMap;
    bool conditionalAcceleratorsEnabled;
};

inline TQStyle::ControlElementFlags operator|(const TQStyle::ControlElementFlags a, const TQStyle::ControlElementFlags b) { return static_cast<TQStyle::ControlElementFlags>(static_cast<int>(a) | static_cast<int>(b)); }
// inline TQStyle::ControlElementFlags operator|=(TQStyle::ControlElementFlags &a, const TQStyle::ControlElementFlags b) { a = static_cast<TQStyle::ControlElementFlags>(static_cast<int>(a) | static_cast<int>(b)); return a; }

Q_EXPORT TQStyleControlElementData populateControlElementDataFromWidget(const TQWidget* widget, const TQStyleOption& opt, bool populateReliantFields=true);
Q_EXPORT TQStyleControlElementData populateControlElementDataFromApplication(const TQApplication* app, const TQStyleOption& opt, bool populateReliantFields=true);
Q_EXPORT TQStyle::ControlElementFlags getControlElementFlagsForObject(const TQObject* object, TQStringList objectTypeList, const TQStyleOption& opt, bool populateReliantFields=true);
Q_EXPORT TQStringList getObjectTypeListForObject(const TQObject* object);

#endif // QT_NO_STYLE
#endif // TQSTYLE_H