blob: 66086048b6723c2fe0c71c95ed4d058415e4b705 [file] [log] [blame]
/**************************************************************
*
* 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
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"
#ifdef SW_DLLIMPLEMENTATION
#undef SW_DLLIMPLEMENTATION
#endif
#ifndef _CMDID_H
#include <cmdid.h>
#endif
#include <swtypes.hxx>
#include <unotools/confignode.hxx>
#include <comphelper/processfactory.hxx>
#include <sfx2/basedlgs.hxx>
#include <sfx2/dispatch.hxx>
#include <vcl/msgbox.hxx>
#include <svx/htmlmode.hxx>
#include <viewopt.hxx>
#include <docsh.hxx>
#include <fldwrap.hxx>
#include <flddb.hxx>
#include <flddinf.hxx>
#include <fldvar.hxx>
#include <flddok.hxx>
#include <fldfunc.hxx>
#include <fldref.hxx>
#include <wrtsh.hxx>
#include <view.hxx>
#include <fldtdlg.hxx>
#include <swmodule.hxx>
#include <helpid.h>
#include <fldui.hrc>
#include <globals.hrc>
#include <fldtdlg.hrc>
#include <com/sun/star/document/XDocumentProperties.hpp>
#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
/*--------------------------------------------------------------------
Beschreibung: Der Traeger des Dialoges
--------------------------------------------------------------------*/
SwFldDlg::SwFldDlg(SfxBindings* pB, SwChildWinWrapper* pCW, Window *pParent)
: SfxTabDialog( pParent, SW_RES( DLG_FLD_INSERT )),
m_pChildWin(pCW),
m_pBindings(pB),
m_bDataBaseMode(sal_False)
{
SetStyle(GetStyle()|WB_STDMODELESS);
m_bHtmlMode = (::GetHtmlMode((SwDocShell*)SfxObjectShell::Current()) & HTMLMODE_ON) != 0;
RemoveResetButton();
GetOKButton().SetText(String(SW_RES(STR_FLD_INSERT)));
GetOKButton().SetHelpId(HID_FIELD_INSERT);
GetOKButton().SetHelpText(aEmptyStr); // Damit generierter Hilfetext verwendet wird
GetCancelButton().SetText(String(SW_RES(STR_FLD_CLOSE)));
GetCancelButton().SetHelpId(HID_FIELD_CLOSE);
GetCancelButton().SetHelpText(aEmptyStr); // Damit generierter Hilfetext verwendet wird
FreeResource();
GetOKButton().SetClickHdl(LINK(this, SwFldDlg, OKHdl));
AddTabPage(TP_FLD_DOK, SwFldDokPage::Create, 0);
AddTabPage(TP_FLD_VAR, SwFldVarPage::Create, 0);
AddTabPage(TP_FLD_DOKINF, SwFldDokInfPage::Create, 0);
if (!m_bHtmlMode)
{
AddTabPage(TP_FLD_REF, SwFldRefPage::Create, 0);
AddTabPage(TP_FLD_FUNC, SwFldFuncPage::Create, 0);
utl::OConfigurationTreeRoot aCfgRoot
= utl::OConfigurationTreeRoot::createWithServiceFactory(
::comphelper::getProcessServiceFactory(),
rtl::OUString(
RTL_CONSTASCII_USTRINGPARAM(
"/org.openoffice.Office.DataAccess/Policies/Features/Writer" ) ),
-1,
utl::OConfigurationTreeRoot::CM_READONLY);
sal_Bool bDatabaseFields = sal_True;
aCfgRoot.getNodeValue(
rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DatabaseFields"))) >>= bDatabaseFields;
if (bDatabaseFields)
AddTabPage(TP_FLD_DB, SwFldDBPage::Create, 0);
else
RemoveTabPage(TP_FLD_DB);
}
else
{
RemoveTabPage(TP_FLD_REF);
RemoveTabPage(TP_FLD_FUNC);
RemoveTabPage(TP_FLD_DB);
}
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
SwFldDlg::~SwFldDlg()
{
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
sal_Bool SwFldDlg::Close()
{
m_pBindings->GetDispatcher()->
Execute(m_bDataBaseMode ? FN_INSERT_FIELD_DATA_ONLY : FN_INSERT_FIELD,
SFX_CALLMODE_ASYNCHRON|SFX_CALLMODE_RECORD);
return sal_True;
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
void SwFldDlg::Initialize(SfxChildWinInfo *pInfo)
{
Point aPos;
Size aSize;
if ( pInfo->aSize.Width() != 0 && pInfo->aSize.Height() != 0 )
{
aPos = pInfo->aPos;
if ( GetStyle() & WB_SIZEABLE )
SetSizePixel( pInfo->aSize );
// Initiale Gr"o\se aus pInfo merken
aSize = GetSizePixel();
// Soll das FloatingWindow eingezoomt werden ?
if ( pInfo->nFlags & SFX_CHILDWIN_ZOOMIN )
RollUp();
}
else
{
// Initiale Gr"o\se aus Resource oder ctor merken
aSize = GetSizePixel();
Size aParentSize = GetParent()->GetOutputSizePixel();
aPos.X() += ( aParentSize.Width() - aSize.Width() ) / 2;
aPos.Y() += ( aParentSize.Height() - aSize.Height() ) / 2;
}
Point aPoint;
Rectangle aRect = GetDesktopRectPixel();
aPoint.X() = aRect.Right() - aSize.Width();
aPoint.Y() = aRect.Bottom() - aSize.Height();
aPoint = OutputToScreenPixel( aPoint );
if ( aPos.X() > aPoint.X() )
aPos.X() = aPoint.X() ;
if ( aPos.Y() > aPoint.Y() )
aPos.Y() = aPoint.Y();
if ( aPos.X() < 0 ) aPos.X() = 0;
if ( aPos.Y() < 0 ) aPos.Y() = 0;
SetPosPixel( aPos );
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
SfxItemSet* SwFldDlg::CreateInputItemSet( sal_uInt16 nID )
{
if ( nID == TP_FLD_DOKINF )
{
SwDocShell* pDocSh = (SwDocShell*)SfxObjectShell::Current();
SfxItemSet* pISet = new SfxItemSet( pDocSh->GetPool(), SID_DOCINFO, SID_DOCINFO );
using namespace ::com::sun::star;
uno::Reference<document::XDocumentPropertiesSupplier> xDPS(
pDocSh->GetModel(), uno::UNO_QUERY_THROW);
uno::Reference<document::XDocumentProperties> xDocProps
= xDPS->getDocumentProperties();
uno::Reference< beans::XPropertySet > xUDProps(
xDocProps->getUserDefinedProperties(),
uno::UNO_QUERY_THROW);
pISet->Put( SfxUnoAnyItem( SID_DOCINFO, uno::makeAny(xUDProps) ) );
return pISet;
}
else
return 0;
}
/*--------------------------------------------------------------------
Beschreibung: Einfuegen von neuen Feldern anstossen
--------------------------------------------------------------------*/
IMPL_LINK( SwFldDlg, OKHdl, Button *, EMPTYARG )
{
if (GetOKButton().IsEnabled())
{
SfxTabPage* pPage = GetTabPage(GetCurPageId());
pPage->FillItemSet(*(SfxItemSet*)0);
GetOKButton().GrabFocus(); // Wegen InputField-Dlg
}
return 0;
}
/*--------------------------------------------------------------------
Beschreibung: Nach Dok-Wechsel Dialog neu initialisieren
--------------------------------------------------------------------*/
void SwFldDlg::ReInitDlg()
{
SwDocShell* pDocSh = (SwDocShell*)SfxObjectShell::Current();
sal_Bool bNewMode = (::GetHtmlMode(pDocSh) & HTMLMODE_ON) != 0;
if (bNewMode != m_bHtmlMode)
{
SfxViewFrame::Current()->GetDispatcher()->
Execute(FN_INSERT_FIELD, SFX_CALLMODE_ASYNCHRON|SFX_CALLMODE_RECORD);
Close();
}
SwView* pActiveView = ::GetActiveView();
if(!pActiveView)
return;
const SwWrtShell& rSh = pActiveView->GetWrtShell();
GetOKButton().Enable( !rSh.IsReadOnlyAvailable() ||
!rSh.HasReadonlySel() );
ReInitTabPage(TP_FLD_DOK);
ReInitTabPage(TP_FLD_VAR);
ReInitTabPage(TP_FLD_DOKINF);
if (!m_bHtmlMode)
{
ReInitTabPage(TP_FLD_REF);
ReInitTabPage(TP_FLD_FUNC);
ReInitTabPage(TP_FLD_DB);
}
m_pChildWin->SetOldDocShell(pDocSh);
}
/*--------------------------------------------------------------------
Beschreibung: Nach Dok-Wechsel TabPage neu initialisieren
--------------------------------------------------------------------*/
void SwFldDlg::ReInitTabPage( sal_uInt16 nPageId, sal_Bool bOnlyActivate )
{
SwFldPage* pPage = (SwFldPage* )GetTabPage(nPageId);
if ( pPage )
pPage->EditNewField( bOnlyActivate ); // TabPage neu initialisieren
}
/*--------------------------------------------------------------------
Beschreibung: Nach Aktivierung einige TabPages neu initialisieren
--------------------------------------------------------------------*/
void SwFldDlg::Activate()
{
SwView* pView = ::GetActiveView();
if( pView )
{
sal_Bool bHtmlMode = (::GetHtmlMode((SwDocShell*)SfxObjectShell::Current()) & HTMLMODE_ON) != 0;
const SwWrtShell& rSh = pView->GetWrtShell();
GetOKButton().Enable( !rSh.IsReadOnlyAvailable() ||
!rSh.HasReadonlySel() );
ReInitTabPage( TP_FLD_VAR, sal_True );
if( !bHtmlMode )
{
ReInitTabPage( TP_FLD_REF, sal_True );
ReInitTabPage( TP_FLD_FUNC, sal_True );
}
}
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
void SwFldDlg::EnableInsert(sal_Bool bEnable)
{
if( bEnable )
{
SwView* pView = ::GetActiveView();
DBG_ASSERT(pView, "no view found");
if( !pView ||
(pView->GetWrtShell().IsReadOnlyAvailable() &&
pView->GetWrtShell().HasReadonlySel()) )
bEnable = sal_False;
}
GetOKButton().Enable(bEnable);
}
/*--------------------------------------------------------------------
Beschreibung:
--------------------------------------------------------------------*/
void SwFldDlg::InsertHdl()
{
GetOKButton().Click();
}
/* -----------------27.11.2002 15:24-----------------
*
* --------------------------------------------------*/
void SwFldDlg::ActivateDatabasePage()
{
m_bDataBaseMode = sal_True;
ShowPage( TP_FLD_DB );
SfxTabPage* pDBPage = GetTabPage( TP_FLD_DB );
if( pDBPage )
{
((SwFldDBPage*)pDBPage)->ActivateMailMergeAddress();
}
//remove all other pages
RemoveTabPage(TP_FLD_DOK);
RemoveTabPage(TP_FLD_VAR);
RemoveTabPage(TP_FLD_DOKINF);
RemoveTabPage(TP_FLD_REF);
RemoveTabPage(TP_FLD_FUNC);
}
/*-- 07.10.2003 14:01:44---------------------------------------------------
-----------------------------------------------------------------------*/
void SwFldDlg::PageCreated(sal_uInt16 nId, SfxTabPage& rPage)
{
if( TP_FLD_DB == nId)
{
SfxDispatcher* pDispatch = m_pBindings->GetDispatcher();
SfxViewFrame* pViewFrame = pDispatch ? pDispatch->GetFrame() : 0;
if(pViewFrame)
{
const TypeId aSwViewTypeId = TYPE(SwView);
SfxViewShell* pViewShell = SfxViewShell::GetFirst( &aSwViewTypeId );
while(pViewShell && pViewShell->GetViewFrame() != pViewFrame)
{
pViewShell = SfxViewShell::GetNext( *pViewShell, &aSwViewTypeId );
}
if(pViewShell)
static_cast<SwFldDBPage&>(rPage).SetWrtShell(static_cast<SwView*>(pViewShell)->GetWrtShell());
}
}
}