/*************************************************************************** knowit.cpp - description ------------------- begin : czw wrz 26 08:27:40 CEST 2002 copyright : (C) 2002-2004 by Micha� 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if KDE_IS_VERSION(3,2,0) #include #else #include #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) : KMainWindow(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 tqlayout.")); connect(Items, TQT_SIGNAL(contextMenu(KListView*, TQListViewItem*, const TQPoint&)), TQT_TQOBJECT(this), TQT_SLOT(slotContextMenu(KListView*, 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("

Note text

Add text for selected note here.\n" "Text can be formatted, for example bold or italic.")); 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 (KListBox) */ 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 KAction(i18n("&Export to HTML..."), "", "", TQT_TQOBJECT(this), TQT_SLOT(slotFileExport()), actionCollection(), "file_export_html"); KStdAction::print(TQT_TQOBJECT(this), TQT_SLOT(slotFilePrint()), actionCollection()); new KAction(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 KToggleAction(i18n("Toggle &bold"), "text_bold", "Ctrl+B", TQT_TQOBJECT(this), TQT_SLOT(slotEditBold()), actionCollection(), "edit_bold"); actionItalic = new KToggleAction(i18n("Toggle &italic"), "text_italic", "Ctrl+I", TQT_TQOBJECT(this), TQT_SLOT(slotEditItalic()), actionCollection(), "edit_italic"); actionUnderline = new KToggleAction(i18n("Toggle &underline"), "text_under", "Ctrl+U", TQT_TQOBJECT(this), TQT_SLOT(slotEditUnderline()), actionCollection(), "edit_underline"); new KAction(i18n("&Text color..."), "color_line", "Ctrl+#", TQT_TQOBJECT(this), TQT_SLOT(slotEditColor()), actionCollection(), "edit_color"); new KAction(i18n("&Superscript"), "text_super", "", TQT_TQOBJECT(this), TQT_SLOT(slotEditSuperscript()), actionCollection(), "edit_superscript"); new KAction(i18n("&Subscript"), "text_sub", "", TQT_TQOBJECT(this), TQT_SLOT(slotEditSubscript()), actionCollection(), "edit_subscript"); new KAction(i18n("&Normal text"), "", "", TQT_TQOBJECT(this), TQT_SLOT(slotEditNormal()), actionCollection(), "edit_align_normal"); new KAction(i18n("&Bullet list"), "", "", TQT_TQOBJECT(this), TQT_SLOT(slotEditListBullet()), actionCollection(), "list_bullet"); new KAction(i18n("&Numbered list"), "", "", TQT_TQOBJECT(this), TQT_SLOT(slotEditListNumber()), actionCollection(), "list_number"); new KAction(i18n("&Uppercase list"), "", "", TQT_TQOBJECT(this), TQT_SLOT(slotEditListUpper()), actionCollection(), "list_upper"); new KAction(i18n("&Lowercase list"), "", "", TQT_TQOBJECT(this), TQT_SLOT(slotEditListLower()), actionCollection(), "list_lower"); new KAction(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 KAction(i18n("&Go to ¬e..."), "goto", "Ctrl+G", TQT_TQOBJECT(this), TQT_SLOT(slotEditGoTo()), actionCollection(), "goto_note"); actionEditAlignLeft = new KToggleAction(i18n("Align &left"), "text_left", "Ctrl+L", TQT_TQOBJECT(this), TQT_SLOT(slotEditAlignLeft()), actionCollection(), "edit_align_left"); actionEditAlignRight = new KToggleAction(i18n("Align &right"), "text_right", "Ctrl+R", TQT_TQOBJECT(this), TQT_SLOT(slotEditAlignRight()), actionCollection(), "edit_align_right"); actionEditAlignJustify = new KToggleAction(i18n("&Justify"), "text_block", "Ctrl+J", TQT_TQOBJECT(this), TQT_SLOT(slotEditAlignJustify()), actionCollection(), "edit_align_justify"); actionEditAlignCenter = new KToggleAction(i18n("&Center"), "text_center", "Ctrl+E", TQT_TQOBJECT(this), TQT_SLOT(slotEditAlignCenter()), actionCollection(), "edit_align_center"); new KAction(i18n("Insert &date"), "date", "F5", TQT_TQOBJECT(this), TQT_SLOT(slotEditInsertDate()), actionCollection(), "edit_insert_date"); new KAction(i18n("Insert &file..."), "", "", TQT_TQOBJECT(this), TQT_SLOT(slotEditInsertFile()), actionCollection(), "edit_insert_file"); actionRawTextMode = new KToggleAction(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 KAction(i18n("&Add"), "", "Alt+Insert", TQT_TQOBJECT(this), TQT_SLOT(slotNoteAdd()), actionCollection(), "note_add"); new KAction(i18n("Add &subnote"), "", "Alt+Shift+Insert", TQT_TQOBJECT(this), TQT_SLOT(slotNoteAddChild()), actionCollection(), "note_add_child"); new KAction(i18n("&Delete"), "", "Alt+Delete", TQT_TQOBJECT(this), TQT_SLOT(slotNoteRemove()), actionCollection(), "note_delete"); new KAction(i18n("&Rename"), "", "F2", TQT_TQOBJECT(this), TQT_SLOT(slotNoteRename()), actionCollection(), "note_rename"); new KAction(i18n("E&xpand all"), "", "", TQT_TQOBJECT(Items), TQT_SLOT(slotExpandAll()), actionCollection(), "note_expand_all"); new KAction(i18n("&Expand current"), "", "Alt++", TQT_TQOBJECT(Items), TQT_SLOT(slotExpand()), actionCollection(), "note_expand"); new KAction(i18n("Co&llapse all"), "", "", TQT_TQOBJECT(Items), TQT_SLOT(slotCollapseAll()), actionCollection(), "note_collapse_all"); new KAction(i18n("&Collapse current"), "", "Alt+-", TQT_TQOBJECT(Items), TQT_SLOT(slotCollapse()), actionCollection(), "note_collapse"); new KAction(i18n("Move up"), "up", "Alt+Shift+Up", TQT_TQOBJECT(this), TQT_SLOT(slotNoteMoveUp()), actionCollection(), "note_move_up"); new KAction(i18n("Move down"), "down", "Alt+Shift+Down", TQT_TQOBJECT(this), TQT_SLOT(slotNoteMoveDown()), actionCollection(), "note_move_down"); new KAction(i18n("Move level up"), "back", "Alt+Shift+Left", TQT_TQOBJECT(this), TQT_SLOT(slotNoteMoveLeft()), actionCollection(), "note_move_left"); new KAction(i18n("Move level down"), "forward", "Alt+Shift+Right", TQT_TQOBJECT(this), TQT_SLOT(slotNoteMoveRight()), actionCollection(), "note_move_right"); new KAction(i18n("Move at the beginning"), "top", "Alt+Shift+Home", TQT_TQOBJECT(this), TQT_SLOT(slotNoteMoveBegin()), actionCollection(), "note_move_begin"); new KAction(i18n("Move at the end"), "bottom", "Alt+Shift+End", TQT_TQOBJECT(this), TQT_SLOT(slotNoteMoveEnd()), actionCollection(), "note_move_end"); new KAction(i18n("Sort"), "", "", TQT_TQOBJECT(this), TQT_SLOT(slotNoteSort()), actionCollection(), "note_sort"); /* Actions: Links */ new KAction(i18n("&Add link..."), "attach", "Ctrl+Shift+I", TQT_TQOBJECT(this), TQT_SLOT(slotLinkAdd()), actionCollection(), "link_add"); new KAction(i18n("&Remove link"), "", "", TQT_TQOBJECT(this), TQT_SLOT(slotLinkRemove()), actionCollection(), "link_remove"); new KAction(i18n("Open link"), "run", "", TQT_TQOBJECT(this), TQT_SLOT(slotLinkOpen()), actionCollection(), "link_open"); new KAction(i18n("Open link with..."), "", "", TQT_TQOBJECT(this), TQT_SLOT(slotLinkOpenWith()), actionCollection(), "link_open_with"); new KAction(i18n("&Modify link..."), "", "", TQT_TQOBJECT(this), TQT_SLOT(slotLinkModify()), actionCollection(), "link_modify"); new KAction(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 KAction(i18n("&Tip of the day"), "idea", "", TQT_TQOBJECT(this), TQT_SLOT(slotHelpTip()), actionCollection(), "help_tip"); /* Actions: nonplugged */ new KAction(i18n("Minimize"), "", "", TQT_TQOBJECT(this), TQT_SLOT(showMinimized()), actionCollection(), "window_minimize"); new KAction(i18n("Switch area"), "", "Ctrl+M", TQT_TQOBJECT(this), TQT_SLOT(slotEditSwitch()), actionCollection(), "edit_switch"); new KAction(i18n("Overwrite Mode"), "", "Insert", TQT_TQOBJECT(this), TQT_SLOT(slotOverwriteModeChange()), actionCollection(), "overwrite_mode_change"); new KAction(i18n("Go to previous note"), "", "Alt+Up", TQT_TQOBJECT(Items), TQT_SLOT(slotItemUp()), actionCollection(), "note_previous"); new KAction(i18n("Go to next note"), "", "Alt+Down", TQT_TQOBJECT(Items), TQT_SLOT(slotItemDown()), actionCollection(), "note_next"); new KAction(i18n("Go to first note"), "", "Alt+Home", TQT_TQOBJECT(Items), TQT_SLOT(slotItemBegin()), actionCollection(), "note_begin"); new KAction(i18n("Go to last note"), "", "Alt+End", TQT_TQOBJECT(Items), TQT_SLOT(slotItemEnd()), actionCollection(), "note_end"); new KAction(i18n("Go to first subnote"), "", "Alt+Right", TQT_TQOBJECT(Items), TQT_SLOT(slotItemRight()), actionCollection(), "note_right"); new KAction(i18n("Go to parent note"), "", "Alt+Left", TQT_TQOBJECT(Items), TQT_SLOT(slotItemLeft()), actionCollection(), "note_left"); /* Actions */ #if KDE_VERSION_MAJOR >= 3 && KDE_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->tqsetAlignment(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; KCmdLineArgs *args = KCmdLineArgs::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("

Cannot open resource file knowitui.rc. " "Some of the menus and toolbars will be missing.

" "

Probably Knowit was not installed properly. " "If you installed from source, please invoke make install." "If you use precompiled package, please contact packager.

")); } 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("Cannot open file
%1
") .tqarg(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 KListViewItem(current->parent(), current, name); else current = new KListViewItem(Items, current, name); else if (depth > prevdepth) /* subnote */ current = new KListViewItem(current, name); else { /* parent note */ for(uint i=depth; iparent(); if (current && current->parent()) current = new KListViewItem(current->parent(), current, name); else current = new KListViewItem(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.").tqarg(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("Cannot save file
%1
") .tqarg(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.").tqarg(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(); KMainWindow::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("File %1
\ncannot be saved. Quit anyway?
").tqarg(filename.fileName())) == KMessageBox::Yes); } else switch (KMessageBox::questionYesNoCancel(0, i18n("File %1
\nwas modified. Do you want to save it?
") .tqarg(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("Sought text:
%1
not found.
").tqarg(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 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 KDE_VERSION_MAJOR >= 3 && KDE_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(KListView*, TQListViewItem*, const TQPoint& p) { TQWidget *w = factory()->container("notes_popup", this); if (w) static_cast(w)->exec(p); } void Knowit::slotContextLinksMenu(TQListBoxItem*, const TQPoint& p) { TQWidget *w = factory()->container("links_popup", this); if (w) static_cast(w)->exec(p); } /******* Slots: Notes *******/ void Knowit::slotNoteAdd() { bool Ok; KListViewItem* 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 KListViewItem(Items->currentItem()->parent(), Items->currentItem(), text); else elt = new KListViewItem(Items, Items->currentItem(), text); else elt = new KListViewItem(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(); KListViewItem* elt; if (lastChild) elt = new KListViewItem(Items->currentItem(), lastChild, text); else elt = new KListViewItem(Items->currentItem(), text); Notes.addNote(elt); slotNoteChanged(elt); } void Knowit::slotNoteRemove() { TQListViewItem* elt = Items->currentItem(); if (!elt) return; TQString msg = elt->childCount() ? i18n("Are you sure you want to delete note
%1
" "and its subnotes?
") : i18n("Are you sure you want to delete note
%1?
"); if (KMessageBox::questionYesNo(0, msg.tqarg(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; jlinkCount(); 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("

File couldn not be saved automatically." "

Autosaving disabled - save file manually to turn autosaving on.

")); 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("File
%1
already exists. Overwrite it?
") .tqarg(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("

%1

" "Document path: %2
" "Number of notes: %3
").tqarg(filename.fileName()) .tqarg(filename.path()).tqarg(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, tqcolorGroup()); 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("File
%1
already exists. Overwrite it?
") .tqarg(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}") .tqarg(Edit->family()).tqarg(Edit->paletteForegroundColor().name()) .tqarg(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->tqsetAlignment(TQt::AlignLeft); } void Knowit::slotEditAlignRight() { Edit->tqsetAlignment(TQt::AlignRight); } void Knowit::slotEditAlignJustify() { Edit->tqsetAlignment(TQt::AlignJustify); } void Knowit::slotEditAlignCenter() { Edit->tqsetAlignment(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") .tqarg(TQDateTime::tqcurrentDateTime().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("Cannot open file
%1
") .tqarg(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->tqalignment() == TQt::AlignLeft); actionEditAlignRight->setChecked(Edit->tqalignment() == TQt::AlignRight); actionEditAlignCenter->setChecked(Edit->tqalignment() == TQt::AlignCenter); actionEditAlignJustify->setChecked(Edit->tqalignment() == 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("Are you sure you want to remove link:
%1?
"); if (Links->currentItem() != -1 && KMessageBox::questionYesNo(0, msg.tqarg(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->tqclipboard()->setText(link.link, TQClipboard::Clipboard); kapp->tqclipboard()->setText(link.link, TQClipboard::Selection); }