1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #include <ThemeTable.hxx>
25 #ifndef INCLUDED_RESOURCESIDS
26 #include <doctok/resourceids.hxx>
27 #include <ooxml/resourceids.hxx>
28 #endif
29 #include "dmapperLoggers.hxx"
30 
31 #ifdef DEBUG_DOMAINMAPPER
32 #include <resourcemodel/QNameToString.hxx>
33 #endif
34 
35 namespace writerfilter {
36 namespace dmapper
37 {
38 
39 struct ThemeTable_Impl
40 {
ThemeTable_Implwriterfilter::dmapper::ThemeTable_Impl41     ThemeTable_Impl() :
42         m_currentThemeFontId(0),
43         m_currentFontThemeEntry() {}
44     std::map<sal_uInt32, std::map<sal_uInt32, ::rtl::OUString> > m_themeFontMap;
45     sal_uInt32 m_currentThemeFontId;
46     std::map<sal_uInt32, ::rtl::OUString> m_currentFontThemeEntry;
47 };
48 
ThemeTable()49 ThemeTable::ThemeTable()
50 : LoggedProperties(dmapper_logger, "ThemeTable")
51 , LoggedTable(dmapper_logger, "ThemeTable")
52 , m_pImpl( new ThemeTable_Impl )
53 {
54     // printf("ThemeTable::ThemeTable()\n");
55 }
56 
~ThemeTable()57 ThemeTable::~ThemeTable()
58 {
59     delete m_pImpl;
60 }
61 
lcl_attribute(Id Name,Value & val)62 void ThemeTable::lcl_attribute(Id Name, Value & val)
63 {
64 #ifdef DEBUG_DOMAINMAPPER
65     dmapper_logger->startElement("ThemeTable.attribute");
66     dmapper_logger->attribute("name", (*QNameToString::Instance())(Name));
67     dmapper_logger->attribute("value", val.toString());
68 #endif
69     // int nIntValue = val.getInt();
70     ::rtl::OUString sValue = val.getString();
71     // printf ( "ThemeTable::attribute(0x%.4x, 0x%.4x) [%s]\n", (unsigned int)Name, (unsigned int)nIntValue, ::rtl::OUStringToOString(sValue, RTL_TEXTENCODING_DONTKNOW).getStr());
72     /* WRITERFILTERSTATUS: table: ThemeTable_attributedata */
73     switch(Name)
74     {
75         /* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
76     	case NS_ooxml::LN_CT_TextFont_typeface:
77 	     if (sValue.getLength())
78 	         m_pImpl->m_currentFontThemeEntry[m_pImpl->m_currentThemeFontId] = sValue;
79 	     break;
80         default:
81         {
82 #ifdef DEBUG_DOMAINMAPPER
83             dmapper_logger->element("unhandled");
84 #endif
85         }
86     }
87 #ifdef DEBUG_DOMAINMAPPER
88     dmapper_logger->endElement("ThemeTable.attribute");
89 #endif
90 }
91 
lcl_sprm(Sprm & rSprm)92 void ThemeTable::lcl_sprm(Sprm& rSprm)
93 {
94 #ifdef DEBUG_DOMAINMAPPER
95     dmapper_logger->startElement("ThemeTable.sprm");
96     dmapper_logger->chars(rSprm.toString());
97 #endif
98 
99     sal_uInt32 nSprmId = rSprm.getId();
100     (void)nSprmId;
101 
102     Value::Pointer_t pValue = rSprm.getValue();
103     sal_Int32 nIntValue = pValue->getInt();
104     (void)nIntValue;
105     rtl::OUString sStringValue = pValue->getString();
106 
107     // printf ( "ThemeTable::sprm(0x%.4x, 0x%.4x) [%s]\n", (unsigned int)nSprmId, (unsigned int)nIntValue, ::rtl::OUStringToOString(sStringValue, RTL_TEXTENCODING_DONTKNOW).getStr());
108 
109     /* WRITERFILTERSTATUS: table: ThemeTable_sprm */
110     switch(nSprmId)
111     {
112         /* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
113     case NS_ooxml::LN_CT_BaseStyles_fontScheme:
114         {
115     	    writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
116             if( pProperties.get())
117                 pProperties->resolve(*this);
118 	}
119 	break;
120         /* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
121     case NS_ooxml::LN_CT_FontScheme_majorFont:
122         /* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
123     case NS_ooxml::LN_CT_FontScheme_minorFont:
124         {
125     	    writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
126 	    m_pImpl->m_currentFontThemeEntry = std::map<sal_uInt32, rtl::OUString>();
127             if( pProperties.get())
128                 pProperties->resolve(*this);
129             m_pImpl->m_themeFontMap[nSprmId] = m_pImpl->m_currentFontThemeEntry;
130 	}
131 	break;
132         /* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
133     case NS_ooxml::LN_CT_FontCollection_latin:
134         /* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
135     case NS_ooxml::LN_CT_FontCollection_ea:
136         /* WRITERFILTERSTATUS: done: 1, planned: 0, spent: 0 */
137     case NS_ooxml::LN_CT_FontCollection_cs:
138         {
139 	    m_pImpl->m_currentThemeFontId = nSprmId;
140     	    writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
141             if( pProperties.get())
142                 pProperties->resolve(*this);
143 	}
144 	break;
145     default:
146         {
147 #ifdef DEBUG_DOMAINMAPPER
148             dmapper_logger->element("unhandled");
149 #endif
150         }
151     }
152 #ifdef DEBUG_DOMAINMAPPER
153     dmapper_logger->endElement("ThemeTable.sprm");
154 #endif
155 }
156 
lcl_entry(int,writerfilter::Reference<Properties>::Pointer_t ref)157 void ThemeTable::lcl_entry(int /*pos*/, writerfilter::Reference<Properties>::Pointer_t ref)
158 {
159 #ifdef DEBUG_DOMAINMAPPER
160     dmapper_logger->startElement("ThemeTable.entry");
161 #endif
162 
163     ref->resolve(*this);
164 
165 #ifdef DEBUG_DOMAINMAPPER
166     dmapper_logger->endElement("ThemeTable.entry");
167 #endif
168 }
169 
getFontNameForTheme(const Id id) const170 const ::rtl::OUString ThemeTable::getFontNameForTheme(const Id id) const
171 {
172     std::map<sal_uInt32, ::rtl::OUString> tmpThemeFontMap;
173     switch (id)
174     {
175     case NS_ooxml::LN_Value_ST_Theme_majorEastAsia:
176     case NS_ooxml::LN_Value_ST_Theme_majorBidi:
177     case NS_ooxml::LN_Value_ST_Theme_majorAscii:
178     case NS_ooxml::LN_Value_ST_Theme_majorHAnsi:
179         tmpThemeFontMap = m_pImpl->m_themeFontMap[NS_ooxml::LN_CT_FontScheme_majorFont];
180 	break;
181     case NS_ooxml::LN_Value_ST_Theme_minorEastAsia:
182     case NS_ooxml::LN_Value_ST_Theme_minorBidi:
183     case NS_ooxml::LN_Value_ST_Theme_minorAscii:
184     case NS_ooxml::LN_Value_ST_Theme_minorHAnsi:
185         tmpThemeFontMap = m_pImpl->m_themeFontMap[NS_ooxml::LN_CT_FontScheme_minorFont];
186 	break;
187     default:
188         return ::rtl::OUString();
189     }
190 
191     switch (id)
192     {
193     case NS_ooxml::LN_Value_ST_Theme_majorAscii:
194     case NS_ooxml::LN_Value_ST_Theme_majorHAnsi:
195     case NS_ooxml::LN_Value_ST_Theme_minorAscii:
196     case NS_ooxml::LN_Value_ST_Theme_minorHAnsi:
197 	{
198 	     std::map<sal_uInt32, ::rtl::OUString>::const_iterator Iter = tmpThemeFontMap.find(NS_ooxml::LN_CT_FontCollection_latin);
199              if (Iter != tmpThemeFontMap.end())
200                   return (Iter)->second;
201              return ::rtl::OUString();
202         }
203     case NS_ooxml::LN_Value_ST_Theme_majorBidi:
204     case NS_ooxml::LN_Value_ST_Theme_minorBidi:
205         {
206              std::map<sal_uInt32, ::rtl::OUString>::const_iterator Iter = tmpThemeFontMap.find(NS_ooxml::LN_CT_FontCollection_cs);
207              if (Iter != tmpThemeFontMap.end())
208                  return (Iter)->second;
209              return ::rtl::OUString();
210         }
211     case NS_ooxml::LN_Value_ST_Theme_majorEastAsia:
212     case NS_ooxml::LN_Value_ST_Theme_minorEastAsia:
213         {
214              std::map<sal_uInt32, ::rtl::OUString>::const_iterator Iter = tmpThemeFontMap.find(NS_ooxml::LN_CT_FontCollection_ea);
215              if (Iter != tmpThemeFontMap.end())
216                  return (Iter)->second;
217              return ::rtl::OUString();
218         }
219     default:
220 	return ::rtl::OUString();
221     }
222 }
223 
224 }//namespace dmapper
225 } //namespace writerfilter
226