/* -*- 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
 * Commuyright (C) 1998 Netscape Communications Corporation.  All Rights
 * Resnications Corporation.  Portions created by Netscape are
 * Coperved.
 */

// RDF Tree View for Aurora.  Created by Dave Hyatt.

#ifndef __RDFLINER_H
#define __RDFLINER_H

#include "outliner.h"
#include "property.h"
#include "cxstubs.h"
#include "statbar.h"
#include "navfram.h"
#include "htrdf.h"
#include "rdfglobal.h"
#include "rdfacc.h"

// array of indexes for IDB_BOOKMARKS
#define IDX_BOOKMARKOPEN				0
#define IDX_BOOKMARKCLOSED				1
#define IDX_BOOKMARKMENUOPEN			2
#define IDX_BOOKMARKMENUCLOSED			3
#define IDX_BOOKMARKFOLDEROPEN			4
#define IDX_BOOKMARKFOLDERCLOSED		5
#define IDX_BOOKMARKTOOLBARCLOSED		6
#define IDX_BOOKMARKTOOLBAROPEN			7
#define IDX_BOOKMARKFOLDERMENUOPEN		8
#define IDX_BOOKMARKFOLDERMENUCLOSED    9
#define IDX_BOOKMARKMENUTOOLBARCLOSED	10
#define IDX_BOOKMARKMENUTOOLBAROPEN		11
#define IDX_BOOKMARKFOLDERTOOLBARCLOSED	12
#define IDX_BOOKMARKFOLDERTOOLBAROPEN	13
#define IDX_BOOKMARKALLCLOSED			14
#define IDX_BOOKMARKALLOPEN				15
#define IDX_BOOKMARKCHANGED				16
#define IDX_BOOKMARK					17
#define IDX_BOOKMARKUNKNOWN				18

class CRDFOutlinerParent;

class CRDFOutliner : public COutliner, public CCustomImageObject
{
friend class CRDFOutlinerParent;

private:
	HT_Pane m_Pane;		// The pane that owns this view
	HT_View m_View;		// The view as registered in the hypertree
	HT_Resource m_Node;	// The currently acquired node
	int m_nSortType;	// The type of sort (none, ascending, descending)
	int m_nSortColumn;  // The current column used for sort (none, or the UINT of the column)
	UINT m_hEditTimer;	// The Edit Timer (for editing in place)
	UINT m_hSpringloadTimer; // The Springload timer (for popping open springloaded folders on drag)
	UINT m_hDragRectTimer; // Timer for scrolling on a multiple select drag rectangle
	BOOL m_bNeedToClear; // Used to determine if selection needs to be wiped on a mouse up
	BOOL m_bNeedToEdit;  // Used to determine if an edit field needs to be displayed on a node
	BOOL m_bDoubleClick;  // Used to prevent an edit field from popping up on a double click
	BOOL m_bDataSourceInWindow; // TRUE when something is being dragged around inside the window.
								// Use this to keep springloaded folders behaving properly
	CPtrList m_SpringloadStack; // A list of current OPEN springloaded folders (so that we can close
								// them back up again)
	
	DROPEFFECT m_iCurrentDropAction; // Cache the current drop action

	BOOL m_bCheckForDragRect; // Used to distinguish the dragging of an item from the drawing of a drag
							  // rect for multiple selection
	CRect m_LastDragRect;	  // Position of the last drag rect
	CPoint m_MovePoint;		  // Last position of mouse on a move (Used for drag rect stuff)
	int m_nRectYDisplacement; // Used for scrolling the drag rect

	OutlinerAncestorInfo* m_pAncestor; // Used for drawing the pipes in the tree.
	BOOL m_bPaintingFirstObject; // Used to perform an optimization on the line-drawing part of the tree.
	int m_nSizeOfAncestorArray;	// Also used for the optimization.
	
	CRDFOutlinerParent* m_Parent; // A pointer to the parent container.

	int m_nSelectedColumn; // The currently selected column
	CRDFEditWnd* m_EditField; // The current edit window (if one exists).

	int m_iSpringloadSelection; // Cached last drag-selection to determine springload on drag

