You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
knowit/src/knowit.cpp

1329 lines
43 KiB

/***************************************************************************
knowit.cpp - description
-------------------
begin : czw wrz 26 08:27:40 CEST 2002
copyright : (C) 2002-2004 by Micha<68> Rudolf
email : mrudolf@kdewebdev.org
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include <tqtimer.h>
#include <tqclipboard.h>
#include <tqdatetime.h>
#include <tqdir.h>
#include <tqfile.h>
#include <tqtextstream.h>
#include <tqpainter.h>
#include <tqpaintdevicemetrics.h>
#include <tqwhatsthis.h>
#include <tqsimplerichtext.h>
#include <tqsplitter.h>
#include <tdeaction.h>
#include <tdecmdlineargs.h>
#include <kcolordialog.h>
#include <tdeconfig.h>
#include <tdeversion.h>
#include <kedittoolbar.h>
#include <tdefiledialog.h>
#include <kkeydialog.h>
#include <tdemenubar.h>
#include <tdemessagebox.h>
#include <kmimetype.h>
#include <tdepopupmenu.h>
#include <kprinter.h>
#include <kstatusbar.h>
#include <ktip.h>
#if KDE_IS_VERSION(3,2,0)
#include <kinputdialog.h>
#else
#include <klineeditdlg.h>
#define KInputDialog KLineEditDlg
#endif
#include "knowit.h"
#include "knowitapp.h"
#include "knowittray.h"
#include "knowittree.h"
#include "knowitlinks.h"
const TQString Knowit::Untitled = i18n("untitled") + ".kno";
Knowit::Knowit(TQWidget*, const char *name) : TDEMainWindow(0, name),
FindDlg(), PrefDlg(), ChooserDlg(), LinkDlg(), Notes()
{
statusBar()->insertItem(i18n("Ready"), 0);
Layout = new TQSplitter(this);
Items = new KnowitTree(Layout, "Items");
TQSplitter* EditLayout = new TQSplitter(Layout);
EditLayout->setOrientation(Qt::Vertical);
Edit = new KnowitEdit(EditLayout, "Edit");
Links = new KnowitLinks(EditLayout);
connect(&FindDlg, TQT_SIGNAL(search()), TQT_TQOBJECT(this), TQT_SLOT(slotEditFind()));
lastSought = 0;
/* main view */
setAutoSaveSettings();
setCentralWidget(Layout);
TQWhatsThis::add(Layout, i18n("Move it to change tree/edit layout."));
connect(Items, TQT_SIGNAL(contextMenu(TDEListView*, TQListViewItem*, const TQPoint&)),
TQT_TQOBJECT(this), TQT_SLOT(slotContextMenu(TDEListView*, TQListViewItem*, const TQPoint&)));
connect(Items, TQT_SIGNAL(selectionChanged(TQListViewItem*)), this,
TQT_SLOT(slotItemChanged(TQListViewItem*)));
connect(Items, TQT_SIGNAL(selectionChanged(TQListViewItem*)), this,
TQT_SLOT(slotItemChanged(TQListViewItem*)));
/* Edit (TQTextEdit) */
Edit->setMinimumSize(200, 150);
Edit->setTextFormat(TQt::RichText);
TQWhatsThis::add(Edit, i18n("<h2>Note text</h2>Add text for selected note here.\n"
"Text can be formatted, for example <b>bold</b> or <i>italic</i>."));
connect(Edit, TQT_SIGNAL(selectionChanged()), TQT_TQOBJECT(this), TQT_SLOT(slotEditChanged()));
connect(Edit, TQT_SIGNAL(textChanged()), TQT_TQOBJECT(this), TQT_SLOT(slotEditChanged()));
connect(Edit, TQT_SIGNAL(cursorPositionChanged(int, int)), this,
TQT_SLOT(slotEditCursorChanged(int, int)));
connect(Edit, TQT_SIGNAL(textDropped(const TQString&, int)),
TQT_TQOBJECT(this), TQT_SLOT(slotLinkDropped(const TQString&, int)));
/* Links (TDEListBox) */
connect(Links, TQT_SIGNAL(doubleClicked(TQListBoxItem*)),
TQT_TQOBJECT(this), TQT_SLOT(slotShowAttachment(TQListBoxItem*)));
connect(Links, TQT_SIGNAL(contextMenuRequested(TQListBoxItem*, const TQPoint&)),
TQT_TQOBJECT(this), TQT_SLOT(slotContextLinksMenu(TQListBoxItem*, const TQPoint&)));
connect(Links, TQT_SIGNAL(textDropped(const TQString&, int)),
TQT_TQOBJECT(this), TQT_SLOT(slotLinkDropped(const TQString&, int)));
connect(Links, TQT_SIGNAL(linkRemove()), TQT_TQOBJECT(this), TQT_SLOT(slotLinkRemove()));
connect(Links, TQT_SIGNAL(linkOpen()), TQT_TQOBJECT(this), TQT_SLOT(slotLinkOpen()));
connect(Links, TQT_SIGNAL(linkOpenWith()), TQT_TQOBJECT(this), TQT_SLOT(slotLinkOpenWith()));
/* Actions: File */
KStdAction::openNew(TQT_TQOBJECT(this), TQT_SLOT(slotFileNew()), actionCollection());
KStdAction::open(TQT_TQOBJECT(this), TQT_SLOT(slotFileOpen()), actionCollection());
actionRecent = KStdAction::openRecent(TQT_TQOBJECT(this), TQT_SLOT(slotFileRecent(const KURL&)), actionCollection());
KStdAction::save(TQT_TQOBJECT(this), TQT_SLOT(slotFileSave()), actionCollection());
KStdAction::saveAs(TQT_TQOBJECT(this), TQT_SLOT(slotFileSaveAs()), actionCollection());
new TDEAction(i18n("&Export to HTML..."), "", "", TQT_TQOBJECT(this),
TQT_SLOT(slotFileExport()), actionCollection(), "file_export_html");
KStdAction::print(TQT_TQOBJECT(this), TQT_SLOT(slotFilePrint()), actionCollection());
new TDEAction(i18n("Document &information..."), "", "", TQT_TQOBJECT(this),
TQT_SLOT(slotFileInfo()), actionCollection(), "file_info");
KStdAction::quit(TQT_TQOBJECT(this), TQT_SLOT(slotFileQuit()), actionCollection());
/* Actions: Edit */
actionCut = KStdAction::cut(TQT_TQOBJECT(Edit), TQT_SLOT(cut()), actionCollection());
actionCopy = KStdAction::copy(TQT_TQOBJECT(Edit), TQT_SLOT(copy()), actionCollection());
KStdAction::paste(TQT_TQOBJECT(Edit), TQT_SLOT(paste()), actionCollection());
actionUndo = KStdAction::undo(TQT_TQOBJECT(Edit), TQT_SLOT(undo()), actionCollection());
actionRedo = KStdAction::redo(TQT_TQOBJECT(Edit), TQT_SLOT(redo()), actionCollection());
actionBold = new TDEToggleAction(i18n("Toggle &bold"), "text_bold",
"Ctrl+B", TQT_TQOBJECT(this), TQT_SLOT(slotEditBold()), actionCollection(), "edit_bold");
actionItalic = new TDEToggleAction(i18n("Toggle &italic"), "text_italic",
"Ctrl+I", TQT_TQOBJECT(this), TQT_SLOT(slotEditItalic()), actionCollection(),
"edit_italic");
actionUnderline = new TDEToggleAction(i18n("Toggle &underline"), "text_under",
"Ctrl+U", TQT_TQOBJECT(this), TQT_SLOT(slotEditUnderline()), actionCollection(),
"edit_underline");
new TDEAction(i18n("&Text color..."), "color_line", "Ctrl+#", TQT_TQOBJECT(this),
TQT_SLOT(slotEditColor()), actionCollection(), "edit_color");
new TDEAction(i18n("&Superscript"), "text_super", "", TQT_TQOBJECT(this),
TQT_SLOT(slotEditSuperscript()), actionCollection(), "edit_superscript");
new TDEAction(i18n("&Subscript"), "text_sub", "", TQT_TQOBJECT(this),
TQT_SLOT(slotEditSubscript()), actionCollection(), "edit_subscript");
new TDEAction(i18n("&Normal text"), "", "", TQT_TQOBJECT(this),
TQT_SLOT(slotEditNormal()), actionCollection(), "edit_align_normal");
new TDEAction(i18n("&Bullet list"), "", "", TQT_TQOBJECT(this),
TQT_SLOT(slotEditListBullet()), actionCollection(), "list_bullet");
new TDEAction(i18n("&Numbered list"), "", "", TQT_TQOBJECT(this),
TQT_SLOT(slotEditListNumber()), actionCollection(), "list_number");
new TDEAction(i18n("&Uppercase list"), "", "", TQT_TQOBJECT(this),
TQT_SLOT(slotEditListUpper()), actionCollection(), "list_upper");
new TDEAction(i18n("&Lowercase list"), "", "", TQT_TQOBJECT(this),
TQT_SLOT(slotEditListLower()), actionCollection(), "list_lower");
new TDEAction(i18n("N&o list"), "", "", TQT_TQOBJECT(this),
TQT_SLOT(slotEditListNone()), actionCollection(), "list_none");
KStdAction::find(TQT_TQOBJECT(&FindDlg), TQT_SLOT(exec()), actionCollection());
KStdAction::findNext(TQT_TQOBJECT(this), TQT_SLOT(slotEditFindNext()), actionCollection());
new TDEAction(i18n("&Go to &note..."), "goto", "Ctrl+G", TQT_TQOBJECT(this),
TQT_SLOT(slotEditGoTo()), actionCollection(), "goto_note");
actionEditAlignLeft = new TDEToggleAction(i18n("Align &left"), "text_left", "Ctrl+L", TQT_TQOBJECT(this),
TQT_SLOT(slotEditAlignLeft()), actionCollection(), "edit_align_left");
actionEditAlignRight = new TDEToggleAction(i18n("Align &right"), "text_right", "Ctrl+R",
TQT_TQOBJECT(this), TQT_SLOT(slotEditAlignRight()), actionCollection(), "edit_align_right");
actionEditAlignJustify = new TDEToggleAction(i18n("&Justify"), "text_block", "Ctrl+J",
TQT_TQOBJECT(this), TQT_SLOT(slotEditAlignJustify()), actionCollection(), "edit_align_justify");
actionEditAlignCenter = new TDEToggleAction(i18n("&Center"), "text_center", "Ctrl+E", TQT_TQOBJECT(this),
TQT_SLOT(slotEditAlignCenter()), actionCollection(), "edit_align_center");
new TDEAction(i18n("Insert &date"), "date", "F5", TQT_TQOBJECT(this),
TQT_SLOT(slotEditInsertDate()), actionCollection(), "edit_insert_date");
new TDEAction(i18n("Insert &file..."), "", "", TQT_TQOBJECT(this),
TQT_SLOT(slotEditInsertFile()), actionCollection(), "edit_insert_file");
actionRawTextMode = new TDEToggleAction(i18n("&Raw Text Mode"),
"source", "F10", TQT_TQOBJECT(this), TQT_SLOT(slotRawTextMode()),
actionCollection(), "edit_raw_text");
/* Actions: edit setup */
actionCut->setEnabled(false);
actionCopy->setEnabled(false);
connect(Edit, TQT_SIGNAL(copyAvailable(bool)), actionCut, TQT_SLOT(setEnabled(bool)));
connect(Edit, TQT_SIGNAL(copyAvailable(bool)), actionCopy, TQT_SLOT(setEnabled(bool)));
connect(Edit, TQT_SIGNAL(undoAvailable(bool)), actionUndo, TQT_SLOT(setEnabled(bool)));
connect(Edit, TQT_SIGNAL(redoAvailable(bool)), actionRedo, TQT_SLOT(setEnabled(bool)));
/* Actions: notes */
new TDEAction(i18n("&Add"), "", "Alt+Insert", TQT_TQOBJECT(this), TQT_SLOT(slotNoteAdd()),
actionCollection(), "note_add");
new TDEAction(i18n("Add &subnote"), "", "Alt+Shift+Insert", TQT_TQOBJECT(this),
TQT_SLOT(slotNoteAddChild()), actionCollection(), "note_add_child");
new TDEAction(i18n("&Delete"), "", "Alt+Delete", TQT_TQOBJECT(this),
TQT_SLOT(slotNoteRemove()), actionCollection(), "note_delete");
new TDEAction(i18n("&Rename"), "", "F2", TQT_TQOBJECT(this),
TQT_SLOT(slotNoteRename()), actionCollection(), "note_rename");
new TDEAction(i18n("E&xpand all"), "", "", TQT_TQOBJECT(Items),
TQT_SLOT(slotExpandAll()), actionCollection(), "note_expand_all");
new TDEAction(i18n("&Expand current"), "", "Alt++", TQT_TQOBJECT(Items),
TQT_SLOT(slotExpand()), actionCollection(), "note_expand");
new TDEAction(i18n("Co&llapse all"), "", "", TQT_TQOBJECT(Items),
TQT_SLOT(slotCollapseAll()), actionCollection(), "note_collapse_all");
new TDEAction(i18n("&Collapse current"), "", "Alt+-", TQT_TQOBJECT(Items),
TQT_SLOT(slotCollapse()), actionCollection(), "note_collapse");
new TDEAction(i18n("Move up"), "up", "Alt+Shift+Up", TQT_TQOBJECT(this),
TQT_SLOT(slotNoteMoveUp()), actionCollection(), "note_move_up");
new TDEAction(i18n("Move down"), "down", "Alt+Shift+Down", TQT_TQOBJECT(this),
TQT_SLOT(slotNoteMoveDown()), actionCollection(), "note_move_down");
new TDEAction(i18n("Move level up"), "back", "Alt+Shift+Left", TQT_TQOBJECT(this),
TQT_SLOT(slotNoteMoveLeft()), actionCollection(), "note_move_left");
new TDEAction(i18n("Move level down"), "forward", "Alt+Shift+Right", TQT_TQOBJECT(this),
TQT_SLOT(slotNoteMoveRight()), actionCollection(), "note_move_right");
new TDEAction(i18n("Move at the beginning"), "top", "Alt+Shift+Home", TQT_TQOBJECT(this),
TQT_SLOT(slotNoteMoveBegin()), actionCollection(), "note_move_begin");
new TDEAction(i18n("Move at the end"), "bottom", "Alt+Shift+End", TQT_TQOBJECT(this),
TQT_SLOT(slotNoteMoveEnd()), actionCollection(), "note_move_end");
new TDEAction(i18n("Sort"), "", "", TQT_TQOBJECT(this),
TQT_SLOT(slotNoteSort()), actionCollection(), "note_sort");
/* Actions: Links */
new TDEAction(i18n("&Add link..."), "attach", "Ctrl+Shift+I", TQT_TQOBJECT(this),
TQT_SLOT(slotLinkAdd()), actionCollection(), "link_add");
new TDEAction(i18n("&Remove link"), "", "", TQT_TQOBJECT(this),
TQT_SLOT(slotLinkRemove()), actionCollection(), "link_remove");
new TDEAction(i18n("Open link"), "run", "", TQT_TQOBJECT(this),
TQT_SLOT(slotLinkOpen()), actionCollection(), "link_open");
new TDEAction(i18n("Open link with..."), "", "", TQT_TQOBJECT(this),
TQT_SLOT(slotLinkOpenWith()), actionCollection(), "link_open_with");
new TDEAction(i18n("&Modify link..."), "", "", TQT_TQOBJECT(this),
TQT_SLOT(slotLinkModify()), actionCollection(), "link_modify");
new TDEAction(i18n("&Copy link location"), "", "", TQT_TQOBJECT(this),
TQT_SLOT(slotLinkCopy()), actionCollection(), "link_copy");
/* Actions: Options */
KStdAction::keyBindings(TQT_TQOBJECT(this), TQT_SLOT(slotOptionsKeys()), actionCollection());
KStdAction::configureToolbars(TQT_TQOBJECT(this), TQT_SLOT(slotOptionsToolbar()), actionCollection());
KStdAction::preferences(TQT_TQOBJECT(this), TQT_SLOT(slotOptions()), actionCollection());
/* Actions: Help */
new TDEAction(i18n("&Tip of the day"), "idea", "", TQT_TQOBJECT(this),
TQT_SLOT(slotHelpTip()), actionCollection(), "help_tip");
/* Actions: nonplugged */
new TDEAction(i18n("Minimize"), "", "", TQT_TQOBJECT(this), TQT_SLOT(showMinimized()),
actionCollection(), "window_minimize");
new TDEAction(i18n("Switch area"), "", "Ctrl+M", TQT_TQOBJECT(this),
TQT_SLOT(slotEditSwitch()), actionCollection(), "edit_switch");
new TDEAction(i18n("Overwrite Mode"), "", "Insert", TQT_TQOBJECT(this),
TQT_SLOT(slotOverwriteModeChange()), actionCollection(), "overwrite_mode_change");
new TDEAction(i18n("Go to previous note"), "", "Alt+Up", TQT_TQOBJECT(Items),
TQT_SLOT(slotItemUp()), actionCollection(), "note_previous");
new TDEAction(i18n("Go to next note"), "", "Alt+Down", TQT_TQOBJECT(Items),
TQT_SLOT(slotItemDown()), actionCollection(), "note_next");
new TDEAction(i18n("Go to first note"), "", "Alt+Home", TQT_TQOBJECT(Items),
TQT_SLOT(slotItemBegin()), actionCollection(), "note_begin");
new TDEAction(i18n("Go to last note"), "", "Alt+End", TQT_TQOBJECT(Items),
TQT_SLOT(slotItemEnd()), actionCollection(), "note_end");
new TDEAction(i18n("Go to first subnote"), "", "Alt+Right", TQT_TQOBJECT(Items),
TQT_SLOT(slotItemRight()), actionCollection(), "note_right");
new TDEAction(i18n("Go to parent note"), "", "Alt+Left", TQT_TQOBJECT(Items),
TQT_SLOT(slotItemLeft()), actionCollection(), "note_left");
/* Actions */
#if TDE_VERSION_MAJOR >= 3 && TDE_VERSION_MINOR >= 1
setStandardToolBarMenuEnabled(true);
#endif
createGUI("knowitui.rc", false);
/* Insert/overwrite mode */
statusBar()->insertFixedItem(("WWW"), StatusOvr, true);
statusBar()->changeItem(i18n("INS"), StatusOvr);
connect(statusBar(), TQT_SIGNAL(pressed(int)), this,
TQT_SLOT(slotOverwriteModeChange(int)));
/* System tray */
systray = new KnowitTray(this, "Systray");
systray->setPixmap(Notes.Pixmaps[1]);
systray->setAlignment(TQt::AlignHCenter | TQt::AlignVCenter);
/* Autosave */
AutosaveTimer = new TQTimer(this);
connect(AutosaveTimer, TQT_SIGNAL(timeout()), TQT_TQOBJECT(this), TQT_SLOT(slotFileAutosave()));
/* Configuration */
config = kapp->config();
readOptions();
if (runMinimized)
showMinimized();
else
show();
bool opened = false;
TDECmdLineArgs *args = TDECmdLineArgs::parsedArgs();
for(int i = 0; i < args->count(); i++)
if (open(args->url(i))) {
opened = true; break;
}
args->clear();
if (!opened && Options.reopen && filename.path() != "")
open(KURL(filename));
slotActionUpdate();
KTipDialog::showTip(this);
shuttingDown = false;
applyMainWindowSettings(config);
/* check if knowituirc was found */
TQWidget *w = factory()->container("notes_popup", this);
if (!w)
KMessageBox::error(0, i18n("<qt><p>Cannot open resource file <b>knowitui.rc</b>. "
"Some of the menus and toolbars will be missing.</p>"
"<p>Probably Knowit was not installed properly. "
"If you installed from source, please invoke <i>make install</i>."
"If you use precompiled package, please contact packager.</p></qt>"));
}
Knowit::~Knowit()
{
delete systray;
delete AutosaveTimer;
}
bool Knowit::open(const KURL& fname)
{
TQFile file(fname.path());
if (!file.open(IO_ReadOnly)) {
KMessageBox::error(0, i18n("<qt>Cannot open file<br><b>%1</b></qt>")
.arg(fname.url()));
if (filename == fname)
filename = "";
return false;
}
uint prevdepth = 0;
reset();
TQTextStream ts(&file);
ts.setEncoding(TQTextStream::UnicodeUTF8);
TQString s = "";
TQListViewItem* current = 0;
TQListViewItem* active = 0;
Notes.autoUpdate = false;
while (!s.isNull()) {
s = ts.readLine();
if (s.left(9) == "\\NewEntry" || s.left(13) == "\\CurrentEntry") {
TQString name;
uint depth;
TQTextIStream ls(&s);
ls >> name >> depth;
name = ls.readLine();
name = name.stripWhiteSpace();
if (depth == prevdepth) /* same level */
if (depth) current = new TDEListViewItem(current->parent(), current, name);
else current = new TDEListViewItem(Items, current, name);
else if (depth > prevdepth) /* subnote */
current = new TDEListViewItem(current, name);
else { /* parent note */
for(uint i=depth; i<prevdepth && current; i++)
current = current->parent();
if (current && current->parent())
current = new TDEListViewItem(current->parent(), current, name);
else current = new TDEListViewItem(Items, current, name);
}
prevdepth = depth;
Notes.addNote(current);
Notes.find(current)->open(ts);
if (s.left(13) == "\\CurrentEntry")
active = current;
}
}
Notes.autoUpdate = true;
Notes.updateNotesView();
filename = fname;
setCaption(fname.fileName());
Notes.modified = false;
Edit->clear();
slotNoteChanged(active);
Edit->setModified(false);
actionRecent->addURL(filename);
slotStatusMsg(i18n("File %1 opened.").arg(filename.fileName()));
slotActionUpdate();
file.close();
if (Options.backup)
URLOperator.copy(fname.path(), fname.path() + "~", false, false);
if (Options.autosave)
AutosaveTimer->start(Options.autosave * 60 * 1000, true);
return true;
}
bool Knowit::save(const KURL& fname)
{
TQFile file(fname.path());
if (!file.open(IO_WriteOnly)) {
KMessageBox::error(0, i18n("<qt>Cannot save file<br><b>%1</b></qt>")
.arg(fname.url()));
return false;
}
if (Items->prevItem && Edit->isModified())
Notes.changeNote(Items->prevItem, Edit->length() ? Edit->text() : TQString());
TQTextStream ts(&file);
ts.setEncoding(TQTextStream::UnicodeUTF8);
for (TQListViewItemIterator it(Items); it.current(); it++)
Notes.find(it.current())->save(ts, it.current() == Items->currentItem());
filename = fname;
setCaption(fname.fileName());
Notes.modified = false;
Edit->setModified(false);
actionRecent->addURL(filename);
slotStatusMsg(i18n("File %1 saved.").arg(filename.fileName()));
if (Options.autosave)
AutosaveTimer->start(Options.autosave * 60 * 1000, true);
return true;
}
void Knowit::reset()
{
Items->prevItem = 0;
Notes.clearNotes();
Items->clear();
Edit->clear();
filename = "";
setCaption(Untitled);
Notes.modified = false;
slotActionUpdate();
}
void Knowit::closeEvent(TQCloseEvent* e)
{
if (!Options.docked || ((KnowitApplication*)kapp)->closeByLogout()) {
saveOptions();
TDEMainWindow::closeEvent(e);
}
else
hide();
}
bool Knowit::queryClose()
{
if (!modified()) return shuttingDown = true;
else if (Options.unconditionalSave) {
slotFileSave();
return shuttingDown = filename.isEmpty() || !modified() || (KMessageBox::questionYesNo(0,
i18n("<qt>File <b>%1</b><br>\ncannot be saved. Quit anyway?</qt>").arg(filename.fileName()))
== KMessageBox::Yes);
}
else
switch (KMessageBox::questionYesNoCancel(0,
i18n("<qt>File <b>%1</b><br>\nwas modified. Do you want to save it?</qt>")
.arg(filename.isEmpty() ? Untitled : filename.fileName()))) {
case KMessageBox::Yes:
slotFileSave();
return shuttingDown = !modified();
case KMessageBox::No:
return shuttingDown = true;
default:
return false;
}
}
bool Knowit::queryExit()
{
if (!shuttingDown) {
/* brutally closed by session manager */
if (modified())
save(filename.isEmpty() ? i18n("untitled.kno") : filename);
saveOptions();
}
return true;
}
void Knowit::find(TQListViewItem* start)
{
if (soughtText.isEmpty() || !Items->firstChild()) return;
if (start && lastSought == start &&
Edit->find(soughtText, FindDlg.case_sensitive(), false))
return;
if (!start) start = Items->firstChild();
TQListViewItemIterator it(start);
while (it.current()) {
TQString s = Notes.text(it.current());
if (lastSought != it.current() &&
s.contains(soughtText, FindDlg.case_sensitive())) {
slotNoteChanged(it.current());
Edit->find(soughtText, FindDlg.case_sensitive(), false);
lastSought = it.current();
return;
}
it++;
}
KMessageBox::information(0, i18n("<qt>Sought text:<br><b>%1</b><br>not found.</qt>").arg(soughtText));
}
void Knowit::saveOptions()
{
config->setGroup("MainWindow");
config->writeEntry("Widgets", Layout->sizes());
Options.save(config);
config->setGroup("General");
config->writeEntry("Minimized", isMinimized() || !isVisible());
config->writeEntry("LastFile", filename.path());
config->writeEntry("Geometry", size());
actionCollection()->writeShortcutSettings("Keys", config);
config->deleteGroup("Recent Files");
actionRecent->saveEntries(config, "Recent Files");
saveMainWindowSettings(config);
}
void Knowit::readOptions()
{
config->setGroup("MainWindow");
TQValueList<int> sizes = config->readIntListEntry("Widgets");
if (sizes.count() == 2)
Layout->setSizes(sizes);
Options.read(config);
config->setGroup("General");
runMinimized = config->readBoolEntry("Minimized", false);
TQString oldfile = config->readEntry("LastFile");
TQSize defSize = size();
resize(config->readSizeEntry("Geometry", &defSize));
actionCollection()->readShortcutSettings("Keys", config);
actionRecent->loadEntries(config,"Recent Files");
if (!oldfile.isEmpty())
filename = KURL(oldfile);
applyOptions(Options);
}
void Knowit::slotNoteChanged(TQListViewItem* item)
{
if (item) {
if (Options.autoCollapse)
Items->slotCollapseAll();
Items->setCurrentItem(item);
Items->setSelected(item, true);
Items->ensureItemVisible(item);
}
}
bool Knowit::modified()
{
return Notes.modified || (Items->currentItem() && Edit->isModified());
}
void Knowit::applyOptions(const KnowitOptions& O, bool store)
{
if (store) Options = O;
if (O.docked)
systray->show();
else
systray->hide();
if (O.customColors) {
Edit->setPaletteForegroundColor(TQColor(Options.foreEditColor));
Edit->setPaletteBackgroundColor(TQColor(Options.backEditColor));
}
else Edit->unsetPalette();
if (Options.customFont)
Edit->setFont(TQFont(Options.fontFamily, Options.fontSize));
else
Edit->unsetFont();
Edit->setWordWrap(O.wordwrap ? TQTextEdit::WidgetWidth : TQTextEdit::NoWrap);
#if TDE_VERSION_MAJOR >= 3 && TDE_VERSION_MINOR >= 1
Edit->setTabChangesFocus(O.tabfocus);
#endif
if (!O.autosave)
AutosaveTimer->stop();
else
AutosaveTimer->start(O.autosave * 60 * 1000, true);
Edit->swapEOL = O.enterBreakLine;
Layout->setOrientation(O.horizontalSplit ? Qt::Horizontal :
Qt::Vertical);
Items->setAlternateBackground(O.alternateTree ? TQColor(O.alternateColor) : TQColor());
Items->repaintContents();
if (Items->currentItem())
slotItemChanged(Items->currentItem());
slotNoteChanged(Items->currentItem());
}
TNote* Knowit::currentNote() const
{
if (!Items->currentItem()) return 0;
return Notes.find(Items->currentItem());
}
/*** Slots ***/
void Knowit::slotStatusMsg(const TQString &text)
{
statusBar()->clear();
statusBar()->changeItem(text, 0);
}
void Knowit::slotContextMenu(TDEListView*, TQListViewItem*, const TQPoint& p)
{
TQWidget *w = factory()->container("notes_popup", this);
if (w)
static_cast<TQPopupMenu *>(w)->exec(p);
}
void Knowit::slotContextLinksMenu(TQListBoxItem*, const TQPoint& p)
{
TQWidget *w = factory()->container("links_popup", this);
if (w)
static_cast<TQPopupMenu *>(w)->exec(p);
}
/******* Slots: Notes *******/
void Knowit::slotNoteAdd()
{
bool Ok;
TDEListViewItem* elt;
TQString text = KInputDialog::getText(i18n("Add note"),
i18n("Note title:"), Options.defaultName, &Ok);
if (!Ok) return;
if (Items->currentItem())
if (Items->currentItem()->parent())
elt = new TDEListViewItem(Items->currentItem()->parent(),
Items->currentItem(), text);
else
elt = new TDEListViewItem(Items, Items->currentItem(), text);
else
elt = new TDEListViewItem(Items, text);
Notes.addNote(elt);
slotNoteChanged(elt);
if (Notes.count() == 1)
slotActionUpdate();
}
void Knowit::slotNoteAddChild()
{
if (!Items->currentItem()) {
KMessageBox::error(0, i18n("You have to choose note before adding subnote."));
return;
}
bool Ok;
TQString text = KInputDialog::getText(i18n("Add subnote"),
i18n("Note title:"), Options.defaultName, &Ok);
if (!Ok) return;
TQListViewItem* lastChild = Items->currentItem()->firstChild();
while (lastChild && lastChild->nextSibling())
lastChild = lastChild->nextSibling();
TDEListViewItem* elt;
if (lastChild)
elt = new TDEListViewItem(Items->currentItem(), lastChild, text);
else
elt = new TDEListViewItem(Items->currentItem(), text);
Notes.addNote(elt);
slotNoteChanged(elt);
}
void Knowit::slotNoteRemove()
{
TQListViewItem* elt = Items->currentItem();
if (!elt) return;
TQString msg = elt->childCount() ?
i18n("<qt>Are you sure you want to delete note<br><b>%1</b><br> "
"and its subnotes?</qt>") :
i18n("<qt>Are you sure you want to delete note<br><b>%1</b>?</qt>");
if (KMessageBox::questionYesNo(0, msg.arg(elt->text(0))) == KMessageBox::Yes) {
TQListViewItem* parent = elt->parent();
Notes.removeNote(elt);
if (!Notes.count())
slotActionUpdate();
if (!parent)
parent = Items->firstChild();
Items->prevItem = 0;
slotNoteChanged(parent);
}
}
void Knowit::slotNoteRename()
{
if (Items->currentItem()) {
Items->currentItem()->setRenameEnabled(0, true);
Items->currentItem()->startRename(0);
}
}
void Knowit::slotItemChanged(TQListViewItem* i)
{
if (Items->prevItem && Edit->isModified())
Notes.changeNote(Items->prevItem, Edit->length() ? Edit->text() : TQString());
Items->prevItem = i;
TQString s;
if (!Items->prevItem || (s = Notes.text(Items->prevItem)).isEmpty())
Edit->setText("");
else
Edit->setText(s);
Edit->setModified(false);
Links->clear();
TNote* note = Notes.find(i);
if (note)
for (int j=0; j<note->linkCount(); j++)
Links->insertItem(note->link(j).icon(), note->link(j).text(Options.linkFormat));
if (Links->count())
Links->show();
else
Links->hide();
}
void Knowit::slotNoteMoveUp()
{
TQListViewItem* elt = Items->currentItem();
if (elt && elt->itemAbove()) {
TQListViewItem* above = elt->parent() ? elt->parent()->firstChild()
: Items->firstChild();
if (above == elt)
return;
if (!above->nextSibling() || above->nextSibling() == elt)
above = 0;
else while (above->nextSibling()->nextSibling() != elt)
above = above->nextSibling();
if (above)
elt->moveItem(above);
else {
TQListViewItem* parent = elt->parent();
Items->takeNode(elt);
Items->insertNode(parent, elt);
}
slotNoteChanged(elt);
Notes.modified = true;
}
}
void Knowit::slotNoteMoveDown()
{
TQListViewItem* elt = Items->currentItem();
if (elt && elt->nextSibling()) {
elt->moveItem(elt->nextSibling());
slotNoteChanged(elt);
Notes.modified = true;
}
}
void Knowit::slotNoteMoveBegin()
{
TQListViewItem* elt = Items->currentItem();
if (elt) {
TQListViewItem* parent = elt->parent();
Items->takeNode(elt);
Items->insertItem(elt);
if (parent)
Notes.find(parent)->updateView();
slotNoteChanged(elt);
Notes.modified = true;
}
}
void Knowit::slotNoteMoveEnd()
{
TQListViewItem* elt = Items->currentItem();
if (!elt)
return;
TQListViewItem* last = Items->firstChild();
TQListViewItem* parent = elt->parent();
while (last->nextSibling())
last = last->nextSibling();
if (elt && elt != last) {
Items->takeNode(elt);
Items->insertNode(0, elt, last);
slotNoteChanged(elt);
if (parent)
Notes.find(parent)->updateView();
Notes.modified = true;
}
}
void Knowit::slotNoteMoveLeft()
{
TQListViewItem* elt = Items->currentItem();
TQListViewItem* parent = elt->parent();
if (elt && parent) {
Items->takeNode(elt);
Items->insertNode(parent->parent(), elt, parent);
Notes.find(parent)->updateView();
slotNoteChanged(elt);
Notes.modified = true;
}
}
void Knowit::slotNoteMoveRight()
{
TQListViewItem* elt = Items->currentItem();
TQListViewItem* above = elt->itemAbove();
if (elt && above) {
if (above->depth() < elt->depth())
return;
else if (above->depth() == elt->depth()) {
Items->takeNode(elt);
Items->insertNode(above, elt);
}
else {
while (above->depth() > elt->depth()+1)
above = above->parent();
Items->takeNode(elt);
Items->insertNode(above->parent(), elt, above);
}
Notes.find(above)->updateView();
slotNoteChanged(elt);
Notes.modified = true;
}
}
void Knowit::slotNoteSort()
{
if (Items->currentItem()) {
Items->currentItem()->sortChildItems(0, true);
Items->repaintContents();
}
}
void Knowit::slotFileNew()
{
if (queryClose()) reset();
}
void Knowit::slotFileOpen()
{
if (!queryClose()) return;
KURL url=KFileDialog::getOpenURL(TQString(),
i18n("*.kno|KnowIt files (*.kno)\n*|All files"), this, i18n("Open File..."));
if (!url.isEmpty())
open(url);
}
void Knowit::slotFileSave()
{
if (filename.isEmpty())
slotFileSaveAs();
else {
save(filename);
}
}
void Knowit::slotFileAutosave()
{
if (modified())
slotFileSave();
if (modified()) { /* file wasn't saved */
KMessageBox::sorry(0, i18n("<qt><p>File couldn not be saved automatically."
"<p>Autosaving disabled - save file manually to turn autosaving on.</p></qt>"));
AutosaveTimer->stop();
}
}
void Knowit::slotFileRecent(const KURL& url)
{
if (queryClose())
if (!open(url))
actionRecent->removeURL(url);
}
void Knowit::slotFileSaveAs()
{
KURL url=KFileDialog::getSaveURL(TQDir::currentDirPath(),
i18n("*.kno|KnowIt files (*.kno)\n*|All files"), this, i18n("Save as..."));
if (!url.isEmpty()) {
if (!url.fileName().contains('.'))
url = KURL(url.path() + ".kno");
TQFileInfo fileinfo(url.path());
if (fileinfo.exists() && KMessageBox::questionYesNo(0,
i18n("<qt>File<br><b>%1</b><br>already exists. Overwrite it?</qt>")
.arg(url.path())) == KMessageBox::No)
return;
save(url);
}
}
void Knowit::slotFileInfo()
{
int count = 0;
TQListViewItemIterator it(Items);
while (it.current()) {
count++;
it++;
}
KMessageBox::information(0, i18n("<qt><h1>%1</h1>"
"Document path: %2<br>"
"Number of notes: %3</qt>").arg(filename.fileName())
.arg(filename.path()).arg(count));
}
void Knowit::slotFilePrint()
{
KPrinter printer;
printer.setFullPage(true);
if (Edit->text().stripWhiteSpace().isEmpty() || !printer.setup(this))
return;
TQSimpleRichText richText(Edit->text(), Edit->font());
TQPainter p(&printer);
TQPaintDeviceMetrics metrics(p.device());
int dpix = metrics.logicalDpiX();
int dpiy = metrics.logicalDpiY();
const int margin = 72; // pt
TQRect body(margin*dpix / 72, margin*dpiy / 72,
metrics.width()- margin*dpix /72*2,
metrics.height()-margin*dpiy/72*2);
richText.setWidth(&p, body.width());
TQRect view(body);
int page = 1;
while (true) {
richText.draw(&p, body.left(), body.top(), view, colorGroup());
view.moveBy(0, body.height());
p.translate( 0 , -body.height());
p.setFont(Edit->font());
p.drawText( view.right() - p.fontMetrics().width( TQString::number(page)),
view.bottom() + p.fontMetrics().ascent() + 5, TQString::number(page));
if (view.top() >= body.top() + richText.height())
break;
printer.newPage();
page++;
}
}
void Knowit::slotFileQuit()
{
if (queryClose()) {
saveOptions();
kapp->quit();
}
}
void Knowit::slotFileExport()
{
if (!Items->firstChild()) return; /* nothing to export */
ChooserDlg.setChoice(Options.exportFlags);
if (ChooserDlg.exec() != TQDialog::Accepted) return; /* cancelled */
/* Deduce filename from Knowit document name */
TQString htmlfile;
if (filename.isValid()) {
htmlfile = filename.path();
if (htmlfile.right(4) == ".kno")
htmlfile = htmlfile.left(htmlfile.length() - 4) + ".html";
else htmlfile = "";
}
if (htmlfile.isEmpty())
htmlfile == TQDir::currentDirPath();
/* Confirm/choose filename */
KURL url=KFileDialog::getSaveURL(htmlfile,
i18n("*.html|HTML files (*.html)\n*|All files"), this, i18n("Export to HTML"));
if (!url.isEmpty()) {
if (!url.fileName().contains('.'))
url = KURL(url.path() + ".html");
TQFileInfo fileinfo(url.path());
if (fileinfo.exists() && KMessageBox::questionYesNo(0,
i18n("<qt>File<br><b>%1</b><br>already exists. Overwrite it?</qt>")
.arg(url.path())) == KMessageBox::No)
return;
int choice = ChooserDlg.getChoice();
TQListViewItem* start = (choice & KnowitChooser::SaveAll) ?
Items->firstChild() : Items->currentItem();
TQString origname = filename.isEmpty() ? Untitled : filename.path();
TQString style;
if (choice & KnowitChooser::Style)
style = TQString("body {font-family: \"%1\"; color: %2; background-color: %3}")
.arg(Edit->family()).arg(Edit->paletteForegroundColor().name())
.arg(Edit->paletteBackgroundColor().name());
Notes.find(start)->saveHTML(url, origname, style, choice);
Options.exportFlags = choice;
}
}
void Knowit::slotEditBold()
{
Edit->setBold(actionBold->isChecked());
}
void Knowit::slotEditItalic()
{
Edit->setItalic(actionItalic->isChecked());
}
void Knowit::slotEditUnderline()
{
Edit->setUnderline(actionUnderline->isChecked());
}
void Knowit::slotEditColor()
{
TQColor color = Edit->color();
if (KColorDialog::getColor(color) == TQDialog::Accepted)
Edit->setColor(color);
}
void Knowit::slotEditSuperscript()
{
Edit->setVerticalAlignment(TQTextEdit::AlignSuperScript);
}
void Knowit::slotEditSubscript()
{
Edit->setVerticalAlignment(TQTextEdit::AlignSubScript);
}
void Knowit::slotEditNormal()
{
Edit->setVerticalAlignment(TQTextEdit::AlignNormal);
}
void Knowit::slotEditAlignLeft()
{
Edit->setAlignment(TQt::AlignLeft);
}
void Knowit::slotEditAlignRight()
{
Edit->setAlignment(TQt::AlignRight);
}
void Knowit::slotEditAlignJustify()
{
Edit->setAlignment(TQt::AlignJustify);
}
void Knowit::slotEditAlignCenter()
{
Edit->setAlignment(TQt::AlignCenter);
}
void Knowit::slotEditListBullet()
{
Edit->setParagType(TQStyleSheetItem::DisplayListItem, TQStyleSheetItem::ListDisc);
}
void Knowit::slotEditListNumber()
{
Edit->setParagType(TQStyleSheetItem::DisplayListItem, TQStyleSheetItem::ListDecimal);
}
void Knowit::slotEditListUpper()
{
Edit->setParagType(TQStyleSheetItem::DisplayListItem, TQStyleSheetItem::ListUpperAlpha);
}
void Knowit::slotEditListLower()
{
Edit->setParagType(TQStyleSheetItem::DisplayListItem, TQStyleSheetItem::ListLowerAlpha);
}
void Knowit::slotEditListNone()
{
Edit->setParagType(TQStyleSheetItem::DisplayBlock, TQStyleSheetItem::ListDisc);
}
void Knowit::slotEditFind()
{
if (soughtText != FindDlg.getText()) {
soughtText = FindDlg.getText();
lastSought = 0;
find();
}
else
find(Items->currentItem());
}
void Knowit::slotEditFindNext()
{
if (soughtText.isEmpty()) FindDlg.exec();
find(Items->currentItem());
}
void Knowit::slotEditGoTo()
{
bool Ok;
TQString page = KInputDialog::getText(i18n("Go to"),
i18n("Go to page with given title"), "", &Ok);
if (Ok && !page.isEmpty()) {
TQListViewItem* item = Items->findItem(page, 0);
if (!item) item = Items->findItem(page, 0, TQt::ExactMatch);
if (!item) item = Items->findItem(page, 0, TQt::Contains);
slotNoteChanged(item);
}
}
void Knowit::slotEditInsertDate()
{
if (Items->currentItem()) {
bool ib = actionBold->isChecked(), ii=actionItalic->isChecked(), iu=actionUnderline->isChecked();
TQColor color = Edit->color();
Edit->setItalic(Options.insertDateItalic);
Edit->setBold(Options.insertDateBold);
Edit->setUnderline(Options.insertDateUnderline);
Edit->setColor(TQColor(Options.insertDateColor));
Edit->insert(TQString("%1")
.arg(TQDateTime::currentDateTime().toString(Options.insertDateFormat)));
Edit->setItalic(ii);
Edit->setBold(ib);
Edit->setUnderline(iu);
Edit->setColor(color);
}
}
void Knowit::slotEditInsertFile()
{
if (!Items->currentItem())
return;
KURL url=KFileDialog::getOpenURL(TQString(),
i18n("*|All files"), this, i18n("Insert file..."));
if (url.isEmpty())
return;
TQFile file(url.path());
if (!file.open(IO_ReadOnly)) {
KMessageBox::error(0, i18n("<qt>Cannot open file<br><b>%1</b></qt>")
.arg(url.url()));
return;
}
TQTextStream ts(&file);
ts.setEncoding(TQTextStream::UnicodeUTF8);
TQString s, text;
while (true) {
s = ts.readLine();
if (s.isNull())
break;
if (s.isEmpty())
text += '\n';
else
text += s;
}
Edit->insert(text);
}
void Knowit::slotEditSwitch()
{
if (Items->hasFocus())
Edit->setFocus();
else Items->setFocus();
}
void Knowit::slotEditChanged()
{
actionBold->setChecked(Edit->bold());
actionItalic->setChecked(Edit->italic());
actionUnderline->setChecked(Edit->underline());
actionEditAlignLeft->setChecked(Edit->alignment() == TQt::AlignLeft);
actionEditAlignRight->setChecked(Edit->alignment() == TQt::AlignRight);
actionEditAlignCenter->setChecked(Edit->alignment() == TQt::AlignCenter);
actionEditAlignJustify->setChecked(Edit->alignment() == TQt::AlignJustify);
}
void Knowit::slotEditCursorChanged(int, int)
{
slotEditChanged();
}
void Knowit::slotOptions()
{
PrefDlg.setOptions(Options);
if (PrefDlg.exec() == TQDialog::Accepted)
applyOptions(PrefDlg.getOptions());
}
void Knowit::slotOptionsKeys()
{
KKeyDialog K(false);
K.configure(actionCollection());
}
void Knowit::slotOptionsToolbar()
{
KEditToolbar dlg(actionCollection());
if (dlg.exec())
createGUI();
}
void Knowit::slotUndock()
{
Options.docked = false;
applyOptions(Options);
}
void Knowit::slotHelpTip()
{
KTipDialog::showTip(this, 0, true);
}
void Knowit::slotActionUpdate()
{
if (Items->childCount())
stateChanged("notesPresent");
else
stateChanged("notesPresent", KXMLGUIClient::StateReverse);
Edit->setEnabled(Notes.count());
}
void Knowit::slotOverwriteModeChange(int i)
{
if (i == StatusOvr)
slotOverwriteModeChange();
}
void Knowit::slotOverwriteModeChange()
{
Edit->setOverwriteMode(!Edit->isOverwriteMode());
statusBar()->changeItem(Edit->isOverwriteMode() ? i18n("OVR") :
i18n("INS"), StatusOvr);
}
void Knowit::slotRawTextMode()
{
if (!Items->currentItem())
return;
if (Items->prevItem && Edit->isModified())
Notes.changeNote(Items->prevItem, Edit->length() ? Edit->text() : TQString());
Edit->setTextFormat(actionRawTextMode->isChecked() ?
TQt::PlainText : TQt::RichText);
Edit->setText(Notes.text(Items->currentItem()));
}
void Knowit::slotShowAttachment(TQListBoxItem*)
{
slotLinkOpen();
}
void Knowit::slotLinkAdd()
{
slotLinkDropped("", 0);
}
void Knowit::slotLinkDropped(const TQString& s, int flags)
{
TNoteLink link;
link.link = s;
if (!flags && !LinkDlg.modifyLink(link))
return;
currentNote()->addLink(link);
Links->insertItem(link.icon(), link.text(Options.linkFormat));
if (Links->count() == 1)
Links->show();
if (Options.firstLink) {
KMessageBox::information(0, i18n("You have just added your first link. "
"Please remember that only links are stored in Knowit document, "
"not linked files. If you move your document to other computer, "
"links to local files probably won't work."));
Options.firstLink = false;
}
}
void Knowit::slotLinkRemove()
{
TQString msg = i18n("<qt>Are you sure you want to remove link:<br><b>%1</b>?</qt>");
if (Links->currentItem() != -1 && KMessageBox::questionYesNo(0,
msg.arg(Links->currentText())) == KMessageBox::Yes) {
currentNote()->removeLink(Links->currentItem());
Links->removeItem(Links->currentItem());
if (!Links->count())
Links->hide();
}
}
void Knowit::slotLinkOpen()
{
if (Links->currentItem() == -1)
return;
TNoteLink link = currentNote()->link(Links->currentItem());
if (link.isLocalReference()) {
TQString s = link.link.remove(0, 9);
TQListViewItem* item = Items->findItem(s, 0);
if (!item) Items->findItem(s, 0, TQt::BeginsWith);
if (!item) Items->findItem(s, 0, TQt::Contains);
slotNoteChanged(item);
}
else
link.open();
}
void Knowit::slotLinkOpenWith()
{
if (Links->currentItem() != -1)
currentNote()->link(Links->currentItem()).openWith();
}
void Knowit::slotLinkModify()
{
if (Links->currentItem() == -1) return;
TNoteLink link = currentNote()->link(Links->currentItem());
if (LinkDlg.modifyLink(link)) {
currentNote()->modifyLink(Links->currentItem(), link);
Links->changeItem(link.icon(), link.text(Options.linkFormat),
Links->currentItem());
}
}
void Knowit::slotLinkCopy()
{
if (Links->currentItem() == -1) return;
TNoteLink link = currentNote()->link(Links->currentItem());
kapp->clipboard()->setText(link.link, TQClipboard::Clipboard);
kapp->clipboard()->setText(link.link, TQClipboard::Selection);
}