Update ooo320-m1
[ooovba.git] / svtools / source / misc / ownlist.cxx
blob0ad114a3527262ccbce76390200b94b0f35b5fae
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: ownlist.cxx,v $
10 * $Revision: 1.6.136.1 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_svtools.hxx"
33 #include <ctype.h>
34 #include <stdio.h>
35 #include <com/sun/star/beans/PropertyValues.hpp>
37 #include <svtools/ownlist.hxx>
39 using namespace com::sun::star;
41 //=========================================================================
42 //============== SvCommandList ============================================
43 //=========================================================================
44 PRV_SV_IMPL_OWNER_LIST(SvCommandList,SvCommand)
47 static String parseString(const String & rCmd, USHORT * pIndex)
49 String result;
51 if(rCmd.GetChar( *pIndex ) == '\"') {
52 (*pIndex) ++;
54 USHORT begin = *pIndex;
56 while(*pIndex < rCmd.Len() && rCmd.GetChar((*pIndex) ++) != '\"') ;
58 result = String(rCmd.Copy(begin, *pIndex - begin - 1));
61 return result;
64 static String parseWord(const String & rCmd, USHORT * pIndex)
66 USHORT begin = *pIndex;
68 while(*pIndex < rCmd.Len() && !isspace(rCmd.GetChar(*pIndex)) && rCmd.GetChar(*pIndex) != '=')
69 (*pIndex) ++;
71 return String(rCmd.Copy(begin, *pIndex - begin));
74 static void eatSpace(const String & rCmd, USHORT * pIndex)
76 while(*pIndex < rCmd.Len() && isspace(rCmd.GetChar(*pIndex)))
77 (*pIndex) ++;
81 //=========================================================================
82 BOOL SvCommandList::AppendCommands
84 const String & rCmd, /* Dieser Text wird in Kommandos umgesetzt */
85 USHORT * pEaten /* Anzahl der Zeichen, die gelesen wurden */
87 /* [Beschreibung]
89 Es wird eine Text geparsed und die einzelnen Kommandos werden an
90 die Liste angeh"angt.
92 [R"uckgabewert]
94 BOOL TRUE, der Text wurde korrekt geparsed.
95 FALSE, der Text wurde nicht korrekt geparsed.
98 USHORT index = 0;
99 while(index < rCmd.Len())
102 eatSpace(rCmd, &index);
103 String name = (rCmd.GetChar(index) == '\"') ? parseString(rCmd, &index) : parseWord(rCmd, &index);
105 eatSpace(rCmd, &index);
106 String value;
107 if(index < rCmd.Len() && rCmd.GetChar(index) == '=')
109 index ++;
111 eatSpace(rCmd, &index);
112 value = (rCmd.GetChar(index) == '\"') ? parseString(rCmd, &index) : parseWord(rCmd, &index);
115 SvCommand * pCmd = new SvCommand(name, value);
116 aTypes.Insert(pCmd, LIST_APPEND);
119 *pEaten = index;
121 // USHORT nPos = 0;
122 // while( nPos < rCmd.Len() )
123 // {
124 // // ein Zeichen ? Dann faengt hier eine Option an
125 // if( isalpha( rCmd[nPos] ) )
126 // {
127 // String aValue;
128 // USHORT nStt = nPos;
129 // register char c;
131 // while( nPos < rCmd.Len() &&
132 // ( isalnum(c=rCmd[nPos]) || '-'==c || '.'==c ) )
133 // nPos++;
135 // String aToken( rCmd.Copy( nStt, nPos-nStt ) );
137 // while( nPos < rCmd.Len() &&
138 // ( !String::IsPrintable( (c=rCmd[nPos]),
139 // RTL_TEXTENCODING_MS_1252 ) || isspace(c) ) )
140 // nPos++;
142 // // hat die Option auch einen Wert?
143 // if( nPos!=rCmd.Len() && '='==c )
144 // {
145 // nPos++;
147 // while( nPos < rCmd.Len() &&
148 // ( !String::IsPrintable( (c=rCmd[nPos]),
149 // RTL_TEXTENCODING_MS_1252 ) || isspace(c) ) )
150 // nPos++;
152 // if( nPos != rCmd.Len() )
153 // {
154 // USHORT nLen = 0;
155 // nStt = nPos;
156 // if( '"' == c )
157 // {
158 // nPos++; nStt++;
159 // while( nPos < rCmd.Len() &&
160 // '"' != rCmd[nPos] )
161 // nPos++, nLen++;
162 // if( nPos!=rCmd.Len() )
163 // nPos++;
164 // }
165 // else
166 // // hier sind wir etwas laxer als der
167 // // Standard und erlauben alles druckbare
168 // while( nPos < rCmd.Len() &&
169 // String::IsPrintable( (c=rCmd[nPos]),
170 // RTL_TEXTENCODING_MS_1252 ) &&
171 // !isspace( c ) )
172 // nPos++, nLen++;
174 // if( nLen )
175 // aValue = rCmd( nStt, nLen );
176 // }
177 // }
179 // SvCommand * pCmd = new SvCommand( aToken, aValue );
180 // aTypes.Insert( pCmd, LIST_APPEND );
181 // }
182 // else
183 // // white space un unerwartete Zeichen ignorieren wie
184 // nPos++;
185 // }
186 // *pEaten = nPos;
187 return TRUE;
190 //=========================================================================
191 String SvCommandList::GetCommands() const
192 /* [Beschreibung]
194 Die Kommandos in der Liste werden als Text hintereinander, durch ein
195 Leerzeichen getrennt geschrieben. Der Text muss nicht genauso
196 aussehen wie der in <SvCommandList::AppendCommands()> "ubergebene.
198 [R"uckgabewert]
200 String Die Kommandos werden zur"uckgegeben.
203 String aRet;
204 for( ULONG i = 0; i < aTypes.Count(); i++ )
206 if( i != 0 )
207 aRet += ' ';
208 SvCommand * pCmd = (SvCommand *)aTypes.GetObject( i );
209 aRet += pCmd->GetCommand();
210 if( pCmd->GetArgument().Len() )
212 aRet.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "=\"" ) );
213 aRet += pCmd->GetArgument();
214 aRet.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "\"" ) );
217 return aRet;
220 //=========================================================================
221 SvCommand & SvCommandList::Append
223 const String & rCommand, /* das Kommando */
224 const String & rArg /* dasArgument des Kommandos */
226 /* [Beschreibung]
228 Es wird eine Objekt vom Typ SvCommand erzeugt und an die Liste
229 angeh"angt.
231 [R"uckgabewert]
233 SvCommand & Das erteugte Objekt wird zur"uckgegeben.
236 SvCommand * pCmd = new SvCommand( rCommand, rArg );
237 aTypes.Insert( pCmd, LIST_APPEND );
238 return *pCmd;
241 //=========================================================================
242 SvStream & operator >>
244 SvStream & rStm, /* Stream aus dem gelesen wird */
245 SvCommandList & rThis /* Die zu f"ullende Liste */
247 /* [Beschreibung]
249 Die Liste mit ihren Elementen wird gelesen. Das Format ist:
250 1. Anzahl der Elemente
251 2. Alle Elemente
253 [R"uckgabewert]
255 SvStream & Der "ubergebene Stream.
258 UINT32 nCount = 0;
259 rStm >> nCount;
260 if( !rStm.GetError() )
262 while( nCount-- )
264 SvCommand * pCmd = new SvCommand();
265 rStm >> *pCmd;
266 rThis.aTypes.Insert( pCmd, LIST_APPEND );
269 return rStm;
272 //=========================================================================
273 SvStream & operator <<
275 SvStream & rStm, /* Stream in den geschrieben wird */
276 const SvCommandList & rThis /* Die zu schreibende Liste */
278 /* [Beschreibung]
280 Die Liste mit ihren Elementen wir geschrieben. Das Format ist:
281 1. Anzahl der Elemente
282 2. Alle Elemente
284 [R"uckgabewert]
286 SvStream & Der "ubergebene Stream.
289 UINT32 nCount = rThis.aTypes.Count();
290 rStm << nCount;
292 for( UINT32 i = 0; i < nCount; i++ )
294 SvCommand * pCmd = (SvCommand *)rThis.aTypes.GetObject( i );
295 rStm << *pCmd;
297 return rStm;
300 BOOL SvCommandList::FillFromSequence( const com::sun::star::uno::Sequence < com::sun::star::beans::PropertyValue >& aCommandSequence )
302 const sal_Int32 nCount = aCommandSequence.getLength();
303 String aCommand, aArg;
304 ::rtl::OUString aApiArg;
305 for( sal_Int32 nIndex=0; nIndex<nCount; nIndex++ )
307 aCommand = aCommandSequence[nIndex].Name;
308 if( !( aCommandSequence[nIndex].Value >>= aApiArg ) )
309 return sal_False;
310 aArg = aApiArg;
311 Append( aCommand, aArg );
314 return TRUE;
317 void SvCommandList::FillSequence( com::sun::star::uno::Sequence < com::sun::star::beans::PropertyValue >& aCommandSequence )
319 const sal_Int32 nCount = Count();
320 aCommandSequence.realloc( nCount );
321 for( sal_Int32 nIndex = 0; nIndex < nCount; nIndex++ )
323 const SvCommand& rCommand = (*this)[ nIndex ];
324 aCommandSequence[nIndex].Name = rCommand.GetCommand();
325 aCommandSequence[nIndex].Handle = -1;
326 aCommandSequence[nIndex].Value = uno::makeAny( ::rtl::OUString( rCommand.GetArgument() ) );
327 aCommandSequence[nIndex].State = beans::PropertyState_DIRECT_VALUE;