#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, 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