williamr@2: // Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: // All rights reserved. williamr@2: // This component and the accompanying materials are made available williamr@4: // under the terms of "Eclipse Public License v1.0" williamr@2: // which accompanies this distribution, and is available williamr@4: // at the URL "http://www.eclipse.org/legal/epl-v10.html". williamr@2: // williamr@2: // Initial Contributors: williamr@2: // Nokia Corporation - initial contribution. williamr@2: // williamr@2: // Contributors: williamr@2: // williamr@2: // Description: williamr@2: // williamr@2: williamr@2: #if !defined(__GRDSTD_H__) williamr@2: #define __GRDSTD_H__ williamr@2: williamr@2: #if !defined(__E32STD_H__) williamr@2: #include williamr@2: #endif williamr@2: #if !defined(__GDI_H__) williamr@2: #include williamr@2: #endif williamr@2: #if !defined(__GRDCELLS_H__) williamr@2: #include williamr@2: #endif williamr@2: #if !defined(__GRDDEF_H__) williamr@2: #include williamr@2: #endif williamr@2: williamr@2: williamr@2: williamr@2: class MGridTable williamr@2: /** An interface that can be implemented to provide row and column information. williamr@2: williamr@2: Note that for grids that have indefinite row boundaries, an implementation williamr@2: is mandatory. williamr@2: williamr@2: A concrete implementation is passed to a CGridLay object through its CGridLay::ConstructL() williamr@2: functions or its CGridLay::SetGridTable() function. williamr@2: williamr@2: @publishedAll williamr@2: @released */ williamr@2: { williamr@2: public: williamr@2: enum williamr@2: { williamr@2: /** The number of rows returned by the default implementation of RowExtent(). */ williamr@2: EDefaultRowExtent=20, williamr@2: /** The number of columns returned by the default implementation of ColumnExtent(). */ williamr@2: EDefaultColumnExtent=20 williamr@2: }; williamr@2: public: williamr@2: IMPORT_C virtual TBool RequestRow(TInt aRow,TInt& aReturnRow) const;//If used should be derived from williamr@2: IMPORT_C virtual TInt RowExtent() const; williamr@2: IMPORT_C virtual TInt ColumnExtent() const; williamr@2: }; williamr@2: williamr@2: williamr@4: //-> williamr@2: williamr@2: class TGridColors williamr@2: /** The grid colour specification. williamr@2: williamr@2: An object of this type encapsulates the colours to be used when drawing a williamr@2: grid cell. williamr@2: williamr@2: @publishedAll williamr@2: @released williamr@2: @see CGridLabelImg */ williamr@2: { williamr@2: public: williamr@2: IMPORT_C TGridColors(); williamr@2: IMPORT_C TGridColors(TRgb aForeground, TRgb aBackground, TRgb aLines, TRgb aLabelSeparators); williamr@2: public: williamr@2: /** The foreground colour. */ williamr@2: TRgb iForeground; williamr@2: /** The background colour. */ williamr@2: TRgb iBackground; williamr@2: /** The colour of lines. */ williamr@2: TRgb iLines; williamr@2: /** The colour of label separators. */ williamr@2: TRgb iLabelSeparators; williamr@2: // TRgb iEdge; williamr@2: }; williamr@4: //-> williamr@2: williamr@2: williamr@2: class RReadStream; williamr@2: class RWriteStream; williamr@2: class CStreamStore; williamr@2: class CGridImg; williamr@2: class CSparseMap; williamr@2: williamr@2: williamr@2: class CGridLay : public CBase williamr@2: /** Handles the layout of a grid, and controls how columns, rows and selections williamr@2: appear. williamr@2: williamr@2: @publishedAll williamr@2: @released */ williamr@2: { williamr@2: friend class CGridImg; williamr@2: public: williamr@2: /** Defines the order in which pages are printed. */ williamr@2: enum TPageOrder williamr@2: { williamr@2: /** All pages in a horizontal line are drawn before starting on the next horizontal williamr@2: line. */ williamr@2: ERightThenDown, williamr@2: /** All pages in a vertical line are drawn before starting on the next vertical williamr@2: line to the right. */ williamr@2: EDownThenRight williamr@2: }; williamr@2: /** Indicates whether the size of the grid should be adjusted when columns and williamr@2: rows are inserted or deleted. */ williamr@2: enum TFixGridRange williamr@2: { williamr@2: /** The grid range should not be adjusted on insertion or deletion of rows and/or columns. */ williamr@2: EFixGridRange, williamr@2: /** The grid range can be adjusted on insertion or deletion of rows and/or columns. */ williamr@2: EAdjustGridRange williamr@2: }; williamr@2: public: williamr@2: IMPORT_C CGridLay(MGraphicsDeviceMap* aGraphicsDeviceMap); williamr@2: IMPORT_C void ConstructL(CGridLay* aGridLay,CGridImg* aGridImg);//Constructs Partial Copy williamr@2: IMPORT_C void ConstructL(const MGridTable *aGridTable,CGridImg *aGridImg,TInt aNoOfRows,TInt aNoOfCols); williamr@2: IMPORT_C void ConstructL(const MGridTable *aGridTable,CGridImg *aGridImg,TInt aNoOfCols); williamr@2: IMPORT_C virtual ~CGridLay(); williamr@2: williamr@2: IMPORT_C TPoint PageScroll(TMoveDirectionAndAmount aPageScroll); williamr@2: IMPORT_C TPoint ExposeCell(const TCellRef &aCell); williamr@2: IMPORT_C TPoint ExposeCellToTopLeft(const TCellRef &aCell); williamr@2: williamr@2: IMPORT_C void SetGridImgL(CGridImg* aGridImg); williamr@2: inline void SetGridTable(const MGridTable* aGridTable); williamr@2: inline TRangeRef VisibleRange() const; williamr@2: IMPORT_C void SetVisibleRange(const TCellRef& aTopLeftCell); williamr@2: inline TRangeRef TitleRange() const; williamr@2: inline TRangeRef GridRange() const; williamr@2: IMPORT_C void SetGraphicsDeviceMap(MGraphicsDeviceMap* aGraphicsDeviceMap); williamr@2: IMPORT_C void SetGridToDefault(); williamr@2: williamr@2: IMPORT_C TInt ColumnWidthInTwips(TInt aCol) const; williamr@2: IMPORT_C void SetColumnWidthInTwipsL(TInt aCol,TInt aWidthInTwips); williamr@2: IMPORT_C TInt SetColumnWidthInTwipsL(TInt aStartCol,TInt aEndCol,TInt aWidthInTwips); williamr@2: IMPORT_C TInt DefaultColumnWidthInTwips() const; williamr@2: IMPORT_C void SetDefaultColumnWidthInTwips(TInt aWidthInTwips); williamr@2: IMPORT_C void SetColumnWidthsToDefault(); williamr@2: IMPORT_C TInt MinColumnWidthInPixels() const; williamr@2: IMPORT_C void SetMinColumnWidthInPixels(TInt aWidthInPixels); williamr@2: IMPORT_C TInt ColumnWidthOfSelectedInTwips() const; williamr@2: IMPORT_C void SetColumnWidthOfSelectedInTwipsL(TInt aWidthInTwips); williamr@2: IMPORT_C TInt RowHeightInTwips(TInt aRow) const; williamr@2: IMPORT_C void SetRowHeightInTwipsL(TInt aRow,TInt aHeightInTwips); williamr@2: IMPORT_C TInt SetRowHeightInTwipsL(TInt aStartRow,TInt aEndRow,TInt aHeightInTwips); williamr@2: IMPORT_C TInt DefaultRowHeightInTwips() const; williamr@2: IMPORT_C void SetDefaultRowHeightInTwips(TInt aHeightInTwips); williamr@2: IMPORT_C void SetRowHeightsToDefault(); williamr@2: IMPORT_C TInt MinRowHeightInPixels() const; williamr@2: IMPORT_C void SetMinRowHeightInPixels(TInt aHeightInPixels); williamr@2: IMPORT_C TInt RowHeightOfSelectedInTwips() const; williamr@2: IMPORT_C void SetRowHeightOfSelectedInTwipsL(TInt aHeightInTwips); williamr@2: IMPORT_C void RecalcPixelSparseMaps(); williamr@2: IMPORT_C void InsertDeleteColumns(TInt aStartCol,TInt aNoOfCols, williamr@2: TFixGridRange aFixGridRange=EFixGridRange); williamr@2: IMPORT_C void InsertDeleteRows(TInt aStartRow,TInt aNoOfRows, williamr@2: TFixGridRange aFixGridRange=EFixGridRange); williamr@2: williamr@2: inline TBool IsSideLabels() const; williamr@2: IMPORT_C void SetSideLabels(TBool aState); williamr@2: inline TBool IsTopLabels() const; williamr@2: IMPORT_C void SetTopLabels(TBool aState); williamr@2: inline TBool IsVerticalGridLines() const; williamr@2: IMPORT_C void SetVerticalGridLines(TBool aState); williamr@2: inline TBool IsHorizontalGridLines() const; williamr@2: IMPORT_C void SetHorizontalGridLines(TBool aState); williamr@2: inline TBool IsGridLabelSeparators() const; williamr@2: IMPORT_C void SetGridLabelSeparators(TBool aState); williamr@2: inline TBool IsColumnBursting() const; williamr@2: IMPORT_C void SetColumnBursting(TBool aState); williamr@2: inline TBool IsCursorVisible() const; williamr@2: IMPORT_C void SetCursorVisible(TBool aVisible); williamr@2: inline TBool IsHighlightVisible() const; williamr@2: IMPORT_C void SetHighlightVisible(TBool aVisible); williamr@2: inline TBool IsRowPermanentlySelected() const; williamr@2: IMPORT_C void SetRowPermanentlySelectedL(TBool aState); williamr@2: inline TBool IsTitleLines() const; williamr@2: inline TBool IsHorizontalTitleLine() const; williamr@2: inline TBool IsVerticalTitleLine() const; williamr@2: IMPORT_C void SetTitleLinesL(TBool aState); williamr@2: IMPORT_C void SetTitleLinesL(const TCellRef& aCellRef); williamr@2: IMPORT_C void ToggleTitleLinesL(); williamr@2: inline TBool IsIndefiniteRowBoundaries() const; williamr@2: inline TBool IsUniformRowHeight() const; williamr@2: IMPORT_C void SetUniformRowHeight(TBool aState); williamr@2: inline TBool IsUniformColumnWidth() const; williamr@2: IMPORT_C void SetUniformColumnWidth(TBool aState); williamr@2: inline TBool IsTopLabelDragDisabled() const; williamr@2: IMPORT_C void SetTopLabelDragDisabled(TBool aState); williamr@2: inline TBool IsSideLabelDragDisabled() const; williamr@2: IMPORT_C void SetSideLabelDragDisabled(TBool aState); williamr@2: inline TBool IsPrintedLabels() const; williamr@2: IMPORT_C void SetPrintedLabels(TBool aState); williamr@2: inline TBool IsPrintedGridLines() const; williamr@2: IMPORT_C void SetPrintedGridLines(TBool aState); williamr@2: inline TBool IsEncroachingCellBorders() const; williamr@2: IMPORT_C void SetEncroachingCellBorders(TBool aState); williamr@2: inline TBool IsRowSelectionDisabled() const; williamr@2: IMPORT_C void SetRowSelectionDisabled(TBool aState); williamr@2: inline TBool IsColumnSelectionDisabled() const; williamr@2: IMPORT_C void SetColumnSelectionDisabled(TBool aState); williamr@2: inline TBool IsAutoClearGridCells() const; williamr@2: IMPORT_C void SetAutoClearGridCells(TBool aState); williamr@2: inline TBool IsPageBreakLinesHidden() const; williamr@2: IMPORT_C void SetPageBreakLinesHidden(TBool aState); williamr@2: inline TBool HasChanged() const; williamr@2: inline void SetHasChanged(TBool aHasChanged); williamr@2: inline void SetGridEdgeColor(TRgb aColor); williamr@2: williamr@2: IMPORT_C TInt MinVisibleFromRow() const; williamr@2: IMPORT_C TInt MinVisibleFromColumn() const; williamr@2: IMPORT_C void ResetVisibleToRow(); williamr@2: IMPORT_C void ResetVisibleToColumn(); williamr@2: IMPORT_C void ResetVisibleToCell(); williamr@2: IMPORT_C TInt RowExtent() const; williamr@2: IMPORT_C TInt ColumnExtent() const; williamr@2: williamr@2: IMPORT_C TInt RowToYVal(TInt aRow) const; williamr@2: IMPORT_C TInt RowToYVal(TInt aStartRow,TInt aEndRow) const; williamr@2: IMPORT_C TInt VisibleRowToYVal(TInt aRow) const; williamr@2: IMPORT_C TInt TitleRowToYVal(TInt aTitleRow) const; williamr@2: IMPORT_C TInt ColumnToXVal(TInt aCol) const; williamr@2: IMPORT_C TInt ColumnToXVal(TInt aStartCol,TInt aEndCol) const; williamr@2: IMPORT_C TInt VisibleColumnToXVal(TInt aCol) const; williamr@2: IMPORT_C TInt TitleColumnToXVal(TInt aTitleCol) const; williamr@2: IMPORT_C TInt YValToRow(TInt aYVal) const; williamr@2: IMPORT_C TInt YValToRow(TInt aStartRow,TInt aDisp) const; williamr@2: IMPORT_C TInt YValToTitleRow(TInt aYVal) const; williamr@2: IMPORT_C TInt XValToColumn(TInt aXVal) const; williamr@2: IMPORT_C TInt XValToColumn(TInt aStartCol,TInt aDisp) const; williamr@2: IMPORT_C TInt XValToTitleColumn(TInt aXVal) const; williamr@2: IMPORT_C TCellRef PointToCell(const TPoint &aPoint) const; williamr@2: IMPORT_C TCellRef PointToCell(const TCellRef &aStartCell,const TPoint &aPointDisp) const; williamr@2: IMPORT_C TPoint CellToPoint(const TCellRef &aCell) const; williamr@2: IMPORT_C TPoint CellToPoint(const TCellRef &aStartCell,const TCellRef &aEndCell) const; williamr@2: IMPORT_C TPoint TitleCellToPoint(const TCellRef& aTitleCell) const; williamr@2: IMPORT_C TRect CellToRect(const TCellRef& aCell) const; williamr@2: IMPORT_C TInt YValToNearestRow(TInt aStartRow,TInt aDisp) const; williamr@2: IMPORT_C TInt XValToNearestColumn(TInt aStartCol,TInt aDisp) const; williamr@2: IMPORT_C TSize TopLeftTitleRangeSize() const; williamr@2: williamr@2: IMPORT_C void PaginateL(); williamr@2: IMPORT_C void ClearPagination(); williamr@2: IMPORT_C void NotifyPaginationOutOfDateL(); williamr@2: inline TBool IsPaginated() const; williamr@2: IMPORT_C TRangeRef PageToRange(TInt aPageNo,TPageOrder aPageOrder) const; williamr@2: inline void SetPrintRange(const TRangeRef& aPrintRange); williamr@2: IMPORT_C TInt NoOfPages() const; williamr@2: IMPORT_C void SetPageSizeInTwipsL(const TSize& aPageSize); williamr@2: inline TSize PageSizeInTwips() const; williamr@2: inline TBool IsAutoPagination() const; williamr@2: IMPORT_C void SetAutoPagination(TBool aState); williamr@2: IMPORT_C TBool IsHardRowPageBreak(TInt aRow) const; williamr@2: IMPORT_C TBool IsHardColumnPageBreak(TInt aCol) const; williamr@2: IMPORT_C void SetHardRowPageBreakL(TInt aRow); williamr@2: IMPORT_C void ClearHardRowPageBreakL(TInt aRow); williamr@2: IMPORT_C void SetHardColumnPageBreakL(TInt aCol); williamr@2: IMPORT_C void ClearHardColumnPageBreakL(TInt aCol); williamr@2: IMPORT_C void ClearAllHardPageBreaksL(); williamr@2: williamr@2: IMPORT_C void ExternalizeL(RWriteStream &aStream) const; williamr@2: IMPORT_C void InternalizeL(RReadStream &aStream); williamr@2: IMPORT_C TStreamId StoreL(CStreamStore& aStore) const; williamr@2: IMPORT_C void RestoreL(const CStreamStore& aStore,TStreamId aStreamId); williamr@4: //-> williamr@2: // Setting the grid colors williamr@2: IMPORT_C void SetGridColors(TGridColors aColors); williamr@2: // Getting the grid colors williamr@2: IMPORT_C const TGridColors& GridColors() const; williamr@4: //-> williamr@2: private: williamr@2: void SetIndefiniteRowBoundaries(TBool aState); williamr@2: inline TBool IsVisibleToRowFullyVisible() const; williamr@2: void SetVisibleToRowFullyVisible(TBool aState); williamr@2: inline TBool IsVisibleToColumnFullyVisible() const; williamr@2: void SetVisibleToColumnFullyVisible(TBool aState); williamr@2: TInt ColumnWidthInPixels(TInt aCol) const; williamr@2: void SetColumnWidthInPixelsL(TInt aCol,TInt aWidthInPixels); williamr@2: void PreCheckColumnWidthChange(TInt aCol,TBool aNonZeroWidth); williamr@2: void PostCheckColumnWidthChange(TInt aCol,TBool aNonZeroWidth); williamr@2: TInt DefaultColumnWidthInPixels() const; williamr@2: void SetDefaultColumnWidthInPixels(TInt aWidthInPixels); williamr@2: TInt RowHeightInPixels(TInt aRow) const; williamr@2: void SetRowHeightInPixelsL(TInt aRow,TInt aHeightInPixels); williamr@2: void PreCheckRowHeightChange(TInt aRow,TBool aNonZeroHeight); williamr@2: void PostCheckRowHeightChange(TInt aRow,TBool aNonZeroHeight); williamr@2: TInt DefaultRowHeightInPixels() const; williamr@2: void SetDefaultRowHeightInPixels(TInt aHeightInPixels); williamr@2: TPoint CalcOffsetBetweenCells(const TCellRef& aCell1,const TCellRef& aCell2) const; williamr@2: TBool LimitRow(TInt& aRow) const; williamr@2: TBool LimitColumn(TInt &aColumn) const; williamr@2: void LimitRow(TInt& aRow,TInt aLowerLimit,TInt aUpperLimit) const; williamr@2: void LimitColumn(TInt& aCol,TInt aLowerLimit,TInt aUpperLimit) const; williamr@2: TBool LimitCell(TCellRef& aCell) const; williamr@2: void LimitRowToVisible(TInt& aRow) const; williamr@2: void LimitColumnToVisible(TInt& aCol) const; williamr@2: void LimitCellToVisible(TCellRef& aCell) const; williamr@2: TBool IsCellOutOfVisibleRange(const TCellRef &aCell) const; williamr@2: TBool IsCellOutOfGridRange(const TCellRef& aCell) const; williamr@2: void StepRowForward(TInt& aRow) const; williamr@2: void StepRowBackward(TInt& aRow) const; williamr@2: void StepColumnForward(TInt& aCol) const; williamr@2: void StepColumnBackward(TInt& aCol) const; williamr@2: void CalcVisibleFromRow(TInt aVisibleToRow,TInt& aNewVisibleFromRow) const; williamr@2: TBool CalcVisibleToRow(TInt aVisibleFromRow,TInt& aNewVisibleToRow) const; williamr@2: void CalcVisibleFromColumn(TInt aVisibleToCol,TInt& aNewVisibleFromCol) const; williamr@2: TBool CalcVisibleToColumn(TInt aVisibleFromCol,TInt& aNewVisibleToCol) const; williamr@2: TInt CalcVisibleFromRowAfterPageScroll(TMoveDirectionAndAmount aPageScroll) const; williamr@2: TInt CalcVisibleFromColumnAfterPageScroll(TMoveDirectionAndAmount aPageScroll) const; williamr@2: TCellRef CalcVisibleFromCellAfterPageScroll(TMoveDirectionAndAmount aPageScroll) const; williamr@2: TBool FindNextRowPageBreak(TInt aSearchStart,TInt& aFoundRow) const; williamr@2: TBool FindNextColumnPageBreak(TInt aSearchStart,TInt& aFoundCol) const; williamr@2: void DoMainPaginationLoopL(TInt aPageSpan,CSparseMap* aCellSpanMap,CSparseMap* aPageMap, williamr@2: CArrayFix* aHardPageBreaks,TInt aStartId); williamr@2: TBool RequestRow(TInt aRow,TInt& aReturnRow) const; williamr@2: williamr@2: void ConstructL(const MGridTable *aGridTable,CGridImg *aGridImg,const TRangeRef& aGridRange); williamr@2: //private: williamr@2: private: williamr@2: enum williamr@2: { williamr@2: EMaxArrayChanges=256, williamr@2: EInitialDefaultRowHeightInTwips = 300, williamr@2: EInitialDefaultColumnWidthInTwips = 900 williamr@2: }; williamr@2: enum williamr@2: { williamr@2: EIsTopLabels = 0x1, williamr@2: EIsSideLabels = 0x2, williamr@2: EIsHorizontalGridLines = 0x4, williamr@2: EIsVerticalGridLines = 0x8, williamr@2: EIsColumnBursting = 0x10, williamr@2: EIsCursorVisible = 0x20, williamr@2: EIsRowPermanentlySelected = 0x40, williamr@2: EIsHorizontalTitleLine = 0x80, williamr@2: EIsVerticalTitleLine = 0x100, williamr@2: EIsIndefiniteRowBoundaries = 0x200, williamr@2: EIsUniformRowHeight = 0x400, williamr@2: EIsUniformColumnWidth = 0x800, williamr@2: EIsTopLabelDragDisabled = 0x1000, williamr@2: EIsSideLabelDragDisabled = 0x2000, williamr@2: EIsPaginated = 0x4000, williamr@2: EIsAutoPagination = 0x8000, williamr@2: EIsPrintedLabels = 0x10000, williamr@2: EIsPrintedGridLines = 0x20000, williamr@2: EIsVisibleToRowFullyVisible = 0x40000, williamr@2: EIsVisibleToColumnFullyVisible = 0x80000, williamr@2: EIsEncroachingCellBorders = 0x100000, williamr@2: EIsColumnSelectionDisabled = 0x200000, williamr@2: EIsRowSelectionDisabled = 0x400000, williamr@2: EIsAutoClearGridCells = 0x800000, williamr@2: EIsGridLabelSeparators = 0x1000000, williamr@2: EIsHighlightVisible = 0x2000000, williamr@2: EIsPageBreakLinesHidden = 0x4000000 williamr@2: }; williamr@2: private: williamr@2: const MGridTable* iGridTable; williamr@2: const MGraphicsDeviceMap* iGraphicsDeviceMap; //* williamr@2: CGridImg* iGridImg; //* williamr@2: // persistent williamr@2: TRangeRef iGridRange; //* williamr@2: TRangeRef iVisibleRange; williamr@2: TRangeRef iTitleRange; williamr@2: CSparseMap* iColumnWidthMap; //* williamr@2: CSparseMap* iRowHeightMap; //* williamr@2: CSparseMap* iColumnPageMap; //* williamr@2: CSparseMap* iRowPageMap; //* williamr@2: CArrayFix* iHardRowPageBreaks; williamr@2: CArrayFix* iHardColumnPageBreaks; williamr@2: TRgb iGridEdgeColor; williamr@2: TInt iMinRowHeightInPixels; williamr@2: TInt iMinColumnWidthInPixels; williamr@2: TSize iPageSizeInTwips; //* williamr@2: TUint32 iFlags; //* Starred items are used in printing williamr@4: //-> williamr@2: TGridColors iColors; williamr@4: //-> williamr@2: // End of persistent data williamr@2: TBool iHasChanged; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: class CGridLabelImg : public CBase williamr@2: /** Draws a grid cell's label. williamr@2: williamr@2: @publishedAll williamr@2: @released */ williamr@2: { williamr@2: friend class CGridImg; williamr@2: public: williamr@2: IMPORT_C virtual ~CGridLabelImg(); williamr@2: IMPORT_C void ConstructL(); williamr@2: inline void SetGraphicsDeviceMap(MGraphicsDeviceMap* aGraphicsDeviceMap); williamr@2: inline TFontSpec FontSpec() const; williamr@2: IMPORT_C void ReleaseFont(); williamr@2: IMPORT_C void NotifyGraphicsDeviceMapChangeL(); williamr@2: inline void SetGridColors(const TGridColors& aGridColors); williamr@2: protected: williamr@2: IMPORT_C CGridLabelImg(const TFontSpec& aFontSpec,MGraphicsDeviceMap* aGraphicsDeviceMap); williamr@4: //-> williamr@2: IMPORT_C void DrawTopLeftLabelL(CGraphicsContext* aGc,const TRect& aRect, TRgb aColor) const; williamr@4: //-> williamr@2: private: williamr@2: /** Draws a row label. williamr@2: williamr@2: @publishedAll williamr@2: @released williamr@2: @param aGc The graphics context to be used. williamr@2: @param aRow The row for which the label is to be drawn. williamr@2: @param aRect The rectangle in which the label is to be drawn. */ williamr@2: virtual void DrawRowLabelL(CGraphicsContext* aGc,TInt aRow,const TRect& aRect) const=0; williamr@2: /** Draws a column label. williamr@2: williamr@2: @publishedAll williamr@2: @released williamr@2: @param aGc The graphics context to be used. williamr@2: @param aCol The column for which the label is to be drawn. williamr@2: @param aRect The rectangle in which the label is to be drawn. */ williamr@2: virtual void DrawColLabelL(CGraphicsContext* aGc,TInt aCol,const TRect& aRect) const=0; williamr@2: IMPORT_C virtual void DrawTopLeftLabelL(CGraphicsContext* aGc,const TRect& aRect) const; williamr@2: IMPORT_C virtual TInt SideLabelWidthInPixels(TInt aStartRow,TInt aEndRow) const; williamr@2: IMPORT_C virtual TInt TopLabelHeightInPixels() const; williamr@2: IMPORT_C virtual void DrawRowCursorL(CGraphicsContext* aGc,const TRect& aRect) const; williamr@2: protected: williamr@2: enum williamr@2: { williamr@2: /** The default width of side labels, in twips. williamr@2: williamr@2: This is used by the default implementation of SideLabelWidthInPixels(). */ williamr@2: EDefaultSideLabelWidthInTwips=300, williamr@2: /** The default height of top labels, in twips. williamr@2: williamr@2: This is used by the default implementation of TopLabelHeightInPixels(). */ williamr@2: EDefaultTopLabelHeightInTwips=300 williamr@2: }; williamr@2: protected: williamr@2: /** The nearest font to that specified in the font specification. */ williamr@2: CFont* iFont; williamr@2: /** The font specification in device independent terms. */ williamr@2: TFontSpec iFontSpec; williamr@2: /** The graphics device map, an interface for mapping between twips and device-specific williamr@2: units. */ williamr@2: MGraphicsDeviceMap* iGraphicsDeviceMap; williamr@2: /** The grid colour specification. */ williamr@2: TGridColors iGridColors; williamr@2: private: williamr@2: TInt iSpare; williamr@2: }; williamr@2: williamr@2: williamr@2: class CGridCellImg : public CBase williamr@2: /** Draws a grid cell's contents. williamr@2: williamr@2: @publishedAll williamr@2: @released */ williamr@2: { williamr@2: friend class CGridImg; williamr@2: public: williamr@2: IMPORT_C virtual ~CGridCellImg(); williamr@2: inline TInt BurstColOffset() const; williamr@2: inline TInt BurstLeft() const; williamr@2: inline TInt BurstRight() const; williamr@2: inline TBool IsHorizontalGridLines() const; williamr@2: inline TBool IsVerticalGridLines() const; williamr@2: inline void SetGridColors(const TGridColors& aGridColors); williamr@2: protected: williamr@2: IMPORT_C CGridCellImg(); williamr@2: private: williamr@2: /** Draws the contents of the specified cell. williamr@2: williamr@2: @publishedAll williamr@2: @released williamr@2: @param aGc The graphics context to be used. williamr@2: @param aCell The cell whose contents are to be drawn. williamr@2: @param aDrawRect The rectangle in which the cell is to be drawn. williamr@2: @param aClipRect The rectangle to which drawing is clipped. */ williamr@2: virtual void DrawL(CGraphicsContext* aGc,const TCellRef& aCell,const TRect& aDrawRect, williamr@2: const TRect& aClipRect) const=0; williamr@2: IMPORT_C virtual TInt DataWidthInPixelsL(const TCellRef& aCell) const; williamr@2: IMPORT_C virtual TBool DoesCellContainDataL(const TCellRef& aCell) const; williamr@2: // reserved virtual function williamr@2: IMPORT_C virtual void Reserved_1(); williamr@2: private: williamr@2: void SetBurstingData(TInt aBurstColOffset=0,TInt aBurstLeft=0,TInt aBurstRight=0); williamr@2: private: williamr@2: enum { EIsHorizontalGridLines = 0x1, EIsVerticalGridLines = 0x2 }; williamr@2: protected: williamr@2: /** The grid colour specification. */ williamr@2: TGridColors iGridColors; williamr@2: private: williamr@2: TInt iBurstColOffset; williamr@2: TInt iBurstLeft; williamr@2: TInt iBurstRight; williamr@2: TUint32 iGridLineFlags; williamr@2: }; williamr@2: williamr@2: williamr@2: class MGridCursorMoveCallBack williamr@2: /** An interface to a callback function that is intended to be called whenever williamr@2: there is a change to the cursor position. williamr@2: williamr@2: If such a callback is needed, a concrete implementation is defined, instantiated williamr@2: and passed to CGridImg::SetCursorMoveCallBack(). williamr@2: williamr@2: @publishedAll williamr@2: @released */ williamr@2: { williamr@2: public: williamr@2: /** Deals with the change to the cursor position. williamr@2: williamr@2: This function is called immediately before exiting the following functions: williamr@2: CGridImg::SetCursorPosL(), CGridImg::SetAnchorPosL(), CGridImg::MoveCursorL(),CGridImg::ResetSelectedL(), williamr@2: CGridImg::AddRangeToSelectedL(), CGridImg::AddRegionToSelectedL(), CGridImg::AddRowToSelectedL(), williamr@2: CGridImg::AddColToSelectedL(). williamr@2: williamr@2: The function is commonly used to do any necessary redrawing. */ williamr@2: virtual void HandleCursorMoveL()=0; williamr@2: }; williamr@2: williamr@2: class RWindow; williamr@2: class CWindowGc; williamr@2: williamr@2: williamr@2: class CGridImg : public CBase williamr@2: /** Draws the contents of the grid. williamr@2: williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: { williamr@2: friend class CGridLay; williamr@2: public: williamr@2: enum williamr@2: { williamr@2: /** Indicates that the selection state is to be maintained. williamr@2: williamr@2: If a region of cells is selected, then this selection is to be kept. williamr@2: williamr@2: Typically, this is set by a control when a drag operation is in williamr@2: progress and the shift modifier key is also pressed. */ williamr@2: EIsWithSelect=0x0001, williamr@2: /** Indicates that the control modifier key has been pressed. */ williamr@2: EIsWithControl=0x0002, williamr@2: /** Indicates that a drag operation is in progress. */ williamr@2: EIsWithDrag=0x0004, williamr@2: /** Indicates that the cursor is the edge of the grid. */ williamr@2: EIsAtBoundary=0x0008, williamr@2: /** Indicates that a new cell is being selected, without dragging. */ williamr@2: EIsAbsoluteMove=0x0010, williamr@2: /** Indicates that a whole row is selected. */ williamr@2: EIsRowSelected=0x0020, williamr@2: /** Indicates that a whole column is selected. williamr@2: williamr@2: This also means that the label cell for the column is included in the selection. */ williamr@2: EIsColumnSelected=0x0040 williamr@2: }; williamr@2: enum williamr@2: { williamr@2: /** Defines a scale value of 100. williamr@2: williamr@2: Scale factor values are divided into this value to calculate williamr@2: drawing points, rectangles etc. */ williamr@2: EScaleOneToOne=100 williamr@2: }; williamr@2: williamr@2: enum TSelectType williamr@2: { williamr@2: /** Indicates that an existing selected region is to be reset (i.e. emptied) before williamr@2: adding a new region. */ williamr@2: ESelectOverwrite, williamr@2: /** Indicates that a new region is to be appended to any existing selected region. */ williamr@2: ESelectAppend williamr@2: }; williamr@2: public: williamr@2: IMPORT_C virtual ~CGridImg(); williamr@2: IMPORT_C static CGridImg* NewL(CGraphicsDevice* aGraphicsDevice,CGridCellImg* aGridCellImg,CGridLay* aGridLay); williamr@2: IMPORT_C static CGridImg* NewL(CGridCellImg* aGridCellImg,CGridLay* aGridLay); //Creates Partial GridImg williamr@2: inline void SetGridLay(CGridLay* aGridLay); williamr@2: inline void SetWindow(RWindow* aWin); williamr@4: //-> williamr@2: IMPORT_C void SetGridLabelImg(CGridLabelImg* aGridLabelImg); williamr@4: //-> williamr@2: inline void SetCursorMoveCallBack(MGridCursorMoveCallBack* aCursorMoveCallBack); williamr@2: inline const CGridCellRegion* Selected() const; williamr@2: inline const CGridLabelImg* GridLabelImg() const; williamr@2: williamr@2: IMPORT_C void ScrollL(const TPoint &aOffset); williamr@2: IMPORT_C void MoveCursorL(TMoveDirectionAndAmount aCursorMove,TUint aSelectState); williamr@2: IMPORT_C void SetCursorWithPointerL(const TPoint& aPoint,TUint aFlagList); williamr@2: IMPORT_C void ResetSelectedL(); williamr@2: IMPORT_C void AddRangeToSelectedL(const TRangeRef& aRange,TSelectType aType=ESelectOverwrite); williamr@2: IMPORT_C void AddRegionToSelectedL(const CArrayFix* aCellRegion,TSelectType aType=ESelectOverwrite); williamr@2: IMPORT_C void AddRowToSelectedL(TInt aRow,TSelectType aType=ESelectOverwrite); williamr@2: IMPORT_C void AddColToSelectedL(TInt aCol,TSelectType aType=ESelectOverwrite); williamr@2: IMPORT_C void DrawL(CGraphicsContext* aGc) const; williamr@2: IMPORT_C void DrawL(CGraphicsContext* aGc,const TRect& aRect) const; williamr@2: IMPORT_C void DrawCellL(const TCellRef& aCell) const; williamr@2: IMPORT_C void DrawRangeL(const TRangeRef& aRange) const; williamr@2: IMPORT_C void DrawSelectedL() const; williamr@2: IMPORT_C void DrawTitleLines() const; williamr@2: IMPORT_C void ClearTitleLineRegionL(const TPoint& aCrossPoint) const; williamr@2: IMPORT_C void PrintGridLinesAndCellsInRangeL(CGraphicsContext* aPrinterGc,const TRangeRef& aRange, williamr@2: TInt aScaleFactor) const; williamr@2: williamr@2: inline TCellRef CursorPos() const; williamr@2: IMPORT_C void SetCursorPosL(const TCellRef& aCursorPos); williamr@2: inline TCellRef NewCursorPos() const; williamr@2: inline TCellRef AnchorPos() const; williamr@2: IMPORT_C void SetAnchorPosL(const TCellRef& aAnchorPos); williamr@2: inline TRect GridRect() const; williamr@2: IMPORT_C void SetGridRect(const TRect& aNewRect); williamr@2: IMPORT_C void SetPrintGridRect(const TRect& aPrintRect); williamr@2: inline TPoint TitlePoint() const; williamr@2: inline TPoint MainPoint() const; williamr@2: inline TRect MainRect() const; williamr@2: IMPORT_C void ResetReferencePoints(); williamr@2: IMPORT_C void NotifyGridRangeResize(); williamr@2: williamr@2: IMPORT_C void CheckSideLabelWidthAndScrollL(); williamr@2: IMPORT_C TInt CheckSideLabelWidth(); williamr@2: IMPORT_C TInt SideLabelWidthInPixels() const; williamr@2: IMPORT_C TInt MaxSideLabelWidthInPixels() const; williamr@2: IMPORT_C TInt TopLabelHeightInPixels() const; williamr@2: IMPORT_C void FinishLabelDragL(); williamr@2: IMPORT_C TBool StartLabelDrag(const TPoint &aPoint); williamr@2: IMPORT_C TBool UpdateLabelDrag(const TPoint &aPoint); williamr@2: IMPORT_C TBool StartLabelResize(TBool aIsColumnLabel, TInt aIndex); williamr@2: IMPORT_C TBool UpdateLabelResize(TInt aDelta); williamr@2: IMPORT_C void FinishLabelResizeL(TBool aResize); williamr@2: private: williamr@2: enum TDragDim {EXDrag,EYDrag,ENoDrag}; williamr@2: enum TRefPoint {ETitleRef,EMainRef}; williamr@2: enum TDragDraw {EDragDrawWithBitmap,EDragDrawWithoutBitmap}; williamr@2: enum TArrows {EBothArrows,ESecondArrowOnly}; williamr@2: enum williamr@2: { williamr@2: EIsLabelDraggingIgnored = 0x1, williamr@2: EIsSidewaysScrollIgnored = 0x2 williamr@2: }; williamr@2: private: williamr@2: void DrawResizingDragHiglights(const TRect& aRect); williamr@2: void DrawAllGridLabelsL() const; williamr@2: void DrawTopLeftGridLabelL() const; williamr@2: void DrawTopGridLabelsL(TInt aStartCol,TInt aEndCol,TRefPoint aXRef=EMainRef) const; williamr@2: void DrawSideGridLabelsL(TInt aStartRow,TInt aEndRow,TRefPoint aYRef=EMainRef) const; williamr@2: void DrawSideGridLabelIfOnScreenL(TInt aRow) const; williamr@2: void DrawAllGridLinesAndCellsL() const; williamr@2: void DrawGridLinesAndCellsInRangeL(const TRangeRef& aRange,const TRect& aClipRect, williamr@2: TRefPoint aXRef=EMainRef,TRefPoint aYRef=EMainRef) const; williamr@2: void DrawCellsToGcL(CGraphicsContext* aGc,const TRangeRef& aRange,const TRect& aClipRect, williamr@2: const TPoint& aStartPoint,TInt aScaleFactor=EScaleOneToOne) const; williamr@2: void DrawBurstingCellL(CGraphicsContext* aGc,const TCellRef& aCell,const TRect& aRect,const TRect& aClipRect, williamr@2: TInt aScaleFactor,TInt aBurstLeft,const TCellRef& aBurstCell) const; williamr@2: TInt CalcBurstLeftL(TCellRef& aBurstCell,TInt aScaleFactor) const; williamr@2: TInt CalcBurstRightL(const TCellRef& aCell,TInt aExcessRight,TInt aScaleFactor) const; williamr@2: void DrawVerticalTitleLine() const; williamr@2: void DrawHorizontalTitleLine() const; williamr@2: void BeginRedrawAndDrawL() const; williamr@2: void BeginRedrawAndDrawL(const TRect& aRect) const; williamr@2: williamr@2: void AppendTotalHighlightRegionL(TRegion& aRegion) const; williamr@2: void AppendPartialHighlightRegionL(TRegion& aRegion,const TRect& aClipRect, williamr@2: TRefPoint aXRef=EMainRef,TRefPoint aYRef=EMainRef) const; williamr@2: void RemoveRowLabelFromRegionL(TInt aRow,TRegion& aRegion) const; williamr@2: void HighlightMinRegionL(const TRegion &aOldRegion,const TRegion &aNewRegion); williamr@2: void HighlightRegion(const TRegion &aRegion) const; williamr@2: void HighlightNewRegionFromOldL(const TRegion& aOldRegion); williamr@2: void DrawCursorOrRegionL(TUint aMoveFlags); williamr@2: void UpdateSelectedRegion(TInt aSelectCount,TUint aMoveFlags); williamr@2: void AddLabelToRegionL(TUint aMoveFlags); williamr@2: void StartSelectedRegionL(TUint aMoveFlags); williamr@2: TBool ScanColumnsForDrag(TInt aFromColumn,TInt aToColumn,TInt aPointerPos,TInt& aPrevious,TInt& aCurrent); williamr@2: TBool ScanRowsForDrag(TInt aFromRow,TInt aToRow,TInt aPointerPos,TInt& aPrevious,TInt& aCurrent); williamr@2: void DrawDraggingHighlight(const TRect aLine,TDragDraw aDragDraw); williamr@2: void DrawArrowsToInMemoryBitmap(TArrows aArrows); williamr@2: TPoint RelativeCellToPoint(const TCellRef& aCell,TRefPoint aXRef=EMainRef, williamr@2: TRefPoint aYRef=EMainRef) const; williamr@2: TCellRef RelativePointToCell(const TPoint& aPoint,TRefPoint aXRef=EMainRef, williamr@2: TRefPoint aYRef=EMainRef) const; williamr@2: TRect PartialCellRectL(const TCellRef& aCell,const TRect& aClipRect, williamr@2: TRefPoint aXRef=EMainRef,TRefPoint aYRef=EMainRef) const; williamr@2: TRect PartialRangeRect(const TRangeRef& aRange,const TRect& aClipRect, williamr@2: TRefPoint aXRef=EMainRef,TRefPoint aYRef=EMainRef) const; williamr@2: void CreateGc(CGraphicsContext* aGc); williamr@2: void DeleteGc(); williamr@2: static void CleanupGc(TAny* aObject); williamr@2: void ResetGcToDefault(CGraphicsContext* aGc) const; williamr@2: void ScaleDown(TPoint& aPoint,TInt aScaleFactor) const; williamr@2: void ConstructSelectedL(const TRangeRef& aGridRange); williamr@2: williamr@2: CGridImg(CGraphicsDevice* aGraphicsDevice,CGridCellImg* aGridCellImg,CGridLay* aGridLay); williamr@2: CGridImg(CGridCellImg* aGridCellImg,CGridLay* aGridLay); williamr@2: void ConstructL(); williamr@2: williamr@4: //-> williamr@2: void SetGridColors(const TGridColors& aGridColors); williamr@4: //-> williamr@2: private: williamr@2: TRect iGridRect; williamr@2: TPoint iTitlePoint; williamr@2: TPoint iMainPoint; williamr@2: TCellRef iCursorPos; // Persisted williamr@2: TCellRef iNewCursorPos; williamr@2: TCellRef iAnchorPos; williamr@2: williamr@2: CGraphicsDevice* iGraphicsDevice; williamr@2: CGraphicsContext* iGcPtr; williamr@2: CWindowGc* iGc; williamr@2: RWindow* iWin; williamr@2: CGridCellImg* iGridCellImg; //* williamr@2: CGridLabelImg* iGridLabelImg; //* williamr@2: CGridLay* iGridLay; //* Starred items are used in printing williamr@2: CGridCellRegion* iSelected; williamr@2: MGridCursorMoveCallBack* iCursorMoveCallBack; williamr@2: TBool iDrawResizeLines; williamr@2: TInt iDragLabel; williamr@2: TInt iCurrentDragPos; williamr@2: TInt iDragDiff; williamr@2: TInt iDragFlags; williamr@2: TDragDim iDragDim; williamr@2: CFbsBitmap* iDragBmp; williamr@2: TRefPoint iXRefPoint; williamr@2: TRefPoint iYRefPoint; williamr@2: }; williamr@2: williamr@2: williamr@2: class TGridUtils williamr@2: /** A collection of Grid utilities. williamr@2: williamr@2: @publishedAll williamr@2: @released */ williamr@2: { williamr@2: public: williamr@2: IMPORT_C static void FillRect(CGraphicsContext* aGc,TRgb aColor,const TRect &aRect); williamr@2: }; williamr@2: williamr@2: williamr@2: #include williamr@2: #endif