00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "katesavemodifieddialog.h"
00020 #include "katesavemodifieddialog.moc"
00021
00022 #include <klocale.h>
00023 #include <qlistview.h>
00024 #include <klistview.h>
00025 #include <kguiitem.h>
00026 #include <kactivelabel.h>
00027 #include <kstdguiitem.h>
00028 #include <qvbox.h>
00029 #include <qlabel.h>
00030 #include <qpushbutton.h>
00031 #include <kiconloader.h>
00032 #include <kmessagebox.h>
00033 #include <kdebug.h>
00034 #include <kencodingfiledialog.h>
00035 #include <ktexteditor/encodinginterface.h>
00036
00037 class AbstractKateSaveModifiedDialogCheckListItem:public QCheckListItem {
00038 public:
00039 AbstractKateSaveModifiedDialogCheckListItem(QListViewItem *parent,const QString& title, const QString& url):QCheckListItem(parent,title,QCheckListItem::CheckBox) {
00040 setText(1,url);
00041 setOn(true);
00042 setState(InitialState);
00043 }
00044 virtual ~AbstractKateSaveModifiedDialogCheckListItem() {
00045 }
00046 virtual bool synchronousSave(QWidget *dialogParent)=0;
00047 enum STATE{InitialState,SaveOKState,SaveFailedState};
00048 STATE state() const { return m_state;}
00049 void setState(enum STATE state) {
00050 m_state=state;
00051 KIconLoader *loader = KGlobal::instance()->iconLoader();
00052 switch (state) {
00053 case InitialState:
00054 setPixmap(0,QPixmap());
00055 break;
00056 case SaveOKState:
00057 setPixmap(0,loader->loadIcon("ok",KIcon::NoGroup,height()));
00058 break;
00059 case SaveFailedState:
00060 setPixmap(0,loader->loadIcon("cancel",KIcon::NoGroup,height()));
00061 break;
00062 }
00063 }
00064 private:
00065 STATE m_state;
00066 };
00067
00068 class KateSaveModifiedDocumentCheckListItem:public AbstractKateSaveModifiedDialogCheckListItem {
00069 public:
00070 KateSaveModifiedDocumentCheckListItem(QListViewItem *parent,Kate::Document *document):AbstractKateSaveModifiedDialogCheckListItem(parent,document->docName(),document->url().prettyURL()){
00071 m_document=document;
00072 }
00073 virtual ~KateSaveModifiedDocumentCheckListItem() {
00074 }
00075 virtual bool synchronousSave(QWidget *dialogParent) {
00076 if (m_document->url().isEmpty() ) {
00077 KEncodingFileDialog::Result r=KEncodingFileDialog::getSaveURLAndEncoding(
00078 KTextEditor::encodingInterface(m_document)->encoding(),QString::null,QString::null,dialogParent,i18n("Save As (%1)").arg(m_document->docName()));
00079
00080 m_document->setEncoding( r.encoding );
00081 if (!r.URLs.isEmpty()) {
00082 KURL tmp = r.URLs.first();
00083 if ( !m_document->saveAs( tmp ) ) {
00084 setState(SaveFailedState);
00085 setText(1,m_document->url().prettyURL());
00086 return false;
00087 } else {
00088 bool sc=m_document->waitSaveComplete();
00089 setText(1,m_document->url().prettyURL());
00090 if (!sc) {
00091 setState(SaveFailedState);
00092 return false;
00093 } else {
00094 setState(SaveOKState);
00095 return true;
00096 }
00097 }
00098 } else {
00099 setState(SaveFailedState);
00100 return false;
00101 }
00102 } else {
00103 if ( !m_document->save() ) {
00104 setState(SaveFailedState);
00105 setText(1,m_document->url().prettyURL());
00106 return false;
00107 } else {
00108 bool sc=m_document->waitSaveComplete();
00109 setText(1,m_document->url().prettyURL());
00110 if (!sc) {
00111 setState(SaveFailedState);
00112 return false;
00113 } else {
00114 setState(SaveOKState);
00115 return true;
00116 }
00117 }
00118
00119 }
00120
00121 return false;
00122
00123 }
00124 private:
00125 Kate::Document *m_document;
00126 };
00127
00128 KateSaveModifiedDialog::KateSaveModifiedDialog(QWidget *parent, QPtrList<Kate::Document> documents):
00129 KDialogBase( parent, "KateSaveModifiedDialog", true, i18n("Save Documents"), Yes | No | Cancel) {
00130
00131 KGuiItem saveItem=KStdGuiItem::save();
00132 saveItem.setText(i18n("&Save Selected"));
00133 setButtonGuiItem(KDialogBase::Yes,saveItem);
00134
00135 setButtonGuiItem(KDialogBase::No,KStdGuiItem::dontSave());
00136
00137 KGuiItem cancelItem=KStdGuiItem::cancel();
00138 cancelItem.setText(i18n("&Abort Closing"));
00139 setButtonGuiItem(KDialogBase::Cancel,cancelItem);
00140
00141 QVBox *box=makeVBoxMainWidget();
00142 new KActiveLabel(i18n("<qt>The following documents have been modified. Do you want to save them before closing?</qt>"),box);
00143 m_list=new KListView(box);
00144 m_list->addColumn(i18n("Title"));
00145 m_list->addColumn(i18n("Location"));
00146 m_list->setRootIsDecorated(true);
00147 m_list->setResizeMode(QListView::LastColumn);
00148 if (0) {
00149 m_projectRoot=new QListViewItem(m_list,i18n("Projects"));
00150 } else m_projectRoot=0;
00151 if (documents.count()>0) {
00152 m_documentRoot=new QListViewItem(m_list,i18n("Documents"));
00153 const uint docCnt=documents.count();
00154 for (uint i=0;i<docCnt;i++) {
00155 new KateSaveModifiedDocumentCheckListItem(m_documentRoot,documents.at(i));
00156 }
00157 m_documentRoot->setOpen(true);
00158 } else m_documentRoot=0;
00159
00160 connect(m_list, SIGNAL(clicked(QListViewItem *)), SLOT(slotItemSelected()));
00161 connect(m_list, SIGNAL(doubleClicked(QListViewItem *)), SLOT(slotItemSelected()));
00162 connect(m_list, SIGNAL(spacePressed(QListViewItem *)), SLOT(slotItemSelected()));
00163 if(documents.count()>3) {
00164 connect(new QPushButton(i18n("Se&lect All"),box),SIGNAL(clicked()),this,SLOT(slotSelectAll()));
00165 }
00166 }
00167
00168 KateSaveModifiedDialog::~KateSaveModifiedDialog() {
00169 }
00170
00171 void KateSaveModifiedDialog::slotItemSelected() {
00172 kdDebug(13001) << "slotItemSelected()" << endl;
00173
00174 for(QListViewItem *it=m_documentRoot->firstChild();it;it=it->nextSibling()) {
00175 if(((QCheckListItem*)it)->isOn()) {
00176 enableButton(KDialogBase::Yes, true);
00177 return;
00178 }
00179 }
00180 enableButton(KDialogBase::Yes, false);
00181 }
00182
00183 static void selectItems(QListViewItem *root) {
00184 if (!root) return;
00185 for (QListViewItem *it=root->firstChild();it;it=it->nextSibling()) {
00186 ((QCheckListItem*)it)->setOn(true);
00187 }
00188 }
00189
00190 void KateSaveModifiedDialog::slotSelectAll() {
00191 selectItems(m_documentRoot);
00192 slotItemSelected();
00193 }
00194
00195
00196 void KateSaveModifiedDialog::slotUser2() {
00197 kdDebug(13001)<<"KateSaveModifiedDialog::slotYes()"<<endl;
00198 if (doSave(m_documentRoot)) done(QDialog::Accepted);
00199 }
00200
00201 void KateSaveModifiedDialog::slotUser1() {
00202 done(QDialog::Accepted);
00203 }
00204
00205 bool KateSaveModifiedDialog::doSave(QListViewItem *root) {
00206 if (root) {
00207 for (QListViewItem *it=root->firstChild();it;it=it->nextSibling()) {
00208 AbstractKateSaveModifiedDialogCheckListItem *cit= (AbstractKateSaveModifiedDialogCheckListItem*)it;
00209 if (cit->isOn() && (cit->state()!=AbstractKateSaveModifiedDialogCheckListItem::SaveOKState)) {
00210 if (!cit->synchronousSave(this )) {
00211 KMessageBox::sorry( this, i18n("Data you requested to be saved could not be written. Please choose how you want to proceed."));
00212 return false;
00213 }
00214 } else if ((!cit->isOn()) && (cit->state()==AbstractKateSaveModifiedDialogCheckListItem::SaveFailedState)) {
00215 cit->setState(AbstractKateSaveModifiedDialogCheckListItem::InitialState);
00216 }
00217
00218 }
00219 }
00220 return true;
00221 }
00222
00223 bool KateSaveModifiedDialog::queryClose(QWidget *parent,QPtrList<Kate::Document> documents) {
00224 KateSaveModifiedDialog d(parent,documents);
00225 return (d.exec()!=QDialog::Rejected);
00226 }