2025-11-27 16:46:48 +09:00

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__