	// CLIPFORMATS for drag & drop. 
	CLIPFORMAT m_clipFormatArray[5]; // The list of acceptable formats
	CLIPFORMAT m_cfHTNode;		 // Format for HT nodes.
	CLIPFORMAT m_cfBookmark;	 // Bookmark format (title/URL)
	
	CRDFCommandMap m_MenuCommandMap;  // The command mapping for menus

	CNavTitleBar* m_NavTitleBar;	// A pointer to the title strip.

	// Tree colors, fonts, and backgrounds
	COLORREF m_ForegroundColor;				// The foreground color.  Used for text, separators, etc.
	COLORREF m_BackgroundColor;				// The background color.  For trees with no bg image.  Also
											// displayed until the image loads.
	COLORREF m_SortBackgroundColor;			// The color used to display a highlighted column (that has a sort
											// imposed upon it.
	COLORREF m_SortForegroundColor;			// The color used to display te highlighted text/separators, etc.

	COLORREF m_SelectionForegroundColor;	// Foreground color of the selection
	COLORREF m_SelectionBackgroundColor;	// Background color of the selection

	COLORREF m_ShadowColor;					// Shadow color of the tree (used for drawing separators).
	COLORREF m_HighlightColor;				// Highlight color of the tree (used for drawing separators).

	COLORREF m_SortShadowColor;				// Shadow color of the sorted tree (used for drawing separators).
	COLORREF m_SortHighlightColor;			// Highlight color of the sorted tree (used for drawing separators).

	COLORREF m_RolloverColor;				// Rollover color of the tree.

	COLORREF m_DividerColor;				// Color of the dividers drawn between lines
	BOOL	 m_bDrawDividers;				// Whether or not dividers should be drawn

	CString m_BackgroundImageURL;			// The URL of the background image.
	CRDFImage* m_pBackgroundImage;	// The image for the background.

	BOOL m_bBarColor;				// The color of the tree connections.

	BOOL m_bUseSingleClick;			// Single click vs. double click
	BOOL m_bUseHyperbolicScaling;	// Whether or not to use hyperbolic scaling.

	CString m_WindowTarget;			// The target window for this tree view.  If "", then the
									// last active window is assumed.

	BOOL m_bInNavigationMode;	// The tree view has two different sets of defaults that
								// it will assume if no value is defined for a specific
								// property.  These defaults are based on whether or not
								// the user is browsing or managing data.
	BOOL m_bIsPopup;			// Whether or not we're a popup tree.

public:
    CRDFOutliner (CRDFOutlinerParent* theParent, HT_Pane thePane = NULL, HT_View theView = NULL);
	~CRDFOutliner ( );

	// Inspectors
	COLORREF GetForegroundColor() { return m_ForegroundColor; }
	COLORREF GetBackgroundColor() { return m_BackgroundColor; }
	CString GetBackgroundImageURL() { return m_BackgroundImageURL; }

	HT_View GetHTView() { return m_View; } // Return a handle to the hypertree view
	HT_Resource GetAcquiredNode() { return m_Node; } // Return handle to the acquired HT node
	CRDFOutlinerParent* GetRDFParent() { return m_Parent; } // RDFOutlinerParent handle
	UINT GetSelectedColumn() { return m_nSelectedColumn; } // Returns selected column
	int GetSortColumn() { return m_nSortColumn; }
	int GetSortType() { return m_nSortType; }
	BOOL IsPopup() { return m_bIsPopup; }
	BOOL InNavigationMode() { return m_bInNavigationMode; }

	// Setters
	void SetNavigationMode(BOOL inMode);
	void SetIsPopup(BOOL isPopup) { m_bIsPopup = isPopup; }

	void SetHTView(HT_View v); 
	void SetWindowTarget(char* target) { m_WindowTarget = target; }

	void SetSortType(int sortType) { m_nSortType = sortType; }
	void SetSortColumn(int sortColumn) { m_nSortColumn = sortColumn; }
    void SetSelectedColumn(int nColumn) { m_nSelectedColumn = nColumn; }
	void SetTitleBar(CNavTitleBar* bar) { m_NavTitleBar = bar; }

// I am explicitly labeling as virtual any functions that have been
// overridden.  That is, unless I state otherwise, all virtual functions
// are overridden versions of COutliner functions.
	
