#ifndef __PREVIEWWND_H_
#define __PREVIEWWND_H_

#include "resource.h"       // main symbols
#include "annotlib.h"
#include "tasks.h"
#include "ZoomWnd.h"
#include "SelTrack.h"
#include "Events.h"


// forward declaration
class CPreview;

#define NEWTOOLBAR_TOPMARGIN        8
#define NEWTOOLBAR_BOTTOMMARGIN     8
#define NEWTOOLBAR_BOTTOMMARGIN_CTRLMODE    12

#define TIMER_ANIMATION        42
#define TIMER_SLIDESHOW        43
#define TIMER_TOOLBAR          44
#define TIMER_DATAOBJECT       45
#define TIMER_BUSYCURSOR       46
#define TIMER_RESETSCREENSAVER 47

#define DEFAULT_SHIMGVW_TIMEOUT  5000 // five seconds


// IV_SCROLL message parameters
#define IVS_LEFT        (SB_LEFT)
#define IVS_RIGHT       (SB_RIGHT)
#define IVS_LINELEFT    (SB_LINELEFT)
#define IVS_LINERIGHT   (SB_LINERIGHT)
#define IVS_PAGELEFT    (SB_PAGELEFT)
#define IVS_PAGERIGHT   (SB_PAGERIGHT)
#define IVS_UP          (SB_LEFT<<16)
#define IVS_DOWN        (SB_RIGHT<<16)
#define IVS_LINEUP      (SB_LINELEFT<<16)
#define IVS_LINEDOWN    (SB_LINERIGHT<<16)
#define IVS_PAGEUP      (SB_PAGELEFT<<16)
#define IVS_PAGEDOWN    (SB_PAGERIGHT<<16)

// IV_ZOOM messages
#define IVZ_CENTER  0
#define IVZ_POINT   1
#define IVZ_RECT    2
#define IVZ_ZOOMIN  0x00000000
#define IVZ_ZOOMOUT 0x00010000

// IV_SETOPTIONS and IV_GETOPTIONS messages
#define IVO_TOOLBAR         0
#define IVO_PRINTBTN        1
#define IVO_FULLSCREENBTN   2
#define IVO_CONTEXTMENU     3
#define IVO_PRINTABLE       4
#define IVO_ALLOWGOONLINE   5
#define IVO_DISABLEEDIT     6

// three modes of preview control
#define CONTROL_MODE        0       // embedded in an activeX control
#define WINDOW_MODE         1       // regular window app window
#define SLIDESHOW_MODE      2       // full screen, no menu/title/hides tray

// priority levels for the various tasks
#define PRIORITY_PRIMARYDECODE  0x40000000
#define PRIORITY_FRAMECACHE     0x30000000
#define PRIORITY_LOOKAHEADCACHE 0x20000000
#define PRIORITY_SLIDESHOWENUM  0x10000000

// these values determine which buttons are hidden, enabled, or disabled based on multi-page state
#define MPCMD_HIDDEN        0
#define MPCMD_FIRSTPAGE     1
#define MPCMD_MIDDLEPAGE    2
#define MPCMD_LASTPAGE      3
#define MPCMD_DISABLED      4

#define GTIDFM_DECODE       0
#define GTIDFM_DRAW         1

void GetTaskIDFromMode(DWORD dwTask, DWORD dwMode, TASKOWNERID *ptoid);

enum EViewerToolbarButtons;

