/* This file is part of the KDE project Copyright (C) 2004 Joseph Wenninger This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License version 2 as published by the Free Software Foundation. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "katesavemodifieddialog.h" #include "katesavemodifieddialog.moc" #include #include #include #include #include #include #include #include #include #include #include #include #include #include class AbstractKateSaveModifiedDialogCheckListItem:public TQCheckListItem { public: AbstractKateSaveModifiedDialogCheckListItem(TQListViewItem *parent,const TQString& title, const TQString& url):TQCheckListItem(parent,title,TQCheckListItem::CheckBox) { setText(1,url); setOn(true); setState(InitialState); } virtual ~AbstractKateSaveModifiedDialogCheckListItem() { } virtual bool synchronousSave(TQWidget *dialogParent)=0; enum STATE{InitialState,SaveOKState,SaveFailedState}; STATE state() const { return m_state;} void setState(enum STATE state) { m_state=state; KIconLoader *loader = KGlobal::instance()->iconLoader(); switch (state) { case InitialState: setPixmap(0,TQPixmap()); break; case SaveOKState: setPixmap(0,loader->loadIcon("ok",KIcon::NoGroup,height())); break; case SaveFailedState: setPixmap(0,loader->loadIcon("cancel",KIcon::NoGroup,height())); break; } } private: STATE m_state; }; class KateSaveModifiedDocumentCheckListItem:public AbstractKateSaveModifiedDialogCheckListItem { public: KateSaveModifiedDocumentCheckListItem(TQListViewItem *parent,Kate::Document *document):AbstractKateSaveModifiedDialogCheckListItem(parent,document->docName(),document->url().prettyURL()){ m_document=document; } virtual ~KateSaveModifiedDocumentCheckListItem() { } virtual bool synchronousSave(TQWidget *dialogParent) { if (m_document->url().isEmpty() ) { KEncodingFileDialog::Result r=KEncodingFileDialog::getSaveURLAndEncoding( KTextEditor::encodingInterface(m_document)->encoding(),TQString::null,TQString::null,dialogParent,i18n("Save As (%1)").arg(m_document->docName())); m_document->setEncoding( r.encoding ); if (!r.URLs.isEmpty()) { KURL tmp = r.URLs.first(); if ( !m_document->saveAs( tmp ) ) { setState(SaveFailedState); setText(1,m_document->url().prettyURL()); return false; } else { bool sc=m_document->waitSaveComplete(); setText(1,m_document->url().prettyURL()); if (!sc) { setState(SaveFailedState); return false; } else { setState(SaveOKState); return true; } } } else { setState(SaveFailedState); return false; } } else { //document has an exising location if ( !m_document->save() ) { setState(SaveFailedState); setText(1,m_document->url().prettyURL()); return false; } else { bool sc=m_document->waitSaveComplete(); setText(1,m_document->url().prettyURL()); if (!sc) { setState(SaveFailedState); return false; } else { setState(SaveOKState); return true; } } } return false; } private: Kate::Document *m_document; }; KateSaveModifiedDialog::KateSaveModifiedDialog(TQWidget *parent, TQPtrList documents): KDialogBase( parent, "KateSaveModifiedDialog", true, i18n("Save Documents"), Yes | No | Cancel) { KGuiItem saveItem=KStdGuiItem::save(); saveItem.setText(i18n("&Save Selected")); setButtonGuiItem(KDialogBase::Yes,saveItem); setButtonGuiItem(KDialogBase::No,KStdGuiItem::dontSave()); KGuiItem cancelItem=KStdGuiItem::cancel(); cancelItem.setText(i18n("&Abort Closing")); setButtonGuiItem(KDialogBase::Cancel,cancelItem); TQVBox *box=makeVBoxMainWidget(); new KActiveLabel(i18n("The following documents have been modified. Do you want to save them before closing?"),box); m_list=new KListView(box); m_list->addColumn(i18n("Title")); m_list->addColumn(i18n("Location")); m_list->setRootIsDecorated(true); m_list->setResizeMode(TQListView::LastColumn); if (0) { m_projectRoot=new TQListViewItem(m_list,i18n("Projects")); } else m_projectRoot=0; if (documents.count()>0) { m_documentRoot=new TQListViewItem(m_list,i18n("Documents")); const uint docCnt=documents.count(); for (uint i=0;isetOpen(true); } else m_documentRoot=0; //FIXME - Is this the best way? connect(m_list, TQT_SIGNAL(clicked(TQListViewItem *)), TQT_SLOT(slotItemSelected())); connect(m_list, TQT_SIGNAL(doubleClicked(TQListViewItem *)), TQT_SLOT(slotItemSelected())); connect(m_list, TQT_SIGNAL(spacePressed(TQListViewItem *)), TQT_SLOT(slotItemSelected())); if(documents.count()>3) { //For 3 or less, it would be quicker just to tick or untick them yourself, so don't clutter the gui. connect(new TQPushButton(i18n("Se&lect All"),box),TQT_SIGNAL(clicked()),this,TQT_SLOT(slotSelectAll())); } } KateSaveModifiedDialog::~KateSaveModifiedDialog() { } void KateSaveModifiedDialog::slotItemSelected() { kdDebug(13001) << "slotItemSelected()" << endl; for(TQListViewItem *it=m_documentRoot->firstChild();it;it=it->nextSibling()) { if(((TQCheckListItem*)it)->isOn()) { enableButton(KDialogBase::Yes, true); return; } } enableButton(KDialogBase::Yes, false); } static void selectItems(TQListViewItem *root) { if (!root) return; for (TQListViewItem *it=root->firstChild();it;it=it->nextSibling()) { ((TQCheckListItem*)it)->setOn(true); } } void KateSaveModifiedDialog::slotSelectAll() { selectItems(m_documentRoot); slotItemSelected(); } void KateSaveModifiedDialog::slotUser2() { kdDebug(13001)<<"KateSaveModifiedDialog::slotYes()"<firstChild();it;it=it->nextSibling()) { AbstractKateSaveModifiedDialogCheckListItem *cit= (AbstractKateSaveModifiedDialogCheckListItem*)it; if (cit->isOn() && (cit->state()!=AbstractKateSaveModifiedDialogCheckListItem::SaveOKState)) { if (!cit->synchronousSave(this /*perhaps that should be the kate mainwindow*/)) { KMessageBox::sorry( this, i18n("Data you requested to be saved could not be written. Please choose how you want to proceed.")); return false; } } else if ((!cit->isOn()) && (cit->state()==AbstractKateSaveModifiedDialogCheckListItem::SaveFailedState)) { cit->setState(AbstractKateSaveModifiedDialogCheckListItem::InitialState); } } } return true; } bool KateSaveModifiedDialog::queryClose(TQWidget *parent,TQPtrList documents) { KateSaveModifiedDialog d(parent,documents); return (d.exec()!=TQDialog::Rejected); }