gecko-dev/layout/xul/nsSprocketLayout.h

143 строки
4.9 KiB
C
Исходник Обычный вид История

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2012-05-21 15:12:37 +04:00
/* 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/. */
2000-03-31 11:02:06 +04:00
#ifndef nsSprocketLayout_h___
#define nsSprocketLayout_h___
#include "mozilla/Attributes.h"
2000-03-31 11:02:06 +04:00
#include "nsBoxLayout.h"
#include "nsCOMPtr.h"
#include "nsIFrame.h"
2000-03-31 11:02:06 +04:00
class nsBoxSize
{
public:
nsBoxSize();
nscoord pref;
nscoord min;
nscoord max;
nscoord flex;
nscoord left;
nscoord right;
bool collapsed;
bool bogus;
2000-03-31 11:02:06 +04:00
nsBoxSize* next;
void* operator new(size_t sz, nsBoxLayoutState& aState) CPP_THROW_NEW;
void operator delete(void* aPtr, size_t sz);
2000-03-31 11:02:06 +04:00
};
class nsComputedBoxSize
{
public:
nsComputedBoxSize();
nscoord size;
bool valid;
bool resized;
2000-03-31 11:02:06 +04:00
nsComputedBoxSize* next;
void* operator new(size_t sz, nsBoxLayoutState& aState) CPP_THROW_NEW;
void operator delete(void* aPtr, size_t sz);
};
2000-03-31 11:02:06 +04:00
#define GET_WIDTH(size, isHorizontal) (isHorizontal ? size.width : size.height)
#define GET_HEIGHT(size, isHorizontal) (isHorizontal ? size.height : size.width)
#define GET_X(size, isHorizontal) (isHorizontal ? size.x : size.y)
#define GET_Y(size, isHorizontal) (isHorizontal ? size.y : size.x)
#define GET_COORD(aX, aY, isHorizontal) (isHorizontal ? aX : aY)
#define SET_WIDTH(size, coord, isHorizontal) if (isHorizontal) { (size).width = (coord); } else { (size).height = (coord); }
#define SET_HEIGHT(size, coord, isHorizontal) if (isHorizontal) { (size).height = (coord); } else { (size).width = (coord); }
#define SET_X(size, coord, isHorizontal) if (isHorizontal) { (size).x = (coord); } else { (size).y = (coord); }
#define SET_Y(size, coord, isHorizontal) if (isHorizontal) { (size).y = (coord); } else { (size).x = (coord); }
#define SET_COORD(aX, aY, coord, isHorizontal) if (isHorizontal) { aX = (coord); } else { aY = (coord); }
2011-07-11 18:05:10 +04:00
nsresult NS_NewSprocketLayout(nsIPresShell* aPresShell, nsCOMPtr<nsBoxLayout>& aNewLayout);
2000-03-31 11:02:06 +04:00
class nsSprocketLayout : public nsBoxLayout {
public:
2011-07-11 18:05:10 +04:00
friend nsresult NS_NewSprocketLayout(nsIPresShell* aPresShell, nsCOMPtr<nsBoxLayout>& aNewLayout);
static void Shutdown();
2000-03-31 11:02:06 +04:00
NS_IMETHOD Layout(nsIFrame* aBox, nsBoxLayoutState& aState) MOZ_OVERRIDE;
2000-03-31 11:02:06 +04:00
virtual nsSize GetPrefSize(nsIFrame* aBox, nsBoxLayoutState& aBoxLayoutState) MOZ_OVERRIDE;
virtual nsSize GetMinSize(nsIFrame* aBox, nsBoxLayoutState& aBoxLayoutState) MOZ_OVERRIDE;
virtual nsSize GetMaxSize(nsIFrame* aBox, nsBoxLayoutState& aBoxLayoutState) MOZ_OVERRIDE;
virtual nscoord GetAscent(nsIFrame* aBox, nsBoxLayoutState& aBoxLayoutState) MOZ_OVERRIDE;
2000-03-31 11:02:06 +04:00
nsSprocketLayout();
2000-03-31 11:02:06 +04:00
static bool IsHorizontal(nsIFrame* aBox);
static void SetLargestSize(nsSize& aSize1, const nsSize& aSize2, bool aIsHorizontal);
static void SetSmallestSize(nsSize& aSize1, const nsSize& aSize2, bool aIsHorizontal);
static void AddLargestSize(nsSize& aSize, const nsSize& aSizeToAdd, bool aIsHorizontal);
static void AddSmallestSize(nsSize& aSize, const nsSize& aSizeToAdd, bool aIsHorizontal);
static void AddCoord(nscoord& aCoord, nscoord aCoordToAdd);
2000-03-31 11:02:06 +04:00
protected:
void ComputeChildsNextPosition(nsIFrame* aBox,
const nscoord& aCurX,
const nscoord& aCurY,
nscoord& aNextX,
nscoord& aNextY,
const nsRect& aChildSize);
void ChildResized(nsIFrame* aBox,
nsBoxLayoutState& aState,
nsIFrame* aChild,
nsBoxSize* aChildBoxSize,
nsComputedBoxSize* aChildComputedBoxSize,
nsBoxSize* aBoxSizes,
nsComputedBoxSize* aComputedBoxSizes,
const nsRect& aChildLayoutRect,
nsRect& aChildActualRect,
nsRect& aContainingRect,
int32_t aFlexes,
bool& aFinished);
2000-03-31 11:02:06 +04:00
void AlignChildren(nsIFrame* aBox,
nsBoxLayoutState& aState);
virtual void ComputeChildSizes(nsIFrame* aBox,
nsBoxLayoutState& aState,
2000-03-31 11:02:06 +04:00
nscoord& aGivenSize,
nsBoxSize* aBoxSizes,
nsComputedBoxSize*& aComputedBoxSizes);
2000-03-31 11:02:06 +04:00
virtual void PopulateBoxSizes(nsIFrame* aBox, nsBoxLayoutState& aBoxLayoutState,
nsBoxSize*& aBoxSizes, nscoord& aMinSize,
nscoord& aMaxSize, int32_t& aFlexes);
2000-03-31 11:02:06 +04:00
virtual void InvalidateComputedSizes(nsComputedBoxSize* aComputedBoxSizes);
virtual bool GetDefaultFlex(int32_t& aFlex);
2000-03-31 11:02:06 +04:00
virtual void GetFrameState(nsIFrame* aBox, nsFrameState& aState);
2000-03-31 11:02:06 +04:00
private:
// because the sprocket layout manager has no instance variables. We
2011-07-11 18:05:10 +04:00
// can make a static one and reuse it everywhere.
static nsBoxLayout* gInstance;
2000-03-31 11:02:06 +04:00
};
#endif