class CPreviewWnd : public INamespaceWalkCB, public IDropTarget, public CWindowImpl<CPreviewWnd>,
                    public IServiceProvider, public IImgCmdTarget
{
public:
    // IUnknown
    STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
    STDMETHODIMP_(ULONG) AddRef(void);
    STDMETHODIMP_(ULONG) Release(void);

    // INamespaceWalkCB
    STDMETHODIMP FoundItem(IShellFolder *psf, LPCITEMIDLIST pidl);
    STDMETHODIMP EnterFolder(IShellFolder *psf, LPCITEMIDLIST pidl);
    STDMETHODIMP LeaveFolder(IShellFolder *psf, LPCITEMIDLIST pidl);
    STDMETHOD(InitializeProgressDialog)(LPWSTR *ppszTitle, LPWSTR *ppszCancel)
        { *ppszTitle = NULL; *ppszCancel = NULL; return E_NOTIMPL; }

    // IDropTarget
    STDMETHODIMP DragEnter(IDataObject *pdtobj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
    STDMETHODIMP DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
    STDMETHODIMP DragLeave();
    STDMETHODIMP Drop(IDataObject *pdtobj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);

    // IServiceProvider
    STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void **ppv);

    // IImgCmdTarget
    STDMETHODIMP GetMode(DWORD * pdw);
    STDMETHODIMP GetPageFlags(DWORD * pdw);
    STDMETHODIMP ZoomIn();
    STDMETHODIMP ZoomOut();
    STDMETHODIMP ActualSize();
    STDMETHODIMP BestFit();
    STDMETHODIMP Rotate(DWORD dwAngle);
    STDMETHODIMP NextPage();
    STDMETHODIMP PreviousPage();

    
    CGraphicsInit    m_cgi;  // we call gdi+ directly -- make sure GDI+ is ready for us 
    CContainedWindow m_ctlToolbar;
    CZoomWnd         m_ctlPreview;
    CContainedWindow m_ctlEdit;

    CPreviewWnd *m_pcwndSlideShow;

    CPreviewWnd();
    ~CPreviewWnd();

    HRESULT Initialize(CPreviewWnd* pother, DWORD dwMode, BOOL bExitApp);

    BOOL TryWindowReuse(IDataObject *pdtobj);
    BOOL TryWindowReuse(LPCTSTR pszFilename);

    void OpenFile(HWND hwnd, LPCTSTR pszFile);
    void OpenFileList(HWND hwnd, IDataObject *pdtobj);

    LRESULT ShowFile(LPCTSTR pszFile, UINT cItems, BOOL fReshow = false);
    HRESULT WalkItemsToPreview(IUnknown* punk);
    void PreviewItems();
    HRESULT PreviewItemsFromUnk(IUnknown *punk);

    BOOL CreateViewerWindow();
    BOOL CreateSlideshowWindow(UINT cWalkDepth);
    void SetNotify(CEvents * pEvents);
    void SetPalette(HPALETTE hpal);
    BOOL GetPrintable();
    int  TranslateAccelerator(LPMSG lpmsg);
    HRESULT SetSite(IUnknown *punk);
    HRESULT SaveAs(BSTR bstrPath);
    IUnknown *GetSite() {return m_punkSite;};
    HRESULT SetWallpaper(BSTR bstrPath);
    HRESULT StartSlideShow(IUnknown *punk);
    void StatusUpdate(int iStatus);   // used to set m_ctlPreview.m_iStrID to display correct status message
    void SetCaptionInfo(LPCTSTR szPath);

    // The following functions are called from the ZoomWnd
    BOOL OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam);
    BOOL OnMouseDown(UINT uMsg, WPARAM wParam, LPARAM lParam);
    BOOL OnSetCursor(UINT uMsg, WPARAM wParam, LPARAM lParam);
    BOOL OnSetColor(HDC hdc);
    BOOL GetColor(COLORREF * pref);
    void OnDraw(HDC hdc); // called after the Zoomwnd has painted but before calling EndPaint
    void OnDrawComplete();

    DECLARE_WND_CLASS(TEXT("ShImgVw:CPreviewWnd"));

        
BEGIN_MSG_MAP(CPreviewWnd)
    MESSAGE_HANDLER(WM_CREATE, OnCreate)
    MESSAGE_HANDLER(WM_CLOSE, OnClose)
    MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)
    MESSAGE_HANDLER(WM_SIZE, OnSize)
    MESSAGE_HANDLER(WM_APPCOMMAND, OnAppCommand)
    MESSAGE_HANDLER(WM_MEASUREITEM, OnMenuMessage);
    MESSAGE_HANDLER(WM_DRAWITEM, OnMenuMessage);
    MESSAGE_HANDLER(WM_INITMENUPOPUP, OnMenuMessage);
    COMMAND_RANGE_HANDLER(ID_FIRSTTOOLBARCMD, ID_LASTTOOLBARCMD, OnToolbarCommand)
    COMMAND_RANGE_HANDLER(ID_FIRSTEDITCMD, ID_LASTEDITCMD, OnEditCommand)
    COMMAND_RANGE_HANDLER(ID_FIRSTPOSITIONCMD, ID_LASTPOSITIONCMD, OnPositionCommand)
    COMMAND_RANGE_HANDLER(ID_FIRSTSLIDESHOWCMD, ID_LASTSLIDESHOWCMD, OnSlideshowCommand)
    NOTIFY_CODE_HANDLER(TTN_NEEDTEXT, OnNeedText)
    NOTIFY_CODE_HANDLER(TBN_DROPDOWN, OnDropDown)
    MESSAGE_HANDLER(WM_MOUSEWHEEL, OnWheelTurn)
    MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
    MESSAGE_HANDLER(WM_CONTEXTMENU, OnContextMenu)
    MESSAGE_HANDLER(WM_TIMER, OnTimer)
    MESSAGE_HANDLER(IV_SETIMAGEDATA, IV_OnSetImageData)
    MESSAGE_HANDLER(IV_SCROLL, IV_OnIVScroll)
    MESSAGE_HANDLER(IV_SETOPTIONS, IV_OnSetOptions)
    MESSAGE_HANDLER(WM_COPYDATA, OnCopyData)
    MESSAGE_HANDLER(WM_KEYDOWN, OnKeyEvent)
    MESSAGE_HANDLER(WM_CHAR, OnKeyEvent)
    MESSAGE_HANDLER(WM_ENTERMENULOOP, OnKeyEvent)
    MESSAGE_HANDLER(WM_PRINTCLIENT, OnPrintClient)
    MESSAGE_HANDLER(IV_ONCHANGENOTIFY, OnChangeNotify)
    MESSAGE_HANDLER(WM_SYSCOMMAND, OnSysCommand)
    MESSAGE_HANDLER(IV_ISAVAILABLE, OnIsAvailable)
