Hi, I have submitted a patch for review:
https://gerrit.libreoffice.org/2473 To pull it, you can do: git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/73/2473/1 some refinements on label configurations in writer Change-Id: I94ad02972b0fae1327f72a41373f34962452b8ef --- M extras/source/labels/labels.xml M sw/source/ui/envelp/labelcfg.cxx M sw/source/ui/envelp/labfmt.cxx M sw/source/ui/envelp/labfmt.hrc M sw/source/ui/envelp/labfmt.src M sw/source/ui/inc/labelcfg.hxx 6 files changed, 155 insertions(+), 164 deletions(-) diff --git a/extras/source/labels/labels.xml b/extras/source/labels/labels.xml index a9f81ba..8ed02b9 100644 --- a/extras/source/labels/labels.xml +++ b/extras/source/labels/labels.xml @@ -651,7 +651,7 @@ <measure>S;4064;2117;3810;2117;467;1090;5;13;21000;29700</measure> </label> <label id="L125"> - <name>J8654 Miini Address</name> + <name>J8654 Mini Address</name> <measure>S;4826;2540;4572;2540;975;2143;4;10;21000;29700</measure> </label> <label id="L126"> @@ -1199,7 +1199,7 @@ <measure>S;4064;2117;3810;2117;467;1090;5;13;21000;29700</measure> </label> <label id="L262"> - <name>L7652 Miini Address</name> + <name>L7652 Mini Address</name> <measure>S;4826;1693;4572;1693;975;1299;4;16;21000;29700</measure> </label> <label id="L263"> @@ -1207,7 +1207,7 @@ <measure>S;4572;1693;2200;1270;2542;4902;4;12;21000;29700</measure> </label> <label id="L264"> - <name>L7654 Miini Address</name> + <name>L7654 Mini Address</name> <measure>S;4826;2540;4572;2540;975;2143;4;10;21000;29700</measure> </label> <label id="L265"> diff --git a/sw/source/ui/envelp/labelcfg.cxx b/sw/source/ui/envelp/labelcfg.cxx index 28d4074..785eff6 100644 --- a/sw/source/ui/envelp/labelcfg.cxx +++ b/sw/source/ui/envelp/labelcfg.cxx @@ -59,6 +59,18 @@ return sTmp; } +static Sequence<OUString> lcl_CreatePropertyNames(const OUString& rPrefix) +{ + Sequence<OUString> aProperties(2); + OUString* pProperties = aProperties.getArray(); + for(sal_Int32 nProp = 0; nProp < 2; nProp++) + pProperties[nProp] = rPrefix; + + pProperties[ 0] += "Name"; + pProperties[ 1] += "Measure"; + return aProperties; +} + SwLabelConfig::SwLabelConfig() : ConfigItem("Office.Labels/Manufacturer") { @@ -72,6 +84,7 @@ OUString sName; OUString sMeasure; + // fill m_aLabels and m_aManufacturers with the predefined labels res = reader.nextItem( xmlreader::XmlReader::TEXT_NONE, &name, &nsId); assert(res == xmlreader::XmlReader::RESULT_BEGIN && @@ -105,7 +118,10 @@ xmlreader::Span(RTL_CONSTASCII_STRINGPARAM("measure"))); // Ending label mark lcl_assertEndingItem(reader); - m_aLabels[sManufacturer][sName] = sMeasure; + if ( m_aLabels.find( sManufacturer ) == m_aLabels.end() ) + m_aManufacturers.push_back( sManufacturer ); + m_aLabels[sManufacturer][sName].m_aMeasure = sMeasure; + m_aLabels[sManufacturer][sName].m_bPredefined = true; } // Get next manufacturer or end res = reader.nextItem( @@ -115,7 +131,35 @@ xmlreader::XmlReader::TEXT_NONE, &name, &nsId); assert(res == xmlreader::XmlReader::RESULT_DONE); - FillManufacturers(); + // add to m_aLabels and m_aManufacturers the custom labels + const Sequence<rtl::OUString>& rMan = GetNodeNames( OUString() ); + const rtl::OUString* pMan = rMan.getConstArray(); + for ( sal_Int32 nMan = 0; nMan < rMan.getLength(); nMan++ ) + { + sManufacturer = pMan[nMan]; + const Sequence<OUString> aLabels = GetNodeNames( sManufacturer ); + const OUString* pLabels = aLabels.getConstArray(); + for( sal_Int32 nLabel = 0; nLabel < aLabels.getLength(); nLabel++ ) + { + OUString sPrefix( sManufacturer ); + sPrefix += "/"; + sPrefix += pLabels[nLabel]; + sPrefix += "/"; + Sequence<OUString> aPropNames = lcl_CreatePropertyNames( sPrefix ); + Sequence<Any> aValues = GetProperties( aPropNames ); + const Any* pValues = aValues.getConstArray(); + if (aValues.getLength() >= 1) + if(pValues[0].hasValue()) + pValues[0] >>= sName; + if (aValues.getLength() >= 2) + if(pValues[1].hasValue()) + pValues[1] >>= sMeasure; + if ( m_aLabels.find( sManufacturer ) == m_aLabels.end() ) + m_aManufacturers.push_back( sManufacturer ); + m_aLabels[sManufacturer][sName].m_aMeasure = sMeasure; + m_aLabels[sManufacturer][sName].m_bPredefined = false; + } + } } SwLabelConfig::~SwLabelConfig() @@ -127,32 +171,6 @@ void SwLabelConfig::Notify( const ::com::sun::star::uno::Sequence< rtl::OUString >& ) {} -void SwLabelConfig::FillManufacturers() -{ - m_aManufacturers.clear(); - for (std::map< OUString, std::map<OUString, OUString> >::iterator it = - m_aLabels.begin(); it != m_aLabels.end(); ++it) - m_aManufacturers.push_back( it->first ); - - const com::sun::star::uno::Sequence<rtl::OUString>& rMan = GetNodeNames(OUString()); - const rtl::OUString* pMan = rMan.getConstArray(); - for(sal_Int32 nMan = 0; nMan < rMan.getLength(); nMan++) - if (m_aLabels.find( pMan[nMan] ) == m_aLabels.end()) - m_aManufacturers.push_back( pMan[nMan] ); -} - -static Sequence<OUString> lcl_CreatePropertyNames(const OUString& rPrefix) -{ - Sequence<OUString> aProperties(2); - OUString* pProperties = aProperties.getArray(); - for(sal_Int32 nProp = 0; nProp < 2; nProp++) - pProperties[nProp] = rPrefix; - - pProperties[ 0] += "Name"; - pProperties[ 1] += "Measure"; - return aProperties; -} - static SwLabRec* lcl_CreateSwLabRec(const OUString& rType, const OUString& rMeasure, const OUString& rManufacturer) { SwLabRec* pNewRec = new SwLabRec; @@ -161,7 +179,7 @@ pNewRec->lPHeight = 0; pNewRec->aType = rType; //all values are contained as colon-separated 1/100 mm values - //except for the continuous flag ('C'/'S') + //except for the continuous flag ('C'/'S') and nCols, nRows (sal_Int32) String sMeasure(rMeasure); sal_uInt16 nTokenCount = comphelper::string::getTokenCount(sMeasure, ';'); for(sal_uInt16 i = 0; i < nTokenCount; i++) @@ -183,7 +201,7 @@ case 10 : pNewRec->lPHeight = MM100_TO_TWIP(nVal); break; } } - // lines added for compatibility with custom label defintions saved before patch 44516 + // lines added for compatibility with custom label definitions saved before patch fdo#44516 if (pNewRec->lPWidth == 0 || pNewRec->lPHeight == 0) { // old style definition (no paper dimensions), calculate probable values @@ -194,7 +212,7 @@ } static Sequence<PropertyValue> lcl_CreateProperties( - Sequence<OUString>& rPropNames, const SwLabRec& rRec) + Sequence<OUString>& rPropNames, OUString& rMeasure, const SwLabRec& rRec) { const OUString* pNames = rPropNames.getConstArray(); Sequence<PropertyValue> aRet(rPropNames.getLength()); @@ -209,19 +227,19 @@ case 0: pValues[nProp].Value <<= OUString(rRec.aType); break; case 1: { - OUString sTmp; - sTmp += rRec.bCont ? OUString("C") : OUString("S"); sTmp += sColon; - sTmp += OUString::valueOf(TWIP_TO_MM100(rRec.lHDist) ); sTmp += sColon; - sTmp += OUString::valueOf(TWIP_TO_MM100(rRec.lVDist)); sTmp += sColon; - sTmp += OUString::valueOf(TWIP_TO_MM100(rRec.lWidth) ); sTmp += sColon; - sTmp += OUString::valueOf(TWIP_TO_MM100(rRec.lHeight) ); sTmp += sColon; - sTmp += OUString::valueOf(TWIP_TO_MM100(rRec.lLeft) ); sTmp += sColon; - sTmp += OUString::valueOf(TWIP_TO_MM100(rRec.lUpper) ); sTmp += sColon; - sTmp += OUString::valueOf(rRec.nCols ); sTmp += sColon; - sTmp += OUString::valueOf(rRec.nRows ); sTmp += sColon; - sTmp += OUString::valueOf(TWIP_TO_MM100(rRec.lPWidth) ); sTmp += sColon; - sTmp += OUString::valueOf(TWIP_TO_MM100(rRec.lPHeight) ); - pValues[nProp].Value <<= sTmp; + rMeasure = ""; + rMeasure += rRec.bCont ? OUString( "C" ) : OUString( "S" ); rMeasure += sColon; + rMeasure += OUString::valueOf( TWIP_TO_MM100( rRec.lHDist ) ); rMeasure += sColon; + rMeasure += OUString::valueOf( TWIP_TO_MM100( rRec.lVDist ) ); rMeasure += sColon; + rMeasure += OUString::valueOf( TWIP_TO_MM100( rRec.lWidth ) ); rMeasure += sColon; + rMeasure += OUString::valueOf( TWIP_TO_MM100( rRec.lHeight ) ); rMeasure += sColon; + rMeasure += OUString::valueOf( TWIP_TO_MM100( rRec.lLeft ) ); rMeasure += sColon; + rMeasure += OUString::valueOf( TWIP_TO_MM100( rRec.lUpper ) ); rMeasure += sColon; + rMeasure += OUString::valueOf( rRec.nCols ); rMeasure += sColon; + rMeasure += OUString::valueOf( rRec.nRows ); rMeasure += sColon; + rMeasure += OUString::valueOf( TWIP_TO_MM100( rRec.lPWidth ) ); rMeasure += sColon; + rMeasure += OUString::valueOf( TWIP_TO_MM100( rRec.lPHeight ) ); + pValues[nProp].Value <<= rMeasure; } break; } @@ -229,80 +247,21 @@ return aRet; } +// function fills SwLabDlg with label definitions for manufacturer rManufacturer void SwLabelConfig::FillLabels(const OUString& rManufacturer, SwLabRecs& rLabArr) { OUString sManufacturer(wrapConfigurationElementName(rManufacturer)); - const Sequence<OUString> aLabels = GetNodeNames(sManufacturer); - const OUString* pLabels = aLabels.getConstArray(); - for(sal_Int32 nLabel = 0; nLabel < aLabels.getLength(); nLabel++) - { - OUString sPrefix(sManufacturer); - sPrefix += "/"; - sPrefix += pLabels[nLabel]; - sPrefix += "/"; - Sequence<OUString> aPropNames = lcl_CreatePropertyNames(sPrefix); - Sequence<Any> aValues = GetProperties(aPropNames); - const Any* pValues = aValues.getConstArray(); - OUString sType; - OUString sMeasure; - if (aValues.getLength() >= 1) - if(pValues[0].hasValue()) - pValues[0] >>= sType; - if (aValues.getLength() >= 2) - if(pValues[1].hasValue()) - pValues[1] >>= sMeasure; - // Remove default value if we have one from configuration - if(m_aLabels.find(rManufacturer) != m_aLabels.end()) - m_aLabels[rManufacturer].erase(sType); - rLabArr.push_back( lcl_CreateSwLabRec(sType, sMeasure, rManufacturer) ); - } - // Add default labels if (m_aLabels.find(rManufacturer) == m_aLabels.end()) return; - for (std::map<OUString, OUString>::iterator it = - m_aLabels[rManufacturer].begin(); + for (std::map<OUString, SwLabelMeasure>::iterator it = m_aLabels[rManufacturer].begin(); it != m_aLabels[rManufacturer].end(); ++it) - rLabArr.push_back( lcl_CreateSwLabRec(it->first, it->second, rManufacturer) ); + rLabArr.push_back( lcl_CreateSwLabRec(it->first, it->second.m_aMeasure, rManufacturer) ); } sal_Bool SwLabelConfig::HasLabel(const rtl::OUString& rManufacturer, const rtl::OUString& rType) { - if (m_aLabels.find(rManufacturer) != m_aLabels.end()) - if (m_aLabels[rManufacturer].find(rType) != m_aLabels[rManufacturer].end()) - return true; - - bool bFound = false; - for (size_t nNode = 0; nNode < m_aManufacturers.size() && !bFound; nNode++) - { - if (m_aManufacturers[nNode] == rManufacturer) - bFound = true; - } - if(bFound) - { - OUString sManufacturer(wrapConfigurationElementName(rManufacturer)); - const Sequence<OUString> aLabels = GetNodeNames(sManufacturer); - const OUString* pLabels = aLabels.getConstArray(); - for(sal_Int32 nLabel = 0; nLabel < aLabels.getLength(); nLabel++) - { - OUString sPrefix(sManufacturer); - sPrefix += "/"; - sPrefix += pLabels[nLabel]; - sPrefix += "/"; - Sequence<OUString> aProperties(1); - aProperties.getArray()[0] = sPrefix; - aProperties.getArray()[0] += "Name"; - Sequence<Any> aValues = GetProperties(aProperties); - const Any* pValues = aValues.getConstArray(); - if(pValues[0].hasValue()) - { - OUString sTmp; - pValues[0] >>= sTmp; - if(rType == sTmp) - return sal_True; - } - } - } - return sal_False; + return ( ( m_aLabels.find(rManufacturer) != m_aLabels.end() ) && + ( m_aLabels[rManufacturer].find(rType) != m_aLabels[rManufacturer].end() ) ); } static bool lcl_Exists(const OUString& rNode, const Sequence<OUString>& rLabels) @@ -314,75 +273,85 @@ return false; } -void SwLabelConfig::SaveLabel( const rtl::OUString& rManufacturer, - const rtl::OUString& rType, const SwLabRec& rRec) +// label is always saved as a custom label +// predefined labels can NOT be overwritten by custom labels with same manufacturer/name +void SwLabelConfig::SaveLabel( const rtl::OUString& rManufacturer, + const rtl::OUString& rType, const SwLabRec& rRec ) { - bool bFound = false; - for (size_t nNode = 0; nNode < m_aManufacturers.size() && !bFound; nNode++) + OUString sFoundNode; + bool bManufacturerNodeFound; + if ( m_aLabels.find( rManufacturer ) == m_aLabels.end() || + GetNodeNames( rManufacturer ).getLength() == 0 ) { - if (m_aManufacturers[nNode] == rManufacturer) - bFound = true; - } - if(!bFound) - { - if(!AddNode(OUString(), rManufacturer)) + bManufacturerNodeFound = false; + // manufacturer node does not exist, add (and also to m_aManufacturers) + if ( !AddNode( OUString(), rManufacturer ) ) { OSL_FAIL("New configuration node could not be created"); return ; } - else - { - FillManufacturers(); - } + m_aManufacturers.push_back( rManufacturer ); } + else + bManufacturerNodeFound = true; - OUString sManufacturer(wrapConfigurationElementName(rManufacturer)); - const Sequence<OUString> aLabels = GetNodeNames(sManufacturer); - const OUString* pLabels = aLabels.getConstArray(); - OUString sFoundNode; - for(sal_Int32 nLabel = 0; nLabel < aLabels.getLength(); nLabel++) + if ( !bManufacturerNodeFound || + m_aLabels[rManufacturer].find( rType ) == m_aLabels[rManufacturer].end() ) { - OUString sPrefix(sManufacturer); - sPrefix += "/"; - sPrefix += pLabels[nLabel]; - sPrefix += "/"; - Sequence<OUString> aProperties(1); - aProperties.getArray()[0] = sPrefix; - aProperties.getArray()[0] += "Name"; - Sequence<Any> aValues = GetProperties(aProperties); - const Any* pValues = aValues.getConstArray(); - if(pValues[0].hasValue()) - { - OUString sTmp; - pValues[0] >>= sTmp; - if(rType == sTmp) - { - sFoundNode = pLabels[nLabel]; - break; - } - } - } - // if not found - generate a unique node name - if(sFoundNode.isEmpty()) - { + // type does not yet exist, add to config + const Sequence<OUString> aLabels = GetNodeNames( rManufacturer ); sal_Int32 nIndex = aLabels.getLength(); - OUString sPrefix("Label"); + OUString sPrefix( "Label" ); sFoundNode = sPrefix; - sFoundNode += OUString::valueOf(nIndex); - while(lcl_Exists(sFoundNode, aLabels)) + sFoundNode += OUString::valueOf( nIndex ); + while ( lcl_Exists( sFoundNode, aLabels ) ) { sFoundNode = sPrefix; sFoundNode += OUString::valueOf(nIndex++); } } - OUString sPrefix(wrapConfigurationElementName(rManufacturer)); + else + { + // get the appropiate node + OUString sManufacturer( wrapConfigurationElementName( rManufacturer ) ); + const Sequence<OUString> aLabels = GetNodeNames( sManufacturer ); + const OUString* pLabels = aLabels.getConstArray(); + for (sal_Int32 nLabel = 0; nLabel < aLabels.getLength(); nLabel++) + { + OUString sPrefix( sManufacturer ); + sPrefix += "/"; + sPrefix += pLabels[nLabel]; + sPrefix += "/"; + Sequence<OUString> aProperties(1); + aProperties.getArray()[0] = sPrefix; + aProperties.getArray()[0] += "Name"; + Sequence<Any> aValues = GetProperties( aProperties ); + const Any* pValues = aValues.getConstArray(); + if ( pValues[0].hasValue() ) + { + OUString sTmp; + pValues[0] >>= sTmp; + if ( rType == sTmp ) + { + sFoundNode = pLabels[nLabel]; + break; + } + } + } + } + + OUString sPrefix( wrapConfigurationElementName( rManufacturer ) ); sPrefix += "/"; sPrefix += sFoundNode; sPrefix += "/"; - Sequence<OUString> aPropNames = lcl_CreatePropertyNames(sPrefix); - Sequence<PropertyValue> aPropValues = lcl_CreateProperties(aPropNames, rRec); - SetSetProperties(wrapConfigurationElementName(rManufacturer), aPropValues); + Sequence<OUString> aPropNames = lcl_CreatePropertyNames( sPrefix ); + OUString sMeasure; + Sequence<PropertyValue> aPropValues = lcl_CreateProperties( aPropNames, sMeasure, rRec ); + SetSetProperties( wrapConfigurationElementName( rManufacturer ), aPropValues ); + //update m_aLabels + m_aLabels[rManufacturer][rType].m_aMeasure = sMeasure; + m_aLabels[rManufacturer][rType].m_bPredefined = false; } diff --git a/sw/source/ui/envelp/labfmt.cxx b/sw/source/ui/envelp/labfmt.cxx index 1b30056..23a4453 100644 --- a/sw/source/ui/envelp/labfmt.cxx +++ b/sw/source/ui/envelp/labfmt.cxx @@ -617,7 +617,9 @@ SwLabelConfig& rCfg = pLabPage->GetParentSwLabDlg()->GetLabelsConfig(); const std::vector<OUString>& rMan = rCfg.GetManufacturers(); for (sal_uInt16 i = 0; i < rMan.size(); i++) + { aMakeCB.InsertEntry(rMan[i]); + } } IMPL_LINK_NOARG(SwSaveLabelDlg, OkHdl) @@ -627,6 +629,12 @@ String sType(aTypeED.GetText()); if(rCfg.HasLabel(sMake, sType)) { + if ( rCfg.IsPredefinedLabel(sMake, sType) ) + { + SAL_WARN( "IMPL_LINK_NOARG(SwSaveLabelDlg, OkHdl)", "label is predefined and cannot be overwritten" ); + WarningBox( this, SW_RES( WB_PREDEFINED_LABEL ) ).Execute(); + return 0; + } String sTmp(aQueryMB.GetMessText()); String sQuery(sTmp); sQuery.SearchAndReplace(rtl::OUString("%1"), sMake); diff --git a/sw/source/ui/envelp/labfmt.hrc b/sw/source/ui/envelp/labfmt.hrc index dd7804b..49c238b 100644 --- a/sw/source/ui/envelp/labfmt.hrc +++ b/sw/source/ui/envelp/labfmt.hrc @@ -71,13 +71,14 @@ #define STR_ROWS (RC_LABFMT_BEGIN + 8) #define STR_PWIDTH (RC_LABFMT_BEGIN + 9) #define STR_PHEIGHT (RC_LABFMT_BEGIN + 10) +#define WB_PREDEFINED_LABEL (RC_LABFMT_BEGIN + 10) // overflow check ******************************************************** -#define LABFMT_ACT_END STR_PHEIGHT +#define LABFMT_ACT_END WB_PREDEFINED_LABEL #if LABFMT_ACT_END > RC_LABFMT_END -#error Resource-Ueberlauf in #file, #line +#error Resource overflow in #file, #line #endif #endif diff --git a/sw/source/ui/envelp/labfmt.src b/sw/source/ui/envelp/labfmt.src index 8bb7bbe..4b83f69 100644 --- a/sw/source/ui/envelp/labfmt.src +++ b/sw/source/ui/envelp/labfmt.src @@ -302,6 +302,12 @@ { Text [ en-US ] = "Page Height" ; }; +WarningBox WB_PREDEFINED_LABEL +{ + BUTTONS = WB_OK; + DEFBUTTON = WB_DEF_OK; + Message [ en-US ] = "Predefined labels cannot be overwritten, use another name." ; +}; ModalDialog DLG_SAVE_LABEL { HelpID = HID_SAVE_LABEL_DLG ; diff --git a/sw/source/ui/inc/labelcfg.hxx b/sw/source/ui/inc/labelcfg.hxx index 80135fe..216bef4 100644 --- a/sw/source/ui/inc/labelcfg.hxx +++ b/sw/source/ui/inc/labelcfg.hxx @@ -28,10 +28,16 @@ class SwLabRecs; class SwLabRec; +struct SwLabelMeasure +{ + OUString m_aMeasure; // string contains the label dimensions + bool m_bPredefined; // used to distinguish predefined from user-defined labels +}; + class SW_DLLPUBLIC SwLabelConfig : public utl::ConfigItem { std::vector<rtl::OUString> m_aManufacturers; - std::map< OUString, std::map<OUString, OUString> > m_aLabels; + std::map< OUString, std::map<OUString, SwLabelMeasure> > m_aLabels; public: SwLabelConfig(); @@ -40,11 +46,12 @@ virtual void Commit(); virtual void Notify( const ::com::sun::star::uno::Sequence< rtl::OUString >& aPropertyNames ); - void FillManufacturers(); void FillLabels(const rtl::OUString& rManufacturer, SwLabRecs& rLabArr); const std::vector<rtl::OUString>& GetManufacturers() const {return m_aManufacturers;} sal_Bool HasLabel(const rtl::OUString& rManufacturer, const rtl::OUString& rType); + bool IsPredefinedLabel(const rtl::OUString& rManufacturer, const rtl::OUString& rType) + { return m_aLabels[rManufacturer][rType].m_bPredefined; }; void SaveLabel(const rtl::OUString& rManufacturer, const rtl::OUString& rType, const SwLabRec& rRec); }; -- To view, visit https://gerrit.libreoffice.org/2473 To unsubscribe, visit https://gerrit.libreoffice.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I94ad02972b0fae1327f72a41373f34962452b8ef Gerrit-PatchSet: 1 Gerrit-Project: core Gerrit-Branch: master Gerrit-Owner: Winfried Donkers <o...@dci-electronics.nl> _______________________________________________ LibreOffice mailing list LibreOffice@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice