Files
loongoffice/sfx2/source/doc/new.cxx
Norbert Thiebaud d92aa2f445 remove SFX_APP() macro that was a mer wrapper for SfxGetApp()
Change-Id: I480a789c767dd671775c9d70d96bf71908f21f5b
2014-06-27 17:08:04 +02:00

481 lines
14 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#include <comphelper/string.hxx>
#include <sfx2/new.hxx>
#include <vcl/builder.hxx>
#include <vcl/layout.hxx>
#include <vcl/msgbox.hxx>
#include <svtools/svmedit.hxx>
#include <svl/itemset.hxx>
#include <svl/eitem.hxx>
#include <svtools/sfxecode.hxx>
#include <svtools/ehdl.hxx>
#include <tools/urlobj.hxx>
#include <unotools/localfilehelper.hxx>
#include "doc.hrc"
#include <sfx2/app.hxx>
#include <sfx2/objsh.hxx>
#include <sfx2/sfxresid.hxx>
#include <sfx2/docfile.hxx>
#include "preview.hxx"
#include <sfx2/printer.hxx>
#include <vcl/waitobj.hxx>
void SfxPreviewBase_Impl::SetObjectShell( SfxObjectShell* pObj )
{
::boost::shared_ptr<GDIMetaFile> pFile = pObj
? pObj->GetPreviewMetaFile()
: ::boost::shared_ptr<GDIMetaFile>();
pMetaFile = pFile;
Invalidate();
}
SfxPreviewBase_Impl::SfxPreviewBase_Impl(
Window* pParent, WinBits nStyle)
: Window(pParent, nStyle)
, pMetaFile()
{
}
void SfxPreviewBase_Impl::Resize()
{
Invalidate();
}
Size SfxPreviewBase_Impl::GetOptimalSize() const
{
return LogicToPixel(Size(127, 129), MAP_APPFONT);
}
void SfxPreviewWin_Impl::ImpPaint(
const Rectangle&, GDIMetaFile* pFile, Window* pWindow )
{
pWindow->SetLineColor();
Color aLightGrayCol( COL_LIGHTGRAY );
pWindow->SetFillColor( aLightGrayCol );
pWindow->DrawRect( Rectangle( Point( 0,0 ), pWindow->GetOutputSize() ) );
Size aTmpSize = pFile ? pFile->GetPrefSize() : Size(1,1 );
DBG_ASSERT( aTmpSize.Height()*aTmpSize.Width(),
"size of first page is 0, overload GetFirstPageSize or set vis-area!" );
#define FRAME 4
long nWidth = pWindow->GetOutputSize().Width() - 2*FRAME;
long nHeight = pWindow->GetOutputSize().Height() - 2*FRAME;
if (nWidth <= 0 || nHeight <= 0)
return;
double dRatio=((double)aTmpSize.Width())/aTmpSize.Height();
double dRatioPreV=((double) nWidth ) / nHeight;
Size aSize;
Point aPoint;
if (dRatio>dRatioPreV)
{
aSize=Size(nWidth, (sal_uInt16)(nWidth/dRatio));
aPoint=Point( 0, (sal_uInt16)((nHeight-aSize.Height())/2));
}
else
{
aSize=Size((sal_uInt16)(nHeight*dRatio), nHeight);
aPoint=Point((sal_uInt16)((nWidth-aSize.Width())/2),0);
}
Point bPoint=Point(nWidth,nHeight)-aPoint;
if ( pFile )
{
Color aBlackCol( COL_BLACK );
Color aWhiteCol( COL_WHITE );
pWindow->SetLineColor( aBlackCol );
pWindow->SetFillColor( aWhiteCol );
pWindow->DrawRect( Rectangle( aPoint + Point( FRAME, FRAME ), bPoint + Point( FRAME, FRAME ) ) );
pFile->WindStart();
pFile->Play( pWindow, aPoint + Point( FRAME, FRAME ), aSize );
}
}
void SfxPreviewWin_Impl::Paint( const Rectangle& rRect )
{
ImpPaint( rRect, pMetaFile.get(), this );
}
extern "C" SAL_DLLPUBLIC_EXPORT Window* SAL_CALL makeSfxPreviewWin(Window *pParent, VclBuilder::stringmap &)
{
return new SfxPreviewWin_Impl(pParent, 0);
}
class SfxNewFileDialog_Impl
{
ListBox* m_pRegionLb;
ListBox* m_pTemplateLb;
SfxPreviewWin_Impl* m_pPreviewWin;
CheckBox* m_pTextStyleCB;
CheckBox* m_pFrameStyleCB;
CheckBox* m_pPageStyleCB;
CheckBox* m_pNumStyleCB;
CheckBox* m_pMergeStyleCB;
PushButton* m_pLoadFilePB;
VclExpander* m_pMoreBt;
Timer aPrevTimer;
OUString aNone;
OUString sLoadTemplate;
sal_uInt16 nFlags;
SfxDocumentTemplates aTemplates;
SfxObjectShellLock xDocShell;
SfxNewFileDialog* pAntiImpl;
DECL_LINK( Update, void * );
DECL_LINK( RegionSelect, ListBox * );
DECL_LINK(TemplateSelect, void *);
DECL_LINK( DoubleClick, ListBox * );
DECL_LINK( Expand, void * );
DECL_LINK(LoadFile, void *);
sal_uInt16 GetSelectedTemplatePos() const;
public:
SfxNewFileDialog_Impl( SfxNewFileDialog* pAntiImplP, sal_uInt16 nFlags );
~SfxNewFileDialog_Impl();
// Returns sal_False if '- No -' is set as a template
// Template name can only be obtained if IsTemplate() is TRUE
// erfragt werden
bool IsTemplate() const;
OUString GetTemplateFileName() const;
sal_uInt16 GetTemplateFlags()const;
void SetTemplateFlags(sal_uInt16 nSet);
};
IMPL_LINK_NOARG(SfxNewFileDialog_Impl, Update)
{
if ( xDocShell.Is() )
{
if ( xDocShell->GetProgress() )
return sal_False;
xDocShell.Clear();
}
const sal_uInt16 nEntry = GetSelectedTemplatePos();
if(!nEntry)
{
m_pPreviewWin->Invalidate();
m_pPreviewWin->SetObjectShell( 0);
return 0;
}
if ( m_pMoreBt->get_expanded() && (nFlags & SFXWB_PREVIEW) == SFXWB_PREVIEW)
{
OUString aFileName = aTemplates.GetPath( m_pRegionLb->GetSelectEntryPos(), nEntry-1);
INetURLObject aTestObj( aFileName );
if( aTestObj.GetProtocol() == INET_PROT_NOT_VALID )
{
// temp. fix until Templates are managed by UCB compatible service
// does NOT work with locally cached components !
OUString aTemp;
utl::LocalFileHelper::ConvertPhysicalNameToURL( aFileName, aTemp );
aFileName = aTemp;
}
INetURLObject aObj( aFileName );
for ( SfxObjectShell* pTmp = SfxObjectShell::GetFirst();
pTmp;
pTmp = SfxObjectShell::GetNext(*pTmp) )
{
//! fsys bug op==
if ( pTmp->GetMedium())
// ??? HasName() MM
if( INetURLObject( pTmp->GetMedium()->GetName() ) == aObj )
{
xDocShell = pTmp;
break;
}
}
if ( !xDocShell.Is() )
{
Window *pParent = Application::GetDefDialogParent();
Application::SetDefDialogParent( pAntiImpl );
SfxErrorContext eEC(ERRCTX_SFX_LOADTEMPLATE,pAntiImpl);
SfxApplication *pSfxApp = SfxGetpApp();
sal_uIntPtr lErr;
SfxItemSet* pSet = new SfxAllItemSet( pSfxApp->GetPool() );
pSet->Put( SfxBoolItem( SID_TEMPLATE, true ) );
pSet->Put( SfxBoolItem( SID_PREVIEW, true ) );
lErr = pSfxApp->LoadTemplate( xDocShell, aFileName, true, pSet );
if( lErr )
ErrorHandler::HandleError(lErr);
Application::SetDefDialogParent( pParent );
if ( !xDocShell.Is() )
{
m_pPreviewWin->SetObjectShell( 0 );
return sal_False;
}
}
m_pPreviewWin->SetObjectShell( xDocShell );
}
return sal_True;
}
IMPL_LINK( SfxNewFileDialog_Impl, RegionSelect, ListBox *, pBox )
{
if ( xDocShell.Is() && xDocShell->GetProgress() )
return 0;
const sal_uInt16 nRegion = pBox->GetSelectEntryPos();
const sal_uInt16 nCount = aTemplates.GetRegionCount()? aTemplates.GetCount(nRegion): 0;
m_pTemplateLb->SetUpdateMode(false);
m_pTemplateLb->Clear();
OUString aSel = m_pRegionLb->GetSelectEntry();
sal_Int32 nc = aSel.indexOf('(');
if (nc != -1 && nc != 0)
aSel = aSel.replaceAt(nc-1, 1, "");
if ( aSel.compareToIgnoreAsciiCase( SfxResId(STR_STANDARD).toString() ) == 0 )
m_pTemplateLb->InsertEntry(aNone);
for (sal_uInt16 i = 0; i < nCount; ++i)
m_pTemplateLb->InsertEntry(aTemplates.GetName(nRegion, i));
m_pTemplateLb->SelectEntryPos(0);
m_pTemplateLb->SetUpdateMode(true);
m_pTemplateLb->Invalidate();
m_pTemplateLb->Update();
TemplateSelect(m_pTemplateLb);
return 0;
}
IMPL_LINK_NOARG_INLINE_START(SfxNewFileDialog_Impl, Expand)
{
TemplateSelect(m_pTemplateLb);
return 0;
}
IMPL_LINK_NOARG_INLINE_END(SfxNewFileDialog_Impl, Expand)
IMPL_LINK_NOARG(SfxNewFileDialog_Impl, TemplateSelect)
{
// Still loading
if ( xDocShell && xDocShell->GetProgress() )
return 0;
if (!m_pMoreBt->get_expanded())
// Dialog is not opened
return 0;
aPrevTimer.Start();
return 0;
}
IMPL_LINK_INLINE_START( SfxNewFileDialog_Impl, DoubleClick, ListBox *, pListBox )
{
(void)pListBox;
// Still loadning
if ( !xDocShell.Is() || !xDocShell->GetProgress() )
pAntiImpl->EndDialog(RET_OK);
return 0;
}
IMPL_LINK_INLINE_END( SfxNewFileDialog_Impl, DoubleClick, ListBox *, pListBox )
IMPL_LINK_NOARG_INLINE_START(SfxNewFileDialog_Impl, LoadFile)
{
pAntiImpl->EndDialog(RET_TEMPLATE_LOAD);
return 0;
}
IMPL_LINK_NOARG_INLINE_END(SfxNewFileDialog_Impl, LoadFile)
sal_uInt16 SfxNewFileDialog_Impl::GetSelectedTemplatePos() const
{
sal_uInt16 nEntry = m_pTemplateLb->GetSelectEntryPos();
OUString aSel = m_pRegionLb->GetSelectEntry();
sal_Int32 nc = aSel.indexOf('(');
if (nc != -1 && nc != 0)
aSel = aSel.replaceAt(nc-1, 1, "");
if ( aSel.compareToIgnoreAsciiCase(SfxResId(STR_STANDARD).toString()) != 0 )
nEntry++;
if (!m_pTemplateLb->GetSelectEntryCount())
nEntry = 0;
return nEntry;
}
bool SfxNewFileDialog_Impl::IsTemplate() const
{
return GetSelectedTemplatePos()!=0;
}
OUString SfxNewFileDialog_Impl::GetTemplateFileName() const
{
if(!IsTemplate() || !aTemplates.GetRegionCount())
return OUString();
return aTemplates.GetPath(m_pRegionLb->GetSelectEntryPos(),
GetSelectedTemplatePos()-1);
}
sal_uInt16 SfxNewFileDialog_Impl::GetTemplateFlags()const
{
sal_uInt16 nRet = m_pTextStyleCB->IsChecked() ? SFX_LOAD_TEXT_STYLES : 0;
if(m_pFrameStyleCB->IsChecked())
nRet |= SFX_LOAD_FRAME_STYLES;
if(m_pPageStyleCB->IsChecked())
nRet |= SFX_LOAD_PAGE_STYLES;
if(m_pNumStyleCB->IsChecked())
nRet |= SFX_LOAD_NUM_STYLES;
if(m_pMergeStyleCB->IsChecked())
nRet |= SFX_MERGE_STYLES;
return nRet;
}
void SfxNewFileDialog_Impl::SetTemplateFlags(sal_uInt16 nSet)
{
m_pTextStyleCB->Check( 0 != (nSet&SFX_LOAD_TEXT_STYLES ));
m_pFrameStyleCB->Check( 0 != (nSet&SFX_LOAD_FRAME_STYLES));
m_pPageStyleCB->Check( 0 != (nSet&SFX_LOAD_PAGE_STYLES ));
m_pNumStyleCB->Check( 0 != (nSet&SFX_LOAD_NUM_STYLES ));
m_pMergeStyleCB->Check( 0 != (nSet&SFX_MERGE_STYLES ));
}
SfxNewFileDialog_Impl::SfxNewFileDialog_Impl(
SfxNewFileDialog* pAntiImplP, sal_uInt16 nFl)
: aNone(SfxResId(STR_NONE).toString())
, nFlags(nFl)
, pAntiImpl(pAntiImplP)
{
pAntiImplP->get(m_pRegionLb, "categories");
pAntiImplP->get(m_pTemplateLb, "templates");
Size aSize(m_pRegionLb->LogicToPixel(Size(127, 72), MAP_APPFONT));
m_pRegionLb->set_width_request(aSize.Width());
m_pRegionLb->set_height_request(aSize.Height());
m_pTemplateLb->set_width_request(aSize.Width());
m_pTemplateLb->set_height_request(aSize.Height());
pAntiImplP->get(m_pTextStyleCB, "text");
pAntiImplP->get(m_pFrameStyleCB, "frame");
pAntiImplP->get(m_pPageStyleCB, "pages");
pAntiImplP->get(m_pNumStyleCB, "numbering");
pAntiImplP->get(m_pMergeStyleCB, "overwrite");
pAntiImplP->get(m_pMoreBt, "expander");
pAntiImplP->get(m_pPreviewWin, "image");
pAntiImplP->get(m_pLoadFilePB, "fromfile");
sLoadTemplate = pAntiImplP->get<FixedText>("alttitle")->GetText();
if (!nFlags)
m_pMoreBt->Hide();
else if(SFXWB_LOAD_TEMPLATE == nFlags)
{
m_pLoadFilePB->SetClickHdl(LINK(this, SfxNewFileDialog_Impl, LoadFile));
m_pLoadFilePB->Show();
m_pTextStyleCB->Show();
m_pFrameStyleCB->Show();
m_pPageStyleCB->Show();
m_pNumStyleCB->Show();
m_pMergeStyleCB->Show();
m_pMoreBt->Hide();
m_pTextStyleCB->Check();
pAntiImplP->SetText(sLoadTemplate);
}
else
{
m_pMoreBt->SetExpandedHdl(LINK(this, SfxNewFileDialog_Impl, Expand));
m_pPreviewWin->Show();
}
OUString &rExtra = pAntiImplP->GetExtraData();
bool bExpand = !rExtra.isEmpty() && rExtra[0] == 'Y';
m_pMoreBt->set_expanded(bExpand && nFlags);
m_pTemplateLb->SetSelectHdl(LINK(this, SfxNewFileDialog_Impl, TemplateSelect));
m_pTemplateLb->SetDoubleClickHdl(LINK(this, SfxNewFileDialog_Impl, DoubleClick));
// update the template configuration if necessary
{
WaitObject aWaitCursor( pAntiImplP->GetParent() );
aTemplates.Update( true /* be smart */ );
}
// fill the list boxes
const sal_uInt16 nCount = aTemplates.GetRegionCount();
if (nCount)
{
for(sal_uInt16 i = 0; i < nCount; ++i)
m_pRegionLb->InsertEntry(aTemplates.GetFullRegionName(i));
m_pRegionLb->SetSelectHdl(LINK(this, SfxNewFileDialog_Impl, RegionSelect));
}
aPrevTimer.SetTimeout( 500 );
aPrevTimer.SetTimeoutHdl( LINK( this, SfxNewFileDialog_Impl, Update));
m_pRegionLb->SelectEntryPos(0);
RegionSelect(m_pRegionLb);
}
SfxNewFileDialog_Impl::~SfxNewFileDialog_Impl()
{
OUString &rExtra = pAntiImpl->GetExtraData();
rExtra = m_pMoreBt->get_expanded() ? OUString("Y") : OUString("N");
}
SfxNewFileDialog::SfxNewFileDialog(Window *pParent, sal_uInt16 nFlags)
: SfxModalDialog(pParent, "LoadTemplateDialog",
"sfx/ui/loadtemplatedialog.ui")
{
pImpl = new SfxNewFileDialog_Impl(this, nFlags);
}
SfxNewFileDialog::~SfxNewFileDialog()
{
delete pImpl;
}
bool SfxNewFileDialog::IsTemplate() const
{
return pImpl->IsTemplate();
}
OUString SfxNewFileDialog::GetTemplateFileName() const
{
return pImpl->GetTemplateFileName();
}
sal_uInt16 SfxNewFileDialog::GetTemplateFlags()const
{
return pImpl->GetTemplateFlags();
}
void SfxNewFileDialog::SetTemplateFlags(sal_uInt16 nSet)
{
pImpl->SetTemplateFlags(nSet);
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */