/* -*- 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.
 */

// netsvw.h : interface of the CNetscapeView class
//
/////////////////////////////////////////////////////////////////////////////

#ifndef MOVIEW_H
#define MOVIEW_H

// if user moves mouse more than this distance between button down and
//  button up do not follow a link if it's over one
#define CLICK_THRESHOLD 2 

#define NETSCAPE_IMAGE_FORMAT "Netscape Image Format"
#define NETSCAPE_EDIT_FORMAT  "NETSCAPE_EDITOR"

// Number of formats registered for m_pClipboardFormats array

#ifdef _IMAGE_CONVERT
#define MAX_CLIPBOARD_FORMATS   12
#else
#define MAX_CLIPBOARD_FORMATS   11
#endif //_IMAGE_CONVERT

// Types of items being dragged over us
enum FEDragType {
    FE_DRAG_UNKNOWN,
    FE_DRAG_TEXT,
    FE_DRAG_HTML,
    FE_DRAG_TABLE,
    FE_DRAG_LINK,
    FE_DRAG_IMAGE,
	FE_DRAG_VCARD,
    FE_DRAG_FORM_ELEMENT
    // Add more as we dream them up!
};

/////////////////////////////////////////////////////////////////////////////
// Mostly default behavior, but override the type of cursor used 
//   during drag and drop
//
class CViewDropSource : public COleDropSource
{
public:
//Construction
    CViewDropSource(UINT nDragType = 0);
    UINT  m_nDragType;
    SCODE GiveFeedback(DROPEFFECT dropEffect);
};

/////////////////////////////////////////////////////////////////////////////
// 
class CViewDropTarget : public COleDropTarget
{
public:
//Construction
    CViewDropTarget();
    BOOL        OnDrop(CWnd *, COleDataObject *, DROPEFFECT, CPoint);
    DROPEFFECT  OnDragEnter(CWnd *, COleDataObject *, DWORD, CPoint);
    DROPEFFECT  OnDragOver(CWnd *, COleDataObject *, DWORD, CPoint);
    void        OnDragLeave(CWnd *);
private:
    int m_nIsOKDrop;
};

#ifdef EDITOR
// Implemented in edview.cpp
// Call when we MUST save a new document,
//      such as before Printing or calling an external Editor
// Return TRUE if: 
//      1. User saved the document
//      2. User didn't want to save, and doc already exists (not new)
//      3. Doc exists but is not dirty
//      4. We are not a Page Composer (allows calling without testing for EDT_IS_EDITOR() first )
//      5. We are a message Message Compose window
// Note: We must always save a new/untitled document, even if not dirty
BOOL FE_SaveDocument(MWContext * pMWContext);

// Call this instead of forcing file saving by making 
//  a temporary file from current page. This filename
//  replaces the pUrl->address in struct passed in.
//  If return is FALSE, then there was an error - don't continue
BOOL FE_PrepareTempFileUrl(MWContext * pMWContext, URL_Struct *pUrl);
#endif // EDITOR

////////////////////////////////////////////////////////////////////////////////
// Main Document view
// All stuff specific to the main document viewing area (i.e. NOT ledge stuff)
//
class CPrintCX;

class CNetscapeView : public CGenericView
{
//	Properties
public:
   CWnd * m_pChild;
	int  m_nBDownX, m_nBDownY;    // pixel coords of button down event, LFB

	// Right mouse stuff
	POINT m_ptRBDown;			// coords of right button down, not to confuse with LFB
	LO_Element*	m_pRBElement;	// The layout element we're over on a RBD.
	CString m_csRBLink;			// The link that we're over on a RBD.
	CString m_csRBImage;		// The image that we're over on a RBD.
    CString m_csRBEmbed;		// The embed that we're over on a RBD.
#ifdef LAYERS
	CL_Layer *m_pLayer;			// The layer that we're over 
#endif