	virtual void DestroyColumns();
		// Overridden to destroy the outliner's columns and clear our RDF column command map.

	virtual void InitializeItemHeight(int iDesiredSize) { m_itemHeight = 19; }
		// Overridden to place a pixel of padding on either side of the line and to add a pixel for the
		// divider that is drawn between lines.

	virtual void AdjustTipSize(int& left, int& top, int& hor, int& ver)
	{ top += 1; ver -= 3; };	// Account for the dividers between lines and for the padding.

	virtual int GetIndentationWidth() { return m_pIUserImage->GetImageWidth(); };
		// Gets the width to indent at each level.

	void FocusCheck(CWnd* pWnd, BOOL gotFocus);  
		// Called to potentially update the embedded menu bar in the docked view.

	BOOL IsSelectedColumn(int i) { return m_nSelectedColumn == i; }

	virtual LPCTSTR GetColumnText ( UINT iColumn, void * pLineData );  
		// Grab the text for a particular column.  

	virtual void * AcquireLineData ( int iLine );
		// Acquire (nice spelling, heh) the node for a given line.

	virtual void ReleaseLineData ( void * pLineData );
		// Release the line data for a given line.

	virtual void GetTreeInfo( int iLine, uint32 * pFlags, int * iDepth, 
					  OutlinerAncestorInfo ** pAncestor );
		// Get information about the node at iLine.

	virtual HFONT GetLineFont ( void * pLineData );
		// Get the font (e.g., regular, italic, bold) for the given line.

	virtual int TranslateIcon ( void * pData );
		// Figures out which icon should be used.

	virtual int TranslateIconFolder( void *pData );
		// Don't have a damn clue what this does.

	virtual int ToggleExpansion(int iLine);
		// Called to expand a node.
	
	void FinishExpansion(int parentIndex);
		// Called by the notifyProc to complete the expansion

	virtual void SelectItem(int iSel, int mode, UINT flags);
		// Called to select an item... handles single/double click...everything...

	void OnSelDblClk(int iLine);
		// Different from base class.  Line info is passed as arg.

	virtual void PropertyMenu(int iLine, UINT flags);
		// Displays the context-sensitive menu (when the user right-clicks on a node)

	virtual BOOL IsSelected(int iLine);
		// Used by base class to determine if a line is selected.  Function
		// queries RDF backend instead of relying on the m_Selection member
		// variable in COutliner.

	void EditTextChanged(char* text);
		// Function is called when a column's data has been edited in place.  This
		// function talks to the back end and makes sure the node gets changed.

	char* GetTextEditText();
		// Copies the edit field's text to a char*.  The text must be deleted by the
		// caller of this function.

	void AddTextEdit();
		// Creates a text edit on the selected item and column.

	void RemoveTextEdit();
		// Kills the text edit control.

	void MoveToNextColumn();
		// Called when the user tabs in the edit field to move to the next column.

	CRect GetColumnRect(int lineNo, int columnNo);
		// Gets the rect associated with a specific column and line

	virtual void ColumnsSwapped();
		// Called when the columns' positions have changed (e.g., the user dragged one column to the
		// left of another column).  Added this function so that RDFOutliner (unlike Outliner) will
		// force the tree images to remain on the left.

	int DetermineClickLocation(CPoint point);
		// The master click function.  Determines whether the user clicked on a trigger, on the item itelf,
		// or on the background.

	virtual BOOL TestRowCol(POINT point, int &, int &); 
		// Overridden because Outliner doesn't set the column hit if the row doesn't contain data.

	void copyAncestorValues(HT_Resource r, int numItems, OutlinerAncestorInfo* oldInfo, OutlinerAncestorInfo* newInfo);
		// Used for drawing the lines in the tree.

	void HandleEvent(HT_Notification ns, HT_Resource n, HT_Event whatHappened);
		// The function which handles all the events which occur in the view.
	
	void DisplayURL();
		// Called to display a URL for a non-container node.
	
	BOOL IsDocked();
		// True if the RDF view is docked.

	virtual void LoadComplete(HT_Resource pResource); 
		// Overridden from CCustomObject.  Called when a custom URL image has finished loading.

	virtual BOOL DeleteItem(int iSel);
		// Called when the user decides to delete an item.  The selection argument is completely
		// ignored. (We rely on HT's selection when performing the deletion.)

