in main/writerfilter/source/dmapper/DomainMapper_Impl.cxx [3142:3566]
void DomainMapper_Impl::CloseFieldCommand()
{
#ifdef DEBUG_DOMAINMAPPER
dmapper_logger->element("closeFieldCommand");
#endif
FieldContextPtr pContext = m_aFieldStack.top();
OSL_ENSURE( pContext.get(), "no field context available");
if( pContext.get() )
{
m_bSetUserFieldContent = false;
FieldConversionMap_t aFieldConversionMap = lcl_GetFieldConversion();
try
{
uno::Reference< uno::XInterface > xFieldInterface;
//at first determine the field type - erase leading and trailing whitespaces
::rtl::OUString sCommand( pContext->GetCommand().trim() );
sal_Int32 nSpaceIndex = sCommand.indexOf( ' ' );
if( 0 <= nSpaceIndex )
sCommand = sCommand.copy( 0, nSpaceIndex );
FieldConversionMap_t::iterator aIt = aFieldConversionMap.find(sCommand);
if(aIt != aFieldConversionMap.end())
{
uno::Reference< beans::XPropertySet > xFieldProperties;
bool bCreateField = true;
switch (aIt->second.eFieldId)
{
case FIELD_HYPERLINK:
case FIELD_DOCPROPERTY:
case FIELD_TOC:
case FIELD_TC:
case FIELD_FORMCHECKBOX:
bCreateField = false;
break;
default:
break;
}
if( bCreateField)
{
//add the service prefix
OUString sServiceName(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.TextField."));
sServiceName += ::rtl::OUString::createFromAscii(aIt->second.cFieldServiceName );
#ifdef DEBUG_DOMAINMAPPER
dmapper_logger->startElement("fieldService");
dmapper_logger->chars(sServiceName);
dmapper_logger->endElement("fieldService");
#endif
xFieldInterface = m_xTextFactory->createInstance(sServiceName);
xFieldProperties = uno::Reference< beans::XPropertySet >( xFieldInterface, uno::UNO_QUERY_THROW);
}
PropertyNameSupplier& rPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier();
switch( aIt->second.eFieldId )
{
case FIELD_ADDRESSBLOCK: break;
case FIELD_ADVANCE : break;
case FIELD_ASK :
handleFieldAsk(pContext, rPropNameSupplier, xFieldInterface, xFieldProperties);
break;
case FIELD_AUTONUM :
case FIELD_AUTONUMLGL :
case FIELD_AUTONUMOUT :
handleAutoNum(pContext, rPropNameSupplier, xFieldInterface, xFieldProperties);
break;
case FIELD_AUTHOR :
handleAuthor(pContext, rPropNameSupplier, xFieldInterface, xFieldProperties);
break;
case FIELD_DATE:
{
//not fixed,
xFieldProperties->setPropertyValue(
rPropNameSupplier.GetName(PROP_IS_FIXED),
uno::makeAny( false ));
xFieldProperties->setPropertyValue(
rPropNameSupplier.GetName(PROP_IS_DATE),
uno::makeAny( true ));
SetNumberFormat( pContext->GetCommand(), xFieldProperties );
}
break;
case FIELD_COMMENTS :
{
::rtl::OUString sParam = lcl_ExtractParameter(pContext->GetCommand(), sizeof(" COMMENTS") );
if(sParam.getLength())
{
xFieldProperties->setPropertyValue(
rPropNameSupplier.GetName( PROP_IS_FIXED ), uno::makeAny( true ));
//PROP_CURRENT_PRESENTATION is set later anyway
}
}
break;
case FIELD_CREATEDATE :
{
SetNumberFormat( pContext->GetCommand(), xFieldProperties );
}
break;
case FIELD_DOCPROPERTY :
handleDocProperty(pContext, rPropNameSupplier, xFieldInterface, xFieldProperties);
break;
case FIELD_DOCVARIABLE :
{
::rtl::OUString sParam = lcl_ExtractParameter(pContext->GetCommand(), sizeof(" DOCVARIABLE") );
//create a user field and type
uno::Reference< beans::XPropertySet > xMaster =
FindOrCreateFieldMaster( "com.sun.star.text.FieldMaster.User", sParam );
uno::Reference< text::XDependentTextField > xDependentField( xFieldInterface, uno::UNO_QUERY_THROW );
xDependentField->attachTextFieldMaster( xMaster );
m_bSetUserFieldContent = true;
}
break;
case FIELD_EDITTIME :
//it's a numbering type, no number format! SetNumberFormat( pContext->GetCommand(), xFieldProperties );
break;
case FIELD_FILLIN :
{
sal_Int32 nIndex = 0;
xFieldProperties->setPropertyValue(
rPropNameSupplier.GetName(PROP_HINT), uno::makeAny( pContext->GetCommand().getToken( 1, '\"', nIndex)));
}
break;
case FIELD_FILENAME:
{
sal_Int32 nNumberingTypeIndex = pContext->GetCommand().indexOf( ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("\\p")));
xFieldProperties->setPropertyValue(
rPropNameSupplier.GetName(PROP_FILE_FORMAT),
uno::makeAny( nNumberingTypeIndex > 0 ? text::FilenameDisplayFormat::FULL : text::FilenameDisplayFormat::NAME_AND_EXT ));
}
break;
case FIELD_FILESIZE : break;
case FIELD_FORMULA : break;
case FIELD_FORMCHECKBOX :
{
FFDataHandler::Pointer_t
pFFDataHandler(pContext->getFFDataHandler());
FormControlHelper::Pointer_t
pFormControlHelper(new FormControlHelper
(FIELD_FORMCHECKBOX,
m_xTextDocument, pFFDataHandler));
pContext->setFormControlHelper(pFormControlHelper);
}
break;
case FIELD_FORMDROPDOWN : break;
case FIELD_FORMTEXT :
{
FFDataHandler::Pointer_t pFFDataHandler
(pContext->getFFDataHandler());
xFieldProperties->setPropertyValue
(rPropNameSupplier.GetName(PROP_HINT),
uno::makeAny(pFFDataHandler->getStatusText()));
xFieldProperties->setPropertyValue
(rPropNameSupplier.GetName(PROP_HELP),
uno::makeAny(pFFDataHandler->getHelpText()));
xFieldProperties->setPropertyValue
(rPropNameSupplier.GetName(PROP_CONTENT),
uno::makeAny(pFFDataHandler->getTextDefault()));
}
break;
case FIELD_GOTOBUTTON : break;
case FIELD_HYPERLINK:
{
::std::vector<rtl::OUString> aParts = pContext->GetCommandParts();
::std::vector<rtl::OUString>::const_iterator aItEnd = aParts.end();
::std::vector<rtl::OUString>::const_iterator aPartIt = aParts.begin();
OUString sURL;
while (aPartIt != aItEnd)
{
if (aPartIt->equalsAscii("\\l"))
{
aPartIt++;
if (aPartIt == aItEnd)
break;
sURL = OUString('#');
sURL += *aPartIt;
}
else if (aPartIt->equalsAscii("\\m") ||
aPartIt->equalsAscii("\\n"))
{
}
else if (aPartIt->equalsAscii("\\o") ||
aPartIt->equalsAscii("\\t"))
{
aPartIt++;
if (aPartIt == aItEnd)
break;
}
else
{
sURL = *aPartIt;
}
aPartIt++;
}
if (sURL.getLength() > 0)
{
pContext->SetHyperlinkURL(sURL);
}
}
break;
case FIELD_IF : break;
case FIELD_INFO : break;
case FIELD_INCLUDEPICTURE: break;
case FIELD_KEYWORDS :
{
::rtl::OUString sParam = lcl_ExtractParameter(pContext->GetCommand(), sizeof(" KEYWORDS") );
if(sParam.getLength())
{
xFieldProperties->setPropertyValue(
rPropNameSupplier.GetName( PROP_IS_FIXED ), uno::makeAny( true ));
//PROP_CURRENT_PRESENTATION is set later anyway
}
}
break;
case FIELD_LASTSAVEDBY : break;
case FIELD_MACROBUTTON:
{
//extract macro name
sal_Int32 nIndex = sizeof(" MACROBUTTON ");
::rtl::OUString sMacro = pContext->GetCommand().getToken( 0, ' ', nIndex);
xFieldProperties->setPropertyValue(
rPropNameSupplier.GetName(PROP_MACRO_NAME), uno::makeAny( sMacro ));
//extract quick help text
if( pContext->GetCommand().getLength() > nIndex + 1)
{
xFieldProperties->setPropertyValue(
rPropNameSupplier.GetName(PROP_HINT),
uno::makeAny( pContext->GetCommand().copy( nIndex )));
}
}
break;
case FIELD_MERGEFIELD :
{
//todo: create a database field and fieldmaster pointing to a column, only
::rtl::OUString sParam = lcl_ExtractParameter(pContext->GetCommand(), sizeof(" MERGEFIELD") );
//create a user field and type
uno::Reference< beans::XPropertySet > xMaster =
FindOrCreateFieldMaster( "com.sun.star.text.FieldMaster.Database", sParam );
// xFieldProperties->setPropertyValue(
// ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FieldCode")),
// uno::makeAny( pContext->GetCommand().copy( nIndex + 1 )));
uno::Reference< text::XDependentTextField > xDependentField( xFieldInterface, uno::UNO_QUERY_THROW );
xDependentField->attachTextFieldMaster( xMaster );
m_bSetUserFieldContent = true;
}
break;
case FIELD_MERGEREC : break;
case FIELD_MERGESEQ : break;
case FIELD_NEXT : break;
case FIELD_NEXTIF : break;
case FIELD_PAGE :
xFieldProperties->setPropertyValue(
rPropNameSupplier.GetName(PROP_NUMBERING_TYPE),
uno::makeAny( lcl_ParseNumberingType(pContext->GetCommand()) ));
xFieldProperties->setPropertyValue(
rPropNameSupplier.GetName(PROP_SUB_TYPE),
uno::makeAny( text::PageNumberType_CURRENT ));
break;
case FIELD_REF:
{
::rtl::OUString sBookmark = lcl_ExtractParameter(pContext->GetCommand(), sizeof(" REF") );
xFieldProperties->setPropertyValue(
rPropNameSupplier.GetName(PROP_REFERENCE_FIELD_SOURCE),
uno::makeAny( sal_Int16(text::ReferenceFieldSource::BOOKMARK)) );
xFieldProperties->setPropertyValue(
rPropNameSupplier.GetName(PROP_SOURCE_NAME),
uno::makeAny( sBookmark) );
sal_Int16 nFieldPart = text::ReferenceFieldPart::TEXT;
::rtl::OUString sValue;
if( lcl_FindInCommand( pContext->GetCommand(), 'p', sValue ))
{
//above-below
nFieldPart = text::ReferenceFieldPart::UP_DOWN;
}
xFieldProperties->setPropertyValue(
rPropNameSupplier.GetName( PROP_REFERENCE_FIELD_PART ), uno::makeAny( nFieldPart ));
}
break;
case FIELD_REVNUM : break;
case FIELD_SAVEDATE :
SetNumberFormat( pContext->GetCommand(), xFieldProperties );
break;
case FIELD_SECTION : break;
case FIELD_SECTIONPAGES : break;
case FIELD_SEQ :
{
// command looks like: " SEQ Table \* ARABIC "
::rtl::OUString sCmd(pContext->GetCommand());
// find the sequence name, e.g. "SEQ"
::rtl::OUString sSeqName = lcl_FindQuotedText(sCmd, "SEQ ", '\\');
sSeqName = sSeqName.trim();
// create a sequence field master using the sequence name
uno::Reference< beans::XPropertySet > xMaster = FindOrCreateFieldMaster(
"com.sun.star.text.FieldMaster.SetExpression",
sSeqName);
xMaster->setPropertyValue(
rPropNameSupplier.GetName(PROP_SUB_TYPE),
uno::makeAny(text::SetVariableType::SEQUENCE));
// apply the numbering type
xFieldProperties->setPropertyValue(
rPropNameSupplier.GetName(PROP_NUMBERING_TYPE),
uno::makeAny( lcl_ParseNumberingType(pContext->GetCommand()) ));
// attach the master to the field
uno::Reference< text::XDependentTextField > xDependentField( xFieldInterface, uno::UNO_QUERY_THROW );
xDependentField->attachTextFieldMaster( xMaster );
}
break;
case FIELD_SET : break;
case FIELD_SKIPIF : break;
case FIELD_STYLEREF : break;
case FIELD_SUBJECT :
{
::rtl::OUString sParam = lcl_ExtractParameter(pContext->GetCommand(), sizeof(" SUBJECT") );
if(sParam.getLength())
{
xFieldProperties->setPropertyValue(
rPropNameSupplier.GetName( PROP_IS_FIXED ), uno::makeAny( true ));
//PROP_CURRENT_PRESENTATION is set later anyway
}
}
break;
case FIELD_SYMBOL : break;
case FIELD_TEMPLATE: break;
case FIELD_TIME :
SetNumberFormat( pContext->GetCommand(), xFieldProperties );
break;
case FIELD_TITLE :
{
::rtl::OUString sParam = lcl_ExtractParameter(pContext->GetCommand(), sizeof(" TITLE") );
if(sParam.getLength())
{
xFieldProperties->setPropertyValue(
rPropNameSupplier.GetName( PROP_IS_FIXED ), uno::makeAny( true ));
//PROP_CURRENT_PRESENTATION is set later anyway
}
}
break;
case FIELD_USERINITIALS:
{
xFieldProperties->setPropertyValue(
rPropNameSupplier.GetName(PROP_USER_DATA_TYPE), uno::makeAny( text::UserDataPart::SHORTCUT ));
//todo: if initials are provided - set them as fixed content
::rtl::OUString sParam = lcl_ExtractParameter(pContext->GetCommand(), sizeof(" USERINITIALS") );
if(sParam.getLength())
{
xFieldProperties->setPropertyValue(
rPropNameSupplier.GetName( PROP_IS_FIXED ), uno::makeAny( true ));
//PROP_CURRENT_PRESENTATION is set later anyway
}
}
break;
case FIELD_USERADDRESS : //todo: user address collects street, city ...
break;
case FIELD_USERNAME : //todo: user name is firstname + lastname
break;
case FIELD_TOC:
handleToc(pContext, rPropNameSupplier, xFieldInterface, xFieldProperties,
::rtl::OUString::createFromAscii(aIt->second.cFieldServiceName));
break;
case FIELD_TC :
{
uno::Reference< beans::XPropertySet > xTC(
m_xTextFactory->createInstance(
::rtl::OUString::createFromAscii(aIt->second.cFieldServiceName)),
uno::UNO_QUERY_THROW);
::rtl::OUString sTCText = lcl_ExtractParameter(pContext->GetCommand(), sizeof(" TC") );
if( sTCText.getLength())
xTC->setPropertyValue(rPropNameSupplier.GetName(PROP_ALTERNATIVE_TEXT),
uno::makeAny(sTCText));
::rtl::OUString sValue;
// \f TC entry in doc with multiple tables
// if( lcl_FindInCommand( pContext->GetCommand(), 'f', sValue ))
// {
// todo: unsupported
// }
if( lcl_FindInCommand( pContext->GetCommand(), 'l', sValue ))
// \l Outline Level
{
sal_Int32 nLevel = sValue.toInt32();
if( sValue.getLength() && nLevel >= 0 && nLevel <= 10 )
xTC->setPropertyValue(rPropNameSupplier.GetName(PROP_LEVEL), uno::makeAny( (sal_Int16)nLevel ));
}
// if( lcl_FindInCommand( pContext->GetCommand(), 'n', sValue ))
// \n Suppress page numbers
// {
//todo: unsupported feature
// }
pContext->SetTC( xTC );
}
break;
case FIELD_NUMCHARS:
case FIELD_NUMWORDS:
case FIELD_NUMPAGES:
xFieldProperties->setPropertyValue(
rPropNameSupplier.GetName(PROP_NUMBERING_TYPE),
uno::makeAny( lcl_ParseNumberingType(pContext->GetCommand()) ));
break;
}
}
//set the text field if there is any
pContext->SetTextField( uno::Reference< text::XTextField >( xFieldInterface, uno::UNO_QUERY ) );
}
catch( uno::Exception& rEx)
{
(void)rEx;
OSL_ENSURE( false, "Exception in CloseFieldCommand()" );
}
pContext->SetCommandCompleted();
}
}