    CViewDropTarget * m_pDropTarget;
    int m_SubView;  // Are we the top ledge, main view or bottom ledge

#ifdef EDITOR
    // Array of clipboard formats accepted for pasting into document
    // We put here instead of Editor's view because we need to drag 
    //   FROM a Browser window
    UINT * m_pClipboardFormats;
    
    CLIPFORMAT   m_cfEditorFormat;
    CLIPFORMAT   m_cfBookmarkFormat;
    CLIPFORMAT   m_cfImageFormat;
#endif
    // Progress dialog used for Editor Publishing and 
    //   FTP/HTTP upload
    CSaveFileDlg*  m_pSaveFileDlg;	

public:
	static void CopyLinkToClipboard(HWND hWnd, CString url);


protected: // create from serialization only
    DECLARE_DYNCREATE(CNetscapeView)
    CNetscapeView();
    ~CNetscapeView();

//	Our context, a Grid.
//	Some grid friends (creation/destruction).
//	It isn't setup until the call to SetContext.
protected:
	friend MWContext *FE_MakeGridWindow(MWContext *pOldContext, int32 lX, int32 lY, int32 lWidth, int32 lHeight, char *pUrlStr, char *pWindowName);
	friend void FE_FreeGridWindow(MWContext *pContext);

public:
	HDC GetContextDC()	{
		if(GetContext())	{
			return(GetContext()->GetContextDC());
		}
		return(NULL);
	}

// Operations
protected:
	virtual void OnInitialUpdate();	//	Called first time after construct

    virtual void OnActivateFrame(UINT nState, CFrameWnd* /*pFrameWnd*/);
    // Focus management (for internationalization)
    virtual void OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView);

// Implementation
public:

    //	Print preview.
	CPrintCX *m_pPreviewContext;
    void OnFilePrintPreview();
	void OnEndPrintPreview(CDC *pDC, CPrintInfo *pInfo, POINT pXY,
		CPreviewView *pView);
	BOOL DoPrintPreview(UINT nIDResource, CView *pPrintView,
		CRuntimeClass *pPreviewViewClass, CPrintPreviewState *pState);
	void OnPrint(CDC *pDC, CPrintInfo *pInfo);
	BOOL OnPreparePrinting(CPrintInfo *pInfo);

    virtual BOOL PreCreateWindow(CREATESTRUCT & cs);
    
#ifdef _DEBUG
    virtual void AssertValid() const;
    virtual void Dump(CDumpContext& dc) const;
#endif

    void SetChild ( CWnd * pChild ) { m_pChild = pChild; }

#ifdef EDITOR
	BOOL   m_bIsEditor;
    inline BOOL IsEditor() { return m_bIsEditor; }

    // Get editor from preferences app via pPrefName
    // If no default, get from Open File Dialog (use nIDCaption for dialog caption)
    void CNetscapeView::SpawnExternalEditor(MWContext *pMWContext, const char *pPrefName, char *pURL, UINT nIDCaption);

    // Load an image in a user-designated editor (saved in preferences)
    void EditImage(char *pImage);  
#endif

#ifdef LAYERS
        void GetLogicalPoint(CPoint cpPoint, long *pLX, long *pLY);
	LO_Element *GetLayoutElement(CPoint cpPoint, CL_Layer *layer);
	virtual BOOL OnRButtonDownForLayer(UINT nFlags, CPoint& point, 
					   long lX, long lY, CL_Layer *layer);
#else
	LO_Element *GetLayoutElement(CPoint cpPoint);
#endif /* LAYERS */

	CString GetAnchorHref(LO_Element *pElement);
	CString GetImageHref(LO_Element *pElement);
    CString GetEmbedHref(LO_Element *pElement);

    void SetSubView(int subView)	{
    	m_SubView = subView;
    }

    CGenericDoc *GetDocument();

#ifdef EDITOR
    virtual void OnLocalPopup();
#endif /* EDITOR */
    
