gecko-dev/lib/mac/UserInterface/Tables/CStandardFlexTable.h

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

1998-03-28 05:44:41 +03:00
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
/*
Created 4/10/96 - Tim Craycroft
*/
#pragma once
#include "CSpecialTableView.h"
#include "CKeyUpReceiver.h"
#include <LCommander.h>
#include <LListener.h>
//#include <QAP_Assist.h>
#include "LTableViewHeader.h"
// Need LTableHeader here, need the whole thing in the .cp file.
// Might as well go the whole hog.
class CStandardFlexTable;
class CClickTimer;
class CInlineEditField;
//========================================================================================
class CTableHeaderListener : public LListener
//========================================================================================
{
friend class CStandardFlexTable;
CTableHeaderListener(CStandardFlexTable* inTable) : mTable(inTable) {}
void ListenToMessage(MessageT inMessage, void *ioParam);
protected:
CStandardFlexTable* mTable;
}; // class CTableHeaderListener
class CInlineEditorListener : public LListener
{
public:
CInlineEditorListener ( CStandardFlexTable* inTable ) : mTable(inTable) { }
protected:
void ListenToMessage(MessageT inMessage, void *ioParam);
CStandardFlexTable* mTable;
}; // class CInlineEditorListener
//========================================================================================
class CStandardFlexTable
// Base class of all our tables in Netscape. Differs from LTableView in the essential
// matter of allowing selection of an entire row only.
//========================================================================================
: public CSpecialTableView
, public LDragAndDrop
, public LCommander
, public LBroadcaster
, public CKeyUpReceiver
//, public CQAPartnerTableMixin
{
private:
typedef CSpecialTableView Inherited;
friend class CTableHeaderListener;
friend class CClickTimer;
friend class CInlineEditorListener;
public:
enum {
class_ID = 'sfTb',
msg_SelectionChanged = 'selC'
};
PaneIDT GetSortedColumn() const;
Boolean IsSortedBackwards() const;
LTableViewHeader* GetTableHeader() const { return mTableHeader; }
Boolean IsColumnVisible(PaneIDT inID);
TableIndexT GetSelectedRowCount() const;
virtual void SelectionChanged();
void AddAttachmentFirst(
LAttachment* inAttachment,
Boolean inOwnsAttachment = true);
// nb: AddAttachment adds at end. But this can be called if you want the new attachment
// to be executed before the existing ones.
virtual void SetNotifyOnSelectionChange(Boolean inDoNotify);
virtual Boolean GetNotifyOnSelectionChange();
void SetRightmostVisibleColumn(UInt16 inLastDesiredColumn);
protected:
enum { kMinRowHeight = 18, kDistanceFromIconToText = 5, kIconMargin = 4, kIndentPerLevel = 10,
kIconWidth = 16 };
// for in-place editing, give the CInlineEditor this paneID.
enum { paneID_InlineEdit = 'EDIT' } ;
// ------------------------------------------------------------
// Construction
// ------------------------------------------------------------
CStandardFlexTable(LStream *inStream);
virtual ~CStandardFlexTable();
virtual void SetUpTableHelpers();
virtual void SynchronizeColumnsWithHeader();
// ------------------------------------------------------------
// Generic PowerPlant
// ------------------------------------------------------------
virtual void FinishCreateSelf();
virtual void DrawSelf();
virtual Boolean HandleKeyPress(const EventRecord &inKeyEvent);
virtual void RefreshCellRange(
const STableCell &inTopLeft,
const STableCell &inBotRight); // Overridden to fix a bug in PP.
virtual void Click(SMouseDownEvent &inMouseDown);
virtual void BeTarget();
virtual void DontBeTarget();
// ------------------------------------------------------------
// Sorting
// ------------------------------------------------------------
virtual void ChangeSort(const LTableHeader::SortChange* inSortChange);
// ------------------------------------------------------------
// Selection, MouseDowns
// ------------------------------------------------------------
virtual Boolean ClickSelect(
const STableCell &inCell,
const SMouseDownEvent &inMouseDown);
virtual void ClickSelf(const SMouseDownEvent &inMouseDown);
virtual Boolean ClickDropFlag(
const STableCell &inCell,
const SMouseDownEvent &inMouseDown);
virtual Boolean CellSelects(const STableCell& inCell) const;
virtual Boolean CellWantsClick ( const STableCell & /*inCell*/ ) const { return false; }
void SetFancyDoubleClick(Boolean inFancy) { mFancyDoubleClick = inFancy; }
void SetHiliteDisabled(Boolean inDisable) { mHiliteDisabled = inDisable; }
virtual void HandleSelectionTracking ( const SMouseDownEvent & inMouseDown ) ;
virtual void TrackSelection ( const SMouseDownEvent & inMouseDown ) ;
virtual Boolean HitCellHotSpot ( const STableCell &inCell,
const Rect &inTotalSelectionRect ) ;
virtual void UnselectCellsNotInSelectionOutline ( const Rect & selectionRect ) ;
// override to turn off selection outline tracking
virtual Boolean TableDesiresSelectionTracking ( ) { return true; }
virtual const TableIndexT* GetUpdatedSelectionList(TableIndexT& outSelectionSize);
// Returns a ONE-BASED list of TableIndexT, as it should.
// The result is const because this is not a copy, it is
// the actual list cached in this object. You probably want
// to use CMailFlexTable::GetSelection() for messages stuff.
public:
Boolean GetNextSelectedRow(TableIndexT& inOutAfterRow) const;
Boolean GetLastSelectedRow(TableIndexT& inOutBeforeRow) const;
protected:
void SelectRow(TableIndexT inRow);
void ScrollRowIntoFrame(TableIndexT inRow);
void ScrollSelectionIntoFrame();
// ------------------------------------------------------------
// Drawing
// ------------------------------------------------------------
public:
void HiliteRow(
TableIndexT inRow,
Boolean inHilite);
protected:
// Why don't we just overload DoHilite() to take two different params? Because
// of the scoping rules of C++, if you override a name in one scope, say by a
// derived class, it hides all other versions of that name. As a result, if anyone
// overloaded DrawHilite() in a derived class, it would give a warning that we're
// hiding the other versions of DrawHilite(). This is bad.
virtual void DoHiliteRgn( RgnHandle inHiliteRgn ) const;
virtual void DoHiliteRect( const Rect & inHiliteRect ) const;
// override to do the right thing with what user types in in-place editor
virtual void InlineEditorTextChanged( ) { }
virtual void InlineEditorDone( ) { }
virtual void DoInlineEditing( const STableCell &inCell, Rect & inTextRect );
virtual bool CanDoInlineEditing( ) { return true; }
virtual void DrawCell(
const STableCell &inCell,
const Rect &inLocalRect);
virtual void DrawCellContents(
const STableCell &inCell,
const Rect &inLocalRect);
virtual void GetMainRowText(
TableIndexT inRow,
char* outText,
UInt16 inMaxBufferLength) const;
virtual UInt16 GetNestedLevel(TableIndexT /*inRow*/) const
{ return 0; /* default, no indentation */ }
virtual Boolean GetHiliteText(
TableIndexT inRow,
char* outText,
UInt16 inMaxBufferLength,
Rect* ioRect) const;
virtual Boolean GetHiliteTextRect(
const TableIndexT inRow,
Rect& outRect) const;
virtual void GetHiliteRgn(
RgnHandle ioHiliteRgn);
virtual ResIDT GetIconID(
TableIndexT /*inRow*/) const { return 0; }
virtual SInt16 DrawIcons(
const STableCell& inCell,
const Rect& inLocalRect) const; // don't override, use...
virtual void DrawIconsSelf(
const STableCell& inCell,
IconTransformType inTransformType,
const Rect& inIconRect) const;
virtual Boolean GetIconRect(
const STableCell& inCell,
const Rect& inLocalRect,
Rect& outRect) const;
virtual Boolean GetRowHiliteRgn(TableIndexT inRow, RgnHandle ioHiliteRgn) const;
virtual Boolean GetRowDragRgn(TableIndexT inRow, RgnHandle ioHiliteRgn) const;
virtual void ApplyTextStyle(TableIndexT inRow) const;
// ------------------------------------------------------------
// Row Expansion/Collapsing
// ------------------------------------------------------------
protected:
virtual void SetCellExpansion(const STableCell& /* inCell */, Boolean /* inExpand */) {}
virtual Boolean CellHasDropFlag(const STableCell& /* inCell */, Boolean& /* outIsExpanded */) const { return true; }
virtual Boolean CellInitiatesDrag(const STableCell& /* inCell */) const { return false; }
virtual void GetDropFlagRect( const Rect& inLocalCellRect,
Rect& outFlagRect) const;
virtual TableIndexT CountExtraRowsControlledByCell(const STableCell& inCell) const;
// return zero if there are none.
// ------------------------------------------------------------
// Drag Support
// ------------------------------------------------------------
virtual void DragSelection(const STableCell& inCell, const SMouseDownEvent &inMouseDown);
virtual void AddSelectionToDrag(DragReference inDragRef, RgnHandle inDragRgn);
virtual void AddRowDataToDrag( TableIndexT /* inRow */,
DragReference /* inDragRef */ ) {};
virtual void InsideDropArea(DragReference inDragRef);
virtual void EnterDropArea(DragReference inDragRef, Boolean inDragHasLeftSender);
virtual void LeaveDropArea(DragReference inDragRef);
virtual Boolean PointInDropArea(Point inGlobalPt); // add slop for autoscroll
virtual void ScrollImageBy(
Int32 inLeftDelta,
Int32 inTopDelta,
Boolean inRefresh);
// unhilite before and after.
// Specials
virtual void HiliteDropRow(TableIndexT inRow, Boolean inDrawBarAbove);
virtual TableIndexT GetHiliteColumn() const;
virtual Boolean RowCanAcceptDrop(
DragReference inDragRef,
TableIndexT inDropRow);
virtual Boolean RowCanAcceptDropBetweenAbove(
DragReference inDragRef,
TableIndexT inDropRow);
virtual Boolean RowIsContainer ( const TableIndexT & /* inRow */ ) const { return false; }
void ComputeItemDropAreas ( const Rect & inLocalCellRect, Rect & oTop, Rect & oBottom ) ;
void ComputeFolderDropAreas ( const Rect & inLocalCellRect, Rect & oTop, Rect & oBottom ) ;
// ------------------------------------------------------------
// Miscellany
// ------------------------------------------------------------
PaneIDT GetCellDataType(const STableCell &inCell) const;
void ListenToHeaderMessage(MessageT inMessage, void *ioParam)
{ mTableHeaderListener.ListenToMessage(inMessage, ioParam); }
void SetTextTraits(ResIDT inmTextTraitsID);
//-----------------------------------
// Commands
//-----------------------------------
protected:
virtual void FindCommandStatus(
CommandT inCommand,
Boolean &outEnabled,
Boolean &outUsesMark,
Char16 &outMark,
Str255 outName);
virtual Boolean ObeyCommand(
CommandT inCommand,
void *ioParam);
virtual void DeleteSelection() = 0;
virtual void OpenRow(TableIndexT /* inRow */) {}
virtual void GetInfo();
public:
virtual void OpenSelection();
// stuff that should go away, moved into a utility class
static void DrawIconFamily( ResIDT inIconID,
SInt16 inIconWidth,
SInt16 inIconHeight,
IconTransformType inTransform,
const Rect& inBounds);
static void DrawTextString( const char* inText,
const FontInfo* inFontInfo,
SInt16 inMargin,
const Rect& inBounds,
SInt16 inJustification = teFlushLeft,
Boolean doTruncate = true,
TruncCode truncWhere = truncMiddle);
// ------------------------------------------------------------
// QA Partner support
// ------------------------------------------------------------
#if defined(QAP_BUILD)
public:
virtual void QapGetListInfo (PQAPLISTINFO pInfo);
virtual Ptr QapAddCellToBuf(Ptr pBuf, Ptr pLimit, const STableCell& sTblCell);
virtual void GetQapRowText(TableIndexT inRow, char* outText, UInt16 inMaxBufferLength) const;
#endif
//-----------------------------------
// Data
//-----------------------------------
protected:
CTableHeaderListener mTableHeaderListener;
ResIDT mTextTraitsID;
FontInfo mTextFontInfo;
PaneIDT mTableHeaderPaneID;
LTableViewHeader* mTableHeader;
Int16 mClickCountToOpen;
TableIndexT* mSelectionList;
CClickTimer* mClickTimer;
Boolean mFancyDoubleClick;
Boolean mHiliteDisabled;
// support for dragging, including dragging rows to new positions
TableIndexT mDropRow;
RGBColor mDropColor;
Boolean mIsInternalDrop; // a drop of one row on another ?
Boolean mIsDropBetweenRows; // changing order
CInlineEditField* mNameEditor; // used for inline editing
TableIndexT mRowBeingEdited;
CInlineEditorListener mInlineListener; // listens to the editor and tells us things
}; // class CStandardFlexTable