kivio_stencil_spawner_set.cpp
1/*
2 * Kivio - Visual Modelling and Flowcharting
3 * Copyright (C) 2000-2001 theKompany.com & Dave Marotti
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 */
19#include "kivio_common.h"
20#include "kivio_plugin_stencil_spawner.h"
21#include "kivio_sml_stencil_spawner.h"
22#include "kivio_dia_stencil_spawner.h"
23#include "kivio_py_stencil_spawner.h"
24#include "kivio_stencil_spawner.h"
25#include "kivio_stencil_spawner_set.h"
26
27#include <tqdir.h>
28#include <tqfile.h>
29#include <tqstring.h>
30#include <kdebug.h>
31#include <tdeglobal.h>
32#include <tdelocale.h>
33
34KivioStencilSpawnerSet::KivioStencilSpawnerSet(const TQString& name)
35 : m_pSpawners(NULL),
36 m_pSelected(NULL)
37{
38 m_hidden = false;
39 m_dir = "";
40 m_name = name.isEmpty() ? TQString("Untitled") : name;
41
42 m_pSpawners = new TQPtrList<KivioStencilSpawner>;
43 m_pSpawners->setAutoDelete(true);
44}
45
46KivioStencilSpawnerSet::~KivioStencilSpawnerSet()
47{
48 delete m_pSpawners;
49 m_pSpawners = NULL;
50 kdDebug(43000) << "KivioStencilSpawnerSet::~KivioStencilSpawnerSet() - " << m_name << endl;
51}
52
53
63bool KivioStencilSpawnerSet::loadXML( const TQDomElement & )
64{
65 return false;
66}
67
68
79TQDomElement KivioStencilSpawnerSet::saveXML( TQDomDocument &doc )
80{
81 TQDomElement spawnE = doc.createElement("KivioStencilSpawnerSet");
82
83 XmlWriteString( spawnE, "id", m_id );
84 XmlWriteString(spawnE, "hidden", (m_hidden ? "true" : "false"));
85
86 KivioStencilSpawner *pSpawner = m_pSpawners->first();
87 while( pSpawner )
88 {
89 spawnE.appendChild( pSpawner->saveXML( doc ) );
90
91 pSpawner = m_pSpawners->next();
92 }
93
94
95 return spawnE;
96}
97
98bool KivioStencilSpawnerSet::loadDir( const TQString &dirName )
99{
100 TQDir d(dirName);
101 TQString fileName;
102
103 m_dir = dirName;
104 m_name = readTitle( dirName );
105 m_id = readId( dirName );
106
107 d.setNameFilter("*.so *.sml *.ksp *.spy *.shape");
108 m_files = d.entryList();
109
110 return true;
111}
112
113KivioStencilSpawner* KivioStencilSpawnerSet::loadFile( const TQString &fileName )
114{
115 for (KivioStencilSpawner* ss = m_pSpawners->first(); ss; ss = m_pSpawners->next() )
116 if (ss->fileName() == fileName)
117 return ss;
118
119 KivioStencilSpawner *pSpawner;
120
121 if( fileName.contains( ".sml", false ) )
122 {
123 pSpawner = new KivioSMLStencilSpawner(this);
124 }
125 else if( fileName.contains( ".ksp", false ) )
126 {
127 pSpawner = new KivioPluginStencilSpawner(this);
128 }
129 else if( fileName.contains( ".so", false ) )
130 {
131 pSpawner = new KivioPluginStencilSpawner(this);
132 }
133 else if( fileName.contains( ".spy", false ) )
134 {
135 pSpawner = new KivioPyStencilSpawner(this);
136 }
137 else if( fileName.contains( ".shape", false ) )
138 {
139 pSpawner = new KivioDiaStencilSpawner(this);
140 }
141 else
142 {
143 return 0;
144 }
145
146 if( pSpawner->load( fileName )==true )
147 m_pSpawners->append( pSpawner );
148 else
149 {
150 delete pSpawner;
151 return 0;
152 }
153
154 return pSpawner;
155}
156
157TQString KivioStencilSpawnerSet::readTitle( const TQString &dir )
158{
159 TQDomDocument d("StencilSPawnerSet");
160 TQDomElement root, nodeElement;
161 TQDomNode node;
162 TQString nodeName;
163 TQString title, origTitle;
164 TQFile f(dir+"/desc");
165
166 if( f.open( IO_ReadOnly )==false )
167 {
168 kdDebug(43000) << "KivioStencilSpawnerSet::readTitle() - Error opening stencil set title: " <<
169 dir << "/desc" << endl;
170 return dir.right(dir.length() - dir.findRev('/')-1);
171 }
172
173 d.setContent(&f);
174
175 root = d.documentElement();
176 node = root.firstChild();
177
178 while( !node.isNull() )
179 {
180 nodeName = node.nodeName();
181 nodeElement = node.toElement();
182
183 if( nodeName.compare("Title")==0 && nodeElement.hasAttribute("lang"))
184 {
185 if(nodeElement.attribute("lang") == TDEGlobal::locale()->language()) {
186 title = XmlReadString( nodeElement, "data", dir );
187 }
188 }
189 else if( nodeName.compare("Title")==0 && !nodeElement.hasAttribute("lang"))
190 {
191 origTitle = XmlReadString( nodeElement, "data", dir );
192 }
193
194 node = node.nextSibling();
195 }
196
197 if(title.isEmpty()) {
198 title = i18n( "Stencils", origTitle.utf8() );
199 }
200
201 return title;
202}
203
204TQString KivioStencilSpawnerSet::readId( const TQString &dir )
205{
206 TQDomDocument d("StencilSPawnerSet");
207 TQDomElement root;
208 TQDomNode node;
209 TQString nodeName;
210 TQString theid;
211 TQFile f(dir+"/desc");
212
213 if( f.open( IO_ReadOnly )==false )
214 {
215 kdDebug(43000) << "KivioStencilSpawnerSet::readId() - Error opening stencil set description: " <<
216 dir << "/desc" << endl;
217 return "";
218 }
219
220 d.setContent(&f);
221
222 root = d.documentElement();
223 node = root.firstChild();
224
225 while( !node.isNull() )
226 {
227 nodeName = node.nodeName();
228
229 if( nodeName.compare("Id")==0 )
230 {
231 theid = XmlReadString( node.toElement(), "data", dir );
232 return theid;
233 }
234
235 node = node.nextSibling();
236 }
237
238 kdDebug(43000) << "KivioStencilSpawnerSet::readId() - No id found in "
239 << dir << "/desc" << endl;
240
241 return "";
242}
243
244TQString KivioStencilSpawnerSet::readDescription(const TQString& dir)
245{
246 TQDomDocument d("StencilSPawnerSet");
247 TQDomElement root, nodeElement;
248 TQDomNode node;
249 TQString nodeName;
250 TQFile f(dir + "/desc");
251
252 if( f.open( IO_ReadOnly )==false )
253 {
254 kdDebug(43000) << "KivioStencilSpawnerSet::readId() - Error opening stencil set description: " <<
255 dir << "/desc" << endl;
256 return "";
257 }
258
259 d.setContent(&f);
260
261 root = d.documentElement();
262 node = root.firstChild();
263 TQString description, origDesc;
264
265 while( !node.isNull() )
266 {
267 nodeName = node.nodeName();
268 nodeElement = node.toElement();
269
270 if( nodeName.compare("Description")==0 && nodeElement.hasAttribute("lang"))
271 {
272 if(nodeElement.attribute("lang") == TDEGlobal::locale()->language()) {
273 description = nodeElement.text();
274 }
275 }
276 else if( nodeName.compare("Description")==0 && !nodeElement.hasAttribute("lang"))
277 {
278 origDesc = nodeElement.text();
279 }
280
281 node = node.nextSibling();
282 }
283
284 if(description.isEmpty() && !origDesc.isEmpty()) {
285 description = i18n( "Stencils", origDesc.utf8() );
286 }
287
288 return description;
289}
290
291
292KivioStencilSpawner* KivioStencilSpawnerSet::find( const TQString& id)
293{
294 if(!m_pSpawners || m_pSpawners->isEmpty()) {
295 return 0;
296 }
297
298 KivioStencilSpawner* pSpawner = m_pSpawners->first();
299
300 while( pSpawner )
301 {
302 // If the id matches, this is it!
303 if( pSpawner->info()->id() == id )
304 {
305 return pSpawner;
306 }
307
308 pSpawner = m_pSpawners->next();
309 }
310
311 return NULL;
312}
313
314void KivioStencilSpawnerSet::addSpawner(KivioStencilSpawner* spawner)
315{
316 if(spawner) {
317 m_pSpawners->append(spawner);
318 }
319}