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.3.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Sep 28 04:04:02 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003