968 lines
32 KiB
C++
968 lines
32 KiB
C++
// ==========================================================================
|
|
// Class Specification : COXPreviewDialog
|
|
// ==========================================================================
|
|
//
|
|
// Header file : OXPreviewDialog.h
|
|
//
|
|
// Version: 9.3
|
|
//
|
|
// This software along with its related components, documentation and files ("The Libraries")
|
|
// is © 1994-2007 The Code Project (1612916 Ontario Limited) and use of The Libraries is
|
|
// governed by a software license agreement ("Agreement"). Copies of the Agreement are
|
|
// available at The Code Project (www.codeproject.com), as part of the package you downloaded
|
|
// to obtain this file, or directly from our office. For a copy of the license governing
|
|
// this software, you may contact us at legalaffairs@codeproject.com, or by calling 416-849-8900.
|
|
//
|
|
// //////////////////////////////////////////////////////////////////////////
|
|
|
|
/*
|
|
|
|
OVERVIEW
|
|
|
|
COXPreviewDialog is CFileDialog derived class that extends the functionality
|
|
of the standard File Open / Save As... dialog. It is designed to add preview
|
|
functionality when new OFN_EXPLORER style is specified (this style is set by
|
|
default).
|
|
|
|
When COXPreviewDialog is used instead of CFileDialog the new "Preview"
|
|
check button will appear on the dialog's toolbar. By clicking on this button
|
|
a user can set the preview mode on and off. By default the preview mode is on.
|
|
|
|
When the preview mode is set on the dialog's list control that displays files and
|
|
folders is being shrunken to make a space for preview window. The space between
|
|
the list control and preview window is designated as "splitter" area. If a user
|
|
left clicks over the splitter area and move the mouse cursor while holding the
|
|
left button the list control and preview window will be resized.
|
|
|
|
COXPreviewDialog supports to full extent resizing functionality provided by
|
|
Windows 98/2000
|
|
|
|
COXPreviewDialog "memorizes" its last state (preview mode state and preview window
|
|
position) and restores next time the dialog is instantiated.
|
|
|
|
|
|
Above we provided overview on how "preview area" is being designated in the dialog
|
|
window. Now lets move to the issue of previewing the contents of the selected
|
|
file. Obviously, the problem here is to provide the functionality for previewing as
|
|
many standard file types as possible while giving the flexibility of previewing only
|
|
designated file types (e.g. only image files or only text files) and allowing a
|
|
programmer to easily update the functionality of the class in order to preview
|
|
proprietary file types.
|
|
|
|
In order to implement that kind of functionality we have introduced "file viewer"
|
|
object that is responsible for previewing of selecting files. Programmer can create
|
|
and register with COXPreviewDialog as many file viewer objects as he would like to.
|
|
So using file viewer paradigm we can create a number of file viewer objects that will
|
|
be responsible for handling different kind of file types. Then in any particular case
|
|
we can use any file viewer in any order in order to provide a preview functionality
|
|
for particular file types.
|
|
|
|
File viewers are implemented through COXFileViewer class that has the following set
|
|
of virtual functions:
|
|
|
|
virtual BOOL OnNewFileSelect(const CString& sFilename, BOOL bViewerFound=FALSE);
|
|
virtual BOOL OnPaintPreview(CDC* pDC, const CRect& paintRect);
|
|
virtual BOOL OnDoRealizePalette(CWnd* pFocusWnd);
|
|
virtual void OnChangeSize();
|
|
virtual void OnPreview(BOOL bPreview);
|
|
virtual void OnCreatePreviewWnd(COXPreviewWnd* pPreviewWnd);
|
|
virtual void OnDestroyPreviewWnd(COXPreviewWnd* pPreviewWnd);
|
|
|
|
Refer to the COXFileViewer class reference for details on this functions. Below
|
|
you will find guidelines on creating your own file viewers.
|
|
|
|
1) Override OnNewFileSelect() function. This function will be called by
|
|
COXPreviewDialog object for every registered file viewer when new file
|
|
is selected in the list control that displays files and folders. In your
|
|
implementation you have to analyze the selected file type and decide whether
|
|
your object will handle the preview functionality for the selected file or not.
|
|
Retrurn TRUE if you will preview the selected file or FALSE otherwise. Note
|
|
that the second parameter of this function specifies if file viewer for
|
|
the selected file has already been found. It could happen if you use more than
|
|
one file viewer object registered with COXPreviewDialog that can preview
|
|
the same file type.
|
|
|
|
2) Override OnPaintPreview() function. This function will be called by
|
|
COXPreviewDialog object for every registered file viewer when selected file
|
|
hast to be previewed. In your implementation you have to draw the preview
|
|
of currently selected file (of course if this object can preview the selected
|
|
file) or if you use another control for displaying the preview just return TRUE.
|
|
If file viewer doesn't support the selected file type you have to return FALSE.
|
|
|
|
3) Override OnDoRealizePalette() function if you need to implement palette support
|
|
for your preview drawing routine. This function will be called by
|
|
COXPreviewDialog object for every registered file viewer before drawing the
|
|
preview. Return TRUE if this object is going to preview the currently selected
|
|
file even if you don't need to support palette; otherwise return FALSE.
|
|
|
|
4) If file viewer object uses additional control in order to display the preview
|
|
you would probably have to override the following functions
|
|
|
|
OnChangeSize() - called every time the preview area is resized
|
|
OnPreview() - called every time the preview mode changes its value
|
|
OnCreatePreviewWnd()- called right after the preview window has been created.
|
|
Usually you would use preview window as a parent of
|
|
the additional control(s)
|
|
OnDestroyPreviewWnd()- called just before destroying the preview window.
|
|
Here you can destroy you additional control(s)
|
|
|
|
|
|
In this overview we mentioned that file viewer objects must be registered with
|
|
COXPreviewDialog in order to be used. To do that you can call the following functions
|
|
|
|
int AddFileViewer(COXFileViewer* pFileViewer);
|
|
BOOL InsertFileViewer(COXFileViewer* pFileViewer, int nIndex);
|
|
BOOL RemoveFileViewer(int nIndex);
|
|
|
|
The order in which file viewer objects are registered with COXPreviewDialog is
|
|
important because all COXFileViewer functions will be called for file viewer objects
|
|
in the same order they were inserted.
|
|
|
|
|
|
There are a few additional functions implemented in the COXPreviewDialog class
|
|
you might consider to be useful. All of them provide a programmer with
|
|
functionality to programmatically specify the look and feel of the Dialog
|
|
that user would normally do instead.
|
|
|
|
void SetPreview(BOOL bPreview);
|
|
BOOL IsInPreviewMode() const;
|
|
void SetFlatToolBar(BOOL bFlat);
|
|
BOOL IsFlatToolBar() const;
|
|
int SetPreviewWndOffset(int nPreviewWndOffset);
|
|
int GetPreviewWndOffset() const;
|
|
|
|
|
|
|
|
We have implemented for you a number of file viewer objects for previewing most
|
|
of the file types. Below we will give you the details on these objects.
|
|
|
|
1) COXGraphicsFileViewer. Designed for previewing image files. Put the following
|
|
define in your stdafx.h in order to use this file viewer with COXPreviewDialog
|
|
|
|
#define OX_PREVIEW_GRAPHICS
|
|
|
|
COXGraphicsFileViewer can optioanlly preview bitmaps (*.bmp,*.dib),
|
|
jpegs (*.jpeg), icons (*.ico, *.cur, *.ani, *.icl) and metafiles (*.emf, *.wmf).
|
|
Again you have your choice on what files are going to be previewed through
|
|
defines:
|
|
|
|
#define OX_PREVIEW_BMP - bitmaps
|
|
#define OXDIB_SUPPORTJPEG - jpeg (OX_PREVIEW_BMP is required as well)
|
|
#define OX_PREVIEW_METAFILE - metafiles
|
|
#define OX_PREVIEW_ICON - icons
|
|
|
|
|
|
2) COXRTFFileViewer. Previews RTF files only. Put the following
|
|
define in your stdafx.h in order to use this file viewer with COXPreviewDialog
|
|
|
|
#define OX_PREVIEW_RTF
|
|
|
|
|
|
3) COXHTMLFileViewer. Previews HTML files and a number of other formats if
|
|
corresponding application is installed (e.g. MS Word documents or MS Excel sheets).
|
|
Internally uses WebControl and IWebBrowser2 interface that is implemented
|
|
by Internet Explorer v4 and higher. So this is a must requirement to have at
|
|
least IE 4 in order to use this file viewer. Put the following define in
|
|
your stdafx.h in order to use this file viewer with COXPreviewDialog
|
|
|
|
#define OX_PREVIEW_HTML
|
|
|
|
|
|
4) COXTextFileViewer. Previews any file, which size lesser than 64 Kb, as a plain
|
|
text file. Put the following define in your stdafx.h in order to use this file
|
|
viewer with COXPreviewDialog
|
|
|
|
#define OX_PREVIEW_PLAINTEXT
|
|
|
|
|
|
Using above specified defines you can build your own version of COXPreviewDialog
|
|
object that can preview almost any type of files just by using COXPreviewDialog
|
|
instead of CFileDialog!
|
|
|
|
|
|
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
Important
|
|
|
|
COXPreviewDialog succeeds the class with the same name and COXBmpPrv class that were
|
|
introduced long time ago and were designed to handle the same issue though using
|
|
a litlle bit different approach. Both of this classes are now considered retired and
|
|
moved in to the Archive section of the Ultimate Toolbox.
|
|
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
|
|
|
|
Check out Preview sample that can be found in the ".\Samples\gui\Preview"
|
|
subdirectory of your Ultimate Toolbox directory. It demonstrates how to replace
|
|
standard File Open dialog on COXPreview dialog in MDI application.
|
|
|
|
|
|
|
|
Dependency:
|
|
#include "OXPreviewDialog.h"
|
|
|
|
|
|
Source code files:
|
|
"OXPreviewDialog.cpp"
|
|
#ifdef OX_PREVIEW_BMP - "oxdib.cpp"
|
|
#ifdef OX_PREVIEW_METAFILE - "OXMetaFile.cpp"
|
|
#ifdef OX_PREVIEW_ICON - "OXImageListBox.cpp"
|
|
#ifdef OXDIB_SUPPORTJPEG - "OXBMPFle.cpp"
|
|
"OXGphFle.cpp"
|
|
"OXJPGCod.cpp"
|
|
"OXJPGCom.cpp"
|
|
"OXJPGDom.cpp"
|
|
"OXJPGExp.cpp"
|
|
"OXJPGFle.cpp"
|
|
|
|
Resource files:
|
|
"OXPreviewDialog.rc"
|
|
|
|
*/
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
#ifndef __OXPREVIEWDIALOG_H__
|
|
#define __OXPREVIEWDIALOG_H__
|
|
|
|
#if _MSC_VER >= 1000
|
|
#pragma once
|
|
#endif // _MSC_VER >= 1000
|
|
|
|
#ifndef __AFXTEMPL_H__
|
|
#include <afxtempl.h>
|
|
#define __AFXTEMPL_H__
|
|
#endif
|
|
|
|
#include "OXDllExt.h"
|
|
#include "OXMainRes.h"
|
|
|
|
|
|
#ifdef OX_PREVIEW_BMP
|
|
#include "oxdib.h"
|
|
#endif
|
|
|
|
#ifdef OX_PREVIEW_METAFILE
|
|
#include "OXMetaFile.h"
|
|
#endif
|
|
|
|
#ifdef OX_PREVIEW_ICON
|
|
#include "OXImageListBox.h"
|
|
#endif
|
|
|
|
#ifdef OX_PREVIEW_HTML
|
|
#ifndef __AFXDISP_H__
|
|
#include <afxdisp.h>
|
|
#define __AFXDISP_H__
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef OX_PREVIEW_SOUND
|
|
#include "OXSound.h"
|
|
#endif
|
|
|
|
#include "UTB64Bit.h"
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
class OX_CLASS_DECL COXFilePath
|
|
{
|
|
public:
|
|
COXFilePath() : m_sFilePath(_T("")) {};
|
|
COXFilePath(LPCTSTR pszPath) : m_sFilePath(pszPath) {};
|
|
|
|
protected:
|
|
CString m_sFilePath;
|
|
|
|
public:
|
|
inline CString GetPath() const { return m_sFilePath; }
|
|
inline void SetPath(LPCTSTR pszPath) { m_sFilePath=pszPath; }
|
|
|
|
inline BOOL Exists()
|
|
{
|
|
CFileStatus fileStatus;
|
|
return CFile::GetStatus(GetPath(), fileStatus);
|
|
}
|
|
|
|
inline CString GetExtender()
|
|
{
|
|
int nFullStopPosition=GetPath().ReverseFind(_T('.'));
|
|
if(nFullStopPosition!=-1)
|
|
{
|
|
return GetPath().Mid(nFullStopPosition+1);
|
|
}
|
|
else
|
|
{
|
|
return _T("");
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
class OX_CLASS_DECL COXPreviewWnd : public CWnd
|
|
{
|
|
public:
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Construct the object
|
|
COXPreviewWnd() : m_pPreviewDlg(NULL) {};
|
|
|
|
|
|
// --- In : pParent - parent window
|
|
// rect - window rectangle
|
|
// nID - window ID
|
|
// --- Out :
|
|
// --- Returns: TRUE if window was successfully created
|
|
// --- Effect : Creates the window
|
|
virtual BOOL Create(CWnd* pParent, CRect rect, UINT nID);
|
|
|
|
|
|
public:
|
|
// pointer to COXPreviewDialog object that contains this window
|
|
class COXPreviewDialog* m_pPreviewDlg;
|
|
|
|
|
|
protected:
|
|
afx_msg void OnPaint();
|
|
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
|
|
DECLARE_MESSAGE_MAP()
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
class OX_CLASS_DECL COXFileViewer
|
|
{
|
|
public:
|
|
// pointer to COXPreviewDialog object that owns this object
|
|
class COXPreviewDialog* m_pPreviewDialog;
|
|
|
|
protected:
|
|
// flag that specifies if currently selected file can be viewed using
|
|
// this file viewer object
|
|
BOOL m_bCanPreview;
|
|
|
|
public:
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Constructs the object
|
|
COXFileViewer() : m_pPreviewDialog(NULL), m_bCanPreview(FALSE) {};
|
|
|
|
|
|
// --- In : sFilename - full path to new selected file
|
|
// bViewerFound- set to TRUE if viewer for the selected file
|
|
// has already been found
|
|
// --- Out :
|
|
// --- Returns: TRUE if the object can preview the selected file
|
|
// --- Effect : Called by COXPreviewDialog object for every registered
|
|
// COXFileViewer object when new file is selected. Return TRUE
|
|
// if this object can preview the specified file
|
|
virtual BOOL OnNewFileSelect(const CString& sFilename, BOOL bViewerFound=FALSE)
|
|
{
|
|
UNREFERENCED_PARAMETER(sFilename);
|
|
UNREFERENCED_PARAMETER(bViewerFound);
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// --- In : pDC - device context to draw in
|
|
// paintRect - rectangle to draw in
|
|
// --- Out :
|
|
// --- Returns: TRUE if the object has painted the image of the selected file
|
|
// --- Effect : Called by COXPreviewDialog object for every registered
|
|
// COXFileViewer object to draw the preview of the selected file.
|
|
// Return TRUE if this object can draw the preview of the specified
|
|
// file
|
|
virtual BOOL OnPaintPreview(CDC* pDC, const CRect& paintRect)
|
|
{
|
|
UNREFERENCED_PARAMETER(pDC);
|
|
UNREFERENCED_PARAMETER(paintRect);
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// --- In : pFocusWnd - window that have the focus at the moment
|
|
// --- Out :
|
|
// --- Returns: TRUE if the object has realized its own palette
|
|
// --- Effect : Called by COXPreviewDialog object for every registered
|
|
// COXFileViewer object before drawing the preview of the selected
|
|
// file. Return TRUE if this object handles the palette
|
|
virtual BOOL OnDoRealizePalette(CWnd* pFocusWnd)
|
|
{
|
|
UNREFERENCED_PARAMETER(pFocusWnd);
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Called by COXPreviewDialog object for every registered
|
|
// COXFileViewer object right after the preview area has
|
|
// been resized
|
|
virtual void OnChangeSize() {};
|
|
|
|
|
|
// --- In : bPreview - if TRUE then preview mode is set on;
|
|
// if FALSE then preview mode is set off
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Called by COXPreviewDialog object for every registered
|
|
// COXFileViewer object right after the preview mode has been
|
|
// changed
|
|
virtual void OnPreview(BOOL bPreview) { UNREFERENCED_PARAMETER(bPreview); }
|
|
|
|
|
|
// --- In : pPreviewWnd - pointer to created COXPreviewWnd object that will
|
|
// host preview area
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Called by COXPreviewDialog object for every registered
|
|
// COXFileViewer object right after the COXPreviewWnd object
|
|
// that will host preview area has been created. If you need to
|
|
// use your own object for preview purposes you must create
|
|
// in this function and specify pPreviewWnd as its parent window
|
|
virtual void OnCreatePreviewWnd(COXPreviewWnd* pPreviewWnd)
|
|
{
|
|
UNREFERENCED_PARAMETER(pPreviewWnd);
|
|
}
|
|
|
|
|
|
// --- In : pPreviewWnd - pointer to COXPreviewWnd object that hosts
|
|
// preview area
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Called by COXPreviewDialog object for every registered
|
|
// COXFileViewer object right before the COXPreviewWnd object
|
|
// that hosts preview area is destroyed. Any object that has been
|
|
// created for preview purposes might be destroyed here
|
|
virtual void OnDestroyPreviewWnd(COXPreviewWnd* pPreviewWnd)
|
|
{
|
|
UNREFERENCED_PARAMETER(pPreviewWnd);
|
|
}
|
|
|
|
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns: TRUE if this object can preview the currently selected file;
|
|
// otherwise FALSE
|
|
// --- Effect : Retrieves a flag that specifies if the viewer can preview
|
|
// the currently selected file
|
|
virtual BOOL CanPreview() { return m_bCanPreview; }
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifdef OX_PREVIEW_GRAPHICS
|
|
class OX_CLASS_DECL COXGraphicsFileViewer : public COXFileViewer
|
|
{
|
|
protected:
|
|
#ifdef OX_PREVIEW_ICON
|
|
// for displaying icons and cursors
|
|
class COXImageListBox m_imageListBox;
|
|
#endif
|
|
#ifdef OX_PREVIEW_BMP
|
|
// for displaying bitmaps and jpegs
|
|
COXDIB m_dib;
|
|
#endif
|
|
#ifdef OX_PREVIEW_METAFILE
|
|
// for displaying metafiles
|
|
COXMetaFile m_MetaFile;
|
|
#endif
|
|
|
|
public:
|
|
virtual BOOL OnNewFileSelect(const CString& sFilename, BOOL bViewerFound=FALSE);
|
|
virtual BOOL OnPaintPreview(CDC* pDC, const CRect& paintRect);
|
|
virtual BOOL OnDoRealizePalette(CWnd* pFocusWnd);
|
|
virtual void OnChangeSize();
|
|
virtual void OnPreview(BOOL bPreview);
|
|
virtual void OnCreatePreviewWnd(COXPreviewWnd* pPreviewWnd);
|
|
virtual void OnDestroyPreviewWnd(COXPreviewWnd* pPreviewWnd);
|
|
};
|
|
#endif // OX_PREVIEW_GRAPHICS
|
|
|
|
|
|
#ifdef OX_PREVIEW_PLAINTEXT
|
|
class OX_CLASS_DECL COXTextFileViewer : public COXFileViewer
|
|
{
|
|
protected:
|
|
// for displaying text files with size < 64K
|
|
CEdit m_edit;
|
|
|
|
public:
|
|
virtual BOOL OnNewFileSelect(const CString& sFilename, BOOL bViewerFound=FALSE);
|
|
virtual BOOL OnPaintPreview(CDC* pDC, const CRect& paintRect);
|
|
virtual BOOL OnDoRealizePalette(CWnd* pFocusWnd);
|
|
virtual void OnChangeSize();
|
|
virtual void OnPreview(BOOL bPreview);
|
|
virtual void OnCreatePreviewWnd(COXPreviewWnd* pPreviewWnd);
|
|
virtual void OnDestroyPreviewWnd(COXPreviewWnd* pPreviewWnd);
|
|
};
|
|
#endif // OX_PREVIEW_PLAINTEXT
|
|
|
|
|
|
#ifdef OX_PREVIEW_RTF
|
|
class OX_CLASS_DECL COXRTFFileViewer : public COXFileViewer
|
|
{
|
|
protected:
|
|
// for displaying RTF files
|
|
CRichEditCtrl m_richEdit;
|
|
// helper object
|
|
CFile m_file;
|
|
|
|
public:
|
|
virtual BOOL OnNewFileSelect(const CString& sFilename, BOOL bViewerFound=FALSE);
|
|
virtual BOOL OnPaintPreview(CDC* pDC, const CRect& paintRect);
|
|
virtual BOOL OnDoRealizePalette(CWnd* pFocusWnd);
|
|
virtual void OnChangeSize();
|
|
virtual void OnPreview(BOOL bPreview);
|
|
virtual void OnCreatePreviewWnd(COXPreviewWnd* pPreviewWnd);
|
|
virtual void OnDestroyPreviewWnd(COXPreviewWnd* pPreviewWnd);
|
|
|
|
protected:
|
|
// loads the currently selected file as RTF file
|
|
void LoadRTF();
|
|
// check if specified file object represents RTF file
|
|
static BOOL IsRTF(CFile* pFile);
|
|
// callback function for populating rich edit control
|
|
static DWORD CALLBACK RichEditStreamInCallback(DWORD_PTR dwCookie, LPBYTE pbBuff,
|
|
LONG cb, LONG FAR *pcb);
|
|
};
|
|
#endif // OX_PREVIEW_RTF
|
|
|
|
|
|
#ifdef OX_PREVIEW_HTML
|
|
class OX_CLASS_DECL COXHTMLFileViewer : public COXFileViewer
|
|
{
|
|
public:
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Constructs the object
|
|
COXHTMLFileViewer() : m_pIWebBrowser(NULL) {};
|
|
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Destructs the object
|
|
~COXHTMLFileViewer()
|
|
{
|
|
if(m_pIWebBrowser!=NULL)
|
|
{
|
|
m_pIWebBrowser->Release();
|
|
m_pIWebBrowser=NULL;
|
|
}
|
|
}
|
|
|
|
protected:
|
|
// HTML browser ActiveX control window
|
|
CWnd m_HTMLBrowserWnd;
|
|
// pointer to IWebBrowser2 interface for navigation purposes
|
|
IWebBrowser2* m_pIWebBrowser;
|
|
|
|
public:
|
|
virtual BOOL OnNewFileSelect(const CString& sFilename, BOOL bViewerFound=FALSE);
|
|
virtual BOOL OnPaintPreview(CDC* pDC, const CRect& paintRect);
|
|
virtual BOOL OnDoRealizePalette(CWnd* pFocusWnd);
|
|
virtual void OnChangeSize();
|
|
virtual void OnPreview(BOOL bPreview);
|
|
virtual void OnCreatePreviewWnd(COXPreviewWnd* pPreviewWnd);
|
|
virtual void OnDestroyPreviewWnd(COXPreviewWnd* pPreviewWnd);
|
|
};
|
|
#endif // OX_PREVIEW_HTML
|
|
|
|
|
|
#ifdef OX_PREVIEW_SOUND
|
|
|
|
#ifndef OXSOUNDPREVIEW_BORDER_OFFSET
|
|
#define OXSOUNDPREVIEW_BORDER_OFFSET 5
|
|
#endif
|
|
|
|
#ifndef OXSOUNDPREVIEW_BUTTON_HEIGHT
|
|
#define OXSOUNDPREVIEW_BUTTON_HEIGHT 24
|
|
#endif
|
|
#ifndef OXSOUNDPREVIEW_BUTTON_WIDTH
|
|
#define OXSOUNDPREVIEW_BUTTON_WIDTH 24
|
|
#endif
|
|
|
|
#ifndef IDC_OXSOUNDPREVIEW_BUTTON_START_PLAYING
|
|
#define IDC_OXSOUNDPREVIEW_BUTTON_START_PLAYING 1000
|
|
#endif
|
|
#ifndef IDC_OXSOUNDPREVIEW_BUTTON_STOP_PLAYING
|
|
#define IDC_OXSOUNDPREVIEW_BUTTON_STOP_PLAYING 1001
|
|
#endif
|
|
|
|
|
|
class OX_CLASS_DECL COXSoundFileViewer : public COXFileViewer
|
|
{
|
|
protected:
|
|
class OX_CLASS_DECL COXSoundFileViewerHelper : public CWnd
|
|
{
|
|
public:
|
|
// sound object
|
|
COXSound m_sound;
|
|
|
|
// buttons for playing sound
|
|
CButton m_btnStartPlaying;
|
|
CButton m_btnStopPlaying;
|
|
|
|
// sound info
|
|
CString m_sSoundInfo;
|
|
// rectangle for sound info text
|
|
CRect m_rectSoundInfo;
|
|
|
|
protected:
|
|
//{{AFX_MSG(COXSoundFileViewerHelper)
|
|
afx_msg LRESULT OnPaint(WPARAM wParam, LPARAM lParam);
|
|
afx_msg void OnStartPlaying();
|
|
afx_msg void OnStopPlaying();
|
|
afx_msg LRESULT OnPlayComplete(WPARAM wParam, LPARAM lParam);
|
|
//}}AFX_MSG
|
|
DECLARE_MESSAGE_MAP()
|
|
|
|
} m_wndHelper;
|
|
|
|
public:
|
|
virtual BOOL OnNewFileSelect(const CString& sFilename, BOOL bViewerFound=FALSE);
|
|
virtual void OnCreatePreviewWnd(COXPreviewWnd* pPreviewWnd);
|
|
virtual void OnDestroyPreviewWnd(COXPreviewWnd* pPreviewWnd);
|
|
virtual void OnPreview(BOOL bPreview);
|
|
virtual void OnChangeSize();
|
|
virtual BOOL OnPaintPreview(CDC* pDC, const CRect& paintRect);
|
|
virtual BOOL OnDoRealizePalette(CWnd* pFocusWnd);
|
|
};
|
|
#endif // OX_PREVIEW_SOUND
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
|
|
class OX_CLASS_DECL COXPreviewDialog : public CFileDialog
|
|
{
|
|
DECLARE_DYNAMIC(COXPreviewDialog)
|
|
|
|
|
|
public:
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Contructs the object
|
|
COXPreviewDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt=NULL,
|
|
LPCTSTR lpszFileName=NULL,
|
|
DWORD dwFlags=OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
|
|
LPCTSTR lpszFilter=NULL, CWnd* pParentWnd=NULL);
|
|
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Destructs the object
|
|
virtual ~COXPreviewDialog();
|
|
|
|
|
|
// --- In : rect - rectangle to adjust
|
|
// rectBound - rectangle to fit into
|
|
// --- Out :
|
|
// --- Returns: The rectangle centered in the bounding rectangle. If rect
|
|
// doesn't fit rectBound then before centering it the function
|
|
// scales it
|
|
// --- Effect : Adjusts the coordinates of the specified rectangle to be
|
|
// centered in the bounding rectangle. The given rectangle might
|
|
// be scaled in order to fit the bounding rectangle
|
|
static CRect AdjustRectToFit(CRect rect, CRect rectBound);
|
|
|
|
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns: TRUE if old style of the file open dialog is used;
|
|
// FALSE otherwise
|
|
// --- Effect : Retrieves the flag that specifies if old style of the
|
|
// dialog is being used
|
|
inline BOOL IsOldStyle() const { return ((m_ofn.Flags & OFN_EXPLORER)==0); }
|
|
|
|
|
|
// --- In : pFileViewer - pointer to COXFileViewer object
|
|
// --- Out :
|
|
// --- Returns: The index number of the added file viewer if succeeded;
|
|
// otherwise -1
|
|
// --- Effect : Adds new COXFileViewer object at the end of the list
|
|
// of file viewers. When an event important for file viewer
|
|
// object is fired the corresponding COXFileViewer function
|
|
// will be called for all registered file viewers
|
|
inline int AddFileViewer(COXFileViewer* pFileViewer)
|
|
{
|
|
return (InsertFileViewer(pFileViewer,GetFileViewerCount()) ?
|
|
GetFileViewerCount()-1 : -1);
|
|
}
|
|
|
|
// --- In : pFileViewer - pointer to COXFileViewer object
|
|
// nIndex - the index of the position in the list of
|
|
// file viewers where the new file viewer
|
|
// object will be displayed at
|
|
// --- Out :
|
|
// --- Returns: TRUE if succeeded; otherwise FALSE
|
|
// --- Effect : Inserts new COXFileViewer object in the list of file viewers
|
|
// at the specified position. When an event important for file viewer
|
|
// object is fired the corresponding COXFileViewer function
|
|
// will be called for all registered file viewers
|
|
BOOL InsertFileViewer(COXFileViewer* pFileViewer, int nIndex);
|
|
|
|
// --- In : nIndex - the index of the position in the list of
|
|
// file viewers that identifies the viewer
|
|
// to be deleted
|
|
// --- Out :
|
|
// --- Returns: TRUE if succeeded; otherwise FALSE
|
|
// --- Effect : Removes existing COXFileViewer object from the list of file
|
|
// viewers at the specified position
|
|
BOOL RemoveFileViewer(int nIndex);
|
|
|
|
// --- In : nIndex - the index of the position in the list of
|
|
// file viewers where the new file viewer
|
|
// object will be displayed at
|
|
// --- Out :
|
|
// --- Returns: A pointer to COXFileViewer object at the specified position
|
|
// if succeeded; otherwise NULL
|
|
// --- Effect : Retrieves a pointer to specified COXFileViewer object in the
|
|
// list of file viewers at the specified position
|
|
COXFileViewer* GetFileViewer(int nIndex) const;
|
|
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns: The number of registered COXFileViewer objects
|
|
// --- Effect : Retrieves the number of registered COXFileViewer objects
|
|
inline int GetFileViewerCount() const { return PtrToInt(m_arrFileViewers.GetSize()); }
|
|
|
|
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns: A pointer to the window that hosts the preview area
|
|
// --- Effect : Retrieves a pointer to the window that hosts the preview area
|
|
inline COXPreviewWnd* GetPreviewWnd() { return &m_preview; }
|
|
|
|
|
|
protected:
|
|
// flag that specifiew the preview mode state
|
|
BOOL m_bPreview;
|
|
// the last remembered value of the flag that specifiew the preview mode state
|
|
BOOL m_bPrevPreview;
|
|
// the path to the currently selected file
|
|
CString m_sSelectedFile;
|
|
// the last remembered path to the selected file
|
|
CString m_sPrevSelectedFile;
|
|
// frame object for old style dialog
|
|
CStatic m_previewFrame;
|
|
|
|
// array of pointers to registered COXFileViewer objects
|
|
CArray<COXFileViewer*,COXFileViewer*> m_arrFileViewers;
|
|
|
|
// the window that will host the preview area
|
|
COXPreviewWnd m_preview;
|
|
friend COXPreviewWnd;
|
|
|
|
// internal flag that specifies whether the dialog has been
|
|
// initialized or not
|
|
BOOL m_bInitialized;
|
|
|
|
protected:
|
|
#ifdef OX_PREVIEW_GRAPHICS
|
|
// file viewer for graphics files
|
|
COXGraphicsFileViewer m_graphicsFileViewer;
|
|
#endif
|
|
#ifdef OX_PREVIEW_PLAINTEXT
|
|
// file viewer for plain text files
|
|
COXTextFileViewer m_textFileViewer;
|
|
#endif
|
|
#ifdef OX_PREVIEW_RTF
|
|
// file viewer for RTF files
|
|
COXRTFFileViewer m_rtfFileViewer;
|
|
#endif
|
|
#ifdef OX_PREVIEW_HTML
|
|
// file viewer for HTML and other viewable by WebControl file types
|
|
COXHTMLFileViewer m_htmlFileViewer;
|
|
#endif
|
|
#ifdef OX_PREVIEW_SOUND
|
|
// file viewer for WAVE file types
|
|
COXSoundFileViewer m_soundFileViewer;
|
|
#endif
|
|
|
|
protected:
|
|
// if TRUE the dialog's toolbar is set to display flat buttons
|
|
BOOL m_bFlatToolbar;
|
|
// rectangle for the preview area
|
|
CRect m_rectPreviewArea;
|
|
// rectangle for the splitter area
|
|
CRect m_rectSplitterArea;
|
|
// rectangle for the resizable area
|
|
CRect m_rectResizableArea;
|
|
// TRUE if left button was pressed and held in splitter area
|
|
BOOL m_bIsSplitterPressed;
|
|
// the previous position of the mouse cursor when splitter is pressed
|
|
CPoint m_ptOldSplitterCapture;
|
|
// last saved width and height of the list control that displays the
|
|
// files and folders
|
|
int m_nOldListCtrlWidth;
|
|
int m_nOldListCtrlHeight;
|
|
|
|
// offset of the preview window from the list control relatively to
|
|
// the list control's right side
|
|
int m_nPreviewWndOffset;
|
|
|
|
// global array of all preview dialog objects
|
|
static CMap<HWND,HWND,COXPreviewDialog*,COXPreviewDialog*> m_allPreviewDialogs;
|
|
// saved address of the window procedure of subclassed dialog
|
|
WNDPROC m_pfnSuper;
|
|
// global window procedure for subclassed dialog
|
|
static LRESULT CALLBACK GlobalPreviewDialogProc(HWND hWnd, UINT uMsg,
|
|
WPARAM wParam, LPARAM lParam);
|
|
// window procedure for subclassed dialog
|
|
virtual LRESULT PreviewDialogProc(HWND hWnd, UINT uMsg,
|
|
WPARAM wParam, LPARAM lParam);
|
|
|
|
|
|
public:
|
|
// --- In : bPreview - if TRUE then preview mode will be set on;
|
|
// if FALSE then preview mode will be set off
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Sets preview mode on/off
|
|
void SetPreview(BOOL bPreview);
|
|
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns: TRUE if preview mode is on; FALSE otherwise
|
|
// --- Effect : Retrieves the flag that specifies the state of the
|
|
// preview mode
|
|
inline BOOL IsInPreviewMode() const { return m_bPreview; }
|
|
|
|
|
|
// --- In : bFlat - if TRUE then the dialog's toolbar will be set to
|
|
// flat mode; otherwise it will be set to normal mode
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Sets the dialog's toolbar in the flat/normal mode
|
|
void SetFlatToolBar(BOOL bFlat);
|
|
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns: TRUE if the dialog's toolbar is set to flat mode
|
|
// --- Effect : Retrieves the flag that specifies if the dialog's toolbar
|
|
// is in the flat or normal mode
|
|
inline BOOL IsFlatToolBar() const { return m_bFlatToolbar; }
|
|
|
|
|
|
// --- In : nPreviewWndOffset - offset in pixels of the preview window
|
|
// from its normal position relatively
|
|
// to the list control that displays files
|
|
// and folders. Positive number means that
|
|
// preview window will be enlarged and list
|
|
// control will be shrunken and the
|
|
// negative number means that preview
|
|
// window will be shrunken and list
|
|
// control will be enlarged. Normally,
|
|
// the width of the preview window equals
|
|
// to the width of the toolbar
|
|
// --- Out :
|
|
// --- Returns: The adjusted offset that takes into account the limitation
|
|
// for the sizes of the list control and preview window
|
|
// --- Effect : Sets the offset in pixels of the preview window from its normal
|
|
// position relatively to the list control that displays files
|
|
// and folders
|
|
int SetPreviewWndOffset(int nPreviewWndOffset);
|
|
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns: The offset in pixels of the preview window from its normal
|
|
// position relatively to the list control that displays files
|
|
// and folders. Positive number means that preview window will be
|
|
// enlarged and list control will be shrunken and the negative
|
|
// number means that preview window will be shrunken and list
|
|
// control will be enlarged. Normally, the width of the preview
|
|
// window equals to the width of the toolbar
|
|
// --- Effect : Retrieves the offset in pixels of the preview window from
|
|
// its normal position relatively to the list control that
|
|
// displays files and folders
|
|
inline int GetPreviewWndOffset() const { return m_nPreviewWndOffset; }
|
|
|
|
|
|
protected:
|
|
// retrieves a window handle to the dialog's list control that displays
|
|
// file and folders
|
|
HWND FindListCtrl();
|
|
// retrieves a window handle to the dialog's toolbar
|
|
HWND FindToolBar();
|
|
|
|
// resizes dialog controls
|
|
virtual void AdjustControls();
|
|
// updates toolbar position and adds "Preview" button
|
|
virtual void UpdateToolBar();
|
|
|
|
// standard CFileDialog handlers
|
|
virtual void OnFileNameChange();
|
|
virtual void OnInitDone();
|
|
virtual void OnFolderChange();
|
|
|
|
// window messages handlers
|
|
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
|
|
virtual BOOL OnWndMsg(UINT message,WPARAM wParam,LPARAM lParam,LRESULT* pResult);
|
|
|
|
// routines for saving the preview state and preview window offset settings
|
|
void SaveState(LPCTSTR lpszProfileName=_T("COXPreviewDialog Settings"));
|
|
void LoadPreviewState(LPCTSTR lpszProfileName=_T("COXPreviewDialog Settings"));
|
|
void LoadPreviewWndOffsetState(LPCTSTR lpszProfileName=_T("COXPreviewDialog Settings"));
|
|
|
|
protected:
|
|
BOOL IsWindows2K();
|
|
// initializes the dialog
|
|
virtual void InitializePreviewDialog();
|
|
|
|
|
|
// --- In : sFilename - full path to new selected file
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Called every time new file is selected in the list control.
|
|
// The default implementation calls
|
|
// COXFileViewer::OnNewFileSelected() function for all registered
|
|
// file viewer objects
|
|
virtual void OnNewFileSelect(const CString& sFilename);
|
|
|
|
// --- In : pDC - device context to draw in
|
|
// paintRect - rectangle to draw in
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Called every time the preview of the selected file must be drawn.
|
|
// The default implementation calls
|
|
// COXFileViewer::OnPaintPreview() function for all registered
|
|
// file viewer objects
|
|
virtual void OnPaintPreview(CDC* pDC, const CRect& paintRect);
|
|
|
|
// --- In : pFocusWnd - window that have the focus at the moment
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Called every time the preview of the selected file must be drawn.
|
|
// The default implementation calls
|
|
// COXFileViewer::OnDoRealizePalette() function for all registered
|
|
// file viewer objects
|
|
virtual void OnDoRealizePalette(CWnd* pFocusWnd);
|
|
|
|
|
|
// checks if new file was selected
|
|
virtual void CheckFileSelection();
|
|
|
|
// draws the preview of the selected file when there is no viewer found
|
|
// that handles the drawing of this file preview
|
|
virtual void DrawPreviewNotAvailable(CDC* pDC, const CRect& paintRect);
|
|
|
|
// standard handler
|
|
virtual BOOL OnInitDialog();
|
|
|
|
// message handlers
|
|
afx_msg void OnPaletteChanged(CWnd* pFocusWnd);
|
|
afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized);
|
|
DECLARE_MESSAGE_MAP()
|
|
};
|
|
|
|
#endif //__OXPREVIEWDIALOG_H__
|
|
|