/* -*- 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 NAVCNTR_H
#define NAVCNTR_H

#include "usertlbr.h"

//  Window Control IDs for NavCenter.
//  Improves findability.
#define NC_IDW(ID) (AFX_IDW_PANE_LAST - (ID))
#define NC_IDW_MISCVIEW NC_IDW(0)
#define NC_IDW_SELECTOR NC_IDW(1)
#define NC_IDW_OUTLINER NC_IDW(2)
#define NC_IDW_HTMLPANE NC_IDW(3)
#define NC_IDW_DRAGEDGE NC_IDW(5)
#define NC_IDW_NAVMENU NC_IDW(6)


#define ICONXPOS  5
#define ICONYPOS  5
#define ICONYINC  42
#define SCROLLID 2900
#define ICONBASEID 3000
#define BUTTON_HEIGHT 28
#define BUTTON_WIDTH 28
#define IMAGE_SIZE 23
#define TEXT_HEIGHT 20
#define SCROLLTIMERID 2910
#define NOSCROLL 0
#define SCROLLUP 1
#define SCROLLDOWN 2
#define SCROLLLEFT 3
#define SCROLLRIGHT 4
#define SCROLLSTEP 32
#define MAX_BUTTON_TITLE 54

#define EDIT_CONTROL  4000

#define IDT_PANESWITCH 40000
#define IDT_SWITCHDELAY	500

#include "cxicon.h"
#include "htrdf.h"

#define ID_BUTTONEVENT 1000
#define ID_MOUSE_MOVE  1001

class CRDFContentView;

class CSelectorButton : public CLinkToolbarButton
{
friend class CSelector;

protected:
	CView* pView;	// View including the HTML pane
	CRDFContentView* m_pTreeView; // Pointer straight to the RDF Tree view.
	CPaneCX* m_pPane;
	CSelector* m_pSelector;
	HT_View m_HTView; // Pointer to HT_View if one exists.  Could be NULL.
	HT_Pane m_Pane; // This is the button's popup menu pane.
	// The Selector Button actually has two HT_Nodes, two HT_Views, and two HT_Panes. One set is the pane in
	// which the button is found (along with all the other buttons).  The second set is for the popup menu
	// that comes up on a timed mouse down on the button.  
	// m_HTView is used with the pane that contains all the buttons.
	// m_Pane is used for the popup menu.
	// The base class has an m_Node member variable.  This is the popup variable's top node in its selected
	// HT_View.  -- Dave H.

public:
	CSelectorButton(CSelector* pSelector) 
		:m_pSelector(pSelector), pView(NULL), m_pPane(NULL), 
		 m_HTView(NULL) {};
	
	~CSelectorButton();

	void SetHTView(HT_View v) { m_HTView = v; }
	virtual HT_View GetHTView() { return m_HTView; }

	CView* GetView() { return pView; }

	virtual BOOL UseLargeIcons() { return TRUE; }

	virtual void OnAction(void);

	int Create(CWnd *pParent, int nToolbarStyle, CSize noviceButtonSize, CSize advancedButtonSize,
			   LPCTSTR pButtonText, LPCTSTR pToolTipText, 
			   LPCTSTR pStatusText,
			   CSize bitmapSize, int nMaxTextChars, int nMinTextChars, 
			   HT_Resource pNode, DWORD dwButtonStyle = 0, CView* view = NULL, CPaneCX* pane = NULL);

	void SetDepressed(BOOL b) { m_bDepressed = b; Invalidate(); }

	CRDFContentView* GetTreeView() { return m_pTreeView; }	// Returns only the tree

	void SetTreeView(CRDFContentView* tree) { m_pTreeView = tree; } // Sets the tree view

	virtual void DrawPicturesMode(HDC hDC, CRect rect);
		// Overridden because LinkToolbarButtons draw text with the pictures always.  We
		// want to revert to ToolbarButton behavior.

	virtual void DrawPicturesAndTextMode(HDC hDC, CRect rect);
		// Overridden to ensure bitmap is drawn on top rather than on side (as is the case
		// with LinkToolbar buttons).

	virtual CSize GetButtonSizeFromChars(CString s, int c);
		// Overridden to put the bitmap on top.

	virtual void GetPicturesAndTextModeTextRect(CRect &rect);
		// more bitmap on top goodness

	virtual void GetPicturesModeTextRect(CRect &rect);
		// gotta have that bitmap on top

	virtual CPoint RequestMenuPlacement()
	{
		CPoint point(GetRequiredButtonSize().cx, 0);
		ClientToScreen(&point);
		return point;  // Want it to open on the side.
	}

	void DisplayMenuOnDrag();
		// Called when the user mouses over a selector button and NO TREE IS DISPLAYED (i.e., just the
		// selector is showing in a docked view.

	virtual BOOL CreateRightMouseMenu();
		// Overridden to bring up context menus.

};

class CSelectorDropTarget : public COleDropTarget
{
public:
//Construction
    CSelectorDropTarget(CSelector* parentFrame);
    ~CSelectorDropTarget();
    BOOL        OnDrop(CWnd *, COleDataObject *, DROPEFFECT, CPoint);
    DROPEFFECT  OnDragEnter(CWnd *, COleDataObject *, DWORD, CPoint);
    DROPEFFECT  OnDragOver(CWnd *, COleDataObject *, DWORD, CPoint);
    void        OnDragLeave(CWnd *);
    CSaveCX*		pSaveContext;
	char		fileName[_MAX_PATH];
	CFile* fd;
	CSelector* m_pParent;
	CString		m_url;
private:
    int m_nIsOKDrop;
};

class CNavSelScrollButton : public CButton
{
public:
	CNavSelScrollButton(HBITMAP hBmp, int width, int index, int height);
	HBITMAP m_hbmp;
	int m_buttonID;
	int m_index;
	int m_width;
	int m_height;
	BOOL m_selected;
	CRect m_boundBox;
	DECLARE_DYNCREATE(CNavSelScrollButton)
	void setBoundingBox(int left, int top, int right, int bottom) {
		 m_boundBox.SetRect(left, top, right, bottom);
	}
	void AdjustPos(){	MoveWindow(m_boundBox);}
	BOOL IsPtInRect(POINT &pt) 
	{ if (PtInRect(&m_boundBox, pt)) return TRUE;
	  else return FALSE;}
	virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );
// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CButton)

	//}}AFX_VIRTUAL
	DECLARE_MESSAGE_MAP()
};


class CSelector : public CView
{

friend class CSelectorButton;
public:
	DECLARE_DYNAMIC(CSelector)
	CSelector();
	virtual ~CSelector();
	void AddViewContext(const char* pTitle, CView* pView, CRDFContentView* pTree, 
						CPaneCX* htmlPane, HT_View theView);
	CView* GetCurrentView(); // Gets the view including the HTML pane
	CSelectorButton* GetCurrentButton();

	void SetCurrentView(CSelectorButton* pButton);
	void SelectNthView(int i);
	
	void PopulatePane();
	void DestroyViews();
	void ConstructView(HT_View v);
	HT_Pane GetHTPane() {return m_Pane;}
	void ShowScrollButton(CSelectorButton* button);
	void OnDraw( CDC* pDC );
	int GetScrollDirection() {return m_scrollDirection;}
	void ScrollSelector();
	void StopScrolling() {m_scrollDirection = NOSCROLL;}
	void UnSelectAll();
	HBRUSH GetNormalBrush() {return hBrush;}
	HBRUSH GetHtBrush() {return hHtBrush;}

	void SetDragButton(CSelectorButton* pButton) { m_pDragButton = pButton; };
	CSelectorButton* GetDragButton() { return m_pDragButton; }
	UINT GetSwitchTimer() { return m_hPaneSwitchTimer; }
	void KillSwitchTimer() { KillTimer(IDT_PANESWITCH); m_hPaneSwitchTimer = 0; }
	void SetSwitchTimer() { m_hPaneSwitchTimer = SetTimer(IDT_PANESWITCH, IDT_SWITCHDELAY, NULL); }

	CSelectorButton* GetButtonFromPoint(CPoint point, BOOL& onButton);
	
	afx_msg void OnRButtonUp ( UINT nFlags, CPoint point );
	afx_msg void OnLButtonDown (UINT nFlags, CPoint point );
	afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
	afx_msg void OnMouseMove(UINT nFlags, CPoint point);

	// function needed for NavFram.cpp
	void RearrangeIcons();

	BOOL IsTreeVisible();  // Whether or not the tree view is currently showing.

protected:
	int m_scrollDirection;
	CSelectorButton * m_pCurButton;
	CView* m_pCurView; // The entire view (including the HTML pane)
	CRDFCommandMap m_MenuCommandMap;	// Command map for back-end generated right mouse menu commands.
	
    CSelectorDropTarget * m_pDropTarget;
	CNavSelScrollButton* m_scrollUp;
	CNavSelScrollButton* m_scrollDown;
	HBITMAP m_hScrollBmp;
	SIZE m_hScrollBmpSize;
	CRect m_boundingBox;
	int m_xpos;
	int m_ypos;
	int m_scrollPos;
	HBRUSH hBrush;
	HBRUSH hHtBrush;

	CSelectorButton* m_pDragButton; // The button that is currently hovered over in a drag.
	UINT m_hPaneSwitchTimer;

	CPoint m_PointHit;	// The point hit on a mouse down on the selector bar (not on one of the buttons).

	HT_Pane m_Pane; // RDF Pane associated with this NavCenter frame.
	HT_Notification m_Notification; // Notification struct that is tossed around.
	//{{AFX_MSG(CMainFrame)
	afx_msg void OnSize( UINT nType, int cx, int cy );
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	afx_msg BOOL OnEraseBkgnd( CDC* pDC );
	afx_msg void OnParentNotify( UINT message, LPARAM lParam );
	afx_msg void OnTimer(UINT id);
	afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
	afx_msg BOOL OnCommand( WPARAM wParam, LPARAM lParam );
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};



extern "C"  {
//  Netlib API to the stream that will save the file to disk.
NET_StreamClass *ContextSaveStream(int iFormatOut, void *pDataObj, URL_Struct *pUrl, MWContext *pContext);

unsigned int MCFSaveReady(NET_StreamClass *stream);
int MCFSaveWrite(NET_StreamClass *stream, const char *pWriteData, int32 iDataLength);
void MCFSaveComplete(NET_StreamClass *stream);
void MCFSaveAbort(NET_StreamClass *stream, int iStatus);
};

#endif
