19 #include "katesession.h"
20 #include "katesession.moc"
23 #include "katemainwindow.h"
24 #include "katedocmanager.h"
26 #include <kstandarddirs.h>
27 #include <tdelocale.h>
29 #include <kdirwatch.h>
30 #include <tdelistview.h>
31 #include <kinputdialog.h>
32 #include <kiconloader.h>
33 #include <tdemessagebox.h>
35 #include <kstdguiitem.h>
36 #include <kpushbutton.h>
37 #include <tdepopupmenu.h>
44 #include <tqcheckbox.h>
45 #include <tqdatetime.h>
51 bool operator<(
const KateSession::Ptr& a,
const KateSession::Ptr& b )
53 return a->sessionName().lower() < b->sessionName().lower();
56 KateSession::KateSession (KateSessionManager *manager,
const TQString &fileName,
const TQString &name)
57 : m_sessionFileRel (fileName)
58 , m_sessionName (name)
67 void KateSession::init ()
70 if (!m_sessionFileRel.isEmpty() && TDEGlobal::dirs()->exists(sessionFile ()))
72 KSimpleConfig config (sessionFile (),
true);
74 if (m_sessionName.isEmpty())
77 if (m_sessionFileRel ==
"default.katesession")
78 m_sessionName = i18n(
"Default Session");
81 config.setGroup (
"General");
82 m_sessionName = config.readEntry (
"Name", i18n (
"Unnamed Session"));
87 config.setGroup (
"Open Documents");
88 m_documents = config.readUnsignedNumEntry(
"Count", 0);
95 if (!m_sessionFileRel.isEmpty())
97 kdDebug(13001)<<
"Kate::Session: initializing unexisting file!"<<endl;
99 if (m_sessionName.isEmpty())
101 if (m_sessionFileRel ==
"default.katesession")
102 m_sessionName = i18n(
"Default Session");
104 m_sessionName = i18n(
"Session (%1)").arg(TQTime::currentTime().toString(Qt::LocalDate));
108 KSimpleConfig config (sessionFile ());
109 config.setGroup (
"General");
110 config.writeEntry (
"Name", m_sessionName);
116 KateSession::~KateSession ()
119 delete m_writeConfig;
122 TQString KateSession::sessionFile ()
const
124 return m_manager->sessionsDir() +
"/" + m_sessionFileRel;
127 bool KateSession::create (
const TQString &name,
bool force)
129 if (!force && (name.isEmpty() || !m_sessionFileRel.isEmpty()))
132 delete m_writeConfig;
138 m_sessionName = name;
147 m_sessionFileRel = TQString (
"%1.katesession").arg (md5.hexDigest().data());
149 if (!TDEGlobal::dirs()->exists(sessionFile ()))
154 KSimpleConfig config (sessionFile ());
155 config.setGroup (
"General");
156 config.writeEntry (
"Name", m_sessionName);
165 bool KateSession::rename (
const TQString &name)
167 if (name.isEmpty () || m_sessionFileRel.isEmpty() || m_sessionFileRel ==
"default.katesession")
170 m_sessionName = name;
172 TDEConfig config (sessionFile (),
false,
false);
173 config.setGroup (
"General");
174 config.writeEntry (
"Name", m_sessionName);
180 TDEConfig *KateSession::configRead ()
182 if (m_sessionFileRel.isEmpty())
188 return m_readConfig =
new KSimpleConfig (sessionFile (),
true);
191 TDEConfig *KateSession::configWrite ()
193 if (m_sessionFileRel.isEmpty())
197 return m_writeConfig;
199 m_writeConfig =
new KSimpleConfig (sessionFile ());
200 m_writeConfig->setGroup (
"General");
201 m_writeConfig->writeEntry (
"Name", m_sessionName);
203 return m_writeConfig;
206 KateSessionManager::KateSessionManager (TQObject *parent)
208 , m_sessionsDir (locateLocal(
"data",
"kate/sessions"))
209 , m_activeSession (new KateSession (this,
"",
""))
211 kdDebug() <<
"LOCAL SESSION DIR: " << m_sessionsDir << endl;
214 TDEGlobal::dirs()->makeDir (m_sessionsDir);
217 KateSessionManager::~KateSessionManager()
221 KateSessionManager *KateSessionManager::self()
226 void KateSessionManager::dirty (
const TQString &)
228 updateSessionList ();
231 void KateSessionManager::updateSessionList ()
233 m_sessionList.clear ();
236 TQDir dir (m_sessionsDir,
"*.katesession");
238 bool foundDefault =
false;
239 for (
unsigned int i=0; i < dir.count(); ++i)
241 KateSession *session =
new KateSession (
this, dir[i],
"");
242 m_sessionList.append (session);
244 kdDebug () <<
"FOUND SESSION: " << session->sessionName() <<
" FILE: " << session->sessionFile() << endl;
246 if (!foundDefault && (dir[i] ==
"default.katesession"))
252 m_sessionList.append (
new KateSession (
this,
"default.katesession", i18n(
"Default Session")));
254 qHeapSort(m_sessionList);
257 void KateSessionManager::activateSession (KateSession::Ptr session,
bool closeLast,
bool saveLast,
bool loadNew)
261 if ( ! session->sessionName().isEmpty() && session->sessionName() == m_activeSession->sessionName() )
275 saveActiveSession (
true);
280 KateDocManager::self()->closeAllDocuments ();
284 m_activeSession = session;
289 Kate::Document::setOpenErrorDialogsActivated (
false);
291 TDEConfig *sc = activeSession()->configRead();
299 sc =
new KSimpleConfig( sessionsDir() +
"/default.katesession" );
305 c->setGroup(
"General");
307 if (c->readBoolEntry(
"Restore Window Configuration",
true))
310 if ( ! sc->hasGroup(
"Open MainWindows") )
311 sc =
new KSimpleConfig( sessionsDir() +
"/default.katesession" );
313 sc->setGroup (
"Open MainWindows");
314 unsigned int wCount = sc->readUnsignedNumEntry(
"Count", 1);
316 for (
unsigned int i=0; i < wCount; ++i)
324 sc->setGroup(TQString (
"MainWindow%1").arg(i));
341 Kate::Document::setOpenErrorDialogsActivated (
true);
345 KateSession::Ptr KateSessionManager::createSession (
const TQString &name)
347 KateSession::Ptr s =
new KateSession (
this,
"",
"");
353 KateSession::Ptr KateSessionManager::giveSession (
const TQString &name)
356 return new KateSession (
this,
"",
"");
360 for (
unsigned int i=0; i < m_sessionList.count(); ++i)
362 if (m_sessionList[i]->sessionName() == name)
363 return m_sessionList[i];
366 return createSession (name);
369 bool KateSessionManager::saveActiveSession (
bool tryAsk,
bool rememberAsLast)
375 c->setGroup(
"General");
377 TQString sesExit (c->readEntry (
"Session Exit",
"save"));
379 if (sesExit ==
"discard")
382 if (sesExit ==
"ask")
384 KDialogBase* dlg =
new KDialogBase(i18n (
"Save Session?")
385 , KDialogBase::Yes | KDialogBase::No
386 , KDialogBase::Yes, KDialogBase::No
389 bool dontAgain =
false;
390 int res = KMessageBox::createKMessageBox(dlg, TQMessageBox::Question,
391 i18n(
"Save current session?"), TQStringList(),
392 i18n(
"Do not ask again"), &dontAgain, KMessageBox::Notify);
397 c->setGroup(
"General");
399 if (res == KDialogBase::No)
400 c->writeEntry (
"Session Exit",
"discard");
402 c->writeEntry (
"Session Exit",
"save");
405 if (res == KDialogBase::No)
410 TDEConfig *sc = activeSession()->configWrite();
415 KateDocManager::self()->saveDocumentList (sc);
417 sc->setGroup (
"Open MainWindows");
423 sc->setGroup(TQString (
"MainWindow%1").arg(i));
432 c->setGroup(
"General");
433 c->writeEntry (
"Last Session", activeSession()->sessionFileRelative());
440 bool KateSessionManager::chooseSession ()
446 c->setGroup(
"General");
449 TQString lastSession (c->readEntry (
"Last Session",
"default.katesession"));
450 TQString sesStart (c->readEntry (
"Startup Session",
"manual"));
453 if (sesStart ==
"last")
455 activateSession (
new KateSession (
this, lastSession,
""),
false,
false);
460 if (sesStart ==
"new")
462 activateSession (
new KateSession (
this,
"",
""),
false,
false);
466 KateSessionChooser *chooser =
new KateSessionChooser (0, lastSession);
472 res = chooser->exec ();
476 case KateSessionChooser::resultOpen:
478 KateSession::Ptr s = chooser->selectedSession ();
482 KMessageBox::error (chooser, i18n(
"No session selected to open."), i18n (
"No Session Selected"));
486 activateSession (s,
false,
false);
492 case KateSessionChooser::resultQuit:
498 activateSession (
new KateSession (
this,
"",
""),
false,
false);
505 if (success && chooser->reopenLastSession ())
507 c->setGroup(
"General");
509 if (res == KateSessionChooser::resultOpen)
510 c->writeEntry (
"Startup Session",
"last");
511 else if (res == KateSessionChooser::resultNew)
512 c->writeEntry (
"Startup Session",
"new");
522 void KateSessionManager::sessionNew ()
524 activateSession (
new KateSession (
this,
"",
""));
527 void KateSessionManager::sessionOpen ()
529 KateSessionOpenDialog *chooser =
new KateSessionOpenDialog (0);
531 int res = chooser->exec ();
533 if (res == KateSessionOpenDialog::resultCancel)
539 KateSession::Ptr s = chooser->selectedSession ();
547 void KateSessionManager::sessionSave ()
550 if (saveActiveSession ())
554 TQString name = KInputDialog::getText (i18n(
"Specify Name for Current Session"), i18n(
"Session name:"),
"", &ok);
561 KMessageBox::error (0, i18n(
"To save a new session, you must specify a name."), i18n (
"Missing Session Name"));
565 activeSession()->create (name);
566 saveActiveSession ();
569 void KateSessionManager::sessionSaveAs ()
572 TQString name = KInputDialog::getText (i18n(
"Specify New Name for Current Session"), i18n(
"Session name:"),
"", &ok);
579 KMessageBox::error (0, i18n(
"To save a session, you must specify a name."), i18n (
"Missing Session Name"));
583 activeSession()->create (name,
true);
584 saveActiveSession ();
588 void KateSessionManager::sessionManage ()
590 KateSessionManageDialog *dlg =
new KateSessionManageDialog (0);
599 class KateSessionChooserItem :
public TQListViewItem
602 KateSessionChooserItem (TDEListView *lv, KateSession::Ptr s)
603 : TQListViewItem (lv, s->sessionName())
607 docs.setNum (s->documents());
611 KateSession::Ptr session;
614 KateSessionChooser::KateSessionChooser (TQWidget *parent,
const TQString &lastSession)
615 : KDialogBase ( parent
618 , i18n (
"Session Chooser")
619 , KDialogBase::User1 | KDialogBase::User2 | KDialogBase::User3
622 , KStdGuiItem::quit ()
623 , KGuiItem (i18n (
"Open Session"),
"document-open")
624 , KGuiItem (i18n (
"New Session"),
"document-new")
627 TQHBox *page =
new TQHBox (
this);
628 page->setMinimumSize (400, 200);
631 TQHBox *hb =
new TQHBox (page);
632 hb->setSpacing (KDialog::spacingHint());
634 TQLabel *label =
new TQLabel (hb);
635 label->setPixmap (UserIcon(
"sessionchooser"));
636 label->setFrameStyle (TQFrame::Panel | TQFrame::Sunken);
638 TQVBox *vb =
new TQVBox (hb);
639 vb->setSpacing (KDialog::spacingHint());
641 m_sessions =
new TDEListView (vb);
642 m_sessions->addColumn (i18n(
"Session Name"));
643 m_sessions->addColumn (i18n(
"Open Documents"));
644 m_sessions->setResizeMode (TQListView::AllColumns);
645 m_sessions->setSelectionMode (TQListView::Single);
646 m_sessions->setAllColumnsShowFocus (
true);
648 connect (m_sessions, TQT_SIGNAL(selectionChanged()),
this, TQT_SLOT(selectionChanged()));
649 connect (m_sessions, TQT_SIGNAL(doubleClicked(TQListViewItem *,
const TQPoint &,
int)),
this, TQT_SLOT(slotUser2()));
651 KateSessionList &slist (KateSessionManager::self()->sessionList());
652 for (
unsigned int i=0; i < slist.count(); ++i)
654 KateSessionChooserItem *item =
new KateSessionChooserItem (m_sessions, slist[i]);
656 if (slist[i]->sessionFileRelative() == lastSession)
657 m_sessions->setSelected (item,
true);
660 m_useLast =
new TQCheckBox (i18n (
"&Always use this choice"), vb);
662 setResult (resultNone);
668 KateSessionChooser::~KateSessionChooser ()
672 KateSession::Ptr KateSessionChooser::selectedSession ()
674 KateSessionChooserItem *item = (KateSessionChooserItem *) m_sessions->selectedItem ();
679 return item->session;
682 bool KateSessionChooser::reopenLastSession ()
684 return m_useLast->isChecked ();
687 void KateSessionChooser::slotUser2 ()
692 void KateSessionChooser::slotUser3 ()
697 void KateSessionChooser::slotUser1 ()
702 void KateSessionChooser::selectionChanged ()
704 enableButton (KDialogBase::User2, m_sessions->selectedItem ());
711 KateSessionOpenDialog::KateSessionOpenDialog (TQWidget *parent)
712 : KDialogBase ( parent
715 , i18n (
"Open Session")
716 , KDialogBase::User1 | KDialogBase::User2
719 , KStdGuiItem::cancel ()
720 , KGuiItem( i18n(
"&Open"),
"document-open")
723 TQHBox *page =
new TQHBox (
this);
724 page->setMinimumSize (400, 200);
727 TQHBox *hb =
new TQHBox (page);
729 TQVBox *vb =
new TQVBox (hb);
731 m_sessions =
new TDEListView (vb);
732 m_sessions->addColumn (i18n(
"Session Name"));
733 m_sessions->addColumn (i18n(
"Open Documents"));
734 m_sessions->setResizeMode (TQListView::AllColumns);
735 m_sessions->setSelectionMode (TQListView::Single);
736 m_sessions->setAllColumnsShowFocus (
true);
738 connect (m_sessions, TQT_SIGNAL(doubleClicked(TQListViewItem *,
const TQPoint &,
int)),
this, TQT_SLOT(slotUser2()));
740 KateSessionList &slist (KateSessionManager::self()->sessionList());
741 for (
unsigned int i=0; i < slist.count(); ++i)
743 new KateSessionChooserItem (m_sessions, slist[i]);
746 setResult (resultCancel);
749 KateSessionOpenDialog::~KateSessionOpenDialog ()
753 KateSession::Ptr KateSessionOpenDialog::selectedSession ()
755 KateSessionChooserItem *item = (KateSessionChooserItem *) m_sessions->selectedItem ();
760 return item->session;
763 void KateSessionOpenDialog::slotUser1 ()
768 void KateSessionOpenDialog::slotUser2 ()
777 KateSessionManageDialog::KateSessionManageDialog (TQWidget *parent)
778 : KDialogBase ( parent
781 , i18n (
"Manage Sessions")
785 , KStdGuiItem::close ()
788 TQHBox *page =
new TQHBox (
this);
789 page->setMinimumSize (400, 200);
792 TQHBox *hb =
new TQHBox (page);
793 hb->setSpacing (KDialog::spacingHint());
795 m_sessions =
new TDEListView (hb);
796 m_sessions->addColumn (i18n(
"Session Name"));
797 m_sessions->addColumn (i18n(
"Open Documents"));
798 m_sessions->setResizeMode (TQListView::AllColumns);
799 m_sessions->setSelectionMode (TQListView::Single);
800 m_sessions->setAllColumnsShowFocus (
true);
802 connect (m_sessions, TQT_SIGNAL(selectionChanged()),
this, TQT_SLOT(selectionChanged()));
804 updateSessionList ();
806 TQWidget *vb =
new TQWidget (hb);
807 TQVBoxLayout *vbl =
new TQVBoxLayout (vb);
808 vbl->setSpacing (KDialog::spacingHint());
810 m_rename =
new KPushButton (i18n(
"&Rename..."), vb);
811 connect (m_rename, TQT_SIGNAL(clicked()),
this, TQT_SLOT(rename()));
812 vbl->addWidget (m_rename);
814 m_del =
new KPushButton (KStdGuiItem::del (), vb);
815 connect (m_del, TQT_SIGNAL(clicked()),
this, TQT_SLOT(del()));
816 vbl->addWidget (m_del);
824 KateSessionManageDialog::~KateSessionManageDialog ()
828 void KateSessionManageDialog::slotUser1 ()
834 void KateSessionManageDialog::selectionChanged ()
836 KateSessionChooserItem *item = (KateSessionChooserItem *) m_sessions->selectedItem ();
838 m_rename->setEnabled (item && item->session->sessionFileRelative() !=
"default.katesession");
839 m_del->setEnabled (item && item->session->sessionFileRelative() !=
"default.katesession");
842 void KateSessionManageDialog::rename ()
844 KateSessionChooserItem *item = (KateSessionChooserItem *) m_sessions->selectedItem ();
846 if (!item || item->session->sessionFileRelative() ==
"default.katesession")
850 TQString name = KInputDialog::getText (i18n(
"Specify New Name for Session"), i18n(
"Session name:"), item->session->sessionName(), &ok);
857 KMessageBox::error (0, i18n(
"To save a session, you must specify a name."), i18n (
"Missing Session Name"));
861 item->session->rename (name);
862 updateSessionList ();
865 void KateSessionManageDialog::del ()
867 KateSessionChooserItem *item = (KateSessionChooserItem *) m_sessions->selectedItem ();
869 if (!item || item->session->sessionFileRelative() ==
"default.katesession")
872 TQFile::remove (item->session->sessionFile());
873 KateSessionManager::self()->updateSessionList ();
874 updateSessionList ();
877 void KateSessionManageDialog::updateSessionList ()
879 m_sessions->clear ();
881 KateSessionList &slist (KateSessionManager::self()->sessionList());
882 for (
unsigned int i=0; i < slist.count(); ++i)
884 new KateSessionChooserItem (m_sessions, slist[i]);
891 KateSessionsAction::KateSessionsAction(
const TQString& text, TQObject* parent,
const char* name )
892 : TDEActionMenu(text, parent, name)
894 connect(popupMenu(),TQT_SIGNAL(aboutToShow()),
this,TQT_SLOT(slotAboutToShow()));
897 void KateSessionsAction::slotAboutToShow()
899 popupMenu()->clear ();
901 KateSessionList &slist (KateSessionManager::self()->sessionList());
902 for (
unsigned int i=0; i < slist.count(); ++i)
904 popupMenu()->insertItem (
905 slist[i]->sessionName(),
906 this, TQT_SLOT (openSession (
int)), 0,
911 void KateSessionsAction::openSession (
int i)
913 KateSessionList &slist (KateSessionManager::self()->sessionList());
915 if ((uint)i >= slist.count())
918 KateSessionManager::self()->activateSession(slist[(uint)i]);