kivio

kivio_stencil_spawner_set.cpp

00001 /*
00002  * Kivio - Visual Modelling and Flowcharting
00003  * Copyright (C) 2000-2001 theKompany.com & Dave Marotti
00004  *
00005  * This program is free software; you can redistribute it and/or
00006  * modify it under the terms of the GNU General Public License
00007  * as published by the Free Software Foundation; either version 2
00008  * of the License, or (at your option) any later version.
00009  *
00010  * This program is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  * GNU General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU General Public License
00016  * along with this program; if not, write to the Free Software
00017  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
00018  */
00019 #include "kivio_common.h"
00020 #include "kivio_plugin_stencil_spawner.h"
00021 #include "kivio_sml_stencil_spawner.h"
00022 #include "kivio_dia_stencil_spawner.h"
00023 #include "kivio_py_stencil_spawner.h"
00024 #include "kivio_stencil_spawner.h"
00025 #include "kivio_stencil_spawner_set.h"
00026 
00027 #include <qdir.h>
00028 #include <qfile.h>
00029 #include <qstring.h>
00030 #include <kdebug.h>
00031 #include <kglobal.h>
00032 #include <klocale.h>
00033 
00034 KivioStencilSpawnerSet::KivioStencilSpawnerSet(const QString& name)
00035     : m_pSpawners(NULL),
00036       m_pSelected(NULL)
00037 {
00038   m_hidden = false;
00039   m_dir = "";
00040   m_name = name.isEmpty() ? QString("Untitled") : name;
00041 
00042   m_pSpawners = new QPtrList<KivioStencilSpawner>;
00043   m_pSpawners->setAutoDelete(true);
00044 }
00045 
00046 KivioStencilSpawnerSet::~KivioStencilSpawnerSet()
00047 {
00048   delete m_pSpawners;
00049   m_pSpawners = NULL;
00050   kdDebug(43000) << "KivioStencilSpawnerSet::~KivioStencilSpawnerSet() - " <<  m_name << endl;
00051 }
00052 
00053 
00063 bool KivioStencilSpawnerSet::loadXML( const QDomElement & )
00064 {
00065   return false;
00066 }
00067 
00068 
00079 QDomElement KivioStencilSpawnerSet::saveXML( QDomDocument &doc )
00080 {
00081   QDomElement spawnE = doc.createElement("KivioStencilSpawnerSet");
00082 
00083   XmlWriteString( spawnE, "id", m_id );
00084   XmlWriteString(spawnE, "hidden", (m_hidden ? "true" : "false"));
00085 
00086   KivioStencilSpawner *pSpawner = m_pSpawners->first();
00087   while( pSpawner )
00088   {
00089     spawnE.appendChild( pSpawner->saveXML( doc ) );
00090 
00091     pSpawner = m_pSpawners->next();
00092   }
00093 
00094 
00095   return spawnE;
00096 }
00097 
00098 bool KivioStencilSpawnerSet::loadDir( const QString &dirName )
00099 {
00100   QDir d(dirName);
00101   QString fileName;
00102 
00103   m_dir = dirName;
00104   m_name = readTitle( dirName );
00105   m_id = readId( dirName );
00106 
00107   d.setNameFilter("*.so *.sml *.ksp *.spy *.shape");
00108   m_files = d.entryList();
00109 
00110   return true;
00111 }
00112 
00113 KivioStencilSpawner* KivioStencilSpawnerSet::loadFile( const QString &fileName )
00114 {
00115     for (KivioStencilSpawner* ss = m_pSpawners->first(); ss; ss = m_pSpawners->next() )
00116         if (ss->fileName() == fileName)
00117             return ss;
00118 
00119     KivioStencilSpawner *pSpawner;
00120 
00121     if( fileName.contains( ".sml", false ) )
00122     {
00123         pSpawner = new KivioSMLStencilSpawner(this);
00124     }
00125     else if( fileName.contains( ".ksp", false ) )
00126     {
00127         pSpawner = new KivioPluginStencilSpawner(this);
00128     }
00129     else if( fileName.contains( ".so", false ) )
00130     {
00131         pSpawner = new KivioPluginStencilSpawner(this);
00132     }
00133     else if( fileName.contains( ".spy", false ) )
00134     {
00135         pSpawner = new KivioPyStencilSpawner(this);
00136     }
00137     else if( fileName.contains( ".shape", false ) )
00138     {
00139     pSpawner = new KivioDiaStencilSpawner(this);
00140     }
00141     else
00142     {
00143         return 0;
00144     }
00145 
00146     if( pSpawner->load( fileName )==true )
00147         m_pSpawners->append( pSpawner );
00148     else
00149     {
00150         delete pSpawner;
00151         return 0;
00152     }
00153 
00154     return pSpawner;
00155 }
00156 
00157 QString KivioStencilSpawnerSet::readTitle( const QString &dir )
00158 {
00159   QDomDocument d("StencilSPawnerSet");
00160   QDomElement root, nodeElement;
00161   QDomNode node;
00162   QString nodeName;
00163   QString title, origTitle;
00164   QFile f(dir+"/desc");
00165 
00166   if( f.open( IO_ReadOnly )==false )
00167   {
00168     kdDebug(43000) << "KivioStencilSpawnerSet::readTitle() - Error opening stencil set title: " <<
00169         dir << "/desc" << endl;
00170     return dir.right(dir.length() - dir.findRev('/')-1);
00171   }
00172 
00173   d.setContent(&f);
00174 
00175   root = d.documentElement();
00176   node = root.firstChild();
00177 
00178   while( !node.isNull() )
00179   {
00180     nodeName = node.nodeName();
00181     nodeElement = node.toElement();
00182 
00183     if( nodeName.compare("Title")==0 && nodeElement.hasAttribute("lang"))
00184     {
00185       if(nodeElement.attribute("lang") == KGlobal::locale()->language()) {
00186         title = XmlReadString( nodeElement, "data", dir );
00187       }
00188     }
00189     else if( nodeName.compare("Title")==0 && !nodeElement.hasAttribute("lang"))
00190     {
00191       origTitle = XmlReadString( nodeElement, "data", dir );
00192     }
00193 
00194     node = node.nextSibling();
00195   }
00196 
00197   if(title.isEmpty()) {
00198     title = i18n( "Stencils", origTitle.utf8() );
00199   }
00200 
00201   return title;
00202 }
00203 
00204 QString KivioStencilSpawnerSet::readId( const QString &dir )
00205 {
00206   QDomDocument d("StencilSPawnerSet");
00207   QDomElement root;
00208   QDomNode node;
00209   QString nodeName;
00210   QString theid;
00211   QFile f(dir+"/desc");
00212 
00213   if( f.open( IO_ReadOnly )==false )
00214   {
00215     kdDebug(43000) << "KivioStencilSpawnerSet::readId() - Error opening stencil set description: " <<
00216         dir << "/desc" << endl;
00217     return "";
00218   }
00219 
00220   d.setContent(&f);
00221 
00222   root = d.documentElement();
00223   node = root.firstChild();
00224 
00225   while( !node.isNull() )
00226   {
00227     nodeName = node.nodeName();
00228 
00229     if( nodeName.compare("Id")==0 )
00230     {
00231       theid = XmlReadString( node.toElement(), "data", dir );
00232       return theid;
00233     }
00234 
00235     node = node.nextSibling();
00236   }
00237 
00238   kdDebug(43000) << "KivioStencilSpawnerSet::readId() - No id found in "
00239   << dir << "/desc" << endl;
00240 
00241   return "";
00242 }
00243 
00244 QString KivioStencilSpawnerSet::readDescription(const QString& dir)
00245 {
00246   QDomDocument d("StencilSPawnerSet");
00247   QDomElement root, nodeElement;
00248   QDomNode node;
00249   QString nodeName;
00250   QFile f(dir + "/desc");
00251 
00252   if( f.open( IO_ReadOnly )==false )
00253   {
00254     kdDebug(43000) << "KivioStencilSpawnerSet::readId() - Error opening stencil set description: " <<
00255       dir << "/desc" << endl;
00256     return "";
00257   }
00258 
00259   d.setContent(&f);
00260 
00261   root = d.documentElement();
00262   node = root.firstChild();
00263   QString description, origDesc;
00264 
00265   while( !node.isNull() )
00266   {
00267     nodeName = node.nodeName();
00268     nodeElement = node.toElement();
00269 
00270     if( nodeName.compare("Description")==0 && nodeElement.hasAttribute("lang"))
00271     {
00272       if(nodeElement.attribute("lang") == KGlobal::locale()->language()) {
00273         description = nodeElement.text();
00274       }
00275     }
00276     else if( nodeName.compare("Description")==0 && !nodeElement.hasAttribute("lang"))
00277     {
00278       origDesc = nodeElement.text();
00279     }
00280 
00281     node = node.nextSibling();
00282   }
00283 
00284   if(description.isEmpty() && !origDesc.isEmpty()) {
00285     description = i18n( "Stencils", origDesc.utf8() );
00286   }
00287 
00288   return description;
00289 }
00290 
00291 
00292 KivioStencilSpawner* KivioStencilSpawnerSet::find( const QString& id)
00293 {
00294   if(!m_pSpawners || m_pSpawners->isEmpty()) {
00295     return 0;
00296   }
00297 
00298   KivioStencilSpawner* pSpawner = m_pSpawners->first();
00299 
00300   while( pSpawner )
00301   {
00302       // If the id matches, this is it!
00303       if( pSpawner->info()->id() == id )
00304       {
00305           return pSpawner;
00306       }
00307 
00308       pSpawner = m_pSpawners->next();
00309   }
00310 
00311   return NULL;
00312 }
00313 
00314 void KivioStencilSpawnerSet::addSpawner(KivioStencilSpawner* spawner)
00315 {
00316   if(spawner) {
00317     m_pSpawners->append(spawner);
00318   }
00319 }
KDE Home | KDE Accessibility Home | Description of Access Keys