pjs/cmd/winfe/outliner.h

550 строки
16 KiB
C++

/* -*- 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.
*/
#ifndef _OUTLINER_H
#define _OUTLINER_H
#include "apiimg.h"
#include "apioutln.h"
#include "msgcom.h"
#include "tooltip.h"
#define WM_COLUMN_COMMAND WM_USER+5000
#define OUTLINER_OPENFOLDER 1
#define OUTLINER_CLOSEDFOLDER 2
#define OUTLINER_ITEM 3
// array of indexes for IDB_OUTLINER
#define IDX_TREEITEM 0
#define IDX_TREEFOLDERCLOSED 1
#define IDX_TREEFOLDEROPEN 2
#define IDX_CLOSEDBOTTOMPARENT 3
#define IDX_CLOSEDTOPPARENT 4
#define IDX_CLOSEDMIDDLEPARENT 5
#define IDX_CLOSEDSINGLEPARENT 6
#define IDX_OPENBOTTOMPARENT 7
#define IDX_OPENMIDDLEPARENT 8
#define IDX_OPENTOPPARENT 9
#define IDX_OPENSINGLEPARENT 10
#define IDX_BOTTOMITEM 11
#define IDX_MIDDLEITEM 12
#define IDX_TOPITEM 13
#define IDX_VERTPIPE 14
#define IDX_HORZPIPE 15
#define IDX_EMPTYITEM 16
// array of indexes for IDB_COLUMN
#define IDX_SORTINDICATORUP 0
#define IDX_SORTINDICATORDOWN 1
#define IDX_PUSHLEFT 2
#define IDX_PUSHRIGHT 3
#define IDX_PUSHLEFTI 4
#define IDX_PUSHRIGHTI 5
#ifndef FLOAT
#define FLOAT float
#endif
typedef struct
{
XP_Bool has_next;
XP_Bool has_prev;
} OutlinerAncestorInfo;
typedef struct {
LPCTSTR pHeader;
Column_t cType;
int iMinColSize;
int iMaxColSize;
FLOAT fPercent;
FLOAT fDesiredPercent;
int iCol;
UINT iCommand;
BOOL bDepressed;
BOOL bVisible;
BOOL bIsButton;
CropType_t cropping;
AlignType_t alignment;
} OutlinerColumn_t;
class CTip; // In tip.h
class COutliner : public CWnd,
public CGenericObject,
public IOutliner
{
friend class COutlinerDropTarget;
friend class COutlinerParent;
#ifdef _WIN32
private:
// MouseWheel deltra tracker.
int m_iWheelDelta;
#endif
public:
OutlinerColumn_t ** m_pColumn;
int m_iNumColumns;
int m_iVisColumns;
protected:
LPUNKNOWN m_pUnkImage;
LPIMAGEMAP m_pIImage;
LPUNKNOWN m_pUnkUserImage;
LPIMAGEMAP m_pIUserImage;
int m_iTotalLines;
int m_iTopLine;
int m_cyChar, m_cxChar;
int m_itemHeight;
int m_iPaintLines;
UINT m_idImageCol;
BOOL m_bHasPipes;
BOOL m_bHasImageOnlyColumn;
int m_iCSID;
static BOOL m_bTipsEnabled;
CTip *m_pTip;
int m_iTipState, m_iTipTimer;
int m_iTipRow, m_iTipCol;
COutlinerDropTarget * m_pDropTarget;
HFONT m_hBoldFont, m_hRegFont, m_hItalFont;
BOOL m_bDragging;
RECT m_rcHit;
POINT m_ptHit;
int m_iColHit, m_iRowHit;
int m_iSelection, m_iFocus;
int m_iLastSelected;
int m_iDragSelection;
int m_iDragSelectionLineHalf; // Which half of the selection is the drag over
int m_iDragSelectionLineThird; // Which third of the selection is the drag over
BOOL m_bDragSectionChanged;
BOOL m_bClearOnRelease;
BOOL m_bSelectOnRelease;
BOOL m_bLButtonDown;
int m_iTotalWidth;
BOOL m_bDraggingData;
// Methods
void TipHide ( );
void HandleMouseMove( POINT point );
int LineFromPoint (POINT point);
virtual BOOL TestRowCol(POINT point, int &, int &);
virtual UINT GetOutlinerBitmap(void);
BOOL ViewerHasFocus ( );
virtual void ColumnsSwapped() {};
void DoToggleExpansion( int iLine );
void DoExpand( int iLine );
int DoExpandAll( int iLine );
void DoCollapse( int iLine );
int DoCollapseAll( int iLine );
int GetPipeIndex ( void *pData, int iDepth, OutlinerAncestorInfo * pAncestor );
void RectFromLine ( int iLineNo, LPRECT lpRect, LPRECT lpOutRect );
void EraseLine ( int iLineNo, HDC hdc, LPRECT lpRect );
virtual int DrawPipes ( int iLineNo, int iColNo, int offset, HDC hdc, void * pLineData );
void PaintLine ( int iLineNo, HDC hdc, LPRECT lpPaintRect );
void PaintColumn ( int iLineNo, int iColumn, LPRECT lpColumnRect, HDC hdc,
void * pLineData );
virtual void PaintDragLine(HDC hdc, CRect &rectColumn);
void EnableScrollBars ( void );
void DrawColumnText (HDC hdc, LPRECT lpColumnRect, LPCTSTR lpszText,
CropType_t cropping, AlignType_t alignment );
// Basic Overrideables
virtual void AdjustTipSize(int& left, int& top, int& hor, int& vert) {};
virtual int GetIndentationWidth();
virtual COutlinerDropTarget* CreateDropTarget();
// right mouse menu stuff
virtual void PropertyMenu(int iSel, UINT flags=0);
// Line stuff
virtual int GetDepth( int iLine );
virtual int GetNumChildren( int iLine );
virtual int GetParentIndex( int iLine );
virtual BOOL IsCollapsed( int iLine );
virtual BOOL HasFocus ( int iLine );
virtual BOOL IsSelected ( int iLine );
virtual int ToggleExpansion ( int iLine );
virtual int Expand ( int iLine );
virtual int Collapse ( int iLine );
virtual int ExpandAll ( int iLine );
virtual int CollapseAll ( int iLine );
void InvalidateLine ( int iLineNo );
void InvalidateLines( int iStart, int iCount );
virtual BOOL HighlightIfDragging(void);
// Column Stuff
void GetColumnRect( int iCol, RECT &rc );
void InvalidateColumn( int iCol );
// Drawing stuff
virtual LPCTSTR GetColumnText ( UINT iColumn, void * pLineData );
virtual LPCTSTR GetColumnTip ( UINT iColumn, void * pLineData );
virtual BOOL RenderData ( UINT, CRect &, CDC &, LPCTSTR lpsz = NULL );
virtual void * AcquireLineData ( int iLine );
virtual void ReleaseLineData ( void * pLineData );
virtual void GetTreeInfo ( int iLine, uint32 * pFlags, int * iDepth,
OutlinerAncestorInfo ** pAncestor );
virtual HFONT GetLineFont ( void * pLineData );
virtual int TranslateIcon ( void * );
virtual int TranslateIconFolder ( void * );
// Navigation stuff
virtual void PositionHome ( void );
virtual void PositionEnd ( void );
virtual void PositionPageUp ( void );
virtual void PositionPageDown ( void );
virtual void PositionPrevious ( void );
virtual void PositionNext ( void );
// Sizing stuff
virtual BOOL SqueezeColumns( int iColFrom = -1, int iDelta = 0, BOOL bRepaint = TRUE );
virtual void InitializeItemHeight(int iDesiredSize);
// Command stuff
virtual BOOL ColumnCommand ( int idColumn, int iLineNo );
// drag drop stuff
// clip format
virtual void InitializeClipFormats(void);
virtual CLIPFORMAT * GetClipFormatList(void);
virtual BOOL RecognizedFormat( COleDataObject * );
// initiating drag
virtual COleDataSource * GetDataSource(void);
virtual void InitiateDragDrop(void);
// accepting drop
virtual DROPEFFECT DropSelect(int iLineNo, COleDataObject *pObject);
virtual void AcceptDrop( int iLineNo, COleDataObject * pObject, DROPEFFECT dropEffect );
virtual void EndDropSelect (void);
// accessors
virtual int GetDropLine(void);
virtual int GetDragHeartbeat();
BOOL IsDragging() { return m_bDragging; }
virtual void OnSelChanged();
virtual void OnSelDblClk();
public:
COutliner (BOOL bUseTriggerAndLineBitmaps = TRUE);
~COutliner ( );
STDMETHODIMP QueryInterface(REFIID,LPVOID *);
void EnableTips(BOOL = TRUE);
BOOL GetTipsEnabled() { return m_bTipsEnabled; }
void SetCSID( int csid );
int GetCSID() { return m_iCSID; }
int AddColumn ( LPCTSTR header, UINT idCol,
int iMinCol, int iMaxCol = 10000,
Column_t cType = ColumnFixed, int iPercent = 50,
BOOL bIsButton = TRUE, CropType_t ct = CropRight,
AlignType_t at = AlignLeft );
int GetColumnSize ( UINT idCol );
void SetColumnSize ( UINT idCol, int iSize );
int GetColumnPercent ( UINT idCol );
void SetColumnPercent ( UINT idCol, int iPercent );
int GetColumnPos( UINT idCol );
UINT GetColumnAtPos( int iPos );
void SetColumnPos( UINT idCol, int iColumn );
void SetColumnName ( UINT idCol, LPCTSTR pName );
LPCTSTR GetColumnName( UINT idCol ) { return NULL; }
void SetImageColumn( UINT idCol ) { m_idImageCol = idCol; }
void SetHasPipes( BOOL bPipes ) { m_bHasPipes = bPipes; }
//Sometimes you want to distinguish between a column that only has an
//image versus one that has both text and image.
void SetHasImageOnlyColumn(Bool bImageOnly) {m_bHasImageOnlyColumn = bImageOnly;}
int GetNumColumns() { return m_iNumColumns; }
void SetVisibleColumns( UINT iVisCol ) { m_iVisColumns = iVisCol; }
UINT GetVisibleColumns() { return m_iVisColumns; }
int GetNumberVisibleRows() { return m_iPaintLines; }
BOOL GetIsColumnVisible( int columnID );
void LoadXPPrefs( const char *prefname );
void SaveXPPrefs( const char *prefname );
// Item stuff
virtual void SelectItem ( int iSel, int mode = OUTLINER_SET, UINT flags = 0 );
virtual BOOL DeleteItem ( int iLine ) { return TRUE; }
void ScrollIntoView( int iVisibleLine );
void EnsureVisible(int iVisibleLine);
virtual void SetFocusLine(int iLine);
virtual int GetFocusLine();
virtual void SetTotalLines( int );
virtual int GetTotalLines();
protected:
//
// rhp - Adding this stuff in to try to give QA partner a way to
// get the information out of the outliner objects. This will be
// a single entry point used with the WM_COPYDATA message.
//
afx_msg LONG OnProcessOLQAHook(UINT, LONG);
afx_msg int OnCreate ( LPCREATESTRUCT );
afx_msg void OnPaint ( );
afx_msg void OnSize ( UINT, int, int );
afx_msg void OnGetMinMaxInfo ( MINMAXINFO FAR* lpMMI );
afx_msg void OnDestroy ( );
afx_msg void OnLButtonDown ( UINT nFlags, CPoint point );
afx_msg void OnMouseMove( UINT nFlags, CPoint point );
afx_msg void OnLButtonUp ( UINT nFlags, CPoint point );
afx_msg void OnRButtonDown ( UINT nFlags, CPoint point );
afx_msg void OnRButtonUp( UINT nFlags, CPoint pt );
afx_msg void OnKeyUp ( UINT nChar, UINT nRepCnt, UINT nFlags );
afx_msg void OnKeyDown ( UINT nChar, UINT nRepCnt, UINT nFlags );
afx_msg void OnSysKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags );
afx_msg void OnLButtonDblClk ( UINT nFlags, CPoint point );
afx_msg void OnKillFocus ( CWnd * pNewWnd );
afx_msg void OnSetFocus ( CWnd * pOldWnd );
afx_msg void OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar );
afx_msg BOOL OnEraseBkgnd( CDC * );
afx_msg void OnTimer( UINT );
afx_msg BOOL OnSetCursor( CWnd* pWnd, UINT nHitTest, UINT message );
afx_msg void OnSysColorChange( );
afx_msg UINT OnGetDlgCode( );
#if defined(XP_WIN32) && _MSC_VER >= 1100
afx_msg LONG OnHackedMouseWheel(WPARAM wParam, LPARAM lParam);
afx_msg LONG OnMouseWheel(WPARAM wParam, LPARAM lParam);
#endif
DECLARE_MESSAGE_MAP()
};
class CMSelectOutliner: public COutliner
{
protected:
MSG_ViewIndex *m_pIndices;
int m_iIndicesSize, m_iIndicesCount;
int m_iShiftAnchor;
BOOL m_bNoMultiSel;
public:
CMSelectOutliner();
~CMSelectOutliner();
void GetSelection( const MSG_ViewIndex *&indices, int &count );
virtual void SetTotalLines( int iLines );
virtual BOOL IsSelected ( int iLine );
virtual void PositionHome( );
virtual void PositionEnd( );
virtual void PositionPrevious( );
virtual void PositionNext( );
virtual void PositionPageUp( );
virtual void PositionPageDown( );
virtual void SelectItem ( int iSel, int mode = OUTLINER_SET, UINT flags = 0 );
virtual void SelectRange( int iStart, int iEnd, BOOL bNotify );
//multiple selection is on by default
virtual void SetMultipleSelection(BOOL bMultipleSelection);
protected:
virtual void AddSelection( MSG_ViewIndex iSel );
virtual void SelectRange( MSG_ViewIndex iSelBegin, MSG_ViewIndex iSelEnd );
virtual void RemoveSelection( MSG_ViewIndex iSel );
virtual void RemoveSelectionRange( MSG_ViewIndex iSelBegin, MSG_ViewIndex iSelEnd );
virtual void ClearSelection();
virtual BOOL HandleInsert( MSG_ViewIndex iStart, LONG iCount );
virtual BOOL HandleDelete( MSG_ViewIndex iStart, LONG iCount );
virtual void HandleScramble();
};
class COutlinerParent: public CWnd
{
protected:
CNSToolTip2 m_wndTip;
BOOL m_bDisableHeaders;
BOOL m_bHasBorder;
HFONT m_hToolFont;
int m_iHeaderHeight;
int m_cxChar;
POINT m_pt, m_ptHit;
RECT m_rcTest;
RECT m_rcHit, m_rcDrag;
HBITMAP m_hbmDrag;
HDC m_hdcDrag;
BOOL m_bEnableFocusFrame;
BOOL m_bResizeArea;
BOOL m_bResizeColumn;
BOOL m_bHeaderSelected;
BOOL m_bDraggingHeader;
UINT m_idColHit;
int m_iColHit;
int m_iColResize;
int m_iColLoser;
LPUNKNOWN m_pUnkImage;
LPIMAGEMAP m_pIImage;
LPUNKNOWN m_pUnkUserImage;
LPIMAGEMAP m_pIUserImage;
enum { pusherNone = 0, pusherLeft = 1, pusherRight = 2, pusherLeftRight = 3 };
int m_iPusherWidth;
int m_iPusherState;
int m_iPusherRgn;
int m_iPusherHit;
void InvalidatePusher();
int TestPusher( POINT &pt );
BOOL TestCol( POINT &pt, int &iCol );
void GetColumnRect( int iCol, RECT &rc );
virtual BOOL ColumnCommand ( int idColumn );
virtual BOOL RenderData ( int idColumn, CRect & rect, CDC & dc, LPCTSTR lpsz = NULL );
void DrawButtonRect( HDC hDC, const RECT &rect, BOOL bDepressed );
void DrawColumnHeader( HDC hDC, const RECT &rect, int iCol );
BOOL ResizeClipCursor();
public:
COutliner * m_pOutliner;
COutlinerParent();
~COutlinerParent();
void EnableBorder ( BOOL bEnable = TRUE ) { m_bHasBorder = bEnable; }
void EnableHeaders ( BOOL bEnable = TRUE) { m_bDisableHeaders = !bEnable; Invalidate ( ); }
void EnableFocusFrame ( BOOL bEnable = TRUE) { m_bEnableFocusFrame = bEnable; }
void SetOutliner ( COutliner * pOutliner );
void InvalidateColumn( int iCol );
void UpdateFocusFrame();
virtual COutliner * GetOutliner ( void ) { return NULL; }
virtual void CreateColumns ( void ) { }
protected:
virtual BOOL PreTranslateMessage( MSG* pMsg );
//{{AFX_MSG(COutlinerParent)
afx_msg int OnCreate ( LPCREATESTRUCT );
afx_msg void OnSize( UINT nType, int cx, int cy );
afx_msg void OnGetMinMaxInfo( MINMAXINFO FAR* lpMMI );
afx_msg void OnSetFocus ( CWnd * pOldWnd );
afx_msg BOOL OnEraseBkgnd( CDC * );
afx_msg void OnPaint ( void );
afx_msg void OnLButtonDown( UINT nFlags, CPoint point );
afx_msg void OnLButtonUp( UINT nFlags, CPoint point );
afx_msg void OnKeyDown ( UINT nChar, UINT nRepCnt, UINT nFlags );
afx_msg void OnMouseMove( UINT nFlags, CPoint point );
afx_msg BOOL OnSetCursor( CWnd* pWnd, UINT nHitTest, UINT message );
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
///////////////////////////////////////////////////////////////////////
// COutlinerView
class COutlinerView: public CView
{
public:
COutlinerParent * m_pOutlinerParent;
void CreateColumns ( )
{
m_pOutlinerParent->CreateColumns ( );
}
protected:
~COutlinerView() {
delete m_pOutlinerParent;
}
virtual void OnDraw(CDC *pDC);
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
afx_msg int OnCreate ( LPCREATESTRUCT );
afx_msg void OnSize ( UINT, int, int );
afx_msg void OnSetFocus ( CWnd * pOldWnd );
DECLARE_MESSAGE_MAP()
DECLARE_DYNCREATE(COutlinerView)
};
//////////////////////////////////////////////////////////////////////////////
// COutlinerDropTarget declaration
class COutlinerDropTarget: public COleDropTarget
{
protected:
DWORD m_dwOldTicks;
COutliner *m_pOutliner;
public:
DROPEFFECT OnDragEnter(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
BOOL OnDrop(CWnd* pWnd, COleDataObject* pDataObject, DROPEFFECT dropEffect, CPoint point);
DROPEFFECT OnDragOver(CWnd* pWnd, COleDataObject* pDataObject, DWORD dwKeyState, CPoint point);
void OnDragLeave(CWnd* pWnd);
#ifdef _WIN32
DROPEFFECT OnDragScroll(CWnd* pWnd, DWORD dwKeyState, CPoint point);
#else
BOOL OnDragScroll(CWnd* pWnd, DWORD dwKeyState, CPoint point);
#endif
void DragScroll(BOOL);
COutlinerDropTarget(COutliner *);
};
#ifndef _WIN32
HGDIOBJ GetCurrentObject(HDC hdc, UINT uObjectType);
#endif
#endif