lib Library API Documentation

koTemplateCreateDia.cc

00001 /*
00002    This file is part of the KDE project
00003    Copyright (C) 1998, 1999 Reginald Stadlbauer <reggie@kde.org>
00004                  2000 Werner Trobin <trobin@kde.org>
00005    Copyright (C) 2004 Nicolas GOUTTE <goutte@kde.org>
00006 
00007    This library is free software; you can redistribute it and/or
00008    modify it under the terms of the GNU Library General Public
00009    License as published by the Free Software Foundation; either
00010    version 2 of the License, or (at your option) any later version.
00011 
00012    This library is distributed in the hope that it will be useful,
00013    but WITHOUT ANY WARRANTY; without even the implied warranty of
00014    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015    Library General Public License for more details.
00016 
00017    You should have received a copy of the GNU Library General Public License
00018    along with this library; see the file COPYING.LIB.  If not, write to
00019    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00020    Boston, MA 02111-1307, USA.
00021 */
00022 
00023 #include <koTemplateCreateDia.h>
00024 
00025 #include <qlayout.h>
00026 #include <qlabel.h>
00027 #include <qgroupbox.h>
00028 #include <qradiobutton.h>
00029 #include <qpushbutton.h>
00030 #include <qheader.h>
00031 
00032 #include <ktempfile.h>
00033 #include <klineedit.h>
00034 #include <klistview.h>
00035 #include <klocale.h>
00036 #include <koTemplates.h>
00037 #include <kfiledialog.h>
00038 #include <klineeditdlg.h>
00039 #include <kmessagebox.h>
00040 #include <kimageio.h>
00041 #include <kstandarddirs.h>
00042 #include <kdebug.h>
00043 #include <kio/netaccess.h>
00044 
00045 #include <stdlib.h>
00046 #include <kinstance.h>
00047 
00048 
00049 class KoTemplateCreateDiaPrivate {
00050 public:
00051     KoTemplateCreateDiaPrivate()
00052     : m_tempFile( QString::null, ".png" )
00053     {
00054         m_tree=0L;
00055         m_name=0L;
00056         m_default=0L;
00057         m_custom=0L;
00058         m_select=0L;
00059         m_preview=0L;
00060         m_groups=0L;
00061         m_add=0L;
00062         m_remove=0L;
00063         m_tempFile.setAutoDelete( true );
00064     }
00065     ~KoTemplateCreateDiaPrivate() {
00066         delete m_tree;
00067     }
00068 
00069     KoTemplateTree *m_tree;
00070     KLineEdit *m_name;
00071     QRadioButton *m_default, *m_custom;
00072     QPushButton *m_select;
00073     QLabel *m_preview;
00074     QString m_customFile;
00075     QPixmap m_customPixmap;
00076     KListView *m_groups;
00077     QPushButton *m_add, *m_remove;
00078     bool m_changed;
00079     KTempFile m_tempFile;
00080 };
00081 
00082 
00083 /****************************************************************************
00084  *
00085  * Class: koTemplateCreateDia
00086  *
00087  ****************************************************************************/
00088 
00089 KoTemplateCreateDia::KoTemplateCreateDia( const QCString &templateType, KInstance *instance,
00090                                           const QString &file, const QPixmap &pix, QWidget *parent ) :
00091     KDialogBase( parent, "template create dia", true, i18n( "Create Template" ),
00092                  KDialogBase::Ok | KDialogBase::Cancel, KDialogBase::Ok ), m_file(file), m_pixmap(pix) {
00093 
00094     d=new KoTemplateCreateDiaPrivate();
00095 
00096     QFrame *mainwidget=makeMainWidget();
00097     QHBoxLayout *mbox=new QHBoxLayout(mainwidget, KDialogBase::marginHint(),
00098                                       KDialogBase::spacingHint());
00099     QVBoxLayout *leftbox=new QVBoxLayout(mbox);
00100 
00101     QLabel *label=new QLabel(i18n("Name:"), mainwidget);
00102     leftbox->addSpacing(label->fontMetrics().height()/2);
00103     QHBoxLayout *namefield=new QHBoxLayout(leftbox);
00104     namefield->addWidget(label);
00105     d->m_name=new KLineEdit(mainwidget);
00106     d->m_name->setFocus();
00107     connect(d->m_name, SIGNAL(textChanged(const QString &)),
00108             this, SLOT(slotNameChanged(const QString &)));
00109     namefield->addWidget(d->m_name);
00110 
00111     label=new QLabel(i18n("Group:"), mainwidget);
00112     leftbox->addWidget(label);
00113     d->m_groups=new KListView(mainwidget);
00114     leftbox->addWidget(d->m_groups);
00115     d->m_groups->addColumn("");
00116     d->m_groups->header()->hide();
00117     d->m_groups->setRootIsDecorated(true);
00118     d->m_groups->setSorting(0);
00119 
00120     d->m_tree=new KoTemplateTree(templateType, instance, true);
00121     fillGroupTree();
00122     d->m_groups->sort();
00123 
00124     QHBoxLayout *bbox=new QHBoxLayout(leftbox);
00125     d->m_add=new QPushButton(i18n("&Add Group..."), mainwidget);
00126     connect(d->m_add, SIGNAL(clicked()), this, SLOT(slotAddGroup()));
00127     bbox->addWidget(d->m_add);
00128     d->m_remove=new QPushButton(i18n("&Remove"), mainwidget);
00129     connect(d->m_remove, SIGNAL(clicked()), this, SLOT(slotRemove()));
00130     bbox->addWidget(d->m_remove);
00131 
00132     QVBoxLayout *rightbox=new QVBoxLayout(mbox);
00133     QGroupBox *pixbox=new QGroupBox(i18n("Picture"), mainwidget);
00134     rightbox->addWidget(pixbox);
00135     QVBoxLayout *pixlayout=new QVBoxLayout(pixbox, KDialogBase::marginHint(),
00136                                            KDialogBase::spacingHint());
00137     pixlayout->addSpacing(pixbox->fontMetrics().height()/2);
00138     pixlayout->addStretch(1);
00139     d->m_default=new QRadioButton(i18n("&Default"), pixbox);
00140     d->m_default->setChecked(true);
00141     connect(d->m_default, SIGNAL(clicked()), this, SLOT(slotDefault()));
00142     pixlayout->addWidget(d->m_default);
00143     QHBoxLayout *custombox=new QHBoxLayout(pixlayout);
00144     d->m_custom=new QRadioButton(i18n("Custom"), pixbox);
00145     d->m_custom->setChecked(false);
00146     connect(d->m_custom, SIGNAL(clicked()), this, SLOT(slotCustom()));
00147     custombox->addWidget(d->m_custom);
00148     d->m_select=new QPushButton(i18n("&Select..."), pixbox);
00149     connect(d->m_select, SIGNAL(clicked()), this, SLOT(slotSelect()));
00150     custombox->addWidget(d->m_select, 1);
00151     custombox->addStretch(1);
00152     pixlayout->addStretch(1);
00153     label=new QLabel(i18n("Preview:"), pixbox);
00154     pixlayout->addWidget(label);
00155     QHBoxLayout *previewbox=new QHBoxLayout(pixlayout);
00156     previewbox->addStretch(10);
00157     d->m_preview=new QLabel(pixbox); // setPixmap() -> auto resize?
00158     previewbox->addWidget(d->m_preview);
00159     previewbox->addStretch(10);
00160     pixlayout->addStretch(8);
00161 
00162     enableButtonOK(false);
00163     d->m_changed=false;
00164     updatePixmap();
00165 
00166     connect(d->m_groups,SIGNAL( selectionChanged()),this,SLOT(slotSelectionChanged()));
00167 
00168     d->m_remove->setEnabled(d->m_groups->currentItem());
00169 }
00170 
00171 KoTemplateCreateDia::~KoTemplateCreateDia() {
00172     delete d;
00173 }
00174 
00175 void KoTemplateCreateDia::slotSelectionChanged()
00176 {
00177     const QListViewItem* item = d->m_groups->currentItem();
00178     d->m_remove->setEnabled( item );
00179     if ( ! item )
00180         return;
00181     
00182     if ( item->depth() > 0 )
00183         d->m_name->setText( item->text( 0 ) );
00184 }
00185 
00186 void KoTemplateCreateDia::createTemplate( const QCString &templateType, KInstance *instance,
00187                                           const QString &file, const QPixmap &pix, QWidget *parent ) {
00188 
00189     KoTemplateCreateDia *dia = new KoTemplateCreateDia( templateType, instance, file, pix, parent );
00190     dia->exec();
00191     delete dia;
00192 }
00193 
00194 void KoTemplateCreateDia::slotOk() {
00195 
00196     // get the current item, if there is one...
00197     QListViewItem *item=d->m_groups->currentItem();
00198     if(!item)
00199         item=d->m_groups->firstChild();
00200     if(!item) {    // safe :)
00201         d->m_tree->writeTemplateTree();
00202         KDialogBase::slotCancel();
00203         return;
00204     }
00205     // is it a group or a template? anyway - get the group :)
00206     if(item->depth()!=0)
00207         item=item->parent();
00208     if(!item) {    // *very* safe :P
00209         d->m_tree->writeTemplateTree();
00210         KDialogBase::slotCancel();
00211         return;
00212     }
00213 
00214     KoTemplateGroup *group=d->m_tree->find(item->text(0));
00215     if(!group) {    // even safer
00216         d->m_tree->writeTemplateTree();
00217         KDialogBase::slotCancel();
00218         return;
00219     }
00220 
00221     if(d->m_name->text().isEmpty()) {
00222         d->m_tree->writeTemplateTree();
00223         KDialogBase::slotCancel();
00224         return;
00225     }
00226 
00227     // copy the tmp file and the picture the app provides
00228     QString dir=d->m_tree->instance()->dirs()->saveLocation(d->m_tree->templateType());
00229     dir+=KoTemplates::stripWhiteSpace(group->name());
00230     QString templateDir=dir+"/.source/";
00231     QString iconDir=dir+"/.icon/";
00232 
00233     QString file=KoTemplates::stripWhiteSpace(d->m_name->text());
00234     QString tmpIcon=".icon/"+file;
00235     tmpIcon+=".png";
00236     QString icon=iconDir+file;
00237     icon+=".png";
00238 
00239     // try to find the extension for the template file :P
00240     unsigned int k=0;
00241     unsigned int foo=m_file.length();
00242     while(m_file[foo-k]!=QChar('.') && k<=foo) {
00243         ++k;
00244     }
00245     if(k<foo)
00246         file+=m_file.right(k);
00247 
00248     KoTemplate *t=new KoTemplate(d->m_name->text(), QString::null, ".source/"+file, tmpIcon, false, true);
00249     if(!group->add(t)) {
00250         KoTemplate *existingTemplate=group->find(t->name());
00251         // if the original template is hidden, we simply force the update >:->
00252         if(existingTemplate && existingTemplate->isHidden())
00253             group->add(t, true);
00254         // Otherwise ask the user
00255         else if(existingTemplate && !existingTemplate->isHidden()) {
00256             if(KMessageBox::warningYesNo(this, i18n("Do you really want to overwrite"
00257                                                     " the existing '%1' template?").
00258                                          arg(existingTemplate->name()))==KMessageBox::Yes)
00259                 group->add(t, true);
00260             else
00261             {
00262                 delete t;
00263                 return;
00264             }
00265         }
00266     }
00267 
00268     if(!KStandardDirs::makeDir(templateDir) || !KStandardDirs::makeDir(iconDir)) {
00269         d->m_tree->writeTemplateTree();
00270         KDialogBase::slotCancel();
00271         return;
00272     }
00273 
00274     // copy the template file
00275     KURL dest;
00276     dest.setPath(templateDir+file);
00277     KIO::NetAccess::del( dest );
00278     KIO::NetAccess::copy(m_file, dest);
00279 
00280     // if there's a .directory file, we copy this one, too
00281     bool ready=false;
00282     QStringList tmp=group->dirs();
00283     for(QStringList::ConstIterator it=tmp.begin(); it!=tmp.end() && !ready; ++it) {
00284         if((*it).contains(dir)==0) {
00285             QString f=(*it)+".directory";
00286             QFileInfo info(f);
00287             if(info.exists()) {
00288                 dest.setPath( dir+"/.directory" );
00289                 KIO::NetAccess::del( dest );
00290                 KIO::NetAccess::copy( f, dest );
00291                 ready=true;
00292             }
00293         }
00294     }
00295     // save the picture
00296     if(d->m_default->isChecked() && !m_pixmap.isNull())
00297         m_pixmap.save(icon, "PNG");
00298     else if(!d->m_customPixmap.isNull())
00299         d->m_customPixmap.save(icon, "PNG");
00300     else
00301         kdWarning(30004) << "Could not save the preview picture!" << endl;
00302 
00303     d->m_tree->writeTemplateTree();
00304     KDialogBase::slotOk();
00305 }
00306 
00307 void KoTemplateCreateDia::slotDefault() {
00308 
00309     d->m_default->setChecked(true);
00310     d->m_custom->setChecked(false);
00311     updatePixmap();
00312 }
00313 
00314 void KoTemplateCreateDia::slotCustom() {
00315 
00316     d->m_default->setChecked(false);
00317     d->m_custom->setChecked(true);
00318     if(d->m_customFile.isEmpty())
00319         slotSelect();
00320     else
00321         updatePixmap();
00322 }
00323 
00324 void KoTemplateCreateDia::slotSelect() {
00325 
00326     d->m_default->setChecked(false);
00327     d->m_custom->setChecked(true);
00328 
00329     KFileDialog fd(QString::null, KImageIO::pattern(KImageIO::Reading), 0, 0, true);
00330     fd.setCaption(i18n("Select Picture"));
00331     KURL url;
00332     if (fd.exec()==QDialog::Accepted)
00333         url=fd.selectedURL();
00334 
00335     if(url.isEmpty()) {
00336         if(d->m_customFile.isEmpty()) {
00337             d->m_default->setChecked(true);
00338             d->m_custom->setChecked(false);
00339         }
00340         return;
00341     }
00342 
00343     if ( url.isLocalFile() )
00344     {
00345         d->m_customFile = url.path();
00346     }
00347     else
00348     {
00349         QString target ( d->m_tempFile.name() );
00350         if ( KIO::NetAccess::download( url, target ) )
00351         {
00352             d->m_customFile = target;
00353         }
00354         else
00355         {
00356             KMessageBox::sorry( 0L, i18n( "Could not open\n%1" ).arg( url.prettyURL() ) );
00357             return;
00358         }
00359     }
00360     
00361     d->m_customPixmap=QPixmap();
00362     updatePixmap();
00363 }
00364 
00365 void KoTemplateCreateDia::slotNameChanged(const QString &name) {
00366 
00367     if((name.isEmpty() || !d->m_groups->firstChild()) && !d->m_changed)
00368         enableButtonOK(false);
00369     else
00370         enableButtonOK(true);
00371 }
00372 
00373 void KoTemplateCreateDia::slotAddGroup() {
00374     bool ok=false;
00375     QString name=KLineEditDlg::getText( i18n("Add Group"),i18n("Enter group name:"),QString::null, &ok, this );
00376     if(!ok)
00377         return;
00378     KoTemplateGroup *group=d->m_tree->find(name);
00379     if(group && !group->isHidden())
00380         return;
00381 
00382     QString dir=d->m_tree->instance()->dirs()->saveLocation(d->m_tree->templateType());
00383     dir+=name;
00384     KoTemplateGroup *newGroup=new KoTemplateGroup(name, dir, true);
00385     d->m_tree->add(newGroup);
00386     QListViewItem *item=new QListViewItem(d->m_groups, name);
00387     d->m_groups->setCurrentItem(item);
00388     d->m_groups->sort();
00389     d->m_name->setFocus();
00390     enableButtonOK(true);
00391     d->m_changed=true;
00392 }
00393 
00394 void KoTemplateCreateDia::slotRemove() {
00395 
00396     QListViewItem *item=d->m_groups->currentItem();
00397     if(!item)
00398         return;
00399 
00400     QString what;
00401         QString removed;
00402         if (item->depth()==0) {
00403                 what =  i18n("Do you really want to remove that group?");
00404                 removed = i18n("Remove Group");
00405         } else {
00406                 what =  i18n("Do you really want to remove that template?");
00407         removed = i18n("Remove Template");
00408         }
00409 
00410     if(KMessageBox::warningYesNo(this, what,
00411                                  removed)==KMessageBox::No) {
00412         d->m_name->setFocus();
00413         return;
00414     }
00415 
00416     if(item->depth()==0) {
00417         KoTemplateGroup *group=d->m_tree->find(item->text(0));
00418         if(group)
00419             group->setHidden(true);
00420     }
00421     else {
00422         bool done=false;
00423         for(KoTemplateGroup *g=d->m_tree->first(); g!=0L && !done; g=d->m_tree->next()) {
00424             KoTemplate *t=g->find(item->text(0));
00425             if(t) {
00426                 t->setHidden(true);
00427                 done=true;
00428             }
00429         }
00430     }
00431     delete item;
00432     item=0L;
00433     enableButtonOK(true);
00434     d->m_name->setFocus();
00435     d->m_changed=true;
00436 }
00437 
00438 void KoTemplateCreateDia::updatePixmap() {
00439 
00440     if(d->m_default->isChecked() && !m_pixmap.isNull())
00441         d->m_preview->setPixmap(m_pixmap);
00442     else if(d->m_custom->isChecked() && !d->m_customFile.isEmpty()) {
00443         if(d->m_customPixmap.isNull()) {
00444             // use the code in KoTemplate to load the image... hacky, I know :)
00445             KoTemplate t("foo", "bar", QString::null, d->m_customFile);
00446             d->m_customPixmap=t.loadPicture();
00447         }
00448         if(!d->m_customPixmap.isNull())
00449             d->m_preview->setPixmap(d->m_customPixmap);
00450         else
00451             d->m_preview->setText(i18n("Could not load picture."));
00452     }
00453     else
00454         d->m_preview->setText(i18n("No picture available."));
00455 }
00456 
00457 void KoTemplateCreateDia::fillGroupTree() {
00458 
00459     for(KoTemplateGroup *group=d->m_tree->first(); group!=0L; group=d->m_tree->next()) {
00460         if(group->isHidden())
00461             continue;
00462         QListViewItem *groupItem=new QListViewItem(d->m_groups, group->name());
00463         for(KoTemplate *t=group->first(); t!=0L; t=group->next()) {
00464             if(t->isHidden())
00465                 continue;
00466             (void)new QListViewItem(groupItem, t->name());
00467         }
00468     }
00469 }
00470 
00471 #include <koTemplateCreateDia.moc>
KDE Logo
This file is part of the documentation for lib Library Version 1.3.5.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sun Mar 20 14:25:27 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003