ALT_MSG_MAP(1)
    // messages for the toolbar
    MESSAGE_HANDLER(WM_KEYDOWN, OnTBKeyEvent)
    MESSAGE_HANDLER(WM_KEYUP, OnTBKeyEvent)
    MESSAGE_HANDLER(WM_MOUSEMOVE, OnTBMouseMove)
    MESSAGE_HANDLER(WM_MOUSELEAVE, OnTBMouseLeave)
ALT_MSG_MAP(2)
    MESSAGE_HANDLER(WM_KEYDOWN, OnEditKeyEvent)
END_MSG_MAP()

    LRESULT IV_OnSetOptions(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

protected:
    LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnWheelTurn(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnNeedText(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
    LRESULT OnDropDown(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
    LRESULT OnToolbarCommand(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
    LRESULT OnEditCommand(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
    LRESULT OnPositionCommand(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
    LRESULT OnSlideshowCommand(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
    LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnAppCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnMenuMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnCopyData(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnKeyEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnSysCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled);
    LRESULT OnChangeNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnIsAvailable(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

    BOOL OnNonSlideShowTab();

    // Image generation message handlers and functions
    LRESULT IV_OnSetImageData(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnShowFileMsg(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT IV_OnIVScroll(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

    // Toolbar message handlers (both toolbars)
    LRESULT OnPrintClient(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnTBKeyEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnTBMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    LRESULT OnTBMouseLeave(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

    // Edit control message handlers
    LRESULT OnEditKeyEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);

    // DropDown handlers for the various dropdown buttons
    VOID _DropDownPageList(LPNMTOOLBAR pnmTB);

    BOOL         CreateToolbar();
    BOOL         _CreateViewerToolbar();
    void        _InitializeViewerToolbarButtons(HWND hwndToolbar, const TBBUTTON c_tbbuttons[], size_t c_nButtons, TBBUTTON tbbuttons[], size_t nButtons);
    inline UINT _IndexOfViewerToolbarButton(EViewerToolbarButtons eButton);
    BOOL        _CreateSlideshowToolbar();
    void        _InitializeToolbar(HWND hwndTB, int idLow, int idLowHot, int idHigh, int idHighHot);
    void        _UpdatePageNumber();
    void        _SetMultipageCommands();
    void        _SetMultiImagesCommands();
    void        _SetEditCommands();
    void        _ResetScreensaver();

    HRESULT _SaveAsCmd();
    void _PropertiesCmd();
    void _OpenCmd();
    BOOL _ReShowingSameFile(LPCTSTR pszFile);
    BOOL _VerbExists(LPCTSTR pszVerb);
    HRESULT _InvokeVerb(LPCTSTR pszVerb, LPCTSTR pszParameters=NULL);
    void _InvokePrintWizard();
//    void _InvokeVerbOnPidlArray(LPCSTR pszVerb);
    // Shared functions for Annotation and Cropping
    void _RefreshSelection(BOOL fDeselect = false);
    void _UpdateButtons(WORD wID);

    // Annotation Functions
    BOOL _CanAnnotate(CDecodeTask * pImageData);
    void _SetAnnotatingCommands(BOOL fEnableAnnotations);
    void _SetupAnnotatingTracker(CSelectionTracker& tracker, BOOL bEditing=FALSE);
    void _UpdateAnnotatingSelection(BOOL fDeselect = false);
    void _RemoveAnnotatingSelection();
    BOOL _OnMouseDownForAnnotating(UINT uMsg, WPARAM wParam, LPARAM lParam);
    void _OnMouseDownForAnnotatingHelper(CPoint ptMouse, CRect rectImage);
    void _CreateAnnotation(CRect rect);
    void _CreateFreeHandAnnotation(CPoint ptMouse);
    void _StartEditing(BOOL bUpdateText = TRUE);
    void _HideEditing();
    void _StopEditing();
    static BOOL_PTR CALLBACK _AnnoPropsDlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

    //Cropping Functions
    BOOL _CanCrop(CDecodeTask * pImageData);
    void _SetCroppingCommands(BOOL fEnableCropping);
    void _SetupCroppingTracker(CSelectionTracker& tracker);
    void _UpdateCroppingSelection();
    BOOL _OnMouseDownForCropping(UINT uMsg, WPARAM wParam, LPARAM lParam);

    // Other functions
    void _SetNewImage(CDecodeTask * pImageData);
    void _UpdateImage();

    // Private methods to create the webviewer
    HRESULT _CreateWebViewer();
    BOOL _IsThumbnail(LPCTSTR pszPath);
    HRESULT _CopyImages(IStorage* pstgSrc, IStorage* pstgDest, UINT cItems, HDPA hdpaItems);
    HRESULT _CopyImages_SetupProgress(IProgressDialog** ppProgress, LPWSTR pwszBanner);
    HRESULT _CopyThumbnails(LPITEMIDLIST pidlDest, UINT cItems, HDPA hdpaItems, BOOL* fThumbWritten);
    HRESULT _WriteThumbs(IStream* pstrm, UINT uiTemplateResource, UINT cItems, HDPA hdpaItems);

    LPSTR   _GetImageList(UINT cItems, HDPA hdpaItems, BOOL fAddSuffix);
    HRESULT _GetSelectedImages(HDPA* phdpaItems);
    HRESULT _FormatHTML(UINT cItems, HDPA hdpaItems, LPSTR pszTemplate, DWORD cbTemplateSize, LPSTR psz1, LPSTR psz2, UINT ui1, LPSTR* ppszOut);
    HRESULT _FormatHTMLNet(UINT cItems, HDPA hdpaItems, LPSTR pszTemplate, DWORD cbTemplateSize, LPSTR psz1, UINT ui1, LPSTR* ppszOut);
    HRESULT _WriteHTML(IStorage* pStgDest, UINT cItems, HDPA hdpaItems);
    DWORD   _GetFilterStringForSave(LPTSTR szFilter, size_t cbFilter, LPTSTR szExt);
    HRESULT _SaveIfDirty(BOOL fCanCancel = false);
    HRESULT _PreviewFromStream(IStream * pSteam, UINT iItem, BOOL fUpdateCaption);
    HRESULT _PreviewFromFile(LPCTSTR pszFilename, UINT iItem, BOOL fUpdateCaption);
    void    FlushBitmapMessages();
    HRESULT _ShowNextSlide(BOOL bGoBack);
    HRESULT _StartDecode(UINT iIndex, BOOL fUpdateCaption);
    HRESULT _PreLoadItem(UINT iIndex);
    HRESULT _PreviewItem(UINT iIndex);
    BOOL    _TrySetImage();
    void    _RemoveFromArray(UINT iItem);
    HRESULT _DeleteCurrentSlide();
    BOOL    _CloseSlideshowWindow();

    void SetCursorState(DWORD dwType);
    void ShowSSToolbar(BOOL bShow, BOOL bForce = FALSE);
    void TogglePlayState();
    void _ClearDPA();
    HRESULT _GetItem(UINT iItem, LPITEMIDLIST *ppidl);
    HRESULT GetCurrentIDList(LPITEMIDLIST *ppidl); // gets the dynamically generated title for this window
    HRESULT PathFromImageData(LPTSTR pszFile, UINT cch);
    HRESULT ImageDataSave(LPCTSTR pszFile, BOOL bShowUI);
    void MenuPoint(LPARAM lParam, int *px, int *py);
    BOOL _IsImageFile(LPCTSTR pszFileName);
    BOOL _BuildDecoderList();
    HRESULT _PrevNextPage(BOOL fForward);
    Image *_BurnAnnotations(IShellImageData *pSID);
    void _RegisterForChangeNotify(BOOL fRegister);
    BOOL _ShouldDisplayAnimations();

    BOOL m_fHidePrintBtn;
    BOOL m_fAllowContextMenu;
    BOOL m_fDisableEdit;        // if true, editing is disabled, defaults to FALSE.
    BOOL m_fCanSave;
    BOOL m_fShowToolbar;
    BOOL m_fWarnQuietSave;
    BOOL m_fWarnNoSave;

    BOOL m_fCanAnnotate;        // if true, allows annotation, defaults to FALSE.
    BOOL m_fAnnotating;         // if true, we are in annotating mode, default to false
    HDPA m_hdpaSelectedAnnotations;
    BOOL m_fDirty;
    WORD m_wNewAnnotation;
    HFONT m_hFont;
    BOOL m_fEditingAnnotation;

    BOOL m_fCanCrop;
    BOOL m_fCropping;
    CRect m_rectCropping;       // Cropping Rectangle in Image Coordinates.

    BOOL    m_fBusy;            // we are displaying the hourglass-and-pointer cursor
    HCURSOR m_hCurOld;
    HCURSOR m_hCurrent;
    BOOL    m_fClosed;

    BOOL            m_fPrintable;
    BOOL            m_fExitApp;
    DWORD           m_dwMode;           // three modes: CONTROL_MODE, WINDOW_MODE, SLIDESHOW_MODE
    BOOL            m_fIgnoreUITimers;  // should we ignore timer messages (used when context menu is up, don't hide toolbar)
    HACCEL          m_haccel;

    CEvents *       m_pEvents;          // pointer to our parent control event object.  NULL if we aren't running as a control.

    LPITEMIDLIST*   m_ppidls;           // pidls of already shown items
    UINT            m_cItems;           // # of items in m_ppidls
    UINT            m_iCurSlide;        // index into m_ppidls

    CDecodeTask* m_pImageData;          // The image data for the decoded image to be viewed
    HDPA        m_hdpaItems;            // pidls of already shown items
    BOOL        m_fPaused;              // slide show paused
    BOOL        m_fToolbarHidden;       // toolbar hidden in slide show mode
    BOOL        m_fGoBack;              // direction of the slide show
    BOOL        m_fTBTrack;             // true if we're tracking mouse for toolbar
    BOOL        m_fWasEdited;           // true if we edited the image
    UINT        m_uTimeout;
    int         m_iSSToolbarSelect;     // selection in toolbar (used for keyboard support in Whistler)
    IUnknown*   m_punkSite;

    HPALETTE    m_hpal;                 // the palette to use if in palette mode.

    IShellImageDataFactory * m_pImageFactory;  // for decoding images

    DWORD       m_dwMultiPageMode;      // for remembering the state of the prev/next page commands

    EXECUTION_STATE m_esFlags;          // execution flags, stored to restore after we re-enable monitor's power saving mode
    HWND _hWndPageList;

    IContextMenu3 *_pcm3;

    IShellTaskScheduler * m_pTaskScheduler;     // for managing a worker thread
    CDecodeTask *         m_pNextImageData;
    UINT                  m_iDecodingNextImage;

    ImageCodecInfo *m_pici;
    UINT m_cDecoders;

    IDataObject *_pdtobj; // reused data object for passing data from oncopydata to ontimer
    BOOL m_fPromptingUser;

    BOOL m_fFirstTime;
    BOOL m_fFirstItem;

    DWORD m_dwEffect;
    BOOL  m_fIgnoreNextNotify;
    ULONG m_uRegister;
    BOOL  m_fNoRestore;

private:
    BOOL m_bRTLMirrored;    // true if m_hWnd is RTL mirrored
    UINT m_cWalkDepth;
};


#define REGSTR_SHIMGVW      TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ShellImageView")
#define REGSTR_MAXIMIZED    TEXT("Maximize")
#define REGSTR_BOUNDS       TEXT("Bounds")
#define REGSTR_FONT         TEXT("Font")
#define REGSTR_BACKCOLOR    TEXT("BackColor")
#define REGSTR_LINECOLOR    TEXT("LineColor")
#define REGSTR_TEXTCOLOR    TEXT("TextColor")
#define REGSTR_LINEWIDTH    TEXT("LineWidth")
#define REGSTR_TIMEOUT      TEXT("Timeout")

#define REGSTR_DONTSHOWME   TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\DontShowMeThisDialogAgain")
#define REGSTR_SAVELESS     TEXT("ShellImageViewWarnOnSavelessRotate")
#define REGSTR_LOSSYROTATE  TEXT("ShellImageViewWarnOnLossyRotate")

#endif