You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
886 lines
23 KiB
C++
886 lines
23 KiB
C++
// XTPPreviewView.cpp : implementation file
|
|
//
|
|
// This file is a part of the XTREME TOOLKIT PRO MFC class library.
|
|
// (c)1998-2012 Codejock Software, All Rights Reserved.
|
|
//
|
|
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
|
|
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
|
|
// CONSENT OF CODEJOCK SOFTWARE.
|
|
//
|
|
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
|
|
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
|
|
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
|
|
// SINGLE COMPUTER.
|
|
//
|
|
// CONTACT INFORMATION:
|
|
// support@codejock.com
|
|
// http://www.codejock.com
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
#include "Resource.h"
|
|
|
|
#include "Common/XTPDrawHelpers.h"
|
|
#include "Common/XTPResourceManager.h"
|
|
#include "Common/XTPSystemHelpers.h"
|
|
#include "Common/XTPHookManager.h"
|
|
|
|
#include "XTPCommandBarsDefines.h"
|
|
#include "XTPCommandBar.h"
|
|
#include "XTPToolBar.h"
|
|
#include "XTPPopupBar.h"
|
|
#include "XTPControls.h"
|
|
#include "XTPControl.h"
|
|
#include "XTPControlButton.h"
|
|
#include "XTPControlPopup.h"
|
|
#include "XTPControlEdit.h"
|
|
#include "XTPControlComboBox.h"
|
|
#include "XTPControlExt.h"
|
|
#include "XTPPreviewView.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// CXTPControlPageSelector
|
|
|
|
class CXTPControlPageSelector : public CXTPControlSelector
|
|
{
|
|
public:
|
|
CXTPControlPageSelector();
|
|
void OnDrawItem(CDC* pDC, CRect rcItem, COLORREF clrText);
|
|
};
|
|
|
|
CXTPControlPageSelector::CXTPControlPageSelector()
|
|
{
|
|
|
|
m_szItemsCount = CSize(3, 3);
|
|
m_szItemsMax = CSize(3, 3);
|
|
m_szItem = CSize(32, 32);
|
|
}
|
|
|
|
|
|
void CXTPControlPageSelector::OnDrawItem(CDC* pDC, CRect rcItem, COLORREF clrText)
|
|
{
|
|
rcItem.DeflateRect(3, 4, 3, 4);
|
|
|
|
for (int y = rcItem.top, i = 0; y < rcItem.bottom; y += 3, i++)
|
|
{
|
|
pDC->FillSolidRect(rcItem.left, y, (i + 1) % 5 == 0? rcItem.Width() / 2: rcItem.Width(), 1, clrText);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CXTPPreviewView
|
|
|
|
IMPLEMENT_DYNCREATE(CXTPPreviewView, CPreviewView)
|
|
|
|
CXTPPreviewView::CXTPPreviewView(int nPageCount /*=9*/)
|
|
{
|
|
// replace the PAGE_INFO array with specified page count.
|
|
m_pPageInfo2 = new PAGE_INFO[nPageCount];
|
|
m_pPageInfo = m_pPageInfo2;
|
|
|
|
m_Across = 1; // default number of pages across the screen
|
|
m_Down = 1; // default number of pages down the screen
|
|
m_nPages = 1;
|
|
m_nZoomOutPages = 1;
|
|
AfxGetApp()->m_nNumPreviewPages = 1;
|
|
|
|
CWindowDC dc(NULL);
|
|
m_cxPixelsPerInch = ::GetDeviceCaps(dc, LOGPIXELSX);
|
|
m_cyPixelsPerInch = ::GetDeviceCaps(dc, LOGPIXELSY);
|
|
|
|
m_clrBackColor = GetSysColor(COLOR_APPWORKSPACE);
|
|
|
|
m_pCommandBar = new CXTPToolBar();
|
|
}
|
|
|
|
CXTPPreviewView::~CXTPPreviewView()
|
|
{
|
|
SAFE_DELETE_AR(m_pPageInfo2);
|
|
CMDTARGET_RELEASE(m_pCommandBar);
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CXTPPreviewView, CPreviewView)
|
|
//{{AFX_MSG_MAP(CXTPPreviewView)
|
|
ON_WM_CREATE()
|
|
ON_WM_WINDOWPOSCHANGED()
|
|
ON_WM_PAINT()
|
|
ON_WM_ERASEBKGND()
|
|
ON_WM_LBUTTONDOWN()
|
|
ON_WM_SETCURSOR()
|
|
ON_WM_VSCROLL()
|
|
ON_WM_SIZE()
|
|
|
|
ON_COMMAND(AFX_ID_PREVIEW_NUMPAGE, OnNumPageChange)
|
|
ON_COMMAND(XTP_ID_PREVIEW_ZOOMIN, OnZoomIn)
|
|
ON_COMMAND(XTP_ID_PREVIEW_ZOOMOUT, OnZoomOut)
|
|
ON_COMMAND(XTP_ID_PREVIEW_CLOSE, CPreviewView::OnPreviewClose)
|
|
ON_COMMAND(XTP_ID_PREVIEW_NEXT, CPreviewView::OnNextPage)
|
|
ON_COMMAND(XTP_ID_PREVIEW_PREV, CPreviewView::OnPrevPage)
|
|
ON_COMMAND(XTP_ID_PREVIEW_PRINT, CPreviewView::OnPreviewPrint)
|
|
|
|
ON_COMMAND(XTP_ID_PREVIEW_ONEPAGE, OnOnePage)
|
|
|
|
ON_UPDATE_COMMAND_UI(AFX_ID_PREVIEW_NUMPAGE, OnUpdateNumPageChange)
|
|
ON_UPDATE_COMMAND_UI(XTP_ID_PREVIEW_ZOOMIN, OnUpdateZoomIn)
|
|
ON_UPDATE_COMMAND_UI(XTP_ID_PREVIEW_ZOOMOUT, OnUpdateZoomOut)
|
|
ON_UPDATE_COMMAND_UI(XTP_ID_PREVIEW_NEXT, CPreviewView::OnUpdateNextPage)
|
|
ON_UPDATE_COMMAND_UI(XTP_ID_PREVIEW_PREV, CPreviewView::OnUpdatePrevPage)
|
|
|
|
ON_NOTIFY(EN_SETFOCUS, XTP_ID_PREVIEW_GOTOPAGE, OnGotoPageSetFocus)
|
|
ON_NOTIFY(EN_KILLFOCUS, XTP_ID_PREVIEW_GOTOPAGE, OnGotoPageKillFocus)
|
|
ON_UPDATE_COMMAND_UI(XTP_ID_PREVIEW_GOTOPAGE, OnUpdateGotoPage)
|
|
ON_XTP_EXECUTE(XTP_ID_PREVIEW_ZOOMCOMBO, OnZoomCombo)
|
|
ON_XTP_EXECUTE(XTP_ID_PREVIEW_TWOPAGE, OnTwoPage)
|
|
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
UINT nDefaultZooms[] = {10, 25, 50, 75, 100, 150, 200, 500};
|
|
|
|
int CXTPPreviewView::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
if (CPreviewView::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
ASSERT_VALID (m_pToolBar); // dialog bar must be valid.
|
|
|
|
// Create the toolbar that is used in the dialog bar.
|
|
if (!m_pCommandBar->CreateToolBar( WS_CHILD | WS_VISIBLE | CBRS_TOP
|
|
| CBRS_GRIPPER | CBRS_TOOLTIPS, m_pToolBar) ||
|
|
!m_pCommandBar->LoadToolBar( XTP_IDR_PREVIEW_TOOLBAR ) )
|
|
{
|
|
TRACE0("Failed to create toolbar\n");
|
|
return -1; // fail to create
|
|
}
|
|
m_pCommandBar->SetOwner(this);
|
|
|
|
// display text for print and close buttons.
|
|
FindToolbarButton(XTP_ID_PREVIEW_PRINT)->SetStyle(xtpButtonIconAndCaption);
|
|
FindToolbarButton(XTP_ID_PREVIEW_CLOSE)->SetStyle(xtpButtonIconAndCaption);
|
|
|
|
|
|
CXTPControlPopup* pTwoPages = (CXTPControlPopup*)m_pCommandBar->GetControls()->SetControlType(FindToolbarButton(XTP_ID_PREVIEW_TWOPAGE), xtpControlButtonPopup);
|
|
pTwoPages->SetFlags(xtpFlagManualUpdate);
|
|
|
|
pTwoPages->GetCommandBar()->GetControls()->Add(new CXTPControlPageSelector(), XTP_ID_PREVIEW_TWOPAGE);
|
|
pTwoPages->GetCommandBar()->SetShowGripper(FALSE);
|
|
|
|
|
|
CXTPControlEdit* pControlGotoPage = (CXTPControlEdit*)m_pCommandBar->GetControls()->SetControlType(FindToolbarButton(XTP_ID_PREVIEW_GOTOPAGE), xtpControlEdit);
|
|
|
|
pControlGotoPage->SetWidth(100);
|
|
|
|
CXTPControlComboBox* pControlZoom = (CXTPControlComboBox*)m_pCommandBar->GetControls()->SetControlType(FindToolbarButton(XTP_ID_PREVIEW_ZOOMCOMBO), xtpControlComboBox);
|
|
pControlZoom->SetFlags(xtpFlagManualUpdate);
|
|
|
|
pControlZoom->SetWidth(100);
|
|
pControlZoom->SetDropDownListStyle();
|
|
|
|
pControlZoom->AddString(XTPResourceManager()->LoadString(XTP_IDS_PREVIEW_WHOLEPAGE));
|
|
pControlZoom->AddString(XTPResourceManager()->LoadString(XTP_IDS_PREVIEW_PAGEWIDTH));
|
|
|
|
for (int i = 0; i < _countof(nDefaultZooms); i++)
|
|
{
|
|
CString strZoom;
|
|
strZoom.Format(_T("%i%%"), nDefaultZooms[i]);
|
|
|
|
int nIndex = pControlZoom->AddString(strZoom);
|
|
pControlZoom->SetItemData(nIndex, nDefaultZooms[i]);
|
|
}
|
|
|
|
pControlZoom->SetCurSel(0);
|
|
|
|
return 0;
|
|
}
|
|
|
|
CXTPControl* CXTPPreviewView::FindToolbarButton(UINT nCommandID)
|
|
{
|
|
return m_pCommandBar->GetControls()->FindControl(nCommandID);
|
|
}
|
|
|
|
void CXTPPreviewView::RecalLayout()
|
|
{
|
|
// Get a pointer to the parent frame.
|
|
CFrameWnd* pFrameWnd = m_pToolBar->GetDockingFrame( );
|
|
ASSERT_VALID( pFrameWnd );
|
|
|
|
// Get the size of the client area for the docking frame.
|
|
CRect r;
|
|
pFrameWnd->GetClientRect( &r );
|
|
|
|
// Calculate the actual size of the toolbar.
|
|
CSize size(0, 0);
|
|
|
|
if (m_pCommandBar->IsVisible())
|
|
size = m_pCommandBar->CalcDockingLayout(r.Width(), /*LM_HIDEWRAP| */ LM_HORZDOCK | LM_HORZ | LM_COMMIT);
|
|
|
|
size.cx = r.Width( );
|
|
|
|
// Set the height of the dialog bar equal to the
|
|
// toolbar's height.
|
|
m_pToolBar->m_sizeDefault.cy = size.cy;
|
|
|
|
// Reposition the toolbar.
|
|
m_pCommandBar->MoveWindow( 0, 0, size.cx, size.cy );
|
|
m_pCommandBar->Invalidate(FALSE);
|
|
}
|
|
|
|
void CXTPPreviewView::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos)
|
|
{
|
|
CPreviewView::OnWindowPosChanged(lpwndpos);
|
|
|
|
// If the toolbar is a window...
|
|
if ( ::IsWindow( m_pCommandBar->m_hWnd ) )
|
|
{
|
|
RecalLayout();
|
|
}
|
|
|
|
Invalidate(FALSE);
|
|
}
|
|
|
|
void CXTPPreviewView::OnPaint()
|
|
{
|
|
// standard paint routine
|
|
CPaintDC dc(this);
|
|
|
|
CXTPClientRect rc(this);
|
|
CXTPBufferDC memDC(dc, rc);
|
|
|
|
// Fill background with APPWORKSPACE
|
|
memDC.FillSolidRect(rc, m_clrBackColor);
|
|
|
|
int nMapMode = memDC.GetMapMode();
|
|
OnPrepareDC(&memDC);
|
|
|
|
OnDraw(&memDC);
|
|
|
|
memDC.SetViewportOrg(CPoint(0, 0));
|
|
memDC.SetMapMode(nMapMode);
|
|
}
|
|
|
|
BOOL CXTPPreviewView::OnEraseBkgnd(CDC*)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CXTPPreviewView::PreCreateWindow(CREATESTRUCT& cs)
|
|
{
|
|
return CPreviewView::PreCreateWindow(cs);
|
|
}
|
|
|
|
#ifdef _DEBUG
|
|
void CXTPPreviewView::AssertValid() const
|
|
{
|
|
// Bug nearby Article ID: Q192853
|
|
// CPreviewView::AssertValid();
|
|
}
|
|
|
|
void CXTPPreviewView::Dump(CDumpContext& dc) const
|
|
{
|
|
CPreviewView::Dump(dc);
|
|
}
|
|
#endif //_DEBUG
|
|
|
|
BOOL CXTPPreviewView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
|
|
{
|
|
if (nHitTest != HTCLIENT)
|
|
return CScrollView::OnSetCursor(pWnd, nHitTest, message);
|
|
|
|
CPoint point;
|
|
::GetCursorPos(&point);
|
|
ScreenToClient(&point); // client coordinates of mouse position
|
|
|
|
UINT nPage;
|
|
if (m_nZoomState < 500 &&
|
|
FindPageRect(point, nPage))
|
|
{ // On a page and not zoomed all the way in
|
|
if (m_hMagnifyCursor == NULL)
|
|
{
|
|
HINSTANCE hInst = AfxFindResourceHandle(
|
|
MAKEINTRESOURCE(AFX_IDC_MAGNIFY), RT_GROUP_CURSOR);
|
|
m_hMagnifyCursor = ::LoadCursor(hInst,
|
|
MAKEINTRESOURCE(AFX_IDC_MAGNIFY));
|
|
}
|
|
::SetCursor(m_hMagnifyCursor);
|
|
}
|
|
else
|
|
{
|
|
::SetCursor(::LoadCursor(NULL, IDC_ARROW));
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void CXTPPreviewView::OnLButtonDown(UINT, CPoint point)
|
|
{
|
|
UINT nPage;
|
|
if (!FindPageRect(point, nPage))
|
|
{
|
|
return; // Didn't click on a page
|
|
}
|
|
|
|
// Set new zoom state
|
|
ZoomIn(nPage, point);
|
|
|
|
if (m_nZoomState == XTP_ZOOM_WHOLEPAGE)
|
|
{
|
|
// make sure the current page does not cause blank pages to be shown
|
|
if (m_nCurrentPage >= m_pPreviewInfo->GetMaxPage() - m_nPages)
|
|
m_nCurrentPage = m_pPreviewInfo->GetMaxPage() - m_nPages + 1;
|
|
if (m_nCurrentPage < 0)
|
|
m_nCurrentPage = 0 ;
|
|
}
|
|
}
|
|
|
|
void CXTPPreviewView::SetZoomState(UINT nNewState, UINT nPage, CPoint point)
|
|
{
|
|
if (m_nZoomState != nNewState)
|
|
{
|
|
CXTPControlComboBox* pControlCombo = (CXTPControlComboBox*)FindToolbarButton(XTP_ID_PREVIEW_ZOOMCOMBO);
|
|
if (nNewState == XTP_ZOOM_WHOLEPAGE)
|
|
{
|
|
pControlCombo->SetCurSel(0);
|
|
}
|
|
else if (nNewState == XTP_ZOOM_PAGEWIDTH)
|
|
{
|
|
pControlCombo->SetCurSel(1);
|
|
}
|
|
else
|
|
{
|
|
CString str;
|
|
str.Format(_T("%i%%"), nNewState);
|
|
|
|
pControlCombo->SetCurSel(-1);
|
|
pControlCombo->SetEditText(str);
|
|
}
|
|
|
|
|
|
m_nZoomState = nNewState;
|
|
DoZoom(nPage, point);
|
|
}
|
|
}
|
|
|
|
// Actual zoom code.
|
|
void CXTPPreviewView::DoZoom(UINT nPage, CPoint point)
|
|
{
|
|
if (m_nZoomState == XTP_ZOOM_WHOLEPAGE)
|
|
{
|
|
// taking over scroll bars
|
|
m_nPages = m_nZoomOutPages;
|
|
ShowScrollBar(SB_HORZ, FALSE); // hide the horizontal bar
|
|
|
|
SCROLLINFO info;
|
|
info.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
|
|
info.nMin = 0;
|
|
info.nMax = 0;
|
|
info.nPage = 1;
|
|
info.nPos = 0;
|
|
SetScrollInfo(SB_HORZ, &info, FALSE);
|
|
|
|
BOOL bShowBar = m_pPreviewInfo->GetMaxPage() < 0x8000 &&
|
|
m_pPreviewInfo->GetMaxPage() -
|
|
m_pPreviewInfo->GetMinPage() <= 32767U;
|
|
|
|
ShowScrollBar(SB_VERT, bShowBar); // Show the vertical bar
|
|
|
|
if (bShowBar)
|
|
{
|
|
info.fMask = SIF_PAGE | SIF_RANGE;
|
|
info.nMin = m_pPreviewInfo->GetMinPage();
|
|
info.nMax = m_pPreviewInfo->GetMaxPage();
|
|
info.nPage = 1;
|
|
if (!SetScrollInfo(SB_VERT, &info, FALSE))
|
|
SetScrollRange(SB_VERT, info.nMin, info.nMax, FALSE);
|
|
}
|
|
|
|
SetCurrentPage(m_nCurrentPage, TRUE);
|
|
SetupScrollbar() ;
|
|
}
|
|
else
|
|
{
|
|
ShowScrollBar(SB_HORZ, FALSE);
|
|
|
|
m_nPages = 1; // only one page in zoomed states
|
|
m_pPageInfo[0].sizeZoomOutRatio = m_pPageInfo[nPage].sizeZoomOutRatio;
|
|
m_pPageInfo[0].sizeUnscaled = m_pPageInfo[nPage].sizeUnscaled;
|
|
|
|
// Sets the printer page
|
|
SetCurrentPage(m_nCurrentPage + nPage, FALSE);
|
|
|
|
SetScaledSize(0);
|
|
|
|
CSize* pRatio = &m_pPageInfo[nPage].sizeScaleRatio;
|
|
|
|
// convert Hit Point from screen 1:1
|
|
point.x = MulDiv(point.x, pRatio->cx, pRatio->cy);
|
|
point.y = MulDiv(point.y, pRatio->cx, pRatio->cy);
|
|
|
|
// Adjust point for page position
|
|
point += (CSize)m_pPageInfo[0].rectScreen.TopLeft();
|
|
|
|
// Scroll to center
|
|
CenterOnPoint(point);
|
|
}
|
|
}
|
|
|
|
void CXTPPreviewView::PositionPage(UINT nPage)
|
|
{
|
|
|
|
CSize windowSize = CalcPageDisplaySize();
|
|
|
|
VERIFY(m_dcPrint.Escape(GETPHYSPAGESIZE, 0, NULL, (LPVOID)&m_pPageInfo[nPage].sizeUnscaled));
|
|
|
|
CSize* pSize = &m_pPageInfo[nPage].sizeUnscaled;
|
|
|
|
// Convert page size to screen coordinates
|
|
pSize->cx = MulDiv(pSize->cx, m_cxPixelsPerInch, m_sizePrinterPPI.cx);
|
|
pSize->cy = MulDiv(pSize->cy, m_cyPixelsPerInch, m_sizePrinterPPI.cy);
|
|
|
|
m_pPageInfo[nPage].sizeZoomOutRatio = CalcScaleRatio(windowSize, *pSize);
|
|
|
|
SetScaledSize(nPage);
|
|
}
|
|
|
|
#define PREVIEW_MARGIN 8
|
|
#define PREVIEW_PAGEGAP 8
|
|
|
|
void CXTPPreviewView::SetScaledSize(UINT nPage)
|
|
{
|
|
CSize* pSize = &m_pPageInfo[nPage].sizeUnscaled;
|
|
CSize* pRatio = &m_pPageInfo[nPage].sizeScaleRatio;
|
|
CSize* pZoomOutRatio = &m_pPageInfo[nPage].sizeZoomOutRatio;
|
|
CSize windowSize = CalcPageDisplaySize();
|
|
BOOL bPaperLarger = pZoomOutRatio->cx < pZoomOutRatio->cy;
|
|
// whether the paper is larger than the screen, or vice versa
|
|
|
|
switch (m_nZoomState)
|
|
{
|
|
case XTP_ZOOM_WHOLEPAGE:
|
|
*pRatio = *pZoomOutRatio;
|
|
break;
|
|
|
|
case XTP_ZOOM_PAGEWIDTH:
|
|
m_Across = 1;
|
|
m_Down = 1;
|
|
m_nPages = 1;
|
|
m_nZoomOutPages = m_nPages;
|
|
m_nMaxPages = 1;
|
|
|
|
pRatio->cx = windowSize.cx - PREVIEW_MARGIN * 2 - 6;
|
|
pRatio->cy = pSize->cx;
|
|
break;
|
|
|
|
case 100:
|
|
if (bPaperLarger)
|
|
{
|
|
pRatio->cx = pRatio->cy = 1;
|
|
}
|
|
else
|
|
{
|
|
// if the paper is smaller than the screen space we're displaying
|
|
// it in, then using a ratio of 1/1 will result in a smaller image
|
|
// on the screen, not a larger one. To get a larger image in this
|
|
// case we double the zoom out ratio.
|
|
pRatio->cy = pZoomOutRatio->cy;
|
|
pRatio->cx = 2*pZoomOutRatio->cx - pZoomOutRatio->cy;
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
pRatio->cx = m_nZoomState;
|
|
pRatio->cy = 100;
|
|
}
|
|
|
|
// Convert to scaled size
|
|
CSize scaledSize;
|
|
scaledSize.cx = MulDiv(pSize->cx, pRatio->cx, pRatio->cy);
|
|
scaledSize.cy = MulDiv(pSize->cy, pRatio->cx, pRatio->cy);
|
|
|
|
CRect* pRect = &m_pPageInfo[nPage].rectScreen;
|
|
pRect->SetRect(PREVIEW_MARGIN, PREVIEW_MARGIN,
|
|
scaledSize.cx + PREVIEW_MARGIN + 3,
|
|
scaledSize.cy + PREVIEW_MARGIN + 3);
|
|
|
|
if (m_nZoomState == XTP_ZOOM_WHOLEPAGE)
|
|
{
|
|
pRect->OffsetRect((windowSize.cx - pRect->Size().cx) / 2 - 1, (windowSize.cy - pRect->Size().cy) / 2 - 1);
|
|
|
|
// we need to offset the page multiple times
|
|
int local = nPage % m_Across ;
|
|
while (local-- >= 1)
|
|
{
|
|
pRect->OffsetRect(m_PageOffset.x, 0);
|
|
}
|
|
local = nPage / m_Across ;
|
|
while (local-- > 0)
|
|
{
|
|
pRect->OffsetRect(0, m_PageOffset.y);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// set up scroll size
|
|
SetScrollSizes(MM_TEXT, pRect->Size() +
|
|
CSize(PREVIEW_MARGIN * 2, PREVIEW_MARGIN * 2), windowSize);
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CXTPPreviewView
|
|
|
|
void CXTPPreviewView::OnUpdateNumPageChange(CCmdUI* /*pCmdUI*/)
|
|
{
|
|
// button has been removed from toolbar
|
|
//UINT nPages = m_nZoomState == XTP_ZOOM_WHOLEPAGE ? m_nPages : m_nZoomOutPages;
|
|
//pCmdUI->Enable(m_nZoomState == XTP_ZOOM_WHOLEPAGE && m_nMaxPages != 1 && (m_pPreviewInfo->GetMaxPage() > 1 || m_nPages > 1));
|
|
// CPreviewView::OnUpdateNumPageChange(pCmdUI);
|
|
}
|
|
|
|
void CXTPPreviewView::OnUpdateZoomIn(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->Enable(m_nZoomState < 500);
|
|
}
|
|
|
|
void CXTPPreviewView::OnUpdateZoomOut(CCmdUI* pCmdUI)
|
|
{
|
|
pCmdUI->Enable(m_nZoomState > 10);
|
|
}
|
|
|
|
void CXTPPreviewView::OnNumPageChange()
|
|
{
|
|
// doesn't do anything any more
|
|
// button has been removed from toolbar
|
|
}
|
|
|
|
void CXTPPreviewView::OnZoomIn()
|
|
{
|
|
ZoomIn(0, CPoint(0, 0));
|
|
}
|
|
|
|
void CXTPPreviewView::ZoomIn(UINT nPage, CPoint point)
|
|
{
|
|
if (m_nZoomState == XTP_ZOOM_WHOLEPAGE || m_nZoomState == XTP_ZOOM_PAGEWIDTH)
|
|
{
|
|
SetZoomState(100, nPage, point);
|
|
return;
|
|
}
|
|
|
|
for (int i = 0; i < _countof(nDefaultZooms); i++)
|
|
{
|
|
if (m_nZoomState < nDefaultZooms[i])
|
|
{
|
|
SetZoomState(nDefaultZooms[i], nPage, point);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
void CXTPPreviewView::OnZoomOut()
|
|
{
|
|
for (int i = _countof(nDefaultZooms) - 1; i >= 0; i--)
|
|
{
|
|
if (m_nZoomState > nDefaultZooms[i])
|
|
{
|
|
SetZoomState(nDefaultZooms[i], 0, CPoint(0, 0));
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
CSize CXTPPreviewView::CalcPageDisplaySize()
|
|
// calculate the current page size
|
|
// MFC used to set 'm_nSecondPageOffset' to start of second page
|
|
// as we have multiple pages we use m_PageOffset which holds the
|
|
// differences across and down the pages
|
|
// return size of current page less margins
|
|
{
|
|
// just checking...
|
|
ASSERT(m_Down >= 1) ;
|
|
ASSERT(m_Across >= 1) ;
|
|
ASSERT(m_nPages >= 1) ;
|
|
|
|
CSize windowSize, scrollSize;
|
|
GetTrueClientSize(windowSize, scrollSize);
|
|
|
|
// subtract out vertical scrollbar if zoomed out and page range is known
|
|
// and there is more than one page.
|
|
if (m_nZoomState == XTP_ZOOM_WHOLEPAGE && (m_pPreviewInfo->GetMaxPage() != 0xffff) && (m_pPreviewInfo->GetMaxPage() - m_pPreviewInfo->GetMinPage() != 0))
|
|
windowSize.cx -= scrollSize.cx;
|
|
m_PageOffset.y = 0 ;
|
|
if (m_Down > 1)
|
|
{
|
|
// we need to make room for more pages under the first
|
|
windowSize.cy = (windowSize.cy - (PREVIEW_MARGIN * (m_Down - 1))) / m_Down ;
|
|
m_PageOffset.y = windowSize.cy + PREVIEW_MARGIN ;
|
|
}
|
|
else
|
|
{
|
|
// its a single page down, it uses all the area previously calculated
|
|
}
|
|
|
|
if (m_Across <= 2)
|
|
m_PageOffset.x = (windowSize.cx - PREVIEW_MARGIN) / 2;
|
|
else
|
|
m_PageOffset.x = (windowSize.cx - PREVIEW_MARGIN) / m_Across ;
|
|
|
|
// make sure all pages across fit in the screen area
|
|
windowSize.cx = (windowSize.cx - ((m_Across + 1) * PREVIEW_MARGIN)) / m_Across ;
|
|
//windowSize.cx = (m_nPages == 2) ? (windowSize.cx - 3*PREVIEW_MARGIN) / 2 :
|
|
// windowSize.cx - 2*PREVIEW_MARGIN;
|
|
|
|
windowSize.cy -= 2*PREVIEW_MARGIN;
|
|
return windowSize;
|
|
}
|
|
|
|
void CXTPPreviewView::SetupScrollbar()
|
|
{
|
|
// this procedure makes sure that the scroll bar does not allow us to scroll the window
|
|
// such that we end up displaying blank pages
|
|
// correctly range the scroll bars
|
|
if (m_pPreviewInfo->GetMaxPage() < 0x8000 && m_pPreviewInfo->GetMaxPage() - m_pPreviewInfo->GetMinPage() <= 32767U)
|
|
{
|
|
SCROLLINFO info;
|
|
info.fMask = SIF_PAGE|SIF_RANGE;
|
|
info.nMin = m_pPreviewInfo->GetMinPage();
|
|
info.nMax = m_pPreviewInfo->GetMaxPage() - (m_nPages - 1) ;
|
|
info.nPage = 1;
|
|
if (!SetScrollInfo(SB_VERT, &info, FALSE))
|
|
SetScrollRange(SB_VERT, info.nMin, info.nMax, FALSE);
|
|
}
|
|
else
|
|
ShowScrollBar(SB_VERT, FALSE); // if no range specified, or too
|
|
}
|
|
|
|
void CXTPPreviewView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
|
|
{
|
|
if (m_nZoomState != XTP_ZOOM_WHOLEPAGE)
|
|
{
|
|
CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
|
|
return;
|
|
}
|
|
SetupScrollbar() ;
|
|
switch (nSBCode)
|
|
{
|
|
case SB_BOTTOM:
|
|
SetCurrentPage(m_pPreviewInfo->GetMaxPage(), TRUE);
|
|
break;
|
|
|
|
case SB_TOP:
|
|
SetCurrentPage(m_pPreviewInfo->GetMinPage(), TRUE);
|
|
break;
|
|
|
|
case SB_PAGEDOWN:
|
|
SetCurrentPage(m_nCurrentPage +
|
|
(m_pPreviewInfo->GetMaxPage() - m_pPreviewInfo->GetMinPage() + 9) / 10, TRUE);
|
|
break;
|
|
|
|
case SB_PAGEUP:
|
|
SetCurrentPage(m_nCurrentPage -
|
|
(m_pPreviewInfo->GetMaxPage() - m_pPreviewInfo->GetMinPage() + 9) / 10, TRUE);
|
|
break;
|
|
|
|
case SB_LINEDOWN:
|
|
if (m_nCurrentPage <= m_pPreviewInfo->GetMaxPage() - m_nPages)
|
|
SetCurrentPage(m_nCurrentPage + 1, TRUE);
|
|
break;
|
|
|
|
case SB_LINEUP:
|
|
if (m_nCurrentPage > 0)
|
|
SetCurrentPage(m_nCurrentPage - 1, TRUE);
|
|
break;
|
|
|
|
case SB_THUMBPOSITION:
|
|
SetCurrentPage(nPos, TRUE);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void CXTPPreviewView::OnGotoPageSetFocus(NMHDR* pNMHDR, LRESULT* /*pRes*/)
|
|
{
|
|
NMXTPCONTROL* tagNMCONTROL = (NMXTPCONTROL*)pNMHDR;
|
|
if (!tagNMCONTROL->pControl->GetEnabled())
|
|
return;
|
|
|
|
((CXTPControlEdit*)tagNMCONTROL->pControl)->SetEditText(_T(""));
|
|
|
|
}
|
|
|
|
void CXTPPreviewView::OnGotoPageKillFocus(NMHDR* pNMHDR, LRESULT* /*pRes*/)
|
|
{
|
|
NMXTPCONTROL* tagNMCONTROL = (NMXTPCONTROL*)pNMHDR;
|
|
|
|
if (!tagNMCONTROL->pControl->GetEnabled())
|
|
return;
|
|
|
|
CString strText = ((CXTPControlEdit*)tagNMCONTROL->pControl)->GetEditText();
|
|
if (strText.IsEmpty())
|
|
return;
|
|
|
|
UINT nCurrentPage = _ttoi(strText);
|
|
if (nCurrentPage > m_pPreviewInfo->GetMaxPage())
|
|
nCurrentPage = m_pPreviewInfo->GetMaxPage();
|
|
if (nCurrentPage < m_pPreviewInfo->GetMinPage())
|
|
nCurrentPage = m_pPreviewInfo->GetMinPage();
|
|
|
|
if (nCurrentPage != m_nCurrentPage)
|
|
SetCurrentPage(nCurrentPage, TRUE);
|
|
}
|
|
|
|
void CXTPPreviewView::OnUpdateGotoPage(CCmdUI* pCmdUI)
|
|
{
|
|
CXTPControlEdit* pControl = DYNAMIC_DOWNCAST(CXTPControlEdit, CXTPControl::FromUI(pCmdUI));
|
|
if (!pControl)
|
|
return;
|
|
|
|
if (!pControl->HasFocus())
|
|
{
|
|
CString strText, strFormat;
|
|
if (m_pPreviewInfo->GetMaxPage() == 0xffff)
|
|
{
|
|
XTPResourceManager()->LoadString(&strFormat, XTP_IDS_PREVIEW_PAGEI);
|
|
strText.Format(strFormat, m_nCurrentPage);
|
|
}
|
|
else
|
|
{
|
|
XTPResourceManager()->LoadString(&strFormat, XTP_IDS_PREVIEW_PAGEIOFI);
|
|
strText.Format(strFormat, m_nCurrentPage, m_pPreviewInfo->GetMaxPage());
|
|
}
|
|
|
|
pControl->SetEditText(strText);
|
|
}
|
|
|
|
pCmdUI->Enable((m_nCurrentPage + m_nPages - 1 < m_pPreviewInfo->GetMaxPage()) || (m_nCurrentPage > m_pPreviewInfo->GetMinPage()));
|
|
}
|
|
|
|
void CXTPPreviewView::OnZoomCombo(NMHDR* pNMHDR, LRESULT* pRes)
|
|
{
|
|
CXTPControlComboBox* pControl = DYNAMIC_DOWNCAST(CXTPControlComboBox, ((NMXTPCONTROL*)pNMHDR)->pControl);
|
|
if (!pControl)
|
|
return;
|
|
|
|
int nCurSel = pControl->GetCurSel();
|
|
|
|
if (nCurSel != -1)
|
|
{
|
|
if (nCurSel == XTP_ZOOM_WHOLEPAGE || nCurSel == XTP_ZOOM_PAGEWIDTH)
|
|
{
|
|
SetZoomState(nCurSel, 0, CPoint(0, 0));
|
|
}
|
|
else if (nCurSel > 1)
|
|
{
|
|
SetZoomState((UINT)pControl->GetItemData(nCurSel), 0, CPoint(0, 0));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
int nZoom = _ttoi(pControl->GetEditText());
|
|
if (nZoom > 0 && nZoom < 3000)
|
|
{
|
|
SetZoomState(nZoom, 0, CPoint(0, 0));
|
|
|
|
CString strZoom;
|
|
strZoom.Format(_T("%i%%"), m_nZoomState);
|
|
pControl->SetEditText(strZoom);
|
|
}
|
|
}
|
|
|
|
|
|
*pRes = TRUE;
|
|
}
|
|
|
|
|
|
void CXTPPreviewView::OnOnePage()
|
|
{
|
|
m_Across = 1;
|
|
m_Down = 1;
|
|
m_nPages = 1;
|
|
|
|
AfxGetApp()->m_nNumPreviewPages = m_nPages;
|
|
m_nZoomOutPages = m_nPages;
|
|
m_nMaxPages = 1;
|
|
|
|
SetZoomState(XTP_ZOOM_WHOLEPAGE, 0, CPoint(0, 0));
|
|
if (m_nZoomState == XTP_ZOOM_WHOLEPAGE)
|
|
{
|
|
// make sure the current page does not cause blank pages to be shown
|
|
if (m_nCurrentPage > m_pPreviewInfo->GetMaxPage() - m_nPages + 1)
|
|
m_nCurrentPage = m_pPreviewInfo->GetMaxPage() - m_nPages + 1;
|
|
if (m_nCurrentPage < 0)
|
|
m_nCurrentPage = 0 ;
|
|
}
|
|
// Just do this to set the status correctly and invalidate
|
|
SetCurrentPage(m_nCurrentPage, TRUE);
|
|
SetupScrollbar() ;
|
|
}
|
|
|
|
void CXTPPreviewView::OnTwoPage(NMHDR* pNMHDR, LRESULT* pRes)
|
|
{
|
|
CXTPControlSelector* pControl = DYNAMIC_DOWNCAST(CXTPControlSelector, ((NMXTPCONTROL*)pNMHDR)->pControl);
|
|
if (!pControl)
|
|
return;
|
|
|
|
m_Across = pControl->m_szResult.cx;
|
|
m_Down = pControl->m_szResult.cy;
|
|
m_nPages = m_Across * m_Down;
|
|
|
|
AfxGetApp()->m_nNumPreviewPages = m_nPages;
|
|
m_nZoomOutPages = m_nPages;
|
|
m_nMaxPages = m_nPages ;
|
|
SetZoomState(XTP_ZOOM_WHOLEPAGE, 0, CPoint(0, 0));
|
|
if (m_nZoomState == XTP_ZOOM_WHOLEPAGE)
|
|
{
|
|
// make sure the current page does not cause blank pages to be shown
|
|
if (m_nCurrentPage >= m_pPreviewInfo->GetMaxPage() - m_nPages)
|
|
m_nCurrentPage = m_pPreviewInfo->GetMaxPage() - m_nPages + 1;
|
|
if (m_nCurrentPage < 0)
|
|
m_nCurrentPage = 0 ;
|
|
}
|
|
// Just do this to set the status correctly and invalidate
|
|
SetCurrentPage(m_nCurrentPage, TRUE);
|
|
SetupScrollbar() ;
|
|
|
|
*pRes = TRUE;
|
|
}
|
|
|
|
void CXTPPreviewView::OnSize(UINT nType, int cx, int cy)
|
|
{
|
|
// CScrollView handles everything if zoomed in.
|
|
if (m_nZoomState == XTP_ZOOM_WHOLEPAGE)
|
|
{
|
|
// Force recalc of scale ratios on next draw
|
|
for (UINT i = 0; i < m_nMaxPages; i++)
|
|
m_pPageInfo[i].sizeScaleRatio.cx = 0; // zero scale ratios
|
|
|
|
CView::OnSize(nType, cx, cy); // No scroll functionality
|
|
}
|
|
else
|
|
{
|
|
// adjust scroll size to size of page
|
|
m_pageDev.cx = cx;
|
|
m_pageDev.cy = cy;
|
|
m_lineDev.cx = cx / 10;
|
|
m_lineDev.cy = cy / 10;
|
|
|
|
if (m_nZoomState == XTP_ZOOM_PAGEWIDTH)
|
|
{
|
|
// Force recalc of scale ratios on next draw
|
|
for (UINT i = 0; i < m_nMaxPages; i++)
|
|
m_pPageInfo[i].sizeScaleRatio.cx = 0; // zero scale ratios
|
|
CView::OnSize(nType, cx, cy); // No scroll functionality
|
|
}
|
|
else
|
|
{
|
|
CScrollView::OnSize(nType, cx, cy);
|
|
}
|
|
}
|
|
}
|