layout/tables/nsTableRowGroupFrame.h

Fri, 16 Jan 2015 04:50:19 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Fri, 16 Jan 2015 04:50:19 +0100
branch
TOR_BUG_9701
changeset 13
44a2da4a2ab2
permissions
-rw-r--r--

Replace accessor implementation with direct member state manipulation, by
request https://trac.torproject.org/projects/tor/ticket/9701#comment:32

michael@0 1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
michael@0 2 /* This Source Code Form is subject to the terms of the Mozilla Public
michael@0 3 * License, v. 2.0. If a copy of the MPL was not distributed with this
michael@0 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
michael@0 5 #ifndef nsTableRowGroupFrame_h__
michael@0 6 #define nsTableRowGroupFrame_h__
michael@0 7
michael@0 8 #include "mozilla/Attributes.h"
michael@0 9 #include "nscore.h"
michael@0 10 #include "nsContainerFrame.h"
michael@0 11 #include "nsIAtom.h"
michael@0 12 #include "nsILineIterator.h"
michael@0 13 #include "nsTablePainter.h"
michael@0 14 #include "nsTArray.h"
michael@0 15
michael@0 16 class nsTableFrame;
michael@0 17 class nsTableRowFrame;
michael@0 18 class nsTableCellFrame;
michael@0 19
michael@0 20 struct nsRowGroupReflowState {
michael@0 21 const nsHTMLReflowState& reflowState; // Our reflow state
michael@0 22
michael@0 23 nsTableFrame* tableFrame;
michael@0 24
michael@0 25 // The available size (computed from the parent)
michael@0 26 nsSize availSize;
michael@0 27
michael@0 28 // Running y-offset
michael@0 29 nscoord y;
michael@0 30
michael@0 31 nsRowGroupReflowState(const nsHTMLReflowState& aReflowState,
michael@0 32 nsTableFrame* aTableFrame)
michael@0 33 :reflowState(aReflowState), tableFrame(aTableFrame)
michael@0 34 {
michael@0 35 availSize.width = reflowState.AvailableWidth();
michael@0 36 availSize.height = reflowState.AvailableHeight();
michael@0 37 y = 0;
michael@0 38 }
michael@0 39
michael@0 40 ~nsRowGroupReflowState() {}
michael@0 41 };
michael@0 42
michael@0 43 #define MIN_ROWS_NEEDING_CURSOR 20
michael@0 44
michael@0 45 /**
michael@0 46 * nsTableRowGroupFrame is the frame that maps row groups
michael@0 47 * (HTML tags THEAD, TFOOT, and TBODY). This class cannot be reused
michael@0 48 * outside of an nsTableFrame. It assumes that its parent is an nsTableFrame, and
michael@0 49 * its children are nsTableRowFrames.
michael@0 50 *
michael@0 51 * @see nsTableFrame
michael@0 52 * @see nsTableRowFrame
michael@0 53 */
michael@0 54 class nsTableRowGroupFrame
michael@0 55 : public nsContainerFrame
michael@0 56 , public nsILineIterator
michael@0 57 {
michael@0 58 public:
michael@0 59 NS_DECL_QUERYFRAME_TARGET(nsTableRowGroupFrame)
michael@0 60 NS_DECL_QUERYFRAME
michael@0 61 NS_DECL_FRAMEARENA_HELPERS
michael@0 62
michael@0 63 /** instantiate a new instance of nsTableRowFrame.
michael@0 64 * @param aPresShell the pres shell for this frame
michael@0 65 *
michael@0 66 * @return the frame that was created
michael@0 67 */
michael@0 68 friend nsIFrame* NS_NewTableRowGroupFrame(nsIPresShell* aPresShell, nsStyleContext* aContext);
michael@0 69 virtual ~nsTableRowGroupFrame();
michael@0 70
michael@0 71 virtual void DestroyFrom(nsIFrame* aDestructRoot) MOZ_OVERRIDE;
michael@0 72
michael@0 73 /** @see nsIFrame::DidSetStyleContext */
michael@0 74 virtual void DidSetStyleContext(nsStyleContext* aOldStyleContext) MOZ_OVERRIDE;
michael@0 75
michael@0 76 virtual nsresult AppendFrames(ChildListID aListID,
michael@0 77 nsFrameList& aFrameList) MOZ_OVERRIDE;
michael@0 78
michael@0 79 virtual nsresult InsertFrames(ChildListID aListID,
michael@0 80 nsIFrame* aPrevFrame,
michael@0 81 nsFrameList& aFrameList) MOZ_OVERRIDE;
michael@0 82
michael@0 83 virtual nsresult RemoveFrame(ChildListID aListID,
michael@0 84 nsIFrame* aOldFrame) MOZ_OVERRIDE;
michael@0 85
michael@0 86 virtual nsMargin GetUsedMargin() const MOZ_OVERRIDE;
michael@0 87 virtual nsMargin GetUsedBorder() const MOZ_OVERRIDE;
michael@0 88 virtual nsMargin GetUsedPadding() const MOZ_OVERRIDE;
michael@0 89
michael@0 90 virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
michael@0 91 const nsRect& aDirtyRect,
michael@0 92 const nsDisplayListSet& aLists) MOZ_OVERRIDE;
michael@0 93
michael@0 94 /** calls Reflow for all of its child rows.
michael@0 95 * Rows are all set to the same width and stacked vertically.
michael@0 96 * <P> rows are not split unless absolutely necessary.
michael@0 97 *
michael@0 98 * @param aDesiredSize width set to width of rows, height set to
michael@0 99 * sum of height of rows that fit in aMaxSize.height.
michael@0 100 *
michael@0 101 * @see nsIFrame::Reflow
michael@0 102 */
michael@0 103 virtual nsresult Reflow(nsPresContext* aPresContext,
michael@0 104 nsHTMLReflowMetrics& aDesiredSize,
michael@0 105 const nsHTMLReflowState& aReflowState,
michael@0 106 nsReflowStatus& aStatus) MOZ_OVERRIDE;
michael@0 107
michael@0 108 virtual bool UpdateOverflow() MOZ_OVERRIDE;
michael@0 109
michael@0 110 /**
michael@0 111 * Get the "type" of the frame
michael@0 112 *
michael@0 113 * @see nsGkAtoms::tableRowGroupFrame
michael@0 114 */
michael@0 115 virtual nsIAtom* GetType() const MOZ_OVERRIDE;
michael@0 116
michael@0 117 nsTableRowFrame* GetFirstRow();
michael@0 118
michael@0 119 #ifdef DEBUG_FRAME_DUMP
michael@0 120 virtual nsresult GetFrameName(nsAString& aResult) const MOZ_OVERRIDE;
michael@0 121 #endif
michael@0 122
michael@0 123 /** return the number of child rows (not necessarily == number of child frames) */
michael@0 124 int32_t GetRowCount();
michael@0 125
michael@0 126 /** return the table-relative row index of the first row in this rowgroup.
michael@0 127 * if there are no rows, -1 is returned.
michael@0 128 */
michael@0 129 int32_t GetStartRowIndex();
michael@0 130
michael@0 131 /** Adjust the row indices of all rows whose index is >= aRowIndex.
michael@0 132 * @param aRowIndex - start adjusting with this index
michael@0 133 * @param aAdjustment - shift the row index by this amount
michael@0 134 */
michael@0 135 void AdjustRowIndices(int32_t aRowIndex,
michael@0 136 int32_t anAdjustment);
michael@0 137
michael@0 138 /**
michael@0 139 * Used for header and footer row group frames that are repeated when
michael@0 140 * splitting a table frame.
michael@0 141 *
michael@0 142 * Performs any table specific initialization
michael@0 143 *
michael@0 144 * @param aHeaderFooterFrame the original header or footer row group frame
michael@0 145 * that was repeated
michael@0 146 */
michael@0 147 nsresult InitRepeatedFrame(nsPresContext* aPresContext,
michael@0 148 nsTableRowGroupFrame* aHeaderFooterFrame);
michael@0 149
michael@0 150
michael@0 151 /**
michael@0 152 * Get the total height of all the row rects
michael@0 153 */
michael@0 154 nscoord GetHeightBasis(const nsHTMLReflowState& aReflowState);
michael@0 155
michael@0 156 nsMargin* GetBCBorderWidth(nsMargin& aBorder);
michael@0 157
michael@0 158 /**
michael@0 159 * Gets inner border widths before collapsing with cell borders
michael@0 160 * Caller must get top border from previous row group or from table
michael@0 161 * GetContinuousBCBorderWidth will not overwrite aBorder.top
michael@0 162 * see nsTablePainter about continuous borders
michael@0 163 */
michael@0 164 void GetContinuousBCBorderWidth(nsMargin& aBorder);
michael@0 165 /**
michael@0 166 * Sets full border widths before collapsing with cell borders
michael@0 167 * @param aForSide - side to set; only right, left, and bottom valid
michael@0 168 */
michael@0 169 void SetContinuousBCBorderWidth(uint8_t aForSide,
michael@0 170 BCPixelSize aPixelValue);
michael@0 171 /**
michael@0 172 * Adjust to the effect of visibibility:collapse on the row group and
michael@0 173 * its children
michael@0 174 * @return additional shift upward that should be applied to
michael@0 175 * subsequent rowgroups due to rows and this rowgroup
michael@0 176 * being collapsed
michael@0 177 * @param aYTotalOffset the total amount that the rowgroup is shifted up
michael@0 178 * @param aWidth new width of the rowgroup
michael@0 179 */
michael@0 180 nscoord CollapseRowGroupIfNecessary(nscoord aYTotalOffset,
michael@0 181 nscoord aWidth);
michael@0 182
michael@0 183 // nsILineIterator methods
michael@0 184 public:
michael@0 185 virtual void DisposeLineIterator() MOZ_OVERRIDE { }
michael@0 186
michael@0 187 // The table row is the equivalent to a line in block layout.
michael@0 188 // The nsILineIterator assumes that a line resides in a block, this role is
michael@0 189 // fullfilled by the row group. Rows in table are counted relative to the
michael@0 190 // table. The row index of row corresponds to the cellmap coordinates. The
michael@0 191 // line index with respect to a row group can be computed by substracting the
michael@0 192 // row index of the first row in the row group.
michael@0 193
michael@0 194 /** Get the number of rows in a row group
michael@0 195 * @return the number of lines in a row group
michael@0 196 */
michael@0 197 virtual int32_t GetNumLines() MOZ_OVERRIDE;
michael@0 198
michael@0 199 /** @see nsILineIterator.h GetDirection
michael@0 200 * @return true if the table is rtl
michael@0 201 */
michael@0 202 virtual bool GetDirection() MOZ_OVERRIDE;
michael@0 203
michael@0 204 /** Return structural information about a line.
michael@0 205 * @param aLineNumber - the index of the row relative to the row group
michael@0 206 * If the line-number is invalid then
michael@0 207 * aFirstFrameOnLine will be nullptr and
michael@0 208 * aNumFramesOnLine will be zero.
michael@0 209 * @param aFirstFrameOnLine - the first cell frame that originates in row
michael@0 210 * with a rowindex that matches a line number
michael@0 211 * @param aNumFramesOnLine - return the numbers of cells originating in
michael@0 212 * this row
michael@0 213 * @param aLineBounds - rect of the row
michael@0 214 * @param aLineFlags - unused set to 0
michael@0 215 */
michael@0 216 NS_IMETHOD GetLine(int32_t aLineNumber,
michael@0 217 nsIFrame** aFirstFrameOnLine,
michael@0 218 int32_t* aNumFramesOnLine,
michael@0 219 nsRect& aLineBounds,
michael@0 220 uint32_t* aLineFlags) MOZ_OVERRIDE;
michael@0 221
michael@0 222 /** Given a frame that's a child of the rowgroup, find which line its on.
michael@0 223 * @param aFrame - frame, should be a row
michael@0 224 * @param aStartLine - minimal index to return
michael@0 225 * @return row index relative to the row group if this a row
michael@0 226 * frame and the index is at least aStartLine.
michael@0 227 * -1 if the frame cannot be found.
michael@0 228 */
michael@0 229 virtual int32_t FindLineContaining(nsIFrame* aFrame, int32_t aStartLine = 0) MOZ_OVERRIDE;
michael@0 230
michael@0 231 /** Find the orginating cell frame on a row that is the nearest to the
michael@0 232 * coordinate X.
michael@0 233 * @param aLineNumber - the index of the row relative to the row group
michael@0 234 * @param aX - X coordinate in twips relative to the
michael@0 235 * origin of the row group
michael@0 236 * @param aFrameFound - pointer to the cellframe
michael@0 237 * @param aXIsBeforeFirstFrame - the point is before the first originating
michael@0 238 * cellframe
michael@0 239 * @param aXIsAfterLastFrame - the point is after the last originating
michael@0 240 * cellframe
michael@0 241 */
michael@0 242 NS_IMETHOD FindFrameAt(int32_t aLineNumber,
michael@0 243 nscoord aX,
michael@0 244 nsIFrame** aFrameFound,
michael@0 245 bool* aXIsBeforeFirstFrame,
michael@0 246 bool* aXIsAfterLastFrame) MOZ_OVERRIDE;
michael@0 247
michael@0 248 /** Check whether visual and logical order of cell frames within a line are
michael@0 249 * identical. As the layout will reorder them this is always the case
michael@0 250 * @param aLine - the index of the row relative to the table
michael@0 251 * @param aIsReordered - returns false
michael@0 252 * @param aFirstVisual - if the table is rtl first originating cell frame
michael@0 253 * @param aLastVisual - if the table is rtl last originating cell frame
michael@0 254 */
michael@0 255
michael@0 256 NS_IMETHOD CheckLineOrder(int32_t aLine,
michael@0 257 bool *aIsReordered,
michael@0 258 nsIFrame **aFirstVisual,
michael@0 259 nsIFrame **aLastVisual) MOZ_OVERRIDE;
michael@0 260
michael@0 261 /** Find the next originating cell frame that originates in the row.
michael@0 262 * @param aFrame - cell frame to start with, will return the next cell
michael@0 263 * originating in a row
michael@0 264 * @param aLineNumber - the index of the row relative to the table
michael@0 265 */
michael@0 266 NS_IMETHOD GetNextSiblingOnLine(nsIFrame*& aFrame, int32_t aLineNumber) MOZ_OVERRIDE;
michael@0 267
michael@0 268 // row cursor methods to speed up searching for the row(s)
michael@0 269 // containing a point. The basic idea is that we set the cursor
michael@0 270 // property if the rows' y and yMosts are non-decreasing (considering only
michael@0 271 // rows with nonempty overflowAreas --- empty overflowAreas never participate
michael@0 272 // in event handling or painting), and the rowgroup has sufficient number of
michael@0 273 // rows. The cursor property points to a "recently used" row. If we get a
michael@0 274 // series of requests that work on rows "near" the cursor, then we can find
michael@0 275 // those nearby rows quickly by starting our search at the cursor.
michael@0 276 // This code is based on the line cursor code in nsBlockFrame. It's more general
michael@0 277 // though, and could be extracted and used elsewhere.
michael@0 278 struct FrameCursorData {
michael@0 279 nsTArray<nsIFrame*> mFrames;
michael@0 280 uint32_t mCursorIndex;
michael@0 281 nscoord mOverflowAbove;
michael@0 282 nscoord mOverflowBelow;
michael@0 283
michael@0 284 FrameCursorData()
michael@0 285 : mFrames(MIN_ROWS_NEEDING_CURSOR), mCursorIndex(0), mOverflowAbove(0),
michael@0 286 mOverflowBelow(0) {}
michael@0 287
michael@0 288 bool AppendFrame(nsIFrame* aFrame);
michael@0 289
michael@0 290 void FinishBuildingCursor() {
michael@0 291 mFrames.Compact();
michael@0 292 }
michael@0 293 };
michael@0 294
michael@0 295 // Clear out row cursor because we're disturbing the rows (e.g., Reflow)
michael@0 296 void ClearRowCursor();
michael@0 297
michael@0 298 /**
michael@0 299 * Get the first row that might contain y-coord 'aY', or nullptr if you must search
michael@0 300 * all rows.
michael@0 301 * The actual row returned might not contain 'aY', but if not, it is guaranteed
michael@0 302 * to be before any row which does contain 'aY'.
michael@0 303 * aOverflowAbove is the maximum over all rows of -row.GetOverflowRect().y.
michael@0 304 * To find all rows that intersect the vertical interval aY/aYMost, call
michael@0 305 * GetFirstRowContaining(aY, &overflowAbove), and then iterate through all
michael@0 306 * rows until reaching a row where row->GetRect().y - overflowAbove >= aYMost.
michael@0 307 * That row and all subsequent rows cannot intersect the interval.
michael@0 308 */
michael@0 309 nsIFrame* GetFirstRowContaining(nscoord aY, nscoord* aOverflowAbove);
michael@0 310
michael@0 311 /**
michael@0 312 * Set up the row cursor. After this, call AppendFrame for every
michael@0 313 * child frame in sibling order. Ensure that the child frame y and YMost values
michael@0 314 * form non-decreasing sequences (should always be true for table rows);
michael@0 315 * if this is violated, call ClearRowCursor(). If we return nullptr, then we
michael@0 316 * decided not to use a cursor or we already have one set up.
michael@0 317 */
michael@0 318 FrameCursorData* SetupRowCursor();
michael@0 319
michael@0 320 virtual nsILineIterator* GetLineIterator() MOZ_OVERRIDE { return this; }
michael@0 321
michael@0 322 virtual bool IsFrameOfType(uint32_t aFlags) const MOZ_OVERRIDE
michael@0 323 {
michael@0 324 return nsContainerFrame::IsFrameOfType(aFlags & ~(nsIFrame::eTablePart));
michael@0 325 }
michael@0 326
michael@0 327 virtual void InvalidateFrame(uint32_t aDisplayItemKey = 0) MOZ_OVERRIDE;
michael@0 328 virtual void InvalidateFrameWithRect(const nsRect& aRect, uint32_t aDisplayItemKey = 0) MOZ_OVERRIDE;
michael@0 329 virtual void InvalidateFrameForRemoval() MOZ_OVERRIDE { InvalidateFrameSubtree(); }
michael@0 330
michael@0 331 protected:
michael@0 332 nsTableRowGroupFrame(nsStyleContext* aContext);
michael@0 333
michael@0 334 void InitChildReflowState(nsPresContext& aPresContext,
michael@0 335 bool aBorderCollapse,
michael@0 336 nsHTMLReflowState& aReflowState);
michael@0 337
michael@0 338 virtual int GetLogicalSkipSides(const nsHTMLReflowState* aReflowState = nullptr) const MOZ_OVERRIDE;
michael@0 339
michael@0 340 void PlaceChild(nsPresContext* aPresContext,
michael@0 341 nsRowGroupReflowState& aReflowState,
michael@0 342 nsIFrame* aKidFrame,
michael@0 343 nsHTMLReflowMetrics& aDesiredSize,
michael@0 344 const nsRect& aOriginalKidRect,
michael@0 345 const nsRect& aOriginalKidVisualOverflow);
michael@0 346
michael@0 347 void CalculateRowHeights(nsPresContext* aPresContext,
michael@0 348 nsHTMLReflowMetrics& aDesiredSize,
michael@0 349 const nsHTMLReflowState& aReflowState);
michael@0 350
michael@0 351 void DidResizeRows(nsHTMLReflowMetrics& aDesiredSize);
michael@0 352
michael@0 353 void SlideChild(nsRowGroupReflowState& aReflowState,
michael@0 354 nsIFrame* aKidFrame);
michael@0 355
michael@0 356 /**
michael@0 357 * Reflow the frames we've already created
michael@0 358 *
michael@0 359 * @param aPresContext presentation context to use
michael@0 360 * @param aReflowState current inline state
michael@0 361 * @return true if we successfully reflowed all the mapped children and false
michael@0 362 * otherwise, e.g. we pushed children to the next in flow
michael@0 363 */
michael@0 364 nsresult ReflowChildren(nsPresContext* aPresContext,
michael@0 365 nsHTMLReflowMetrics& aDesiredSize,
michael@0 366 nsRowGroupReflowState& aReflowState,
michael@0 367 nsReflowStatus& aStatus,
michael@0 368 bool* aPageBreakBeforeEnd = nullptr);
michael@0 369
michael@0 370 nsresult SplitRowGroup(nsPresContext* aPresContext,
michael@0 371 nsHTMLReflowMetrics& aDesiredSize,
michael@0 372 const nsHTMLReflowState& aReflowState,
michael@0 373 nsTableFrame* aTableFrame,
michael@0 374 nsReflowStatus& aStatus,
michael@0 375 bool aRowForcedPageBreak);
michael@0 376
michael@0 377 void SplitSpanningCells(nsPresContext& aPresContext,
michael@0 378 const nsHTMLReflowState& aReflowState,
michael@0 379 nsTableFrame& aTableFrame,
michael@0 380 nsTableRowFrame& aFirstRow,
michael@0 381 nsTableRowFrame& aLastRow,
michael@0 382 bool aFirstRowIsTopOfPage,
michael@0 383 nscoord aSpanningRowBottom,
michael@0 384 nsTableRowFrame*& aContRowFrame,
michael@0 385 nsTableRowFrame*& aFirstTruncatedRow,
michael@0 386 nscoord& aDesiredHeight);
michael@0 387
michael@0 388 void CreateContinuingRowFrame(nsPresContext& aPresContext,
michael@0 389 nsIFrame& aRowFrame,
michael@0 390 nsIFrame** aContRowFrame);
michael@0 391
michael@0 392 bool IsSimpleRowFrame(nsTableFrame* aTableFrame,
michael@0 393 nsIFrame* aFrame);
michael@0 394
michael@0 395 void GetNextRowSibling(nsIFrame** aRowFrame);
michael@0 396
michael@0 397 void UndoContinuedRow(nsPresContext* aPresContext,
michael@0 398 nsTableRowFrame* aRow);
michael@0 399
michael@0 400 private:
michael@0 401 // border widths in pixels in the collapsing border model
michael@0 402 BCPixelSize mRightContBorderWidth;
michael@0 403 BCPixelSize mBottomContBorderWidth;
michael@0 404 BCPixelSize mLeftContBorderWidth;
michael@0 405
michael@0 406 public:
michael@0 407 bool IsRepeatable() const;
michael@0 408 void SetRepeatable(bool aRepeatable);
michael@0 409 bool HasStyleHeight() const;
michael@0 410 void SetHasStyleHeight(bool aValue);
michael@0 411 bool HasInternalBreakBefore() const;
michael@0 412 bool HasInternalBreakAfter() const;
michael@0 413 };
michael@0 414
michael@0 415
michael@0 416 inline bool nsTableRowGroupFrame::IsRepeatable() const
michael@0 417 {
michael@0 418 return (mState & NS_ROWGROUP_REPEATABLE) == NS_ROWGROUP_REPEATABLE;
michael@0 419 }
michael@0 420
michael@0 421 inline void nsTableRowGroupFrame::SetRepeatable(bool aRepeatable)
michael@0 422 {
michael@0 423 if (aRepeatable) {
michael@0 424 mState |= NS_ROWGROUP_REPEATABLE;
michael@0 425 } else {
michael@0 426 mState &= ~NS_ROWGROUP_REPEATABLE;
michael@0 427 }
michael@0 428 }
michael@0 429
michael@0 430 inline bool nsTableRowGroupFrame::HasStyleHeight() const
michael@0 431 {
michael@0 432 return (mState & NS_ROWGROUP_HAS_STYLE_HEIGHT) == NS_ROWGROUP_HAS_STYLE_HEIGHT;
michael@0 433 }
michael@0 434
michael@0 435 inline void nsTableRowGroupFrame::SetHasStyleHeight(bool aValue)
michael@0 436 {
michael@0 437 if (aValue) {
michael@0 438 mState |= NS_ROWGROUP_HAS_STYLE_HEIGHT;
michael@0 439 } else {
michael@0 440 mState &= ~NS_ROWGROUP_HAS_STYLE_HEIGHT;
michael@0 441 }
michael@0 442 }
michael@0 443
michael@0 444 inline void
michael@0 445 nsTableRowGroupFrame::GetContinuousBCBorderWidth(nsMargin& aBorder)
michael@0 446 {
michael@0 447 int32_t aPixelsToTwips = nsPresContext::AppUnitsPerCSSPixel();
michael@0 448 aBorder.right = BC_BORDER_LEFT_HALF_COORD(aPixelsToTwips,
michael@0 449 mRightContBorderWidth);
michael@0 450 aBorder.bottom = BC_BORDER_TOP_HALF_COORD(aPixelsToTwips,
michael@0 451 mBottomContBorderWidth);
michael@0 452 aBorder.left = BC_BORDER_RIGHT_HALF_COORD(aPixelsToTwips,
michael@0 453 mLeftContBorderWidth);
michael@0 454 return;
michael@0 455 }
michael@0 456 #endif

mercurial