	virtual int DrawPipes ( int iLineNo, int iColNo, int offset, HDC hdc, void * pLineData );
		// Overridden to handle the drawing of custom icons.

	void PaintLine ( int iLineNo, HDC hdc, LPRECT lpPaintRect, HBRUSH hHighlightBrush,
						       HPEN hHighlightPen );
		// This PaintLine is used instead of the one in the outliner base class. Overridden so
		// that individual columns can be selected (instead of an entire line).

	void PaintColumn(int iLineNo, int iColumn, LPRECT lpColumnRect, 
							   HDC hdc, void * pLineData, HBRUSH hHighlightBrush,
							   HPEN hHighlightPen);
		// Used instead of the outliner PaintColumn.  Same reason as above.

	void DrawColumn(HDC hdc, LPRECT lpColumnRect, LPCTSTR lpszString,
					CropType_t cropping, AlignType_t alignment, HBRUSH theBrush = NULL, 
					BOOL hasFocus = FALSE);
		// Used instead of the outliner DrawColumnText.  Same reason.

	void InvalidateIconForResource(HT_Resource r);
		// Invalidates only the icon for a given node.  The rest of the line is left alone.

	CRect ConstructDragRect(const CPoint& pt1, const CPoint& pt2);
		// Constructs a new rectangle with the two points specified as opposing corners.

	void EraseDragRect(CDC* pDC, CRect rect);
		// Helper to blow away the drag rect

	void DragRectScroll(BOOL bBackwards);
		// Function to scroll the drag rect

	virtual void InitializeClipFormats();
		// Registers the formats we accept (drag/drop) when the window is created.

	virtual CLIPFORMAT * GetClipFormatList();
		// Returns an array of CLIPFORMATS that we are willing to handle.  Used
		// for drag over feedback.

	virtual DROPEFFECT DropSelect (int iLineNo, COleDataObject *object );
		// Used to determine type of drop.

	virtual int GetDragHeartbeat();
		// Speed at which the tree scrolls on a drag.  Overridden to be faster than COutliner.

	virtual void AcceptDrop( int iLineNo, COleDataObject *pDataObject, DROPEFFECT dropEffect );
		// Called when a drop occurs on a given line in the view.  This function actually
		// handles the drop.

	virtual BOOL HighlightIfDragging(void);
		// Called to determine whether or not a node should be highlighted when an item is dragged
		// OVER it.  We only highlight containers (folders).

	virtual void PaintDragLine(HDC hdc, CRect &rectColumn);
		// Called to draw the drag line that indicates the drop will occur AFTER this item in the tree.

	virtual COleDataSource * GetDataSource();
		// Called when a drag is initiated in this view to copy the node.

	COleDropTarget* GetDropTarget() { return (COleDropTarget*)m_pDropTarget; }
		// Returns the drop target associated with the COutliner base class

	virtual COutlinerDropTarget* CreateDropTarget();
		// Called to create the RDF drop target.

	afx_msg int OnCreate ( LPCREATESTRUCT );
	    // Overridden to allow for special create stuff.

	afx_msg void OnPaint();
		// Overridden to perform a drawing optimization (not performed by Outliner)

	afx_msg void OnSize( UINT nType, int cx, int cy );
		// Overridden to ensure column repainting and resizing.

	afx_msg void OnLButtonDown ( UINT nFlags, CPoint point );
	afx_msg void OnLButtonUp (UINT nFlags, CPoint point );
	afx_msg void OnMouseMove( UINT nFlags, CPoint point );
	afx_msg void OnRButtonDown ( UINT nFlags, CPoint point );
	afx_msg void OnRButtonUp ( UINT nFlags, CPoint point );
		// All overridden to allow the drawing of a drag rectangle for multiple selection
		// and to implement improved hit testing.

	afx_msg void OnTimer(UINT id);
		// Used for editing columns and what-not.

	afx_msg void OnSetFocus(CWnd* pOldWnd);
	afx_msg void OnKillFocus(CWnd* pNewWnd);
		// Overridden to update the nav title caption colors (in a docked Aurora view).


	afx_msg BOOL OnCommand(UINT wParam, LONG lParam);
		// Menu commands are handled by the rdfliner.

