xref: /trunk/main/xmloff/source/forms/attriblistmerge.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_xmloff.hxx"
30 #include "attriblistmerge.hxx"
31 
32 //.........................................................................
33 namespace xmloff
34 {
35 //.........................................................................
36 
37     using namespace ::com::sun::star::uno;
38     using namespace ::com::sun::star::xml;
39 
40     //=====================================================================
41     //= OAttribListMerger
42     //=====================================================================
43     //---------------------------------------------------------------------
44     void OAttribListMerger::addList(const Reference< sax::XAttributeList >& _rxList)
45     {
46         OSL_ENSURE(_rxList.is(), "OAttribListMerger::addList: invalid list!");
47         if (_rxList.is())
48             m_aLists.push_back(_rxList);
49     }
50 
51     //---------------------------------------------------------------------
52     sal_Bool OAttribListMerger::seekToIndex(sal_Int16 _nGlobalIndex, Reference< sax::XAttributeList >& _rSubList, sal_Int16& _rLocalIndex)
53     {
54         sal_Int16 nLeftOver = _nGlobalIndex;
55         ConstAttributeListArrayIterator aLookupSublist = m_aLists.begin();
56 
57         for ( ; (aLookupSublist != m_aLists.end()) && (nLeftOver >= (*aLookupSublist)->getLength());
58                 ++aLookupSublist
59             )
60             nLeftOver = nLeftOver - (*aLookupSublist)->getLength();
61 
62         if (aLookupSublist == m_aLists.end())
63         {
64             OSL_ENSURE(sal_False, "OAttribListMerger::seekToIndex: invalid index!");
65             return sal_False;
66         }
67         _rSubList = *aLookupSublist;
68         _rLocalIndex = nLeftOver;
69         return sal_True;
70     }
71 
72     //---------------------------------------------------------------------
73     sal_Bool OAttribListMerger::seekToName(const ::rtl::OUString& _rName, Reference< sax::XAttributeList >& _rSubList, sal_Int16& _rLocalIndex)
74     {
75         for (   ConstAttributeListArrayIterator aLookupSublist = m_aLists.begin();
76                 aLookupSublist != m_aLists.end();
77                 ++aLookupSublist
78             )
79             for (sal_Int16 i=0; i<(*aLookupSublist)->getLength(); ++i)
80                 if ((*aLookupSublist)->getNameByIndex(i) == _rName)
81                 {
82                     _rSubList = *aLookupSublist;
83                     _rLocalIndex = i;
84                     return sal_True;
85                 }
86 
87         OSL_ENSURE(sal_False, "OAttribListMerger::seekToName: did not find the name!");
88         return sal_False;
89     }
90 
91     //---------------------------------------------------------------------
92     sal_Int16 SAL_CALL OAttribListMerger::getLength(  ) throw(RuntimeException)
93     {
94         sal_Int16 nCount = 0;
95         for (   ConstAttributeListArrayIterator aAccumulate = m_aLists.begin();
96                 aAccumulate != m_aLists.end();
97                 ++aAccumulate
98             )
99             nCount = nCount + (*aAccumulate)->getLength();
100         return nCount;
101     }
102 
103     //---------------------------------------------------------------------
104     ::rtl::OUString SAL_CALL OAttribListMerger::getNameByIndex( sal_Int16 i ) throw(RuntimeException)
105     {
106         Reference< sax::XAttributeList > xSubList;
107         sal_Int16 nLocalIndex;
108 
109         if (!seekToIndex(i, xSubList, nLocalIndex))
110             return ::rtl::OUString();
111 
112         return xSubList->getNameByIndex(nLocalIndex);
113     }
114 
115     //---------------------------------------------------------------------
116     ::rtl::OUString SAL_CALL OAttribListMerger::getTypeByIndex( sal_Int16 i ) throw(RuntimeException)
117     {
118         Reference< sax::XAttributeList > xSubList;
119         sal_Int16 nLocalIndex;
120 
121         if (!seekToIndex(i, xSubList, nLocalIndex))
122             return ::rtl::OUString();
123 
124         return xSubList->getTypeByIndex(nLocalIndex);
125     }
126 
127     //---------------------------------------------------------------------
128     ::rtl::OUString SAL_CALL OAttribListMerger::getTypeByName( const ::rtl::OUString& _rName ) throw(RuntimeException)
129     {
130         Reference< sax::XAttributeList > xSubList;
131         sal_Int16 nLocalIndex;
132 
133         if (!seekToName(_rName, xSubList, nLocalIndex))
134             return ::rtl::OUString();
135 
136         // though we're in getTypeByName here, we reroute this to the getTypeByIndex of the sub list,
137         // assuming that this is faster
138         return xSubList->getTypeByIndex(nLocalIndex);
139     }
140 
141     //---------------------------------------------------------------------
142     ::rtl::OUString SAL_CALL OAttribListMerger::getValueByIndex( sal_Int16 i ) throw(RuntimeException)
143     {
144         Reference< sax::XAttributeList > xSubList;
145         sal_Int16 nLocalIndex;
146 
147         if (!seekToIndex(i, xSubList, nLocalIndex))
148             return ::rtl::OUString();
149 
150         return xSubList->getValueByIndex(nLocalIndex);
151     }
152 
153     //---------------------------------------------------------------------
154     ::rtl::OUString SAL_CALL OAttribListMerger::getValueByName( const ::rtl::OUString& _rName ) throw(RuntimeException)
155     {
156         Reference< sax::XAttributeList > xSubList;
157         sal_Int16 nLocalIndex;
158 
159         if (!seekToName(_rName, xSubList, nLocalIndex))
160             return ::rtl::OUString();
161 
162         // though we're in getValueByName here, we reroute this to the getValueByIndex of the sub list,
163         // assuming that this is faster
164         return xSubList->getValueByIndex(nLocalIndex);
165     }
166 
167 //.........................................................................
168 }   // namespace xmloff
169 //.........................................................................
170 
171