1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 #include "vbainformationhelper.hxx"
28 #include <com/sun/star/text/XPageCursor.hpp>
29 #include <com/sun/star/beans/XPropertySet.hpp>
30 #include "wordvbahelper.hxx"
31 #include <docsh.hxx>
32 #include <doc.hxx>
33 #include <vbahelper/vbahelper.hxx>
34 #include <swtypes.hxx>
35 #include <viewsh.hxx>
36 
37 using namespace ::ooo::vba;
38 using namespace ::com::sun::star;
39 
40 static const sal_Int32 DEFAULT_PAGE_DISTANCE = 500;
41 
42 sal_Int32 SwVbaInformationHelper::handleWdActiveEndPageNumber( const css::uno::Reference< css::text::XTextViewCursor >& xTVCursor ) throw( css::uno::RuntimeException )
43 {
44     uno::Reference< text::XPageCursor > xPageCursor( xTVCursor, uno::UNO_QUERY_THROW );
45     return xPageCursor->getPage();
46 }
47 
48 sal_Int32 SwVbaInformationHelper::handleWdNumberOfPagesInDocument( const css::uno::Reference< css::frame::XModel >& xModel ) throw( css::uno::RuntimeException )
49 {
50     return word::getPageCount( xModel );
51 }
52 
53 double SwVbaInformationHelper::handleWdVerticalPositionRelativeToPage( const css::uno::Reference< css::frame::XModel >& xModel, const css::uno::Reference< css::text::XTextViewCursor >& xTVCursor ) throw( css::uno::RuntimeException )
54 {
55     xTVCursor->collapseToStart();
56     uno::Reference< beans::XPropertySet > xStyleProps( word::getCurrentPageStyle( xModel ), uno::UNO_QUERY_THROW );
57     sal_Int32 nTopMargin = 0;
58     xStyleProps->getPropertyValue( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("TopMargin") ) ) >>= nTopMargin;
59     sal_Int32 nCurrentPos = xTVCursor->getPosition().Y;
60 
61     sal_Int32 nCurrentPage = handleWdActiveEndPageNumber( xTVCursor );
62     SwDoc* pDoc = word::getDocShell( xModel )->GetDoc();
63     ViewShell* pViewSh = pDoc->GetCurrentViewShell();
64     sal_Int32 nPageHeight = pViewSh ? pViewSh->GetPageSize( nCurrentPage, sal_False ).Height() : 0;
65     // FIXME: handle multipul page style
66     // it is very strange that the curros position is incorrect when open Word file.
67     // e.g. if current cursor in the top left of the text body of the first page without header,
68     // the top value of current position should be 0, but is 201 when open a Word file.
69     nCurrentPos = nCurrentPos + nTopMargin - ( DEFAULT_PAGE_DISTANCE + TWIP_TO_MM100( nPageHeight ) ) * (  nCurrentPage - 1  );
70     return Millimeter::getInPoints( nCurrentPos );
71 }
72