	DECLARE_MESSAGE_MAP();

	friend class CRDFDropTarget;
	friend class CRDFOutlinerParent;
};

class CRDFDropTarget: public COutlinerDropTarget
{
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);

	CRDFDropTarget(COutliner* pOutliner) :COutlinerDropTarget(pOutliner) {};
};

class CRDFOutlinerParent : public COutlinerParent, CCustomImageObject 
{
private:
	CRDFCommandMap columnMap;
	COLORREF m_ForegroundColor;
	COLORREF m_BackgroundColor;
	CRDFImage* m_pBackgroundImage;
	CString m_BackgroundImageURL;

public:
	CRDFOutlinerParent(HT_Pane thePane = NULL, HT_View theView = NULL);

	BOOL PreCreateWindow(CREATESTRUCT& cs);
	COutliner* GetOutliner();
	void CreateColumns();
	void DestroyColumns() { columnMap.Clear(); }

	BOOL RenderData( int iColumn, CRect & rect, CDC &dc, LPCTSTR text );
	BOOL ColumnCommand( int iColumn );
	void Initialize();
	CRDFCommandMap& GetColumnCommandMap() { return columnMap; }

	void LoadComplete(HT_Resource r) { Invalidate(); }

	void SetHTView(HT_View newView) { ((CRDFOutliner*)GetOutliner())->SetHTView(newView); Invalidate(); GetOutliner()->Invalidate(); }

protected:
    afx_msg void OnDestroy();
	afx_msg void OnPaint();
    DECLARE_MESSAGE_MAP()
};


class CRDFContentView : public CView
{
public:
    CRDFOutlinerParent * m_pOutlinerParent;
	CPaneCX* m_pHTMLView;
	CNavTitleBar* m_pNavBar;

// Construction
public:
	CRDFContentView();
	
	~CRDFContentView();

	void OnDraw(CDC* pDC) {};

	COutlinerParent* GetOutlinerParent() { return m_pOutlinerParent; }

// This functionality has been folded in from COutlinerView. 

    void CreateColumns ( )
    {
        m_pOutlinerParent->CreateColumns ( );
    }

	void SwitchHTViews(HT_View htView);

	CNavTitleBar* GetTitleBar() { return m_pNavBar; }

	static CRDFContentView* DisplayRDFTreeFromSHACK(CWnd* pParent, int xPos, int yPos, int width, 
		int height, char* url,  int32 param_count, char** param_names, char** param_values);
		// This function can be called to create an embedded RDF tree view using an
		// external URL and specified targeting.
	
	static CRDFContentView* DisplayRDFTreeFromResource(CWnd* pParent, int xPos, int yPos, int width, 
		int height, HT_Resource node, CCreateContext* pContext = NULL);
		// This function creates an embedded RDF tree view from an existing resource.

	static CRDFContentView* DisplayRDFTreeFromPane(CWnd* pParent, int xPos, int yPos, int width,
		int height, HT_Pane pane, CCreateContext* pContext = NULL);
		// This function creates an embedded RDF tree view once the pane has been constructed.

protected:

    DECLARE_DYNCREATE(CRDFContentView)
	//{{AFX_MSG(CRDFContentView)
	afx_msg LRESULT OnNavCenterQueryPosition(WPARAM wParam, LPARAM lParam);
	afx_msg int OnCreate ( LPCREATESTRUCT );
    afx_msg void OnSize ( UINT, int, int );
    afx_msg void OnSetFocus ( CWnd * pOldWnd );
	afx_msg void OnKillFocus (CWnd* pNewWnd); 
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

class FAR CExportRDF : public CDialog
{
protected:
	CString m_csCaption;

// Construction
public:
    CExportRDF(CWnd* pParent = NULL);  // standard constructor

    void SetSecureTitle( CString &csTitle ) { m_csTitle = csTitle; }
    
// Dialog Data
    //{{AFX_DATA(CExportRDF)
    enum { IDD = IDD_EXPORTRDF };
    CString m_csAsk;
    CString m_csAns;
    //}}AFX_DATA

    CString m_csTitle;
    
// Implementation
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    DECLARE_MESSAGE_MAP()
};

#endif