protected:
    // populate the given menu with items appropritate for being 
    //   over the given LO_Element
    void CreateWebPopup(CMenu * pMenu, LO_Element * pElement, CL_Layer *layer);
    void CreateMessagePopup(CMenu * pMenu, LO_Element * pElement, CL_Layer *layer);
    BOOL AddLinkToPopup(CMenu * pMenu, LO_Element * pElement, BOOL bBrowser);
    BOOL AddEmbedToPopup(CMenu * pMenu, LO_Element * pElement, CL_Layer *layer, BOOL bAddSeparator);
    BOOL AddClipboardToPopup(CMenu * pMenu, LO_Element * pElement, BOOL bAddSeparator);
	BOOL AddSaveItemsToPopup(CMenu * pMenu, LO_Element * pElement, CL_Layer *layer, BOOL bAddSeparator);
	void AddBrowserItemsToPopup(CMenu * pMenu, LO_Element * pElement, CL_Layer *layer);
	void AddNavigateItemsToPopup(CMenu *pMenu, LO_Element * pElement, CL_Layer *layer);
	void AddViewItemsToPopup(CMenu * pMenu, MWContext *pContex, LO_Element * pElement);
// Used by OnPopupAddLinkToBookmarks and OnPopupInternetShortcut

	void CreateTextAndAnchor(CString &, CString &);

// Generated message map functions
protected:
    //{{AFX_MSG(CNetscapeView)
   afx_msg void OnSize ( UINT nType, int cx, int cy );
    afx_msg void OnSetFocus(CWnd *);
    afx_msg void OnPrepareDC(CDC *pDC, CPrintInfo * pInfo /* = NULL */);
	afx_msg void OnDeactivateEmbed();
    afx_msg void OnWindowPosChanged(WINDOWPOS * wndpos);
    afx_msg void OnUpdateNavigateRepaint(CCmdUI* pCmdUI);
	afx_msg void OnMove(int x, int y);
    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	afx_msg void OnCopyImageToClipboard();
	afx_msg void OnPopupLoadLink();
	afx_msg void OnPopupAddLinkToBookmarks();
	afx_msg void OnPopupLoadLinkNewWindow();
	afx_msg void OnPopupLoadFrameNewWindow();
	afx_msg void OnPopupSaveLinkContentsAs();
	afx_msg void OnPopupCopyLinkToClipboard();
	afx_msg void OnPopupLoadImage();
	afx_msg void OnPopupSaveImageAs();
	afx_msg void OnPopupCopyImageLocationToClipboard();
	afx_msg void OnPopupLoadImageInline();
	afx_msg void OnPopupActivateEmbed();
	afx_msg void OnPopupSaveEmbedAs();
	afx_msg void OnCopyCurrentURL();
	afx_msg void OnPopupCopyEmbedLocationToClipboard();
    afx_msg void OnPopupCopyEmbedToClipboard();
	afx_msg void OnPopupSetAsWallpaper();
    afx_msg void OnNavigateRepaint();
	afx_msg	BOOL OnQueryNewPalette(); 
	afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
	afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
	afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
	afx_msg void OnPopupInternetShortcut();
	afx_msg void OnPopupMailTo();

    // afx_msg void OnDropFiles( HDROP hDropInfo );
	//}}AFX_MSG
#ifdef EDITOR
    afx_msg void OnCanInteract(CCmdUI* pCmdUI);
    afx_msg void OnEditSource();
    afx_msg void OnPopupEditImage();
    afx_msg void OnPopupLoadLinkInEditor();
#endif
    DECLARE_MESSAGE_MAP()
};

#ifdef _DEBUG_HUH_JEM  // debug version in netsvw.cpp
inline CNetscapeDoc* CNetscapeView::GetDocument()
   { return (CNetscapeDoc*) m_pDocument; }
#endif
/////////////////////////////////////////////////////////////////////////////

#endif //MOVIEW_H
