noblenote-1.2.0/0000775000175000017500000000000013514615415012510 5ustar chrischrisnoblenote-1.2.0/nobleNote.pro0000664000175000017500000000625713502176303015164 0ustar chrischrisTEMPLATE = app TARGET = bin/noblenote DEPENDPATH = . src INCLUDEPATH = . src OBJECTS_DIR = build MOC_DIR = build UI_DIR = build RCC_DIR = build QT += gui widgets concurrent win32 { #QMAKE_LFLAGS += -static-libgcc # use these for windows builds release builds only because debugging #symbols wont be linked if only release is specified #CONFIG -= debug_and_release #CONFIG += release RC_FILE += icon.rc } system(lrelease nobleNote.pro) # BUILDTIME and BUILDDATE will be shown in the About dialog win32 { DEFINES += BUILDTIME=\\\"$$system('echo %time%')\\\" DEFINES += BUILDDATE=\\\"$$system('echo %date%')\\\" } else { DEFINES += BUILDTIME=\\\"$$system(date '+%H:%M.%s')\\\" DEFINES += BUILDDATE=\\\"$$system(date '+%d/%m/%y')\\\" } QMAKE_DISTCLEAN = src/translations/*.qm # Input HEADERS = src/mainwindow.h src/note.h \ src/welcome.h \ src/filesystemmodel.h \ src/preferences.h \ src/findfilesystemmodel.h \ src/findfilemodel.h \ src/lineedit.h \ src/textbrowser.h \ src/xorcipher.h \ src/textformattingtoolbar.h \ src/highlighter.h src/textsearchtoolbar.h \ src/xmlnotewriter.h \ src/xmlnotereader.h \ src/datetime.h \ src/textdocument.h \ src/notedescriptor.h \ src/abstractnotereader.h \ src/htmlnotereader.h \ src/htmlnotewriter.h \ src/fileiconprovider.h \ src/backup.h \ src/trash.h \ src/progressreceiver.h \ src/noteimporter.h FORMS = src/ui/mainwindow.ui src/ui/welcome.ui src/ui/note.ui \ src/ui/preferences.ui src/ui/trash.ui SOURCES = src/main.cpp src/mainwindow.cpp src/note.cpp \ src/welcome.cpp\ src/preferences.cpp \ src/findfilemodel.cpp \ src/findfilesystemmodel.cpp src/lineedit.cpp src/textbrowser.cpp \ src/xorcipher.cpp \ src/textformattingtoolbar.cpp \ src/highlighter.cpp src/textsearchtoolbar.cpp \ src/xmlnotewriter.cpp \ src/xmlnotereader.cpp \ src/textdocument.cpp \ src/notedescriptor.cpp \ src/htmlnotereader.cpp \ src/htmlnotewriter.cpp \ src/datetime.cpp \ src/fileiconprovider.cpp \ src/backup.cpp \ src/trash.cpp \ src/progressreceiver.cpp \ src/noteimporter.cpp RESOURCES += nobleNote.qrc TRANSLATIONS = src/translations/noblenote_ast.ts\ src/translations/noblenote_cs.ts\ src/translations/noblenote_de.ts\ src/translations/noblenote_de_DE.ts\ src/translations/noblenote_es.ts\ src/translations/noblenote_gl.ts\ src/translations/noblenote_ms.ts\ src/translations/noblenote_pl.ts\ src/translations/noblenote_ru.ts\ src/translations/noblenote_uk.ts !win32{ # install target.path = /usr/bin icons.files = src/noblenote-icons/* icons.path = /usr/share/pixmaps/noblenote-icons translation.files = src/translations/*.qm translation.path = /usr/share/noblenote/translations autostart.files = autostart/noblenote.desktop autostart.path = /usr/share/applications INSTALLS = target icons translation autostart deinstall.depends = uninstall FORCE deinstall.commands = rm -R /usr/share/noblenote QMAKE_EXTRA_TARGETS = deinstall } OTHER_FILES += \ icon.rc \ src/noblenote-icons/noblenote.ico noblenote-1.2.0/nobleNote.qrc0000664000175000017500000000312013502165236015136 0ustar chrischris version.txt src/noblenote-icons/noblenote_64x64.png src/noblenote-icons/format-text-bold.png src/noblenote-icons/format-text-italic.png src/noblenote-icons/format-text-strikethrough.png src/noblenote-icons/format-text-underline.png src/noblenote-icons/fileclose.png src/noblenote-icons/emblem-web.png src/noblenote-icons/foldernew.png src/noblenote-icons/filenew.png src/noblenote-icons/folderremove.png src/noblenote-icons/fileremove.png src/noblenote-icons/folderrename.png src/noblenote-icons/filerename.png src/noblenote-icons/file.png src/noblenote-icons/cut_file.png src/noblenote-icons/folder.png src/noblenote-icons/clearFormatting.png src/noblenote-icons/trash.png src/noblenote-icons/preferences.png src/noblenote-icons/bulletpoints.png noblenote-1.2.0/src/0000775000175000017500000000000013513631003013265 5ustar chrischrisnoblenote-1.2.0/src/textbrowser.cpp0000664000175000017500000000412313502176303016366 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "textbrowser.h" #include #include TextBrowser::TextBrowser(QWidget *parent) : QTextBrowser(parent) { this->viewport()->setCursor(Qt::IBeamCursor); setOpenLinks(false); // also disables external links connect(this,SIGNAL(anchorClicked(QUrl)),this,SLOT(openLinkInBrowser(QUrl))); // because all links should be opened in the web browser } void TextBrowser::focusInEvent(QFocusEvent *event){ emit signalFocusInEvent(); QTextEdit::focusInEvent(event); } void TextBrowser::focusOutEvent(QFocusEvent *e) { emit signalFocusOutEvent(); QTextEdit::focusOutEvent(e); } void TextBrowser::openLinkInBrowser(const QUrl link) { QDesktopServices::openUrl(link); } void TextBrowser::slotSetReadOnly(bool ro) { this->setReadOnly(ro); } noblenote-1.2.0/src/noteimporter.h0000664000175000017500000000455413502176303016202 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef NOTEIMPORTER_H #define NOTEIMPORTER_H #include #include #include #include "htmlnotewriter.h" #include "progressreceiver.h" #if QT_VERSION >= 0x050000 #include #include #else #include #include #endif class NoteImporter : public QObject { Q_OBJECT public: explicit NoteImporter(QObject *parent = 0); public slots: void importDialog(); signals: private slots: void importXmlNotes(); private: struct Xml2HtmlFunctor { ProgressReceiver *p; QString path; void operator()(const QString &file) { HtmlNoteWriter::writeXml2Html(file,path); p->postProgressEvent(); } }; Xml2HtmlFunctor xml2HtmlFunctor; QProgressDialog *dialog; ProgressReceiver *progressReceiver; QFutureWatcher *futureWatcher; QStringList importFiles; QPointer fileDialog; QWidget * parentWidget; }; #endif // NOTEIMPORTER_H noblenote-1.2.0/src/progressreceiver.cpp0000664000175000017500000000512613502176303017373 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "progressreceiver.h" #include #include #include ProgressReceiver::ProgressReceiver(QObject *parent) : QObject(parent) { interval_ = 20; value_ = 0; time_ = QTime::currentTime(); } // if the event user type collides with an existing user type, the static_cast in the // event method fails const int userTypeOffset = 314; void ProgressReceiver::postProgressEvent() { value_ = ++value_; // the number of the currently processed item ProgressEvent * me = new ProgressEvent(static_cast(QEvent::User + userTypeOffset)); me->value = value_; // only report periodically if(QTime::currentTime() > time_) { time_ = time_.addMSecs(interval_); // ProgressReceiver now receives a event with the current progress QCoreApplication::postEvent(this,me); } } bool ProgressReceiver::event(QEvent *e) { ProgressEvent * me = 0; // new nullpointer constant in c++11 // is MyEvent type? if(e->type() == QEvent::User +userTypeOffset) { me = static_cast(e); // downcast // report progress if(me) { emit valueChanged(me->value); return true; } } // important! return QObject::event(e); } noblenote-1.2.0/src/findfilemodel.h0000664000175000017500000000611213502176303016244 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef FINDFILEMODEL_H #define FINDFILEMODEL_H #include #include #include #include #include #include #include /** * @brief a model that shows a list of files * */ class FindFileModel : public QStandardItemModel { Q_OBJECT public: explicit FindFileModel(QObject *parent = 0); QString fileName(const QModelIndex & index) const; QString filePath(const QModelIndex & index) const; bool remove(const QModelIndex & index); QFileInfo fileInfo(const QModelIndex & index) const; void appendFile(QString filePath); // append file with full path static QStringList find0(const QString &searchName, const QString &searchText,const QString& path); // searchName and searchText can be null QStrings void findInFiles(const QString &path, const QString& fileName, const QString &content); QStringList mimeTypes() const; QMimeData * mimeData(const QModelIndexList &indexes) const; bool setData(const QModelIndex &index, const QVariant &value, int role); // returns if rename succeeded, overwritten to enable QAbstractItemView::edit qint64 size(const QModelIndex &index) const; // returns the file size in bytes private: struct FileContains // functor that checks if a text file (read as html) contains a given text { QString fileName; QString content; bool operator()(const QString& htmlFilePath); private: bool fileContentContains(const QString& htmlFilePath); }; QFuture future; FileContains fileContainsFunctor; QFutureWatcher futureWatcher; private slots: void findInFilesFinished(); // populate model with find results void restoreOverrideCursor(); }; #endif // FINDFILEMODEL_H noblenote-1.2.0/src/xmlnotewriter.cpp0000664000175000017500000001305313502176303016723 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "xmlnotewriter.h" #include "datetime.h" #include #include #include #include #include XmlNoteWriter::XmlNoteWriter() :frame_(NULL) { } XmlNoteWriter::XmlNoteWriter(const QString &filePath) : file(filePath) { if(!file.open(QIODevice::WriteOnly)) { //qDebug(qPrintable(QString("XmlNoteWriter::XmlNoteWriter failed : could not open filepath ") + QDir::toNativeSeparators(filePath))); return; } QXmlStreamWriter::setDevice(&file); } // must write well formed xml 1.0 for QXmlStreamReader compatibility void XmlNoteWriter::write() { if(!this->QXmlStreamWriter::device() || !frame_) { qDebug("XmlNoteWriter::write failed: textframe NULL or output device are NULL"); return; } setAutoFormatting(true); writeStartDocument(); writeStartElement("note"); writeAttribute("version","0.3"); writeNamespace("http://example.com","link"); if(!uuid_.isNull()) { QString uuidStr = uuid_.toString().remove(0,1); // uuid without the { } braces uuidStr.chop(1); writeTextElement("id","urn:uuid:" + uuidStr); } else { qDebug("XmlNoteWriter::write() : UUID is null, using generated UUID"); QString uuidStr = QUuid::createUuid().toString().remove(0,1); uuidStr.chop(1); writeTextElement("id","urn:uuid:" + uuidStr); } writeTextElement("title",frame_->document()->metaInformation(QTextDocument::DocumentTitle)); writeStartElement("text"); writeAttribute("xml:space","preserve"); writeStartElement("note-content"); // tomboy compatibility writeAttribute("version","0.1"); for(QTextFrame::Iterator it = frame_->begin(); it != frame_->end(); ++it) { // QTextCursor cursor(it.currentBlock()); // cursor.movePosition(QTextCursor::PreviousBlock); // cursor.movePosition(QTextCursor::EndOfBlock); // cursor.movePosition(QTextCursor::NextBlock,QTextCursor::KeepAnchor); // writeCharacters(cursor.selectedText().replace(QChar(QChar::ParagraphSeparator),QString('\n'))); // qDebug() << "selected Text:" << cursor.selectedText(); for(QTextBlock::Iterator blit = it.currentBlock().begin(); blit != it.currentBlock().end(); ++blit) { //qDebug("block iteration"); int elements = 0; if(blit.fragment().charFormat().fontItalic()) writeStartElement("italic"),++elements; if(blit.fragment().charFormat().fontStrikeOut()) writeStartElement("strikethrough"),++elements; if(blit.fragment().charFormat().fontWeight() > QFont::Normal) writeStartElement("bold"),++elements; if(blit.fragment().charFormat().underlineStyle() != QTextCharFormat::NoUnderline) writeStartElement("underline"),++elements; writeCharacters(blit.fragment().text().replace(QChar(QChar::ParagraphSeparator),QString('\n'))); //writeCharacters(QString('\n')); for(int i = 0; iapplicationName()); writeEndElement(); writeEndElement(); // "note" writeEndDocument(); } noblenote-1.2.0/src/welcome.cpp0000664000175000017500000001125213502176303015432 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "welcome.h" #include "lineedit.h" #include #include Welcome::Welcome(QWidget *parent): QDialog(parent) { setupUi(this); isPortable = QSettings().value("isPortable",false).toBool(); path = new LineEdit(this); if(isPortable) defaultPath = QDir::toNativeSeparators(qApp->applicationDirPath() + "/" + qApp->applicationName()); else defaultPath = QDir::toNativeSeparators(QDir::homePath() + "/" + qApp->applicationName()); path->setText(defaultPath); gridLayout->addWidget(path, 3, 0, 1, 1); connect(browse, SIGNAL(clicked(bool)), this, SLOT(openDir())); connect(this, SIGNAL(accepted()), this, SLOT(setRootDir())); } void Welcome::openDir(){ QString standardPath; if(isPortable) standardPath = qApp->applicationDirPath(); else standardPath = QDir::homePath(); QString str = QFileDialog::getExistingDirectory(this, tr("Choose a directory"), standardPath, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); if(str != "") path->setText(str); else path->setText(defaultPath); } void Welcome::setRootDir(){ if(path->text() == "") QSettings().setValue("root_path", defaultPath); else QSettings().setValue("root_path", path->text()); } void Welcome::getInstance(bool rootPathIsSet, bool rootPathExists, bool rootPathIsWritable) { if(isPortable) { if(!rootPathIsSet) welcomeText->setText(tr("Welcome to nobleNote!\nThis is the first time that nobleNote has been started.\n" "This is the portable edition of nobleNote.\n" "You are encouraged to use the default path, but you can also choose any other directory." )); if(rootPathIsSet && !rootPathExists) welcomeText->setText(tr("Welcome to nobleNote!\nThe set path for the notes does not exist.\n" "Maybe it has been moved or renamed.\n" "You can choose a new directory where the notes are or where they will be saved in.")); if(rootPathExists && !rootPathIsWritable) welcomeText->setText(tr("Welcome to nobleNote!\nThe path where the notes are located is not writable.\n" "Maybe your drive is running in read only mode.")); } else { if(!rootPathIsSet) welcomeText->setText(tr("Welcome to nobleNote!\nThis is the first time that nobleNote has been started.\n" "You can choose a directory where the notes will be saved in.")); if(rootPathIsSet && !rootPathExists) welcomeText->setText(tr("Welcome to nobleNote!\nThe set path for the notes does not exist.\n" "Maybe it has been moved or renamed.\n" "You can choose a new directory where the notes are or where they will be saved in.")); if(rootPathExists && !rootPathIsWritable) welcomeText->setText(tr("Welcome to nobleNote!\nThe path where the notes are located is not writable.\n" "You can choose a new directory where the notes will be saved in. " "Otherwise changes might not be saved.")); } } noblenote-1.2.0/src/fileiconprovider.h0000664000175000017500000000337613502176303017017 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef FILEICONPROVIDER_H #define FILEICONPROVIDER_H #include /** * @brief The FileIconProvider class provides icons for the note and folder lists */ class FileIconProvider : public QFileIconProvider { public: FileIconProvider(); /*override*/ QIcon icon ( const QFileInfo & info ) const; inline void setCutFiles(QStringList files) {this->cutFiles = files;} private: QStringList cutFiles; }; #endif // FILEICONPROVIDER_H noblenote-1.2.0/src/mainwindow.h0000664000175000017500000001336413502176303015626 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef NOBLENOTE_H #define NOBLENOTE_H #include "ui_mainwindow.h" #include "htmlnotewriter.h" #include "progressreceiver.h" #include "noteimporter.h" #include #include #if QT_VERSION >= 0x050000 #include #include #include #include #include #include #include #include #include #include #include #include #include #else #include #include #include #include #include #include #include #include #include #include #include #include #include #endif #include /** * @brief note taking application main window * * nb short for notebook * n short for note * f short for folder */ //#define NO_SYSTEM_TRAY_ICON class Welcome; class FileIconProvider; class Preferences; class FindFileModel; class FindFileSystemModel; class FileSystemModel; class LineEdit; class Note; class Highlighter; class ProgressReceiver; class Backup; class FlickCharm; class MainWindow : public QMainWindow, public Ui::MainWindow { Q_OBJECT // important for creating own singals and slots public: MainWindow(); ~MainWindow(); public slots: void showOpenNotes(); void quit(); private: Welcome *welcome; QFileSystemWatcher *fileWatcher; FileIconProvider *folderIconProvider, *noteIconProvider; QSplitter *splitter; LineEdit *searchName, *searchText; FindFileSystemModel *folderModel; FileSystemModel *noteFSModel; FindFileSystemModel *noteModel; QListView *folderView, *noteView; QAction *quit_action, *minimizeRestoreAction; QPointer pref; QHBoxLayout *hBoxLayout; FindFileModel *findNoteModel; QList > openNotes; // every access to openNotes must check for null pointers QPointer backup; QStringList shortcutNoteList; NoteImporter * noteImporter; #ifndef NO_SYSTEM_TRAY_ICON QMenu *iMenu; QSystemTrayIcon *TIcon; #endif Note * noteWindow(const QString & filePath); // return the open note window for the note at filePath bool noteIsOpen(const QString &path); QString getToBerenamedNotebook; //used for recent file list private slots: void writeBackupDirPath(); void changeRootIndex(); void makeStandardPaths(); void enableNoteMenu(const QItemSelection &selected, const QItemSelection &deselected); void showPreferences(); void showBackupWindow(); void folderActivated(const QModelIndex &selected); void folderActivated(const QItemSelection &selected, const QItemSelection &deselected); //Wrapper void noteActivated(const QModelIndex &selected); void noteActivated(const QItemSelection &selected, const QItemSelection &deselected); //Wrapper #ifndef NO_SYSTEM_TRAY_ICON void iconActivated(QSystemTrayIcon::ActivationReason reason); void tray_actions(); #endif void find(); void openNote(const QModelIndex &ind); void openOneNote(QString path); void openAllNotes(); void createAndUpdateRecent(); void openRecent(); void openNoteSource(); void showContextMenuFolder(const QPoint &pos); void showContextMenuNote(const QPoint &pos); void newFolder(); void newNote(); void renameFolder(); void renameNote(); void removeFolder(); void removeNote(); void setKineticScrollingEnabled(bool b); void folderRenameFinished( QWidget * editor, QAbstractItemDelegate::EndEditHint hint = QAbstractItemDelegate::NoHint ); // reloads current folder void noteRenameFinished(const QString &path, const QString &oldName, const QString &newName); // updates window title void getCutFiles(); void pasteFiles(); void about(); void selectFolder(); protected: void keyPressEvent(QKeyEvent *k); virtual void closeEvent(QCloseEvent* window_close); virtual void showEvent(QShowEvent* window_show); virtual void hideEvent(QHideEvent* window_hide); }; #endif noblenote-1.2.0/src/findfilemodel.cpp0000664000175000017500000001575613502176303016615 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "findfilemodel.h" #include #include #include #include #include #include #include #include #include FindFileModel::FindFileModel(QObject *parent) : QStandardItemModel(parent) { connect(&futureWatcher,SIGNAL(finished()),this,SLOT(findInFilesFinished())); connect(&futureWatcher, SIGNAL(canceled()), this, SLOT(restoreOverrideCursor())); } QString FindFileModel::fileName(const QModelIndex &index) const { return QFileInfo(itemFromIndex(index)->data(Qt::UserRole + 1).toString()).fileName(); } QString FindFileModel::filePath(const QModelIndex &index) const { return QFileInfo(itemFromIndex(index)->data(Qt::UserRole + 1).toString()).filePath(); } qint64 FindFileModel::size(const QModelIndex &index) const { return QFileInfo(itemFromIndex(index)->data(Qt::UserRole + 1).toString()).size(); } bool FindFileModel::remove(const QModelIndex &index) { QStandardItem * item = itemFromIndex(index); if(!item) { qWarning("FindFileModel::remove failed: itemFromIndex returned NULL"); return false; } QString filePath = item->data(Qt::UserRole + 1).toString(); bool b = QFile::remove(filePath); if(b) this->removeRow(index.row(),index.parent()); return b; } QFileInfo FindFileModel::fileInfo(const QModelIndex &index) const { return QFileInfo(itemFromIndex(index)->data(Qt::UserRole + 1).toString()); } void FindFileModel::appendFile(QString filePath) { QFileInfo info(filePath); if(info.path().isEmpty() || info.path() == ".") { qWarning("FindFileModel::appendFile failed: filePath must contain the full path including the file name"); return; } QString filePathTrunc = info.filePath(); while(filePathTrunc.count(QDir::separator()) > 1) filePathTrunc.remove(0,filePathTrunc.indexOf(QDir::separator())+1); QStandardItem * fileItem = new QStandardItem(filePathTrunc); fileItem->setIcon(QFileIconProvider().icon(info)); fileItem->setData(filePath,Qt::UserRole + 1); // store as user data appendRow(fileItem); } bool FindFileModel::setData(const QModelIndex &index, const QVariant &value, int role) { QStandardItemModel::setData(index,value,role); //set new name for list item //rename file before changing path of original file //value can be folder/filename or simply filename bool f = QFile::rename(filePath(index),fileInfo(index).path() + QDir::separator() + QFileInfo(value.toString()).fileName()); //change path data QStandardItemModel::setData(index, fileInfo(index).path() + QDir::separator() + QFileInfo(value.toString()).fileName(), Qt::UserRole + 1); return f; } QStringList FindFileModel::mimeTypes() const { return QStringList(QString("text/uri-list")); } QMimeData *FindFileModel::mimeData(const QModelIndexList &indexes) const { QList urls; for(QModelIndexList::ConstIterator it = indexes.constBegin(); it != indexes.constEnd(); ++it) { urls+=QUrl::fromLocalFile(this->filePath(*it)); } QMimeData * mimeData = new QMimeData(); mimeData->setUrls(urls); return mimeData; } // this method may be called multiple times if the user is typing a search word void FindFileModel::findInFiles(const QString& fileName, const QString &content,const QString &path) { if(path.isEmpty() || (fileName.isEmpty() && content.isEmpty())) return; if(future.isRunning()) future.cancel(); else QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); QStringList files; QDirIterator it(path, QDirIterator::Subdirectories); while(it.hasNext()) { QString filePath = it.next(); if(it.fileInfo().isFile()) files << filePath; } fileContainsFunctor.content = content; fileContainsFunctor.fileName = fileName; future = QtConcurrent::filtered(files,fileContainsFunctor); futureWatcher.setFuture(future); // sometimes, wait cursor persists, this is a workaround QTimer::singleShot(5000,this,SLOT(restoreOverrideCursor())); } void FindFileModel::findInFilesFinished() { const auto res = future.results(); for(QString fileName : res ) this->appendFile(fileName); QApplication::restoreOverrideCursor(); } void FindFileModel::restoreOverrideCursor() { QApplication::restoreOverrideCursor(); } bool FindFileModel::FileContains::operator ()(const QString& htmlFilePath) { if(!fileName.isEmpty() && !content.isEmpty()) return QFileInfo(htmlFilePath).baseName().contains(fileName, Qt::CaseInsensitive) || fileContentContains(htmlFilePath); else if(!content.isEmpty()) return fileContentContains(htmlFilePath); else return QFileInfo(htmlFilePath).baseName().contains(fileName, Qt::CaseInsensitive); } bool FindFileModel::FileContains::fileContentContains(const QString &htmlFilePath) { static QRegularExpression htmlRegex("<[^>]*>"); QFile file(htmlFilePath); if(file.open(QIODevice::ReadOnly)) { QTextStream in(&file); //QTextDocumentFragment doc = QTextDocumentFragment::fromHtml(in.readAll()); //QString noteText = doc.toPlainText(); //return noteText.contains(content, Qt::CaseInsensitive); // remove this string here exactly once const static QString whiteSpacePreWrap = "p, li { white-space: pre-wrap; }"; QString text = in.readAll(); int index; if((index = text.indexOf(whiteSpacePreWrap)) != -1) { text.remove(index,whiteSpacePreWrap.size()); } return text.remove(htmlRegex).contains(content.toHtmlEscaped(),Qt::CaseInsensitive); } return false; } noblenote-1.2.0/src/main.cpp0000664000175000017500000001045613502176303014730 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "mainwindow.h" #include #include #include #include #include #include "welcome.h" int main (int argc, char *argv[]){ QApplication app(argc, argv); app.setApplicationName("nobleNote"); app.setOrganizationName("nobleNote"); //Qt translations QTranslator qtTranslator; qtTranslator.load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); app.installTranslator(&qtTranslator); //NobleNote translations QTranslator translator; #ifdef Q_OS_WIN32 translator.load(":" + QLocale::system().name()); #else QString tmp = "/usr/share/noblenote/translations/noblenote_"; translator.load(tmp + QLocale::system().name()); #endif app.installTranslator(&translator); app.setQuitOnLastWindowClosed(false); QSettings::setDefaultFormat(QSettings::IniFormat); QFileInfo settingsFile = QFile(QDir::toNativeSeparators(app.applicationDirPath() + "/" + app.applicationName() + "/" + QFileInfo(QSettings().fileName()).fileName())); if(settingsFile.exists()) //check if there is a conf/ini file in a folder called nobleNote next to the executable (for portable version) { QDir settingsParentDir = settingsFile.dir(); settingsParentDir.cdUp(); //cdUp because the current folder will be created by QSettings here after. QSettings::setPath(QSettings::IniFormat,QSettings::UserScope,settingsParentDir.absolutePath()); //use this file instead of system standard if this is the case QSettings().setValue("isPortable",true); } else QSettings().setValue("isPortable",false); if(!QSettings().isWritable()) // TODO QObject::tr does not work here because there is no Q_OBJECT macro in main QMessageBox::critical(0,"Settings not writable", QString("%1 settings not writable!").arg(app.applicationName())); if(!QFile(QSettings().value("import_path").toString()).exists()) QSettings().setValue("import_path", QDir::homePath()); bool rootPathIsSet = QSettings().value("root_path").isValid(); bool rootPathExists = QFileInfo(QSettings().value("root_path").toString()).exists(); bool rootPathIsWritable = QFileInfo(QSettings().value("root_path").toString()).isWritable(); if(!rootPathExists || !rootPathIsWritable) { QScopedPointer welcome(new Welcome); welcome->getInstance(rootPathIsSet, rootPathExists, rootPathIsWritable); if(welcome->exec() == QDialog::Rejected) // welcome writes the root path return 0; // leave main if the user rejects the welcome dialog, else go on } else if(!rootPathIsSet) QSettings().setValue("root_path", app.applicationDirPath() + "/" + app.applicationName()); MainWindow window; if(QSettings().value("Hide_main_at_startup",false).toBool()) window.showOpenNotes(); else window.show(); return app.exec(); } noblenote-1.2.0/src/ui/0000775000175000017500000000000013513631003013702 5ustar chrischrisnoblenote-1.2.0/src/ui/preferences.ui0000664000175000017500000002256313502165236016562 0ustar chrischris Preferences 0 0 439 437 0 0 Preferences :/nobleNote:/nobleNote 10 true 0 0 &Browse ... QDialogButtonBox::Cancel|QDialogButtonBox::Ok 75 true Note editor default font: DejaVu Sans 10 75 true Note editor default size: &Close to tray QLayout::SetDefaultConstraint Width: Height: 65536 5 335 65536 5 250 Automatically convert non-HTML notes to the HTML format. If disabled, non-HTML notes are opened read only. Convert notes to the &HTML format Number of recently opened notes 0 0 15 5 Enables drag to scroll &Touch screen scrolling Do not show the main interface and notes on startup. (Minimized to tray icon) &Hide main window at startup &Show "Show Source" menu entry 0 0 QFrame::StyledPanel root folder true Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse 0 0 75 true Root directory: 0 0 75 true Backup directroy: 0 0 backup folder true Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse browseButton dontQuit convertNotes kineticScrolling sizeSpinWidth sizeSpinHeight fontComboBox fontSizeComboBox buttonBox buttonBox rejected() Preferences reject() 174 83 174 59 noblenote-1.2.0/src/ui/note.ui0000664000175000017500000000127513502165236015223 0ustar chrischris Note 0 0 500 355 Note-Editor :/nobleNote:/nobleNote noblenote-1.2.0/src/ui/mainwindow.ui0000664000175000017500000001706013502165236016431 0ustar chrischris MainWindow 0 0 280 331 nobleNote :/nobleNote:/nobleNote Qt::ToolButtonTextUnderIcon 0 0 280 23 &File Open recent &Settings &Help &View &Edit TopToolBarArea false &Quit Ctrl+Q &Import :/preferences:/preferences &Configure... Ctrl+P &About true true &Show toolbar Ctrl+Shift+T :/trash:/trash &Trash Ctrl+T false :/history:/history &History Ctrl+Shift+H false :/newFolder:/newFolder &New notebook Ctrl+N :/renameFolder:/renameFolder &Rename notebook Ctrl+R :/deleteFolder:/deleteFolder &Delete notebook Ctrl+D :/newNote:/newNote &New note Ctrl+Shift+N false :/renameNote:/renameNote &Rename note Ctrl+Shift+R false false :/deleteNote:/deleteNote &Delete note Ctrl+Shift+D &Cut Ctrl+X false &Paste Ctrl+V a noblenote-1.2.0/src/ui/welcome.ui0000664000175000017500000000564113502165236015712 0ustar chrischris Welcome 0 0 421 220 Welcome to nobleNote Qt::Horizontal 40 20 Welcome to nobleNote! This is the first time that nobleNote has been started. You can choose a directory where the notes will be saved in. true &Browse Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok Qt::Vertical 20 40 Qt::Vertical 20 40 buttonBox accepted() Welcome accept() 248 254 157 274 buttonBox rejected() Welcome reject() 316 260 286 274 noblenote-1.2.0/src/ui/trash.ui0000664000175000017500000000704013502165236015373 0ustar chrischris Trash 0 0 468 355 Trash Qt::Horizontal QDialogButtonBox::Close &Restore &Delete true 0 0 Select the notes you want to delete or restore true 0 0 Preview true QAbstractItemView::ExtendedSelection QAbstractItemView::ScrollPerPixel true Deleted notes treeWidget restoreButton deleteButton buttonBox textEdit buttonBox rejected() Trash reject() 316 260 286 274 noblenote-1.2.0/src/trash.cpp0000664000175000017500000001134313502176303015121 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "trash.h" #include #include Trash::Trash(QHash *backupDataHash, QWidget *parent): QDialog(parent){ setupUi(this); setAttribute(Qt::WA_DeleteOnClose); const auto keys = backupDataHash->keys(); for(QString key : keys) { QTreeWidgetItem *item = new QTreeWidgetItem(treeWidget); item->setText(0,backupDataHash->value(key).first()); //title item->setData(0,Qt::UserRole,backupDataHash->value(key)); //title, path and content } treeWidget->sortByColumn(0,Qt::AscendingOrder); // TODO flickcharm here connect(treeWidget, SIGNAL(itemSelectionChanged()), this, SLOT(showPreview())); connect(deleteButton, SIGNAL(clicked(bool)), this, SLOT(deleteBackup())); connect(restoreButton, SIGNAL(clicked(bool)), this, SLOT(restoreBackup())); } void Trash::restoreBackup() { if(treeWidget->selectedItems().isEmpty()) return; QString dir = QSettings().value("root_path").toString()+"/restored notes"; if(!QDir(dir).exists()) QDir().mkpath(dir); for(QTreeWidgetItem *item : treeWidget->selectedItems()) { QStringList dataList = item->data(0,Qt::UserRole).toStringList(); QString title = dataList.takeFirst(); if(!QFile(dataList.first()).exists()) return; else { QString filePath = dir+QDir::separator()+title; int i = 0; while(QFile::exists(filePath)) { i++; filePath = dir+QDir::separator()+title+" ("+QString::number(i)+")"; } QFile(dataList.first()).copy(filePath); } delete item; } } void Trash::deleteBackup() { if(treeWidget->selectedItems().isEmpty()) return; QStringList files; const QList itemList = treeWidget->selectedItems(); for(QTreeWidgetItem *item : itemList) { QStringList dataList = item->data(0,Qt::UserRole).toStringList(); dataList.takeFirst(); //removing title from the list files << dataList.first(); } if(QMessageBox::warning(this,tr("Deleting notes"), tr("Are you sure you want to permanently delete the selected notes?") ,QMessageBox::Yes | QMessageBox::Abort) != QMessageBox::Yes) return; for(QString file : files) { if(QFile(file).exists()) QFile(file).remove(); QString uuid = file; uuid.remove(QSettings().value("backup_dir_path").toString() + QDir::separator()); QSettings().remove("Notes/" + QUuid(uuid).toString() + "_size"); QSettings().remove("Notes/" + QUuid(uuid).toString() + "_cursor_position"); QSettings().remove("Notes/" + QUuid(uuid).toString() + "_window_position"); } for(QTreeWidgetItem *item : itemList) delete item; } void Trash::showPreview() { if(treeWidget->currentItem() == NULL) //Prevents program crush { textEdit->clear(); return; } if(!treeWidget->currentItem()->isSelected()) { if(treeWidget->selectedItems().count() != 1) textEdit->clear(); else textEdit->setText(treeWidget->selectedItems().first()->data(0,Qt::UserRole).toStringList().last()); } else textEdit->setText(treeWidget->currentItem()->data(0,Qt::UserRole).toStringList().last()); } noblenote-1.2.0/src/xmlnotewriter.h0000664000175000017500000000757013502176303016377 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef XMLNOTEWRITER_H #define XMLNOTEWRITER_H #include #include #include #include #include #include /** * a class writing formatted text in xml files * the format is similar to the xml format used by tomboy/gnote * writing requires a QTextFrame * * Warning: when using a QIODevice for each of the methods XmlNoteReader::read, XmlNoteWriter::write * and the static XmlNoteReader::uuid(QIODevice* devce) * the device must be closed and opened separately * The same QString* in QXmlStreamWriter cannot be reused in QXmlStreamReader. * * * this class should not be used at the moment because the xml output is missing new line special chars * this is due to implementation problems of the detection of QChar::ParagraphSeparator between the QTextFragments and * QTextBlocks while iterating over a QTextFragment. See write() for details * */ class XmlNoteWriter : protected QXmlStreamWriter { public: XmlNoteWriter(); XmlNoteWriter(const QString &filePath); // Warning: The application will crash if device* points to a local stack object // that gets destroyed before write() is called void setDevice(QIODevice * device) { QXmlStreamWriter::setDevice(device);} QIODevice * device() const { return QXmlStreamWriter::device();} // obtain this via QTextFrame* frame = textEdit->document()->rootFrame(); void setFrame(QTextFrame * frame) { frame_ = frame;} QTextFrame * frame() const { return frame_;} // set last change date, if not set, the current date is used void setLastChange(const QDateTime& dt) { lastChange_ = dt;} const QDateTime& lastChange() const { return lastChange_;} // set last metadata change date, if not set, the current date is used void setLastMetadataChange(const QDateTime& dt) { lastMetadataChange_ = dt;} const QDateTime& lastMetadataChange() const { return lastMetadataChange_;} // set create date, if not set, the current date is used void setCreateDate(const QDateTime& dt) { createDate_ = dt;} const QDateTime& createDate() const { return createDate_;} void write(); // write the content's of frame to the specified device/outputString void setUuid(QUuid uuid) { uuid_ = uuid;} QUuid uuid() const {return uuid_;} // TODO clear statement? private: QTextFrame * frame_; QUuid uuid_; QDateTime lastChange_; QDateTime lastMetadataChange_; QDateTime createDate_; QFile file; }; #endif // XMLNOTEWRITER_H noblenote-1.2.0/src/note.h0000664000175000017500000001035413502176303014413 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef NOTE_H #define NOTE_H #include "ui_note.h" #include "textdocument.h" #include #include #include #include #include #include #include #include "textbrowser.h" class TextFormattingToolbar; class TextSearchToolbar; class Highlighter; class NoteDescriptor; /** * @brief The Note class is the widget that displays note content * * most lifecycle handling and loading/saving of html and xml type notes is handled * in NoteDescriptor. * * note loading workflow: * //TODO workflow should be refactored to load the file before creating the note window * * this clas creates a NoteDescriptor * the NoteDescriptor loads the html file asynchronously and reads the uuid * a signal onLoadFinished() is sent, this is used in this class to call loadSizeAndShow * loadSizeAndShow reads the UUId from NoteDescriptor, that is now initialized * (before, it is 0000-...) and loads the Note Window size from the QSettings * loadSizeAndSHow resizes the Note window and calls show() * * you should not directly call show() but instead call showAfterLoaded() * to set the flag to show the Note window after all initialization has been finished */ class Note : public QMainWindow, public Ui::Note { Q_OBJECT // important for creating own singals and slots public: Note(QString filePath, QWidget *parent = 0); NoteDescriptor* noteDescriptor() const { return noteDescriptor_; } void highlightText(const QString & str); QTextEdit * textEdit() const { return textBrowser;} // the future of the worker thread that handles saving settings QFuture future() const { return future_;} // adds this file Path to the list of open notes that is stored in the settings static void addToOpenNoteList(QString path); private: TextBrowser *textBrowser; TextDocument *textDocument; QMenu *menu; QAction *showHideToolbars; TextFormattingToolbar *toolbar; TextSearchToolbar *searchBar; QFuture future_; // a future that holds the worker thread that is invoked when window states are changed NoteDescriptor *noteDescriptor_; bool showAfterLoading_; // state variable, call show() after loadSizeAndShow() // this is called asynchronously when the window is closed and saves geometry etc. void saveWindowState(QVariantList variantList); public slots: void setSearchBarText(QString str); void showAfterLoaded(); // calls show() after loading data and size settings private slots: void showContextMenu(const QPoint &pt); void showOrHideToolbars(); protected: void keyPressEvent(QKeyEvent *k); void keyReleaseEvent(QKeyEvent *k); virtual void closeEvent(QCloseEvent *close_Note); // focus events must be overridden in the TextBrowser class private slots: void loadSizeAndShow(); // load size from settings and resize }; #endif noblenote-1.2.0/src/lineedit.cpp0000664000175000017500000000537513502176303015605 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "lineedit.h" #include #include LineEdit::LineEdit(QWidget *parent) : QLineEdit(parent) { clearButton = new QToolButton(this); QPixmap pixmap(":closeB"); clearButton->setIcon(QIcon(pixmap)); clearButton->setIconSize(pixmap.size()); clearButton->setCursor(Qt::ArrowCursor); clearButton->setStyleSheet("QToolButton { border: none; padding: 0px; }"); clearButton->hide(); connect(clearButton, SIGNAL(clicked()), this, SLOT(clear())); connect(clearButton, SIGNAL(clicked()), this, SIGNAL(sendCleared())); connect(this, SIGNAL(textChanged(const QString&)), this, SLOT(updateCloseButton(const QString&))); int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); setStyleSheet(QString("QLineEdit { padding-right: %1px; } ").arg(clearButton->sizeHint().width() + frameWidth + 1)); QSize msz = minimumSizeHint(); setMinimumSize(qMax(msz.width(), clearButton->sizeHint().height() + frameWidth * 2 + 2), qMax(msz.height(), clearButton->sizeHint().height() + frameWidth * 2 + 2)); } void LineEdit::resizeEvent(QResizeEvent *) { QSize sz = clearButton->sizeHint(); int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth); clearButton->move(rect().right() - frameWidth - sz.width(), (rect().bottom() + 1 - sz.height())/2); } void LineEdit::updateCloseButton(const QString& text) { clearButton->setVisible(!text.isEmpty()); } noblenote-1.2.0/src/xorcipher.h0000664000175000017500000000325713502176303015455 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef XORCIPHER_H #define XORCIPHER_H #include /** * simple Xor encryption/decryption class * * */ class XorCipher { private: XorCipher(); public: // todo also encrypt the key if it is kept in memory static QString encrypt(QString sourceString, ushort key); static QString decrypt(QString encryptedString, ushort key); }; #endif // XORCIPHER_H noblenote-1.2.0/src/noblenote-icons/0000775000175000017500000000000013513631003016363 5ustar chrischrisnoblenote-1.2.0/src/noblenote-icons/clear_formatting_smooth_eraser.svg0000664000175000017500000004241413502165236025373 0ustar chrischris image/svg+xml Asadf Asadf Aa noblenote-1.2.0/src/noblenote-icons/filerename.png0000664000175000017500000000300713502165236021210 0ustar chrischrisPNG  IHDR00WsRGBbKGD pHYs B(xtIME JWIDAThYOhU?3ǰ4Cj %i!&x0RRH)}ժ-:S t-)]o^` 躠 VJm )#BR!9i^ho@Xݻw.vR88t @XÇ1::L&e3R Rz BQqܻw'ODOOle?}0 ?~333eY(8\ׅm۰m ZI,--aqqLJ*LL|ض8Np4uXXo/1/g? 5b;)vF>BT@㗫WzLO.sܺgwXغl6 o=*>ێĜspQ.aFV0 |wD\F\^ݗ8,;qv48rJfffv>x  åQÇ 4ҖyujF#xg/t_>jn5Ya*]wAdBQiq 庮z!*$ze;%^A&nbѠ޵ c E~uuENJTIbQmNvz0hL)oTJFy4Rk_D 4jo285E'˙gA)\TTye=aj6IENDB`noblenote-1.2.0/src/noblenote-icons/trash.png0000664000175000017500000001212413502165236020222 0ustar chrischrisPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDAThZytTuo]팄$$ЮY4}$ vq'iO6'1998mr&Nlp@0Ҍ$͌ i4E~OC@ww{w߽}O>|Q1N!NJ@Sqb0aeeDz|a H  s,|s@ /ysOj@vvP${gDrT.:kG=*KB>(A(p@e hLOτ[adtr;P(;̛+/l)+2DO=LTWAFz  cF"98YObӏˏ~1gab|6$%X$!pH(߉CRiL0 HB w6:X?pDN򬩷Uy/#{i~'<~p>^B>aXU6ȲLG4x Ҵq1U;ޕ޽|>ʶm LMKJJn2*g1V ʊO0K $sp ӊJ_rQӓ7ʀ3/oN3@xiD"!n@(?kK8qSO>gٵ{#cvVyխ55G'*k~qiheyc):D"Z^# yM ~E=CQI,ELZ0G@RZ/..>c0>[揾ܰ}שś[_tcc㥺m{ZZZzjkktt](%luYKK )P Ѝ9}^|~"p"I*^:c,zH!W*. }P;l5T 4Dߺu?n7FwUU_:V6'ngcbB>Wf0 ^bYwǾ }}Nҕ_[m6,kOiן\LsS 2 OsO7luF͆F|#p 8 Bw +-stKexux, D׿U&//a6r߂sKkᘅAmU5JxfAljggrEqeyMbYچ,<9۵nַ̑F_B#ڧAj:l-NNHKj#[jDX\XN-X-VxpPԞLɾq! æLذa( HNNj=:Sr{ܑQƧ&q  ×I|dfF#j&/.槦ʰHHgqꠤ)l^ \q Cʺv0geeAJr2v @u@AKu0fjqo YyAq=6C!Ĉ%d>wV[Z`@{@$BS糲2inj9]6DS P*EB=/;KK &GH%6P$h'_{Ι31"xD,M&K߉dMBhO"FЄF¹Ab$~xВs yOz> q(׵qm-mp%8ޑ%<}~fjT!L%1 aCvhoo_f_Z\{o[P$'rVps{=B. `9  pgz;zfa>& Ǽ}%/7c\޼I՝|hnk]}#@{v;;;ARl6=Υ:rR^Z):@I Fя-`e2ێX,SoܬZS[ٕJ  9oܙ}"6*/Wʶ1bV]n^?7>>ݷ~#<|ܹ|52_v_PdBv2 H@SFjjŘg}VzYKwww}}Ѷ'Խ; .]yꩧb '&@N55RAo/000^_@@t5@o^C<*`)ը.4 z{" /:;&ɍ6k`HWIhcnjkkmj[VA(ƾ%"|b(#-aph4NKLGg[DTJR oݺ޻woS\)9993ȗd(m۶ٿ'={}~t5֖HIB+U*0A:>\ hH8J5eLO_j!X|+_V1Q&׮]K|7|>/_!KttvD*Nm'TUU}ZUbGlÀX fm@0a%¨)tZZPR]۱AxwC,ZEտYر^eL{[ ]^^A麴F]Zum!(Q0==4B*WTToxq'g>.O|]I;rlUu%etN˖3FA6+שmGq @P /gKZyXnjrw- /$~ {QV?~\>-y[񑦰R5K5,6/U£6"SCVk! =jJi*D3M4NK^=k&8<ҋ?x_~ޭ[Z({{zrh6`bn LOF"TRȨ*Z#reO?]oďO9kضDT՚Rž0a[Ͳ,w{]QvdgJq¹erڭ[Z[)ʋ7otۿ?m :okbjinR׮\m&%9(0N]{zήY|)<脄DeSZ866.Bvu`͑HNne2Idh:PTTFz!R\T6|zl oWO{s@kk3qcF.ۺ~Ov1 |y %*k2 y ҋؒ%%єQ##tUU 311Ic}'ǡ 0b ={\}d/@74`FbJ6Zaql}8 yvd&FN4hQH^Da |Mٛ /$..}x k vAQq cQ+,.lCA$BIlF&ZS3£0z@~A& Q.E@4,AD]5 X4rҤ7!6ɾke/h`467oA& ȝ~@tQu2*e*ؙW=iX4; 9&33INJX)imr%$p[)2,mLvᲳ@ @ZZ(%ppd>H Cmx;Q qxp,G\<4')Gof[n^~\"]CFY}}Z 3GPJᕜI" v6klӷa1 _)Q#$6Pyy%28iH$fIEÁ7aF-sǠf/t.-7[6X8n"T+ !iё,237707b1%-D;?&` Y,/..LOYfgg':=wF=S aqԠ(7QT($ DE+~&:he?6 2Q#*ߝ'Q,IENDB`noblenote-1.2.0/src/noblenote-icons/bulletpoints.png0000664000175000017500000000047313502165236021631 0ustar chrischrisPNG  IHDR00WbKGD pHYs+tIME7IDAThA wgI]ȧB[r9@K#VXQ3!yҍyJٶmq%ƨιYQLD\J2t `q\^}nZHU֯5kOVY5.su]% 1F/6b(62QlFQ@]<\յ&ш}IENDB`noblenote-1.2.0/src/noblenote-icons/noblenote_128x128.png0000664000175000017500000004576613502165236022125 0ustar chrischrisPNG  IHDR>asRGBbKGD pHYs  tIMEe IDATxy\guy{o]ivْmym9NqB23I $3!LI @X ۀx-KjV{wuK%Ŗ'yZnUݳ|:uw7-'?s~ތ]q566'?>x>wǿٿ>???|s=RO|>iU=KK>vsgv?uw_SQ'y}p^#̥W_?9J??t?ksʯƝ\PP>m4F?}E544~?}j}oY=?دg~ןw}?:wWJ!&fXz䪁>--#ɆH&3 \,-.~巿v'bnv#ݽ36rOwl/6^pnėzk>G>;|=w'<_Oxg?WSɺH$3LG;vpC_8^700]Jr/+@-|ݻwff7!zȤ׏{H8"zi1=5;>康W?=5}? 6s߼a]]][տn_m9x=w}_SO~~x ncؗ?0*=+.?R ׬o^ۮ|xO6BZwpCC2\g^>L$0ɖ5j}9U(ZuWZOl`.◃ >(R׿ @SC- ~599qo}_-ܪ\W‹x~w__oᱱݼ Ix'X 0==M4m\Re[O #W3nmt4__/ېQkvdڸs~+w>G_o/zjz;"hguw--~9xǪp8|8vP(L8X]~pB=/HPd9~k`0`0c=*X_sHO=6\/\TWW /媝o]w{w*Uo #WJfadn˲F#jAݤ(zYN* g 7Y"x0 ѡum̰*FjҸj_+5Wm@ O@~W[[۶> /B\gGyt8hX\kkp'ztzY9_I>ffŸ]؏{WN/fB 5>rOCޓZ=6I+,%m тqPRf;eekǩO4p L:-rQmb^t2Ϭn /R_uwGAu.ަ2iٿz/\ԤуkWh4 /ݻ|oև~lӱ-ٻW[sM\ @wٶͳ=,;5(K;ؿo+h#k{)/tcyvt# (lA.޾~.HaXZ#N54w`ˬ[m؀Bĝf"--ks:ZZCKoj~uϝXMwk+1]_ܷ/^}T nbw>_E[yj81t#980H&=T|[9:@_-D&.сxt7W-jRe,+!jkP,EŢeۚ:23ؙ1M GFFԶ-[)>CgCJKs~Cw|Q.hOz]29bCt4GQ?G?M+&vҳ={ 10B@&k|m۠xU-@i]o%ԍp[/vq|xe.^!8hڲ86<ʵW\(7켚xlcp5'\XPXVtZEڳ4Ƅ@*AKOa]s8Y漖m%k-6JStrlfƺ^NbBTYJx jP~ CKh$[:o*޶}"|8|~+'zERz~v&u)9 `~! v7r!Ґ91x|h$±!ryu%%R*VL$r#`Ҟ~PBT{PBe[C?s-[[[ !iMO;~-kVQ_EP0-t@ h^xϹ+4r@/R2tp,l7rD)p#|k\tn8KHNwxZ{sw'@g/w7 !PY\ _j+psxb%͠|G*)PQR+-gu=BGѸq#lY}{ QJHWL.,^j=J ԉQ㩄3Eb^"AHG5#D PR /UJq.4T>Y%ęl]M/neJ`)p\Dǩ[\?~+APjZmιk(ؔR1'q z"L)9זׅJ]~ÉO 0mσ9 l夯jjjߌŠL_2c4FfsD갗MOR`NqG皠 b@ԀxB,Ǐa CoFLhY@xU0s^4 "t[Y B `fAgo,7_IP|ݿ"W[PG! R)R5tgW=\&?C>T!wh`w`G Z<}( Myns*Ca`1\ZHORzRMWLƐ'r!%Ri7)R &D6Tɡ[o"qiJ)0;:ǜl!#VC`k F}v9JRS̲` =kK)$ C85'h \WhKvmz(kon["((F].E ׬G!:nA eXs9(SԿe5vƤ8"wpw^, ZI|}/ ]z^@B {IB ˘t $8V)%.FI\ޅ6(MgHZ.\|SZm5Fls ڈol8ؖ½Iآ5*C?+{@Yy gYC' _7[F+ {*ru7ɖ(Nnm%g k*T@FtJ:5S3&Т9&OM1k4F vRM^K MM%Z^OnDžE()jkkg+]k{]o s4!NdQkQPoG[,>o-%|4Qy- ۑ$[ ˷hYI O1,wE4٥: x<^kޟkP÷jQ ih$)X(G ҂0fxtA#h=R 8E԰$U- ;(_pvkϒXQ8&녮ض<﫮 VRW aECu[Z@FNah(TѢ4CB,swWrяN_|T}2`AU^,2ۗy\׻b1z)w ԉQW0SXHi!#4YYWe4PL`sgE/ -^ P x34QKlK |+] VvV)ٷxZ^(]ckTȰ(+nMhT*`.VWyΥGy~ @j*9C#EJW_ `W-Ev~jܡYT&QMP<5Q+2v(@YQͶ(pmw ~(TI/Zv E^  R'q̽S]rQ;XfžAQG{P(,u$!7mbkN0&%3_~e;d,ܾg$\ 7B*'04{S(h'o5|\+)b$kW"8Y%]|d\CID M!P4I,mm ԛhSM\MG 1;nxc+D4}D`_5 ![GW %m&!hR`LrGomA.LJ7o7D8@(W! KH\݇+\2ZC0Gqr5: ./XH-1i#(V3Z<ݴr%[-QaLDp=K]44H׈`+"[z=Mݪssi/jys9x-F`1(x|±E ']ܒZ<*ZԾwZy_ɓǗnmx| ^Cvb_2`aV@#44D hpO=췯BibU QRMw/|:::^|Sx _JT,be([t]^*+l`#UKh{+ _};kbM4ݺ^`Hd,E+ /XdPhׄkC(W}f`J|Eo^5!PTpOrEA2%p˙=o)?V.IWM$D9 v= 5tP޺e0,2K*,!J%k:S^ٽsr@}&*;01#,wxZ)*G \D6#kC4}|B۴u#n&Y ,###GH08+hVnLGx|cNv"WED7z.ޚ\T ǖ0G=2E@IAeUKhAY.?^Ӏ9BO $=2pA >>lOFB7UMzV6\GdS3NHtS35u^ݼ#82dh$˭zLү'_,?2޷~s?MކʖiԄheM !]ʔУm(At>h+{u["G^UGah5of[WR Mx. %^ǭԇ<B/M>*^OPI^C5΄V#{fTHqt#Fm] D +7,!_M|g/P9 -S{* =4g,uCQ8],1's + ]RB^7MJeeK/Cz{X d[g\͓ \$e =uΏQ_AxU=~I˻ڊҹJAY[M8N|8B\z<gsU!* xx(Q'*۹mUATj' _+n_a*jkπbL/C)>l;ގo("V\A7oQz]JR?ƚQw/8Jt<5`TWh_e"h724ZTW(мvwqf~3}w~mmm7qliIwSOJ=)v<S@KK@ Q{iOl{ hy%>5m4όc4Fq-d*cl zc / 21_8տ<֦JJ))W\pi]Wӎ&HĈ[t3ccǿs tVC)9f2G9-bxlv5;:k\nl"hȏ0z~T{}a{yxJ%mJ#)IW+rWTA/2~*AL5OlG1B6ؾn3q4鬬t(,!pud5(9<7*@k`[ M^HF X2F]״k8!{W?B4oLb,5=AoUB!u{Mw IDATnUEeYxykY4ͭq4>pCw~ߺShTd ?1A0Q@ʚ~c:W@)X=N!J Fcr搆$?ɼ09aqNW>dn5Z>ojizrvDPv#{`Ȫz)o\.ǃȈY@O!niɕp2&^ulЈH<ƞiD@pdsvQ|4vVO5XVG`U뿨ZE?ߢVL M7bҖj/spл=z9āB, 񇰷5lG" H$hsv睗Ϲ(«rc˔29'Ii6#j# Ǵnh4D+Mz( :5wU`5fC2 ZO*uXTXv4Wc|D;54hY:B M@3@4WP(h$I'?'<7|"H&H'I̩ vQs798L1ӄV'WZ|ꖌץ|Yȟy OAu?!w)VQ.$ ITɥ]Mdu=J)\ LЂ'׀—g 'Fp gEDR*UG\C/nlOаX'3w~wmWthEW_fvEТ>?H9f~B k@71^QԴ)_]ptk-X! l`WPW-kVQֵXC'1 ȺX0& ͖H=2m{{}8U-כx 0,4rlZo PXf袽71~ܾER6?t~ Gd@y5/ݶt91 h#ɖY᱁>J"Gj>}rV8ɸפi-Ss~YdUe܌E.y,%؝͖(8o@KLRQC^ZIwHh2Koh?7nz5dǖFfTQ7.>1.}W(3>63 ' 4N%v[h@Ss*C-avq3&|sӶ=CF rgjC*֘8Cք^NlS2@5[͔mk#a䞛dAB OaGtUdzQ.0XG[dM=Q],.| LalidSHLaﴛ~r8ӱ!XĮWw8 pƍlJ)J9?Th}_6WQ_^*׆tԐ럥0T$kJe5g)flj!؝ $@J[u^qrP%{ao6?09F c-I\҉^>&u`$ۼGw7r-6uGх5+Rb5ejN9RL=o d643{TFz]UqIJ૚^"C [bDk$va;/W;<ɾ8Ijqs%DXGdH@-@Y.ы=LAHbtzxPgz4^9??yi <| ;XU bnxO\dƖFf:Rz}3n|Ws2]~RgdMT"ԕ845m, 0~+ܘj{S{Q!m2׮B h$kQKսSM澽k4~kFcLNܢx/m7kK(vp3!QvIJˋg:Ԕm**jN~kkg_|Rʛ鷱k Uz2L6 ;[^*l1=0K$~AV2Ʈ(p"?q{a@Tt|SjR=4cvG?{q$„\~$.AmAMkQJFT"'W" 1'3`ws,<<<=j~9t?-쳀)P ᦊ(EF "꘿0őd)%(pS_Q&F;ʍ4rxA#Ϳ#s} `1V'QE/9];S45md@C5̉4V Hl܁i̹uׯ!(5V0d#=u(nh(Kt]#AP%p_=L- !Bdž) /ܽuzXyh^Kɩ9Q73,cG^"B-,L )4rtQ¶?T?qK#g@,^c@ PNmiE.Z$@1\˥8&OҊ;|AŶaăGcGVycYR9򷋩' "k)(My\s,Tzw}=UN$VS.)}otӡN޻sbK< w]x`KLJA&w1ǖI?;l촉2W&t1/ZB "FMkҘcĺ$$83w{$<ᗮخ/'!hia< GKW<,ZLLJI{o0H-qr&Z+m8 s*Mf& k:A4}! gHd}5\U:>~D \C)JsJ-@KW2]_@\>~,(`<`H-X 9?L" x-]kU;ʩ$`swGA>\&Jp\M\ئfO;81Y0Ә3**/Nz@RަPAoȓRsa8mfNv}K_bEN2Zw؎ j g7v-q½uD7! IZSiut+/a͢ԉyhb!ض6Q4h=`H8q1'̮p\1,خ7WyR/2`sFVV7O pQbϣPl,}TwoY.":BO h#•1 9ZlKk%M6z[]L`ha4DREROGŽs\MTUxk~No{k~33Dϧaʇ6"7j}W*i\Mkq% l[Lgn\]B>s(o=B*>!O ,f.bW *rqGBxi+—h5L \;&]WС7%'V-{ʐg) P?eRQGyO叞/O5liƑ{}+O .,_d h~/LC Ŷs[)U/PFSϣsaKOΐe"lgef) hx9K|([0(uA\IikQIx3f\pcBy@ ۸bT-, VhʪdwHnMae[f?˭jY xyp><jQܥ'L ɖBd{k`Eqı%᡽۸i 6 !o4qfO2BETW:pb꾣rmxVz ϟ)l62¶e_I~d?nz%Uѽ %ZR\kJ7{8DG'[M[_v5p&9=W:M%L,:Ο_JQU8Q7`|Nj?WyˋOV8s[9rw8CT&q#+b;A~y+B>TØncma;7>RlRu,zwVȪeRfK7[V&yKu#KS {vXlߩ|oJc$w[j^zn=  Xd`8`Y"QGT$H\ODph1g&јGeG9F쿫E7 @)R1,~xK/8 ^IDAT.zC~W]? +* gAXE3zOn7vn)Z?=3S@-yX'O,:/۠XtxJ@$Z[ɬ 'Rf{|NoGPKn5NШ R?5a QسSPűʖ}KaSVg6?B^O'S:֨R"%wN4ښp8ny\SOipO&b2%[KbvM1,pThL{ٺ H>Lzh|>g:Ta  S!@FeNcZ3͵$!)i:, тbPP&8ʟtpR~C` ,X\B`h L}m%_e ӻCMCEڶDQ B?.i W]'P=YX;KPps@FUj įC0 RR綆ȹ jgHSnx3`j5٪HѝYAOĜؓ˽E  |{0zSPE$ [8*˜Ƨ|lW"3ݘ9:(–AfMQiWMPS [/a&-I aW[TjAThϔ3W|P|׫)uQN=kPqoW.ru NB5_]i `j!9L-I- `n8@#5oTTӐ֚it%B#HZL0L$`JR@uj 0Zuē5tg@Od ݅HW8/2 xj?"Io|![yb7򔆩<!:e@ &f tI˛+۸Zf )MAi4&0[b`Bx =#ei cPn0TDh^hVoj2 Ln|Kd|f B Ct~2dy8@Bg_psFy+kʹ0\!MIN>n:iMH"A#?4{# 4}hYS ,= X*v"( ڏxD±k2zcb;%xA$ZSdVRtL,xPwu:sn{{f) K0= [u:Om2 J|* GPvu-\ݿlHr̄nE C[%JR~}TJA7X};`$%: ۪a[(fb,Zok=`@b7/!#u[GB.SBOk 4`j>"B1Q'G;}s{p٫GfK2igR^^O{)CJH[H;U'4!=bv"Ól Ǯ5Yi­8AhΡm8J ^!s '5Μ}&Qx[~bF^yjr/Mn5bN`klޱjhm1y$.U=A 凉 |3s3˪*p*=ė=,v`w'wQriOLɘӝNy˓ޝ)=VUm< P."UHfk [<419AA@"Rl912t/8YFWэm/[.P=fqdVU8v +Q(`kv\AJMDr3c}3D?z;r'IR0 Q '#7vBO}=?'zgxѮ#>|BPF^#WKG+m8fiw 7&HAEc|(pntP`Mwlp\F49!4}걉?jrx/=1x _'CJ<Da{|bKQ׎24ٗ4|t慂b P!uMy;s 7 <{n;Oapt{m&Kqp]X.w/?"uY[ɯ"5MxΩ7nNwr?|‹K߼tsڰ ][<'Mg8iᴊ)蘼1]3[n9'|@S7{R[_2jnxv-UZҦs(u>³xd|_|jO 'y~u`?W?ߞRc{l=q¤IENDB`noblenote-1.2.0/src/noblenote-icons/folderrename2.png0000664000175000017500000000666613502165236021644 0ustar chrischrisPNG  IHDR00WsRGBbKGD pHYs  tIME.Ի 6IDAThřy]u?w06J @c@IC@i6A4E!E%U#VhBb Jo`Yy޻,xOsu|/bG}xf~|55 {7lܐUUx?Nqqo8+_y+W-hwU\]>~~m_iA)x_gs[p_淿Vav2o^5gm+\SVG~ﱃ=w/lxל۴?~s[;l6k+W27zmǎv~oT>}g_4qFu{7. f'_+Ξy}{MΉx໳je4f_My+s|K.qpPw_+u~˗~}OJ/i3ܷs;\']KC}-7\؟jY 嫲mw<5ΝƵO+_zcӻz~#=-gnuSV]8!K69ty+Tz6~X+77Rk/wwdfnZpxUs1/U˻lC]l}U{مVw幽AsٻЅl~sܳ|̫wl{Ԛ۝y>/BU%YUMS!% Tҩk"M䃬:F^Y_-}>7B>˱f;.?ȳks;5?stһPDJ"*w 841 cF|SMaCӔ4k? X0G;'{7zx 1:|q+jڛwW j%5^!rPM A΅b % &P3zP!XZbPSێ3"'ta6 b`b;1k!`ut;9rtn 'Q0&H1!g@mr,R QR (grMQ݌ 5I&'1e'DbXi cF@w FDN*a01LH=$F$B@`?Hhd=P860x9#S NJqM$5h!FL̾C-:cP<<ʣzDH9Ač6r8_e]-rigS~"v5cAYRL\L/K`F ?䘫`"z9i G>{ 0Zx)1PR Ʋ@҅z `ȸc39@*79ꪊxϼ7ukl6oפ;|Y-5'T@[KI{b0_?(&WC_L R M[SAE!"ۢEw=|sqR qRee6[ i19|c>Qeގ˖-;kl=PH@!#w{=u;& Ult#R]0s T& s?ONI:DI{їGkST{ #PNua(P]K }ZJo9)*|'B"ً n_ڎp 6cǼ1o@m r^/i+*TkҔW$# d$H9V#JPX7~09A+e!NRP60yJc,h<, qy-Ǿ6AKb1G䎲0h9ZYSMH!c &-eF-U@4*,_U@VU[dtUfPW($)7[D'cQ2;-fDP\7&(^PGu $\,'k$ Ǭw*ylGE*IP)%S܍]:&0&NB!1BQ|2.ZH(BP$)ƸJIZn$J*'$ 3X  ^u;#wcĪ'&Z@28ŢсING.Ƥ)7OZDW"1Ow#Ps:6]Tۖql `[UEDZUXQ,.g c\+aaDA,A`IPLDʋusc~iXB]ذs&J&ZEdh/o+~Lebt1[j>TRwT sTrs$|MA1$5Q(ZG1k A−MTo>dz&t(d]uřn^Y8vSn(6)ߍ v]|7*WM!\bF.X!*j!ܳҿg@dl~]}Mm6q,ADZiJ4[8()/z[i[7{ӹ4¯{tblBԯ=_{{ԢD^M96#IENDB`noblenote-1.2.0/src/noblenote-icons/noblenote.png0000664000175000017500000014303313502165236021072 0ustar chrischrisPNG  IHDR\rfsRGBbKGDC pHYs  tIME ,j@ IDATxy\Wu'jMjukk]xl0IC0& K2 Đ!B& & lˋIV]U]{W]]-؀d|]U_sst#HG:ґt#g_[EQ^v_:ӡ#8 {kǡ+GGGqC-';wY۪ꛌj7_L"m7wS ïWnܸi"͑Bw~? LC?i("L&#e/{ɮW7?kiG:t*{՟'vwlG: {۟Ӑ?e*P0ƐL&133j ǴڝwMmc永e'w||hdhm9g 9Z*Զm'}ߖK.o^~嵷ޯTs%;w'nt{Gjؽu T_2 9L& 4aZСvmQJ_+T.1==E }[޼i᫣΍7B,.,"LkU_~пy_7ӯ*x+ J)0==B0a[vX,wyptG0sNѣG1== ӨQVv'Ñ+@DQDV,LӸ0jmsN7mD8CJ]ȇ]woxdhmi~_U|xOGbϮ=g'gi'ၸT c`ib~~sss(- aD+>W,ƺDuELLL Nf0 gtkCv%`zzӨժ0kd*uziyXxw 4M HHausaa`6*_sY}t׺+>O,H mw?\q*c|}:zˇO:F\x@! ㄐYf1?`2coE!/پH P fH$`jmKKxoyvUk$t]G\Ʊc0;;jjq GUիcp 8z(ł}Vz^|7]ǽ& 0 bvnV x-`Ⴔ+v@ww7/ H&E*^^h|k]W]{_O|?|]_|vԲ/D|P5-T_%1533L/="RI}t>sWk>wwp9EUiXXX੥%0 el@a9{B,GEA6ҙ4**lۆ8C|eKm>rG l 8\t"+pƃiLMM! l}q0Hb1Y5+\}pu߷m0 L$5Y=~aBwns^m;>}ǮSysܮ}s}Xm w$jB 䣆iޣ(j^!Bܱ汉vuT_4ySs?w\'P5~Mmᑍ=G0D +`.@Z1we?Lt]@udY"4-jF\]sclM2 ^χZGbn~iV3#.EI眣R`nn,6\3ݱh,˘)Yn}bz}6 n!$To/_Nxϝo|߱eǷq5|tT86y董dg'm=_v7UE!I2(5aQ,1lT**{~O8$ VV>&C'Rff9i2lPT.TmK(8H&|nvryc )!ڪ[8!;_ur9LMM!J-[J휫E)6'eY`&p$jF an /nUU4H9d2iJ(9רl$< 2A䄜ձXqxc,-Jo%H>uyIfB pybKKK(<7\3Fpr^w݀q?rV8۶g~p(ܧ.RKK[X?oߺyldw0 $YSJd055/,~ů>E&T},[-`p/|C#Qivf<>77aX斨E(<inuR)l&IQV/` H㼫.Rv,g(~JǏ, "$I9Ș_ݖe]$<~iy\4ϻ导Ry/zX|Ƒ1mXL$Q!^w}1s}ϟ`8nt(bRfbxٟvT,>pD,B@"!Nò,Ļp{-hdIn{v<2$IH%(ۧ5CӒL^]ݽl|͟yYlF2@*Z(Jڂ \$UQH7?̳ n󋋕dTIt]4bq-ݰV6n0j%*% eFQ*Q"b]{5U y,,, 4 Tby{|2" ZV1559K%($U-H8pǚy%Z}Q31r99rdcg{5t_~1,--2=:p6[B b'@m#öm@->Ȕ1JA@>G:A8!320zgOߩUxaK$P}Zς J!P Qo;'w~onzUQcHR%h>m?D4cUvE7Ɋ/"r8:1D+꺾QUȲ0HLriP0t`qassvRqEQTDQ"iض= $4=P8I", 88œ5}}`p$"0ƖT*C,/jcr#߹nW &JrdŋȘ!Nq-w~s3Qdp~y3HbaT*qxO#u+d;EJ%*PDC)t=w1ЧAI(nC!K* $;_4TwoA$%c}ko];$0 R)3]?NRݮ@UeȲ@0̧Po U@&űSH'w>ߠOls?s9٧iEA\㘘|\3fz48U$]y><>`p[( !XZZ A(DJt&Bps Qƻ"X8ZHTP\Θkݪ`0I099IK#A=}ޞ0MKt%gʴZ,?@PޢԶ-a/G~rv!]0;;k'Ib; 2L6])@W$˲0??HAYe(H/enL&s}wOefzz 7\wDzL&}8g bꏡrsȒ۶Q.a&4Q. ]4c=0\EVE\F0c *-c0NzJX P(/@$pׄ&v~a2 U! {9DA@TB2. պ+Hh7so*T\&<܄N.$ŢIiQKP(`gFUM@HP$i,,,`)~fu0GRp. UTAiYL6F#Rn+d+~0O=@]XXdAEI"eGm:Y!۲zLDT<ҙ4ZxKT_iȗJ۴ RT.~zk=,cm#!;9s셤9S`*Y^2L# uP,Q֠ tQD| nQdq0w .(rT+% TV39HAnpPA@XD.?$ʠ@M9dQPU* ;g|~ݱlؖT**Wnxw, uW_vUW+|mozQJfrNdpn>P´- ~]3eYF,OKcP0tRIZ̲p(r XXX̌~*U !r΃qR`r8 ZmO'v^U`Mlщ lo؈ڟO "8b.At@>܅w~>d*̢X*AErL.XBsh Y{0WQmY(j &P]ClH"%Yk-((ːD1½9"&E¡J70S5 le"!eN%#&C.E;Sd2u}"| F}{J4)-̗6P,b~aR;Ƿ\Խ@]Rt}$I4M,..bjv+>LǎUC\F.\w-IAyA: X T BCRA4:Z _rd"ێm[ef2XL$pm}_b(}'6]z6o=rt@$T*,..ssԬW*5/~&B #"JNB,2-+e=EEDouJe.Q(߹x[// 1<>w\8;X݇s>:Vxz)EQ`;`Z~㯱cYy-28i\Q?a ]<4P@Hdd+/d92J"jC6sẲ(&0\jt: "t]A4 #kIL'Bk8cb$dPϥd.h@ k¶&>ڷ"z,chD2 ݼelg!Qb.Q6bU=es$Qrj0s]@?O: o"m`e>yP,c|;n}򷗠M{Ng "]1tD& TU,˨jb,.a*YLP*yzP*PT I2L* "Dj:1^R C"$~H YnXOv0S"8jHg2\B !Hp'R) EA1y,Q9d1iBVe@E0j߲y˥1ܿGD4;$Pq뭷|1nS|`kLNi9=f@2/=n}[`&"/>Hb7غe+UE&<EP|. P A @.eHF0q Mae rb 0 bAHAA0,\Piq,f9 (."~"uTlp$ U4i"uBAN"bH,40DKy'ت2íUs,:%.,i&IyR'Ä|:(k p z9pKz0} 0]'{+y&]HBR M`9DQD0@fX(uF7Yqle-0;;j IP)aZ&$6 cAX AD˜ GڅBTU%.m[@4H.(9r@.Ee!;P*EHKM7[pO*+ d`*¡H"~]zJrHXXXfN>v<ؿA#} P@[0 DA.|nYЅ $W{Q)? UQQ8Y@dҊ  .U]qrecii ZR*" C3pf`5<{P >_ƛ94h;M+?_0 x99|$)l[mÀ}R6[ =8l0/a.ppl(S t (P H+տ͘-(U*0 a#ϡ/0b`' 8'PDHB ؄bahHm =aa*y uY,{|.וaQ7L~ XI5q" &}{9\ x'FC\(;_Ǒ#Gv7(Db6$RP@<ދ|t:n$SKD]qDR8U25=L&M`YTMC6qd,9^fXJ-AU5/\B.C"mCWj(;ԓq:p6-J jEI/ȉp^_׷%\p:0|Nq|\y#>b$E[g@sVv]tyc떭tc!B"-W#$πL&SÎqXY1y| ÖW_Mb,?;Z'K<@%Ѫ/׽m3ētnV @.t$6<D@+*0f6p!M IDATqdYogAy @"gH%س{v nDݼ#dyOu\x'#k2Iœ7ˮ# Fu寋 @_hRǛ.>^֋?&!"!t%Br /;|泟A6CVw^gxURH_-@7j)x/ S~%ǙÖW|f-EGKjn17{| zΝ;C[>Tlfc_\Sڪ-l(@غl(\z`аCraF~KY |ߎ/8,CNt@NdgM" Ҷ` ¬vO[d !/y. H~ o?HJ\9:'FZwh`(kݛ-W/y9-ڻ~=&ZG_|q\Wf4cECܧ%<%Y?ig ~i=Em >yDAH=_Ng_cX%TQzxr붂H,N6BHg:ԚͅSX$:x21]ϊRa%$P߼VK(<0=kQͮFhNCktհ,Xw|hزqYA)4$Yj#>7>~: ߖBM:V-pP| LEk‹<]%@W/)iа`0Pu fPC* B ܊9 1Se`KzVu_^"+@ M x_!Pd@_[""!HZM !p*sqCagkmDC {0(<0O=S*(ȲVlFŗ/Sz'^dzʃ-BQh(e)YV ;]Au2 2.B.pEm2 16ŘkSy:*Ϧ`%ƸLC_erR>L΀A{SӦ=iKڑ0~"> ^q3oHx {p3Y3l3yp3bAzRTo!ˠ`YEOO'Q[b`R!OYˢV Ϊĝ_L'mgt,Ha 6G!Up Kԥ+-[%P"|`#BVeփw'P=F%f.ܭ#tdRF!`{(rθ~d~1ړGZtd|)$ԭF!@ U%U RXwD!`s׏ʑ4**9;➒m, 0u8u( G3WXLWi'{_A /$حۼK=9xB*)E/#W˜ʡBj}\˅[0Ӈ4 `vA@%Nф!WC頲??0 fy M喯KUf%V(Z$⯷kR [/7(  @rRm:pVWX*OWߊH 7/"CuӞHrV-Ԏm3+Ua&(|d T`0m B9hQ~ztA-oj5x=[o`v(P1 \SI(E9kHN*z@2PBu8G:^u՘7pS+UA G}6GqSy k'W6w.N9 o=@D;_Xb [E\2P:CWK ~5KQ3/Y9;zΪnXoHP ߃<]1!rYgE;UJ rWl3]Apۅn͆[2!w{ fE@p@F_䶬*0`XƼY&' ^$rD{Vv# Cڱ,@^w{asKznڵvm`W!o/O+䞖m2` m4 _%`!з p_ unPz>xм7+}=ݒ;XX)(5 k\mԥ@se_V`.3PTΛU n͆ =A| ɷB y3rȚVATlw( 5ihțʣ7m=mZU]ib|龜EsF-~{{"Yg1Q~ |MnuyWزr[bS/4 T,?D$H@wEqiosWM@$ \ՐLM]]<%mk`}BTiU= ,q(ų) U]|7O1D!P ր z(mC^ eEr_n/}K^;O'60/YW0T]BhHre :6dNw*+)Ag24b}l <[u,ttuVLՈZH"!du+/R?juPr9|mp3U{F՛\dmD%ۺ[tQ,P]8S >PԴIh&JNC1naЦ@Cp=FBZf7;]AHP]S6Ȭ7c߇P_ nՆX^?"v4ЅCc%C80DQ;> P_BG`U |q]c ku[n8pֵ|g̷lnJV-;ְBͩ_.?pry.k+UzvQM2m{wۦ6ƢpJhbQL+$T'20gw8'P9n[dmxkc-ZOԦȩpyɑv,*rZM/4̪N p̅J/.3&AGpr58EKݥ _{$zlӔn3?g*7v YB?pMGK̜Keۻ!^ 4w/ԍ@ tv ]E c>p!tF/;QB^AR{ħAGPytrVV3e.n5 @C_җnxڨ)/BT{t%kNJRw Bu:Fag*uԎ!@;òi-]i``2*̃DE3(=<t|65BrK7$$HABFs!o ÷ۛNF`w/_{`Py< )]848ܪ  ed3s2>q"M>[4Qyl[5[MА7!Ok7A5͍'ڦ-J֠m t]9 5h@S9qpAo4 'Um5|2MQ.D@:$K>1{rQX28Ђԫpr8 9mqVG"a9G $C t ʆ p.H]!xO%W:& Ň v$$M~M^c(NygAԑog)YḼ'NUЅC`)@JO',tu[[܅"8 e^4R4*-[-IC 6EYƢ mkl&MRXEy~ѳ%(Z:D3EXH p/Pt͚- /f*Kepգ=U Q$Xz_1ie:/GSʭK3C/pK&\CqXy=:Ġ * 6FLUğ*?0;WC!X381@N~ (""zy@Nh eT$#Ϥ7si-_sy(%y1;]–#]ঃD9.)Jo˳Jxy.Z6m׻ B^_;[eN.cH|`YNRe J{SZ(D|28HQxh.$ʿ‡d °\ï1G#Uo Be䷘3zhm&o<DlJ5Lta+B k\M[~2W^kÞ ;]!rߋj{Re!kB*Rwx)Jw( k|}S"A1FOwV/RW6hӀ'ޓNhbC d*O/!"W¿3~o(}SE\ҔtyJ% %-znܹY%&2H}I!t߸)84 ]7|{1k8y^p &}=bdnk:Ө4.[kd /-<^RcuEs9P gDVqn\S-,q8zTN[ ϼ(ÛJJ;M+ӔJOm:s pB 5ACm" kno;قڮkyJNS6Fa(6@d)K]tnQ-(AT'œ-"'oGÆu8g2[W즪 auנ"4:ߝ.Bw"~N!]NdMAH+MAVjq= ~ @pZ~뗙ZS{-´ {W묶Gi6~T_wR0?]c"?A/G$e$bԷ?_oaJ l{A՟ΡȚ/cXb:of]3dϾ~ Z~il:8q5;vPiH|!%@+3*N.ߖ725-@Q)S/ދkDS͛9]Uǎڔz6Gw5\A!)̐s؊ v?g$޻ [(spQfIoĻژ@'GqnKTR}96\Ig(BW>ϧz2m=5lq`P` X0jHkze-2SJ/[ {7#B)nl!]!!}0JxKwk@0Ş/}k։%~f8%vzOdcP|׍sWmKfVW@uDFDUkJNJZLD g2E ]d* "T5&y&EdW?^Fm@d{# M{9 ђ!g^E ,}hvOf[&"n9 h[?ˆAco|\K$nEJI!<~)J S(~*AZZ&$oM)̱dQ)IdW%=I&=WĨuؙ ։%h0'oh1B[W*NcvĻ7-blMA8Ԏd0wwKZUb7`%{U!uUzz/";X~ÿ~F+r-Th\MFqsg&vw}"9察+;'"߂94>ԨI럖+cSxW?Pa p+A{6[$Юަi/8lHQ>H'QY*/%C]Wףwu/:3W"n`zF цeLB[{-Opx˂13_"uwKBa+PL։W:*~'#˺ޒ&w J.Eڒ&wtLO+Ԉ jcW|)ܜgwϪVuSΓz5d"#nԤ=[+nr unq32pq5] e"S=jj޷'ka>zKd?NiC@^,9ֱ̀_qXxߍ71 ;zV [^BQ.R=wc/UdKB\JbvW;yꬴT |po@K!ʀYF|}_*^z95 cY;@@?ly5,aq߅PKYQ?|uGpfT15~&Fξ6m~6ܲ9-Tj.H,Xl7>T^_$o7gבH>DIjWY!JOR6^׬Pdc(Z|oqץq/]@ AK*>~;AUAjh1;Sv:lI__B i=aMh,I1v(^ yC笘MY.q1 ;%%E֑ۗ58 ";zMR,Kb\۷jc2$#ys0#%_!!>z_ts,mR"h.]sb1E29NiwǍo! xuQ[qM)| l.iδDK赺@u.tL0 E'h%v"UdY&ǂ_sg}wO38@K, iⷍ > ;'\7Xoo4;{Ej2%<ՑYkEuW )8C7e赃搞?7\i\ |fd]7!|Ӏկ/o@"" 0.j̤v" <dsTd&sqjy]I^ojGP6fr?"Rdm${o:8ZX#:}C+?L*$n Bʳ ›oEcK.XƵ0wm4'1cDnj:ГO@C%$>1PZ>[ӗ&BƑHūy -6[D]^jXG>u '_%}f{PS!D@GW5H:Fl Z2B/9w3(k:_XVAfnss9 eɒ4;7!t{@h[ =WvH"A]?wª CQG%8 (Aғ[QK_;YQrX(ua:I -!{/)jSLOUݮwy7sDE{yF" MGfVrm]+b_w|QEC "(;$W6gHRJEJ)y+: @]gcSPw*0G;K`|h #TD:?ݷ*ËT-o+XJ*!V`q+4@B@*-'܆Tbe\ZJ*7Mh=SB$u{Xx2yM8ꯖhTѹo}زee(ׁ9ER}nBR(aH} &9BO "pW˹Y@P>8'Xq*G3횃p= Cib edᯐtIYt7]pVNfHR-V3d+AOO BۿNÑOryf跙;P5Rb_¯ة&A! y`-H s 6Q:@11G(ӧA*'UVrۥ|8Cl`{DzȮt1挿r2ԙ%tl3blw{ >~tG >\GQW ^X) =m/J RwO@ 7_+-=`$ڢ6W"5d^ž),}"sysHǫ;&Q7:88`N'طVo:7`4j@t2'-ejtC[_xz 0!CB(RQpk6~Xf(rŃ-̗sZ*DmDls8 K\C]sE(5ܝ_Ub77MֱxS7[A4Տd@#.C uxB)L} Yq(<{a2ϽAXz4f;bdDY_GT;@FN&:2n9_A-|+;ʓ\j$ljRVGĮTz M#li+k_~ճ9Sy!kg'I2Jm/_|٠?GWv7'mC5HgChjXW9%4G\ǖcԖ0*SOt@0d3,>veLj{saK֑ /|3^B@KkFb9;ߎMLRJ\ƙACUU<ƭTp, G\]wL]G4|)SP|Us?9$4|dc Fm:1p4K>C@J2| 5f"D:~ \{^U{#|fdA iwQ99Ya.,d ߧqM CJ`-fQWP 852KWQf%%g7yd2xEQ==(rΝC9zZt{bk(J(_RFu, : Rc0@KGI9AEʱ%\ Y=eᑃ`́xAf!qi{@/ۑDȚcDv@ Y_5#IF(+]]ݳ9Cx{/Sg[1eo ˏ@*=lX]j'yx/ouS2%s?lxJ5W/P'J#$֙,sfd;JTH_R=ų9o P7=|- ubĮ-V=W"~f`Βz6j %;z4`X5*+va9fQˎHir-!P99CJ^[1_w䱙2gϑ{7h( e}'vAdHX?%qu3~r[;PLс++YhNE 6)|T/; _o+@DtůnݎdjK3 })%jl6KZu]* j۶T*ضKն8Ω}nCIKm??gr }I0Ga*7KzRbƉCkF.=6S@KTN,cG#$F_5<ⷎEE~YsMǝ,Pyu?SAxJ2̔?vw)eVvAep9hÁ2> /`ic)[#zw ],a>HKr˺ō2U?B^ðF{,1WЪӘCDDSZT,yWـ1Z܂ IDAT$4"ɻ7%CO송U X"]Ԧ]x%;4P$"lu5Xv1ukDWN1Pj;l:zՐ(B|;Ŵ?6J o>Ym~yOb=/fddReYd2#T ,UP柳Tiͺ7S.QL-%O2P%TgR"=?:% 7J9"PC:=mAi[hֱ}C`|U's$:] ZB*<7E MUљt^k{х6A+7S6#s^#_N !a l9Y=P7c J%ann۶QH$DQ" ׽y崑+;Ph4&𼲍7(` 7g9Z'rN0UǞʣq+>Wu~Zff >>,~ *W;:Y']5iExKt厇3-Yu d^KkoхoN`;2vv>>t!౏o7x|(e{(gw[Nu31 DQ<ϣT*hF1 H$B$AUեZ?=qٻYW E{3)PJ6Z*(؜".g'; {0QL5n Jd!wOP|n- o\t;7ui]DojFUz9cnzzFz .id:8ӏ~"P41MUU]d2>G#+Bh Ȏf' q7m x^H6^ 6|\Ax [z.*r(x,=vӧoYuY1OJ"gןAd!RMaP}?} F};/Zy@U8`\M֑76w;<>pB|p8L4%ňFhV(J?}a|cqB5!@*NJ be[v3푾/h9_HaG4J# S= & D$y(Wg(6TP떺 Xs}aܞbLq^P 9YIo;kV'oj΁׎) "sR)"H3+R\ZZ|q|e~ͥzjOO~SNg-'k9~z}l3|֍+}fwOCt`po j^";zQ&җ(!ϵzx o%3 ϟ#ibm9^KSsZLỏ rCHrst_ L}|&C['򇷜 5S6?q~iZ9G?0ٕy̑{,?}[q U/M1=6ɟ- >G~֠/zo jlJ6N `0T` Ԩl\*⫳(7}a_™+Syy/[З lbZ'I,OȪݝ@>톛 }c< ?&mrL(BUjPz虷\ _u1(a 8BhJ+,Y"}CM`za*H2^swOn^YUu'*vr2 J)Iݽ%B_+_E i¥Qjܖ}t]N$؄=DFCM(wAG)2KeBwl]˛yZՋ@׈j@Ki<톟 }cϼon[mRh|A Vr/}#[)P^%@sn‹-ʵ"BUTSNd{&t<[{ZnPՋO_%q(S˨a/W?dC o'Kp_ZB"o쳑џR-ęuO}~~Ӡ?톛}k׼o$ΛxvS 9 KW/=_zUcA/.,UO!͢F 2_9Bm*uri-=EH䍀rݢb^ӻbk՗p\FI.N:GZ}jϾFx[/N\,0GP/8igdZ@W_o<%țW1ӗ@KcnT}=E݌U -LП[F.f3)*GIs ~}rb s8EJ5gsh*uO d=X2fWImAUDvks2_#1_z5j7o(q8!$*h B55< l2dCM!RVs~9zYZ&34`tw↶>[? T~_j'Wr{=W-z}3vF\O;Vu6GSBK2s:+dyːUm0Ae^gBSGjD:>=ȊӶ.kMP}m-l-fu(Qj.SRl2ν~ gݳ/>7ʎ uRS*G~߳^׆ƽ;q[N=|?IdlQٲ?rovrYbPL"D5ͣį]=FYktwĮBB5X>uz5bP|9H'-ѐW[ZVgк1*9mFt/N;FVI0F?. g;-iJ/b gř;0rk(z*^'+c_ֳ}Wo H7ÿ2c:~7t?@݃~-0Sy)KG_e!ď +P&"ރ F WՖyͣ^%w;=]@ k5x_Ù+Qa:unl5A젎[ Ctkؾ!ͩy(=!Į aN.cƨM!"7Sx,*Z*Lځ-,ϑm,Rz&#Q&2k-TPbF|l/Zaydz\xb'$|3[W~{X?EZBpC[N[/-)_/Mll^Xtj?2嫒PJP뇛?[.Y{"h Mr 7WE i8 a$z"$o:ԔX zH E*qg3Cck-ku | ^qJvg$vت?W?1Pw ƥX-*eyVbQ; tJ9ˍYBr^wIhu1F-7?-.'Y(:~-o[ЮH>`"c!}/\Pz*=_]Hݻ9p2 ]7DS<7OdJlu%9DJkam*o)Syzao`[lh"A}-`o*Z"[֝z6GM$؆;tp!XZ,S.*3X__$<&~elO G:&ƿƯlI>%_ײv woq(^Uf ȃ7#=9k\B_K:+N㔏,}4s[P>z~zOh,BAda,g'lKF mI~0 t8)W.)=/`勬`Y".wm&$֞@e8]m95z3bFlCkD#={گF֒KΟז0.?wP)P:0e N15&{ld/ mM30w[w~f:vm17%Q3D P9E:>d@5+-"L}5:]X%ƣ>? UwX9d9:ǝ-Ft»w n0-m6S߹߸ jV̗]dSw#ݍ_!\4-Ifοï-oG[@m@$nA*BcGϞ8*G3MI7Z?ը1'ЅJ nvc@b #T`Mf1(?_q(]Qz,ճ9{>@RYdvq "~Vz>$LP4GoE rp(=hڠX SGobF Սz?klzN_`\A2[pv uԇ.;Tt|d<P#N"IOb'v ;hzm5X?HD{f*g|H= UA 눨=[DẓG,|H<`w'%z];t;'P+JLhm*'6{.UW65M$=FL$"jwF޺9~dѪ9`nt0x9/ɔq-Ը b{L*2D P jt"^= 7Oaѯ:4tK`Vܤo9$h08eY&}$Nhsz6I:Jb, /gܭ'.L6S`#+T/Wٟg߳ϳ=c^+-b ?zW1Y9"䫒d:g5(r0֙,KAm"oEk*=ao=)$n 4"wbb 3.h`q `y%-4mPCMxe%W]B;z"p折 9E{qsզwkW6Sh(?zI/!y&W qLx-F+€u:KMDۍ g&N.QC :_jнM9Jε{Vйlf'T1~#0G?ItM暑7\>.ho)A;/S_:CE_"_F bǰ Szp"+zdc H߷ ~hdr^9-<9u}VuzݛQBnBOPcff:'t:Lⷌ I|jSy7R[(G KïyYU=AYm>I@&; >DϽH~HB$#j]wߩOE[0Ss9_[8 IDATξw\po6Y,V޾c FSo!p2BzMzH)q ^Arיs׼7ګ HQ"E%˖4Z#ێ^zlx{&&nj'z:#==m۶$/%%[;ĎB핵u~|72"Y_DFb[{{{Iw4=eԤ46g5~s[Z&3]Hxh vquR?ga0Hs/aŭX8ɇ)j cgrc4AcD~a1pY ^1[YsONwසƶ{7=͝ԓQ~Ӭ:[pց_ %(e-8y;bzs}@UCY, ~>ܚM-Rh|Pp'IGvU P{M*ZoԐTʫ4"dCGTENI;3I]B+?Rg>Z"]ƫx56^F(*"s(a&E#ݧrv)(AV1ƒȚ/b炅F;|wJEN>Gu-yV wo.c=P eقsɭ<JF0"٢ԦkIؽh=&X_%UF"T|G 3adSqr |c,!J>7Ԑu_%B>S@p 8WX֨3ex5Wo8P8RH- 0=0v<1+Z +ȆJdcVoSd~oGr/[kl% *0Sp&~ ouK $>>VY'J`%@cF4 QՏxȺBd_%"Kmz~sSBV1_z&] E?c/W} v.d`PL 9"S$$jWVqVkx=tbRlă(aTx ſ9E" 'cҵk/2֥wI5 CŖX(LޙkWYͩfXtl?حv Ļni?7"ojI,Ǝs<狎8뿘'0w`-WFd38:JDG6UBC<+s$XIa1m859ٛz~3hRBxo c4A$Q>268S)_L|Lh# 5o~C` g+0Wr~!Ag?IvQWs k~y>#n ]B4 V;{7D}HRէ/!i x/Q9xÇ)/6tA$"[j\D"n /`][ q6W)ǫ;A 3_;B=) ^3wuSQ6T"D,=D-Y lj9jWVQY1N='峌w?:(˯80D?G;t])'s۰+ʖUIyw\%bk5Vsi-o_ ;3Y{Rh 5/߽v򑝘}?qj6@ Mn {A+W1.˫,~ٯ nߥPGZR }z,?/S1'tUۑPOlgrٮ:2K-Jd6oSx#&+U{.$pk6|i| vzLҟ؏8Bzbb,CD'4G65~JD';p+]O-eN|td[sc/S\*RnuF6*" ޗMl"2TN-3Ced Z է )<k^rj轃BReyۥ6CґL!Bb(H3'7W[g,՚ zlN,(>/ʫY2zR]inb$ $[2//L>7~)d+>y}#wfo#$IB="(rT}a%}*jQ9Ilx' `VY ߺg,)vC򆄕9 'D;mo/͈5O1.GV`$IQXygza OFT5i^#9䟢2O$#iԳ7ra6 jT7ڵC# p g]E"2x:O.И-?4$:ĂUu7k 5FAƲ٦,~hIWPc!LGr0R#4KpAAKdv?۴ff(6 &?vM>]7i|gG; 8?6{ėl>߾HOsWx(ē|"w 5٢ģ{(;?|_Vnv֭ưsPt>y]sKo'Q{P %JdFWx `dsSFͭ K7dji$## 2DC P3Hs hjI"eY>@h0N`qmg9'T>h[7(+Ǟ Jׂ_a 3%w~mx "a#M{_9Bx(<{m )o4Jpkvk4W{O(ZVp+p *r&@κ{7]wc;{10^Ţrn??&Ӧ҆bA MTJM/Q1?ˉ' 2GY>@lPIށOsPۆOQ߷]/c&].WlT礞($7U}P9%~j|1o8W[:B)~Q::+^P,x]>^ã)ԨN ~{_  w$!<zUz?(!!eѼ$;Fv-/_K̗<ď"q]g6ߢ L"eukYӏpPIboNa&;qR } >٧>rh)U9~!4G1I>' `GVZvt쟼Brѿ$(NҺLvǨWse >P3>Ή^>xWk\)zX{>?.q(P߆[4T/,=1zqU4xv $ bBAUSS)r!5iJD}P{<{x SyMx3זH2rL!n\p]\a w^>ǎ~H),UhR<~Ho-*g _׉=ZEݾv% W>znăďPʄ]+_/@;VoyXq5 R=>]@Dh8i6[Z vD42KN-x`܏&va'wP1DRW73OCG\5':O}L>7~YESUVk%C?;=D=[>",a-U\AQZ9\ETcHs䞾LcmjWrA@Z݆E$Yk+&}(z~XYzL*Xm8틀Ta;){Z䶡o#we"IqbwИcNx5nRꭥ 䪸KYJGgqKrD#o} Xl(!񨼖}tШj)g BX\"k ^A4 (T^[ZdQ>!JՄA#;Dn)3`pEu=Oe =KG?Lӝ{HlC-yPFxKx_7D/nB's8.Xf$߽BQJ'=Wh8j(™7Hb,~i{aߏ+"0ֈ3H,f𾬅GpNK/8MhHRnst]p^g0$1[QAR@Ux/Q73҈I+5Vk%<ʋOl[ ?-5-ld>~E2:$K .#I—ݰ55/fБ[2o#;6s6N˭lb܆<_-ƋytV(}J}_tjq&]8/{sߵ,*3T/,F{1H4ˇ:XEk.M%kw==(8tzB]?)YE{mBb]31>̟y+z^fWh\ʙ 3[RVFcڷ9Y MؑDE4H!5ڥƙRQ8~nF1֑Gտ}S_G+c,v kt׃_;9!$?i#| H3M5&"A,6r2( y>Fߗ:nb>ur[7u9 co\?>Cl`"ȡE۰MWqf۬} 5w@mnsD qڲv쩕(~Ɉkk?ew{whM@`Xk+kg֟ۦ65Ml~ )c7TzA.76s~οx$jb<@ͼs u%%|j4#,GF{83wQx<}흿l{7~;mAVnmAnCl}`l8ZߚG 97s/y'sFx?k6^ Ε:: I(lo|I"4g'_~>1dGvi~66~ߡ f" E<uuZHc?Km(|_ ȁ@%9 k)Y z]O`Ԯn ~;zyr'~ 9‘MA+$p7"w?s X}N z+- 5}ݼwa2Z-(i>`g@ Zrv}^ R! BYAP|W7?e]اE{HmlP`Z^$ߧߊ(vMPh;3i8UZ+U5~;.M kܓkMQ9lPA.`7?#γxOߏ {KXDpd%1_7>$&o>{}<<#?dL6ol Ar&5J;k/xiWkehَz_[ϮʝTxF@r3M<&E[y\o=w姞&D{I&. %^JO Sd|wDW@|>^4W(?VoG[ݞ ߹o'_w=ڴGMҏR-{&'׿notʥvw9L%}- 6L⩂/|#[[* ux$I tPZ-M7ӭkPgR%{7 &[sќ IDAT^}e-s,; ~ukj9BFo&p0Kf"Q|H)ߎ~Y )I]\z38L0Zo!^Lzc)9{NoM#,~%3)ZA3䓿~?\L=& uǂ2l_yCM{]v?:\㳹o}0sKlVc_W7~zvS;u[R[9܈aʶ|hra}sUٻC'Mdzkۯ^ ]ܾEVpӬ[ &[\~?|9stK~]\#FF O_J1o ]rg.[6ЮplEQ\ZnkaR7w1m- 0bxj%XUWSNBM}f{|]F;bER=2a+dqF7칥kWݲxR#yPk5&لiUnNPw+_]/aʶbEb_1wgi[K_}՟c>Rb-*4Y/V"++7(-ɲ,o7B }F x ֳv7Qi Xur[//S3)FMNQ: <5LŖX,\>GkoL<ۅ@6|s44 =jVrb~^{?O,4uSҍUć&6oCx`; RW&pQ/`w^"Rm,GPT3NuFKdLOBH]B5R1N0KE2XLPz ?-cM~5y84g7vW#AYgL|-LjsDu~{‡.=˻&82qH&+%_OrTBM2R!/#KDB¡Ycd ^YMrTt!׌-sߎӀJ`%[HpffgGh3j-rJbІP#HWh Ko@op1 8gVㆇX>fiaRk'oa8ۆm_9Ts~~r#K>QF*&vy*R5!^ZK{4BHD:, WTXÕ~^-2 8rㄏ  e/e3荅~o d žqQ5>_ aNފOV YM@'?sxhSoyr jMݢ'R&/rf$JMPHraab5*M2R&/g`w |_T7X) 0l x] < !_3yE%[LprjLCSf ;Gl*6k~YN ~|<^zN1L{N>=羾y]zX=>I k& +0[x %F\>ܦxl11r(5KGU\fTH&gZzjȕd ̎Z(GܬchYCU\jNe(FY5'^`xU! .…(U+z뚻'V1꠺`,\X*&YT,`'5艬.Gvzt.okhiaqVFx>Pei-f2v7a=>߬&li&5p93[-1p&v%7vn4g|dخBf`>H&/-z%G'T:҃K8$ΌQx//p H))j&8͎P8$;VMLBP|eEOB&^`\t0.+d ^{ v"` "{v:fuj 5Ht7p +T#3P>,s_kkR!'u_UjT5[ 7 V}m?{;WK1)[Lp. Gk"+0JѮ==\%ҙ7ӃDzl!ɫ;U0Ey"f֑Uby5L vc'k%V`B^Y ɳ-`'Bkxb.fr)+H'P5g ]8{@D{q} lxm}|$ES jD 3֧zI-m t}11% GP@J`IF5K6oeXrrjG+=Fg|t=j`z)|Sy vktJVo@%+ B3?Q;D;?<Oj UWOih6pTT'&v"]lҮ̵y0?:.I#J*o^,s/ιU'K%vART\͠H,$*;a<~XQڿI@܎',K'"҃(whOgzKW҃ =8Z]AzPYK0bRW:$UR#}<|3_֒^=r "hJJ22_?OB -^g X!K $ONh꡴U B>90xmvnk}/%B#7wd#SrP=kU#PL6Ӄ继.א TLp~~/t7/_& * ry)f^2ka,+R`^倝D;^wXVXE;؉DCuzdF]$bv#B,(hn )H*k{g:!K!\5IV'ֹ@V!-Wa_.SV  9 [>0't6>=@ Rx4/r;Z& [)T(ButxҔAWp{4M/*20>58%{58jF(l!^'ɥL ]WIj̵]lW=6j\Ӽ=T(-,uOEKRfCR-|Wsul73/9H(VCL/ BuW1> !BF"%Fuw שX lc\/hCa*1]pj;4g荬YW&(}!BJަAU\I 6f _k} 8 SLO؂5JH0ҵj,5/^13pAOO hhDgS8ݼsZK^ yn:Kx2C2US*F`'EG3IH$TYQC $Y%lc#o7p:v{+vE 7lb=M pYC"d dWhqO9b-AUh!yQYK,./ijܻRGWӎ}..楠[eiұ"=9QeԐeZc/lyBKw*IҶ_rn0OwVwh)PHHzY' =k>ϗ!VZgx#P#u$k,̨-ҳFū(mTgNIH&ZE5UU9B-~Z]_oXTuG~buͼ4żT$kE\nMWE90/ kuL<ϡ".G%_ \J0՝k>R:ϝ#31`L@=lWk@ k>ܽqI$Rf)N;x¤1-$NO<ex2[gxSd2 ԀJ׊ 楈ᐈ4|0(>8vj{Pfxyu=,˦RmP,U{Q;xqR0/R¡KX`^P c;KG&. mݚ&/e(qvtC;/ 5U+K\ZX[~ǏPyC Pn_`0 l9w>Sr@2^9jf Ɂ33z' OTd0-cN GQUMߪwǵZ@}kmrNT!5x}:i ͏;v;;4䞁"5x,K-$`4 A_HQĕDX*%hX,^,1GqWq`*U&]%m\loB q4Pze%^(g WwTiUzzPqɞ$=}IA;0~;PY+%vx=:ŚXO,dJЗ-&8;7ѼtVz,z5 Bu ϗ(͠X\WmJ0ߺ:Jgk=k;f6G}axJan_}re|†aDpU,繸ظNgfslZAXn}L$6vw^O;!V+іy==i"=XE=jG\YXeMYcE#nVQ}TKz;ft){u4R7(n@z"/^63?<ҴI3vf7ґTf[`3XVzpƮ ml\> }" IҶ h;9ׯ?2 ԾKj>,9O_}'$;6㊔^N._z?~W/E؋fjTSbJ'M6htI8W4 O]ӃK6HF*mcD7MIL/ԋt SIDATh?=Ko;~gk_/I3,β|$hXr\|_ݿl/DQT[\%gRYj96P p7}0R1u0K&!׬K dVz,m}\7"τS<Ii?}p,MI-dAgh T*ur\ؿr캑|m}njtb `kiS֐PS''tV&k~SۺHK"҃4]K %µ${O=' o՟ aT-LNKSN<Jgǎ{&fVG{? R扦Mch?iih6:WwP3 Xz!_,$ΈUzdG cJmu7̲YzbslN?R|=O-n7W'3(OY:HNeŗO,Wm?pY%YUɏɽ8ШUD\LSk}!;GfZcjVr#=m0CԲ)G }r= 5/oԶY_}{S1El$Ap׈/ϟ~S܇8j>D-x9╕>#~7UhV iIu4qq\KǵBKHf:0@B$DjhMtsQ +лzgf$)oM <~\_~*1P,Wܾ[3{SuAlc/dT+S-c4VR "u+Z;h >};9tw^Ȣ.m=L\J Q^}r Ff_(S$.((gz\?jOm1Ʀ0YhDӆWW?l~MnP9t~Nupa&yJˎǎ<%;_݅c{͗;mzh]bkÆ=LߌUn=m߾Mmm5s޹_ ~,\xC?OXa,/| lk\&/&m;ܰߏL%p׍\uGw|}_:Е+Dߺ㝃_\u/<>rە壥b޿[#w=k/^e7w֯_K/}{:{ޫn`ߔߑڃۣjݠ2!= DLP:ˮ:czM/޸L;橭e>zCY7/_y轨i[7.g4:pﶟXr~RjY;oS-z쁵ׁ>.Bq"2TtF@-Jq@`)bؘj24|},VΞd]L]#rNl1n E:s&tѢfZEoΙT`yPp@`!j΃:124mZ@f zY{:)7 hAIY::JJ͸ѷgtIU `L"dX!&e<~*q<`ޞgY{95(ũvs.4{HN1UͧDJD޹3G*oi=zarsBFO! ŒC*tM-ԍrb3%RU=?S0I_*I5&h9AL:{E[Vщ8ȩGU§ ސǭ%H%jaT|&ev==6\~Fټ)J]oSK3N%t`7t`JuJ8 |MwH-z_ٻMSAiVbJټQnHi@zAI7N\Ƃ u [OKV噏=͒|y+ְiFJGKk@s|櫖ӽkuWOP:0QU#嬎s̨ cg \sSe=۸=[gsފlZ1Dօ:ґW?E53~NVyͯ(ƍrr^%jQHMѳt_ʢ/-X $ءar Wk6Rzu6߹NO׏DįώlC}h"Gd腩MB7 WqW{m4^x!`e\]WiC E8aW[7ɲoAj|!zj2N @;,8zN & IŶ"_nNjf֓ B##8EVtw<E0$[,/xen\AM.&r닧-@/6['!߁Z?}ݴ@SRl+~B02`Ӄs8ɓ$'NDN稹d wgƕԤc9v\.$ƉN*ͪr@(i5Ytӿsq*+~ݏ=dqJ BɓQT^^yv7}ZpDJƥ3 we͗I'593VP;:gJvf#& !9^ ۩=fR*\?8m W=3#c&x}"jh л1qLX@D )?6-'FJE|'F A`mEI&6a,Txc&[}ekGV=Ņ,8r 1@R'@ǥ M۩_**AjL:ɼ2W.$,DIzHZ{&m}I^/ѱI溍p86 q\GA.εH (! `lEbjzOC34S_5 EP\3Uz<27?F ؓ')IUu9Fg[( :;m[~AedXڨINL @ PH%פjn/SH<<1GRIuy {x.as3U?/G#ffZRqBq PnmrC*}f̔lCV*"]6v<ԄdT-$ aw7c$)-gˏ^vlbuS OLNVTf@R(R3q;mEۊ΋vL.46$燄G11MdC%?YC8ĉ!T;#7}ZCtVٔ.Sd4̫垍+9A?؈ ĭ/f"taZZ8vɎTs| q{SҾcs qbxNL֏ur^e ,8NnKR`nJjRZiXPç6>JQJtRZkz mE>Wo{;4$3#Y4}aڼd1Iʡ%`T@D} rd.ZX@X+'+dAZ|E}l9,ih-6nڊ|O5 sMzN,(x5M@}7J*WkUo,6VJ#|޸1TWMRqr=C$֐G'd܀Ls g;ߏm>^d67Fyj/{rūrb[reiAh6fUi--ͪ2ӪXQ,.g \+QaDA,a`B.bPp]܄LK]vZ&#"2v'oӮ'`>7WŒg+جw-/VEA9qZϱQPAbB1)(SZ*b,%)+68ﲯ/<ӣK[n3p蕱unNwVƍ2'&㻉&%c1bbc,qPTzrG ǿ%s v?9=Ms-6q,adDZiJߙeqf[Axȓĺ$N3UoK ?7͋?\OPni`BIdkl%s*ڶtg^9XxIENDB`noblenote-1.2.0/src/noblenote-icons/noblenote_64x64.png0000664000175000017500000001501413502165236021742 0ustar chrischrisPNG  IHDR@@iqsRGBbKGD pHYs  tIME4cIDATxidU%\"b/MTz(-yiq뇞ƞmGim{PE*֪-=2q3ndUdR8O/qw/? ؆_Kzկw3}?|z_}wu淇}hwc~S[nU.]vo{"62:n䭟3o޿\۾?uC=oxG|O>~dO榱t=z;׮yccU \o_y5}}gIRN6$?q> y_?go7{| ]zccwO _O= 7\g7VF) !B.-u5㱗pݖw?;x $1>s㟍{߻it~KjOoذ}xi}}}c3˗|ɧǽYJy?+ÃCW_V{km􉏯MeSSG*DoG[A_BchfW )V/Uk=tM-ٲgK6bOl]p>M׊kK>_@v|ɆGwl{[zt:}#zL*ހ|ϫ/sͻN sW`*kYLYer_>Yƫ,Pӈ}\w8XxKҠBRAi(%hNp%6T$J͗ep}[ KC,1RT #,V˫#):)w􆘘e%V`ZgLӻm7}9qP3ߵ;e$eڮ !@H6nPNV($!P0gƱIye)s8swfBk9  T@!Ԭ% GM(]"""g@T4EkXSr]qJʍs% 0RkY :8 &J=D ơtRtu+ c^Lʤ311aܒP,YьQfo_!jSepk _D%L5m |'-Tpvq T ijCɕKRD״"Cی(C zQ L}zBё[?WV:WNA@C*2l^HpA=fS])vS>CyR54+0]כ;x 0mO>d)տL_}k'YR !De$$P910[19w f /Ԍwԑ(uo8R6SG,j !<[l=& 6!B!<J)buP׷fAt]*N[ׇPF:z]nmug8glB9v:[ly|m@#}e⛻M =K dYք=Q;hTGA!mQ0fc-@UlI®1N- 84RPKuk@)d]!=d?n%@g-c^eh ux]bf¨|RKrwV?z1\ ]D'A-A-d220BH?GxY A$@f*PquuKI\B€XL[KN 8ٷ)!aI«Z(6&О@Fxiaj/Bd kI/M"PD9E8 Bc BT=1vAU v+:u- ZQ$dq]uT/iDonhˡ(W WAo2~+ԟy*樟 qHG9w܄B-%uRN`v'r([W,Ǟ.a4EUGWb 82ҐַLY6-Dg( i쮇s4 j*QvKfP4TӠHS]ՊF].ii#NY-Ar&tf'mBKhaj~ޠXQh(n6Rlc<{4u.OM(q 9^@ D׷$?v%h.ZT&UaiyGߍ׷7yZ:h#FtU HCZi[GiB@km"<@g[dH}hL\eb㉘4'k##FA Й@U]dHGo *? <e+ aJG ?$Jj NMu>¥҂+V\_hpWpG?#yk-oRM5ȈIbs"&n!(fk}l ,? ΖWo]"VG O$(8"5Q ^>KˁH0}ݟkضmhO`K_AhfsHغv?Ǐv=< }#!0 Up8| gH8Lf㸎`V]V5x}{b^>W*'bF .I[8*zgة" `$#MD1@W7vLu(Cpq(OYJtc_ݣɏZ(]sE(}sχ֬]f H-X@jnєޓрN@/1@g`wx`W*K\܈["#F[ .3:H\H"h)}rD(`((dL,mE1KG'Lضh7ݔQ|+'@Ӝ/^š V͍L{~x./޵v59X/F1 -h@A0АaXkcH))B:BJD#_Fصd h LU*#kE.] ;%L!g|wV|M[Odix#T58 4%Te{Qd7UqL /k{Ђ:ܢWvUMGGM@5"]UFV깟(|G)].N7${v/<;d'TR(C".ٸ*ZĤZHo-(gͯ+h†XފCe4՛")w QV9s)nGϖ]kdRVE?0ɬL49BNZ@tp #$]Wujl[iX%0эTgAJ<&= <0*XiH2{ 6#r(YRms?;y^D?QkI;o^%zv7'Co c>+ ^݂Q$ 3cT:0.#tQh@m2:@CC9r,oοy}osh = (?~^E ' $.^?#q.Y A6 ZH:U:8Edu 2]Y"{IYKF~`}j}?ymwe+s/ANLtM+x - U[ 41{miL!)r<7A iBLh}:Fx 0\Liӵ\O)VvNǨmܲ3]Wq4\e\u6n+BJ' KlTW ʖ$c)- OSv8Uw̶BhD9ʟj!H_x 87ꯉvE9.~ґn r%cNܛ4@|V!k5?3tq_ &=O>bv$ 1XܲBLDebf;׷wYk5zHaq9rC@h5bCYǡާvAP bҘǺ[֋tҤGc4{ J8Qu/DH:)}M C`iex(Jo'3(C]#70ŚᩨQsRň xN9b]8 HǯgYbY3pqQ5pf~f:~|p.bNط)\,KdBogIACI"&(W,XkCWUXD DMm(*TGS <сNx"Iii$3=6$hؾIȩ@z5(ٸBSbQXT! QN^OvnhX 8R&q;qxJ.:ff$\nlMR3=)&XWW q\HDs"xCz>'ڈul79\cR {8wS勚~Ǖ;j lHLjjdGD!;N.C%n1]sѥ4FQ eU+AZ7%Cjp2˟Sq7jzrTXV\K5`TA( image/svg+xml _ _ I B B I U U _ S S _ noblenote-1.2.0/src/noblenote-icons/format-text-underline.png0000664000175000017500000000521313502165236023337 0ustar chrischrisPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitleOptical Drive>g IDAThYylTw׻6^c`B Z(QR UKJTJ) j Ji EIJTP v `;[gq ^#OoϜip;/nuo;wkHƙjwp!kkk N&oO(G<^yp8pfǟLUDG!p0 7=}ДرcGOEAn=f:x`ddb8QbD1PxQ]‚. t0W=NM)'l{ު*PкC P5;dyߩ**!)+L&<jgw]QB|z)mj Dt]gmHx< ʠi//p"DcQgtCvåKü)a$ 騘*DEnryd4.M.X-F~ xw2Y( =|r<Ǜ+VÇgς!z+ݻ7_yuv(O"vX`>\SCmܵk{9 2Z^eN@HU)O d¯_Ur" $L>wy$U59%t)Ob&Cw=⋿=!UIrϳyNMcƍ+s@ c>aU`ϫg i @, f2Pb~+1RH{ecs+/ M]ʚfB08"(:o9SodhT`shq# 0TUnI/4ڰaKT`J4L>(}k ?r^CEg(0cq65;l3LPa#C^@AT`[YJVKd]'v. t%-Z^7A3t+ڕs"FR@;L7=s,cƁ02K:r:l!=5%~ 9BS,.]rBxx;GGD!b hjjmϳVC|iI uSNybh@q vvC=\&RƁ\琸}> Ag{ټ%dy? GiUXhgBJysegHQI™Bϥ0%ha'Pb]xQξ //exIR=PE'EP֧B}-ZT{'1lRnZ;3mpB6Ib^@xX<SV^FBrC; M` %*++ɾD%xvyfX3v5 +*usMŒFrTtI #o8JQV=7zGMM,?4Gcl˩<.W^ KK%Cf+f{^[z/DbsAJYeҒ6<X4ނ_{ݏ6q{cwGn*:>SN,`{ KwN_n}Qe ]gCQcܓ <&IҮ3f]X`=40׺ ڙ /|ljvsp)-y(wTԼ(xޅb:8:`}fom-2:f!LD7Om[C QʯymY@ɢިfY#:s]] 9|^Kؠώ\Ƒg9TUxOl1 $}=bQq%}$aS&@b1~k)Ϙ;魖KGz|* ~3 7ޚ\gY,,>g'RB&@A` d'`Z7`GZ'13Nqt+==?nY >iK$K2qbe#} Ig5)JQ(nF dJ+>Q*(&)ցag XIDAThZkl>؝}x_^$BBhcJKKU#J-M+-DuR))jHM"P%Mi Aچ6U 8cyܻbbttg/3www^cMV,c:oz{>9+=ł2o9\PoWo$byGia*w$+nJ-4hoo7B䨘0%dX28dMaTe6P;0(7R#*Zx&ca1CcbT0`G`Ms `ÆݯfoxfA@SڈjiI!ALf`4 ' Zc~t8oo<χG0cZ%jqEQ9km͡Dy2ߘhV/85kV=p-[QV_ΟQHq& fsF =`t >rxbPx---XrWĪ]NiA+Xf a4ah WuV4>344);r' ޽iF&V H8HbmF׫r>Pm ` dt9eǸGbi`>0Ò%㷢 bg8?{gMѱѭFބ]@T~Mfkd&esBhjff,cǻ0<8;2T3066sphh+RC67ܑ ._aC#R+[A'G\xtx<j^L 5qv<S< 6z)L&38vp\_u:xKt9io]< /ǪrZf8ЈcZ`as_RbNbZ|9 #72</JbҁG1(f UKuuʊ/ܽh#ay'hWRY9WK7H8K.S$gXĨn >* Xܮ)'bZaw@EE%q/XMUsrCn>PqEO TN gd~'r9~Ӳj՚+iLKeܟTHpE|2U[W[ ! caʕ$g勊lPYY .9-$x x= ug&)Of!K}!u}K% H+qnbg%s~bo/|LP"F#Q,TyYY'rM*t}6i4ƾ_n;yԃ]J_J8Cz hؤ@HOh4qtZF'>kzhߜC (drkFT1,_ڊK*D3/qT|OS=*xy ~|һy?ߍMBB#33c'D|DJ1-y!ok7 izpN2gҘXѯs"M.R*%t0)瓬y~u>ȁP&&hPnVbqS`'qv*$96 ej0`=6<IENDB`noblenote-1.2.0/src/noblenote-icons/filenew.png0000664000175000017500000000335013502165236020533 0ustar chrischrisPNG  IHDR00WsRGBbKGD pHYs B(xtIME !ZvhIDATh]\g93dُnmKP ؘjԋ / ^ڋU7REZŀ"!6d("5͚d7}^̞ݍlvggvW0g<}f-lbbb)褉x9]w.]rC$ڵk b|%ܗ^mgm9Rjp!"4 < B뿻|gff9vzs?80$ C(322re||+ L\.~T)w@,u~3>>]FD(VOcf! >vZ߭sJk1z299Iq Ed2D\.J3ΝСC6 H_jҨoPVY\MVe``|>S*~ Q4RdY>$k!E=jU%"ENGZ1fJj9-"8nz9ρNHDQj FDW]n@@XkKjRk}kkBݰ/ΥH_˶VRkWX/v]6[wDnV;7nOq: 伈#{ ]/H S|+mm{bW?3ąg6q)ac)M< _@7Ĝכ%YqwŘleTY=FsX+njkU*:Evߪt[(ɻ]g9(@"-"nz܉7cs9]{9޼Ӛ0O65RԤoB1u<1x'Mo_#;=sg?,k0_JܦLNhPb͇Q fz9 ٟ2>=9pr$=h\c< i<҈Xi\q_yPgnys*K8OH~05G+1W>ǾVAѣMA!5{~_g^]tVۥ[0SIENDB`noblenote-1.2.0/src/noblenote-icons/folderrename.png0000664000175000017500000001027413502165236021550 0ustar chrischrisPNG  IHDR00WsRGBbKGD pHYs  tIME$P1bf̾?bǏĮm BH(!m(EHChiRU- *UjUjEAĤԱqAC{wgwq;$^vѝ=9WpG{o8p`>vӀ<7|=pzP#_/ >ġG~19Z?g_ NaC?~S'W?wx:v7G?cǏɻ|}ۏ;}?Ӻ͞zuxG~g%h}v5=9G=zpk5}p..51Y__R>WW-Wo7<6ٗ?2\h!&Ȓ}ゥO|nOo}oEs/L>3'\ӳձgKu}\_-vutq};;o{_}O?tK_غ_8EG4,69WLo#:y8ƼvM`MVc2`[-P*?iG+3?)z`m,y~\Xcy:+ť ~(׮c;+2ctz7\r.N;=]Syg?Bc,9Bn3:JJ(SXjE Im"bVeePH Ր&+z0FD HO,+(9Gy\%ʺ:11 Uq\\,ӤABTo7Gt 99șh3^arah1a3Uou5ЪHЬDK8-Bc[* I},2xuW6[za27);. 03wfڠTϯx(ZMg _\S 7ΰR[($Zi7cF6LhF}&ˬt M _dR&\P퐰j*4Ħ#l`<5.RϽ*: Ih){60mrG]LXAX+FiKz*sݵXatK~8_8^lQj>("j7PIBN1FF<6u뙸aHsrkB"hh)jc/ @Hfe&kaS #@!q;$3ZPYQFvM1ZNti7ڐ*%JCqG@]FW Rc@+MPg3xl,h)Qh42ũ 0uԮ,A+GrgI4tL9q@;wjUȇWzK|iiYm6hIhbTBFrBexSM;a#D-+QM@+,VɵOo^pXf5C L#mGڠqn)aj=NA8tPfeN).K_٧Ez5lɼa_2*SK1\}vO&SD*L E c l_džkx pE,{kuӓobvib!OB X3!K4Mbn>&MH n)ZG߮)vN0˵VM1˂^ e6駧xp̉{,4195_IC}|Rj>Fdi7Q`W3-\m+ovk%wK =^FաkGv* 3fHT6vc4d"C?# v>M1in'A 6L+O7*vh|" fPeskG0[^|,mR:Hn$|Ml`t$Me$cP{< ] C1,N_$?I<4NLL!YrL`|i:\A+!HĶV;ŐُEFkE_%<߿ @ wu*H5< us=jGD?PDVg 3AoFʥQRZh:!ˉ_`g,brA= ,,[!c[H sG[)vFR,R>؍_LƜ1RdhAٝ*舜BE8պ褌OvA"W,R깊 RŠN~\@#dx=ӽP&' z:k08L:E7/ʄ`T4VYU)+@8]!6cT }h#4>Y\HKe(C{UVElkseuw)ԥ lE:1ٴBjct|D.g6 V+'J0YD2iR[73cbӁ᰼tʪ1!W.V9 qc>snC/z3 ôElB,\I˨NPϹ0Ȭ$p\xf_=5}[i^ZF)34N5[Zq 1EO xEM1i: \Sw@fӪ!ex()06>{2Yc>C%j5506z'hWcr+IT3yeϩt^qvt }źoz޲m:͗t%SF4LF^BYJW,XE0 JN%Ft,,J;>WzU^miE'C0&uyBvlKm,UR*mBP(@+(3CAQBq ^%TsVkRePokgg H3g{I ƈ+*,G Fg@hD˴lxʸT*Ų pŜ?1X>_-`C.^IC F@ξ><5֣Z[5q =n12XŠq] T 1%U.MX+^1f8:r!>sD̯kh52ڒbj !Β,qBA__/﯒q!pk9yg(Ȓ@$,1ɖ@æ< \c`UQT~S ! X:f"H pnsXa;S rC$IglwI[2*ŋˊhTtyÆ pH@ Dǯo}N:wyѬ1cƌj7>' FʅBB}}}iҥwU0MZU^q{$q|^#x_ p0D.-Ģxz`hHox _v9?sEmo=VD(Fرc憦-̝;7pS,Y^^ؾ͏lEkF&c3~O85~?s8W'"ƍzo0r(&(( x_N.@ے[_i&N?>`ߞL<{ 6+XѾ{Y^QB2ǸqDMM EQ0M41 rLR\.#2~_ÆiRe_@ǣBHxͼ]v'Hf>fС̹t&,S, a:T2nxp8HJ%$Hiel6K,30]]]k,Y4yLgq0+:>FQ($EU7k;^H'^ZZZpV)JE v% bf5H%Knr:J'55!LC\Uaj#g\oO%3'~lVXRTPUi@Rl6K458z˗DRQ?#u^q{dY^/Z,˔et]GayJcy5sʕ;>[2P.9k945"DʴZ )r&zYO֦UBb&!¦SWZ@NK"y1v;Y 8Ei[|I@(vQrL"@u|>TS%/z/4B1y°gj`MM r VVBd󨪊af<6mT2[`ŵ1gϞ}iӦl6ŢfafXYn]}e9s4u)x|m*wY~!svw#F0|/XIENDB`noblenote-1.2.0/src/noblenote-icons/noblenote_32x32.png0000664000175000017500000000432013502165236021726 0ustar chrischrisPNG  IHDR szzsRGBbKGD pHYs  tIME KPIDATX՗[]uk_:sL鴝ަ3` mi*%(T,Ԥ!Q( BZF^Lע(zovz>g.̜˾-4ypwq[o6gN-hEtbxÿ~o]?ox{ݫݺq+FHs~a#G؉c=߻ ?p8\/ l}H<'ye^>,OLXX(ׯlm蘮߿s{7=ҋ}?xpN qf=6TBDp6`L*ZQ 41*!G 86tRӴ]wN 췏%g̕;br b`?ZnJ_׌F҉!٭;"A(I-K}sƍ/.\|U%P! *]cSUb{QgE# f!u9ju?"*ka*)\pZ\{9MرdIz*6 04Xa$lG ˄AE@r?ܾzr܄+сoʜ6?YLU!$D3#I޸#a0u^Mh唶ٕgd{:ַs+OCݽ8*Bmv&)16f40q*m>}9N Heϟ1؞=;^B:A5N`58xC%+sh=*#ACh>Cf|D*]:U0?iŪ=7HہU4 !$,H 1ጏݞ]Jб$աn'LtM] e_0$Ӓ@#Xi+""/U L-h#U:p0[95+A;L:e [2J5zZ8ΚJ *= aG)uj>˯GU F[AlA "E!V3ތX#"REj#=V$h͇a:Fz8&4ǑL f}l$mC&Yqa7$?9Lˮ;Uj|^0&3*$C0 P(3gW HOxT{ȟ,XdRSL:K}^Ʀ.@dAASSˍ9TÀT Ail~d~褥5՚E"!"[;N&rO&rlBccFdCMɧ0 oUvSロm F J\Дd29?zBZD>-١ןِknUUڐ^R񚢆2c1B*!D*D*t+D*8nkO7Ư~o7ftq,c[*A|{s n{h;Q#Vk:;Om7cĿ P]HGIENDB`noblenote-1.2.0/src/noblenote-icons/folder.png0000664000175000017500000000707613502165236020366 0ustar chrischrisPNG  IHDR00WsRGBbKGD pHYs  tIME#7 IDATh޵y]u?wj{B `R\J$Ři,1MԠ4GڦD*jiԦQӪU7P KP1PB],fml<=˛y.?~μ,6^{;{{΃s(m[?}?`W?ض}[em/?>îݻ**?Nmxi͏M֜-o>zş|~K_{c==='c<-Oo^7y߉-,9U;oC?%_n}}Doṭ[Vݷw%k "l~jB];?rx/#v3r-kއy/ܺ;.ֳ[;0\KVXk޼zf`ɡ;Jm[صdIkov=믪aXqC<.\~_׮幝^ywqU߳Y#[_[Pu01l~v}>|ʻ>o;k]7|}߱^ܺy/rpmcdۮ,Zq㣵Jxw'{G~lx͊gnZww6?_zq?E#|8`U:r7\k +4jG奃 zM?xt׸Jv{ypDzLGgÿjmw!qF&qӉI!{gtwb ñQ$ Ef}Gݓ^Ι|D? 8 υeJ*r"]?JtVyܩ.,RR+z Fz X_G-E-y+Ęތq\0l*9Ҝ,epM$Jo%"sh%:DQ4)i:#)F"lFg{[uE\?ga߃‰DU1 hRhbk8N2g|=EeVJӳzq4ɪ`mHu4E28v ueB$j$9Yk܀h:ڰP}Pu7S(+6;[4 |=1mK;:4B{os"͡TENN&092^ґ2#Gi>P>Gɇ0wY))TΩih-%"Y!6 P Nfrl"o"qdQP ͷ?ΎZu>iq{#nv0uբ`P.CgYx, Nkrz UxJɎgn P-f iфBitH3TV S@gl`JhB=KIzxqג*ݨ0϶9g'h8MIJk"S29șC 'AOksԀ|L82: i_3פ \pbjcf]h4T`kV^^><K`IJ4rhc>5M-_}qFV&DMrC5rsmb8*`C*2'_UȰ&VUHL%ذHr:hnX!YP*M hyIة:70B9 Gʾi捾,=4H3Cfͬ\O,IinlL54k*zcˤ~FZJ T~ti5K) ~F9Q@G*⊹T mÔޑڼnFAuygd%TC(kUD0FRG}*#uT+~1+ wYDyWaQF[A RA!hzab ?Iա eU@L*Ʒ*&4*72:ёK^F5dPDo5J:F :!{EcŹVc4rBۥ]ҔK߹Ue=e. tlt,nUoUg,(/0$$ 0 80F)G T5$|?6&sЅ]W-"c f6iP5YQ qz2T8\R_*+qtemg'z+(6sEjDM?P:G531k qR)t;oM[α {ᘭ߈)=p>+/maP+S2a'(& ,3G!Ӝ5$=q1U! :Z/ɲźLs:c5{>{kAK$qyh%B Aexbf4x?j]vϟ^gN駯9ϳhGݧCtؠR ;OunH2Y.L 4D6h[IENDB`noblenote-1.2.0/src/noblenote-icons/fileclose.png0000664000175000017500000000141413502165236021046 0ustar chrischrisPNG  IHDRaIDATxbd```f͐`̀ñ_&keX ba``d(.i7eb``d`da ?0 >0|fkNV =2 xГ\űMf!!FDhxoiJ ,ϱ @@;5z+Y U"mpM()W=-96y_v\s6ba```👉 , ,z> 00 _1 $Lb L N/g`8 x2T/J_~>/n0yA4oidk=_30S1!b{+f- 4 a 7ɇjٿ67bd``PxpMO˛Xlqu_n2ndPbb`$OFN~4C\ba``-u%F>Mf F30-uba``%_D*2(f{5Zbd``f``g``Pd`` 𞁁>Ctҡ .L0\oh Q~~:IENDB`noblenote-1.2.0/src/noblenote-icons/emblem-web.png0000664000175000017500000000761513502165236021126 0ustar chrischrisPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org< IDAThZy#}S-iFҌ9v.ve1L\N+)*qHʄ;q\)c'$ۀC v9]XkGshFHӒ?HbvS~L~"B|_q\k&XuBZǼnHkl |A0ƫeJk9)gۚ$4!d^p4ƃL`er^NA`kU y7txT % Her'MaDB'gx]SookR76uZ@PjƧ~Ik/4$YzpU(u՞Om]Gqn烐$5l;ZP}4ּN!Pyl~>ppY .Uq8NBplm1^:Ǝ-[ZDw{+w흘Oahrj A7x~/_ 9pXA.d)]Muvˣm?1|f&/(+T'*sKw#"sQ[5z<ˮxHzE^p8c cȠ!Dlbf\H8S |HCTw)P)dEܳڽ:z½fghfCuB[Bp5գnًX^?y+,F `bڕ`fωܿn|ƗFjx\GoÔZ0^NX &/tlD;kprsx{l7EnLlK0!Bob)jPղn:?wvݣ`܎[10[8 yG pR訟f'&.G"{PWV^zcWdFm\D6#u0-?$* wR7BBP! %!b !LQl.0 YK&'E0[AkS1:p-~ã :&0ÿ jA\g\$S!(8qՅP[}DRmX^ 7Fo,-)4tֆOWmD2< 4)x/&A+r^Hy9X=c6t_w%0 0: uk D(i3<b*LG[ 9yd%[:Wᜁ WF@]/btv 2#*@ͻ%ck;H$@ $xIXirI)]Q(\S1v=^\pϋʺ*DJ٭`2ƳoC`GoL#k`禟!=9;T'WWX Z= eE)Ͻ!n1sE"HYJF@9 -<77zAy]?%Dcwx}lGݰlu5kF@7w YK/iu#9٬]' "`9㗢%|q9o|!,N_.򞧄ӽb2_BE:JƏQ? i1P3Y"X ^?&36w(BwviLrBrmy ˃O/hpHi.%$ۑұ/sG_/s]%B 9Ϡ  3q(vgw(7!cP;"02{EB:^]\[GFJL 5^!XZeXsR 6W/@~Px﮺̬'Zf*Cr:\&'"OʻӂD氯i9O_ePzsDžx#a8Gis =\pp]R}\L ! ޕɑfD&c%/t_.$88]uU9UˣX[{u3+D@g$0I7_[n b/prV1U҈# wuBcE7w6U s{SwyO!r/ƳX ]M/lbDz^Lg<X y9Q`9fVwN&ɕ`~EVC)ǧ-3:!D%k?+4D%N9Ɛ 0ʿDS1Љxϱ+S^̥6<_v"£fe?YB$@(&VB`\9c*~br+̜%k Є]\_PJ#A] Kĩ7un og }urt8b9wBLB4ӛ18v!C f"21ZxrS| lRe##.R#s?|m2&6w(#3I :N| Z %E~j4M~OR3G.2\e#!DrsL0 ZwYoi )s 4 ;5a.Ǟ=9qp Z}Nan~igY\gwx>Co `z1*!p$ s˓1vR!x[H$麋[k{=TTɴ.BPlN˶14<]%,sa聅}N>Zsw%QyR&n[wЕ6@d-a; 6("S(HZe1]4S&S. o'6L/HIENDB`noblenote-1.2.0/src/noblenote-icons/cut_file.png0000664000175000017500000000243313502165236020675 0ustar chrischrisPNG  IHDR00WbKGD pHYs B(xtIME..IDAThXMU+QPAAoFr zUDxQr =ѓ@?q|(6Ӵ%I0IM@瓟VVŵ!;;y].I# m 8rL0^~>/UD>|R!Ǜ}Dڿ#WIENDB`noblenote-1.2.0/src/noblenote-icons/clear_formatting.svg0000664000175000017500000002744113502165236022444 0ustar chrischris image/svg+xml Asadf Aa noblenote-1.2.0/src/noblenote-icons/noblenote.xpm0000664000175000017500000002063113502165236021110 0ustar chrischris/* XPM */ static char * noblenote_xpm[] = { "32 32 398 2", " c None", ". c #CFCEC7", "+ c #444752", "@ c #B3B4B5", "# c #A1A1A1", "$ c #A1A3A2", "% c #8F8E8E", "& c #C2C2C2", "* c #FFE150", "= c #95948D", "- c #FFE355", "; c #8A8D99", "> c #E6D16E", ", c #A09D91", "' c #D6CA90", ") c #9B926C", "! c #C2BC9F", "~ c #9F956A", "{ c #ABABA8", "] c #8B8777", "^ c #9A9B98", "/ c #828385", "( c #4E5156", "_ c #CCCDCC", ": c #FEDD5B", "< c #FFE556", "[ c #FEDC59", "} c #FAE560", "| c #FBEA65", "1 c #E7CD5D", "2 c #E4CD67", "3 c #EDD159", "4 c #BBAE73", "5 c #FFE75C", "6 c #A39F88", "7 c #F7DD68", "8 c #AEA37A", "9 c #D6C88B", "0 c #BAAB6D", "a c #ABA691", "b c #DECB79", "c c #A2A6B2", "d c #DFCC80", "e c #FEDD5A", "f c #FFDE5B", "g c #FFE65E", "h c #FEDF5A", "i c #FFDD5A", "j c #FFDD5B", "k c #FFDD59", "l c #FFDF59", "m c #FFE159", "n c #FFE058", "o c #FFF15E", "p c #F1D75D", "q c #FFEB5C", "r c #DAC266", "s c #D8C673", "t c #FFE05C", "u c #EEA23A", "v c #F5BD49", "w c #F9CA50", "x c #FFDF5B", "y c #FEDE5B", "z c #FFDF5A", "A c #FEEE60", "B c #FEDB59", "C c #FFDC59", "D c #FFE85C", "E c #C2BB8C", "F c #FDD958", "G c #F6C04B", "H c #FDDD59", "I c #F9CB50", "J c #F7C64E", "K c #F3B545", "L c #F8C94F", "M c #FFDC5A", "N c #FFE75E", "O c #FFE75D", "P c #FFEB5F", "Q c #FFE35C", "R c #FFE653", "S c #FFDE5A", "T c #FFE15C", "U c #FACF52", "V c #F6B945", "W c #FBDA58", "X c #F7C34C", "Y c #F9CC51", "Z c #FBD656", "` c #FEE35D", " . c #FFE45D", ".. c #FFE95F", "+. c #FFE65D", "@. c #FEDC5A", "#. c #F5D75F", "$. c #F7C54D", "%. c #F5BF4A", "&. c #FAD956", "*. c #F8C34B", "=. c #FBD555", "-. c #F9D152", ";. c #F2B544", ">. c #F1B845", ",. c #F2B644", "'. c #FBDB58", "). c #FACF53", "!. c #DBCA73", "~. c #FFE85F", "{. c #FFE05B", "]. c #F2B443", "^. c #FBDA57", "/. c #FDDB58", "(. c #F5C84E", "_. c #F9D755", ":. c #F8D755", "<. c #FCE45C", "[. c #FCDD59", "}. c #F5C14B", "|. c #F9D554", "1. c #FEE75E", "2. c #FFEA5E", "3. c #C0BC83", "4. c #F8D654", "5. c #FCE35C", "6. c #F8CE51", "7. c #F4BA47", "8. c #F2B343", "9. c #F5C04A", "0. c #F9DA57", "a. c #FAE35B", "b. c #F4BB48", "c. c #F2B142", "d. c #FFE35D", "e. c #FFDF57", "f. c #B2AE8F", "g. c #FEE25B", "h. c #F7CF51", "i. c #F7CA4F", "j. c #FDD857", "k. c #FFE960", "l. c #FBD756", "m. c #F7CD50", "n. c #FBDF5A", "o. c #F5C34B", "p. c #F0AB40", "q. c #FFE15B", "r. c #FFE755", "s. c #9FA0AA", "t. c #FDDA58", "u. c #F7C24B", "v. c #F2AF42", "w. c #F8C74E", "x. c #FCD757", "y. c #FEE05B", "z. c #FDE15B", "A. c #FFF163", "B. c #FFF263", "C. c #FEF061", "D. c #FFED60", "E. c #FDE25C", "F. c #FFE95E", "G. c #F0E269", "H. c #A7A8A0", "I. c #F6C24B", "J. c #FBD254", "K. c #F8C84F", "L. c #F7C44C", "M. c #F6C84E", "N. c #F4C44C", "O. c #F9D855", "P. c #FCEA5E", "Q. c #FEE15B", "R. c #FEF263", "S. c #D7CC76", "T. c #AAABA5", "U. c #D6A3A3", "V. c #E69B9B", "W. c #FBD455", "X. c #FBD556", "Y. c #FACE52", "Z. c #F4B946", "`. c #FDED60", " + c #F8D655", ".+ c #FBE35B", "++ c #F1B543", "@+ c #FFF061", "#+ c #FFEE60", "$+ c #C6BA81", "%+ c #B1AA92", "&+ c #EBEBEA", "*+ c #B7BABA", "=+ c #9E6B6B", "-+ c #FDDD5A", ";+ c #F3B444", ">+ c #F2B042", ",+ c #F6BF4A", "'+ c #F3B644", ")+ c #F9D254", "!+ c #F9CF52", "~+ c #FCE65D", "{+ c #F7D252", "]+ c #FBE55C", "^+ c #FEF062", "/+ c #FFF262", "(+ c #FEF363", "_+ c #FFDF56", ":+ c #B3AB8C", "<+ c #F7B252", "[+ c #F19421", "}+ c #908D8C", "|+ c #FEDE5A", "1+ c #F2B143", "2+ c #F8CD50", "3+ c #FEEF61", "4+ c #FAD354", "5+ c #EFAB3F", "6+ c #F9DC57", "7+ c #F3BC47", "8+ c #FADE58", "9+ c #FCE95E", "0+ c #FFF464", "a+ c #FFE057", "b+ c #A3A199", "c+ c #D7AB57", "d+ c #F6B252", "e+ c #ED9629", "f+ c #D16E10", "g+ c #F9CC50", "h+ c #F5BC48", "i+ c #FBD355", "j+ c #F9CE51", "k+ c #F2B645", "l+ c #F7D152", "m+ c #FEF262", "n+ c #FCE85D", "o+ c #F8D353", "p+ c #F0AD41", "q+ c #EBD163", "r+ c #BFA16F", "s+ c #F9B04E", "t+ c #EE972A", "u+ c #D16F13", "v+ c #F7C44D", "w+ c #F5BB47", "x+ c #FCDF59", "y+ c #FFF062", "z+ c #FFE85E", "A+ c #FFE55D", "B+ c #FFDE55", "C+ c #E6C067", "D+ c #F7AF4D", "E+ c #EE9729", "F+ c #D27115", "G+ c #FEDF5B", "H+ c #FADB57", "I+ c #F8C74F", "J+ c #F2AE41", "K+ c #F5BF49", "L+ c #F6C44C", "M+ c #FFEC60", "N+ c #FFDE56", "O+ c #EAC263", "P+ c #F6AF4F", "Q+ c #D37116", "R+ c #FFE25D", "S+ c #EEA23B", "T+ c #FAD355", "U+ c #FCD857", "V+ c #F7C74E", "W+ c #F2B243", "X+ c #FAD253", "Y+ c #F4B847", "Z+ c #FED853", "`+ c #EAC261", " @ c #EE972B", ".@ c #D47218", "+@ c #FCD555", "@@ c #EFA93E", "#@ c #F3B645", "$@ c #F6C44B", "%@ c #FBD354", "&@ c #F8D051", "*@ c #F3B03E", "=@ c #EBC560", "-@ c #D77214", ";@ c #C4AF76", ">@ c #FDDA59", ",@ c #F8CA4F", "'@ c #F7CC50", ")@ c #FEE85E", "!@ c #F4B746", "~@ c #FFEF5E", "{@ c #EBC75F", "]@ c #F5AE4F", "^@ c #ED972C", "/@ c #D46F15", "(@ c #C0AA73", "_@ c #D3C282", ":@ c #FEE45D", "<@ c #FFE25C", "[@ c #FFE25B", "}@ c #E9C95C", "|@ c #F5AD4E", "1@ c #D26D14", "2@ c #D2BA65", "3@ c #C1B482", "4@ c #FFF261", "5@ c #FFF162", "6@ c #FFF362", "7@ c #FFE45A", "8@ c #E7BE55", "9@ c #F4AD4E", "0@ c #D36C14", "a@ c #EAC753", "b@ c #D7C575", "c@ c #CDBD7A", "d@ c #E2CC6B", "e@ c #E5CE69", "f@ c #F2D661", "g@ c #FCDC59", "h@ c #FFEF5A", "i@ c #FFF462", "j@ c #FFF463", "k@ c #FEF364", "l@ c #FFF363", "m@ c #FFF161", "n@ c #FEF162", "o@ c #FFF361", "p@ c #EBC256", "q@ c #F4AD4F", "r@ c #EC962B", "s@ c #D26C12", "t@ c #E7C151", "u@ c #FFE056", "v@ c #C9BA7E", "w@ c #C6B77D", "x@ c #CEBD7A", "y@ c #CEBD7B", "z@ c #CBBB7D", "A@ c #CABB7E", "B@ c #C6B980", "C@ c #D9CC77", "D@ c #DDD475", "E@ c #E3DB71", "F@ c #F1E769", "G@ c #F3E969", "H@ c #FFFA5F", "I@ c #FFF461", "J@ c #E4CB64", "K@ c #F5A63F", "L@ c #EC962C", "M@ c #D06A10", "N@ c #E5BD51", "O@ c #F7D95E", "P@ c #D3C078", "Q@ c #CFBD75", "R@ c #CDBE78", "S@ c #CCBD7B", "T@ c #C9BA7D", "U@ c #CDBD7B", "V@ c #CFBF7C", "W@ c #CFC57D", "X@ c #D0C47E", "Y@ c #CDBF7D", "Z@ c #CFC17E", "`@ c #C7BC83", " # c #CDC27A", ".# c #D2C6A6", "+# c #E1D8BF", "@# c #CE6F14", "## c #D7B359", "$# c #FFDF58", "%# c #FFE156", "&# c #EDD463", "*# c #D8C883", "=# c #CFC27C", "-# c #C7BC80", ";# c #D1C57B", "># c #CDC080", ",# c #C4BA93", "'# c #D3CCB1", ")# c #BAAE85", "!# c #C0B17C", "~# c #CCBB7D", "{# c #CABA7E", "]# c #C8B97F", "^# c #D3C176", "/# c #D1C077", "(# c #D8C885", "_# c #BD9068", ":# c #CDBE7A", "<# c #CEBE79", "[# c #C8B97E", "}# c #CCBC7C", "|# c #D5C176", "1# c #D9CB86", " ", " . + @ # $ % & ", " * = - ; > , ' ) ! ~ { ] ^ / ( _ ", " : < [ } | 1 2 3 4 5 6 7 8 9 0 a b c d ", " e f e g h i j f k : l k m n o p q r s ", " i f t u v w w x y f f i z A B C i D E ", " y : F G H I J K L e M N O P Q P j R ", " h S i T U V W X Y Z ` ...+.@.i M f #. ", " ....e $.%.&.*.=.L -.;.>.,.'.).e i M !. ", " ..~.{.].).^.F /.(._.;.:.<.[.}.|.1.2.3. ", " S i ..4.5.6.7.8.9.&.0.a.&.b.c.d.M e.f. ", " e y i g.h.i.$.y j.k.l.m.n.o.p.q.@.i r.s. ", " e f S t.u.v.w.x.y.z.A.B.C.D.E.f g.F.G.H. ", " f f e I.X Y J.K.L.M.N.O.P.Q.[ i ..R.S.T. U.V. ", " f e x W.X.Y.L.Z.v.'.`. +.+++@+S Q #+$+%+ &+*+=+ ", " f f f -+;+>+,+'+)+!+~+{+]+^+/+(+{.i _+:+ <+[+}+ ", " f f |+@.1+Y X 2+3+4+5+6+7+8+9+0+[ : a+b+c+d+e+f+ ", " f f e g+h+i+X.I j+I.k+l+m+n+o+p+e f q+r+s+t+u+ ", " f i x w.W.v+w.K >+w+z.x+y+z+A+/+S B+C+D+E+F+ ", " f f G+H+K I c.W.y L I+X J+K+L+M+N+O+P+e+Q+ ", " f f i R+S+c.T+U+J.V+W+X+Y+{+-+Y.Z+`+P+ @.@ ", " f f : U v +@U+W.@@#@$@%@x.U+&@*@=@P+ @-@;@ ", " f f f t >@,@'@)@i T W.%@!@K.~@{@]@^@/@(@_@ ", " e f j e S :@F.^++.|+<@[@@.n }@|@ @1@2@3@ ", " @.f S e .B.B.4@5@/+P y+6@7@8@9@ @0@a@b@c@ ", " d@e@f@g@h@i@j@k@l@m@n@5@o@p@q@r@s@t@u@v@w@ ", " x@y@z@A@B@C@D@E@F@G@H@I@J@K@L@M@N@i O@P@Q@ ", " R@S@T@U@V@W@X@Y@Z@`@ #.#+#@###$#%#&#U@*# ", " =#-#;#>#,#'#)#!#~#{#]#^#/#(# ", " _# :#<#[#x@}#|#1# ", " ", " "}; noblenote-1.2.0/src/noblenote-icons/noblenote.ico0000664000175000017500000102007613502165236021062 0ustar chrischris ( ( vo@BE(1Kw;HXY]^NNN4?BC;HXR#YWFGM"[1ct|= :"""4CUFF HN)VEbgrސư˕䂻Z~/79;!VU ;&+2eX VT6SPUs[drԀߎ꘣{ydJ,1;/RWW>~+]KMGFHM4UR`xpɮƘܞ𞞞re]\cnneA[ ~/:M8N}"WWWW <;'8IF FJ,PFZigxաЛ柝zla[^hu㚢kg'B#7^,UWWWWW9-]WglNGFH&M>T[_}o˫ėڝtg][bm|ug^[^Z[垞aCfps$>s2cAj#]YWWJ &,sa{SrUJFF#J:PZYrfv؞Λ䞞|nb[]ft~ob\]fs[\]\\\-;N1M ZYWWWWPm{oe~1OGF)G=LRSg^{m~ͩ؝쟝uh^[al{wi^[`kzxi`^Z[[ovS/TWXXWAn&`czlf~DWKFF2IFO\Xpduڜô̚➞}oc\]espc\\erqd\\dq꜠[[[gEOV28EW(`q5bylj=HF'G;KPRe\yk|ϧ֝꟝wi_[`kyxj_[_jyyk`[_ixzpd[[[`*/1W`jokwjʙ򞞞pd\\dqrd\\dpre]\cpsf]\boyY[[[]knvol_[_jxzk`[_iw{l`[^hv|ma[^gu[[[[[L FF.HBNXWmptzsf]\co~tf][bn}ug][am|vh^[akU[[[[g-YMF#F7MLUa\vhyԢҜ矝{~rekv|ma[]gu}nb[]ft~ob\]fs[[[[[aET IF,K@TU\jgpᕀɭŘܞsf][n}rzxg^[am|vh^[`l{wi_[`kzxj_[W[[[[[[[[NG!G5PJW_atow֠Л埝{mf`chut}roc\]erpd\\drqd\\dqc[[[[[[ukT JG*L>SS[hf}n~̫×ڝퟞtnfcim|vka^dt{nhbkyyj_[_jxyk`[_ixylc[[[[[[[eq[MF F3LHU]_rmv؝¶͚㞞|nkceos~ojbcksmvgre\\cpse]\co~sf]\bo~h[[[[[[[_wQHF(Gpmmllnrpf#[[[[[[[[[[[[[[[[[[[[[[[[a[[[[[[[[[!fspc\\erqd\\dqqd\^fprmdclpspfelo~tofdln}zlkc`_``bbaaygmP]gs`.----?pmmmmotpg$[~[[[[[[[[[[[[[[[[[[[[[[c[[[[[[[[[0axj_[_jyyj_[_jxzk`[_iw{lfadlv{mkdgru|mkdfquspfa__`bdddddccbaaiq>nD....-----?qnmmmpuq h$\|[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[@d6qre\\cpse]\co~tf^]dn}uofdkm|uqgdkm|{mkc`_`acdddddddddddccbba_w>>oE.....----?qnnnmpur h&]z[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[O zl`[^hw{la[^hv|ma[^gu}nibent~olefpsuqga__`bcdddddddddddddddddccbb``^v>>>oE.......--?rnnnnqv r h&^[[[[[[[[[[[[[[[[[[[[[\[[[[[[[[[Yn}tg][bn}ug^[am|vh`^el{wogdjkz|nld`_`acddddddddddddddddddddddddcccba`^h_`=>>>oE.........?roonnrw s!i Wn[[[[[[[[[[[[[[[[[[[][[[[[[[[[a}nb[]gt~ob\]fs~oc\]esplddnrvqgb__`bcdddddddddddddddddddddddddddddccccba`_]UD18=>>>oE.........?roooor x!s"h(^b[[[[[[[[[[[[[[[[[[][[[[[[[[[o m{wh^[`lzxi_[`kyxjb_ejy~pmd`__acdddddddddddddddddddddddddddddddddddccdddccb`__uH08=>>>pE.........Gqoooos!y"t#j*ax[[[[[[[[[[[[[[[[[[g[[[[[[[[]pc\\erqd\\dqrd\\dpwmha__`bcdddddddddddddddddddddddddddddddddddddddddccdddccba`a_W08=>>>pE.........Hroooot"y$u$k*a{[[[[[[[[[[[[[[[[[[[[[[[[[[!j2yyj`[_jxzk`[_iwqja_]^`acdddddddddddddddddddddddddddddddddddddddddddddddccdddccbbaba`X08=>>>pE.........Jsoooot"z$u%j+dv[[[[[[[[[[[[[[[[\[[[[[[[[2 re]\cpsf]\bo~yk`ZWVY[_abbcccddddddddddddddddddddddddddddddddddddddddddddddddccddcccbbbbba_X08=>>>oE.........Jsppoou#y%u&k*cy[[[[[[[[[[[[[[[][[[[[[[[=vچ{ma[^hvrf\XVVXY[[[[^^`abcccddddddddddddddddddddddddddddddddddcccdddddddddddcccddcccbbbcba`_U08<>>>qE.........Gspppou$z&v'k,es[[[[[[[[[[[[[[][[[[[[[[[Ltg][bn|zlaZWVWXZ[[[[[[[[[[^^`abcccdddddddddddddddddddddddddddddddddcccccccccdddccccccdddcccbbccba`_L08=>>>pE.........8sppppv$z&v'k+dk[[[[[[[[[[[[[[g[[[[[[[[RsWtg]XVVWYZ[[[[[[[[[[[[[[[[^^`abcccdddddddddddddddddddddddddddddddddccccccccccddccccccdddddccbccbb`_]U08=>>>qE.........Bsppppw%{'w(k)`^[[[[[[[[[[[[[[[[[[[[[[\0{nbZWVWXZ[[[[[[[[[[[[[[[[[[[[[[[^^`abcccddddddddddddddddddddddddddddddddccccccccccccccccccdddddddcccccba_^[U18=>>>pE.........Gsppppw&|(w)l)al[[[[[[[[[[[[[[[[[[[[[l V2XYZ[[[[[[[[[[[[[[[[[[[[[[[[[[[[[^^`abcccdddddddddddddddddddddddddddddddccccccccccccccccccdddddddddccccba`_[[U08=>>>qE.........Gsppppx&|(w)m0jl[[[[[[[[[[[[[[[[[[[[\&[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[^^`abbccddddddddddddddddddddddddddddddccccccccccccccbccccdddddddddccccba`_[[[W08=>>>qE.........Jsppppx'})x*m2ln[[[[[[[[[[[[[[[[[[["b[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[^^`abbccdddddddddddddddddddddddddddddcccccccccccccccbbcbcdddddddddccccba`_[[[[W09=>>>rE.........Jsppppx(})w*l3mk[[[[[[[[[[\[[[[[[[.c[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]_`accdddddddddddddddddddddddddddddcccccccccccccccbbbbcbcdddddddddccccba`_[[[[[X09=>>>rE.........Jsppppy(|*w+l5pj[[[[[[[[[^[[[[[[[[:[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[__abccdddddddddddddddddddddddddccccccccccccccccccbbbbabbdddddddddcddccb`_[[[[[[W08=>>>pE.........Jsppppy)}+x,m6rh[[[\\\\[a[[[[[[[[D]&[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[^_aabccdddddddddddddddddcccccccccccccccccccccccccbbbbaabcdddddddcdddddcb_[[[[[[[K09=>>>qE..........sppppy)~+x,l5rg\\\\\\\d\[[[[[[[L\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[__abcccdddddddddddddddcccccccccccccccccccccccbbbabbaaabbcdddddccdddddcc_[[[[[[[[cJ19=>>>qE.........?rpppp z*},x,l6sd]]]]]]]\[[[[[[[Y[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]_`abcccddddddddddddccccccccccccccccccccccccbbbbaaa`aaaabcddcccdddddddca[[[[[[[[[B19=>>>rE.........<rpppp z*~+x,l-lc^^^^]]_\\[[[[[m Z[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[^__abbccccdddddddcccccccccccccdddcccccccccbbbbba```aaaaabcccbbdddddddca[[[[[[[[[[~T18=>>>rE.........Dspppp!{+~,y-m2rg^^^^^b]\[[[[][[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[___aabbccccccccccccccccccccdddddddccccccbbbaaa`^_```aaabbbbbbcddddddc`[[[[[[[[[[[U09=>>>rE.........Gspppp"{+~,y-m9xg____e]\[[[[`$[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[^^^_``aaabccbbbbaabbccccccdddccdddcccbbbba```^]^__``aabbbbbbbcdddcca[[[[[[[[[[[[[W19=>>>rE.........Jspppp"{,~,x-k;|g___g^]\[[[e/[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]^^^__``aaaaaaaaaaaaaaabbccccccccbbbbaa```^]]]]^^_```abbbaaabcccb`^[[[[[[[[[[[[]]W19=>>>rE..........spppq#|,~-x.l=f____]\[[[[~8[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]^^^^_`````````aaaaaabbcccdddccbbaa```_^\[[\]]]^__`aaaaa``_`a``\[[[[[[[[[[[[[^^aW09=>>>sE.........Jspppq#|,~-y.m>e`__^][[[[[>[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]^^^____``````aabbccddddccbaa```_^\[[[[[\]]]^^`````__^_^[[[[[[[[[[[[[[[[^_abX19=>>>sE.........Jspppq$|-.x/l?e``_]\[[[[G[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\]^^^^^^____`````abbcddddcbba```_][[[[[[[[[]]]]^^^^^^^^[[[[[[[[[[[[[[[[[[^_abcP19=>>>s..........Gspppq$}-~.w/k7|ca_^\[[[[Y[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]^^^^^^_______aabbcddcbba``_^\[[[[[[[[[[[[\]^^^^^][[[[[[[[[[[[[[[[[[[[^_abccM19=>>>sE.........Grpppq%}-.x/l>d_^\[[[[o[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\]^^^^^^^^___aabbbccbbaa`_][[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[^^abccdK19=>>>tE.........:rpppq%}..y/l@h^\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\]^^^^^^^^_`accbbabaa`^][[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]^abcccdU19=>>>tE......./.Fspppq&~-/x/lA_][[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\]^^^^^_`abcccbaa`^\\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[^`bbcccdV19=>>>tE.........Hrpppq&~-/x/kZz`]\[[[*[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\^^`abcdccc``]\\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[^_abccccdY19=>>>tE.......E.Jrpppq'~-/x/kE]\[[[4[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]`abdddcba_\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\_`abcccccX19=>>>tE......=..Jrpppq'./x/ka~]\[[[>[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[YTY``[dddcb`_[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[V[Z[[[^_`abbccccX19=>>>tE.........Jrpppq(./w/iG\[[[[N[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[YI1:`O2dddcb`_[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[YMPZ?7K[[[[[__`abbbbbbY19=>>>t..........Krpppr(./v/je[[[[[_[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[YE?T?'|a_abcddba_\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ZQOY)NkK[aN)R[[[[[_``aaaaaaaX19=>>>uE.........Krpppr)./w/jj[[[[r[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[YEPZ[Y nJZ[JbX`aabbb`^[[[[[[[[[[[[[[[[[[[[[XY[[[[[[[[[[U4?"rA[gNkG[$wF,>[[[[]_abba```___X19=>>>uE.........Krpppr)./v/iK[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[Z0CT(~M-T[aM[[#t+Y^``aa`^[[[[[[[[[[[[[[[[[[[[Z8]@UZ[XW[5BPVW/M(}<[,<23[>7/+[[[[^abbcb`___^\[X19=>>>uE.........Krpppr)./v/im[[[ [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[YXZ5EQX[kIN9T+@[),?O;/K\]^^^][[[[[[[[[[[[[[[[[[[[[Y+F+BZ@.LT6H6:[84>(~[9 o6(~[[Ok<[[[^`bdddb`^[[[[[[X19=>>>uE.........Krpppr)./v.hM[[([[[[[[[[[[[[[[[[[[[[[[[[[[[[[H0MT4J2@[.7X>@2-[4(}IRVJR[[[\[[[[[[[[[[[[[[[[[[[Z[WW[A6'|3[7+[U@EE#s[?lR$uWN6>>uE.........Krpppr*./u.ht[[3[[[[[[[[[[[[[[[[[[[[[[[[[[[[[51[S>I?(~[D&{[L6!q>ZHJX[[[[[[[[[[[[[[[[[[[[[[[[ZQL[I/P[C&{I!q[JfYLJ/>m[C#s[HXYZ[[[ZZ[[[[[]_acdca_][ZSIM[[\X19=>>>uE.........Krpppr*.~/u-gO[D[[[[[[[[[[[[[[[[[[[[[[[[[[[[[D!p[TF1>>uE.........Krppps*.~/t,fy[[N[[[[[[[[[[[[[[[[[[[[[[[[[[[[[V nDHVC n?Z[ZOZ[[[[[[[[[[[[[[[[[[[[[[WR[[U3@f[UX[[[XOZ["rB#sTF-HR[Y[[[[[[[[[[[[[[[[[[[ZWX_aaa^C= nLOL[X[[[[Y19=>>>tE.........Krppps*-}.t,fx[[a[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[X=K[Y[[[ZB?S[[[[[[[[[[[[[[VNN[[[[W0A;[ZW[\X[^MR:\$vR[Z?E^^``[[[[[[[[[[[[[[[[[[[[[[Q:5[^^^\mSbP[0gP[[[[\X19=>>>tE.........Krppps*-}.t,f] [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ZY[[[[[[[[[[[[[[[WI$v%w[[[[XWWmR[jMgH[69BU2#tJ\]_cdca`^[[[[[[[[[[[[[[[[[[NARF&z\N[[[[#uG,>[,/Y[[[[[\Y29=>>>tE.........Krppps*-|-s,d`[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[KC&yEKC_P[[[[!qD$v?[83&{E[[QM[A!qM\]_dddba^[[[[[[[[[[[[ZONY[[07X[W"r?[[[[;.00[M5CZ[[[[[]Y29=>>>uE.........Krppps*~-|-r-eX[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[QNY[[[-G#tE[CcF[[[[6&y7B[YHAV[[[[[R?[\]_ccca`^[[[[[[[[[[A;T3>>A[10[[>]M[[[[UA'{HYZY[[[[[[[[]Y19=>>>uE.........Krppps*-|,s-de([[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[@>Y,9Z[[[.::2[9 oX[[[[IbRV[[[[[[[[[[[[[[\^aaa`^[[[[Y[F>>uE.........Krppps*,|,r+fw`[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[Z[T9AY[13[3.[[[[E$w<"r[Q/>Y[[[UcS[[[[[[[[[[[[[[[\\___]\[[S6>X?:G+[Gj[F6I\bDhDK[GJY[[[[[[[[[[[[[[[[[[[[]Z29=>>>uE.........Krpppt*,|,p+cI/[[[[[[[[[[[[[[[[[[[[[[[[[[[[ZZUP9>TTH/[[[A"s[Im[[[[X=%x>X[TY[[[[XGNY[[[[[[[[[[[[[[[[YP^Z[[[NjZYD>>uE.........Krpppt*~,{+p(`K,[[[[[[[[[[[[[[[[[[[[[[[[[[[[[E+C#tVK,RmJU[Tc[Xd[[[[[YU[[[[[[[[[[[[[[[[[[[[[[[[WUANX6>C[[[[YWYWM0F^T[ nO_\E\ddca_[[[[[[[[[[[[[[[XI*[[[[[[[[]Z29=>>>vE.........Krpppt*~+{+p'aM*[[[[[[[[[[[[[[[[[[[[[[[[[[[[O\TX[W^["rA+Y[hT[gM[[[[[[[[[[[[[[[[[[[[[[[[[ZTDMV"rOcT[WU"rW[[[[#t>GTH(}0T[(~8`bcddddb_[[[[[[[[[[[[VJG[I nY[[[[[[[[]Y29=>>?vE.........Krpppt)~+z*o'_K$[[[[[[[[[[[[[[[[[[[[[[[[[[[[[XSWCBaTM>?vE.........Krpppt)~*z*n&^N"[[[[[[[[[[[[[[[[[[[[[[[[[[[[\ o4+F.0S[X[[[E>?vE.........Lrpppt)}*y)m%^N [[[[[[[[[[[[[[[[[[[[[[[[[[[\T::KZ]]\[[[[ZXX[[[[[[[[[[[[+F&yUT9J[M>gE[[[[-<24[1)/3[[B!pK[[[[[[[[[[[[[[[[\`baO7Q[[VZ[[4<23[31[F]=[[[[[[[[[[[[[[_Z29=>>?vE.........Hqpppt(})y)m%^M[[[[[[[[[[[[[[[[[[[[[[[[[[\]]]^___^]\[[[[[[[[[[[ZVRY[VQET!pEA8Y[[Mi=[[[[E+/4YM>DMZO4?[[[[[[[[[[[[[[[[[[[^__/9[;3JE[<(~F"r[FiLO\UZ[[[[[[[[[[[[[[_Z2:=>>?wE.........0qpppt(~)x(k$[M[[[[[[[[[[[[[[[[[[[[[[[[[\]^_````_^]\[[[[[[[[[[U=+H[7/WK o;A)PY[E]U[[[[YM4PZ[[[[[[[[[[[[[[[[[[[[[[[[ZQR[[[@$v[?>L!q[P^OZZ(}XAZ7;W[[[[[[[[[[[[[[[_[2:=>>?wE.........9qpppu(}(w(k#[N[[[[[[[[[[[[[[[[[[[[[[[[\]^_`abba__^\[[[[[[ST[[R8$v+[@!o[R6MR"s@.[W+PO#uM[[[T][H9TW[P`>kU[eR[X[[^^^^^[[[[[[[[[[[`Z2:=>>?wE.........0qpppu'}(v'j"ZO[[[[[[[[[[[[[[[[[[[[[[[[\]^_]]`db`_^\[WRBRK&yN[[[Z4$u[QZZP5F[D8R[[RV[[[[[[[[[[[[YZ[[[[[[[[[[YOW[Q"sNcWVW[[[[OW'|L27#sTWBDHX[7HY[^_`aaa`_^[[[[[[[[[[`Z2:=>>?wE.........7qpppu'|'w&j"ZN[[[[[[[[[[[[[[[[[[[[[[[[\]^_YC?dc^\^]M&zJiXR\[[[[YWC[L\QY+AY[UZ[Z[[[[[[[[[[[YUWXJH[[[[[ZI?T=4U[ZWYXU[`@X]]3c5[R6CX[[[[[[[[Y^`abcccba`^[[[[[[[[[[a[2:=>>?wE.........*qpppu&|'v&i!XL[[[[[[[[[[[[[[[[[[[[[[[[\]^_`MicU&yLA\WWYWY[\FX[[[(~:RQ3N[X[[[[[[[[[[[[[[[[[[YI9[Rm[S>?xE.........*qpppu&{&u%gWM[[[[[[[[[[[[[[[[[[[[[[[[]^___W`I4ZjU[aNcM9\+V[[[QMX[PG[[[[[[[[[[[[[[[[[[[[[[aW[\T9=W[[jF[03AK],-*;]>,]]]XE2H]]]]]][[[[[[_`bcdddddcb`_[[[[[[[[[[[a[29=>>?xE.........*qpppu%{%t$gX O [[[[[[[[[[[[[[[[[[[[[[[[\]^__eRQ:U"rB[&y2'{?[73[[[[[[[[K<[[[[[[[[[[[[[[[[[[[=>[lF[$vE07U[[/(}E159M\K@FR]S3Z^^^]HX]]]]]]]]\[[[_accdddddcca_[[[[[[[[[[[[b[2:=>>?xE.........*qpppu%z%t$gV O [[[[[[[[[[[[[[[[[[[[[[[[\]]^$v"r>@6&{>[I>DP[L3W[[[[[[[[[[[[[[[[ZVY[[[[R;MY[-5[24[9-<+=8Z8$uHOYG]]]]^^^^^Z^^^^^^^^^]]]]]]][]_bcdddddddca_[[[[[[[[[[[[[b[3:=>>?xE.........*qpppu$z$s"eU N [[[[[[[[[[[[[[[[[[[[[[[[\\]GljSYA2R[[[[[[[[W[[[[[[[[[[[[[[[WF7L[[[[@.D;[>$v[=c0!pX)?9SYHGY\]]]^^^^____________^^^^]]]]]]]_acdddddddca_[[[[[[[[[[[[[[bZ2:=>>?xE.........*qpppu$z#r"dT M[[[[[[[[[[[[[[[[[[[[[[[[[[\[K/\\[[[[[[[[[[[[[[[[[[[[[[[[[Q>C1c-[[[[HjRl[H\U"r\BJk[[QZ\]]]]]^^^_____````````______^^]]]]]_accdddddcba_[[[[[[[[[[[[[[[bZ2:=>>?xE.........*qpppu#y"r!eT O[[[[[[[[[[[[[[[[[[[[[[[[[[[[J4BY[[[[[[[[[[[JJ[[[[[[[[S7>YJ oZZAm[[[[XiSXZJiTU)XJ9MX[\]]]]]^^____```````````````_____^]]]^`bccdddccb`\[[[[[[[[[[[[[[[[dZ3:=>>?xE.........*qpppu"y!r cS O[[[[[[[[[[[[[[[[[[[[[[[[[[[[[GPZ[[[[[[PG[[[A-[[[S6PU[QdY[XY[YX6Z[[[[P2dRWIXN:>S?9S]]]]]^^___````````````````````_____^]]_abcccccb`_[[[[[[[[[[[[[[[[[[eZ3:=>>?xE..........qpppu"y!qbQ N[[[[[[[[[[[[[[[[[[[[[[[[[[[[Z[[[[[[[[[I%x[[[Ka9O[L.S"rZ[WXXM\-X!p?T[[[YF"s@[[>;[MGXZ[\]]]]^^___````NBYaaaaaaaaaaaaaaa``___^]]_`abbba`_[[[[[[[[[[[[[[[[[[[[lZ2:=>>?xE.........*qpppu!w oaQ P[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[YS_9O[PdP!pVI9YjM[g2>9 n7[KCS[[[ZRT[[[UW[[[[[\\]]]^^___OR_``+;^aaaaaaaaabbbaaaaa``__^^]___`__^[[[[[[[[[[[[[[[[[[[[[hZ2:=>>?xE.........*qpppu!wo`Q R[[[[[[[[[[[[[[[[[[[[[[[[[[[[XOL[YFF,?OiI'|O[%xP%xEU7A$v?T.5M[>-[[[[[[[[[[[[[[[[[[[[\\]]^Y^A9V.B;Ha(}:aaaaaaabbbbbbbbaaaa```_^]]]]]][[[[[[[[[[[[[[[[[[[[[[[leZ3:=>>?xE.........*qpppu vn`P Q[[[[[[[[[[[[[[[[[[[[[[[[[[[[N) nRV,J#sA[-H/:[40,4[M4#uKXPV[[UIT[[[[[[[[[[[[[[[[[Z\XY]^62]26Z;J>?xE..........qpppuvn^N Q[[[[[[[[[[[[[[[[[[[[[[[[[[[[PE#t=[4>70[<)4*[A&y4>[[VZ[[[[[[[[Z[[[[[[[[[[[[[[YUY\O5CO^:'|`C&y`E:Cfa?jELaaabbbbbbbbbbbbbbbaa``_^]58[[[Q@[[[[[[[[[[[[[[[[[[[[^K2:=>>?xE.........*qpppuvm^NS[[[[[[[[[[[[[[[[[[[[[[[[[[[[[Ng7[?$vKj[H"s48[QHX[[[[[[[[[[[[[[[[[[[[[[[[[[[T5>>?xE.........*qppptum^N P[[[[[[[[[[[[[[[[[[[[[[[[[[[[MWTYAgZ:UQEV[[[Y[[[[[[[[[[[[[[[[[[[[\\\\]\[[O n[\\W^Z[_KXZC\YaYCZaaaabbbbbcccccccccccccbbb^AR^]JcP!p[[[[[[[[[[[[[[[[[[[[[[[d[63:=>>?y........?.*qpppuuk\L[[[[[[[[[[[[[[[[[[[[[[[[[[[[[/:VMCZZ[[Y[[[[[[[[[[[[[[[[[[Z[ZUN;U\\]]^VB2\ nACZ\(}HYSP)Na&zDaaaaaabbbbbccccccccccccccb@8ZW)Q)[^l[fO[[[[[[[[[[[[[[[[[[[[[[[[ZF3:=>>?yE.........*qppputjZL[[[[[[[[[[[[[[[[[[[[[[[[[[[[[TX[[[[[[[[[[[[[[[[[[[[[[[[Y[[W(}@/H[]K5"rZZ"r6]-<4U\]2&yU`VOaWY\aaabbbbbccccccccccccO:`bc nHbJ8\$uG^):#t>[[[[[[[[[[[[[[[[[[[[[[[e[H2:=>>?yE.......3.*qppptsj[K[[[[[[[[[[[[[[[[[[[[[[[[[[[Z[[[[[[[[[[[[[[[[[[[[[ZNOX(}IFY[]Z nDZ^..CY``_][HM\ZC+E``E6aaaaaabbbbcccddddcccccdd0?7Mc$u?bR>?yE.........*qppptsjZL~[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ZW[[[[[[[[[[-L"rFM4R&yI[%wB/55E___aa``_^]\\\\]```aaaaaaabbbcccdd^RbM4I^dddd-7:4d4!p?DL5!pC_MFY[Z[[[[[[[[[[[[[[[[[[[[[[c[[H3:=>>?yE.........*qppptsiXKr[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[VBXYKPZ[[[[#tE'|?T3:=>>?z..........*qpppsrhXKo[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[XGKY[RO,JJ2OZ[[[[52<*[A3/2\Il^^X`aaacbaa`_^^]]]]```?e4J_abbR?/-c<+C$udF#sNlddddbJ(~mdNRbbbaaba`^]][[[[[[[[[[[[[[[[[[[[[[[[[[d93:=>>@zE.........*qppptqgYNd[[[[[[[[[[[[[[[[[[[[[[[[[[[[PTD0?KZ7665A,X[[[[[@c<"r[WE)L\\#uZ_`abccdcbaa`_^]]]^``a:770\abbI$wLkdOc\\d`#uJXdddda? nNdcccbbbcccba_][[[[[[[[[[[[[[[[[[[[[[[[][[r-}3:>>>@zE.........)qpppsphZNb[[[[[[[[[[[[[[[[[[[[[[[[[[[[Y;d5MYZ>"rNlT"sC6[[[[P6<>Z[[[[\]^Z^`bcddddbba`_^]]]\RCTV09kabbb]\b\dYWD__dc*'{_dddaM[ddcccbccdddcca`\[[[[[[[[[[[[[[[[[[[[[[[_[a -~3:=>>@zE.......B.)qppprqgYO_[[[[[[[[[[[[[[[[[[[[[[[[[[[[[Z[J,[[QYNX[2;EZ[[[YZ[[[[[[[\]^__abcddddcba`_VKZY7?e]]Wa[`bbcclCeW^7:7\b<&zJdddddddcccccccddddddc`][[[[[[[[[[[[[[[[[[[[[[[a[j $m-}3:=>>@zE.........)qpppspgZR`[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[>(~Y[[^6-U[JX[[[[[[[[[[[[[\]^__`bcdddd`Oa`\(~?Z]X^]\agTdJbbcdN06[badddcaddddddddcccccccdddddddcb`[[[[[[[[[[[[[[[[[[[[[[[c[}$m,{3:>>>@{E.........)qppprpg[lt}R[[[[[[[[[[[[[[[[[[[[[[[[[[[Z[Y[&{E[[[$u4V[Z[[[[[[[[[[[[[[[\]^_[NKcccdc<9B]_\Q]] nK!qDa59-F`bcddcddddddddddddddddccccccccddddddddc`][[[[[[[[[[[[[[[[[[[[[[[[[$m,|3:=>>@{E.+.......)qpppqpgm|P[[[[[[[[[[[[[[[[[[[[[[[[[[[;5SAK[[[=0H[[[[[[[[[[[[[[[[[\]]XJ&y nZbbcbkF/G_&{7IU:2(~?aaNF\abcdddddddddddddddddddccccccccddddddddca^\[[[[[[[[[[[[[[[[[[[[[[j[$$m,}3:=>>@{E.........)qppproyF[[[[[[[[[[[[[[[[[[[[[[[[[[[?*OD1.$u:XNT[[[[[Z[[[[[[[[[XMT\27KG!oA``bb2990^1$uCO\G8X`aaaabbcddddddddddddddddddcccccccccddddddddca_^[[[[[[[[[[[[[[[[[[[[[[j[u'$m,|3:=>>@{E.........)qppprD[[[[[[[[[[[[[[[[[[[[[[[[[[[WH(~"s9JVX[[[[Z[[[%wS[[[YTZ[[;.Q\/5^Jd<__aaK52!p^?>@{E.........)qpp2n<[[[[[[[[[[[[[[[[[[[[[[[[[[[[Z[[[[[[[[[,L[[[+=UZ[95HD[9(}[\E"rWK\Y__a``RmA]\]]]^``aaaaaabbccdddddddddddddddddcccccccccdddddddccba_][[[[[[[[[[[[[[[[[[[[[_[c:$m,}3:=>>@{E.........)qp]r򙙙:[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[37VZX3j>?Z>?K#s[M^PA(~X:[0:Z^``Y79Y\\]]]^``aaaaaabbbcddc\Ldddddddddddccccccccccdddddddccba`][[[[[[[[[[[[[[[[[[[[[\[[R$m,|3:=>>@{E.........)%n񟟟8[[[[[[[[[[[[[[[[[[[[[[[[[[[[[XX[[ZTGM<c<>[N#tWd[H9RW[J^>EXaW\W[]]_^]]]\\\]]]^``aaaaaaabZ[;Kb3@>ddddddddddcccbbbccccddddddddcbb`]\[[[[[[[[[[[[[[[[[[[[[r`$m,|3:=>>@{E......../pyyy헗0[[[[[[[[[[[[[[[[[[[[[[[[[[[YN<@[K,?jRTk[_[[fTWWQ24%wVI7MV[.GZ\\\\]]]\\\\\\[U]```aa^T>J^lS`ZdW\#s[ddddddddccbbbbbccccddddddddcbb`]][[[[[[[[[[[[[[[[[[[[[_e$m,~4;>>>@{E.......\wwwwww윜.[[[[[[[[[[[[[[[[[[[[[[[[[[[Y>gc[Q&y[WW[jT\P[!p7#sN[S8GY[[[[[ZYX[[\\[[[[[\\\\]NH```aa7CdNa`WhJc$vI'{@dddddddccbbbbbbccccddddddddcbb`]][[[[[[[[[[[[[[[[[[[[[a[+.5;>>>@{E.....Rrrrss$[[[[[[[[[[[[[[[[[[[[[[[[[[[[YT`S[kQjF['|4$wGW98FU[[[[[[[[[[[[[[[[[[[[[[[\\[II'{W```amJ(}Ba);+6cC>"s0dddddcccbbbbaabccccddddddddcba`]\[[[[[[[[[[[[\\\\[[[[[c[+.5;=>>@{E...bwwUU[[[[[[[[[[[[[[[[[[[[[[[[[[[[[)"rSX$u>:=V<4CS[XX[[[[[[[[[[[[[[[[[[[[[[[TK3=Z)A)?```a457-a7&z11cbB!qNddddccccbbaaaabbccccddddddcbcba^[[[[[[[[[[]]]]]^^^^][[[[|$+.5;>>>@|E0oozZZUU[[[[[[[[[[[[[[[[[[[[[[[[[[[[[8,QT58WPYXV[[[[[[[[[[[[[[[[[[[[Z[ZYO;I[?:05\31?*````K+.4_RAHRbX9Ccddddcccccbaaa\^`cccccddddccbcb`^[[[[[[[[[]]^^^_`__^^^[[]h3+06;>>>@}{{{jjaa\\VV[[[[[[[[[[[[[[[[[[[[[[[[[[[[UAJYY[[[[[[[[[[[[[[[[[[[[[[[[[[[C.P>*Y[?'|K$w\HcCg_````V9W`aacccddddddddddccccaaaaHBbG;^ccccccbbba_][[[[[[[\\]^_```aaa`_^^\a[G3SbVRtpppllhhbb]]XX[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[YYN8N[[[E!q[He[[RdKZ\O n8-^````aaaaacccddddddddddddcbc`\[;D%x_+Ubccccbbbaa`_[[[[[[[\\]_```aabbaaa`_^f[^ oooaaissmmhhee____[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[T>C(~UIgZ[[[X]WTWA:[5,2VPEQ[__````aaabccddddddddddddddc^&{CX`[ZaeH^abbbbaa``_[[[[[[[[\]]``aaaabbbbaa`_i[[p bbbiivvppnnjjffaa[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[YW[[ZVU[[VQJ5T[TjSX[WWZ[[[5W-G"r?KYZJV\\\\^^__````aabccdddddddcL[3Fddcc[__[ZeS,:/Maaaa`_^_[[[[[[[[\\]^`aaabbcbbbbaa`^|[#aaowwwwwwssqqmmhhU[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[XMP[O66[W$uC*OZ[[aY]PUZL[[[T%wETIUZ[[[[[\\\]^^__````abcdddddc8BblOfMddcc"s?_'|7'{AM?A^____^^^[[[[[[[[[\]^^aaabbcdccbbba`_g&rryyyzz{{zz||zzvvnn[[[[[[[[[[[[[[[[[[[[[[[[[[[[ZUR[[RK-[C&y[V[]X"s@UY[ n< o9;lG[[Z[<5[[[[[[[[[\\\]]^^__```abaJJbddd"rAd#sF*)KYXY[[\]^_ZF^^]^]]]]^achkmmkigddddddccbbaaa```___^^^^\[[[[[[[[[[[[[[]]^`aabbbccccddddedcgj9ppttpǵݛܛɦȰ桻O[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[Z[[=1Q[[[-5:.[>+>$v[H%wHY[[[[Y[[[[[[[[\]^^^^]^]]]]^_`cgjllkhfdddddccbbbbaaaa```__^^^^\[[[[[[[[[[[[[[]]_`aaaabbbcddddeedjkB[[[[[[[[[[[[[[[[[[[[[[[[[[[[M*-MY[:+[Z[[A!pGg[R,.3XYGLZ[[[[[[[[[[[[[[\\]]\]]]]]^___bfhjjigedddccccbbbbbaaaaa``__^^^^\[[[[[[[[[[[[[[]^^_```aaabcddedecbmH[[[[[[[[[[[[[[[[[[[[[[[[[[[[H/M=;]Og[\[[TW=(~[[U>SZ[[[[[[[[[[[[[[[[[[[[\[[]]]]^___`adgggfeccccccbbbbbbbbbaaaa``__^^^^[[[[[[[[[[[[[[[\^^^^_`___accddb^_dlR[[[[[[[[[[[[[[[[[[[[[[[[[[[[XO\W[]0W0\]]\^\^<1>*]C(}K&yA7[[[[[[[[[[[[[[[[[[[[[[[\\]^__j&[[[[[[[[[[[[[[[[[[[[[[\\]]``R`aaaaaaaaa`_^]\T9(}I[bbbbb\Wa`_WSI#t@,[_K+^\O_dd_K_dddddddcbba``__^YMV^QHY]^]]C n[W(})[[[[[[[[[[[[[[[[[[[[[[[[[^+[[[[[[[[[[[[[[[[[[[[[\]]^aaa`cddddcbbaa``_^^^^^^];%x4CYWL:5T=.?&z[B n\S7MU$w?3_____\O`abcddddddddddddRLcba``__[?!p3\2E[]^]]UZ[XWK[[[[[[[[[[[[[[[[[[[[[[[[[_:[[[[[[[\\\\\\\[[[[[[\\]^`aaabbccbbbaaa`___^____]>52,WN.C o[KdU_[NXZO2E^T:Z_____``abccddddddddddddB+cbaZc"rFdd'{Q'|CZ9C%x:_?2G^UR]^]]]K,[[[[[[[[\abba\[[[[\`bb`\[[[_add \\]]^^^_____^^^]]\\[[\\]^_``]V]1HR]^]]I8\"sId n3=WA:2JY[NR[[[[[[\QL\]]_bcdfdba\_``aai2Kb_-J&y?d(~;dc60.1`J4"rG_\W]^^]]^]]\Z[[[[[[[[[bccccb[[[[bcccca[[\_ad\]]^^_________^^]]\[[[\]]^__+;O1O*H]]]S:D)7`.-JW^VQZ[[[[[[[[[[\\\\]]`cefhf`G=U``a[*87^ORbba_``_______^^^]]]YVV[[[THRP'|H[acddddcb[[acddddb`[\]`cA^^__``abbba``___^]\\[[[[[[T#t[BVA!oD[[[[\]^^__^^]\[[[[[[[[[[[[[[\\\K$w0?JeNbcZW7__``X"r51aQJbcceddaa```aaaa__^^^^]]]]M4[W:<gUVY[[`ccddcc`[[`ccddcb_[[]`afD^___`bccdccb`___^]]\[[[[[[[Z]Z[Y[[[[[[[\]]]]^^]]\\\[[VP[ZNOQ/[\\\X7]NjcOY6__H[__`XEV`bbbbbdffedb``acddca_^^^\PLX,Jd[[[Y\V[aJX[`cccca[[[[`bbbb_[[[]^aiJ^__`abcddddca`__^^]\[[[[[[[[.LY[[[[[[[[[\\]]]]]]]\\[Q?NPVmKZX[[\\\]]]dX:_=_E?W___`_``aaaaceghgecbbceffec]^^^]"sDX^UcO[lM"rGA]#uQ[[`aa`[[[[[[_``_[[[[]]bmb^__`acdddddca`__^^]\[[[[[[[[[YY[[[[[[[[[\\ZY]]]]Y[8`.*YY[ZX[[[[\\\\][,C^27________```````cfhiigdabddKWd*>\^]]lJ\"sD*;[63(~>Y:-[Z[[[[[[[[[[[[[[[[[[[]]br^__`acdddddcb`__^^]\[[[[[[[[[[[[[[[[[[[\\TC=]^^^W=1J]MFS[!p3Q[[[\\[X]V8>\OFZ_________`X\`bdgijjeSNb4C$w?g$v=^^\]/)N:&y43[WD3P[O)X[[[[[[[[[[[[[[[[[[[[[]bj!__`acdddddca`__^^]\[[[[[[[[[[[[[ZUQZ[RU]J"r^P____L2G^];?Hj"rU[[[[\UAA/4GJ^^\_________:_:S`d_`iI=(}6c3:50e8*^]]N"sbPMY>I[[[[[[[[U[[[[[[[[[[[[[[[[[[[[[]bet,___`bccddcb`___^]]\[[[[[[[[[[[[[S7)PL/L]\\)?____Z27^^F$v\Mm[[[[[[\Y17Q\]^^^^_______]2?09]E+Jg<.A)bE'{Hf]9i]]]]Z_\YWQ[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ado3___`abbcbba`___^]\\[[[[[[[[ZRJ:8G7 o:=3]^^E]I````TpT_^Aj\Z4T[[[[[\\\\]][]^^^^___^]__I30(~_BmddLkWb_KZ>!oIk4[]]\\4RYA:U[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[am6___``aaa``___^^]\\[[[[[[[[X;5:'|[X+/Q$wGA_TiQ_abb`:PZG!s9Z\[XZ[[[[[\\\\:;]]]^YQ]J+MH_NeXb_YYZI`k@lZO*8EZV]]]\\[\YZZ[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[kA^____```____^^]]\[[[[[[[[[ZH(~Sa[SWJZ,?@__FI_cccb]`/l6T\\[[[[[[[[\\\\F&yW[]U)@ZE6Wg_^`[[YO]:@^S.AZ\]^^]]]]\\\\\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]Y^^_________^^]]\\[[[[[[[[[[VXZWU[%x=U]F[__`bcdddcb`QU_^]\[[[[[[[[[\\[F]98]YW\^J9[]R_)>(}MJ2FW^_^^^^^^]]]]]\\\\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[eu]^^^______^^]]\\[[[[[[[[[[[MbR:N[POZ]^__`acdddddca`__^][\[[[[RH/F[\\\kZhQ]eEKL5['|*AQV74V^^^^^^^^^^^^^^]^^^_^^^^^\\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[^\]]]]^]]]]]\\[[[[[[[[[[[[[[[[[[[[[\]^___`bcddddba_XSJ#t`N[[[[$vD/<[[[\8(}.9Y9X[XRUJ+WZ[L-AgZO]W[MY[[[[[[[[[[[[[[[[[[[[\]]^_______^^^_accddddcb_[[[[`ccddcc`[[[[[[[[[[[[[[[[[[[c-[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[WABU[NcVeW[[VU[[^Y!pPXJ%x[47[NN[C-E'{,O*9[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\\\\\\[\^`bcddddddca^[[[[[[[[[[[[[[[[[[[[[[[[[bcddddn[[[[[[[[[[[[[[[[[[[[[[[[[[[MPI:O-;W;@+4[7lO[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]^^]][[[[[[[[[[[[[[[[[[[[[[]]]\[[[[[[[[[[eq [[[[[[[[[[[[[[[[[[[[[[[[[[N:k,SVY[Z[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]_``]\[[[[[[[[[`[[[[[[[[[[[[[[[[[[[[[[[[[[[Y[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[`bbb`[[[[[[[[[]`abb_]\[[[[[[[[^[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[`ccccc`[[[[[[[[^abdd`^\[[[[[[[[][[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[^bcdddcb^[[[[[[\_acdd`^\[[[[[[[[[g[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\\\\\\\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[`ccdddccb[[[[[[[^`bcc`^\[[[k[[[[[[*[[[[[[[[[[[[[[[[[[[[[[[[[[[\\]]]]]]]\\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[`ccdddceg[[[[[[[]_aaa^]\[[\na[[[[[<[[[[[[[[[[[[[[[[[[[[[[[[[[\\]]^^^^^]]\\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[^bcdddcgh][[[[[[[]___]\[a\[[[[N[[[[[[[[[[[[[[[[[[[[[[[[[\\]^^_____^^]\\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[oo[[[[[[[[[[[[[[[[[`bcccbil][m_[[]]]\[HIH776-.,TSRs\[[[\[[[[[[[[[[[[[[[[[[[[[[[[\\]^_________^]\\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[g^\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[_aba_q`CCA11.4>>~r_[[[[[struwu))(mnmf\[[[i[[[[[[[[[[[[[[[[[[[[[[[[\]^^__``a``___^]\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[`_]\[[[[[[[[o[[[[[[[[[[[NNM,+)220e[[[[[[hhdqqm#" h[[[[[{{zwxw@@>jjiu_^[\ [[[[[[[[[[[[[[[[[[[[[[[\]^__`abbba`__^]\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[\]\[[[[]\[[[[[[[eed??>OPO`[[[[[[nnja`^<:8c[[[[[<:8imll[[[[[qrq`a`}gf[][[[[[[[[[[[[[[[[[[[[[[\\]^_`abcdcca`_^]\\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[c^\[[[[[^d}ob][[[o[}}{GFCFECg][[`js}~zvvu663rsqn][[[[~~LMJtV[\]b~~~xyyx[^[[[[[[[[[[[[[[[[[[[[[\]^^_`acdddcb`__^]\[[[[[[[[[[[[[[[[[[[[[[[[[zg]\[[\\d}tsqonlGDBpolx^][[o[|{zeeb((#^[]ewpoomPPL^[[[[ssrn^^ex}~f^[[[[[[[[[[[[[[[[[[[[[\]^^_`acdddcb`__^]\[[[[[[[[[[[[y[[[[[[[[[lljOOMBB@543f][[\]lb`]NKGo_]\o[ccaLKIa[bkw~}nmkiZ[[[wwvlivff[[[[[[[[[[[[[[[[[[[[[\\]^_`acdddca`_^^{[[[[[[[[[eec77500.AA?[[[[[[[}JJG==;t`\[^_viif\ZUlrd_]o[jihkih}yf[_lsppnq]ee`zzzp`[[[[[[[[[[[[[[[[[[[[[\\]__`bcccb`__~}531&$#ONN[[[[[[[[xwtEDBIGE[[[[[[]\ZBA?a\[abnnltsquuf`_a]xwvhgf}wp^s}nolu[`b^[~~}ؙޫڈʊºŀvc^[[[[[[[[[[[[[[[[[[[[[[EEC664ihh`aaa`__>=:QQO[[[[[[WVT==:[[[[[fedfdbre[[dhyyy{zz{}rmjpgdecnu{ynnlnolju뇏ڎ~D(~y~|[7[[[[[[[v^nqsss[[[[[[[[[rqn:85nvw```___[ZY>=;QYZ[^\[ZYZZXaZ[[[[vvu||zxuc]frxz{z}z}ffdqqp쀤xzr_YaJIG/0( NNKwzzz|{dec40*Pyzy ̃ [[[[[[|~][Y~\[Yahi[[[[[[[\[Y<;8_____^`_^YZWRW[[][~llknmkwgYZ[[[~yyw`xwvppz}}~}~󢢟qqquzihYYXq3`a`z||vxxYZVPQL ffc961aVWVmnnlml`a`.+&$.[[[[[[ec`EDBzzy[[[[[[\[ZNKH~V^^^]]lkjn_W[[\[}|zuutlmkkg^\[[[uur}{{|zqۑĄ@>9h)(aba~vyxdfd OOI*gfe:74]]]rrsnppNOKCC={{wFEBRSSaba^_^UUQF[[[[[[jjgPPNrroQW[[[[[mmmxxvyvX^]]]\uuu|rcWV[[[|ghg|pzi_[[aihf}ȫ­yyxOOKlffeXjkj򄆅|TTQ85/) '&5DD?=;6wceetvvjkkVWRDD=uurEDBUUUcddbdcNOL>=8jlgwZZ[MNNZ[ZYZZKKGwc[[[[[[hge{|T[[[[[tttzzwaXXY\\\[~aM[[[[bca}񲲱_^\enliRRM(974LNJrfhfuwvnqp^`]4,'XWTEC@Z\ZhihbdcFD? UVUOQPZ[[XYWPSNcIPGbb^AqqqUVVZ[[^`^QQLs)ÿYe[[[[[xnomvaXV[[[[}}}vvtxXUcLUZ[~e`a_򤦤vwuywvonl:98'DC@mnmy{zqtsGGC><5UURGFC^^^hjj\^\TVQw5RRQPQQ\]]]_^IFCsTlmlTUUZ\\VXUQSMXZcQ)5*dfe`bbcec__\2)ݦҫ)[[[[[]rrqw]aQ[[[[ooln[Yi~uurɚؘ}{IJIIFegfnpqabaGE@o[[VIjihLMLWXX_``UVSLMIAqsnZZZQRRZ\\WYXKKHN" dttt[\[`bb\\XVUO0#lmmgihhliiniSorrpsqg[^`dy}}||}{~}z܀{vƶϽ]\Y 861{prqoqpEEBXFDANOMgihmpocfcXZUcTUOWWRP[[WIJHZ[[`bb[]ZKHDI<>6%SSSRSS\^^QQOHFB>__\kkkkYZY\_^]_][][%otl4hiihjjegdIE> ELE jmonlok]oumv{wǩptr@ޞαZYVCA<8_a^}^^\885FvtqvvuJJFTONLijisutikkKMJnK_^\KKJ[\\defTUSKLGYOPHIID wwxPPPRTSY[ZUVTNMJ3 ffeXYY`a`[[YLLD&$=gihced`b`[]Wxyylmksupb-vwujmj#^pmkpmkpmkffc@@jjemUTPIJI^_`dee]_\PQNO|}w/|||RRRRSS^__TUSDD@M<:5`aaVWW[]\VWSMLH*Y||{bddefedfcpqqjmlosqNJkkj|x&jqj{՜1ee_}|zGGDSTSdffdgf[][GHD$XXRAqqpMMMSUV\\]STQHHBF\\X]^]TVU[]\Y[ZLOJ$sqqq\^^cfe_b_9,/jkkmoneheQfssr{{z/}}Ƿ--WSSL {v\[[NNNZ[[YZYQQNJIE<@7UUUSTT\]]UVTEB<6-+( jqqq^a``ba]_]]_\ ?ghhjmjikfT[a[}~}suswzw(7-/Ƿ{GUG4tzt6 Tg~zLkkkOPPWXXYZYONJEB<wmmm\]\bbbbb^ 8hjjikkac`\Z^X}}vvvjljsvlAz}yb~~A#{ '_`_]^]ab`YZU`<@2DcdehjjegcqrssrtrwywFqtp愄 O  nnndfefheehc2lllqsr`d`"bz{y qun6М1{}wUkmmlomchbmsmstwrƸ񁅂7&߶NŠ.(wzwqvqNxztLMح M.susuvxs*dc='f+POPJ#z;?'?G????????????? ???????????C0C <<<~8 ~ <~|||?~?~?????noblenote-1.2.0/src/noblenote-icons/fileremove.png0000664000175000017500000000367013502165236021244 0ustar chrischrisPNG  IHDR00WsRGBbKGD pHYs B(xtIME  18IDAThkl33;I=$@ 8&!MP"mZ*5ĉ mF*EJ(Q4&wkR(܂m9ab'5q|hgw3#{MӴdҔREqqqO Aet!(<B===^uɲe355BhFhQJq])PgvޥK455vܹ-eeer$s7?/qaN  nӒX)eBVXIzkyo|RZbV my`t&n1f.? qCzɗ_&{r>/3@ki_Cٻhyjh*)!#2n4-_{`ft.tvrP=%)]W|~=4۸p"DK9\\i_˚J,ӝ\J.ýȞ3*+1 st10,$Ѫ*?'ϐ2:X;53op,j|>B uJmٝBo4!{R!VuAZmVn6^WʟZs[+2$ -/]B5uk5&?@DcRHКu\ !.UчS(]Qu<Wz;~ aKIZ"Os(;ׯ! z .㓊2 \^ h̄1.jgGy9D"'y[j~+.( \7+ZPV/^&!7H@w/bӺukjoGZ7yW{<&۲xN3xM~<0m&`\E8XpL>ٹ3?7qFK+_hX0bòWӪ=^;eruq3MGY}{ ]㺭bm_ggy>)O0\]M%%Kglvݴ9;湆^%ElJiXŏ{%Kq35 ? []]}QeH0 χmU pw e&(xCD9mloޙGkMPEc IENDB`noblenote-1.2.0/src/noblenote-icons/file.png0000664000175000017500000000232213502165236020017 0ustar chrischrisPNG  IHDR00WbKGD pHYs B(xtIME #Ƭ`_IDAThXo#E̮v'N. םDŗ(.eҧ  )8t (G("A"K\wg E2{&8I+kw}c zT1Rr:ZemFE,NNNѩ1fyee,N/1`l:`jRfffBP=<<|kkkF71Z뾯v=z@#J%0xqqqVs첆sFQ 0D~jjcl^7ĵk1B!Q*uss)>ZkQD!80 CU*Z/ J k|XDTB.C\oll\yB?AՂ 'P(QCA!ƊFVWWJ uB$ c`cnnJ&%&`A"h[&&*8>>ΖidR PJھ099TLr D pp)4 _/4JAQVdLxbsB)8FPYZ%eB+4r!])4jkD2% ՖIb(tah, g>d㿄USZi ٱ/ r\NOսnŮh יE:yn}A;wG_~Y7Պ4"T˯BQrȮsH-PDT -opd(=e|+~5D* ]nɊ>._ EHT9ࢌZ{Ғ*ܣo窮4h*[\UNoy0MrQ(g6(7H3ȿ '/qc 5 }ls( 3oJ}WIENDB`noblenote-1.2.0/src/noblenote-icons/format-text-italic.png0000664000175000017500000000516613502165236022626 0ustar chrischrisPNG  IHDR00W =IDATxYiP[5^71l6,[,f3%@hC ! 0{16M4]&I;$Nɤ4MI3m=4k~zL;4VNq{KOc"E wx\9>{5Kx }!W,qέO_gt=Gc^#G8)=.ãøxyWq5L^ 8u.w1s026,ǻ(pگѬ?;p@Ӥ\Y:2 z ?]NǫGqYغPѢdM;]/]‹/QHR(y 6{o/>671Ǻ0*5xU(*? R S V{!nk-9ohm7C^_ـvP^NUPh{!rU*WSZ[ 2[YLN] P6*a0a2FׇM F#d8RVr+hl*ܢmvZݞÙq -h4@ע^k^ZH*CaY9r#;\A UC3@SZauY QhhP^Ӥ Sx> HBZ75B!}H=qHbɭtoDaHEF0wBB,G,}f +ұ7*B,@,HI>=}T$̦jPS+xW?</F(xafH&~!PvF- :VGwERlv+II*>o/9<[LA]f)hr˧J nsʹr 8sI> ɨVW -F#* JMJJJJ| cϐ\>vR465 GRп[;I)٫ˊ#o/Y$`Z!N[F+Y**x/ZrChA h"ylԣV˯")V1Cqz,6hVCy Y9dQ~k̦R VOא(*833HC,W YLq0 =`[HR1uR(fi=SO@JZZ9pjtt!--_m1`bruJ (U 0Mh+=;qRr2MWT^Æ6%t1; =ʧZApWw*ʰ/y/IGW=ݻSO 3fC3nBE~!3Wjz@F$D F55Ν;ݱ{'!1sSW2o`3ڭ4+xWG"~aBޠ-s=w -۷4+g v'yܚF|FvwgJގ!$qv&{>Qߊ(&&&k~GZ]S'Όbpz6Oʱm[dΝN]3Urcᠤ{ <8;~!lD~4yy37g&:k,ld <;B7R!ׯO2xpܚږ-[}h9w |oc#$44t{dd;A73ܼ\ _i)RW/v |'Y޹٠1 ۢڌxyJ~jRMa> ѧactv/+R'ð7[ρ_#{="""&JuUR#W"C$<;wgq[^xtv†  YLpWFD$W `q$XjU76òD Mk׮}QUϔ},k8nĞ$IDpp˖-+#իW+'icD@H&̧_V\fsY!""%l$l&!!+)#vF,D"gɎςb ]xD8 [O @yQ`o>=3h|7&{aR_ A,B!R9~uJ9%ne0JЊ\6}}ҥf_F(gQF(&_%e9ZY RңG*O&DB؜G1@b a%8SG 7附p!dXdhi›{7~!@q96#ef DžB"l;vk}h`dtfal#Kh3@$V>;lb}_HmXB߾ Y b~g 6?E ai_Ek_IENDB`noblenote-1.2.0/src/noblenote-icons/foldernew.png0000664000175000017500000000737413502165236021101 0ustar chrischrisPNG  IHDR00WsRGBbKGD pHYs  tIME'm|IDATh޵]ey?d?B)$QdZGPPmm;u,Nmjuj;qcud I0!!@~dww}9ww%$;{{9yqÏ>/>q}Цo~zw>?o`ߒkㆧo~]Tʗ(8Dgop[A~z;'dǁlk"}!N7cw:~ٻNo:λV& #N]{g޼oρuoG5w  VUADw 8(T))dZԒTcͫc[2OI޻'w|zx!W.7Oغg5ݷ+"B :F@=F Fc$G:3+}-x;XԫP\@!CASNQ/ g}PfOpvֿSy lh8hzpC-B=CR"FT=gsf:)6 DBa"iySSg5|d o `LN!@h@}Y@Uճ?xYIsv{9Ȟ ԲܺzsH̚g"xhxz@AED޸TMɴOB䯐o-=d$Q! ́z ˹*hSdrD&גBкC>˳ץ|DEGU 4#(ܠLnFYNT}D `R?+ZĘz~Ւ*BW3:ѩYfy_zj<1~lV+̢ezߧ-79uh:0K[vwL;UX_)oLY\U#h ` bAKNX{WB_c <0'+ZM%hiesD3 ,R5b >T@%#*\xdNv;_X_ϟFHr eW p^1j73%TPíf-(9 /UAA*#_Ns ei:H'km꼑%9Tc{y|tw?AEo宋{ vF#XM*q@_9b2Z.` U}qQ5yt0w εϴ6r˫WRpNG n꽾YE: l:R|PO`,ė7;FC` 1t$.60"4|Ƽ_YKX"˺Vp̱ dǍMJ?*go"(Fj[Cy5XC // %+ĦD{p;^~8r9ubV?=<#Q(<{4ώhe@`HӄF_ěi<+>Z( lDd""iC՗ygkL6S&I2 =B8 ]7ڜ2]Z M|^rzE4]wt=p?N` :΋on *Yfپ$B+f5W-(tI:cz5M{ji  NlM!F@%jJؔGgr(o 6Vuoy:8L$6hf*WZ+c^JkT>tz"&>^ T<-*עoMbYjsKk|1/i)edrH"G0zN?lM5"ӑA(iꐤSkQ@^]A*Qc$,i7gb %I4l178 ikˈ+8h5J:I(X_7_G'VU= DIiHMz@_n 7߯* }": Я*󽊱cE@: / 1 $&PaFAaDl3..OF$RU\8|IT_*˛I|3>' b ňg<́j (b<,R{^/_Sٱac=+W&ͼŹ`a1fQ QOY1Ic< '\qi+K3dl-ϩb1`'q6A7eykQ0|[ߖ0pxM>҈4Nv].NG[Ћ~|{{|IENDB`noblenote-1.2.0/src/noblenote-icons/format-text-bold.png0000664000175000017500000000547013502165236022277 0ustar chrischrisPNG  IHDR00WsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<tEXtTitleOptical Drive>g IDAThZ{pTg?w_dIxC-,"HatFt:ӎRhJ˴VvQgtDc:m, yc}=nv#?̙~ζm_<n' /رc:Ǎ$V`pgvo8 ]kEOD M'(זeCZU@I N@QUG]U#LJ6<3y͚'k'=tWa,&"`, @| T2U@UUQQHň9QApt< ]W޸jA\UV{kdTR$pLq A?ia`hN'4e=Yhoo] xxr{ժA3( Q᪒4:;ҩtJ3 ]Bb~$q`K>9$`tqF4 @ ӧM` -I=;KA&u'8 g{QJ)]])s'>)'^i78{` ʕk@IhhKzB2r=%#+*C%eùF0{f%tv4tX{pMX3uZZ]/27=q?єF:zpMx>?`~PD~dp4WBWu$֞=/q¶_jR1~gxo<{f4_##+D2( T'_+u(0FRfPKrS#jO+Ȉش?}Iڽp7(}Cgg1F,**x2玈fB2ޕ fyҳel3,c̨B^fYvo\gC%Fs¯{.ScO !<[(>Qvr,S,*U۶mO~rr5(*ŊHD0Fܤam% k<'ഷpFIwmiTTUUhlqIiYP( mmpcafgvn`]n.*T+ x"]FJzyE%9s>pS,퀳%dV݂#FGKqx%KeʸzhrHAZCI2j[SNc$5IhDVXQdZIl7f$UF @I$R %CNkkks˾bӞB^" 7xg^:lqArΑ ޻&IDwW}e4 8a{`BЗ'N,x gE1ú4t܆7^"g]R,Ā)9~p|$ݬc8AII4}z)eڣ7!@}7M|`pވOS걡cyd@18yfYBZ2xH&’ĉɡ&% ʕRZ躨`a@%d(Rg ̙3 Cʓ)~:% #ZR(d> C8/ZFA6ٶ E D̴Xu㗾DhDʐ$,?{cU8M( $~Hkg˟b))N,sP&*eeK;o/ VJKK!gٗ._ZZZ2~„ Α?x_p󷶵BNyM^Wƚ{{j__HJdWYcQJձxrW:e.[JQJǏ~Q斖~?2Ή0L<?)b۞~ t#-GB O#28f/=C%IdEm+sRg%uwO/47Je|h#/B0nսR"A}cSsfa'%Zv pM0ZMK]*ϨU-9:/X ,&U_Wo]S:,ud2|FV~ߑӱh'y8s$,/H޵(S1wb&N( a?̼BP;Χ[93v|swhYƵbsM˸C.+%I梨KK)I`ZàAÑ;5˛蘕ekuL=#^fpww?02ѯNKKJ"7&pן/9 _IENDB`noblenote-1.2.0/src/noblenote-icons/preferences.png0000664000175000017500000000771213502165236021411 0ustar chrischrisPNG  IHDR00WsBIT|d pHYs11(RtEXtSoftwarewww.inkscape.org<GIDATxY X~MDF!%3[)D `dekh131c_l4D02oJII?~:3!~繟cD~>@QZ@{SSӾ۶m[{{d򃔜\]=<<,rˢl|;cc?}-Y$Gُ(7/rss('7G*$<ʲھ}EO4JK,Y2ߗ'N4QH9981ғ'E***T^^T=Gq JJK)&|{ k׮4:qO6? NBUwºN߲eJoheҾ}p]ǻaٶ!!"zx񂪪F7W͘1㡎o d]zL0>'/bH(-Xw9UV'$c `| xAĽ; }Pzjii٥7q%BI))Ұxҵ !J 32Qqz |7G%K-3UO'L!t?y®:]8ɏ$4-= ~_ ϩ.\]S-ФInknt(!niӵ);'jjj(&&r7-'!nV3g:FtgҲRB.} ovG7{%oFራy ,|[bnhٲeQte)pل+SaQ!/ꋖ W[YY pZd&vH PZXNΐ$%QHTxKJJ?6-~?Jed{G<(ׁfGǕ?~5@ub|}OϏ.ܫ{'`q NjQqǎN" 7]]]!JPGx͡|zݿA8Ћ=/ZVȼxx"ܹnڴi|krsFfglOAȎήŝMi#ZBGlj$A(V Hi^ގRRb;~ qwv p٠ ڶmPi%6c { [.>,+2eʔ9g(++;:W 󔚞L[ܷд;)I?WCS}׮]F|כȟ2204 F>rd.؜ZErIlbbp͘6b8 yş?FӃN:E.̓U(cwq 64 DB-ŗ.tQED(vС;jK)jnnF'n29H+WQЯA's;[tʕ }³Ln/$"%`7zITe{l?"PzuX(tAa4R_V;9Qooڃu[Fk֬Ƶ|!E-Vb(#{+7 o򚜒wȡ)S >|.JLJB.;v,W8@{M6ѱ믿Bs 7!VjJĊ⎘ͭFɑta=kN:v>֭[ 5L'M#Gp=_iŊEp=l0X @EʉJBBpv?$IJD #h uUCQ% 0DT5Q^͉XcvH$^ t vߒ LٳR[n%fvF'(ϟ'@FMHZ|W46nXɛ1@Kamm=߿"88.\H?myPw}~ B|[wa|ǹsEDD `?4lgdﰌ ;wݹ)E^ig/@KhѢׯ_'3Idd< =wZԴtD *ӝrzCO4qіG[x ȦTrD(ʌOȑ# o|Q]_+5fiS#uz`E5$#%lW޲R߉*9!!@-h8#􉮰󡡡33 C䥕I9@aն̜ېx,_0RK%sK32;t $( P^ g{wlFW\c$I0*˨'cŻl| ( 75^m'͛{fd3P< ?FGfgoog9F ƨ!1*m&͏d1^TUYו7y577 ( @0~!Jmݻ7jwLKQ؊倮І]5K0=ݏFyMŖuC ]ՅZK5iա᡼( _O"dhd@::ڤ]HTvbiII`ssbw5esw$\߅TdB9g^.9?z6`nց1w}sd YN ChRWF666<@GC l-S G")++ҝ5]d1_쨮 #œQڬH=z>|p *M:}4Jac10ԧZb0G4nܸX7e!cҡ,NLYr qI<TLe]qayF}?>7'O=~=JTnh}ПTޠƣᖢ8%bV*XMyy.8$J̨. UKT\(ɇQ++k"!xCCC] cBNjA4sBB<WnX+V, 9}"w8 }{5UǫPE |-4/>aa0PAmGڽl4\ycԩ#~ƍ+Zjz[ | $ #@ijHx%}.njT: (7V>}B:<ִuɓ'_YfM>4cJh  DIIg-چ15܍5_ :i$'Al!F2P[YݖYDX j}>O3`=6}tk3'w̙:+OT[i@`)] D|;Oo(R1Vs':(4u26%OTxwYP7HOm?-}PKHxpcL`vI;a;\R,d Р)Z!CvJTm0֗m[Vf&вH D 7ĉǔm''HTDW`T5c$~/obvچ]m2rrrKDIp}@Ǘ=@m( ti-(ʲl,чIENDB`noblenote-1.2.0/src/note.cpp0000664000175000017500000002056313502176303014751 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "note.h" #include "textformattingtoolbar.h" #include "textbrowser.h" #include "textsearchtoolbar.h" #include "highlighter.h" #include "textdocument.h" #include "notedescriptor.h" #include #include #include #include #include #include #include #include //#include "flickcharm.h" Note::Note(QString filePath, QWidget *parent) : QMainWindow(parent){ setupUi(this); setAttribute(Qt::WA_DeleteOnClose); showAfterLoading_ = false; // do not show() after loading settings textBrowser = new TextBrowser(this); textDocument = new TextDocument(this); textBrowser->setDocument(textDocument); textBrowser->ensureCursorVisible(); textBrowser->setTabStopWidth( fontMetrics().width(" ") * 4); // set tab size to 4 for android compatibility showHideToolbars = new QAction(this); showHideToolbars->setShortcut(Qt::CTRL + Qt::Key_T); showHideToolbars->setPriority(QAction::LowPriority); connect(showHideToolbars, SIGNAL(triggered()), this, SLOT(showOrHideToolbars())); textBrowser->setContextMenuPolicy(Qt::CustomContextMenu); connect(textBrowser,SIGNAL(customContextMenuRequested(const QPoint&)), this,SLOT(showContextMenu(const QPoint &))); toolbar = new TextFormattingToolbar(textBrowser,this); toolbar->setFocusPolicy(Qt::TabFocus); addToolBar(toolbar); addToolBarBreak(Qt::TopToolBarArea); QFont font; font.setFamily(QSettings().value("note_editor_font", "DejaVu Sans").toString()); font.setPointSize(QSettings().value("note_editor_font_size", 10).toInt()); textDocument->setDefaultFont(font); toolbar->setFont(font); noteDescriptor_ = new NoteDescriptor(filePath,textBrowser, textDocument,this); // must be constructed after TextDocument textBrowser->setReadOnly(noteDescriptor_->readOnly()); textBrowser->setTextInteractionFlags(textBrowser->textInteractionFlags()| Qt::LinksAccessibleByMouse); gridLayout->addWidget(textBrowser, 0, 0, 1, 1); textBrowser->setFocus(); searchBar = new TextSearchToolbar(textBrowser,this); searchBar->setFocusPolicy(Qt::TabFocus); addToolBar(searchBar); restoreState(QSettings().value("Note_window_and_toolbar/state").toByteArray()); if(QSettings().value("Notes/"+noteDescriptor_->uuid().toString()+"_window_position").isValid()) restoreGeometry(QSettings().value("Notes/"+noteDescriptor_->uuid().toString()+"_window_position").toByteArray()); else // center in desktop if there's no saved position move(QApplication::desktop()->screen()->rect().center() - rect().center()); connect(noteDescriptor_,SIGNAL(close()),this,SLOT(close())); connect(textBrowser,SIGNAL(signalFocusInEvent()),this->noteDescriptor_,SLOT(stateChange())); connect(noteDescriptor_,SIGNAL(loadFinished(HtmlNoteReader*)),this,SLOT(loadSizeAndShow()),Qt::QueuedConnection); } void Note::highlightText(const QString &str) { searchBar->highlightText(str); } void Note::loadSizeAndShow() { QSize defaultSize(QSettings().value("note_editor_default_size",QSize(335,250)).toSize()); QSize size = QSettings().value("Notes/"+noteDescriptor_->uuid().toString()+"_size", defaultSize).toSize(); resize(size); if(showAfterLoading_) { show(); } } void Note::closeEvent(QCloseEvent* close_Note) { QVariantList variantList; noteDescriptor_->stateChange(); // collect all stuff that requires the gui thread and pointers that are soon not longer valid variantList << size() << saveState() << saveGeometry() << textBrowser->textCursor().position() << noteDescriptor()->uuid().toString() << noteDescriptor()->filePath(); // run it asynchronously to avoid blocking the gui thread, when he destroys the window future_ = QtConcurrent::run(this, &Note::saveWindowState,variantList); QMainWindow::closeEvent(close_Note); } /*static */ void Note::addToOpenNoteList(QString path) { QStringList savedOpenNoteList; if(QSettings().value("open_notes").isValid()) savedOpenNoteList = QSettings().value("open_notes").toStringList(); savedOpenNoteList.append(path); QSettings().setValue("open_notes",savedOpenNoteList); } void Note::saveWindowState(QVariantList variantList) { // see closeEvent() for the order of items in this variant list QUuid uuid = QUuid(variantList[4].toString()); // qt 4.8 does not support QUUId in QVariant QSettings().setValue("Notes/"+uuid.toString()+"_size", variantList[0].toSize()); QSettings().setValue("Note_window_and_toolbar/state", variantList[1].toByteArray()); QSettings().setValue("Notes/"+uuid.toString()+"_window_position", variantList[2].toByteArray()); QSettings().setValue("Notes/"+uuid.toString()+"_cursor_position",variantList[3].toInt()/*textCursorPosition*/); QStringList savedOpenNoteList = QSettings().value("open_notes").toStringList(); savedOpenNoteList.removeOne(variantList[5].toString()); QSettings().setValue("open_notes", savedOpenNoteList); } void Note::keyPressEvent(QKeyEvent *k){ if(k->modifiers() == Qt::ControlModifier){ textBrowser->setTextInteractionFlags(Qt::LinksAccessibleByMouse | Qt::LinksAccessibleByKeyboard); textBrowser->setReadOnly(noteDescriptor_->readOnly()); } if((k->modifiers() == Qt::ControlModifier) && (k->key() == Qt::Key_F)){ if(textBrowser->textCursor().hasSelection()){ searchBar->setText(textBrowser->textCursor().selectedText()); } if(!searchBar->isVisible()) searchBar->setVisible(true); searchBar->searchLine()->setFocus(); } if((k->modifiers() == Qt::ControlModifier) && (k->key() == Qt::Key_T)) showOrHideToolbars(); QMainWindow::keyPressEvent(k); } void Note::keyReleaseEvent(QKeyEvent *k){ textBrowser->setReadOnly(noteDescriptor_->readOnly()); textBrowser->setTextInteractionFlags(textBrowser->textInteractionFlags()| Qt::LinksAccessibleByMouse); QMainWindow::keyReleaseEvent(k); } void Note::setSearchBarText(QString str) { searchBar->setText(str); searchBar->selectNextExpression(); searchBar->setVisible(true); } void Note::showContextMenu(const QPoint &pt) { if(searchBar->isVisible() || toolbar->isVisible()) showHideToolbars->setText(tr("Hide Toolbars")); else showHideToolbars->setText(tr("Show Toolbars")); QMenu *menu = textBrowser->createStandardContextMenu(); menu->addAction(showHideToolbars); menu->exec(textBrowser->mapToGlobal(pt)); } void Note::showOrHideToolbars() { if(searchBar->isVisible() || toolbar->isVisible()) { if(searchBar->isVisible()) searchBar->setVisible(false); if(toolbar->isVisible()) toolbar->setVisible(false); } else { searchBar->setVisible(true); toolbar->setVisible(true); } } void Note::showAfterLoaded() { showAfterLoading_ = true; } noblenote-1.2.0/src/notedescriptor.h0000664000175000017500000000737413502176303016522 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef NOTEDESCRIPTOR_H #define NOTEDESCRIPTOR_H #include "xmlnotereader.h" #include "xmlnotewriter.h" #include "textdocument.h" #include "htmlnotereader.h" #include #include #include /** * @brief The NoteDescriptor class provides an abstraction layer to the underlying note * file on the filesystem * and also manages automatic saving and reloading of note files * */ class NoteDescriptor : public QObject { Q_OBJECT public: explicit NoteDescriptor(QString filePath, QTextBrowser * textBrowser, TextDocument *document, QWidget *noteWidget = 0); const QString& filePath() const { return filePath_; } // return the current filePath bool readOnly() const { return readOnly_; } QUuid uuid() const { return uuid_;} signals: void loadFinished(HtmlNoteReader * reader); // emitted when the async note loading via HtmlNoteReader finishes void close(); // emitted if the user wants to close the note via a message box public slots: void stateChange(); // show html source code, for debugging purposes //void showSource(); private slots: void unlockStateChange(); void onHtmlLoadFinished(HtmlNoteReader * reader); void load(); // load a note file into the document, calls onLoadFinished synchonously or asynchronously private: void save(const QString &filePath, QUuid uuid, bool overwriteExisting); // calls write with note and backup void write(const QString &filePath, QUuid uuid); // write note file to disc void loadHtml(AbstractNoteReader *reader); // used with QtConcurrent::run to load async void onLoadFinished(AbstractNoteReader * reader, bool isXmlNote = false); // called when the async note loading via HtmlNoteReader finishes void findOrReCreate(); // search a note by its uuid and ask the user to create a new one if it cannot be found QUuid uuid_; QWidget * noteWidget_; QString filePath_; TextDocument * document_; QTextBrowser * textBrowser_; QDateTime lastChange_; QString title_; QDateTime createDate_; bool readOnly_; // thread locking mechanism for stateChange(), because if a MessageBox opens inside stateChange() // stateChange() can still be called from events from the GUI-Thread struct Lock { Lock(){count++;} ~Lock(){count = count > 0 ? count-1 : count;} static bool isLocked(); static int count; }; Lock * initialLock; }; #endif // NOTEDESCRIPTOR_H noblenote-1.2.0/src/progressreceiver.h0000664000175000017500000000545613502176303017046 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef PROGRESSRECEIVER_H #define PROGRESSRECEIVER_H #include #include #include /** * @brief The ProgressReceiver class can be used to set the values of a progress bar * if a lenghty operation runs in a separate thread. You must call postProgressEvent() in the separate thread. * the separate thread does not need an event queue. */ class ProgressReceiver : public QObject { Q_OBJECT public: explicit ProgressReceiver(QObject *parent = 0); // the minimum intervall beweteen two events that are received by progress receiver void setInterval(int interval){ interval_ = interval; } int interval() const { return interval_; } // the current value of the internal progress counter void setValue(int value){ value_ = value; } int value() const { return value_; } // post a progress event to itself that will be posted on a event queue at least every interval ms // and will be processed by this object's event method which will increase the value() and send valueChanged // this method is not thread safe, but it is usually called in 1 other thread void postProgressEvent(); //override virtual bool event ( QEvent * e ); signals: void valueChanged(int value); public slots: private: struct ProgressEvent : public QEvent { ProgressEvent( Type type) : QEvent(type), value(0) { } int value; }; int interval_; int value_; QTime time_; }; #endif // PROGRESSRECEIVER_H noblenote-1.2.0/src/htmlnotewriter.cpp0000664000175000017500000001233413502176303017070 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "htmlnotewriter.h" #include "datetime.h" #include "xmlnotereader.h" #include #include #include #include #include HtmlNoteWriter::HtmlNoteWriter(const QString &filePath) { document_ = 0; filePath_ = filePath; } void HtmlNoteWriter::write() { if(!document_) { qDebug("HtmlNoteWriter::write failed : no QTextDocument set"); return; } document_->setMetaInformation(QTextDocument::DocumentTitle,title_); QString html = document_->toHtml(); // remove { } braces QString uuidStr = uuid_.toString().remove(0,1); uuidStr.chop(1); // insert meta elements insertMetaElement(&html,"create-date",DateTime::toISO8601(lastChange_.isNull()? QDateTime::currentDateTime():lastChange_)); insertMetaElement(&html,"last-change-date",DateTime::toISO8601(lastChange_.isNull()? QDateTime::currentDateTime():lastChange_)); insertMetaElement(&html,"uuid",uuidStr); // set html5 utf-8 tag QString metaLine(""); int headIdx = html.indexOf(""); html.insert(headIdx + qstrlen(""),metaLine); QFile file(filePath_); if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { //qDebug(qPrintable(QString("HtmlNoteWriter::write failed : could not open ") + QDir::toNativeSeparators(filePath_))); return; } QTextStream out(&file); out.setCodec("UTF-8"); // set to UTF-8 for every platform, else ISO-8859-1 would be used on windows by default out << html; file.close(); } void HtmlNoteWriter::insertMetaElement(QString *html, const QString &name, const QString &content) { QString metaLine(""); int headIdx = html->indexOf(""); html->insert(headIdx + qstrlen(""),metaLine); } /*static*/ void HtmlNoteWriter::writeXml2Html(const QString &xmlFilePath, const QString &outputPath) { if(xmlFilePath.isEmpty() || outputPath.isEmpty()) return; QTextDocument document; XmlNoteReader reader(xmlFilePath,&document); QString folder; QString tag = reader.tag(); QRegExp illegal("[" +QRegExp::escape("\\^/?<>:*|\"")+ "]|^(com\\d|lpt\\d|con|nul|prn)$"); if(!tag.isEmpty()) { // takes 2nd colon, remove before //int colonIdx = tag.indexOf(":",tag.indexOf(":")+1); // 2nd index of :, e.g. "system:notebook:tagname" //folder = tag.right(tag.length()-colonIdx); tag.remove("system:notebook:"); tag.remove("system:template"); tag.remove(illegal);//remove illegal chars in filenames if(tag[0] == '.') // would be invisible if allowed tag.remove(0,1); folder = tag; } if(folder.isEmpty()) folder = tr("default"); QString title = reader.title(); title.remove(illegal); if(title.isEmpty()) title = tr("untitled note"); QString filePath; QDir().mkpath(outputPath + QDir::separator() + folder); filePath = outputPath + QDir::separator() + folder + QDir::separator() + title; // TODO move this in extra static method int counter = 0; QString origPath = filePath; while(QFile::exists(filePath)) { ++counter; filePath = origPath + QString(" (%1)").arg(counter); } HtmlNoteWriter writer(filePath); writer.setDocument(&document); writer.setTitle(title); writer.setLastChange(reader.lastChange()); writer.setLastMetadataChange(reader.lastMetadataChange()); writer.setCreateDate(reader.createDate()); writer.setUuid(reader.uuid()); writer.write(); if(!QDir(QSettings().value("backup_dir_path").toString()).exists()) QDir().mkpath(QSettings().value("backup_dir_path").toString()); QString uuid = reader.uuid().toString(); uuid.chop(1); // } uuid = uuid.remove(0,1); // { QFile::copy(filePath, QSettings().value("backup_dir_path").toString() + QDir::separator() + uuid); } noblenote-1.2.0/src/mainwindow.cpp0000664000175000017500000012044413503416516016163 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "mainwindow.h" #include "welcome.h" #include "note.h" #include "findfilemodel.h" #include "filesystemmodel.h" #include "preferences.h" #include "lineedit.h" #include "findfilesystemmodel.h" #include "highlighter.h" #include "notedescriptor.h" #include "htmlnotereader.h" #include "fileiconprovider.h" #include "textsearchtoolbar.h" #include "backup.h" #include "noteimporter.h" #include #include #include #include #include #include #include #include #include #if QT_VERSION >= 0x050000 #include #include #include #else #include #include #endif MainWindow::MainWindow() { setupUi(this); fileWatcher = new QFileSystemWatcher(this); createAndUpdateRecent(); //TrayIcon QIcon icon = QIcon(":nobleNote"); minimizeRestoreAction = new QAction(tr("&Restore"),this); quit_action = new QAction(tr("&Quit"),this); #ifndef NO_SYSTEM_TRAY_ICON TIcon = new QSystemTrayIcon(this); TIcon->setIcon(icon); TIcon->show(); //TrayIconContextMenu iMenu = new QMenu(this); iMenu->addAction(minimizeRestoreAction); iMenu->addAction(quit_action); TIcon->setContextMenu(iMenu); //setting contextmenu for the systray #endif //Toolbar toolBar->setToolButtonStyle(Qt::ToolButtonIconOnly); toolBar->addAction(actionNew_folder); toolBar->addAction(actionRename_folder); toolBar->addAction(actionDelete_folder); toolBar->addSeparator(); toolBar->addAction(actionNew_note); toolBar->addAction(actionRename_note); toolBar->addAction(actionDelete_note); toolBar->addSeparator(); toolBar->addAction(actionHistory); toolBar->addAction(actionTrash); toolBar->addAction(actionConfigure); actionShowToolbar->setChecked(QSettings().value("mainwindow_toolbar_visible", true).toBool()); toolBar->setVisible(QSettings().value("mainwindow_toolbar_visible", true).toBool()); writeBackupDirPath(); //Search line edits // searchName = new LineEdit(this); // searchName->setPlaceholderText(tr("Search for note")); // gridLayout->addWidget(searchName, 1, 0); searchText = new LineEdit(this); searchText->setPlaceholderText(tr("Type to search for notes")); gridLayout->addWidget(searchText, 2, 0); splitter = new QSplitter(centralwidget); gridLayout->addWidget(splitter, 3, 0); //IconProvider folderIconProvider = new FileIconProvider(); noteIconProvider = new FileIconProvider(); folderModel = new FindFileSystemModel(this); folderModel->setSortCaseSensitivity(Qt::CaseInsensitive); FileSystemModel *folderFSModel = new FileSystemModel(this); folderFSModel->setFilter(QDir::Dirs | QDir::NoDotAndDotDot); folderFSModel->setReadOnly(false); folderFSModel->setIconProvider(folderIconProvider); folderModel->setSourceModel(folderFSModel); noteFSModel = new FileSystemModel(this); noteFSModel->setFilter(QDir::Files); noteFSModel->setReadOnly(false); noteFSModel->setIconProvider(noteIconProvider); findNoteModel = new FindFileModel(this); noteModel = new FindFileSystemModel(this); noteModel->setSortCaseSensitivity(Qt::CaseInsensitive); noteModel->setSourceModel(noteFSModel); folderView = new QListView(splitter); noteView = new QListView(splitter); // FlickCharm needs this mode folderView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); noteView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); const QList listViews = QList() << folderView << noteView; for(QListView* list : listViews) // add drag drop options { if(QSettings().value("kinetic_scrolling", false).toBool()) { QScroller::grabGesture(list->viewport(), QScroller::LeftMouseButtonGesture); } list->setContextMenuPolicy(Qt::CustomContextMenu); //list->setSelectionMode(QAbstractItemView::SingleSelection); // single item can be draged or droped list->setDragDropMode(QAbstractItemView::DragDrop); list->viewport()->setAcceptDrops(true); list->setDropIndicatorShown(true); list->setDefaultDropAction(Qt::CopyAction); list->setSelectionBehavior(QAbstractItemView::SelectRows); } noteView->setDragEnabled(true); folderView->setDragEnabled(false); folderView->setModel(folderModel); folderView->setEditTriggers(QListView::EditKeyPressed); noteView->setEditTriggers(QListView::EditKeyPressed); noteView->setModel(noteModel); noteView->setSelectionMode(QAbstractItemView::ExtendedSelection); noteImporter = new NoteImporter(this); makeStandardPaths(); // mkpath the standard paths if they do not exist already actionRename_note->setIconVisibleInMenu(false); connect(folderView,SIGNAL(activated(QModelIndex)),this,SLOT(folderActivated(QModelIndex))); connect(folderView,SIGNAL(clicked(QModelIndex)),this,SLOT(folderActivated(QModelIndex))); connect(folderView->selectionModel(),SIGNAL(selectionChanged(QItemSelection, QItemSelection)),this,SLOT(folderActivated(QItemSelection,QItemSelection))); //Wrapper connect(folderView->itemDelegate(),SIGNAL(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint)), this,SLOT(folderRenameFinished(QWidget*,QAbstractItemDelegate::EndEditHint))); connect(folderView, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(showContextMenuFolder(const QPoint &))); //connect(searchName, SIGNAL(textChanged(const QString)), this, SLOT(find())); connect(searchText, SIGNAL(textChanged(const QString)), this, SLOT(find())); connect(noteFSModel,SIGNAL(fileRenamed(QString,QString,QString)),this,SLOT(noteRenameFinished(QString,QString,QString))); connect(fileWatcher, SIGNAL(fileChanged(const QString)), this, SLOT(createAndUpdateRecent())); // connect(folderList, SIGNAL(clicked(const QModelIndex &)), this, // SLOT(setCurrentFolder(const QModelIndex &))); // connect(folderList,SIGNAL(activated(QModelIndex)), this, // SLOT(setCurrentFolder(QModelIndex))); connect(noteView,SIGNAL(activated(QModelIndex)), this, SLOT(openNote(QModelIndex))); connect(noteView, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(showContextMenuNote(const QPoint &))); connect(noteView->selectionModel(),SIGNAL(selectionChanged(QItemSelection, QItemSelection)),this,SLOT(noteActivated(QItemSelection,QItemSelection))); //Wrapper connect(noteView,SIGNAL(activated(QModelIndex)),this,SLOT(noteActivated(QModelIndex))); connect(noteView,SIGNAL(clicked(QModelIndex)),this,SLOT(noteActivated(QModelIndex))); connect(noteView->selectionModel(),SIGNAL(selectionChanged(QItemSelection, QItemSelection)), this, SLOT(enableNoteMenu(QItemSelection,QItemSelection))); #ifndef NO_SYSTEM_TRAY_ICON connect(TIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason))); //handles systray-symbol connect(minimizeRestoreAction, SIGNAL(triggered()), this, SLOT(tray_actions())); #endif connect(actionImport,SIGNAL(triggered()),noteImporter,SLOT(importDialog())); connect(actionQuit, SIGNAL(triggered()), this, SLOT(quit())); connect(actionTrash, SIGNAL(triggered()), this, SLOT(showBackupWindow())); connect(quit_action, SIGNAL(triggered()), this, SLOT(quit())); //contextmenu "Quit" for the systray connect(actionNew_folder, SIGNAL(triggered()), this, SLOT(newFolder())); connect(actionRename_folder, SIGNAL(triggered()), this, SLOT(renameFolder())); connect(actionDelete_folder, SIGNAL(triggered()), this, SLOT(removeFolder())); connect(actionNew_note, SIGNAL(triggered()), this, SLOT(newNote())); connect(actionRename_note, SIGNAL(triggered()), this, SLOT(renameNote())); connect(actionDelete_note, SIGNAL(triggered()), this, SLOT(removeNote())); connect(action_Cut, SIGNAL(triggered()), this, SLOT(getCutFiles())); connect(action_Paste, SIGNAL(triggered()), this, SLOT(pasteFiles())); connect(actionShowToolbar, SIGNAL(toggled(bool)), toolBar, SLOT(setVisible(bool))); connect(toolBar, SIGNAL(visibilityChanged(bool)), actionShowToolbar, SLOT(setChecked(bool))); //connect(actionHistory, SIGNAL(triggered()), this, SLOT(showHistory())); connect(actionConfigure, SIGNAL(triggered()), this, SLOT(showPreferences())); connect(actionAbout, SIGNAL(triggered()), this, SLOT(about())); connect(searchText, SIGNAL(sendCleared()), this, SLOT(selectFolder())); connect(folderFSModel, SIGNAL(droppedAFile()), this, SLOT(createAndUpdateRecent())); //moving a note with //drag and drop removes it from the recent files } MainWindow::~MainWindow() { delete folderIconProvider; delete noteIconProvider; } void MainWindow::selectFolder() { if(folderView->selectionModel()->selectedIndexes().isEmpty()) return; folderActivated(folderView->selectionModel()->selectedIndexes().first()); } void MainWindow::writeBackupDirPath() //generates a backup path according to OS and portability { QString backupPath; QString suffix = ""; if(!QSettings().value("isPortable",false).toBool()) //if not portable { suffix = QSettings().value("root_path").toString(); #ifdef Q_OS_WIN32 suffix.prepend(QDir::separator()); //we want to seperate "backup" from the rest of the path (see below) suffix.remove(":"); //removing illegal character from path #endif suffix.replace(QDir::separator(), "_"); #if QT_VERSION < 0x050000 && !defined(Q_OS_WIN32) backupPath = QDir::home().absolutePath() + "/.local/share/" + qApp->applicationName(); #elif QT_VERSION < 0x050000 backupPath = QDesktopServices::storageLocation(QDesktopServices::DataLocation); #elif QT_VERSION >= 0x050000 backupPath = QStandardPaths::standardLocations(QStandardPaths::DataLocation).first(); #endif // reduce extraordinary long path, replaces .../nobleNote/nobleNote/... with .../nobleNote/... QString doubleNobleNote = (QDir::separator() + qApp->organizationName() + QDir::separator() + qApp->applicationName()); QString singleNobleNote = QDir::separator() +qApp->applicationName(); // use unified separators, because QDir::separator() is platform native (\ on Windows) // but QStandardPaths uses / on Windows and Linux backupPath = QDir().toNativeSeparators(backupPath); doubleNobleNote = QDir().toNativeSeparators(doubleNobleNote); singleNobleNote = QDir().toNativeSeparators(singleNobleNote); if(backupPath.contains(doubleNobleNote)) backupPath.replace(doubleNobleNote,singleNobleNote); } else //if portable backupPath = qApp->applicationDirPath(); QSettings().setValue("backup_dir_path", backupPath + QDir::separator() + "backups" + suffix); //note that suffix will be "" if portable } void MainWindow::changeRootIndex(){ if(!openNotes.isEmpty()){ for(QWidget *note : openNotes) if(note) { note->close(); } openNotes.clear(); } writeBackupDirPath(); makeStandardPaths(); } void MainWindow::makeStandardPaths(){ if(!QDir(QSettings().value("root_path").toString()).exists()) QDir().mkpath(QSettings().value("root_path").toString()); if(!QDir(QSettings().value("backup_dir_path").toString()).exists()) QDir().mkpath(QSettings().value("backup_dir_path").toString()); folderView->setRootIndex(folderModel->setRootPath(QSettings().value("root_path").toString())); // make sure there's at least one folder QStringList dirList = QDir(QSettings().value("root_path").toString()).entryList(QDir::Dirs | QDir::NoDotAndDotDot); if(dirList.isEmpty()) { QString defaultDirName = tr("default"); QDir(QSettings().value("root_path").toString()).mkdir(defaultDirName); noteView->setRootIndex(noteModel->setRootPath(QSettings().value("root_path").toString() + QDir::separator() + defaultDirName)); // set default dir as current note folder } else noteView->setRootIndex(noteModel->setRootPath(QSettings().value("root_path").toString() + QDir::separator() + dirList.first())); // dirs exist, set first dir as current note folder //Select the first folder if(!dirList.isEmpty()) { folderView->selectionModel()->select(folderModel->index(QSettings().value( "root_path").toString() + QDir::separator() + dirList.first()),QItemSelectionModel::Select); } } void MainWindow::enableNoteMenu(const QItemSelection &selected, const QItemSelection &deselected) { Q_UNUSED(deselected); actionRename_note->setDisabled(selected.isEmpty()); actionDelete_note->setDisabled(selected.isEmpty()); } void MainWindow::showPreferences() { if(!pref) { pref = new Preferences(this); connect(pref, SIGNAL(pathChanged()), this, SLOT(changeRootIndex())); connect(pref,SIGNAL(kineticScrollingEnabledChanged(bool)),this,SLOT(setKineticScrollingEnabled(bool))); connect(pref, SIGNAL(recentCountChanged()), this, SLOT(createAndUpdateRecent())); } pref->show(); } void MainWindow::showBackupWindow() { if(!backup) backup = new Backup(this); } void MainWindow::find() { // disable note toolbar buttons because the current notes are not longer visible with the findNoteModel noteView->viewport()->setAcceptDrops(false); noteModel->setSourceModel(findNoteModel); noteModel->clear(); // if findNoteModel already set, clear old found list //noteModel->findInFiles(searchName->text(),searchText->text(),folderModel->rootPath()); noteModel->findInFiles(searchText->text(),searchText->text(),folderModel->rootPath()); actionNew_note->setDisabled(true); } void MainWindow::folderRenameFinished(QWidget *editor, QAbstractItemDelegate::EndEditHint hint) { QString newNotebookName = folderView->selectionModel()->selectedRows().first().data(Qt::DisplayRole).toString(); QStringList recent = QSettings().value("Recent_notes").toStringList(); for(int i = 0; i < recent.size(); i++) { QString fileName = QFileInfo(recent[i]).fileName(); QString strippedPath = recent[i]; strippedPath.chop(fileName.size() + getToBerenamedNotebook.size() +1); if(!strippedPath.contains(strippedPath + getToBerenamedNotebook)) recent[i] = strippedPath + newNotebookName + QDir::separator() + fileName; } QSettings().setValue("Recent_notes", recent); if(folderView->selectionModel()->selectedRows().isEmpty()) return; Q_UNUSED(editor); if(hint != QAbstractItemDelegate::RevertModelCache) // canceled editing { QString currFolderPath = folderModel->filePath(folderView->selectionModel()->selectedRows().first()); folderModel->sort(0); folderView->setCurrentIndex(folderModel->index(currFolderPath)); // set current folder noteModel->setSourceModel(noteFSModel); noteView->setRootIndex(noteModel->setRootPath(currFolderPath)); } folderView->scrollTo(folderView->selectionModel()->selectedRows().first()); } void MainWindow::noteRenameFinished(const QString & path, const QString & oldName, const QString & newName) { QString filePath = noteModel->filePath(noteView->currentIndex()); Note * w = noteWindow(path + QDir::separator() + oldName); if(w) w->setWindowTitle(QFileInfo(path + QDir::separator() + newName).baseName()); noteView->model()->sort(0); noteView->setCurrentIndex(noteModel->index(filePath)); noteView->scrollTo(noteView->selectionModel()->selectedRows().first()); QStringList recent = QSettings().value("Recent_notes").toStringList(); for(int i = 0; i < recent.size(); i++) if(recent[i].contains(path + QDir::separator() + oldName)) recent.replace(i, path + QDir::separator() + newName); QSettings().setValue("Recent_notes", recent); } void MainWindow::folderActivated(const QModelIndex &selected) { // clear search line edits //searchName->clear(); searchText->clear(); actionNew_note->setEnabled(true); actionRename_note->setDisabled(true); actionDelete_note->setDisabled(true); noteModel->setSourceModel(noteFSModel); noteView->setRootIndex(noteModel->setRootPath(folderModel->filePath(selected))); noteView->viewport()->setAcceptDrops(true); } void MainWindow::folderActivated(const QItemSelection &selected, const QItemSelection &deselected) //Wrapper { Q_UNUSED(deselected); if(selected.indexes().isEmpty()) return; folderActivated(selected.indexes().first()); //we only need one - anyone is fine } void MainWindow::noteActivated(const QModelIndex &selected) { Q_UNUSED(selected); actionRename_note->setEnabled(true); actionDelete_note->setEnabled(true); } void MainWindow::noteActivated(const QItemSelection &selected, const QItemSelection &deselected) { Q_UNUSED(deselected); if(selected.indexes().isEmpty()) return; noteActivated(selected.indexes().first()); //we only need one - anyone is fine } #ifndef NO_SYSTEM_TRAY_ICON void MainWindow::iconActivated(QSystemTrayIcon::ActivationReason reason) { if(reason == QSystemTrayIcon::Trigger) tray_actions(); } #endif #ifndef NO_SYSTEM_TRAY_ICON void MainWindow::tray_actions() { if(isMinimized() || isHidden()) //in case that the window is minimized or hidden showNormal(); else hide(); } #endif /*#ifndef NO_SYSTEM_TRAY_ICON void MainWindow::updateMyTrayIcon() { trayMenu } #endif*/ void MainWindow::showEvent(QShowEvent* show_window) { minimizeRestoreAction->setText(tr("&Minimize")); if(QSettings().contains("mainwindow_size")) restoreGeometry(QSettings().value("mainwindow_size").toByteArray()); if(QSettings().contains("splitter")) splitter->restoreState(QSettings().value("splitter").toByteArray()); showOpenNotes(); QMainWindow::showEvent(show_window); } void MainWindow::showOpenNotes() //do not confuse with "recent" { if(QSettings().value("open_notes").isValid()) { const QStringList list = QSettings().value("open_notes").toStringList(); for(QString path : list) { // check if the notePath is already used in a open note if(!noteIsOpen(path) && QFile(path).exists()) { Note* note = new Note(path); openNotes += note; note->setObjectName(path); note->showAfterLoaded(); } } } } void MainWindow::hideEvent(QHideEvent* window_hide) { minimizeRestoreAction->setText(tr("&Restore")); QMainWindow::hideEvent(window_hide); } void MainWindow::closeEvent(QCloseEvent* window_close) { if(QSettings().value("dont_quit_on_close").toBool()) { hide(); } else{ QSettings().setValue("mainwindow_size", saveGeometry()); QSettings().setValue("splitter", splitter->saveState()); // find widgets that still are saving their settings and let their futuures (worker threads) finish QListIterator > it(openNotes); while(it.hasNext()) { QPointer ptr = it.next(); QWidget * widget = ptr.data(); Note * note = qobject_cast(widget); if(note != NULL) { // calls close event (this is normally not called, because Notes are no childs of this) // TODO check why Notes are no children of this note->close(); if(!note->future().isFinished()) note->future().waitForFinished(); // close() calls the closeEvent, this method assumes the user has closed the window // so we manually have to re-add this note to the list of open notes. Note::addToOpenNoteList(note->noteDescriptor()->filePath()); } } qApp->setQuitOnLastWindowClosed(true); } QMainWindow::closeEvent(window_close); } void MainWindow::quit() { QSettings().setValue("mainwindow_size", saveGeometry()); QSettings().setValue("mainwindow_toolbar_visible", actionShowToolbar->isChecked()); qApp->quit(); } bool MainWindow::noteIsOpen(const QString &path) { bool isOpen = false; QWidget* w = noteWindow(path); if(w) { isOpen = true; w->activateWindow(); // highlight the note window } return isOpen; } void MainWindow::openNote(const QModelIndex &index /* = new QModelIndex*/){ Q_UNUSED(index); openAllNotes(); } void MainWindow::openAllNotes(){ const QList indexes = noteView->selectionModel()->selectedRows(); for(QModelIndex ind : indexes) { if(!ind.isValid()) // default constructed model index ind = noteView->currentIndex(); QString notePath = noteModel->filePath(ind); if(!QFileInfo(notePath).exists()) { QMessageBox::warning(this,tr("Note does not exist"), tr("The selected note cannot be opened because it has been moved or renamed!")); return; } if(noteIsOpen(notePath)) return; openOneNote(notePath); } } void MainWindow::openOneNote(QString path) { Note* note = new Note(path); openNotes += note; note->setObjectName(path); Note::addToOpenNoteList(path); if(QSettings().value("kinetic_scrolling", false).toBool()) { QScroller::grabGesture(note->textEdit()->viewport(), QScroller::LeftMouseButtonGesture); } // only show the searchBar if the note contains the search text if(noteModel->sourceModel() == findNoteModel) note->setSearchBarText(searchText->text()); note->showAfterLoaded(); QStringList recentNoteList = QSettings().value("Recent_notes").toStringList(); recentNoteList.removeAll(path); //remove if already present recentNoteList.prepend(path); //prepend to be at the first place while(recentNoteList.size() > QSettings().value("Number_of_recent_Notes",5).toInt()) recentNoteList.removeLast(); //make sure to keep the size set in the preferences QSettings().setValue("Recent_notes", recentNoteList); createAndUpdateRecent(); //also calls createRecent } void MainWindow::createAndUpdateRecent() { menu_Open_recent->clear(); QStringList recentFilePaths = QSettings().value("Recent_notes").toStringList(); //remove all nonexisting note paths for(int i = 0; i < recentFilePaths.size(); i++) if(!QFile(recentFilePaths[i]).exists()) recentFilePaths.removeAll(recentFilePaths[i]); //remove all note paths to match the size in the preferences while(recentFilePaths.size() > QSettings().value("Number_of_recent_Notes",5).toInt()) recentFilePaths.removeLast(); fileWatcher->addPaths(recentFilePaths); QSettings().setValue("Recent_notes", recentFilePaths); //save for later menu_Open_recent->setDisabled(QSettings().value("Recent_notes").toStringList().isEmpty()); //disable if zero QAction *recentAction = 0; for(int i = 0; i < recentFilePaths.size(); i++) { recentAction = new QAction(menu_Open_recent); QString fileName = QFileInfo(recentFilePaths[i]).fileName(); //get file name recentAction->setText(fileName); //displayed name recentAction->setData(recentFilePaths[i]); //add the path as data connect(recentAction, SIGNAL(triggered()), this, SLOT(openRecent())); menu_Open_recent->addAction(recentAction); } } void MainWindow::openRecent() { QAction *action = qobject_cast(sender()); //get QAction that was the sender of the signal if(action){ //if not NULL if(noteIsOpen(action->data().toString())) return; else openOneNote(action->data().toString()); //open note with the path in data of QAction } } void MainWindow::openNoteSource() { QModelIndex ind = noteView->currentIndex(); QFile file(noteModel->filePath(ind)); if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) return; QMainWindow * mainWindow = new QMainWindow(); mainWindow->setAttribute(Qt::WA_DeleteOnClose); QTextEdit * textEdit = new QTextEdit(mainWindow); textEdit->setReadOnly(true); textEdit->setPlainText(QTextStream(&file).readAll()); if(QSettings().value("kinetic_scrolling", false).toBool()) { QScroller::grabGesture(textEdit->viewport(), QScroller::LeftMouseButtonGesture); } mainWindow->setCentralWidget(textEdit); TextSearchToolbar * searchBar = new TextSearchToolbar(textEdit,mainWindow); mainWindow->addToolBar(searchBar); mainWindow->resize(QSettings().value("note_editor_default_size",QSize(335,250)).toSize()); // searchBar->searchLine()->setFocus(); // searchBar->setFocusPolicy(Qt::TabFocus); openNotes += mainWindow; mainWindow->show(); } Note *MainWindow::noteWindow(const QString &filePath) { QUuid uuid = HtmlNoteReader::uuid(filePath); for(QList >::Iterator it = openNotes.begin(); it < openNotes.end(); ++it) { // remove NULL pointers, if the Note widget is destroyed, its pointer is automatically set to null if(!(*it)) { it = openNotes.erase(it); // set iterator to the item after the erased item if(it >= openNotes.end()) // iterator may be pointing to an element greater than the last element return 0; } Note * note = qobject_cast(*it); if(note && note->noteDescriptor()->uuid() == uuid) { return note; } } return 0; } void MainWindow::newFolder(){ QString path = folderModel->rootPath() + QDir::separator() + tr("new notebook"); int counter = 0; while(QDir(path).exists()) { ++counter; path = folderModel->rootPath() + QDir::separator() + tr("new notebook (%1)").arg(QString::number(counter)); } QModelIndex idx = folderModel->mkdir(folderView->rootIndex(),QDir(path).dirName()); if(idx.isValid()) { folderView->setCurrentIndex(idx); folderView->edit(idx); // 'open' for rename } folderModel->sort(0); folderView->scrollTo(folderView->selectionModel()->selectedRows().first()); } void MainWindow::newNote(){ QString filePath = noteModel->rootPath() + QDir::separator() + tr("new note"); int counter = 0; while(QFile::exists(filePath)) { ++counter; filePath = noteModel->rootPath() + QDir::separator() + tr("new note (%1)").arg(QString::number(counter)); } QFile file(filePath); if(!file.open(QIODevice::WriteOnly)) return; file.close(); QModelIndex idx = noteModel->index(filePath); if(idx.isValid()) { noteView->setCurrentIndex(idx); noteView->edit(idx); // 'open' for rename } noteView->model()->sort(0); if(!noteView->selectionModel()->selectedRows().isEmpty()) { noteView->scrollTo(noteView->selectionModel()->selectedRows().first()); } } void MainWindow::renameFolder(){ if(!folderView->selectionModel()->selectedRows().isEmpty()) folderView->edit(folderView->selectionModel()->selectedRows().first()); getToBerenamedNotebook = folderView->selectionModel()->selectedRows().first().data(Qt::DisplayRole).toString(); } void MainWindow::renameNote(){ if(!noteView->selectionModel()->selectedRows().isEmpty()) noteView->edit(noteView->selectionModel()->selectedRows().first()); } void MainWindow::removeFolder(){ if(folderView->selectionModel()->selectedRows().isEmpty()) return; QStringList dirList = QDir(QSettings().value("root_path").toString()).entryList(QDir::Dirs | QDir::NoDotAndDotDot); // keep at least one folder if(dirList.size() == 1) { QMessageBox::information(this,tr("Notebook could not be deleted"),tr("The notebook could not be deleted because one notebook must remain")); return; } QModelIndex idx = folderView->selectionModel()->selectedRows().first(); // remove empty folders without prompt else show a yes/abort message box if(!folderModel->rmdir(idx)) // folder not empty { if(QMessageBox::warning(this,tr("Delete Notebook"), tr("Are you sure you want to delete the notebook \"%1\" and move all containing notes to the trash?").arg(folderModel->fileName(idx)), QMessageBox::Yes | QMessageBox::Abort) != QMessageBox::Yes) return; // list all files QString path = folderModel->filePath(idx); const QStringList fileList = QDir(path).entryList(QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files); QModelIndexList indexes; for(const QString & fileName : fileList) { indexes << folderModel->index(QString("%1/%2").arg(path).arg(fileName)); } folderModel->copyNotesToBackupDir(indexes); folderModel->removeList(indexes); // try to remove the (now empty?) folder again if(!folderModel->rmdir(idx)) { QMessageBox::warning(this,tr("Notebook could not be deleted"), tr("The notebook could not be deleted because one or more notes inside the notebook could not be deleted.")); return; } } // // TODO Important! the following #ifdef code must only be executed if the folder has been removed #ifdef Q_OS_WIN32 // gives error QFileSystemWatcher: FindNextChangeNotification failed!! (Zugriff verweigert) // and dir deletion is delayed until another dir has been selected or the application is closed //folderList->setRowHidden(idx.row(),true); QModelIndex idxAt = folderView->indexAt(QPoint(0,0)); if(!idxAt.isValid()) return; folderView->selectionModel()->select(idxAt,QItemSelectionModel::Select); noteView->setRootIndex(noteModel->setRootPath(folderModel->filePath(idxAt))); #endif //TODO: check why: //QInotifyFileSystemWatcherEngine::addPaths: inotify_add_watch failed: Datei oder Verzeichnis nicht gefunden //QFileSystemWatcher: failed to add paths: /home/hakaishi/.nobleNote/new folder } void MainWindow::removeNote(){ if(noteView->selectionModel()->selectedRows().isEmpty()) return; QString names; const auto list = noteModel->fileNames(noteView->selectionModel()->selectedRows()); for(QString name : list) names += "\"" + name + "\"\n"; QString title; QString text; int numNotes = noteView->selectionModel()->selectedRows().size(); if(noteModel->allSizeZero(noteView->selectionModel()->selectedRows())) { // zero size files do not go to the trash title = tr("Deleting notes"); text = tr("Are you sure you want to permanently delete the selected notes?"); } else if(numNotes > 1) { title = tr("Delete Multiple Notes"); text = tr("Are you sure you want to move these %1 notes to the trash?\n\n%2").arg(QString::number(numNotes)).arg(names); } else { title = tr("Delete Note"); text = tr("Are you sure you want to move the note %1 to the trash?").arg(names); } if(QMessageBox::warning(this,title,text,QMessageBox::Yes | QMessageBox::No) != QMessageBox::Yes) return; QModelIndexList selectedRows = noteView->selectionModel()->selectedRows(); // try to copy the files to be removed into the backup folder noteModel->copyNotesToBackupDir(selectedRows); noteModel->removeList(selectedRows); } void MainWindow::setKineticScrollingEnabled(bool b) { QList widgets = QList() << noteView << folderView; for(QWidget * w : openNotes) { if(Note * note = qobject_cast(w)) widgets << note->textEdit(); } if(b) { for(QAbstractScrollArea* widget : widgets) if(widget) { QScroller::grabGesture(widget->viewport(), QScroller::LeftMouseButtonGesture); } } else { for(QAbstractScrollArea* widget : widgets) if(widget) { QScroller::ungrabGesture(widget->viewport()); } } } void MainWindow::showContextMenuFolder(const QPoint &pos){ QPoint globalPos = folderView->mapToGlobal(pos); QMenu menu; if(!folderView->indexAt(pos).isValid()) // if index doesn't exists at position { menu.addAction(actionNew_folder); } if(folderView->indexAt(pos).isValid()) // if index exists at position { menu.addAction(actionRename_folder); menu.addAction(actionDelete_folder); if(!shortcutNoteList.isEmpty()) { menu.addSeparator(); menu.addAction(action_Paste); } } menu.exec(globalPos); } void MainWindow::showContextMenuNote(const QPoint &pos){ QPoint globalPos = noteView->mapToGlobal(pos); QMenu menu; if(!noteView->indexAt(pos).isValid() && !(noteModel->sourceModel() == findNoteModel)) // if index doesn't exists at position { menu.addAction(actionNew_note); menu.addSeparator(); menu.addAction(action_Paste); } if(noteView->indexAt(pos).isValid()) // if index exists at position { if(noteView->selectionModel()->selectedRows().count() == 1) { menu.addAction(actionRename_note); actionDelete_note->setText(actionDelete_note->text()); } else { QAction* openAll = new QAction(tr("&Open notes"), &menu); connect(openAll, SIGNAL(triggered()), this, SLOT(openAllNotes())); menu.addAction(openAll); actionDelete_note->setText(tr("&Delete notes")); } menu.addAction(actionDelete_note); // show source code menu entry if(QSettings().value("show_source").toBool() && noteView->selectionModel()->selectedRows().count() == 1) { QAction* showSourceAction = new QAction(tr("Show &Source"), &menu); connect(showSourceAction,SIGNAL(triggered()),this,SLOT(openNoteSource())); menu.addAction(showSourceAction); } menu.addSeparator(); menu.addAction(action_Cut); } menu.exec(globalPos); } void MainWindow::getCutFiles() { shortcutNoteList.clear(); if(noteView->hasFocus()) { const auto selected = noteView->selectionModel()->selectedRows(); for(QModelIndex idx : selected) shortcutNoteList << noteModel->filePath(idx); } if(!shortcutNoteList.isEmpty()) action_Paste->setEnabled(true); if(noteIconProvider) delete noteIconProvider; noteIconProvider = new FileIconProvider(); noteIconProvider->setCutFiles(shortcutNoteList); noteFSModel->setIconProvider(noteIconProvider); const auto selected = noteView->selectionModel()->selectedRows(); for(QModelIndex idx : selected) noteView->update(idx); } void MainWindow::pasteFiles() { if(shortcutNoteList.isEmpty()) return; QString copyErrorFiles; for(QString note : shortcutNoteList) { if(!QFile(note).copy(folderModel->filePath( folderView->selectionModel()->selectedRows().first()) + QDir::separator() + QFileInfo(note).fileName())) copyErrorFiles += "\"" + note + "\"\n"; else QFile(note).remove(); } if(!copyErrorFiles.isEmpty()) QMessageBox::critical(this, tr("Copy error"), tr("Notes of the same names " "already exist in this notebook:\n\n%1").arg(QDir::toNativeSeparators(copyErrorFiles))); shortcutNoteList.clear(); action_Paste->setDisabled(true); } void MainWindow::keyPressEvent(QKeyEvent *k){ if(k->key() == Qt::Key_Delete) { if(noteView->hasFocus()) removeNote(); if(folderView->hasFocus()) removeFolder(); } if(k->matches(QKeySequence::Cut)) getCutFiles(); if(k->matches(QKeySequence::Paste)) pasteFiles(); if(k->key() == Qt::Key_Escape) { shortcutNoteList.clear(); if(noteIconProvider) delete noteIconProvider; noteIconProvider = new FileIconProvider(); noteFSModel->setIconProvider(noteIconProvider); //update noteView's items QSet rows; //no duplicates for performance for(int i = 0; noteView->indexAt(QPoint(0,i)).isValid(); i++) rows << noteView->indexAt(QPoint(0,i)); for(QModelIndex index : rows) noteView->update(index); } } void MainWindow::about() { //Versioning QFile versionFile(":version"); versionFile.open(QIODevice::ReadOnly | QIODevice::Text); QTextStream in(&versionFile); QString version = in.readLine(); versionFile.close(); QMessageBox::about(this, tr("About ") + qApp->applicationName(), tr("

%1 version %2

%1 is a note taking application

" "

Copyright © %3 Christian Metscher

" "

Permission is hereby granted, free of charge," " to any person obtaining a copy of this software and associated documentation files (the \"Software\")," " to deal in the Software without restriction," " including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software," " and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

" "The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software." "

THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY," " FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY," " WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

" ).arg(qApp->applicationName()).arg(version).arg(QDate::currentDate().year()) //: %1 is the application name, also do not translate the licence text // these macros should work for every compiler + "

Build " + QString(__TIME__) + " " + QString(__DATE__) // build time and date + "

Qt " + QString(QT_VERSION_STR) + "

"); // the Qt version this build is linked against } noblenote-1.2.0/src/textdocument.cpp0000664000175000017500000000367313502176303016532 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "textdocument.h" #include TextDocument::TextDocument(QObject *parent) : QTextDocument(parent) { timer = new QTimer(this); delay_ = 2000; timer->setInterval(delay_); timer->setSingleShot(true); connect(this,SIGNAL(modificationChanged(bool)),this,SLOT(startStopTimer(bool))); connect(timer,SIGNAL(timeout()),this,SLOT(sendDelayedModificationChanged())); } void TextDocument::startStopTimer(bool b) { if(b) timer->start(); else timer->stop(); } void TextDocument::sendDelayedModificationChanged() { if(this->isModified()) { emit delayedModificationChanged(); } } noblenote-1.2.0/src/backup.cpp0000664000175000017500000001115013502176303015241 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "backup.h" #include "trash.h" #include #include #include #include #include Backup::Backup(QWidget *parent) { parent_ = parent; getNotes(); //Searches for notes and backups. For the backups with no notes it will create the trees children. } void Backup::getNotes() { //get note files QDirIterator itFiles(QSettings().value("root_path").toString(), QDirIterator::Subdirectories); while(itFiles.hasNext()){ QString filePath = itFiles.next(); if(itFiles.fileInfo().isFile()) noteFiles << filePath; } progressReceiver1 = new ProgressReceiver(this); progressDialog1 = new QProgressDialog(parent_); progressDialog1->setLabelText(QString(tr("Indexing notes..."))); getUuid.p = progressReceiver1; future1 = new QFutureWatcher(this); future1->setFuture(QtConcurrent::mapped(noteFiles, getUuid)); QObject::connect(progressReceiver1,SIGNAL(valueChanged(int)),progressDialog1, SLOT(setValue(int))); QObject::connect(future1, SIGNAL(finished()), this, SLOT(setupBackups())); QObject::connect(future1, SIGNAL(finished()), progressDialog1, SLOT(reset())); QObject::connect(progressDialog1, SIGNAL(canceled()), future1, SLOT(cancel())); progressDialog1->show(); } void Backup::setupBackups() { QStringList noteUuidList; QFutureIterator it(future1->future()); while(it.hasNext()) noteUuidList << it.next(); backupFiles.clear(); //remove old files //get backup uuids QDir backupDir(QSettings().value("backup_dir_path").toString()); backupFiles = backupDir.entryInfoList(QDir::Files, QDir::Name); for(QString uuid : noteUuidList) { if(backupFiles.contains(QFileInfo(QSettings().value("backup_dir_path").toString() + QDir::separator() + uuid.mid(1,36)))) { backupFiles.removeOne(QFileInfo(QSettings().value("backup_dir_path").toString() + QDir::separator() + uuid.mid(1,36))); backupFiles.removeOne(QFileInfo(QSettings().value("backup_dir_path").toString() + QDir::separator() + uuid)); } } if(backupFiles.isEmpty()) { showTrash(); return; } progressReceiver2 = new ProgressReceiver(this); progressDialog2 = new QProgressDialog(parent_); progressDialog2->setLabelText(QString(tr("Indexing trash..."))); setupBackup.p = progressReceiver2; setupBackup.hash = &backupDataHash; // captures results future2 = new QFutureWatcher(this); future2->setFuture(QtConcurrent::map(backupFiles, setupBackup)); QObject::connect(progressReceiver2,SIGNAL(valueChanged(int)),progressDialog2, SLOT(setValue(int))); QObject::connect(future2, SIGNAL(finished()), this, SLOT(showTrash())); QObject::connect(future2, SIGNAL(finished()), progressDialog2, SLOT(reset())); QObject::connect(progressDialog2, SIGNAL(canceled()), future2, SLOT(cancel())); progressDialog2->show(); } void Backup::showTrash() { trash = new Trash(&backupDataHash, parent_); connect(trash, SIGNAL(destroyed()), this, SLOT(deleteLater())); trash->show(); } noblenote-1.2.0/src/xmlnotereader.cpp0000664000175000017500000002414313502176303016653 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "xmlnotereader.h" #include #include #include XmlNoteReader::XmlNoteReader(const QString& filePath, QTextDocument *doc) { document_ = doc; filePath_ = filePath; } void XmlNoteReader::read() { QFile file(filePath_); if(!file.open(QIODevice::ReadOnly)) { //qDebug(qPrintable(QString("XmlNoteReader::XmlNoteReader failed : could not open filepath ") + QDir::toNativeSeparators(filePath))); return; } QXmlStreamReader::setDevice(&file); parseXml(); // if uuid wasn't inside the xml text try to get it out of the filename if(uuid_.isNull()) uuid_ = QUuid(QFileInfo(filePath_).baseName()); // remove the title inside the document and the empty 2nd line, because the title is already in the window title QTextCursor cursor(document_); // point to start of the document cursor.select(QTextCursor::LineUnderCursor); QString titleLine = cursor.selectedText(); if(titleLine.trimmed() == title_.trimmed()) cursor.deleteChar(); cursor.movePosition(QTextCursor::NextBlock,QTextCursor::KeepAnchor,2); QString emptyLine = cursor.selectedText(); if(emptyLine.trimmed().isEmpty()) cursor.deleteChar(); file.close(); // local object gets destroyed } void XmlNoteReader::parseXml() { if( !this->QXmlStreamReader::device()) { qDebug("XmlNoteReader::read failed: input device NULL"); return; } // skip everything until while(!atEnd()) { readNext(); if(name() == "note-content") { if(!document_) // if no document_ set where note content can be written into skipCurrentElement(); else readContent(); } else if(name() == "id" || name() == "uuid") // only "id" is written { QString idStr = readElementText(); uuid_ = parseUuid(idStr); } else if(name() == "title") { title_ = readElementText(); } else if(name() == "last-change-date") { lastChange_ = QDateTime::fromString(readElementText(),Qt::ISODate); } else if(name() == "last-metadata-change") { lastMetadataChange_ = QDateTime::fromString(readElementText(),Qt::ISODate); } else if(name() == "create-date") { createDate_ = QDateTime::fromString(readElementText(),Qt::ISODate); } else if(name() == "tag") { tag_ = readElementText(); } if (QXmlStreamReader::hasError()) { qDebug("XmlNoteReader::read failed: Error reading xml content"); return; } } } void XmlNoteReader::readContent() { QTextCursor cursor(document_->rootFrame()); QTextCharFormat format; bool linkFormat = false; Q_UNUSED(linkFormat); while (!atEnd()) { TokenType token = readNext(); switch(token) { // read the text between the formatting elements case Characters: { // this commented out code does not work with formatted text and multiple links // TODO a QTextDocumentFragment must be created via QTextCursor::selected, the fragment must be exported to html // the link applied and reinserted via QTextCursor::insertHtml // if(linkFormat) // { // qDebug("link inserted"); // cursor.insertHtml("
" + text().toString() + ""); // } // else cursor.insertText(text().toString(),format); break; } // read elements and set the formatting case StartElement: { if(name() == "bold") format.setFontWeight(QFont::Bold); if(name() == "italic") format.setFontItalic(true); if(name() == "underline") format.setUnderlineStyle(QTextCharFormat::SingleUnderline); if(name() == "strikethrough" || name() == "strikeout") // only strikethrough is written, but strikeout is also allowed for reading format.setFontStrikeOut(true); if(name() == "highlight") format.setBackground(QColor(255,255,0)); if(qualifiedName() == "size:small") format.setFontPointSize(QApplication::font().pointSize()* 0.8f); if(qualifiedName() == "size:large") format.setFontPointSize(QApplication::font().pointSize()*1.4f); if(qualifiedName() == "size:huge") format.setFontPointSize(QApplication::font().pointSize()*1.6f); if(name() == "monospace") format.setFontFamily("Monospace"); if(qualifiedName() == "link:url") linkFormat = true; break; } // unset formatting case EndElement: { if(name() == "note-content") // end of note content, exit this method return; if(name() == "bold") format.setFontWeight(QFont::Normal); if(name() == "italic") format.setFontItalic(false); if(name() == "underline") format.setUnderlineStyle(QTextCharFormat::NoUnderline); if(name() == "strikethrough" || name() == "strikeout") // only strikethrough is written, but strikeout is also allowed for reading format.setFontStrikeOut(false); if(name() == "highlight") format.clearBackground(); if(qualifiedName() == "size:small" || qualifiedName() == "size:large" || qualifiedName() == "size:huge") // mutual exclusive options format.setFontPointSize(QApplication::font().pointSizeF()); if(name() == "monospace") format.setFontFamily(QApplication::font().family()); if(name() == "link:url") linkFormat = false; // ignore id break; } default:; // suppress compiler warnings } if (QXmlStreamReader::hasError()) { qDebug("XmlNoteReader::read failed: Error reading xml content"); return; } } } /*static*/ QUuid XmlNoteReader::parseUuid(QString idStr) { QUuid uuid; // try to parse the rightmost 32 digits and four hyphens uuid = QUuid(idStr.rightRef(32 + 4).toString()); if(uuid.isNull()) // if parsing fails, try more complex parsing { if(idStr.leftRef(QString("urn:uuid:").length()) == "urn:uuid:") // check if first 9 chars match "urn:uuid:" { QStringRef uuidRef = idStr.midRef(QString("urn:uuid:").length(),32+4); //32 digits and four hyphens uuid = QUuid(uuidRef.toString()); } else // try to parse the whole string { uuid = QUuid(idStr.simplified()); } } if(uuid.isNull()) qDebug("XmlNoteReader::parseUuid : error parsing UUID, null UUID has been generated"); return uuid; } /*static*/ QUuid XmlNoteReader::uuid(QString filePath) { QFile file(filePath); if(!file.open(QIODevice::ReadOnly)) { return QUuid(); } QXmlStreamReader reader(&file); while(!reader.atEnd()) { if(reader.readNextStartElement() && (reader.name() == "id" || reader.name() == "uuid")) { QString idStr = reader.readElementText(); return parseUuid(idStr); } if (reader.hasError()) { //qDebug("XmlNoteReader::uuid failed: Error reading xml content, returning null UUID"); return QUuid(); } } // if uuid wasn't inside the xml text try to get it out of the filename return QUuid(QFileInfo(filePath).baseName()); } /*static*/ QString XmlNoteReader::findUuid(const QUuid uuid, const QString &path) { if(uuid.isNull()) return QString(); QDirIterator it(path, QDirIterator::Subdirectories); while(it.hasNext()) { QString filePath = it.next(); if(uuid == XmlNoteReader::uuid(filePath)) return filePath; } return QString(); } /*static*/ bool XmlNoteReader::mightBeXmlNote(const QString &filePath) { QFile file(filePath); if(!file.open(QIODevice::ReadOnly)) { return false; } QXmlStreamReader reader(&file); while(!reader.atEnd()) { reader.readNext(); if(reader.isStartElement()) { if(reader.name() == "note") return true; else if(reader.name() == "html" || reader.name() == "head") // detect html return false; } if(reader.hasError()) // this should detect plain text return false; } return false; } noblenote-1.2.0/src/textsearchtoolbar.cpp0000664000175000017500000001204613502176303017536 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "textsearchtoolbar.h" #include "lineedit.h" #include "highlighter.h" #include TextSearchToolbar::TextSearchToolbar(QTextEdit * textEdit, QWidget *parent) : QToolBar(parent), textEdit_(textEdit){ setWindowTitle(tr("Search bar")); setObjectName(tr("Searchtoolbar")); typingTimer = new QTimer(this), typingTimer->setSingleShot(true); int typingThrottleTime = textEdit_->document()->characterCount() > 5000 ? 300 : 0; typingTimer->setInterval(typingThrottleTime); connect(typingTimer,&QTimer::timeout,this,&TextSearchToolbar::selectNextExpression); closeSearch = new QToolButton(this); closeSearch->setText("X"); closeSearch->setShortcut(Qt::Key_Escape); addWidget(closeSearch); searchLine_ = new LineEdit(this); searchLine_->setPlaceholderText(tr("Enter search argument")); addWidget(searchLine_); findPrevious = new QToolButton(this); findPrevious->setText(tr("Find &previous")); addWidget(findPrevious); findNext = new QToolButton(this); findNext->setText(tr("Find &next")); addWidget(findNext); caseSensitiveBox = new QCheckBox(this); caseSensitiveBox->setText(tr("&Case sensitive")); addWidget(caseSensitiveBox); connect(closeSearch, SIGNAL(clicked(bool)), this, SLOT(hide())); connect(searchLine_, &QLineEdit::textChanged, this, [this](){ typingTimer->start(); }); connect(findNext, SIGNAL(clicked(bool)), SLOT(selectNextExpression())); connect(findPrevious, SIGNAL(clicked(bool)), SLOT(selectPreviousExpression())); connect(searchLine_, SIGNAL(returnPressed()), SLOT(selectNextExpression())); } void TextSearchToolbar::selectNextExpression(){ if(this->caseSensitiveBox->isChecked()){ if(!textEdit_->find(this->searchLine_->text(), QTextDocument::FindCaseSensitively)){ textEdit_->moveCursor(QTextCursor::Start, QTextCursor::MoveAnchor); textEdit_->find(this->searchLine_->text(), QTextDocument::FindCaseSensitively); } } else{ if(!textEdit_->find(this->searchLine_->text())){ textEdit_->moveCursor(QTextCursor::Start, QTextCursor::MoveAnchor); textEdit_->find(this->searchLine_->text()); } } highlightText(this->searchLine_->text()); } void TextSearchToolbar::setText(const QString &text) { searchLine_->setText(text); highlightText(textEdit_->textCursor().selectedText()); } void TextSearchToolbar::selectPreviousExpression(){ if(this->caseSensitiveBox->isChecked()){ if(!textEdit_->find(this->searchLine_->text(), QTextDocument::FindCaseSensitively | QTextDocument::FindBackward)){ textEdit_->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); textEdit_->find(this->searchLine_->text(), QTextDocument::FindCaseSensitively | QTextDocument::FindBackward); } } else{ if(!textEdit_->find(this->searchLine_->text(), QTextDocument::FindBackward)){ textEdit_->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); textEdit_->find(this->searchLine_->text(), QTextDocument::FindBackward); } } highlightText(this->searchLine_->text()); } void TextSearchToolbar::highlightText(QString str){ highlighter = new Highlighter(textEdit_->document()); highlighter->expression = str; if(this->caseSensitiveBox->isChecked()) highlighter->caseSensitive = true; else highlighter->caseSensitive = false; connect(closeSearch, SIGNAL(clicked(bool)), highlighter, SLOT(deleteLater())); connect(closeSearch, SIGNAL(clicked(bool)), textEdit_, SLOT(setFocus())); connect(closeSearch, SIGNAL(clicked(bool)), this->searchLine_, SLOT(clear())); textEdit_->ensureCursorVisible(); } noblenote-1.2.0/src/backup.h0000664000175000017500000000711613502176303014715 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef BACKUP_H #define BACKUP_H #include "htmlnotereader.h" #include "abstractnotereader.h" #include "progressreceiver.h" #include #include #include #include class ProgressReceiver; class Trash; /// /// \brief The Backup class asynchronously reads note backup files from the file system /// and shows a Trash window where trashed notes can be inspected and restored /// class Backup : public QObject { Q_OBJECT public: Backup(QWidget *parent); // creating an instances launches the async file loading and widget creation immediately QWidget *parent_; private: QTextDocument *document; QPushButton *deleteOldButton; QStringList noteFiles; QFutureWatcher *future1; QFutureWatcher *future2; ProgressReceiver *progressReceiver1, *progressReceiver2; QProgressDialog *progressDialog1, *progressDialog2; QList backupFiles; //don't ever use a local stack variable QHash backupDataHash; Trash *trash; // functor that reads uuids struct GetUuid { ProgressReceiver *p; typedef QString result_type; QString operator()(QString file) { p->postProgressEvent(); return HtmlNoteReader::uuid(file).toString(); } }; // functor used for multithreaded note file reading method struct SetupBackup { ProgressReceiver *p; QHash *hash; void operator()(const QFileInfo &file) { QStringList data; HtmlNoteReader reader(file.absoluteFilePath()); reader.read(); QString title = reader.title(); if(title.isEmpty()) { title = tr("deleted note"); } data << title << file.absoluteFilePath() << reader.html(); hash->insert(file.absoluteFilePath(),data); p->postProgressEvent(); } }; GetUuid getUuid; SetupBackup setupBackup; private slots: void getNotes(); void setupBackups(); void showTrash(); }; #endif //BACKUP_H noblenote-1.2.0/src/abstractnotereader.h0000664000175000017500000000515213502176303017322 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef ABSTRACTNOTEREADER_H #define ABSTRACTNOTEREADER_H /** * @brief The AbstractNoteReader is an interface for note reader classes */ class QUuid; class QDateTime; class QString; class QIODevice; #include class AbstractNoteReader { public: AbstractNoteReader(){} virtual ~AbstractNoteReader(){} virtual void read() = 0; // read the contents of the document, methods below can only used after read has been called // virtual void read() = 0; // should send a signal when finished virtual QUuid uuid() const = 0; // get the uuid that has been extracted during read() virtual const QString& title() const = 0; // get last change date virtual const QDateTime& lastChange() const = 0; // get create date virtual const QDateTime& createDate() const = 0; // reads a uuid from a file, if uuid could not be found, a null uuid is returned //virtual static QUuid uuid(QString filePath) = 0; // searches all directorys under the given path recursively for a file with the given UUID // returns the first file that contains the given uuid or an empty string if the uuid could not be found or if the given uuid is null //virtual static QString findUuid(const QUuid uuid, const QString & path) = 0; }; #endif // ABSTRACTNOTEREADER_H noblenote-1.2.0/src/highlighter.cpp0000664000175000017500000000414213502176303016275 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "highlighter.h" Highlighter::Highlighter(QTextDocument *parent) : QSyntaxHighlighter(parent){ } void Highlighter::highlightBlock(const QString &text){ if(!expression.isEmpty()){ HighlightingRule rule; keywordFormat.setBackground(Qt::yellow); rule.pattern = QRegExp(expression, caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive); rule.format = keywordFormat; highlightingRules.append(rule); for(const HighlightingRule &rule : highlightingRules){ QRegExp expression(rule.pattern); int index = expression.indexIn(text); while(index >= 0){ int length = expression.matchedLength(); setFormat(index, length, rule.format); index = expression.indexIn(text, index + length); } } } } noblenote-1.2.0/src/htmlnotereader.h0000664000175000017500000000705113502176303016463 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef HTMLNOTEREADER_H #define HTMLNOTEREADER_H #include "abstractnotereader.h" #include #include #include #include #include /** * a class reading formatted html text and plain text * reading requires a QTextFrame * */ class HtmlNoteReader : public AbstractNoteReader { public: HtmlNoteReader(const QString &filePath); void read(); // get the uuid that has been extracted during read() QUuid uuid() const { return uuid_;} const QString& title() const { return title_;} // file name // get last change date const QDateTime& lastChange() const { return lastChange_;} // get last metadata change date const QDateTime& lastMetadataChange() const { return lastMetadataChange_;} // get create date const QDateTime& createDate() const { return createDate_;} const QString& html() const { return html_;} // returns the html contents of the file // returns the title from the html header static QString titleFromHtml(const QString& filePath); // // reads a uuid from a file, if uuid could not be found, a null uuid is returned static QUuid uuid(QString filePath); // // searches all directorys under the given path recursively for a file with the given UUID // // returns the first file that contains the given uuid or an empty string if the uuid could not be found or if the given uuid is null static QString findUuid(const QUuid uuid, const QString & path); // reads a uuid from the html contents of string static QUuid uuidFromHtml(const QString &html); // returns the text of the content attribute in a element for the given name static QString metaContent(const QString &html, const QString &name); private: void read(const QString &filePath); // read the content's of a QIODevice and write the formatted text into a QTextDocument static QUuid parseUuid(QString idStr); void readContent(); // read contents of tag QString title_; QString filePath_; QUuid uuid_; QDateTime lastChange_; QDateTime lastMetadataChange_; QDateTime createDate_; QString html_; }; #endif // HTMLNOTEREADER_H noblenote-1.2.0/src/lineedit.h0000664000175000017500000000334713502176303015247 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef LINEEDIT_H #define LINEEDIT_H #include /** * a line edit with a clear text button * */ class QToolButton; class LineEdit : public QLineEdit { Q_OBJECT public: LineEdit(QWidget *parent = 0); protected: void resizeEvent(QResizeEvent *); private slots: void updateCloseButton(const QString &text); signals: void sendCleared(); private: QToolButton *clearButton; }; #endif //LINEEDIT_H noblenote-1.2.0/src/htmlnotereader.cpp0000664000175000017500000001307613502176303017022 0ustar chrischris/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher , Fabian Deuchler * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "htmlnotereader.h" #include #include #include #include #include HtmlNoteReader::HtmlNoteReader(const QString &filePath) { filePath_ = filePath; } void HtmlNoteReader::read() { read(filePath_); } QString HtmlNoteReader::titleFromHtml(const QString &filePath) { QFile file(filePath); if(!file.open(QIODevice::ReadOnly)) { return QString(); } QString content; QTextStream in(&file); content = in.readAll(); file.close(); QTextDocument document; document.setHtml(content); QString title = document.metaInformation(QTextDocument::DocumentTitle); return title; } void HtmlNoteReader::read(const QString& filePath) { QFile file(filePath); if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { //qDebug(qPrintable(QString("HtmlNoteReader::read failed : could not open filepath ") + QDir::toNativeSeparators(filePath))); return; } QString html; QTextStream in(&file); in.setCodec("UTF-8"); html = in.readAll(); file.close(); if(!html.isEmpty() && !Qt::mightBeRichText(html)) html = Qt::convertFromPlainText(html); // this qt method creates unwanted paragraphs if empty Strings are converted //if(html.isEmpty()) // return; uuid_ = uuidFromHtml(html); lastChange_ = QDateTime::fromString(metaContent(html,"last-change-date"),Qt::ISODate); createDate_ = QDateTime::fromString(metaContent(html,"create-date"),Qt::ISODate); // // fallback dates // if(lastChange_.isNull()) // lastChange_ = info.lastModified(); // read int titleStartIndex = html.indexOf("<title>"); int titleEndIndex = html.indexOf(""); if(titleStartIndex != -1 && titleEndIndex != -1 && titleStartIndex < titleEndIndex) { int start = titleStartIndex + QLatin1String("").size(); title_ = html.mid(start,titleEndIndex - start); } html_ = html; } /*QUuid*/ QUuid HtmlNoteReader::uuid(QString filePath) { QFile file(filePath); if(!file.open(QIODevice::ReadOnly)) { return QUuid(); } QString content; QTextStream in(&file); content = in.readAll(); file.close(); return Qt::mightBeRichText(content) ? uuidFromHtml(content) : QUuid(); } /*static*/ QString HtmlNoteReader::findUuid(const QUuid uuid, const QString & path) { if(uuid.isNull()) return QString(); QDirIterator it(path, QDirIterator::Subdirectories); while(it.hasNext()) { QString filePath = it.next(); if(uuid == HtmlNoteReader::uuid(filePath)) return filePath; } return QString(); } /*static*/ QUuid HtmlNoteReader::uuidFromHtml(const QString& html) { return QUuid(metaContent(html,"uuid").trimmed()); } QString HtmlNoteReader::metaContent(const QString &html, const QString &name) { if(html.isEmpty()) return QString(); QString content = html; QTime time; // avoid forever loop time.start(); int metaIdx = 0; int endIdx = 0; // find the meta elements in the html files and read the uuid while(metaIdx != -1 && time.elapsed() < 1500) { metaIdx = content.indexOf("<meta",endIdx+1); if(metaIdx==-1) break; endIdx = content.indexOf(">",metaIdx+1); #if QT_VERSION >= 0x040800 // Qt Version > 4.8 QStringRef metaLine = content.midRef(metaIdx,endIdx-metaIdx+1); // e.g. <meta name="qrichtext" content="1" /> #else QString metaLine = content.mid(metaIdx,endIdx-metaIdx+1); // e.g. <meta name="qrichtext" content="1" /> #endif if(metaLine.contains(name)) { int idx = metaLine.lastIndexOf('\"'); int beforeIdx = metaLine.lastIndexOf('\"',idx-1); if(idx != -1 || beforeIdx != -1) { #if QT_VERSION >= 0x040800 // Qt Version > 4.8 return metaLine.toString().mid(beforeIdx +1,(idx-beforeIdx+1) -2); // +1 and -1 to take the content between the " " #else return metaLine.mid(beforeIdx +1,(idx-beforeIdx+1) -2); // +1 and -1 to take the content between the " " #endif } } } return QString(); } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/textdocument.h������������������������������������������������������������������0000664�0001750�0001750�00000004101�13502176303�016162� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher <hakaishi@web.de>, Fabian Deuchler <Taiko000@gmail.com> * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef TEXTDOCUMENT_H #define TEXTDOCUMENT_H #include <QTextDocument> /** * re-emits the modificationChanged signal of a QTextDocument after a timespan of delay() seconds * if the modified property is set to false elswhere in that timespan, the signal is not emitted * this class does not modify the modified property of the QTextDocument * **/ class TextDocument : public QTextDocument { Q_OBJECT public: explicit TextDocument(QObject *parent = 0); void setDelay(int delay){ delay_ = delay; } int delay() const { return delay_; } signals: void delayedModificationChanged(); private slots: void startStopTimer(bool b); void sendDelayedModificationChanged(); private: int delay_; QTimer *timer; }; #endif // TEXTDOCUMENT_H ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/preferences.h�������������������������������������������������������������������0000664�0001750�0001750�00000003763�13502176303�015755� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher <hakaishi@web.de>, Fabian Deuchler <Taiko000@gmail.com> * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef PREFERENCES_H #define PREFERENCES_H #include "ui_preferences.h" #include <QSettings> #include <QPointer> class Preferences : public QDialog, public Ui::Preferences { Q_OBJECT public: Preferences(QWidget *parent = 0); QString rootPath; private: QSettings *settings; QString originalRootPath; private slots: void setFontSize(const QString size); void saveSettings(); QString openDir(); void setNewPaths(); signals: void pathChanged(); void kineticScrollingEnabledChanged(bool); void recentCountChanged(); protected: virtual void showEvent(QShowEvent* show_pref); }; #endif //PREFERENCES_H �������������noblenote-1.2.0/src/textbrowser.h�������������������������������������������������������������������0000664�0001750�0001750�00000003600�13502176303�016032� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher <hakaishi@web.de>, Fabian Deuchler <Taiko000@gmail.com> * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef TEXTBROWSER_H #define TEXTBROWSER_H #include <QTextBrowser> /** * a text edit with a custom focus in event * */ class TextBrowser : public QTextBrowser{ Q_OBJECT public: TextBrowser(QWidget *parent = 0); signals: void signalFocusInEvent(); void signalFocusOutEvent(); public slots: void slotSetReadOnly(bool ro); // wrapper slot protected: virtual void focusInEvent(QFocusEvent *fe); virtual void focusOutEvent(QFocusEvent *e); private slots: void openLinkInBrowser(const QUrl link); }; #endif // TEXTEDIT_H ��������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/datetime.h����������������������������������������������������������������������0000664�0001750�0001750�00000003100�13502176303�015231� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher <hakaishi@web.de>, Fabian Deuchler <Taiko000@gmail.com> * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef DATETIME_H #define DATETIME_H #include <QString> #include <QDateTime> /** * @brief date formatting helper class */ class DateTime { public: static QString getTimeZoneOffset(QDateTime dt1); static QString toISO8601(QDateTime dt); }; #endif // DATETIME_H ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/welcome.h�����������������������������������������������������������������������0000664�0001750�0001750�00000003560�13502176303�015102� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher <hakaishi@web.de>, Fabian Deuchler <Taiko000@gmail.com> * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef WELCOME_H #define WELCOME_H #include "ui_welcome.h" #if QT_VERSION >= 0x050000 #include <QtWidgets/QDialog> #else #include <QDialog> #endif class LineEdit; class Welcome : public QDialog, public Ui::Welcome { Q_OBJECT public: Welcome(QWidget *parent = 0); private: LineEdit *path; QString defaultPath; bool isPortable; private slots: void openDir(); void setRootDir(); public slots: void getInstance(bool rootPathIsSet, bool rootPathExists, bool rootPathIsWritable); }; #endif // WELCOME_H ������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/textformattingtoolbar.cpp�������������������������������������������������������0000664�0001750�0001750�00000031721�13502176303�020444� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher <hakaishi@web.de>, Fabian Deuchler <Taiko000@gmail.com> * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "textformattingtoolbar.h" #include <QAction> #include <QApplication> #include <QColorDialog> #include <QInputDialog> #include <QTextBlock> #include <QTextList> #include <QTextDocumentFragment> TextFormattingToolbar::TextFormattingToolbar(QTextEdit * textEdit, QWidget *parent) : QToolBar(parent), textEdit_(textEdit) { setWindowTitle(tr("Format actions")); setObjectName(tr("Formattoolbar")); actionTextBold = new QAction(QIcon::fromTheme("format-text-bold", QIcon(":bold")), tr("&Bold"), this); actionTextBold->setShortcut(Qt::CTRL + Qt::Key_B); actionTextBold->setPriority(QAction::LowPriority); QFont bold; bold.setBold(true); actionTextBold->setFont(bold); connect(actionTextBold, SIGNAL(triggered()), this, SLOT(boldText())); addAction(actionTextBold); actionTextBold->setCheckable(true); actionTextItalic = new QAction(QIcon::fromTheme("format-text-italic", QIcon(":italic")), tr("&Italic"), this); actionTextItalic->setPriority(QAction::LowPriority); actionTextItalic->setShortcut(Qt::CTRL + Qt::Key_I); QFont italic; italic.setItalic(true); actionTextItalic->setFont(italic); connect(actionTextItalic, SIGNAL(triggered()), this, SLOT(italicText())); addAction(actionTextItalic); actionTextItalic->setCheckable(true); actionTextUnderline = new QAction(QIcon::fromTheme("format-text-underline", QIcon(":underlined")), tr("&Underline"), this); actionTextUnderline->setShortcut(Qt::CTRL + Qt::Key_U); actionTextUnderline->setPriority(QAction::LowPriority); QFont underline; underline.setUnderline(true); actionTextUnderline->setFont(underline); connect(actionTextUnderline, SIGNAL(triggered()), this, SLOT(underlinedText())); addAction(actionTextUnderline); actionTextUnderline->setCheckable(true); actionTextStrikeOut = new QAction(QIcon::fromTheme("format-text-strikethrough", QIcon(":strikedout")), tr("&Strike Out"), this); actionTextStrikeOut->setShortcut(Qt::CTRL + Qt::Key_S); actionTextStrikeOut->setPriority(QAction::LowPriority); QFont strikeOut; strikeOut.setStrikeOut(true); actionTextStrikeOut->setFont(strikeOut); connect(actionTextStrikeOut, SIGNAL(triggered()), this, SLOT(strikedOutText())); addAction(actionTextStrikeOut); actionTextStrikeOut->setCheckable(true); actionInsertHyperlink = new QAction(QIcon::fromTheme("emblem-web",QIcon(":hyperlink")),tr("&Hyperlink"),this); actionInsertHyperlink->setShortcut(Qt::CTRL + Qt::Key_K); // word shortcut actionInsertHyperlink->setPriority(QAction::LowPriority); connect(actionInsertHyperlink,SIGNAL(triggered()),this,SLOT(insertHyperlink())); addAction(actionInsertHyperlink); actionClearFormatting = new QAction(QIcon::fromTheme("TODO",QIcon(":clearFormatting")),tr("&Clear formatting"),this); actionClearFormatting->setPriority(QAction::LowPriority); actionClearFormatting->setShortcut(Qt::CTRL + Qt::Key_Space); // ms word clear font formatting shortcut connect(actionClearFormatting,SIGNAL(triggered()),this,SLOT(clearCharFormat())); addAction(actionClearFormatting); actionBulletPoint = new QAction(QIcon::fromTheme("TODO",QIcon(":bulletpoints")),tr("Bullet point"),this); actionBulletPoint->setPriority(QAction::LowPriority); actionBulletPoint->setShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_L); // ms word add bullet points formatting shortcut actionBulletPoint->setCheckable(true); connect(actionBulletPoint,SIGNAL(triggered()),this,SLOT(insertBulletPoints())); addAction(actionBulletPoint); // actionRemoveWhitespace = new QAction(/*QIcon::fromTheme("TODO",QIcon("")),tr("&Remove Whitespace"),*/this); // actionRemoveWhitespace->setPriority(QAction::LowPriority); // connect(actionRemoveWhitespace,SIGNAL(triggered()),this,SLOT(removeWhitespace())); // addAction(actionRemoveWhitespace); QPixmap textPix(16, 16); textPix.fill(textEdit_->palette().windowText().color()); actionTextColor = new QAction(textPix, tr("&Text color..."), this); connect(actionTextColor, SIGNAL(triggered()), this, SLOT(coloredText())); addAction(actionTextColor); QPixmap bPix(16, 16); bPix.fill(textEdit_->palette().base().color()); actionTextBColor = new QAction(bPix, tr("&Background color..."), this); connect(actionTextBColor, SIGNAL(triggered()), this, SLOT(markedText())); addAction(actionTextBColor); fontComboBox = new QFontComboBox(this); fontComboBox->setFocusPolicy(Qt::TabFocus); addWidget(fontComboBox); connect(fontComboBox, SIGNAL(activated(QString)), this, SLOT(fontOfText(QString))); fontSizeComboBox = new QComboBox(this); fontSizeComboBox->setFocusPolicy(Qt::TabFocus); fontSizeComboBox->setObjectName("comboSize"); addWidget(fontSizeComboBox); fontSizeComboBox->setEditable(true); connect(fontSizeComboBox, SIGNAL(activated(QString)), this, SLOT(pointSizeOfText(QString))); const auto sizes = QFontDatabase().standardSizes(); for(int size : sizes) fontSizeComboBox->addItem(QString::number(size)); connect(textEdit_, SIGNAL(currentCharFormatChanged(QTextCharFormat)), this, SLOT(getFontAndPointSizeOfText(QTextCharFormat))); connect(textEdit_,SIGNAL(cursorPositionChanged()),this,SLOT(updateBulletPointToolbarButton())); } void TextFormattingToolbar::mergeFormatOnWordOrSelection(const QTextCharFormat &format){ QTextCursor cursor = textEdit_->textCursor(); if(cursor.selectedText() == 0) { cursor.select(QTextCursor::WordUnderCursor); } textEdit_->mergeCurrentCharFormat(format); // enables formatting for chars at the beginning of a new line cursor.mergeCharFormat(format); // enables formatting for word under cursor, this is not done by textEdit_->mergeCurrentCharFormat(format); } void TextFormattingToolbar::clearCharFormat() { QTextCursor cursor = textEdit_->textCursor(); if(cursor.selectedText() == 0) cursor.select(QTextCursor::WordUnderCursor); cursor.setCharFormat(QTextCharFormat()); textEdit_->setCurrentCharFormat(QTextCharFormat()); } //void TextFormattingToolbar::removeWhitespace() //{ // textEdit_->setPlainText(textEdit_->toPlainText().replace(" ", "")); //} void TextFormattingToolbar::getFontAndPointSizeOfText(const QTextCharFormat &format){ QFont f = format.font(); fontComboBox->setCurrentIndex(fontComboBox->findText(QFontInfo(f).family())); fontSizeComboBox->setCurrentIndex(fontSizeComboBox->findText(QString::number(f.pointSize()))); actionTextBold->setChecked(f.bold()); actionTextItalic->setChecked(f.italic()); actionTextUnderline->setChecked(f.underline()); actionTextStrikeOut->setChecked(f.strikeOut()); QPixmap textPix(16,16); if(format.foreground().style() == Qt::NoBrush) textPix.fill(textEdit_->palette().windowText().color()); else textPix.fill(format.foreground().color()); actionTextColor->setIcon(textPix); QPixmap bPix(16,16); if(format.background().style() == Qt::NoBrush) { bPix.fill(textEdit_->palette().base().color()); } else { bPix.fill(format.background().color()); } actionTextBColor->setIcon(bPix); } void TextFormattingToolbar::updateBulletPointToolbarButton() { QTextCursor cursor = textEdit_->textCursor(); //get the cursor's current list (formatting) QTextList* currentList = cursor.currentList(); if(currentList != 0 && currentList->format().style() == QTextListFormat::ListDisc) { actionBulletPoint->setChecked(true); } else if(currentList == 0 || (currentList != 0 && currentList->format().style() != QTextListFormat::ListDisc)) // null or not bullet { actionBulletPoint->setChecked(false); } } void TextFormattingToolbar::boldText(){ QTextCharFormat fmt; fmt.setFontWeight(actionTextBold->isChecked() ? QFont::Bold : QFont::Normal); mergeFormatOnWordOrSelection(fmt); } void TextFormattingToolbar::italicText(){ QTextCharFormat fmt; fmt.setFontItalic(actionTextItalic->isChecked()); mergeFormatOnWordOrSelection(fmt); } void TextFormattingToolbar::underlinedText(){ QTextCharFormat fmt; fmt.setFontUnderline(actionTextUnderline->isChecked()); mergeFormatOnWordOrSelection(fmt); } void TextFormattingToolbar::strikedOutText(){ QTextCharFormat fmt; fmt.setFontStrikeOut(actionTextStrikeOut->isChecked()); mergeFormatOnWordOrSelection(fmt); } void TextFormattingToolbar::insertBulletPoints() { QTextCursor cursor = textEdit_->textCursor(); //get the cursor's current list, which you want to remove from the text. QTextList* currentList = cursor.currentList(); if(currentList != 0 && currentList->format().style() == QTextListFormat::ListDisc) { //get the current block, which you want to remove from the current list QTextBlock currentBlock = cursor.block(); //call the list's remove() function, passing the block as a parameter currentList->remove(currentBlock); //the list is now removed, but you still have to remove the list identation QTextBlockFormat blockFormat = cursor.blockFormat(); blockFormat.setIndent(0); cursor.setBlockFormat(blockFormat); } else if(currentList == 0 || (currentList != 0 && currentList->format().style() != QTextListFormat::ListDisc)) // null or not bullet { QTextListFormat::Style style = QTextListFormat::ListDisc; QTextListFormat listFormat; listFormat.setStyle( style ); cursor.createList( listFormat ); } } void TextFormattingToolbar::coloredText(){ QColor col = QColorDialog::getColor(textEdit_->textColor(), this); if(!col.isValid()) return; QTextCharFormat fmt; fmt.setForeground(QBrush(col,Qt::SolidPattern)); mergeFormatOnWordOrSelection(fmt); QPixmap pix(16, 16); pix.fill(col); actionTextColor->setIcon(pix); } void TextFormattingToolbar::markedText(){ QColor col = QColorDialog::getColor(textEdit_->textBackgroundColor(), this); if(!col.isValid()) return; QTextCharFormat fmt; fmt.setBackground(QBrush(col,Qt::SolidPattern)); mergeFormatOnWordOrSelection(fmt); QPixmap pix(16, 16); pix.fill(col); actionTextBColor->setIcon(pix); } void TextFormattingToolbar::insertHyperlink() { QTextCursor cursor = textEdit_->textCursor(); QString selectedText = cursor.selectedText(); bool ok; QString link = QInputDialog::getText(textEdit_,tr("Insert hyperlink"),tr("Addr&ess:"),QLineEdit::Normal,selectedText,&ok); if(!ok) return; /*TODO: de-formatting if(link.isEmpty){ resetFonts()//or something like that return; }*/ /*TODO: check if link/e-mail is valid with the following regexps QRegExp(">\\b((((https?|ftp)://)|(www\\.))[a-zA-Z0-9_\\.\\-\\?]+)\\b(<?)" , Qt::CaseInsensitive) QRegExp(">\\b([a-zA-Z0-9_\\.\\-]+@[a-zA-Z0-9_\\.\\-]+)\\b(<?)", Qt::CaseInsensitive) */ if(selectedText.isEmpty()) selectedText = link; if(link.contains("@")) cursor.insertHtml("<a href=mailto:"+link+"\">"+selectedText+"</a>"); else cursor.insertHtml("<a href=\""+link+"\">"+selectedText+"</a>"); } void TextFormattingToolbar::fontOfText(const QString &f){ QTextCharFormat fmt; fmt.setFontFamily(f); mergeFormatOnWordOrSelection(fmt); } void TextFormattingToolbar::pointSizeOfText(const QString &p){ qreal pointSize = p.toFloat(); if(p.toFloat() > 0){ QTextCharFormat fmt; fmt.setFontPointSize(pointSize); mergeFormatOnWordOrSelection(fmt); } } void TextFormattingToolbar::setFont(QFont font) { fontComboBox->setCurrentFont(font); fontSizeComboBox->setCurrentIndex(fontSizeComboBox->findText(QString::number( font.pointSize()))); } �����������������������������������������������noblenote-1.2.0/src/highlighter.h�������������������������������������������������������������������0000664�0001750�0001750�00000003760�13502176303�015747� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher <hakaishi@web.de>, Fabian Deuchler <Taiko000@gmail.com> * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef HIGHLIGHTER_H #define HIGHLIGHTER_H #include <QSyntaxHighlighter> #include <QHash> #include <QTextCharFormat> /** * highlights words when find in text is activated */ class QTextDocument; class Highlighter : public QSyntaxHighlighter{ Q_OBJECT public: Highlighter(QTextDocument *parent = 0); QString expression; bool caseSensitive; protected: void highlightBlock(const QString &text); private: struct HighlightingRule{ QRegExp pattern; QTextCharFormat format; }; QVector<HighlightingRule> highlightingRules; QTextCharFormat linkFormat; QTextCharFormat keywordFormat; }; #endif //HIGHLIGHTER_H ����������������noblenote-1.2.0/src/filesystemmodel.h���������������������������������������������������������������0000664�0001750�0001750�00000012250�13502176303�016650� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher <hakaishi@web.de>, Fabian Deuchler <Taiko000@gmail.com> * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef FILESYSTEMMODEL_H #define FILESYSTEMMODEL_H #include <QFileSystemModel> #include <QSettings> #include <QMimeData> #include <QUrl> #include <QMessageBox> /** * @brief overwritten base class that circumvents a bug in QFileSystemodel which causes * the flags method to never return a Qt::ItemIsEditable * because it checks for the permission QFile::WriteUser which seems to be always false * if Qt::ItemIsEditable is never set, setData or edit methods will always fail */ class FileSystemModel : public QFileSystemModel { Q_OBJECT signals: void droppedAFile(); public: explicit FileSystemModel(QObject *parent = 0) : QFileSystemModel(parent) {} Qt::ItemFlags flags(const QModelIndex &index) const { return QFileSystemModel::flags(index) | Qt::ItemIsEditable; } // disable drops between items and elsewhere in the viewport bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) { // is drop into "emtpy space" bool isRootFolder = this->index(QSettings().value("root_path").toString()) == parent; // row == -1 && column == -1 dropped directly on item or on "empty space" if((row == -1 && column == -1) && !isRootFolder) { QStringList files; for(QUrl url : data->urls()) if(!url.toLocalFile().isEmpty()) files << url.toLocalFile(); if(files.isEmpty()) //no local files return false; if(this->index(QFileInfo(files.first()).absolutePath()) == parent) return false; //dropped in the same folder they are in QDir dirs(QSettings().value("root_path").toString()); QList<QFileInfo> dirList = dirs.entryInfoList(QDir::Dirs|QDir::NoDotAndDotDot, QDir::Name); //Search for the right dir QString parentPath; for(QFileInfo file : dirList) if(this->index(QFileInfo(file).absoluteFilePath()) == parent) parentPath = QFileInfo(file).absoluteFilePath(); if(dirList.contains(QFileInfo(files.first()).absolutePath())) //check if files come from outside the note folders action = Qt::MoveAction; //remove all file titles that don't exist in the target folder, because they will be sucessfully dropped // TODO FIXME foreach operates on a copy foreach(QString file,files) { QString path = parentPath + QDir::separator() + QFileInfo(file).fileName(); if(!QFileInfo(path).exists()) files.removeOne(file); } bool dropped = QFileSystemModel::dropMimeData(data,action,row,column,parent); if(!dropped) { QString existingFiles; for(QString file : files) existingFiles += file + "\n"; if(!existingFiles.isEmpty()) { QString title = tr("Files could not be dropped"); QString text = tr("The files could not be dropped because files of the same names are already existing in this notebook:\n\n%1").arg(QDir::toNativeSeparators(existingFiles)); if(files.size() == 1) { title = tr("File could not be dropped"); text = tr("The file could not be dropped because a file with the same name already exists in this notebook:\n\n%1").arg(QDir::toNativeSeparators(existingFiles)); } QMessageBox::warning(0, title, text); } return false; } else { droppedAFile(); return true; //files sucessfully dropped } } return false; // dropped between items } }; #endif // FILESYSTEMMODEL_H ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/translations/�������������������������������������������������������������������0000775�0001750�0001750�00000000000�13513631003�016006� 5����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/translations/noblenote_fr.ts����������������������������������������������������0000664�0001750�0001750�00000056665�13502176303�021061� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> <TS version="2.1" language="fr"> <context> <name>Backup</name> <message> <source>Indexing notes...</source> <translation>Indexation des notes...</translation> </message> <message> <source>Indexing trash...</source> <translation>Indexation de la corbeille...</translation> </message> </context> <context> <name>FileSystemModel</name> <message> <source>Files could not be dropped</source> <translation>Les fichiers ne peuvent être jetés</translation> </message> <message> <source>The files could not be dropped because files of the same names are already existing in this notebook: %1</source> <translation>Les fichiers ne peuvent être supprimés car des fichiers de même noms existent encore: %1</translation> </message> <message> <source>The file could not be dropped because a file with the same name already exists in this notebook: %1</source> <translation>Un fichier ne peut être supprimé car un fichier de même noms existe encore: %1</translation> </message> <message> <source>File could not be dropped</source> <translation>Le fichier ne peut être jeté</translation> </message> </context> <context> <name>HtmlNoteWriter</name> <message> <source>default</source> <translation>défaut</translation> </message> <message> <source>untitled note</source> <translation>sans nom</translation> </message> </context> <context> <name>MainWindow</name> <message> <source>&Minimize</source> <translation>&Minimiser</translation> </message> <message> <source>&Quit</source> <translation>&Quitter</translation> </message> <message> <source>default</source> <translation>défaut</translation> </message> <message> <source>&Restore</source> <translation>&Restaurer</translation> </message> <message> <source>Note does not exist</source> <translation>La note n'éxiste pas</translation> </message> <message> <source>new note</source> <translation>nouvelle note</translation> </message> <message> <source>new note (%1)</source> <translation>nouvelle note (%1)</translation> </message> <message> <source>Type to search for notes</source> <translation>Ecrire pour chercher des notes</translation> </message> <message> <source>The selected note cannot be opened because it has been moved or renamed!</source> <translation>La note séléctionnée ne peut être ouvertes car elle a été déplacée ou renomée.</translation> </message> <message> <source>new notebook</source> <translation>Nouveau carnet de note</translation> </message> <message> <source>new notebook (%1)</source> <translation>Nouveau carnet de note (%1)</translation> </message> <message> <source>Delete Notebook</source> <translation>Supprimer le carnet de note</translation> </message> <message> <source>Are you sure you want to delete the notebook "%1" and move all containing notes to the trash?</source> <translation>Etes vous sures de vouloir effacre le carnet de note et jeter toutes les notes qu'il contient à la corbeille?</translation> </message> <message> <source>Notebook could not be deleted</source> <translation>Le carnet de note ne peut être effacé</translation> </message> <message> <source>The notebook could not be deleted because one notebook must remain</source> <translation>Le carnet de note ne peut être effacé car il doit rester un carnet d'adresse</translation> </message> <message> <source>The notebook could not be deleted because one or more notes inside the notebook could not be deleted.</source> <translation>Le carnet de note ne peut être effacé car une ou plusieurs notes sont ouvertes</translation> </message> <message> <source>Delete Note</source> <translation>Supprimer la note</translation> </message> <message> <source>Are you sure you want to move the note %1 to the trash?</source> <translation>Etes vous surs de vouloir déplacer la note %1 à la corbeille?</translation> </message> <message> <source>Delete Multiple Notes</source> <translation>Supprimer plusieurs notes</translation> </message> <message> <source>&Open notes</source> <translation>&Ouvrir des notes</translation> </message> <message> <source>&Delete notes</source> <translation>&Supprimer des notes</translation> </message> <message> <source>Show &Source</source> <translation>Afficher les &sources</translation> </message> <message> <source>Copy error</source> <translation>Erreur de copie</translation> </message> <message> <source>Notes of the same names already exist in this notebook: %1</source> <translation>Des notes de même noms existent déjà dans le carnet d'adresse: %1</translation> </message> <message> <source>About </source> <translation>A propos de </translation> </message> <message> <source>nobleNote</source> <translation>nobleNote</translation> </message> <message> <source>&File</source> <translation>&Fichier</translation> </message> <message> <source>&Settings</source> <translation>&Configuration</translation> </message> <message> <source>&Help</source> <translation>Aide</translation> </message> <message> <source>&View</source> <translation>&Voir</translation> </message> <message> <source>&Edit</source> <translation>&Editer</translation> </message> <message> <source>Ctrl+Q</source> <translation>Ctrl+Q</translation> </message> <message> <source>&Import</source> <translation>&Importer</translation> </message> <message> <source>&Configure...</source> <translation>&Configurer...</translation> </message> <message> <source>Ctrl+P</source> <translation>Ctrl+P</translation> </message> <message> <source>&About</source> <translation>&A propos de</translation> </message> <message> <source>&Show toolbar</source> <translation>&Afficher la barre de tache</translation> </message> <message> <source>Ctrl+Shift+T</source> <translation>Ctrl+Shift+T</translation> </message> <message> <source>&Trash</source> <translation>Déplacer dans la corbeille</translation> </message> <message> <source>Ctrl+T</source> <translation>Ctrl+T</translation> </message> <message> <source>&History</source> <translation>&Historique</translation> </message> <message> <source>Ctrl+Shift+H</source> <translation>Ctrl+Shift+H</translation> </message> <message> <source>&New notebook</source> <translation>Nouveau carnet de notes</translation> </message> <message> <source>Ctrl+N</source> <translation>Ctrl+N</translation> </message> <message> <source>&Rename notebook</source> <translation>Renommer le carnet d'adresse</translation> </message> <message> <source>Ctrl+R</source> <translation>Ctrl+R</translation> </message> <message> <source>&Delete notebook</source> <translation>Effacer le carnet de note</translation> </message> <message> <source>Ctrl+D</source> <translation>Ctrl+D</translation> </message> <message> <source>&New note</source> <translation>&Nouvelle note</translation> </message> <message> <source>Ctrl+Shift+N</source> <translation>Ctrl+Shift+N</translation> </message> <message> <source>&Rename note</source> <translation>&Renommer la note</translation> </message> <message> <source>Ctrl+Shift+R</source> <translation>Ctrl+Shift+R</translation> </message> <message> <source>&Delete note</source> <translation>&Supprimer la note</translation> </message> <message> <source>Ctrl+Shift+D</source> <translation>Ctrl+Shift+D</translation> </message> <message> <source>&Cut</source> <translation>&Couper</translation> </message> <message> <source>Ctrl+X</source> <translation>Ctrl+X</translation> </message> <message> <source>&Paste</source> <translation>&Coller</translation> </message> <message> <source>Ctrl+V</source> <translation>Ctrl+V</translation> </message> <message> <source>Are you sure you want to move these %1 notes to the trash? %2</source> <translation>Etes vous sures de vouloir déplacer ces %1 notes dans la corbeille? %2</translation> </message> <message> <source>Open recent</source> <translation>Ouvrir récent</translation> </message> <message> <source>a</source> <translation type="unfinished"></translation> </message> <message> <source><h1>%1 version %2</h1><p><b>%1</b> is a note taking application</p><p>Copyright (C) %3 Christian Metscher, Fabian Deuchler</p><p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p></source> <translation type="unfinished"></translation> </message> </context> <context> <name>Note</name> <message> <source>Note-Editor</source> <translation>Editeur de notes</translation> </message> <message> <source>Hide Toolbars</source> <translation>Masquer les barres de taches</translation> </message> <message> <source>Show Toolbars</source> <translation>Afficher les barres de taches</translation> </message> </context> <context> <name>NoteDescriptor</name> <message> <source>Note does not exist</source> <translation>La note n'existe pas</translation> </message> <message> <source>This note does not longer exist. Do you want to keep the editor open?</source> <translation>Cette note n'existe plus. Souhaitez vous laisser l'editeur ouvert?</translation> </message> <message> <source>Note modified</source> <translation>Note modifiée</translation> </message> <message> <source>This note has been modified by another instance of %1. Should the note be saved under a different name? Else the note will be reloaded.</source> <translation>La note a été modifiée par une autre instance de %1. Doit on sauvegarder la note sous un autre nom? Sinon la note sera rechargée.</translation> </message> </context> <context> <name>NoteImporter</name> <message> <source>Select one or more tomboy or gnote notes</source> <translation>Selectionnez une ou plusieurs note tomboy ou gnote</translation> </message> <message> <source>Notes</source> <translation>Notes</translation> </message> <message> <source>Importing notes...</source> <translation>Importation des notes...</translation> </message> </context> <context> <name>Preferences</name> <message> <source>Preferences</source> <translation>Préfèrences</translation> </message> <message> <source>&Browse ...</source> <translation>&Parcourir...</translation> </message> <message> <source>Note editor default font:</source> <translation>Police par défaut de l'éditeur de note</translation> </message> <message> <source>Note editor default size:</source> <translation>Taille par défaut de l'éditeur de note</translation> </message> <message> <source>&Show "Show Source" menu entry</source> <translation>&Afficher "Afficher les sources" dans le menu</translation> </message> <message> <source>&Close to tray</source> <translation>&Fermer l'aire de notification</translation> </message> <message> <source>Automatically convert non-HTML notes to the HTML format. If disabled, non-HTML notes are opened read only.</source> <translation>Convertir automatiquement les notes non-HTML au format HTML. Si désactivé, les notes non-HTML seront ouvertes en lecture seules.</translation> </message> <message> <source>Warning</source> <translation>Attention</translation> </message> <message> <source>Could not write settings!</source> <translation>Impossible d'ecrire la configuration!</translation> </message> <message> <source>Keep old trash folder?</source> <translation>Garder l'ancien dossier corbeille?</translation> </message> <message> <source>Do you want to keep the old trash folder associated with the path %1? (You will be able to see the old files in the trash again if you change back to the previous directory.)</source> <translation>Souhaitez vous garder l'ancien dossier corbeille associée au chemin %1?</translation> </message> <message> <source>Couldn't delete trash folder</source> <translation>Impossible de supprimer le dossier corbeille</translation> </message> <message> <source>Could not delete the trash folder!</source> <translation>Impossible de supprimer le dossier corbeille!</translation> </message> <message> <source>Open Directory</source> <translation>Ouvrir le dossier</translation> </message> <message> <source>The path "%1" is not writable!</source> <translation>Le chemin "%1" n'est pas inscriptible.</translation> </message> <message> <source>No Write Access</source> <translation>Pas d'accès en écriture</translation> </message> <message> <source>Width:</source> <translation>Largeur: </translation> </message> <message> <source>Height:</source> <translation>Hauteur: </translation> </message> <message> <source>&Touch screen scrolling</source> <translation>Défilement par ecran tactile</translation> </message> <message> <source>Convert notes to the &HTML format</source> <translation>Conversion des notes au format HTML</translation> </message> <message> <source>Number of recently opened notes</source> <translation>Nombre de notes récemment ouvertes</translation> </message> <message> <source>Root directory:</source> <translation>Dossier racine</translation> </message> <message> <source>Backup directroy:</source> <translation>Dossier de sauvegarde</translation> </message> <message> <source>(Will be updated after pressing OK.)</source> <translation>(Sera mis à jour après préssion sur OK.)</translation> </message> <message> <source>Do not show the main interface and notes on startup. (Minimized to tray icon)</source> <translation type="unfinished"></translation> </message> <message> <source>&Hide main window at startup</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TextFormattingToolbar</name> <message> <source>Format actions</source> <translation>Actions de formattage</translation> </message> <message> <source>Formattoolbar</source> <translation type="unfinished"></translation> </message> <message> <source>&Bold</source> <translation>&Gras</translation> </message> <message> <source>&Italic</source> <translation>&Italique</translation> </message> <message> <source>&Underline</source> <translation>&Souligné</translation> </message> <message> <source>&Strike Out</source> <translation>&Barré</translation> </message> <message> <source>&Hyperlink</source> <translation>&Lien hypertexte</translation> </message> <message> <source>&Clear formatting</source> <translation>&Supprimer le formattage</translation> </message> <message> <source>&Text color...</source> <translation>Couleur du texte...</translation> </message> <message> <source>&Background color...</source> <translation>Couleur d'arrière plan...</translation> </message> <message> <source>Insert hyperlink</source> <translation>Insérer lien hypertexte</translation> </message> <message> <source>Addr&ess:</source> <translation>&Adresse</translation> </message> <message> <source>Bullet point</source> <translation>Liste à puce</translation> </message> </context> <context> <name>TextSearchToolbar</name> <message> <source>Search bar</source> <translation>Barre de recherche</translation> </message> <message> <source>Searchtoolbar</source> <translation type="unfinished"></translation> </message> <message> <source>Enter search argument</source> <translation>Entrer un argument de recherche</translation> </message> <message> <source>Find &previous</source> <translation>Précédent</translation> </message> <message> <source>Find &next</source> <translation>Suivant</translation> </message> <message> <source>&Case sensitive</source> <translation>Sensible à la casse</translation> </message> </context> <context> <name>Trash</name> <message> <source>Trash</source> <translation>Corbeille</translation> </message> <message> <source>&Restore</source> <translation>&Restaurer</translation> </message> <message> <source>&Delete</source> <translation>&Supprimer</translation> </message> <message> <source>Select the notes you want to delete or restore</source> <translation>Selection des notes que vous souhaitez supprimer ou restaurer</translation> </message> <message> <source>Preview</source> <translation>Prévisualisation</translation> </message> <message> <source>Deleted notes</source> <translation>Notes effacées</translation> </message> <message> <source>Deleting notes</source> <translation>Suppression des notes</translation> </message> <message> <source>Are you sure you want to permanently delete the selected notes?</source> <translation>Etes vous sures de vouloir supprimer les notes séléctionnées</translation> </message> </context> <context> <name>Welcome</name> <message> <source>Welcome to nobleNote</source> <translation>Bienvenu sur nobleNote</translation> </message> <message> <source>Welcome to nobleNote! This is the first time that nobleNote has been started. You can choose a directory where the notes will be saved in.</source> <translation>Bienvenu sur nobleNote! C'est la première fois que vous démarrez nobleNote. Vous pouvez choisir un dossier où stocker vos notes.</translation> </message> <message> <source>&Browse</source> <translation>&Parcourir</translation> </message> <message> <source>Choose a directory</source> <translation>Choisir un dossier</translation> </message> <message> <source>Welcome to nobleNote! This is the first time that nobleNote has been started. You are encouraged to use the standard path, but you can also choose a directory located on the system. Please note that the notes won't be saved on your drive if you do.</source> <translation type="vanished">Bienvenu sur nobleNote! This is the first time that nobleNote has been started. Vous êtes encouragé à uiliser le chemin standard, mais vous pouvez choisir un dossier du système. Notez que les notes ne seront pas sauvées sur votre disque dans le cas échéant.</translation> </message> <message> <source>Welcome to nobleNote! The set path for the notes does not exist. Maybe it has been moved or renamed. You can choose a new directory where the notes are or where they will be saved in.</source> <translation>Bienvenu sur nobleNote! Le chemin renseigné pour les notes n'existe pas. Peut être a t il était supprimé ou renommé. Vous pouvez choisir un nouveau répertoire où stocker les notes.</translation> </message> <message> <source>Welcome to nobleNote! The path where the notes are located is not writable. Maybe your drive is running in read only mode.</source> <translation>Bienvenu sur nobleNote! Le chemin où spont sauvegardées les notes n'est pas inscriptible. peut etre votre disque est en lecture seule.</translation> </message> <message> <source>Welcome to nobleNote! The path where the notes are located is not writable. You can choose a new directory where the notes will be saved in. Otherwise changes might not be saved.</source> <translation>Bienvenu sur nobleNote! Le chemin où spont sauvegardées les notes n'est pas inscriptible. Vous pouvez choisir un nouveau répertoire où stocker les notes.</translation> </message> <message> <source>Welcome to nobleNote! This is the first time that nobleNote has been started. This is the portable edition of nobleNote. You are encouraged to use the default path, but you can also choose any other directory.</source> <translation type="unfinished"></translation> </message> </context> </TS> ���������������������������������������������������������������������������noblenote-1.2.0/src/translations/noblenote_de.ts����������������������������������������������������0000664�0001750�0001750�00000053526�13502176303�021033� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> <TS version="2.1" language="de_DE"> <context> <name>Backup</name> <message> <source>Indexing notes...</source> <translation>Indiziere Notizen...</translation> </message> <message> <source>Indexing trash...</source> <translation>Indiziere Papierkorb...</translation> </message> </context> <context> <name>FileSystemModel</name> <message> <source>Files could not be dropped</source> <translation>Dateien konnten nicht abgelegt werden</translation> </message> <message> <source>The files could not be dropped because files of the same names are already existing in this notebook: %1</source> <translation>Die Dateien konnten nicht abgelegt werden da in diesem Verzeichnis bereits Dateien mit diesen Namen existieren: %1</translation> </message> <message> <source>The file could not be dropped because a file with the same name already exists in this notebook: %1</source> <translation>Die Datei konnten nicht abgelegt werden da in diesem Verzeichnis bereits eine Datei mit diesen Namen existiert: %1</translation> </message> <message> <source>File could not be dropped</source> <translation>Datei konnte nicht abgelegt werden</translation> </message> </context> <context> <name>HtmlNoteWriter</name> <message> <source>default</source> <translation>Standard</translation> </message> <message> <source>untitled note</source> <translation>Unbenannte Notiz</translation> </message> </context> <context> <name>MainWindow</name> <message> <source>&Minimize</source> <translation>&Minimieren</translation> </message> <message> <source>&Quit</source> <translation>&Beenden</translation> </message> <message> <source>default</source> <translation>Vorgabe</translation> </message> <message> <source>&Restore</source> <translation>&Wiederherstellen</translation> </message> <message> <source>Note does not exist</source> <translation>Notiz existiert nicht</translation> </message> <message> <source>new note</source> <translation>Neue Notiz</translation> </message> <message> <source>new note (%1)</source> <translation>Neue Notiz (%1)</translation> </message> <message> <source>Type to search for notes</source> <translation>Zum suchen nach Notizen tippen</translation> </message> <message> <source>The selected note cannot be opened because it has been moved or renamed!</source> <translation>Die ausgewählte Notiz kann nicht geöffnet werden, weil sie verschoben oder umbenannt wurde!</translation> </message> <message> <source>new notebook</source> <translation>Neues Notizbuch</translation> </message> <message> <source>new notebook (%1)</source> <translation>Neues Notizbuch (%1)</translation> </message> <message> <source>Delete Notebook</source> <translation>Lösche Notizbuch</translation> </message> <message> <source>Are you sure you want to delete the notebook "%1" and move all containing notes to the trash?</source> <translation>Sind Sie sicher, dass Sie das Notizbuch "%1" löschen und alle enthaltenen Notizen in den Papierkorb schieben wollen?</translation> </message> <message> <source>Notebook could not be deleted</source> <translation>Notizbuch konnte nicht gelöscht werden</translation> </message> <message> <source>The notebook could not be deleted because one notebook must remain</source> <translation>Das Notizbuch konnte nicht gelöscht werden da mindestens ein Notizbuch vorhanden sein muss</translation> </message> <message> <source>The notebook could not be deleted because one or more notes inside the notebook could not be deleted.</source> <translation>Das Notizbuch konnte nicht gelöscht werden, da eine oder mehrere Notizen in dem Notizbuch nicht gelöscht werden konnten.</translation> </message> <message> <source>Delete Note</source> <translation>Lösche Notiz</translation> </message> <message> <source>Are you sure you want to move the note %1 to the trash?</source> <translation>Sind Sie sicher, dass Sie die Notiz %1 in den Papierkob schieben wollen?</translation> </message> <message> <source>Delete Multiple Notes</source> <translation>Löschen mehrerer Notizen bestätigen</translation> </message> <message> <source>&Open notes</source> <translation>Notiz &öffnen</translation> </message> <message> <source>&Delete notes</source> <translation>Notizen &löschen</translation> </message> <message> <source>Show &Source</source> <translation>&Quelltext anzeigen</translation> </message> <message> <source>Copy error</source> <translation>Fehler beim Kopieren</translation> </message> <message> <source>Notes of the same names already exist in this notebook: %1</source> <translation>In diesem Notizbuch existieren bereits Notizen mit diesem Namen: %1</translation> </message> <message> <source>About </source> <translation>Über </translation> </message> <message> <source>nobleNote</source> <translation>nobleNote</translation> </message> <message> <source>&File</source> <translation>&Datei</translation> </message> <message> <source>&Settings</source> <translation>&Einstellungen</translation> </message> <message> <source>&Help</source> <translation>&Hilfe</translation> </message> <message> <source>&View</source> <translation>&Ansicht</translation> </message> <message> <source>&Edit</source> <translation>&Bearbeiten</translation> </message> <message> <source>Ctrl+Q</source> <translation>Strg+Q</translation> </message> <message> <source>&Import</source> <translation>&Importieren</translation> </message> <message> <source>&Configure...</source> <translation>&Anpassen...</translation> </message> <message> <source>Ctrl+P</source> <translation>Strg+P</translation> </message> <message> <source>&About</source> <translation>&Über</translation> </message> <message> <source>&Show toolbar</source> <translation>&Werkzeugleiste anzeigen</translation> </message> <message> <source>Ctrl+Shift+T</source> <translation>Strg+Umschalt+T</translation> </message> <message> <source>&Trash</source> <translation>&Papierkorb</translation> </message> <message> <source>Ctrl+T</source> <translation>Strg+T</translation> </message> <message> <source>&History</source> <translation>&Verlauf</translation> </message> <message> <source>Ctrl+Shift+H</source> <translation>Strg+Umschalt+H</translation> </message> <message> <source>&New notebook</source> <translation>&Neues Notizbuch</translation> </message> <message> <source>Ctrl+N</source> <translation>Strg+N</translation> </message> <message> <source>&Rename notebook</source> <translation>Notizbuch &umbenennen</translation> </message> <message> <source>Ctrl+R</source> <translation>Strg+R</translation> </message> <message> <source>&Delete notebook</source> <translation>Notizbuch &löschen</translation> </message> <message> <source>Ctrl+D</source> <translation>Strg+D</translation> </message> <message> <source>&New note</source> <translation>&Neue Notiz</translation> </message> <message> <source>Ctrl+Shift+N</source> <translation>Strg+Umschalt+N</translation> </message> <message> <source>&Rename note</source> <translation>Notiz &umbenennen</translation> </message> <message> <source>Ctrl+Shift+R</source> <translation>Strg+Umschalt+R</translation> </message> <message> <source>&Delete note</source> <translation>Notiz &löschen</translation> </message> <message> <source>Ctrl+Shift+D</source> <translation>Strg+Umschalt+D</translation> </message> <message> <source>&Cut</source> <translation>&Ausschneiden</translation> </message> <message> <source>Ctrl+X</source> <translation>Strg+X</translation> </message> <message> <source>&Paste</source> <translation>&Einfügen</translation> </message> <message> <source>Ctrl+V</source> <translation>Strg+V</translation> </message> <message> <source>Are you sure you want to move these %1 notes to the trash? %2</source> <translation>Sind Sie sicher, dass Sie dise %1 Notizen in den Papierkorb verschieben wollen? %2</translation> </message> <message> <source>Open recent</source> <translation type="unfinished"></translation> </message> <message> <source>a</source> <translation type="unfinished"></translation> </message> <message> <source><h1>%1 version %2</h1><p><b>%1</b> is a note taking application</p><p>Copyright (C) %3 Christian Metscher, Fabian Deuchler</p><p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p></source> <translation type="unfinished"></translation> </message> </context> <context> <name>Note</name> <message> <source>Note-Editor</source> <translation>Notiz-Editor</translation> </message> <message> <source>Hide Toolbars</source> <translation type="unfinished"></translation> </message> <message> <source>Show Toolbars</source> <translation type="unfinished"></translation> </message> </context> <context> <name>NoteDescriptor</name> <message> <source>Note does not exist</source> <translation>Notiz existiert nicht</translation> </message> <message> <source>This note does not longer exist. Do you want to keep the editor open?</source> <translation>Diese Notiz existiert nicht mehr. Wollen Sie den Notizeditor geöffnet lassen?</translation> </message> <message> <source>Note modified</source> <translation>Die Notiz wurde modifiziert</translation> </message> <message> <source>This note has been modified by another instance of %1. Should the note be saved under a different name? Else the note will be reloaded.</source> <translation>Diese Notiz wurde durch eine andere Sitzung von %1 modifiziert. Soll die Notiz unter einem anderen Namen gespeichert werden? Andernfalls wird die Notiz neu geladen.</translation> </message> </context> <context> <name>NoteImporter</name> <message> <source>Select one or more tomboy or gnote notes</source> <translation>Wählen Sie eine oder mehrere Tomboy- oder Gnote-Notizen aus</translation> </message> <message> <source>Notes</source> <translation>Notizen</translation> </message> <message> <source>Importing notes...</source> <translation>Importiere Notizen...</translation> </message> </context> <context> <name>Preferences</name> <message> <source>Preferences</source> <translation>Einstellungen</translation> </message> <message> <source>&Browse ...</source> <translation>&Durchsuchen...</translation> </message> <message> <source>Note editor default font:</source> <translation>Notizeditor Standardschriftart:</translation> </message> <message> <source>Note editor default size:</source> <translation>Notizeditor Standardgröße:</translation> </message> <message> <source>&Show "Show Source" menu entry</source> <translation type="unfinished"></translation> </message> <message> <source>&Close to tray</source> <translation type="unfinished"></translation> </message> <message> <source>Automatically convert non-HTML notes to the HTML format. If disabled, non-HTML notes are opened read only.</source> <translation>Konvertiere nicht-HTML Notizen automatisch in das HTML-Format. Wenn deaktiviert, werden nicht-HTML Notizen schreibgeschützt geöffnet.</translation> </message> <message> <source>Warning</source> <translation>Warnung</translation> </message> <message> <source>Could not write settings!</source> <translation>Einstellungen konnten nicht geschrieben werden!</translation> </message> <message> <source>Keep old trash folder?</source> <translation>Alten Papierkorb-Ordner behalten?</translation> </message> <message> <source>Do you want to keep the old trash folder associated with the path %1? (You will be able to see the old files in the trash again if you change back to the previous directory.)</source> <translation type="unfinished"></translation> </message> <message> <source>Couldn't delete trash folder</source> <translation>Konnte das Papierkorb-Ordner nicht löschen</translation> </message> <message> <source>Could not delete the trash folder!</source> <translation>Konnte den Papierkorb-Ordner nicht löschen!</translation> </message> <message> <source>Open Directory</source> <translation>Ordner öffnen</translation> </message> <message> <source>The path "%1" is not writable!</source> <translation>Der Pfad "%1" ist nicht beschreibbar!</translation> </message> <message> <source>No Write Access</source> <translation>Kein Schreibzugriff</translation> </message> <message> <source>Width:</source> <translation>Breite: </translation> </message> <message> <source>Height:</source> <translation>Höhe: </translation> </message> <message> <source>&Touch screen scrolling</source> <translation type="unfinished"></translation> </message> <message> <source>Convert notes to the &HTML format</source> <translation type="unfinished"></translation> </message> <message> <source>Number of recently opened notes</source> <translation type="unfinished"></translation> </message> <message> <source>Root directory:</source> <translation type="unfinished"></translation> </message> <message> <source>Backup directroy:</source> <translation type="unfinished"></translation> </message> <message> <source>(Will be updated after pressing OK.)</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TextFormattingToolbar</name> <message> <source>Format actions</source> <translation>Formatierungs-Aktionen</translation> </message> <message> <source>Formattoolbar</source> <translation>Formatierungs-Werkzeugleiste</translation> </message> <message> <source>&Bold</source> <translation>&Fett</translation> </message> <message> <source>&Italic</source> <translation>&Kursiv</translation> </message> <message> <source>&Underline</source> <translation>&Unterstrichen</translation> </message> <message> <source>&Strike Out</source> <translation>&Durchgestrichen</translation> </message> <message> <source>&Hyperlink</source> <translation>&Hyperlink</translation> </message> <message> <source>&Clear formatting</source> <translation>Formatierung &löschen</translation> </message> <message> <source>&Text color...</source> <translation>&Textfarbe...</translation> </message> <message> <source>&Background color...</source> <translation>&Hintergrundfarbe...</translation> </message> <message> <source>Insert hyperlink</source> <translation>Hyperlink einfügen</translation> </message> <message> <source>Addr&ess:</source> <translation>&Adresse:</translation> </message> <message> <source>Bullet point</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TextSearchToolbar</name> <message> <source>Search bar</source> <translation>Suchleiste</translation> </message> <message> <source>Searchtoolbar</source> <translation>Suchleiste</translation> </message> <message> <source>Enter search argument</source> <translation>Suchbegriff eingeben</translation> </message> <message> <source>Find &previous</source> <translation>&aufwärts</translation> </message> <message> <source>Find &next</source> <translation>a&bwärts</translation> </message> <message> <source>&Case sensitive</source> <translation>&Groß- und Kleinschreibung beachten</translation> </message> </context> <context> <name>Trash</name> <message> <source>Trash</source> <translation>Papierkorb</translation> </message> <message> <source>&Restore</source> <translation>&Wiederherstellen</translation> </message> <message> <source>&Delete</source> <translation>&Löschen</translation> </message> <message> <source>Select the notes you want to delete or restore</source> <translation>Wählen Sie die Notizen aus, die Sie Löschen oder Wiederherstellen möchten</translation> </message> <message> <source>Preview</source> <translation>Vorschau</translation> </message> <message> <source>Deleted notes</source> <translation>Gelöschte Notizen</translation> </message> <message> <source>Deleting notes</source> <translation>Löschen von Notizen</translation> </message> <message> <source>Are you sure you want to permanently delete the selected notes?</source> <translation type="unfinished"></translation> </message> </context> <context> <name>Welcome</name> <message> <source>Welcome to nobleNote</source> <translation>Willkommen bei nobleNote</translation> </message> <message> <source>Welcome to nobleNote! This is the first time that nobleNote has been started. You can choose a directory where the notes will be saved in.</source> <translation>Willkommen bei nobleNote! Dies ist das erste Mal, dass nobleNote gestartet wurde. Sie können ein Verzeichnis wählen, wo die Notizen gespeichert werden.</translation> </message> <message> <source>&Browse</source> <translation>&Duchsuchen</translation> </message> <message> <source>Choose a directory</source> <translation>Ordner auswählen</translation> </message> <message> <source>Welcome to nobleNote! This is the first time that nobleNote has been started. You are encouraged to use the standard path, but you can also choose a directory located on the system. Please note that the notes won't be saved on your drive if you do.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The set path for the notes does not exist. Maybe it has been moved or renamed. You can choose a new directory where the notes are or where they will be saved in.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The path where the notes are located is not writable. Maybe your drive is running in read only mode.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The path where the notes are located is not writable. You can choose a new directory where the notes will be saved in. Otherwise changes might not be saved.</source> <translation type="unfinished"></translation> </message> </context> </TS> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/translations/noblenote_pl.ts����������������������������������������������������0000664�0001750�0001750�00000056343�13502176303�021056� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> <TS version="2.1" language="pl"> <context> <name>Backup</name> <message> <source>Indexing notes...</source> <translation>Indeksowanie notatek...</translation> </message> <message> <source>Indexing trash...</source> <translation>Indeksowanie kosza...</translation> </message> </context> <context> <name>FileSystemModel</name> <message> <source>Files could not be dropped</source> <translation>Pliki nie mogły być upuszczone</translation> </message> <message> <source>The files could not be dropped because files of the same names are already existing in this notebook: %1</source> <translation>Pliki nie mogły zostać upuszczone, ponieważ pliki z takimi samymi nazwami już istnieją w tym notesie: %1</translation> </message> <message> <source>The file could not be dropped because a file with the same name already exists in this notebook: %1</source> <translation>Plik nie mógł zostać upuszczony, ponieważ plik z taką samą nazwą już istnieje w tym notesie: %1</translation> </message> <message> <source>File could not be dropped</source> <translation>Plik nie mógł zostać upuszczony</translation> </message> </context> <context> <name>HtmlNoteWriter</name> <message> <source>default</source> <translation>domyślny</translation> </message> <message> <source>untitled note</source> <translation>notatka bez tytułu</translation> </message> </context> <context> <name>MainWindow</name> <message> <source>&Minimize</source> <translation>&Minimalizuj</translation> </message> <message> <source>&Quit</source> <translation>&Wyjdź</translation> </message> <message> <source>default</source> <translation>domyślny</translation> </message> <message> <source>&Restore</source> <translation>&Przywróć</translation> </message> <message> <source>Note does not exist</source> <translation>Notatka nie istnieje</translation> </message> <message> <source>new note</source> <translation>nowa notatka</translation> </message> <message> <source>new note (%1)</source> <translation>nowa notatka (%1)</translation> </message> <message> <source>Type to search for notes</source> <translation>Szukaj notatek</translation> </message> <message> <source>The selected note cannot be opened because it has been moved or renamed!</source> <translation>Nie można otworzyć zaznaczonej notatki, ponieważ została przeniesiona lub jej nazwa uległa zmianie!</translation> </message> <message> <source>new notebook</source> <translation>nowy notes</translation> </message> <message> <source>new notebook (%1)</source> <translation>nowy notes (%1)</translation> </message> <message> <source>Delete Notebook</source> <translation>Usuń notes</translation> </message> <message> <source>Are you sure you want to delete the notebook "%1" and move all containing notes to the trash?</source> <translation>Jesteś pewien, że chcesz usunąć notes "%1" i przenieść całą jego zawartość do kosza?</translation> </message> <message> <source>Notebook could not be deleted</source> <translation>Nie można usunąć notesu</translation> </message> <message> <source>The notebook could not be deleted because one notebook must remain</source> <translation>Nie można usunąć tego notesu, ponieważ jeden notes musi pozostać</translation> </message> <message> <source>The notebook could not be deleted because one or more notes inside the notebook could not be deleted.</source> <translation>Notes nie może zostać usunięty, ponieważ nie można usunąć jednej lub więcej notatek w tym notesie.</translation> </message> <message> <source>Delete Note</source> <translation>Usuń notatkę</translation> </message> <message> <source>Are you sure you want to move the note %1 to the trash?</source> <translation>Jesteś pewien, że chcesz przenieść notatkę %1 do kosza?</translation> </message> <message> <source>Delete Multiple Notes</source> <translation>Usuń wiele notatek</translation> </message> <message> <source>&Open notes</source> <translation>&Otwórz notatki</translation> </message> <message> <source>&Delete notes</source> <translation>&Usuń notatki</translation> </message> <message> <source>Show &Source</source> <translation>Pokaż &Źródło</translation> </message> <message> <source>Copy error</source> <translation>Błąd kopiowania</translation> </message> <message> <source>Notes of the same names already exist in this notebook: %1</source> <translation>Notatki o tych samych nazwach już istnieją w tym notesie: %1</translation> </message> <message> <source>About </source> <translation>O programie </translation> </message> <message> <source>nobleNote</source> <translation>nobleNote</translation> </message> <message> <source>&File</source> <translation>&Plik</translation> </message> <message> <source>&Settings</source> <translation>&Ustawienia</translation> </message> <message> <source>&Help</source> <translation>&Pomoc</translation> </message> <message> <source>&View</source> <translation>&Widok</translation> </message> <message> <source>&Edit</source> <translation>&Edycja</translation> </message> <message> <source>Ctrl+Q</source> <translation>Ctrl+Q</translation> </message> <message> <source>&Import</source> <translation>&Import</translation> </message> <message> <source>&Configure...</source> <translation>&Konfiguracja...</translation> </message> <message> <source>Ctrl+P</source> <translation>Ctrl+P</translation> </message> <message> <source>&About</source> <translation>&O programie</translation> </message> <message> <source>&Show toolbar</source> <translation>&Pokaż pasek narzędzi</translation> </message> <message> <source>Ctrl+Shift+T</source> <translation>Ctrl+Shift+T</translation> </message> <message> <source>&Trash</source> <translation>&Kosz</translation> </message> <message> <source>Ctrl+T</source> <translation>Ctrl+T</translation> </message> <message> <source>&History</source> <translation>&Historia</translation> </message> <message> <source>Ctrl+Shift+H</source> <translation>Ctrl+Shift+H</translation> </message> <message> <source>&New notebook</source> <translation>&Nowy notes</translation> </message> <message> <source>Ctrl+N</source> <translation>Ctrl+N</translation> </message> <message> <source>&Rename notebook</source> <translation>&Zmień nazwę notesu</translation> </message> <message> <source>Ctrl+R</source> <translation>Ctrl+R</translation> </message> <message> <source>&Delete notebook</source> <translation>&Usuń notes</translation> </message> <message> <source>Ctrl+D</source> <translation>Ctrl+D</translation> </message> <message> <source>&New note</source> <translation>&Nowa notatka</translation> </message> <message> <source>Ctrl+Shift+N</source> <translation>Ctrl+Shift+N</translation> </message> <message> <source>&Rename note</source> <translation>&Zmień nazwę notatki</translation> </message> <message> <source>Ctrl+Shift+R</source> <translation>Ctrl+Shift+R</translation> </message> <message> <source>&Delete note</source> <translation>&Usuń notatkę</translation> </message> <message> <source>Ctrl+Shift+D</source> <translation>Ctrl+Shift+D</translation> </message> <message> <source>&Cut</source> <translation>&Wytnij</translation> </message> <message> <source>Ctrl+X</source> <translation>Ctrl+X</translation> </message> <message> <source>&Paste</source> <translation>&Wklej</translation> </message> <message> <source>Ctrl+V</source> <translation>Ctrl+V</translation> </message> <message> <source>Are you sure you want to move these %1 notes to the trash? %2</source> <translation>Jesteś pewien, że chcesz przenieść te %1 notatek do kosza? %2</translation> </message> <message> <source>Open recent</source> <translation type="unfinished"></translation> </message> <message> <source>a</source> <translation type="unfinished"></translation> </message> <message> <source><h1>%1 version %2</h1><p><b>%1</b> is a note taking application</p><p>Copyright (C) %3 Christian Metscher, Fabian Deuchler</p><p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p></source> <translation type="unfinished"><h1>%1 version %2</h1><p><b>%1</b> jest aplikacją do robienia notatek</p><p>Copyright (C) %3 Christian Metscher, Fabian Deuchler</p><p>Każda osoba nabywająca to oprogramowanie i powiązane pliki dokumentacji (dalej "Oprogramowanie") ninejszym otrzymuje zezwolenie na ingerowanie w Oprogramowanie bez ograniczeń, włączając brak ograniczeń praw do kopiowania, modyfikowania, scalania, publikowania, dystrybucji, sublicencjowania, i/lub sprzedawania kopii Oprogramowania i udzielania pozwolenia na robienie tego samego osobom, którym Oprogramowanie jest dostarczane, pod następującymi warunkami:</p>Powyższa informacja o prawach autorskich winna być zawarta we wszystkich kopiach bądź znacznych fragmentach Oprogramowania.<p>OPROGRAMOWANIE JEST DOSTARCZANE "W OBECNYM STANIE RZECZY", BEZ JAKIEJKOLWIEK GWARANCJI, WYRAŹNEJ LUB DOROZUMIANEJ, NIE WYŁĄCZAJĄC GWARANCJI PRZYDATNOŚCI HANDLOWEJ LUB PRZYDATNOŚCI DO OKREŚLONYCH CELÓW A TAKŻE BRAKU WAD PRAWNYCH. W ŻADNYM PRZYPADKU TWÓRCA LUB POSIADACZ PRAW AUTORSKICH NIE MOŻE PONOSIĆ ODPOWIEDZIALNOŚCI Z TYTUŁU ROSZCZEŃ LUB WYRZĄDZONEJ SZKODY A TAKŻE ŻADNEJ INNEJ ODPOWIEDZIALNOŚCI CZY TO WYNIKAJĄCEJ Z UMOWY, DELIKTU, CZY JAKIEJKOLWIEK INNEJ PODSTAWY POWSTAŁEJ W ZWIĄZKU Z OPROGRAMOWANIEM LUB UŻYTKOWANIEM GO LUB WPROWADZANIEM GO DO OBROTU.</p> {1>?} {1 ?} {2<?} {1>?} {1<?} {%3 ?}</translation> </message> </context> <context> <name>Note</name> <message> <source>Note-Editor</source> <translation>Edytor notatek</translation> </message> <message> <source>Hide Toolbars</source> <translation type="unfinished"></translation> </message> <message> <source>Show Toolbars</source> <translation type="unfinished"></translation> </message> </context> <context> <name>NoteDescriptor</name> <message> <source>Note does not exist</source> <translation>Notatka nie istnieje</translation> </message> <message> <source>This note does not longer exist. Do you want to keep the editor open?</source> <translation>Ta notatka już nie istnieje. Czy chcesz pozostawić edytor otwarty?</translation> </message> <message> <source>Note modified</source> <translation>Notatka zmodyfikowana</translation> </message> <message> <source>This note has been modified by another instance of %1. Should the note be saved under a different name? Else the note will be reloaded.</source> <translation>Ta notatka została zmodyfikowana przez inny proces %1. Zapisać notatkę pod inną nazwą? W przeciwnym razie notatka zostanie załadowana ponownie.</translation> </message> </context> <context> <name>NoteImporter</name> <message> <source>Select one or more tomboy or gnote notes</source> <translation>Zaznacz jedną lub więcej notatek aplikacji tomboy lub gnote</translation> </message> <message> <source>Notes</source> <translation>Notatki</translation> </message> <message> <source>Importing notes...</source> <translation>Importowanie notatek...</translation> </message> </context> <context> <name>Preferences</name> <message> <source>Preferences</source> <translation>Preferencje</translation> </message> <message> <source>&Browse ...</source> <translation>&Przeglądaj ...</translation> </message> <message> <source>Note editor default font:</source> <translation>Domyślna czcionka edytora notatek:</translation> </message> <message> <source>Note editor default size:</source> <translation>Domyślny rozmiar edytora notatek:</translation> </message> <message> <source>&Show "Show Source" menu entry</source> <translation>&Pokazuj "Pokaż źródło" w menu</translation> </message> <message> <source>&Close to tray</source> <translation>&Zamykaj do obszaru powiadomień</translation> </message> <message> <source>Automatically convert non-HTML notes to the HTML format. If disabled, non-HTML notes are opened read only.</source> <translation>Automatycznie konwertuj notatki do formatu HTML. Jeśli wyłączone, notatki w formatach innych niż HTML będą otwierane tylko do odczytu.</translation> </message> <message> <source>Warning</source> <translation>Ostrzeżenie</translation> </message> <message> <source>Could not write settings!</source> <translation>Nie można zapisać ustawień!</translation> </message> <message> <source>Keep old trash folder?</source> <translation>Zachować stary katalog kosza?</translation> </message> <message> <source>Do you want to keep the old trash folder associated with the path %1? (You will be able to see the old files in the trash again if you change back to the previous directory.)</source> <translation>Czy chcesz zachować powiązanie starego katalogu kosza ze ścieżką %1? (Będziesz mógł znów zobaczyć stare pliki w koszu, jeśli przełączysz spowrotem na poprzedni katalog.)</translation> </message> <message> <source>Couldn't delete trash folder</source> <translation>Nie można usunąć katalogu kosza</translation> </message> <message> <source>Could not delete the trash folder!</source> <translation>Nie można usunąć katalogu kosza!</translation> </message> <message> <source>Open Directory</source> <translation>Otwórz katalog</translation> </message> <message> <source>The path "%1" is not writable!</source> <translation>Ścieżka "%1" nie jest zapisywalna!</translation> </message> <message> <source>No Write Access</source> <translation>Brak praw do zapisu</translation> </message> <message> <source>Width:</source> <translation>Szerokość: </translation> </message> <message> <source>Height:</source> <translation>Wysokość: </translation> </message> <message> <source>&Touch screen scrolling</source> <translation>&Przewijanie dotykowe</translation> </message> <message> <source>Convert notes to the &HTML format</source> <translation type="unfinished"></translation> </message> <message> <source>Number of recently opened notes</source> <translation type="unfinished"></translation> </message> <message> <source>Root directory:</source> <translation type="unfinished"></translation> </message> <message> <source>Backup directroy:</source> <translation type="unfinished"></translation> </message> <message> <source>(Will be updated after pressing OK.)</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TextFormattingToolbar</name> <message> <source>Format actions</source> <translation>Formatowanie</translation> </message> <message> <source>Formattoolbar</source> <translation>Pasek narzędzi formatowania</translation> </message> <message> <source>&Bold</source> <translation>&Pogrubienie</translation> </message> <message> <source>&Italic</source> <translation>&Kursywa</translation> </message> <message> <source>&Underline</source> <translation>&Podkreślenie</translation> </message> <message> <source>&Strike Out</source> <translation>&Przekreślenie</translation> </message> <message> <source>&Hyperlink</source> <translation>&Hiperłącze</translation> </message> <message> <source>&Clear formatting</source> <translation>&Wyczyść formatowanie</translation> </message> <message> <source>&Text color...</source> <translation>&Kolor tekstu</translation> </message> <message> <source>&Background color...</source> <translation>&Kolor tła</translation> </message> <message> <source>Insert hyperlink</source> <translation>Wstaw hiperłącze</translation> </message> <message> <source>Addr&ess:</source> <translation>Adr&es:</translation> </message> <message> <source>Bullet point</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TextSearchToolbar</name> <message> <source>Search bar</source> <translation>Pasek wyszukiwania</translation> </message> <message> <source>Searchtoolbar</source> <translation>Pasek narzędzi wyszukiwania</translation> </message> <message> <source>Enter search argument</source> <translation>Wprowadź argument do wyszukiwania</translation> </message> <message> <source>Find &previous</source> <translation>Znajdź &poprzedni</translation> </message> <message> <source>Find &next</source> <translation>Znajdź &następny</translation> </message> <message> <source>&Case sensitive</source> <translation>&Rozróżnaj wielkość znaków</translation> </message> </context> <context> <name>Trash</name> <message> <source>Trash</source> <translation>Kosz</translation> </message> <message> <source>&Restore</source> <translation>&Przywróć</translation> </message> <message> <source>&Delete</source> <translation>&Usuń</translation> </message> <message> <source>Select the notes you want to delete or restore</source> <translation>Zaznacz notatki, które chcesz usunąć lub przywrócić</translation> </message> <message> <source>Preview</source> <translation>Podgląd</translation> </message> <message> <source>Deleted notes</source> <translation>Usunięte notatki</translation> </message> <message> <source>Deleting notes</source> <translation>Usuwanie notatek</translation> </message> <message> <source>Are you sure you want to permanently delete the selected notes?</source> <translation type="unfinished"></translation> </message> </context> <context> <name>Welcome</name> <message> <source>Welcome to nobleNote</source> <translation>Witaj w nobleNote</translation> </message> <message> <source>Welcome to nobleNote! This is the first time that nobleNote has been started. You can choose a directory where the notes will be saved in.</source> <translation>Witaj w nobleNote! Program nobleNote został uruchomiony pierwszy raz. Możesz wybrać katalog, w którym twoje notatki będą zapisywane.</translation> </message> <message> <source>&Browse</source> <translation>&Przeglądaj</translation> </message> <message> <source>Choose a directory</source> <translation>Wybierz katalog</translation> </message> <message> <source>Welcome to nobleNote! This is the first time that nobleNote has been started. You are encouraged to use the standard path, but you can also choose a directory located on the system. Please note that the notes won't be saved on your drive if you do.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The set path for the notes does not exist. Maybe it has been moved or renamed. You can choose a new directory where the notes are or where they will be saved in.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The path where the notes are located is not writable. Maybe your drive is running in read only mode.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The path where the notes are located is not writable. You can choose a new directory where the notes will be saved in. Otherwise changes might not be saved.</source> <translation type="unfinished"></translation> </message> </context> </TS> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/translations/noblenote_ast.ts���������������������������������������������������0000664�0001750�0001750�00000052523�13502176303�021226� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> <TS version="2.1" language="ast"> <context> <name>Backup</name> <message> <source>Indexing notes...</source> <translation>Indexando les notes...</translation> </message> <message> <source>Indexing trash...</source> <translation>Indexando la basoria...</translation> </message> </context> <context> <name>FileSystemModel</name> <message> <source>Files could not be dropped</source> <translation>Nun se pudieron soltar los ficheros</translation> </message> <message> <source>The files could not be dropped because files of the same names are already existing in this notebook: %1</source> <translation>Nun se pudieron soltar los ficheros porque yá esisten ficheros colos mesmos nomes nesti cuadernu de notes: %1</translation> </message> <message> <source>The file could not be dropped because a file with the same name already exists in this notebook: %1</source> <translation>Nun se pudo soltar el ficheru porque yá esiste un ficheru col mesmu nome nesti cuadernu de notes: %1</translation> </message> <message> <source>File could not be dropped</source> <translation>Nun se pudo soltar el ficheru</translation> </message> </context> <context> <name>HtmlNoteWriter</name> <message> <source>default</source> <translation>predetermináu</translation> </message> <message> <source>untitled note</source> <translation>nota ensin títulu</translation> </message> </context> <context> <name>MainWindow</name> <message> <source>&Minimize</source> <translation>A&menorgar</translation> </message> <message> <source>&Quit</source> <translation>&Colar</translation> </message> <message> <source>default</source> <translation>predetermináu</translation> </message> <message> <source>&Restore</source> <translation>&Restaurar</translation> </message> <message> <source>Note does not exist</source> <translation>La nota nun esiste</translation> </message> <message> <source>new note</source> <translation>nota nueva</translation> </message> <message> <source>new note (%1)</source> <translation>nota nueva (%1)</translation> </message> <message> <source>Type to search for notes</source> <translation>Escribi pa guetar notes</translation> </message> <message> <source>The selected note cannot be opened because it has been moved or renamed!</source> <translation>¡La nota seleicionada nun se pue abrir porque se movió o camudó de nome!</translation> </message> <message> <source>new notebook</source> <translation>cuadernu de notes nuevu</translation> </message> <message> <source>new notebook (%1)</source> <translation>cuadernu de notes nuevu (%1)</translation> </message> <message> <source>Delete Notebook</source> <translation>Desaniciar esti cuadernu de notes</translation> </message> <message> <source>Are you sure you want to delete the notebook "%1" and move all containing notes to the trash?</source> <translation>¿Tas seguru de que quies desaniciar el cuadernu de notes "%1" y mover a la basoria toles notes que contién?</translation> </message> <message> <source>Notebook could not be deleted</source> <translation>El cuadernu de notes nun se pudo desaniciar</translation> </message> <message> <source>The notebook could not be deleted because one notebook must remain</source> <translation>El cuadernu de notes nun se pudo desaniciar porque tien de quedar un cuadernu</translation> </message> <message> <source>The notebook could not be deleted because one or more notes inside the notebook could not be deleted.</source> <translation>El cuadernu de notes nun se pudo desaniciar porque una o más notes del cuadernu nun se pudo desaniciar.</translation> </message> <message> <source>Delete Note</source> <translation>Desaniciar nota</translation> </message> <message> <source>Are you sure you want to move the note %1 to the trash?</source> <translation>¿Tas seguru de que quies mover la nota %1 a la basoria?</translation> </message> <message> <source>Delete Multiple Notes</source> <translation>Desaniciar múltiples notes</translation> </message> <message> <source>&Open notes</source> <translation>&Abrir notes</translation> </message> <message> <source>&Delete notes</source> <translation>&Desaniciar notes</translation> </message> <message> <source>Show &Source</source> <translation>Ver &fonte</translation> </message> <message> <source>Copy error</source> <translation>Copiar error</translation> </message> <message> <source>Notes of the same names already exist in this notebook: %1</source> <translation>Yá esisten notes colos mesmos nomes nesti cuadernu de notes: %1</translation> </message> <message> <source>About </source> <translation>Tocante a </translation> </message> <message> <source>nobleNote</source> <translation>nobleNote</translation> </message> <message> <source>&File</source> <translation>&Ficheru</translation> </message> <message> <source>&Settings</source> <translation>Preferencie&s</translation> </message> <message> <source>&Help</source> <translation>A&yuda</translation> </message> <message> <source>&View</source> <translation>&Ver</translation> </message> <message> <source>&Edit</source> <translation>&Editar</translation> </message> <message> <source>Ctrl+Q</source> <translation>Ctrl+Q</translation> </message> <message> <source>&Import</source> <translation>&Importar</translation> </message> <message> <source>&Configure...</source> <translation>&Configurar...</translation> </message> <message> <source>Ctrl+P</source> <translation>Ctrl+P</translation> </message> <message> <source>&About</source> <translation>Tocante &a</translation> </message> <message> <source>&Show toolbar</source> <translation>Amo&sar barra de ferramientes</translation> </message> <message> <source>Ctrl+Shift+T</source> <translation>Ctrl+Mayús+T</translation> </message> <message> <source>&Trash</source> <translation>&Papelera</translation> </message> <message> <source>Ctrl+T</source> <translation>Ctrl+T</translation> </message> <message> <source>&History</source> <translation>&Historial</translation> </message> <message> <source>Ctrl+Shift+H</source> <translation>Ctrl+Mayús+H</translation> </message> <message> <source>&New notebook</source> <translation>&Nuevu cuadernu de notes</translation> </message> <message> <source>Ctrl+N</source> <translation>Ctrl+N</translation> </message> <message> <source>&Rename notebook</source> <translation>&Renomar cuadernu de notes</translation> </message> <message> <source>Ctrl+R</source> <translation>Ctrl+R</translation> </message> <message> <source>&Delete notebook</source> <translation>&Desaniciar cuadernu de notes</translation> </message> <message> <source>Ctrl+D</source> <translation>Ctrl+D</translation> </message> <message> <source>&New note</source> <translation>&Nota nueva</translation> </message> <message> <source>Ctrl+Shift+N</source> <translation>Ctrl+Mayús+N</translation> </message> <message> <source>&Rename note</source> <translation>&Renomar nota</translation> </message> <message> <source>Ctrl+Shift+R</source> <translation>Ctrl+Mayús+R</translation> </message> <message> <source>&Delete note</source> <translation>&Desaniciar nota</translation> </message> <message> <source>Ctrl+Shift+D</source> <translation>Ctrl+Mayús+D</translation> </message> <message> <source>&Cut</source> <translation>&Cortar</translation> </message> <message> <source>Ctrl+X</source> <translation>Ctrl+X</translation> </message> <message> <source>&Paste</source> <translation>A&pegar</translation> </message> <message> <source>Ctrl+V</source> <translation>Ctrl+V</translation> </message> <message> <source>Are you sure you want to move these %1 notes to the trash? %2</source> <translation>¿Tas seguru de que quies mover les %1 notes a la basoria? %2</translation> </message> <message> <source>Open recent</source> <translation type="unfinished"></translation> </message> <message> <source>a</source> <translation type="unfinished"></translation> </message> <message> <source><h1>%1 version %2</h1><p><b>%1</b> is a note taking application</p><p>Copyright (C) %3 Christian Metscher, Fabian Deuchler</p><p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p></source> <translation type="unfinished"></translation> </message> </context> <context> <name>Note</name> <message> <source>Note-Editor</source> <translation>Editor de notes</translation> </message> <message> <source>Hide Toolbars</source> <translation type="unfinished"></translation> </message> <message> <source>Show Toolbars</source> <translation type="unfinished"></translation> </message> </context> <context> <name>NoteDescriptor</name> <message> <source>Note does not exist</source> <translation>La nota nun esiste</translation> </message> <message> <source>This note does not longer exist. Do you want to keep the editor open?</source> <translation>Esta nota yá nun esiste. ¿Quies caltener abiertu l'editor?</translation> </message> <message> <source>Note modified</source> <translation>Nota camudada</translation> </message> <message> <source>This note has been modified by another instance of %1. Should the note be saved under a different name? Else the note will be reloaded.</source> <translation>Esta nota camudóla otra instancia de %1. ¿Tien de guardase la nota baxo otru nome? D'otra miente la nota recargaráse.</translation> </message> </context> <context> <name>NoteImporter</name> <message> <source>Select one or more tomboy or gnote notes</source> <translation>Seleiciona una o más notes de tomboy o gnote</translation> </message> <message> <source>Notes</source> <translation>Notes</translation> </message> <message> <source>Importing notes...</source> <translation>Importando notes...</translation> </message> </context> <context> <name>Preferences</name> <message> <source>Preferences</source> <translation>Preferencies</translation> </message> <message> <source>&Browse ...</source> <translation>&Esaminar...</translation> </message> <message> <source>Note editor default font:</source> <translation>Fonte predeterminada del editor de notes:</translation> </message> <message> <source>Note editor default size:</source> <translation>Tamañu predetermináu del editor de notes:</translation> </message> <message> <source>&Show "Show Source" menu entry</source> <translation>Amo&sar la entrada de menú "Ver fonte"</translation> </message> <message> <source>&Close to tray</source> <translation>&Zarrar a la bandexa</translation> </message> <message> <source>Automatically convert non-HTML notes to the HTML format. If disabled, non-HTML notes are opened read only.</source> <translation type="unfinished"></translation> </message> <message> <source>Warning</source> <translation>Avisu</translation> </message> <message> <source>Could not write settings!</source> <translation type="unfinished"></translation> </message> <message> <source>Keep old trash folder?</source> <translation type="unfinished"></translation> </message> <message> <source>Do you want to keep the old trash folder associated with the path %1? (You will be able to see the old files in the trash again if you change back to the previous directory.)</source> <translation type="unfinished"></translation> </message> <message> <source>Couldn't delete trash folder</source> <translation type="unfinished"></translation> </message> <message> <source>Could not delete the trash folder!</source> <translation type="unfinished"></translation> </message> <message> <source>Open Directory</source> <translation>Abrir direutoriu</translation> </message> <message> <source>The path "%1" is not writable!</source> <translation type="unfinished"></translation> </message> <message> <source>No Write Access</source> <translation>Nun hai accesu d'escritura</translation> </message> <message> <source>Width:</source> <translation>Anchor: </translation> </message> <message> <source>Height:</source> <translation>Altor: </translation> </message> <message> <source>&Touch screen scrolling</source> <translation>&Desplazamientu con pantalla táctil</translation> </message> <message> <source>Convert notes to the &HTML format</source> <translation type="unfinished"></translation> </message> <message> <source>Number of recently opened notes</source> <translation type="unfinished"></translation> </message> <message> <source>Root directory:</source> <translation type="unfinished"></translation> </message> <message> <source>Backup directroy:</source> <translation type="unfinished"></translation> </message> <message> <source>(Will be updated after pressing OK.)</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TextFormattingToolbar</name> <message> <source>Format actions</source> <translation>Aiciones de formatu</translation> </message> <message> <source>Formattoolbar</source> <translation>Barraferramientesformatu</translation> </message> <message> <source>&Bold</source> <translation>&Negrina</translation> </message> <message> <source>&Italic</source> <translation>&Cursiva</translation> </message> <message> <source>&Underline</source> <translation>&Sorrayáu</translation> </message> <message> <source>&Strike Out</source> <translation>Tac&háu</translation> </message> <message> <source>&Hyperlink</source> <translation>&Hiperenllaz</translation> </message> <message> <source>&Clear formatting</source> <translation type="unfinished"></translation> </message> <message> <source>&Text color...</source> <translation>Color de &testu...</translation> </message> <message> <source>&Background color...</source> <translation>Color de &fondu...</translation> </message> <message> <source>Insert hyperlink</source> <translation>Inxertar hiperenllaz</translation> </message> <message> <source>Addr&ess:</source> <translation type="unfinished"></translation> </message> <message> <source>Bullet point</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TextSearchToolbar</name> <message> <source>Search bar</source> <translation>Barra de gueta</translation> </message> <message> <source>Searchtoolbar</source> <translation>Barraferramientesgueta</translation> </message> <message> <source>Enter search argument</source> <translation>Escribir l'argumentu de la gueta</translation> </message> <message> <source>Find &previous</source> <translation>Alcontrar &anterior</translation> </message> <message> <source>Find &next</source> <translation>Alcontrar &siguiente</translation> </message> <message> <source>&Case sensitive</source> <translation type="unfinished"></translation> </message> </context> <context> <name>Trash</name> <message> <source>Trash</source> <translation>Basoria</translation> </message> <message> <source>&Restore</source> <translation>&Restaurar</translation> </message> <message> <source>&Delete</source> <translation>&Desaniciar</translation> </message> <message> <source>Select the notes you want to delete or restore</source> <translation type="unfinished"></translation> </message> <message> <source>Preview</source> <translation type="unfinished"></translation> </message> <message> <source>Deleted notes</source> <translation type="unfinished"></translation> </message> <message> <source>Deleting notes</source> <translation type="unfinished"></translation> </message> <message> <source>Are you sure you want to permanently delete the selected notes?</source> <translation type="unfinished"></translation> </message> </context> <context> <name>Welcome</name> <message> <source>Welcome to nobleNote</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! This is the first time that nobleNote has been started. You can choose a directory where the notes will be saved in.</source> <translation type="unfinished"></translation> </message> <message> <source>&Browse</source> <translation type="unfinished"></translation> </message> <message> <source>Choose a directory</source> <translation>Escoyer un direutoriu</translation> </message> <message> <source>Welcome to nobleNote! This is the first time that nobleNote has been started. You are encouraged to use the standard path, but you can also choose a directory located on the system. Please note that the notes won't be saved on your drive if you do.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The set path for the notes does not exist. Maybe it has been moved or renamed. You can choose a new directory where the notes are or where they will be saved in.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The path where the notes are located is not writable. Maybe your drive is running in read only mode.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The path where the notes are located is not writable. You can choose a new directory where the notes will be saved in. Otherwise changes might not be saved.</source> <translation type="unfinished"></translation> </message> </context> </TS> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/translations/noblenote_es.ts����������������������������������������������������0000664�0001750�0001750�00000051512�13502176303�021043� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> <TS version="2.1" language="es"> <context> <name>Backup</name> <message> <source>Indexing notes...</source> <translation>Indizando las notas…</translation> </message> <message> <source>Indexing trash...</source> <translation>Indizando la papelera…</translation> </message> </context> <context> <name>FileSystemModel</name> <message> <source>Files could not be dropped</source> <translation>No se pudieron soltar los archivos</translation> </message> <message> <source>The files could not be dropped because files of the same names are already existing in this notebook: %1</source> <translation type="unfinished"></translation> </message> <message> <source>The file could not be dropped because a file with the same name already exists in this notebook: %1</source> <translation type="unfinished"></translation> </message> <message> <source>File could not be dropped</source> <translation>No se pudo soltar el archivo</translation> </message> </context> <context> <name>HtmlNoteWriter</name> <message> <source>default</source> <translation>predeterminado</translation> </message> <message> <source>untitled note</source> <translation>nota sin título</translation> </message> </context> <context> <name>MainWindow</name> <message> <source>&Minimize</source> <translation>&Minimizar</translation> </message> <message> <source>&Quit</source> <translation>&Salir</translation> </message> <message> <source>default</source> <translation>predeterminado</translation> </message> <message> <source>&Restore</source> <translation>&Restaurar</translation> </message> <message> <source>Note does not exist</source> <translation>La nota no existe</translation> </message> <message> <source>new note</source> <translation>nota nueva</translation> </message> <message> <source>new note (%1)</source> <translation>nota nueva (%1)</translation> </message> <message> <source>Type to search for notes</source> <translation>Escriba para buscar notas</translation> </message> <message> <source>The selected note cannot be opened because it has been moved or renamed!</source> <translation>No se puede abrir la nota seleccionada porque se ha movido o renombrado.</translation> </message> <message> <source>new notebook</source> <translation>Nueva libreta de notas</translation> </message> <message> <source>new notebook (%1)</source> <translation type="unfinished"></translation> </message> <message> <source>Delete Notebook</source> <translation type="unfinished"></translation> </message> <message> <source>Are you sure you want to delete the notebook "%1" and move all containing notes to the trash?</source> <translation>¿Está seguro de que desea eliminar la libreta de notas «%1» y mover todas las notas que contiene a la papelera?</translation> </message> <message> <source>Notebook could not be deleted</source> <translation type="unfinished"></translation> </message> <message> <source>The notebook could not be deleted because one notebook must remain</source> <translation type="unfinished"></translation> </message> <message> <source>The notebook could not be deleted because one or more notes inside the notebook could not be deleted.</source> <translation type="unfinished"></translation> </message> <message> <source>Delete Note</source> <translation>Eliminar nota</translation> </message> <message> <source>Are you sure you want to move the note %1 to the trash?</source> <translation>¿Está seguro de que quiere mover la nota %1 a la papelera?</translation> </message> <message> <source>Delete Multiple Notes</source> <translation>Eliminar múltiples notas</translation> </message> <message> <source>&Open notes</source> <translation>&Abrir notas</translation> </message> <message> <source>&Delete notes</source> <translation>&Eliminar notas</translation> </message> <message> <source>Show &Source</source> <translation>Mostrar código &fuente</translation> </message> <message> <source>Copy error</source> <translation>Copiar error</translation> </message> <message> <source>Notes of the same names already exist in this notebook: %1</source> <translation type="unfinished"></translation> </message> <message> <source>About </source> <translation>Acerca de </translation> </message> <message> <source>nobleNote</source> <translation>nobleNote</translation> </message> <message> <source>&File</source> <translation>&Archivo</translation> </message> <message> <source>&Settings</source> <translation>&Configuración</translation> </message> <message> <source>&Help</source> <translation>Ay&uda</translation> </message> <message> <source>&View</source> <translation>&Ver</translation> </message> <message> <source>&Edit</source> <translation>&Editar</translation> </message> <message> <source>Ctrl+Q</source> <translation>Ctrl+Q</translation> </message> <message> <source>&Import</source> <translation>&Importar</translation> </message> <message> <source>&Configure...</source> <translation>&Configurar…</translation> </message> <message> <source>Ctrl+P</source> <translation>Ctrl+P</translation> </message> <message> <source>&About</source> <translation>&Acerca de</translation> </message> <message> <source>&Show toolbar</source> <translation>&Mostrar barra de herramientas</translation> </message> <message> <source>Ctrl+Shift+T</source> <translation>Ctrl+Mayús+T</translation> </message> <message> <source>&Trash</source> <translation>Mover a la &papelera</translation> </message> <message> <source>Ctrl+T</source> <translation>Ctrl+T</translation> </message> <message> <source>&History</source> <translation>&Histórico</translation> </message> <message> <source>Ctrl+Shift+H</source> <translation>Ctrl+Mayús+H</translation> </message> <message> <source>&New notebook</source> <translation type="unfinished"></translation> </message> <message> <source>Ctrl+N</source> <translation>Ctrl+N</translation> </message> <message> <source>&Rename notebook</source> <translation type="unfinished"></translation> </message> <message> <source>Ctrl+R</source> <translation type="unfinished"></translation> </message> <message> <source>&Delete notebook</source> <translation type="unfinished"></translation> </message> <message> <source>Ctrl+D</source> <translation>Ctrl+D</translation> </message> <message> <source>&New note</source> <translation>&Nota nueva</translation> </message> <message> <source>Ctrl+Shift+N</source> <translation>Ctrl+Mayús+N</translation> </message> <message> <source>&Rename note</source> <translation>&Renombrar nota</translation> </message> <message> <source>Ctrl+Shift+R</source> <translation>Ctrl+Mayús+R</translation> </message> <message> <source>&Delete note</source> <translation>&Eliminar nota</translation> </message> <message> <source>Ctrl+Shift+D</source> <translation>Ctrl+Mayús+D</translation> </message> <message> <source>&Cut</source> <translation>&Cortar</translation> </message> <message> <source>Ctrl+X</source> <translation>Ctrl+X</translation> </message> <message> <source>&Paste</source> <translation>&Pegar</translation> </message> <message> <source>Ctrl+V</source> <translation>Ctrl+V</translation> </message> <message> <source>Are you sure you want to move these %1 notes to the trash? %2</source> <translation>¿Está seguro de que quiere mover estas %1 notas a la papelera? %2</translation> </message> <message> <source>Open recent</source> <translation type="unfinished"></translation> </message> <message> <source>a</source> <translation type="unfinished"></translation> </message> <message> <source><h1>%1 version %2</h1><p><b>%1</b> is a note taking application</p><p>Copyright (C) %3 Christian Metscher, Fabian Deuchler</p><p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p></source> <translation type="unfinished"></translation> </message> </context> <context> <name>Note</name> <message> <source>Note-Editor</source> <translation>Editor de notas</translation> </message> <message> <source>Hide Toolbars</source> <translation type="unfinished"></translation> </message> <message> <source>Show Toolbars</source> <translation type="unfinished"></translation> </message> </context> <context> <name>NoteDescriptor</name> <message> <source>Note does not exist</source> <translation>La nota no existe</translation> </message> <message> <source>This note does not longer exist. Do you want to keep the editor open?</source> <translation>Esta nota actualmente ya no existe. ¿Desea mantener el editor abierto?</translation> </message> <message> <source>Note modified</source> <translation>Nota modificada</translation> </message> <message> <source>This note has been modified by another instance of %1. Should the note be saved under a different name? Else the note will be reloaded.</source> <translation type="unfinished"></translation> </message> </context> <context> <name>NoteImporter</name> <message> <source>Select one or more tomboy or gnote notes</source> <translation>Seleccione una o más notas de tomboy o gnote</translation> </message> <message> <source>Notes</source> <translation>Notas</translation> </message> <message> <source>Importing notes...</source> <translation>Importando notas…</translation> </message> </context> <context> <name>Preferences</name> <message> <source>Preferences</source> <translation>Preferencias</translation> </message> <message> <source>&Browse ...</source> <translation>&Examinar…</translation> </message> <message> <source>Note editor default font:</source> <translation type="unfinished"></translation> </message> <message> <source>Note editor default size:</source> <translation type="unfinished"></translation> </message> <message> <source>&Show "Show Source" menu entry</source> <translation>&Mostrar opción de menú «Mostrar código fuente»</translation> </message> <message> <source>&Close to tray</source> <translation>&Cerrar en el área de notificación</translation> </message> <message> <source>Automatically convert non-HTML notes to the HTML format. If disabled, non-HTML notes are opened read only.</source> <translation type="unfinished"></translation> </message> <message> <source>Warning</source> <translation>Aviso</translation> </message> <message> <source>Could not write settings!</source> <translation type="unfinished"></translation> </message> <message> <source>Keep old trash folder?</source> <translation>¿Mantener la carpeta de papelera anterior?</translation> </message> <message> <source>Do you want to keep the old trash folder associated with the path %1? (You will be able to see the old files in the trash again if you change back to the previous directory.)</source> <translation type="unfinished"></translation> </message> <message> <source>Couldn't delete trash folder</source> <translation>No se pudo eliminar la carpeta de papelera</translation> </message> <message> <source>Could not delete the trash folder!</source> <translation type="unfinished"></translation> </message> <message> <source>Open Directory</source> <translation>Abrir directorio</translation> </message> <message> <source>The path "%1" is not writable!</source> <translation>La ruta «%1» no es escribible.</translation> </message> <message> <source>No Write Access</source> <translation>Sin acceso de escritura</translation> </message> <message> <source>Width:</source> <translation>Anchura: </translation> </message> <message> <source>Height:</source> <translation>Altura: </translation> </message> <message> <source>&Touch screen scrolling</source> <translation type="unfinished"></translation> </message> <message> <source>Convert notes to the &HTML format</source> <translation type="unfinished"></translation> </message> <message> <source>Number of recently opened notes</source> <translation type="unfinished"></translation> </message> <message> <source>Root directory:</source> <translation type="unfinished"></translation> </message> <message> <source>Backup directroy:</source> <translation type="unfinished"></translation> </message> <message> <source>(Will be updated after pressing OK.)</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TextFormattingToolbar</name> <message> <source>Format actions</source> <translation>Acciones de formato</translation> </message> <message> <source>Formattoolbar</source> <translation type="unfinished"></translation> </message> <message> <source>&Bold</source> <translation>&Negrita</translation> </message> <message> <source>&Italic</source> <translation>&Cursiva</translation> </message> <message> <source>&Underline</source> <translation>&Subrayado</translation> </message> <message> <source>&Strike Out</source> <translation>&Tachado</translation> </message> <message> <source>&Hyperlink</source> <translation>&Hiperenlace</translation> </message> <message> <source>&Clear formatting</source> <translation>&Limpiar formato</translation> </message> <message> <source>&Text color...</source> <translation>Color del &texto…</translation> </message> <message> <source>&Background color...</source> <translation>Color del &fondo…</translation> </message> <message> <source>Insert hyperlink</source> <translation>Insertar hiperenlace</translation> </message> <message> <source>Addr&ess:</source> <translation>&Dirección:</translation> </message> <message> <source>Bullet point</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TextSearchToolbar</name> <message> <source>Search bar</source> <translation>Barra de búsqueda</translation> </message> <message> <source>Searchtoolbar</source> <translation type="unfinished"></translation> </message> <message> <source>Enter search argument</source> <translation type="unfinished"></translation> </message> <message> <source>Find &previous</source> <translation>Buscar &anterior</translation> </message> <message> <source>Find &next</source> <translation>Buscar &siguiente</translation> </message> <message> <source>&Case sensitive</source> <translation type="unfinished"></translation> </message> </context> <context> <name>Trash</name> <message> <source>Trash</source> <translation>Papelera</translation> </message> <message> <source>&Restore</source> <translation>&Restaurar</translation> </message> <message> <source>&Delete</source> <translation>&Eliminar</translation> </message> <message> <source>Select the notes you want to delete or restore</source> <translation>Seleccione las notas que quiere eliminar o restaurar</translation> </message> <message> <source>Preview</source> <translation>Previsualización</translation> </message> <message> <source>Deleted notes</source> <translation>Notas eliminadas</translation> </message> <message> <source>Deleting notes</source> <translation>Eliminando notas</translation> </message> <message> <source>Are you sure you want to permanently delete the selected notes?</source> <translation type="unfinished"></translation> </message> </context> <context> <name>Welcome</name> <message> <source>Welcome to nobleNote</source> <translation>Bienvenido/a nobleNote</translation> </message> <message> <source>Welcome to nobleNote! This is the first time that nobleNote has been started. You can choose a directory where the notes will be saved in.</source> <translation type="unfinished"></translation> </message> <message> <source>&Browse</source> <translation>&Examinar</translation> </message> <message> <source>Choose a directory</source> <translation>Elija un directorio</translation> </message> <message> <source>Welcome to nobleNote! This is the first time that nobleNote has been started. You are encouraged to use the standard path, but you can also choose a directory located on the system. Please note that the notes won't be saved on your drive if you do.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The set path for the notes does not exist. Maybe it has been moved or renamed. You can choose a new directory where the notes are or where they will be saved in.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The path where the notes are located is not writable. Maybe your drive is running in read only mode.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The path where the notes are located is not writable. You can choose a new directory where the notes will be saved in. Otherwise changes might not be saved.</source> <translation type="unfinished"></translation> </message> </context> </TS> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/translations/noblenote_ms.ts����������������������������������������������������0000664�0001750�0001750�00000055461�13502176303�021062� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> <TS version="2.1" language="ms"> <context> <name>Backup</name> <message> <source>Indexing notes...</source> <translation>Mengindeks nota...</translation> </message> <message> <source>Indexing trash...</source> <translation>mengindeks sampah...</translation> </message> </context> <context> <name>FileSystemModel</name> <message> <source>Files could not be dropped</source> <translation>Fail tidak dapat dilepaskan</translation> </message> <message> <source>The files could not be dropped because files of the same names are already existing in this notebook: %1</source> <translation>Fail tidak dapat dilepaskan kerana fail dengan nama yang sama sudah wujud dalam buku nota ini: %1</translation> </message> <message> <source>The file could not be dropped because a file with the same name already exists in this notebook: %1</source> <translation>Fail tidak dapat dilepaskan kerana fail dengan nama yang sama sudah wujud dalam buku nota ini: %1</translation> </message> <message> <source>File could not be dropped</source> <translation>Fail tidak dapat dilepaskan</translation> </message> </context> <context> <name>HtmlNoteWriter</name> <message> <source>default</source> <translation>lalai</translation> </message> <message> <source>untitled note</source> <translation>nota tidak bertajuk</translation> </message> </context> <context> <name>MainWindow</name> <message> <source>&Minimize</source> <translation>&Minimumkan</translation> </message> <message> <source>&Quit</source> <translation>&Keluar</translation> </message> <message> <source>default</source> <translation>lalai</translation> </message> <message> <source>&Restore</source> <translation>&Pulih</translation> </message> <message> <source>Note does not exist</source> <translation>Nota tidak wujud</translation> </message> <message> <source>new note</source> <translation>nota baru</translation> </message> <message> <source>new note (%1)</source> <translation>nota baru (%1)</translation> </message> <message> <source>Type to search for notes</source> <translation>Taip untuk gelintar nota</translation> </message> <message> <source>The selected note cannot be opened because it has been moved or renamed!</source> <translation>Nota terpilih tidak dapat dibuka kerana ia telah dibuang atau dinamakan semula!</translation> </message> <message> <source>new notebook</source> <translation>buku nota baru</translation> </message> <message> <source>new notebook (%1)</source> <translation>buku nota baru (%1)</translation> </message> <message> <source>Delete Notebook</source> <translation>Padam Buku Nota</translation> </message> <message> <source>Are you sure you want to delete the notebook "%1" and move all containing notes to the trash?</source> <translation>Anda pasti hendak padam buku nota "%1" dan alih semua nota yang terkandung ke tong sampah?</translation> </message> <message> <source>Notebook could not be deleted</source> <translation>Buku nota tidak dapat dipadam</translation> </message> <message> <source>The notebook could not be deleted because one notebook must remain</source> <translation>Buku nota tidak dapat dipadam kerana satu buku nota mesti kekal disana</translation> </message> <message> <source>The notebook could not be deleted because one or more notes inside the notebook could not be deleted.</source> <translation>Buku nota tidak dapat dipadam kerana satu buku nota atau lebih nota di dalam buku nota tidak dapat dipadam.</translation> </message> <message> <source>Delete Note</source> <translation>Padam Nota</translation> </message> <message> <source>Are you sure you want to move the note %1 to the trash?</source> <translation>Anda pasti hendak alihkan nota %1 ke tong sampah?</translation> </message> <message> <source>Delete Multiple Notes</source> <translation>Padam Nota Berbilang</translation> </message> <message> <source>&Open notes</source> <translation>&Buka nota</translation> </message> <message> <source>&Delete notes</source> <translation>Pa&dam nota</translation> </message> <message> <source>Show &Source</source> <translation>Papar &Sumber</translation> </message> <message> <source>Copy error</source> <translation>Ralat salin</translation> </message> <message> <source>Notes of the same names already exist in this notebook: %1</source> <translation>Nota dari nama yang sama sudah wujud dalam buku nota ini: %1</translation> </message> <message> <source>About </source> <translation>Perihal </translation> </message> <message> <source>nobleNote</source> <translation>nobleNote</translation> </message> <message> <source>&File</source> <translation>&Fail</translation> </message> <message> <source>&Settings</source> <translation>&Tetapan</translation> </message> <message> <source>&Help</source> <translation>&Bantuan</translation> </message> <message> <source>&View</source> <translation>&Lihat</translation> </message> <message> <source>&Edit</source> <translation>&Sunting</translation> </message> <message> <source>Ctrl+Q</source> <translation>Ctrl+Q</translation> </message> <message> <source>&Import</source> <translation>&Import</translation> </message> <message> <source>&Configure...</source> <translation>Kon&figur...</translation> </message> <message> <source>Ctrl+P</source> <translation>Ctrl+P</translation> </message> <message> <source>&About</source> <translation>Perih&al</translation> </message> <message> <source>&Show toolbar</source> <translation>Papa&r palan alat</translation> </message> <message> <source>Ctrl+Shift+T</source> <translation>Ctrl+Shift+T</translation> </message> <message> <source>&Trash</source> <translation>&Tong Sampah</translation> </message> <message> <source>Ctrl+T</source> <translation>Ctrl+T</translation> </message> <message> <source>&History</source> <translation>Se&jarah</translation> </message> <message> <source>Ctrl+Shift+H</source> <translation>Ctrl+Shift+H</translation> </message> <message> <source>&New notebook</source> <translation>Buku nota ba&ru</translation> </message> <message> <source>Ctrl+N</source> <translation>Ctrl+N</translation> </message> <message> <source>&Rename notebook</source> <translation>&Nama semula buku nota</translation> </message> <message> <source>Ctrl+R</source> <translation>Ctrl+R</translation> </message> <message> <source>&Delete notebook</source> <translation>Pa&dam buku nota</translation> </message> <message> <source>Ctrl+D</source> <translation>Ctrl+D</translation> </message> <message> <source>&New note</source> <translation>Buku &nota</translation> </message> <message> <source>Ctrl+Shift+N</source> <translation>Ctrl+Shift+N</translation> </message> <message> <source>&Rename note</source> <translation>&Nama semula nota</translation> </message> <message> <source>Ctrl+Shift+R</source> <translation>Ctrl+Shift+R</translation> </message> <message> <source>&Delete note</source> <translation>Pa&dam nota</translation> </message> <message> <source>Ctrl+Shift+D</source> <translation>Ctrl+Shift+D</translation> </message> <message> <source>&Cut</source> <translation>Po&tong</translation> </message> <message> <source>Ctrl+X</source> <translation>Ctrl+X</translation> </message> <message> <source>&Paste</source> <translation>Tam&pal</translation> </message> <message> <source>Ctrl+V</source> <translation>Ctrl+V</translation> </message> <message> <source>Are you sure you want to move these %1 notes to the trash? %2</source> <translation>Anda pasti hendak alihkan %1 nota ini ke tong sampah? %2</translation> </message> <message> <source>Open recent</source> <translation type="unfinished"></translation> </message> <message> <source>a</source> <translation type="unfinished"></translation> </message> <message> <source><h1>%1 version %2</h1><p><b>%1</b> is a note taking application</p><p>Copyright (C) %3 Christian Metscher, Fabian Deuchler</p><p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p></source> <translation type="unfinished"><h1>%1 versi %2</h1><p><b>%1</b> adalah aplikasi pengambilan note </p><p>Hakcipta (C) %3 Christian Metscher, Fabian Deuchler</p><p>Keizinan disini diberikan, secara percuma, kepada mana-mana individu yang memperoleh salinain perisian ini dan fail dokumentasi yang berkaitan ("Perisian"), untuk mengendalikan Perisian tanpa sekatan, termasuklah tiada had terhadap hak mengguna, menyalin, mengubahsuai, menggabung, menerbit, mengedar, sublesen, dan/atau menjual salinan Perisian, dan membenarkan individu melakukannya berdasarkan syarat berikut:</p>Notis hakcipta diatas dan notis keizinannya akan disisip di dalam semua salinan atau sebahagian daripada Perisian.<p>PERISIAN INI DISEDIAKAN "SEBAGAIMANA ADANYA", TANPA SEBARANG JENIS JAMINAN, SEGERA ATAU TERSIRAT, YANG TERMASUK TETAPI TIDAK TERHAD KEPADA JAMINAN KEBOLEHDAGANGAN, KESESUAIAN UNTUK TUJUAN TERTENTU DAN KETIDAKLANGGARAN. PENGARANG ATAU PEMEGANG HAK CIPTA DALAM KEADAAN TIDAK AKAN BERTANGGUNGJAWAB UNTUK SEBARANG TUNTUTAN, KEROSAKAN ATAU LIABILITI LAIN, SAMA ADA DALAM PERBUATAN KONTRAK, TORT ATAU SEBALIKNYA, YANG TIMBUL DARIPADA, LUAR ATAU BERHUBUNGAN DENGAN PERISIAN INI ATAU PENGGUNAAN ATAU PERLAKUAN LAIN DALAM PERISIAN. </ p> {1>?} {1 ?} {2<?} {1>?} {1<?} {%3 ?}</translation> </message> </context> <context> <name>Note</name> <message> <source>Note-Editor</source> <translation>Penyunting-Nota</translation> </message> <message> <source>Hide Toolbars</source> <translation type="unfinished"></translation> </message> <message> <source>Show Toolbars</source> <translation type="unfinished"></translation> </message> </context> <context> <name>NoteDescriptor</name> <message> <source>Note does not exist</source> <translation>Nota tidak wujud</translation> </message> <message> <source>This note does not longer exist. Do you want to keep the editor open?</source> <translation>Nota ini tidak lagi wujud. Anda hendak kekalkan penyunting terbuka?</translation> </message> <message> <source>Note modified</source> <translation>Nota diubahsuai</translation> </message> <message> <source>This note has been modified by another instance of %1. Should the note be saved under a different name? Else the note will be reloaded.</source> <translation>Nota ini telah diubahsuai oleh kejadian lain %1. Patutkah nota disiimpan dibawah nama yang berbeza? Jika tidak nota akan dimuatkan semula.</translation> </message> </context> <context> <name>NoteImporter</name> <message> <source>Select one or more tomboy or gnote notes</source> <translation>Pilih satu atau lebih tomboy atau nota gnote</translation> </message> <message> <source>Notes</source> <translation>Nota</translation> </message> <message> <source>Importing notes...</source> <translation>Mengimport nota...</translation> </message> </context> <context> <name>Preferences</name> <message> <source>Preferences</source> <translation>Keutamaan</translation> </message> <message> <source>&Browse ...</source> <translation>La&yar ...</translation> </message> <message> <source>Note editor default font:</source> <translation>Fon lalai penyunting nota:</translation> </message> <message> <source>Note editor default size:</source> <translation>Saiz lalai penyunting nota:</translation> </message> <message> <source>&Show "Show Source" menu entry</source> <translation>P&apar masukan menu "Papar Sumber"</translation> </message> <message> <source>&Close to tray</source> <translation>T&utup ke talam</translation> </message> <message> <source>Automatically convert non-HTML notes to the HTML format. If disabled, non-HTML notes are opened read only.</source> <translation>Tukar nota bukan-HTML secara automatik ke format HTML. Jika dilumpuhkan, nota bukan-HTML dibuka sebagai baca sahaja.</translation> </message> <message> <source>Warning</source> <translation>Amaran</translation> </message> <message> <source>Could not write settings!</source> <translation>Tidak dapat tulis tetapan!</translation> </message> <message> <source>Keep old trash folder?</source> <translation>Kekalkan folder tong sampah lama?</translation> </message> <message> <source>Do you want to keep the old trash folder associated with the path %1? (You will be able to see the old files in the trash again if you change back to the previous directory.)</source> <translation>Anda hendak kekalkan folder tong sampah yang berkaitan dengan laluan %1? (Anda dapat lihat fail lama dalam tong sampah lagi jika anda ubah kembali ke direktori terdahulu.)</translation> </message> <message> <source>Couldn't delete trash folder</source> <translation>Tidak dapat padam folder tong sampah</translation> </message> <message> <source>Could not delete the trash folder!</source> <translation>Tidak dapat padam folder tong sampah!</translation> </message> <message> <source>Open Directory</source> <translation>Buka Direktori</translation> </message> <message> <source>The path "%1" is not writable!</source> <translation>Laluan "%1" tidak boleh ditulis!</translation> </message> <message> <source>No Write Access</source> <translation>Tiada Capaian Tulis</translation> </message> <message> <source>Width:</source> <translation>Lebar: </translation> </message> <message> <source>Height:</source> <translation>Tinggi: </translation> </message> <message> <source>&Touch screen scrolling</source> <translation type="unfinished">&Penatalan skrin sentuh</translation> </message> <message> <source>Convert notes to the &HTML format</source> <translation type="unfinished"></translation> </message> <message> <source>Number of recently opened notes</source> <translation type="unfinished"></translation> </message> <message> <source>Root directory:</source> <translation type="unfinished"></translation> </message> <message> <source>Backup directroy:</source> <translation type="unfinished"></translation> </message> <message> <source>(Will be updated after pressing OK.)</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TextFormattingToolbar</name> <message> <source>Format actions</source> <translation>Tindakan format</translation> </message> <message> <source>Formattoolbar</source> <translation>Palang alat format</translation> </message> <message> <source>&Bold</source> <translation>Te&bal</translation> </message> <message> <source>&Italic</source> <translation>&Condong</translation> </message> <message> <source>&Underline</source> <translation>&Garis Bawah</translation> </message> <message> <source>&Strike Out</source> <translation>&Coret Tembus</translation> </message> <message> <source>&Hyperlink</source> <translation>&Hiperpautan</translation> </message> <message> <source>&Clear formatting</source> <translation>K&osongkan pemformatan</translation> </message> <message> <source>&Text color...</source> <translation>&Warna teks...</translation> </message> <message> <source>&Background color...</source> <translation>Warna &latar belakang...</translation> </message> <message> <source>Insert hyperlink</source> <translation>Sisip hiperpautan</translation> </message> <message> <source>Addr&ess:</source> <translation>Ala&mat:</translation> </message> <message> <source>Bullet point</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TextSearchToolbar</name> <message> <source>Search bar</source> <translation>Palang gelintar</translation> </message> <message> <source>Searchtoolbar</source> <translation>Palang alat gelintar</translation> </message> <message> <source>Enter search argument</source> <translation>Masukkan argumen gelintar</translation> </message> <message> <source>Find &previous</source> <translation>Cari terda&hulu</translation> </message> <message> <source>Find &next</source> <translation>Cari b&rikutnya</translation> </message> <message> <source>&Case sensitive</source> <translation>Sensitif &kata</translation> </message> </context> <context> <name>Trash</name> <message> <source>Trash</source> <translation>Tong sampah</translation> </message> <message> <source>&Restore</source> <translation>Pu&lih</translation> </message> <message> <source>&Delete</source> <translation>Pa&dam</translation> </message> <message> <source>Select the notes you want to delete or restore</source> <translation>Pilih nota yang anda hendak padam atau pulihkan</translation> </message> <message> <source>Preview</source> <translation>Pratonton</translation> </message> <message> <source>Deleted notes</source> <translation>Nota dipadam</translation> </message> <message> <source>Deleting notes</source> <translation>Memadam nota</translation> </message> <message> <source>Are you sure you want to permanently delete the selected notes?</source> <translation type="unfinished"></translation> </message> </context> <context> <name>Welcome</name> <message> <source>Welcome to nobleNote</source> <translation>Selamat datang ke nobleNote</translation> </message> <message> <source>Welcome to nobleNote! This is the first time that nobleNote has been started. You can choose a directory where the notes will be saved in.</source> <translation>Selamat datang ke nobleNote! Ini merupakan kali pertama nobleNote telah dimulakan. Anda boleh direktori yang mana nota akan disimpankan.</translation> </message> <message> <source>&Browse</source> <translation>La&yar</translation> </message> <message> <source>Choose a directory</source> <translation>Pilih direktori</translation> </message> <message> <source>Welcome to nobleNote! This is the first time that nobleNote has been started. You are encouraged to use the standard path, but you can also choose a directory located on the system. Please note that the notes won't be saved on your drive if you do.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The set path for the notes does not exist. Maybe it has been moved or renamed. You can choose a new directory where the notes are or where they will be saved in.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The path where the notes are located is not writable. Maybe your drive is running in read only mode.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The path where the notes are located is not writable. You can choose a new directory where the notes will be saved in. Otherwise changes might not be saved.</source> <translation type="unfinished"></translation> </message> </context> </TS> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/translations/noblenote_uk.ts����������������������������������������������������0000664�0001750�0001750�00000065614�13502176303�021063� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> <TS version="2.1" language="uk"> <context> <name>Backup</name> <message> <source>Indexing notes...</source> <translation>Індексуємо нотатки…</translation> </message> <message> <source>Indexing trash...</source> <translation>Індексуємо смітник…</translation> </message> </context> <context> <name>FileSystemModel</name> <message> <source>Files could not be dropped</source> <translation>Не вдалося скинути файли</translation> </message> <message> <source>The files could not be dropped because files of the same names are already existing in this notebook: %1</source> <translation>Не вдалося скинути файли, оскільки у цьому нотатнику вже є файли з такими самими назвами: %1</translation> </message> <message> <source>The file could not be dropped because a file with the same name already exists in this notebook: %1</source> <translation>Не вдалося скинути файл, оскільки у цьому нотатнику вже є файл з такою самою назвою: %1</translation> </message> <message> <source>File could not be dropped</source> <translation>Не вдалося скинути файл</translation> </message> </context> <context> <name>HtmlNoteWriter</name> <message> <source>default</source> <translation>типовий</translation> </message> <message> <source>untitled note</source> <translation>нотатка без назви</translation> </message> </context> <context> <name>MainWindow</name> <message> <source>&Minimize</source> <translation>&Мінімізувати</translation> </message> <message> <source>&Quit</source> <translation>Ви&йти</translation> </message> <message> <source>default</source> <translation>типовий</translation> </message> <message> <source>&Restore</source> <translation>Від&новити</translation> </message> <message> <source>Note does not exist</source> <translation>Нотатки не існує</translation> </message> <message> <source>new note</source> <translation>нова нотатка</translation> </message> <message> <source>new note (%1)</source> <translation>нова нотатка (%1)</translation> </message> <message> <source>Type to search for notes</source> <translation>Введіть ключове слово для пошуку</translation> </message> <message> <source>The selected note cannot be opened because it has been moved or renamed!</source> <translation>Позначену нотатку не вдалося відкрити, оскільки її було пересунуто або перейменовано!</translation> </message> <message> <source>new notebook</source> <translation>новий нотатник</translation> </message> <message> <source>new notebook (%1)</source> <translation>новий нотатник (%1)</translation> </message> <message> <source>Delete Notebook</source> <translation>Вилучити нотатник</translation> </message> <message> <source>Are you sure you want to delete the notebook "%1" and move all containing notes to the trash?</source> <translation>Ви справді хочете вилучити нотатник «%1» і пересунути весь його вміст до смітника?</translation> </message> <message> <source>Notebook could not be deleted</source> <translation>Не вдалося вилучити нотатник</translation> </message> <message> <source>The notebook could not be deleted because one notebook must remain</source> <translation>Цей нотатник не можна вилучати, оскільки у програми має залишатися принаймні один нотатник</translation> </message> <message> <source>The notebook could not be deleted because one or more notes inside the notebook could not be deleted.</source> <translation>Цей нотатник не можна вилучати, оскільки програмі не вдалося вилучити одну або декілька нотаток, що у ньому містяться.</translation> </message> <message> <source>Delete Note</source> <translation>Вилучення нотатки</translation> </message> <message> <source>Are you sure you want to move the note %1 to the trash?</source> <translation>Ви справді хочете пересунути нотатку %1 до смітника?</translation> </message> <message> <source>Delete Multiple Notes</source> <translation>Вилучення декількох нотаток</translation> </message> <message> <source>&Open notes</source> <translation>Ві&дкрити нотатки</translation> </message> <message> <source>&Delete notes</source> <translation>Ви&лучити нотатки</translation> </message> <message> <source>Show &Source</source> <translation>Показати &код</translation> </message> <message> <source>Copy error</source> <translation>Помилка копіювання</translation> </message> <message> <source>Notes of the same names already exist in this notebook: %1</source> <translation>У цьому нотатнику вже є нотатки з такими самими назвами: %1</translation> </message> <message> <source>About </source> <translation>Про </translation> </message> <message> <source>nobleNote</source> <translation>nobleNote</translation> </message> <message> <source>&File</source> <translation>&Файл</translation> </message> <message> <source>&Settings</source> <translation>П&араметри</translation> </message> <message> <source>&Help</source> <translation>&Довідка</translation> </message> <message> <source>&View</source> <translation>П&ерегляд</translation> </message> <message> <source>&Edit</source> <translation>З&міни</translation> </message> <message> <source>Ctrl+Q</source> <translation>Ctrl+Q</translation> </message> <message> <source>&Import</source> <translation>&Імпорт</translation> </message> <message> <source>&Configure...</source> <translation>&Налаштувати…</translation> </message> <message> <source>Ctrl+P</source> <translation>Ctrl+P</translation> </message> <message> <source>&About</source> <translation>Пр&о програму</translation> </message> <message> <source>&Show toolbar</source> <translation>&Показати панель</translation> </message> <message> <source>Ctrl+Shift+T</source> <translation>Ctrl+Shift+T</translation> </message> <message> <source>&Trash</source> <translation>С&мітник</translation> </message> <message> <source>Ctrl+T</source> <translation>Ctrl+T</translation> </message> <message> <source>&History</source> <translation>&Журнал</translation> </message> <message> <source>Ctrl+Shift+H</source> <translation>Ctrl+Shift+H</translation> </message> <message> <source>&New notebook</source> <translation>С&творити нотатник</translation> </message> <message> <source>Ctrl+N</source> <translation>Ctrl+N</translation> </message> <message> <source>&Rename notebook</source> <translation>Пере&йменувати нотатник</translation> </message> <message> <source>Ctrl+R</source> <translation>Ctrl+R</translation> </message> <message> <source>&Delete notebook</source> <translation>Ви&лучити нотатник</translation> </message> <message> <source>Ctrl+D</source> <translation>Ctrl+D</translation> </message> <message> <source>&New note</source> <translation>С&творити нотатку</translation> </message> <message> <source>Ctrl+Shift+N</source> <translation>Ctrl+Shift+N</translation> </message> <message> <source>&Rename note</source> <translation>Пере&йменувати нотатку</translation> </message> <message> <source>Ctrl+Shift+R</source> <translation>Ctrl+Shift+R</translation> </message> <message> <source>&Delete note</source> <translation>Ви&лучити нотатку</translation> </message> <message> <source>Ctrl+Shift+D</source> <translation>Ctrl+Shift+D</translation> </message> <message> <source>&Cut</source> <translation>Ви&різати</translation> </message> <message> <source>Ctrl+X</source> <translation>Ctrl+X</translation> </message> <message> <source>&Paste</source> <translation>&Вставити</translation> </message> <message> <source>Ctrl+V</source> <translation>Ctrl+V</translation> </message> <message> <source>Are you sure you want to move these %1 notes to the trash? %2</source> <translation>Ви справді хочете пересунути ці %1 нотатки до смітника? %2</translation> </message> <message> <source>Open recent</source> <translation type="unfinished"></translation> </message> <message> <source>a</source> <translation type="unfinished"></translation> </message> <message> <source><h1>%1 version %2</h1><p><b>%1</b> is a note taking application</p><p>Copyright (C) %3 Christian Metscher, Fabian Deuchler</p><p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p></source> <translation type="unfinished"><h1>%1, версія %2</h1><p><b>%1</b> — програма для роботи з нотатками</p><p>Авторські права належать Christian Metscher, Fabian Deuchler, %3</p><p>Будь-кому, хто отримав копію цього програмного забезпечення та пов’язаних з ним файлів документації (надалі «Програмного забезпечення) надається дозвіл безкоштовно працювати з Програмним забезпеченням без обмежень, зокрема без обмежень щодо права використання, копіювання, внесення змін, об’єднання, оприлюднення, поширення, повторного ліцензування і/або продажу копій Програмного забезпечення, а також надавати Програмне забезпечення особам, для яких його було створено, ті ж права відповідно до таких умов:</p>Разом з усіма копіями Програмного забезпечення або його суттєвих частин має бути надано це сповіщення щодо авторських прав.<p>ЦЕ ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ НАДАЄТЬСЯ У ПОТОЧНОМУ СТАНІ, БЕЗ БУДЬ-ЯКИХ ГАРАНТІЙ, ЯВНИХ ЧИ НЕЯВНИХ, ЗОКРЕМА, АЛЕ НЕ ОБМЕЖУЮЧИСЬ, ГАРАНТІЙ ПРАЦЕЗДАТНОСТІ ЧИ ПРИДАТНОСТІ ДЛЯ ВИКОНАННЯ ПЕВНОЇ МЕТИ ТА ГАРАНТІЙ ЗБЕРЕЖЕННЯ ЦІЛІСНОСТІ ДАНИХ. АВТОРИ ТА ВЛАСНИКИ АВТОРСЬКИХ ПРАВ ЗА ЖОДНИХ ОБСТАВИН НЕ ВИЗНАЮТЬ СЕБЕ СТОРОНОЮ БУДЬ-ЯКИХ СКАРГ, ПОВ’ЯЗАНИХ З ЗАВДАНОЮ ШКОДОЮ АБО ІНШИМИ НЕЗРУЧНОСТЯМИ ПІД ЧАС РОБОТИ ЗА НАЙМОМ, ПРАВОПОРУШЕННЯ АБО ІНШИХ ОБСТАВИН, ЩО Є ПРЯМИМ, ОПОСЕРЕДКОВАНИМ ЧИ ПОВ’ЯЗАНИМ НАСЛІДКОМ РОБОТИ, ВИКОРИСТАННЯ АБО ІНШИХ АСПЕКТІВ, ПОВ’ЯЗАНИХ З ПРОГРАМНИМ ЗАБЕЗПЕЧЕННЯМ.</p> {1>?} {1 ?} {2<?} {1>?} {1<?} {%3 ?}</translation> </message> </context> <context> <name>Note</name> <message> <source>Note-Editor</source> <translation>Редактор нотаток</translation> </message> <message> <source>Hide Toolbars</source> <translation type="unfinished"></translation> </message> <message> <source>Show Toolbars</source> <translation type="unfinished"></translation> </message> </context> <context> <name>NoteDescriptor</name> <message> <source>Note does not exist</source> <translation>Нотатки не існує</translation> </message> <message> <source>This note does not longer exist. Do you want to keep the editor open?</source> <translation>Цієї нотатки більше немає. Хочете залишити вікно редактора відкритим?</translation> </message> <message> <source>Note modified</source> <translation>Нотатку змінено</translation> </message> <message> <source>This note has been modified by another instance of %1. Should the note be saved under a different name? Else the note will be reloaded.</source> <translation>До цієї нотатки було внесено зміни за допомогою іншого екземпляра %1. Зберегти нотатку з використанням іншої назви? Якщо нотатку не буде збережено, програма просто завантажить її новий вміст.</translation> </message> </context> <context> <name>NoteImporter</name> <message> <source>Select one or more tomboy or gnote notes</source> <translation>Позначте одну або декілька нотаток tomboy або gnote</translation> </message> <message> <source>Notes</source> <translation>Нотатки</translation> </message> <message> <source>Importing notes...</source> <translation>Імпортуємо нотатки…</translation> </message> </context> <context> <name>Preferences</name> <message> <source>Preferences</source> <translation>Параметри</translation> </message> <message> <source>&Browse ...</source> <translation>Ви&брати…</translation> </message> <message> <source>Note editor default font:</source> <translation>Типовий шрифти редактора нотаток:</translation> </message> <message> <source>Note editor default size:</source> <translation>Типовий розмір шрифту редактора нотаток:</translation> </message> <message> <source>&Show "Show Source" menu entry</source> <translation>&Показувати пункт меню «Показати код»</translation> </message> <message> <source>&Close to tray</source> <translation>З&гортати до лотка</translation> </message> <message> <source>Automatically convert non-HTML notes to the HTML format. If disabled, non-HTML notes are opened read only.</source> <translation>Перетворювати нотатки у форматі, відмінному від HTML, у нотатки у форматі HTML. Якщо пункт не буде позначено, нотатки, що зберігаються не у форматі HTML, відкриватимуться у режимі лише читання.</translation> </message> <message> <source>Warning</source> <translation>Попередження</translation> </message> <message> <source>Could not write settings!</source> <translation>Не вдалося записати значення параметрів!</translation> </message> <message> <source>Keep old trash folder?</source> <translation>Зберегти стару теку смітника?</translation> </message> <message> <source>Do you want to keep the old trash folder associated with the path %1? (You will be able to see the old files in the trash again if you change back to the previous directory.)</source> <translation>Хочете зберегти стару теку смітника, пов’язану з адресою каталогу %1? (Якщо ви повернетеся до старої адреси каталогу, ви зможете переглянути старі файли, що зберігаються у у цьому каталозі-смітнику.)</translation> </message> <message> <source>Couldn't delete trash folder</source> <translation>Не вдалося вилучити теку смітника</translation> </message> <message> <source>Could not delete the trash folder!</source> <translation>Не вдалося вилучити теку смітника!</translation> </message> <message> <source>Open Directory</source> <translation>Відкриття каталогу</translation> </message> <message> <source>The path "%1" is not writable!</source> <translation>Запис до каталогу з адресою «%1» заборонено!</translation> </message> <message> <source>No Write Access</source> <translation>Немає доступу для запису</translation> </message> <message> <source>Width:</source> <translation>Ширина: </translation> </message> <message> <source>Height:</source> <translation>Висота: </translation> </message> <message> <source>&Touch screen scrolling</source> <translation type="unfinished">гортання за допомогою сенсорного екрана</translation> </message> <message> <source>Convert notes to the &HTML format</source> <translation type="unfinished"></translation> </message> <message> <source>Number of recently opened notes</source> <translation type="unfinished"></translation> </message> <message> <source>Root directory:</source> <translation type="unfinished"></translation> </message> <message> <source>Backup directroy:</source> <translation type="unfinished"></translation> </message> <message> <source>(Will be updated after pressing OK.)</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TextFormattingToolbar</name> <message> <source>Format actions</source> <translation>Дії з форматування</translation> </message> <message> <source>Formattoolbar</source> <translation>Панель форматування</translation> </message> <message> <source>&Bold</source> <translation>&Жирний</translation> </message> <message> <source>&Italic</source> <translation>&Курсив</translation> </message> <message> <source>&Underline</source> <translation>П&ідкреслений</translation> </message> <message> <source>&Strike Out</source> <translation>&Закреслений</translation> </message> <message> <source>&Hyperlink</source> <translation>Г&іперпосилання</translation> </message> <message> <source>&Clear formatting</source> <translation>З&няти форматування</translation> </message> <message> <source>&Text color...</source> <translation>Колір т&ексту…</translation> </message> <message> <source>&Background color...</source> <translation>Колір &тла…</translation> </message> <message> <source>Insert hyperlink</source> <translation>Вставити гіперпосилання</translation> </message> <message> <source>Addr&ess:</source> <translation>&Адреса:</translation> </message> <message> <source>Bullet point</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TextSearchToolbar</name> <message> <source>Search bar</source> <translation>Панель пошуку</translation> </message> <message> <source>Searchtoolbar</source> <translation>Панель пошуку</translation> </message> <message> <source>Enter search argument</source> <translation>Вкажіть ключове слово пошуку</translation> </message> <message> <source>Find &previous</source> <translation>Знайти &позаду</translation> </message> <message> <source>Find &next</source> <translation>Знайти &далі</translation> </message> <message> <source>&Case sensitive</source> <translation>&З урахуванням регістру</translation> </message> </context> <context> <name>Trash</name> <message> <source>Trash</source> <translation>Смітник</translation> </message> <message> <source>&Restore</source> <translation>&Відновити</translation> </message> <message> <source>&Delete</source> <translation>Ви&лучити</translation> </message> <message> <source>Select the notes you want to delete or restore</source> <translation>Позначте нотатки, які ви хочете вилучити або відновити</translation> </message> <message> <source>Preview</source> <translation>Перегляд</translation> </message> <message> <source>Deleted notes</source> <translation>Вилучені нотатки</translation> </message> <message> <source>Deleting notes</source> <translation>Вилучаємо нотатки</translation> </message> <message> <source>Are you sure you want to permanently delete the selected notes?</source> <translation type="unfinished"></translation> </message> </context> <context> <name>Welcome</name> <message> <source>Welcome to nobleNote</source> <translation>Вітаємо у nobleNote</translation> </message> <message> <source>Welcome to nobleNote! This is the first time that nobleNote has been started. You can choose a directory where the notes will be saved in.</source> <translation>Вітаємо у nobleNote! Ви вперше запустили nobleNote у цій системі. Зараз ви можете вибрати каталог, у якому зберігатимуться нотатки.</translation> </message> <message> <source>&Browse</source> <translation>В&казати</translation> </message> <message> <source>Choose a directory</source> <translation>Виберіть каталог</translation> </message> <message> <source>Welcome to nobleNote! This is the first time that nobleNote has been started. You are encouraged to use the standard path, but you can also choose a directory located on the system. Please note that the notes won't be saved on your drive if you do.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The set path for the notes does not exist. Maybe it has been moved or renamed. You can choose a new directory where the notes are or where they will be saved in.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The path where the notes are located is not writable. Maybe your drive is running in read only mode.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The path where the notes are located is not writable. You can choose a new directory where the notes will be saved in. Otherwise changes might not be saved.</source> <translation type="unfinished"></translation> </message> </context> </TS> ��������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/translations/noblenote_cs.ts����������������������������������������������������0000664�0001750�0001750�00000056365�13502176303�021054� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> <TS version="2.1" language="cs"> <context> <name>Backup</name> <message> <source>Indexing notes...</source> <translation>Indexují se poznámky...</translation> </message> <message> <source>Indexing trash...</source> <translation>Indexuje se koš...</translation> </message> </context> <context> <name>FileSystemModel</name> <message> <source>Files could not be dropped</source> <translation>Soubory nemohou být puštěny</translation> </message> <message> <source>The files could not be dropped because files of the same names are already existing in this notebook: %1</source> <translation>Soubory nemohli být puštěny, protože soubory se stejnými názvy již existují v tomto poznámkovém bloku: %1</translation> </message> <message> <source>The file could not be dropped because a file with the same name already exists in this notebook: %1</source> <translation>Soubor nemohl být puštěn, protože soubor se stejným názvem již existuje v tomto poznámkovém bloku: %1</translation> </message> <message> <source>File could not be dropped</source> <translation>Soubor nemohl být puštěn</translation> </message> </context> <context> <name>HtmlNoteWriter</name> <message> <source>default</source> <translation>výchozí</translation> </message> <message> <source>untitled note</source> <translation>Nepojmenovaná poznámka</translation> </message> </context> <context> <name>MainWindow</name> <message> <source>&Minimize</source> <translation>&Zmenšit</translation> </message> <message> <source>&Quit</source> <translation>&Ukončit</translation> </message> <message> <source>default</source> <translation>výchozí</translation> </message> <message> <source>&Restore</source> <translation>&Obnovit</translation> </message> <message> <source>Note does not exist</source> <translation>Poznámka neexistuje</translation> </message> <message> <source>new note</source> <translation>nová poznámka</translation> </message> <message> <source>new note (%1)</source> <translation>nová poznámka (%1)</translation> </message> <message> <source>Type to search for notes</source> <translation>Zadejte text pro vyhledávání poznámek</translation> </message> <message> <source>The selected note cannot be opened because it has been moved or renamed!</source> <translation>Zvolená poznámka nemůže být otevřena, protože byla přesunuta nebo přejmenována!</translation> </message> <message> <source>new notebook</source> <translation>nový poznámkový blok</translation> </message> <message> <source>new notebook (%1)</source> <translation>nový poznámkový blok (%1)</translation> </message> <message> <source>Delete Notebook</source> <translation>Smazat poznámkový blok</translation> </message> <message> <source>Are you sure you want to delete the notebook "%1" and move all containing notes to the trash?</source> <translation>Opravdu chcete smazat poznámkový blok "%1" a přesunout všechny obsažené poznámky do koše?</translation> </message> <message> <source>Notebook could not be deleted</source> <translation>Poznámkový blok nemohl být smazán</translation> </message> <message> <source>The notebook could not be deleted because one notebook must remain</source> <translation>Poznámkový blok nemohl být smazán, protože jeden musí zůstat</translation> </message> <message> <source>The notebook could not be deleted because one or more notes inside the notebook could not be deleted.</source> <translation>Poznámkový blok nemohl být smazán protože jedna nebo více poznámek uvnitř nemohou být smazány.</translation> </message> <message> <source>Delete Note</source> <translation>Odstranit poznámku</translation> </message> <message> <source>Are you sure you want to move the note %1 to the trash?</source> <translation>Jste si jisti, že chcete přesunout poznámku %1 do koše?</translation> </message> <message> <source>Delete Multiple Notes</source> <translation>Smazat více poznámek</translation> </message> <message> <source>&Open notes</source> <translation>&Otevřít poznámky</translation> </message> <message> <source>&Delete notes</source> <translation>&Smazat poznámky</translation> </message> <message> <source>Show &Source</source> <translation>Zobrazit &Zdroj</translation> </message> <message> <source>Copy error</source> <translation>Chyba při kopírování</translation> </message> <message> <source>Notes of the same names already exist in this notebook: %1</source> <translation>Poznámky se stejnými názvy již existují v tomto poznámkovém bloku: %1</translation> </message> <message> <source>About </source> <translation>O programu </translation> </message> <message> <source>nobleNote</source> <translation>nobleNote</translation> </message> <message> <source>&File</source> <translation>&Soubor</translation> </message> <message> <source>&Settings</source> <translation>&Nastavení</translation> </message> <message> <source>&Help</source> <translation>&Nápověda</translation> </message> <message> <source>&View</source> <translation>&Náhled</translation> </message> <message> <source>&Edit</source> <translation>&Upravit</translation> </message> <message> <source>Ctrl+Q</source> <translation>Ctrl+Q</translation> </message> <message> <source>&Import</source> <translation>&Import</translation> </message> <message> <source>&Configure...</source> <translation>&Nastavit...</translation> </message> <message> <source>Ctrl+P</source> <translation>Ctrl+P</translation> </message> <message> <source>&About</source> <translation>&O programu</translation> </message> <message> <source>&Show toolbar</source> <translation>&Zobrazit nástrojovou lištu</translation> </message> <message> <source>Ctrl+Shift+T</source> <translation>Ctrl+Shift+T</translation> </message> <message> <source>&Trash</source> <translation>&Koš</translation> </message> <message> <source>Ctrl+T</source> <translation>Ctrl+T</translation> </message> <message> <source>&History</source> <translation>&Historie</translation> </message> <message> <source>Ctrl+Shift+H</source> <translation>Ctrl+Shift+H</translation> </message> <message> <source>&New notebook</source> <translation>&Nový poznámkový blok</translation> </message> <message> <source>Ctrl+N</source> <translation>Ctrl+N</translation> </message> <message> <source>&Rename notebook</source> <translation>&Přejmenovat poznámkový blok</translation> </message> <message> <source>Ctrl+R</source> <translation>Ctrl+R</translation> </message> <message> <source>&Delete notebook</source> <translation>&Smazat poznámkový blok</translation> </message> <message> <source>Ctrl+D</source> <translation>Ctrl+D</translation> </message> <message> <source>&New note</source> <translation>&Nová poznámka</translation> </message> <message> <source>Ctrl+Shift+N</source> <translation>Ctrl+Shift+N</translation> </message> <message> <source>&Rename note</source> <translation>&Přejmenovat poznámku</translation> </message> <message> <source>Ctrl+Shift+R</source> <translation>Ctrl+Shift+R</translation> </message> <message> <source>&Delete note</source> <translation>&Smazat poznámku</translation> </message> <message> <source>Ctrl+Shift+D</source> <translation>Ctrl+Shift+D</translation> </message> <message> <source>&Cut</source> <translation>&Vyjmout</translation> </message> <message> <source>Ctrl+X</source> <translation>Ctrl+X</translation> </message> <message> <source>&Paste</source> <translation>&Vložit</translation> </message> <message> <source>Ctrl+V</source> <translation>Ctrl+V</translation> </message> <message> <source>Are you sure you want to move these %1 notes to the trash? %2</source> <translation>Jste si jistý, že chcete přesunout tyto %1 poznámky do koše? %2</translation> </message> <message> <source>Open recent</source> <translation type="unfinished"></translation> </message> <message> <source>a</source> <translation type="unfinished"></translation> </message> <message> <source><h1>%1 version %2</h1><p><b>%1</b> is a note taking application</p><p>Copyright (C) %3 Christian Metscher, Fabian Deuchler</p><p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p></source> <translation type="unfinished"><h1>%1 verze%2</h1><p><b>%1</b> je psaní poznámek aplikace</p><p>Copyright (C) %3 Christian Metscher, Fabian Deuchler</p><p>tímto je uděleno povolení, bezplatně jakékoli osobě, která získá kopii tohoto softwaru a příslušné soubory dokumentace ( "Software"), nakládat se softwarem bez omezení, včetně a bez omezení práv na používání, kopírování, upravovat, slučovat, publikovat, distribuovat, udělovat podlicence, a / nebo prodávat kopie softwaru, a umožnit osobám, kterým Software je zařízený dělat tak, s výhradou těchto podmínek:</p>výše uvedené označení copyrightu a toto povolení oznámení musí být zahrnuty ve všech kopiích nebo podstatným částem softwaru.<p>SOFTWARE jE POSKYTOVÁN "TAK, JAK JE", BEZ ZÁRUKY JAKÉHOKOLIV DRUHU, VYJÁDŘENÉ NEBO VYPLÝVAJÍCÍ Z OKOLNOSTÍ, BEZ OMEZENÍ ZÁRUKY PRODEJNOSTI, VHODNOSTI PRO KONKRÉTNÍ ÚČEL A NEPORUŠENÍ. V ŽÁDNÉM PŘÍPADĚ AUTOŘI ANI VLASTNÍCI AUTORSKÝCH PRÁV NENESOU ODPOVĚDNOST ZA JAKÉKOLI ŠKODY NEBO JINOU ODPOVĚDNOST, AŤ JIŽ NA ZÁKLADĚ smlouvy, deliktu nebo jinak, které vznikly VE SPOJENÍ SE SOFTWAREM NEBO JEHO POUŽITÍM NEBO Z JINÉHO NAKLÁDÁNÍ SE SOFTWAREM.</p> {1>?} {1 ?} {2<?} {1>?} {1<?} {%3 ?}</translation> </message> </context> <context> <name>Note</name> <message> <source>Note-Editor</source> <translation>Editor-poznámek</translation> </message> <message> <source>Hide Toolbars</source> <translation type="unfinished"></translation> </message> <message> <source>Show Toolbars</source> <translation type="unfinished"></translation> </message> </context> <context> <name>NoteDescriptor</name> <message> <source>Note does not exist</source> <translation>Poznámka neexistuje</translation> </message> <message> <source>This note does not longer exist. Do you want to keep the editor open?</source> <translation>Tato poznámka již neexistuje. Chcete nechat editor otevřený?</translation> </message> <message> <source>Note modified</source> <translation>Poznámka byla upravena</translation> </message> <message> <source>This note has been modified by another instance of %1. Should the note be saved under a different name? Else the note will be reloaded.</source> <translation>Tato poznámka byla upravena jinou instancí %1. Může být poznámka uložena pod jiným názvem? Jinak bude poznámka znovu načtena.</translation> </message> </context> <context> <name>NoteImporter</name> <message> <source>Select one or more tomboy or gnote notes</source> <translation>Vyberte jednu, nebo více tomboy, nebo gnote poznámek</translation> </message> <message> <source>Notes</source> <translation>Poznámky</translation> </message> <message> <source>Importing notes...</source> <translation>Importují se poznámky...</translation> </message> </context> <context> <name>Preferences</name> <message> <source>Preferences</source> <translation>Nastavení</translation> </message> <message> <source>&Browse ...</source> <translation>&Procházet ...</translation> </message> <message> <source>Note editor default font:</source> <translation>Standardní písmo poznámkového editoru:</translation> </message> <message> <source>Note editor default size:</source> <translation>Standardní velikost poznámkového editoru:</translation> </message> <message> <source>&Show "Show Source" menu entry</source> <translation>&Zobrazit "Zobrazit zdroj" položku menu</translation> </message> <message> <source>&Close to tray</source> <translation>&Zavřít do lišty</translation> </message> <message> <source>Automatically convert non-HTML notes to the HTML format. If disabled, non-HTML notes are opened read only.</source> <translation>Automaticky převést ne-HTML poznámky do formátu HTML. Pokud je funkce vypnuta, jsou ne-HTML poznámky otevřeny pouze pro čtení.</translation> </message> <message> <source>Warning</source> <translation>Varování</translation> </message> <message> <source>Could not write settings!</source> <translation>Nelze zapsat nastavení!</translation> </message> <message> <source>Keep old trash folder?</source> <translation>Zachovat starý adresář koše?</translation> </message> <message> <source>Do you want to keep the old trash folder associated with the path %1? (You will be able to see the old files in the trash again if you change back to the previous directory.)</source> <translation>Chcete zachovat starý adresář koše spojený s cestou %1? (Budete mít možnost vidět staré soubory znovu v koši, pokud to změníte zpět do předchozího adresáře.)</translation> </message> <message> <source>Couldn't delete trash folder</source> <translation>Nelze smazat adresář koše</translation> </message> <message> <source>Could not delete the trash folder!</source> <translation>Nelze smazat adresář koše!</translation> </message> <message> <source>Open Directory</source> <translation>Otevřít adresář</translation> </message> <message> <source>The path "%1" is not writable!</source> <translation>Cesta "%1" není zapisovatelná!</translation> </message> <message> <source>No Write Access</source> <translation>Bez přístupu zapisování</translation> </message> <message> <source>Width:</source> <translation>Šířka: </translation> </message> <message> <source>Height:</source> <translation>Výška: </translation> </message> <message> <source>&Touch screen scrolling</source> <translation>&Posun dotykové obrazovky</translation> </message> <message> <source>Convert notes to the &HTML format</source> <translation type="unfinished"></translation> </message> <message> <source>Number of recently opened notes</source> <translation type="unfinished"></translation> </message> <message> <source>Root directory:</source> <translation type="unfinished"></translation> </message> <message> <source>Backup directroy:</source> <translation type="unfinished"></translation> </message> <message> <source>(Will be updated after pressing OK.)</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TextFormattingToolbar</name> <message> <source>Format actions</source> <translation>Akce formátování</translation> </message> <message> <source>Formattoolbar</source> <translation>Nástrojová lišta formátování</translation> </message> <message> <source>&Bold</source> <translation>&Tučné</translation> </message> <message> <source>&Italic</source> <translation>&Kurzíva</translation> </message> <message> <source>&Underline</source> <translation>&Podtržené</translation> </message> <message> <source>&Strike Out</source> <translation>&Přeškrtnuté</translation> </message> <message> <source>&Hyperlink</source> <translation>&Odkaz</translation> </message> <message> <source>&Clear formatting</source> <translation>&Čisté formátování</translation> </message> <message> <source>&Text color...</source> <translation>&Barva textu...</translation> </message> <message> <source>&Background color...</source> <translation>&Barva pozadí...</translation> </message> <message> <source>Insert hyperlink</source> <translation>Vloží hypertextový odkaz</translation> </message> <message> <source>Addr&ess:</source> <translation>&Adresa:</translation> </message> <message> <source>Bullet point</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TextSearchToolbar</name> <message> <source>Search bar</source> <translation>Lišta hledání</translation> </message> <message> <source>Searchtoolbar</source> <translation>Nástrojová lišta vyhledávání</translation> </message> <message> <source>Enter search argument</source> <translation>Vložte parametr vyhledávání</translation> </message> <message> <source>Find &previous</source> <translation>Hledat &předchozí</translation> </message> <message> <source>Find &next</source> <translation>Najdi &následující</translation> </message> <message> <source>&Case sensitive</source> <translation>&Rozlišovat velká/malá</translation> </message> </context> <context> <name>Trash</name> <message> <source>Trash</source> <translation>Koš</translation> </message> <message> <source>&Restore</source> <translation>&Obnovit</translation> </message> <message> <source>&Delete</source> <translation>&Smazat</translation> </message> <message> <source>Select the notes you want to delete or restore</source> <translation>Vyberte poznámky, které chcete smazat, nebo obnovit</translation> </message> <message> <source>Preview</source> <translation>Náhled</translation> </message> <message> <source>Deleted notes</source> <translation>Smazané poznámky</translation> </message> <message> <source>Deleting notes</source> <translation>Mažou se poznámky</translation> </message> <message> <source>Are you sure you want to permanently delete the selected notes?</source> <translation type="unfinished"></translation> </message> </context> <context> <name>Welcome</name> <message> <source>Welcome to nobleNote</source> <translation>Vítejte v nobleNote</translation> </message> <message> <source>Welcome to nobleNote! This is the first time that nobleNote has been started. You can choose a directory where the notes will be saved in.</source> <translation>Vítejte v nobleNote! Toto je poprvé, co byl spuštěn nobleNote. Můžete vybrat adresář, kam budou poznámky uloženy.</translation> </message> <message> <source>&Browse</source> <translation>&Procházet</translation> </message> <message> <source>Choose a directory</source> <translation>Vyberte adresář</translation> </message> <message> <source>Welcome to nobleNote! This is the first time that nobleNote has been started. You are encouraged to use the standard path, but you can also choose a directory located on the system. Please note that the notes won't be saved on your drive if you do.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The set path for the notes does not exist. Maybe it has been moved or renamed. You can choose a new directory where the notes are or where they will be saved in.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The path where the notes are located is not writable. Maybe your drive is running in read only mode.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The path where the notes are located is not writable. You can choose a new directory where the notes will be saved in. Otherwise changes might not be saved.</source> <translation type="unfinished"></translation> </message> </context> </TS> ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/translations/noblenote_de_DE.ts�������������������������������������������������0000664�0001750�0001750�00000053531�13502176303�021377� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> <TS version="2.1" language="de_DE"> <context> <name>Backup</name> <message> <source>Indexing notes...</source> <translation>Indiziere Notizen...</translation> </message> <message> <source>Indexing trash...</source> <translation>Indiziere Papierkorb...</translation> </message> </context> <context> <name>FileSystemModel</name> <message> <source>Files could not be dropped</source> <translation>Dateien konnten nicht abgelegt werden</translation> </message> <message> <source>The files could not be dropped because files of the same names are already existing in this notebook: %1</source> <translation>Die Dateien konnten nicht abgelegt werden da in diesem Verzeichnis bereits Dateien mit diesen Namen existieren: %1</translation> </message> <message> <source>The file could not be dropped because a file with the same name already exists in this notebook: %1</source> <translation>Die Datei konnten nicht abgelegt werden da in diesem Verzeichnis bereits eine Datei mit diesen Namen existiert: %1</translation> </message> <message> <source>File could not be dropped</source> <translation>Datei konnte nicht abgelegt werden</translation> </message> </context> <context> <name>HtmlNoteWriter</name> <message> <source>default</source> <translation>Standard</translation> </message> <message> <source>untitled note</source> <translation>Unbenannte Notiz</translation> </message> </context> <context> <name>MainWindow</name> <message> <source>&Minimize</source> <translation>&Minimieren</translation> </message> <message> <source>&Quit</source> <translation>&Schließen</translation> </message> <message> <source>default</source> <translation>Vorgabe</translation> </message> <message> <source>&Restore</source> <translation>&Wiederherstellen</translation> </message> <message> <source>Note does not exist</source> <translation>Notiz existiert nicht</translation> </message> <message> <source>new note</source> <translation>Neue Notiz</translation> </message> <message> <source>new note (%1)</source> <translation>Neue Notiz (%1)</translation> </message> <message> <source>Type to search for notes</source> <translation>Zum suchen nach Notizen tippen</translation> </message> <message> <source>The selected note cannot be opened because it has been moved or renamed!</source> <translation>Die ausgewählte Notiz kann nicht geöffnet werden, weil sie verschoben oder umbenannt wurde!</translation> </message> <message> <source>new notebook</source> <translation>Neues Notizbuch</translation> </message> <message> <source>new notebook (%1)</source> <translation>Neues Notizbuch (%1)</translation> </message> <message> <source>Delete Notebook</source> <translation>Lösche Notizbuch</translation> </message> <message> <source>Are you sure you want to delete the notebook "%1" and move all containing notes to the trash?</source> <translation>Sind Sie sicher, dass Sie das Notizbuch "%1" löschen und alle enthaltenen Notizen in den Papierkorb schieben wollen?</translation> </message> <message> <source>Notebook could not be deleted</source> <translation>Notizbuch konnte nicht gelöscht werden</translation> </message> <message> <source>The notebook could not be deleted because one notebook must remain</source> <translation>Das Notizbuch konnte nicht gelöscht werden da mindestens ein Notizbuch vorhanden sein muss</translation> </message> <message> <source>The notebook could not be deleted because one or more notes inside the notebook could not be deleted.</source> <translation>Das Notizbuch konnte nicht gelöscht werden, da eine oder mehrere Notizen in dem Notizbuch nicht gelöscht werden konnten.</translation> </message> <message> <source>Delete Note</source> <translation>Lösche Notiz</translation> </message> <message> <source>Are you sure you want to move the note %1 to the trash?</source> <translation>Sind Sie sicher, dass Sie die Notiz %1 in den Papierkob schieben wollen?</translation> </message> <message> <source>Delete Multiple Notes</source> <translation>Löschen mehrerer Notizen bestätigen</translation> </message> <message> <source>&Open notes</source> <translation>Notiz &öffnen</translation> </message> <message> <source>&Delete notes</source> <translation>Notizen &löschen</translation> </message> <message> <source>Show &Source</source> <translation>&Quelltext anzeigen</translation> </message> <message> <source>Copy error</source> <translation>Fehler beim Kopieren</translation> </message> <message> <source>Notes of the same names already exist in this notebook: %1</source> <translation>In diesem Notizbuch existieren bereits Notizen mit diesem Namen: %1</translation> </message> <message> <source>About </source> <translation>Über </translation> </message> <message> <source>nobleNote</source> <translation>nobleNote</translation> </message> <message> <source>&File</source> <translation>&Datei</translation> </message> <message> <source>&Settings</source> <translation>&Einstellungen</translation> </message> <message> <source>&Help</source> <translation>&Hilfe</translation> </message> <message> <source>&View</source> <translation>&Ansicht</translation> </message> <message> <source>&Edit</source> <translation>&Bearbeiten</translation> </message> <message> <source>Ctrl+Q</source> <translation>Strg+Q</translation> </message> <message> <source>&Import</source> <translation>&Importieren</translation> </message> <message> <source>&Configure...</source> <translation>&Anpassen...</translation> </message> <message> <source>Ctrl+P</source> <translation>Strg+P</translation> </message> <message> <source>&About</source> <translation>&Über</translation> </message> <message> <source>&Show toolbar</source> <translation>&Werkzeugleiste anzeigen</translation> </message> <message> <source>Ctrl+Shift+T</source> <translation>Strg+Umschalt+T</translation> </message> <message> <source>&Trash</source> <translation>&Papierkorb</translation> </message> <message> <source>Ctrl+T</source> <translation>Strg+T</translation> </message> <message> <source>&History</source> <translation>&Verlauf</translation> </message> <message> <source>Ctrl+Shift+H</source> <translation>Strg+Umschalt+H</translation> </message> <message> <source>&New notebook</source> <translation>&Neues Notizbuch</translation> </message> <message> <source>Ctrl+N</source> <translation>Strg+N</translation> </message> <message> <source>&Rename notebook</source> <translation>Notizbuch &umbenennen</translation> </message> <message> <source>Ctrl+R</source> <translation>Strg+R</translation> </message> <message> <source>&Delete notebook</source> <translation>Notizbuch &löschen</translation> </message> <message> <source>Ctrl+D</source> <translation>Strg+D</translation> </message> <message> <source>&New note</source> <translation>&Neue Notiz</translation> </message> <message> <source>Ctrl+Shift+N</source> <translation>Strg+Umschalt+N</translation> </message> <message> <source>&Rename note</source> <translation>Notiz &umbenennen</translation> </message> <message> <source>Ctrl+Shift+R</source> <translation>Strg+Umschalt+R</translation> </message> <message> <source>&Delete note</source> <translation>Notiz &löschen</translation> </message> <message> <source>Ctrl+Shift+D</source> <translation>Strg+Umschalt+D</translation> </message> <message> <source>&Cut</source> <translation>&Ausschneiden</translation> </message> <message> <source>Ctrl+X</source> <translation>Strg+X</translation> </message> <message> <source>&Paste</source> <translation>&Einfügen</translation> </message> <message> <source>Ctrl+V</source> <translation>Strg+V</translation> </message> <message> <source>Are you sure you want to move these %1 notes to the trash? %2</source> <translation>Sind Sie sicher, dass Sie dise %1 Notizen in den Papierkorb verschieben wollen? %2</translation> </message> <message> <source>Open recent</source> <translation type="unfinished"></translation> </message> <message> <source>a</source> <translation type="unfinished"></translation> </message> <message> <source><h1>%1 version %2</h1><p><b>%1</b> is a note taking application</p><p>Copyright (C) %3 Christian Metscher, Fabian Deuchler</p><p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p></source> <translation type="unfinished"></translation> </message> </context> <context> <name>Note</name> <message> <source>Note-Editor</source> <translation>Notiz-Editor</translation> </message> <message> <source>Hide Toolbars</source> <translation type="unfinished"></translation> </message> <message> <source>Show Toolbars</source> <translation type="unfinished"></translation> </message> </context> <context> <name>NoteDescriptor</name> <message> <source>Note does not exist</source> <translation>Notiz existiert nicht</translation> </message> <message> <source>This note does not longer exist. Do you want to keep the editor open?</source> <translation>Diese Notiz existiert nicht mehr. Wollen Sie den Notizeditor geöffnet lassen?</translation> </message> <message> <source>Note modified</source> <translation>Die Notiz wurde modifiziert</translation> </message> <message> <source>This note has been modified by another instance of %1. Should the note be saved under a different name? Else the note will be reloaded.</source> <translation>Diese Notiz wurde durch eine andere Sitzung von %1 modifiziert. Soll die Notiz unter einem anderen Namen gespeichert werden? Andernfalls wird die Notiz neu geladen.</translation> </message> </context> <context> <name>NoteImporter</name> <message> <source>Select one or more tomboy or gnote notes</source> <translation>Wählen Sie eine oder mehrere Tomboy- oder Gnote-Notizen aus</translation> </message> <message> <source>Notes</source> <translation>Notizen</translation> </message> <message> <source>Importing notes...</source> <translation>Importiere Notizen...</translation> </message> </context> <context> <name>Preferences</name> <message> <source>Preferences</source> <translation>Einstellungen</translation> </message> <message> <source>&Browse ...</source> <translation>&Durchsuchen...</translation> </message> <message> <source>Note editor default font:</source> <translation>Notizeditor Standardschriftart:</translation> </message> <message> <source>Note editor default size:</source> <translation>Notizeditor Standardgröße:</translation> </message> <message> <source>&Show "Show Source" menu entry</source> <translation type="unfinished"></translation> </message> <message> <source>&Close to tray</source> <translation type="unfinished"></translation> </message> <message> <source>Automatically convert non-HTML notes to the HTML format. If disabled, non-HTML notes are opened read only.</source> <translation>Konvertiere nicht-HTML Notizen automatisch in das HTML-Format. Wenn deaktiviert, werden nicht-HTML Notizen schreibgeschützt geöffnet.</translation> </message> <message> <source>Warning</source> <translation>Warnung</translation> </message> <message> <source>Could not write settings!</source> <translation>Einstellungen konnten nicht geschrieben werden!</translation> </message> <message> <source>Keep old trash folder?</source> <translation>Alten Papierkorb-Ordner behalten?</translation> </message> <message> <source>Do you want to keep the old trash folder associated with the path %1? (You will be able to see the old files in the trash again if you change back to the previous directory.)</source> <translation type="unfinished"></translation> </message> <message> <source>Couldn't delete trash folder</source> <translation>Konnte das Papierkorb-Ordner nicht löschen</translation> </message> <message> <source>Could not delete the trash folder!</source> <translation>Konnte den Papierkorb-Ordner nicht löschen!</translation> </message> <message> <source>Open Directory</source> <translation>Ordner öffnen</translation> </message> <message> <source>The path "%1" is not writable!</source> <translation>Der Pfad "%1" ist nicht beschreibbar!</translation> </message> <message> <source>No Write Access</source> <translation>Kein Schreibzugriff</translation> </message> <message> <source>Width:</source> <translation>Breite: </translation> </message> <message> <source>Height:</source> <translation>Höhe: </translation> </message> <message> <source>&Touch screen scrolling</source> <translation type="unfinished"></translation> </message> <message> <source>Convert notes to the &HTML format</source> <translation type="unfinished"></translation> </message> <message> <source>Number of recently opened notes</source> <translation type="unfinished"></translation> </message> <message> <source>Root directory:</source> <translation type="unfinished"></translation> </message> <message> <source>Backup directroy:</source> <translation type="unfinished"></translation> </message> <message> <source>(Will be updated after pressing OK.)</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TextFormattingToolbar</name> <message> <source>Format actions</source> <translation>Formatierungs-Aktionen</translation> </message> <message> <source>Formattoolbar</source> <translation>Formatierungs-Werkzeugleiste</translation> </message> <message> <source>&Bold</source> <translation>&Fett</translation> </message> <message> <source>&Italic</source> <translation>&Kursiv</translation> </message> <message> <source>&Underline</source> <translation>&Unterstrichen</translation> </message> <message> <source>&Strike Out</source> <translation>&Durchgestrichen</translation> </message> <message> <source>&Hyperlink</source> <translation>&Hyperlink</translation> </message> <message> <source>&Clear formatting</source> <translation>Formatierung &löschen</translation> </message> <message> <source>&Text color...</source> <translation>&Textfarbe...</translation> </message> <message> <source>&Background color...</source> <translation>&Hintergrundfarbe...</translation> </message> <message> <source>Insert hyperlink</source> <translation>Hyperlink einfügen</translation> </message> <message> <source>Addr&ess:</source> <translation>&Adresse:</translation> </message> <message> <source>Bullet point</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TextSearchToolbar</name> <message> <source>Search bar</source> <translation>Suchleiste</translation> </message> <message> <source>Searchtoolbar</source> <translation>Suchleiste</translation> </message> <message> <source>Enter search argument</source> <translation>Suchbegriff eingeben</translation> </message> <message> <source>Find &previous</source> <translation>&aufwärts</translation> </message> <message> <source>Find &next</source> <translation>a&bwärts</translation> </message> <message> <source>&Case sensitive</source> <translation>&Groß- und Kleinschreibung beachten</translation> </message> </context> <context> <name>Trash</name> <message> <source>Trash</source> <translation>Papierkorb</translation> </message> <message> <source>&Restore</source> <translation>&Wiederherstellen</translation> </message> <message> <source>&Delete</source> <translation>&Löschen</translation> </message> <message> <source>Select the notes you want to delete or restore</source> <translation>Wählen Sie die Notizen aus, die Sie Löschen oder Wiederherstellen möchten</translation> </message> <message> <source>Preview</source> <translation>Vorschau</translation> </message> <message> <source>Deleted notes</source> <translation>Gelöschte Notizen</translation> </message> <message> <source>Deleting notes</source> <translation>Löschen von Notizen</translation> </message> <message> <source>Are you sure you want to permanently delete the selected notes?</source> <translation type="unfinished"></translation> </message> </context> <context> <name>Welcome</name> <message> <source>Welcome to nobleNote</source> <translation>Willkommen bei nobleNote</translation> </message> <message> <source>Welcome to nobleNote! This is the first time that nobleNote has been started. You can choose a directory where the notes will be saved in.</source> <translation>Willkommen bei nobleNote! Dies ist das erste Mal, dass nobleNote gestartet wurde. Sie können ein Verzeichnis wählen, wo die Notizen gespeichert werden.</translation> </message> <message> <source>&Browse</source> <translation>&Duchsuchen</translation> </message> <message> <source>Choose a directory</source> <translation>Ordner auswählen</translation> </message> <message> <source>Welcome to nobleNote! This is the first time that nobleNote has been started. You are encouraged to use the standard path, but you can also choose a directory located on the system. Please note that the notes won't be saved on your drive if you do.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The set path for the notes does not exist. Maybe it has been moved or renamed. You can choose a new directory where the notes are or where they will be saved in.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The path where the notes are located is not writable. Maybe your drive is running in read only mode.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The path where the notes are located is not writable. You can choose a new directory where the notes will be saved in. Otherwise changes might not be saved.</source> <translation type="unfinished"></translation> </message> </context> </TS> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/translations/noblenote_ru.ts����������������������������������������������������0000664�0001750�0001750�00000065116�13502176303�021067� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> <TS version="2.1" language="ru"> <context> <name>Backup</name> <message> <source>Indexing notes...</source> <translation>Индексация заметок…</translation> </message> <message> <source>Indexing trash...</source> <translation>Индексация корзины…</translation> </message> </context> <context> <name>FileSystemModel</name> <message> <source>Files could not be dropped</source> <translation>Файлы не могут быть перемещены</translation> </message> <message> <source>The files could not be dropped because files of the same names are already existing in this notebook: %1</source> <translation>Файлы не могут быть перемещены, поскольку файлы с такими именами уже существуют в этом блокноте: %1</translation> </message> <message> <source>The file could not be dropped because a file with the same name already exists in this notebook: %1</source> <translation>Файлы не могут быть перемещены, поскольку файл с такими именем уже существует в этом блокноте: %1</translation> </message> <message> <source>File could not be dropped</source> <translation>Файл не может быть перемещён</translation> </message> </context> <context> <name>HtmlNoteWriter</name> <message> <source>default</source> <translation>по умолчанию</translation> </message> <message> <source>untitled note</source> <translation>без названия</translation> </message> </context> <context> <name>MainWindow</name> <message> <source>&Minimize</source> <translation>&Свернуть</translation> </message> <message> <source>&Quit</source> <translation>&Выход</translation> </message> <message> <source>default</source> <translation>по умолчанию</translation> </message> <message> <source>&Restore</source> <translation>Восст&ановить</translation> </message> <message> <source>Note does not exist</source> <translation>Заметка не существует</translation> </message> <message> <source>new note</source> <translation>новая заметка</translation> </message> <message> <source>new note (%1)</source> <translation>новая заметка (%1)</translation> </message> <message> <source>Type to search for notes</source> <translation>Поиск заметок</translation> </message> <message> <source>The selected note cannot be opened because it has been moved or renamed!</source> <translation>Выбранная заметка не может быть открыта, поскольку она была перемещена или переименована!</translation> </message> <message> <source>new notebook</source> <translation>новый блокнот</translation> </message> <message> <source>new notebook (%1)</source> <translation>новый блокнот (%1)</translation> </message> <message> <source>Delete Notebook</source> <translation>Удалить блокнот</translation> </message> <message> <source>Are you sure you want to delete the notebook "%1" and move all containing notes to the trash?</source> <translation>Удалить блокнот «%1» и переместить всё его содержимое в корзину?</translation> </message> <message> <source>Notebook could not be deleted</source> <translation>Блокнот не может быть удалён</translation> </message> <message> <source>The notebook could not be deleted because one notebook must remain</source> <translation>Этот блокнот не может быть удалён, поскольку должен остаться хотя бы один блокнот</translation> </message> <message> <source>The notebook could not be deleted because one or more notes inside the notebook could not be deleted.</source> <translation>Этот блокнот не может быть удалён, поскольку одна или несколько заметок в нём не могут быть удалены</translation> </message> <message> <source>Delete Note</source> <translation>Удалить заметку</translation> </message> <message> <source>Are you sure you want to move the note %1 to the trash?</source> <translation>Переместить заметку %1 в корзину?</translation> </message> <message> <source>Delete Multiple Notes</source> <translation>Множественное удаление</translation> </message> <message> <source>&Open notes</source> <translation>&Открыть заметки</translation> </message> <message> <source>&Delete notes</source> <translation>&Удалить заметки</translation> </message> <message> <source>Show &Source</source> <translation>Показать &исходный текст</translation> </message> <message> <source>Copy error</source> <translation>Ошибка копирования</translation> </message> <message> <source>Notes of the same names already exist in this notebook: %1</source> <translation>Заметки с такими названиями уже существуют в этом блокноте: %1</translation> </message> <message> <source>About </source> <translation>О программе </translation> </message> <message> <source>nobleNote</source> <translation>nobleNote</translation> </message> <message> <source>&File</source> <translation>&Файл</translation> </message> <message> <source>&Settings</source> <translation>&Настройки</translation> </message> <message> <source>&Help</source> <translation>&Справка</translation> </message> <message> <source>&View</source> <translation>&Вид</translation> </message> <message> <source>&Edit</source> <translation>&Правка</translation> </message> <message> <source>Ctrl+Q</source> <translation>Ctrl+Q</translation> </message> <message> <source>&Import</source> <translation>&Импортировать</translation> </message> <message> <source>&Configure...</source> <translation>&Настроить…</translation> </message> <message> <source>Ctrl+P</source> <translation>Ctrl+P</translation> </message> <message> <source>&About</source> <translation>&О программе</translation> </message> <message> <source>&Show toolbar</source> <translation>По&казать панель инструментов</translation> </message> <message> <source>Ctrl+Shift+T</source> <translation>Ctrl+Shift+T</translation> </message> <message> <source>&Trash</source> <translation>&Корзина</translation> </message> <message> <source>Ctrl+T</source> <translation>Ctrl+T</translation> </message> <message> <source>&History</source> <translation>&История</translation> </message> <message> <source>Ctrl+Shift+H</source> <translation>Ctrl+Shift+H</translation> </message> <message> <source>&New notebook</source> <translation>&Новый блокнот</translation> </message> <message> <source>Ctrl+N</source> <translation>Ctrl+N</translation> </message> <message> <source>&Rename notebook</source> <translation>&Переименовать блокнот</translation> </message> <message> <source>Ctrl+R</source> <translation>Ctrl+R</translation> </message> <message> <source>&Delete notebook</source> <translation>&Удалить блокнот</translation> </message> <message> <source>Ctrl+D</source> <translation>Ctrl+D</translation> </message> <message> <source>&New note</source> <translation>&Новая заметка</translation> </message> <message> <source>Ctrl+Shift+N</source> <translation>Ctrl+Shift+N</translation> </message> <message> <source>&Rename note</source> <translation>&Переименовать заметку</translation> </message> <message> <source>Ctrl+Shift+R</source> <translation>Ctrl+Shift+R</translation> </message> <message> <source>&Delete note</source> <translation>&Удалить заметку</translation> </message> <message> <source>Ctrl+Shift+D</source> <translation>Ctrl+Shift+D</translation> </message> <message> <source>&Cut</source> <translation>&Вырезать</translation> </message> <message> <source>Ctrl+X</source> <translation>Ctrl+X</translation> </message> <message> <source>&Paste</source> <translation>В&ставить</translation> </message> <message> <source>Ctrl+V</source> <translation>Ctrl+V</translation> </message> <message> <source>Are you sure you want to move these %1 notes to the trash? %2</source> <translation>Переместить эти заметки %1 в корзину? %2</translation> </message> <message> <source>Open recent</source> <translation type="unfinished"></translation> </message> <message> <source>a</source> <translation type="unfinished"></translation> </message> <message> <source><h1>%1 version %2</h1><p><b>%1</b> is a note taking application</p><p>Copyright (C) %3 Christian Metscher, Fabian Deuchler</p><p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p></source> <translation type="unfinished"><h1>%1, версия %2</h1><p><b>%1</b> — приложение для создания заметок</p><p>Авторские права (C) %3 Christian Metscher, Fabian Deuchler</p><p>Данная лицензия разрешает лицам, получившим копию данного программного обеспечения и сопутствующей документации (в дальнейшем именуемыми «Программное Обеспечение»), безвозмездно использовать Программное Обеспечение без ограничений, включая неограниченное право на использование, копирование, изменение, добавление, публикацию, распространение, сублицензирование и/или продажу копий Программного Обеспечения, также как и лицам, которым предоставляется данное Программное Обеспечение, при соблюдении следующих условий:</p>Указанное выше уведомление об авторском праве и данные условия должны быть включены во все копии или значимые части данного Программного Обеспечения.<p>ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ НАРУШЕНИЙ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ИСКАМ О ВОЗМЕЩЕНИИ УЩЕРБА, УБЫТКОВ ИЛИ ДРУГИХ ТРЕБОВАНИЙ ПО ДЕЙСТВУЮЩИМ КОНТРАКТАМ, ДЕЛИКТАМ ИЛИ ИНОМУ, ВОЗНИКШИМ ИЗ, ИМЕЮЩИМ ПРИЧИНОЙ ИЛИ СВЯЗАННЫМ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.</p> {1>?} {1 ?} {2<?} {1>?} {1<?} {%3 ?}</translation> </message> </context> <context> <name>Note</name> <message> <source>Note-Editor</source> <translation>Редактор заметок</translation> </message> <message> <source>Hide Toolbars</source> <translation type="unfinished"></translation> </message> <message> <source>Show Toolbars</source> <translation type="unfinished"></translation> </message> </context> <context> <name>NoteDescriptor</name> <message> <source>Note does not exist</source> <translation>Заметка не существует</translation> </message> <message> <source>This note does not longer exist. Do you want to keep the editor open?</source> <translation>Эта заметка более не существует. Не закрывать редактор?</translation> </message> <message> <source>Note modified</source> <translation>Заметка изменена</translation> </message> <message> <source>This note has been modified by another instance of %1. Should the note be saved under a different name? Else the note will be reloaded.</source> <translation>Эта заметка была изменена другим экземпляром %1. Сохранить заметку под другим именем? В противном случае, заметка будет перезаписана.</translation> </message> </context> <context> <name>NoteImporter</name> <message> <source>Select one or more tomboy or gnote notes</source> <translation>Выберите одну или более заметок Tomboy или Gnote</translation> </message> <message> <source>Notes</source> <translation>Заметки</translation> </message> <message> <source>Importing notes...</source> <translation>Импортирую заметки…</translation> </message> </context> <context> <name>Preferences</name> <message> <source>Preferences</source> <translation>Параметры</translation> </message> <message> <source>&Browse ...</source> <translation>&Обзор…</translation> </message> <message> <source>Note editor default font:</source> <translation>Шрифт редактора заметок по умолчанию:</translation> </message> <message> <source>Note editor default size:</source> <translation>Размеры редактора заметок по умолчанию:</translation> </message> <message> <source>&Show "Show Source" menu entry</source> <translation>&Отображать строку меню «Показать исходный текст»</translation> </message> <message> <source>&Close to tray</source> <translation>&Свернуть в трей</translation> </message> <message> <source>Automatically convert non-HTML notes to the HTML format. If disabled, non-HTML notes are opened read only.</source> <translation>Автоматически конвертировать заметки в формат HTML. Если отключено, заметки в формате, отличном от HTML будут открываться в режиме «только для чтения».</translation> </message> <message> <source>Warning</source> <translation>Предупреждение</translation> </message> <message> <source>Could not write settings!</source> <translation>Не могу сохранить настройки!</translation> </message> <message> <source>Keep old trash folder?</source> <translation>Сохранить старый путь к корзины?</translation> </message> <message> <source>Do you want to keep the old trash folder associated with the path %1? (You will be able to see the old files in the trash again if you change back to the previous directory.)</source> <translation>Сохранить старую папку для корзины, ассоциированную с путём %1? (Вы сможете снова увидеть старые файлы в корзине, если выберете путь, который был до этого.)</translation> </message> <message> <source>Couldn't delete trash folder</source> <translation>Не могу удалить папку корзины</translation> </message> <message> <source>Could not delete the trash folder!</source> <translation>Не могу удалить папку корзины!</translation> </message> <message> <source>Open Directory</source> <translation>Открыть каталог</translation> </message> <message> <source>The path "%1" is not writable!</source> <translation>Путь «%1» не имеет прав на запись!</translation> </message> <message> <source>No Write Access</source> <translation>Нет прав на запись</translation> </message> <message> <source>Width:</source> <translation>Ширина: </translation> </message> <message> <source>Height:</source> <translation>Высота: </translation> </message> <message> <source>&Touch screen scrolling</source> <translation>&Прокрутка на сенсорном экране</translation> </message> <message> <source>Convert notes to the &HTML format</source> <translation type="unfinished"></translation> </message> <message> <source>Number of recently opened notes</source> <translation type="unfinished"></translation> </message> <message> <source>Root directory:</source> <translation type="unfinished"></translation> </message> <message> <source>Backup directroy:</source> <translation type="unfinished"></translation> </message> <message> <source>(Will be updated after pressing OK.)</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TextFormattingToolbar</name> <message> <source>Format actions</source> <translation>Форматирование</translation> </message> <message> <source>Formattoolbar</source> <translation>Панель форматирования</translation> </message> <message> <source>&Bold</source> <translation>&Полужирный</translation> </message> <message> <source>&Italic</source> <translation>&Курсив</translation> </message> <message> <source>&Underline</source> <translation>По&дчёркнутый</translation> </message> <message> <source>&Strike Out</source> <translation>&Зачёркнутый</translation> </message> <message> <source>&Hyperlink</source> <translation>&Ссылка</translation> </message> <message> <source>&Clear formatting</source> <translation>&Очистить форматирование</translation> </message> <message> <source>&Text color...</source> <translation>&Цвет текста…</translation> </message> <message> <source>&Background color...</source> <translation>Цвет &фона…</translation> </message> <message> <source>Insert hyperlink</source> <translation>Вставить гиперссылку</translation> </message> <message> <source>Addr&ess:</source> <translation>А&дрес:</translation> </message> <message> <source>Bullet point</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TextSearchToolbar</name> <message> <source>Search bar</source> <translation>Строка поиска</translation> </message> <message> <source>Searchtoolbar</source> <translation>Поиск</translation> </message> <message> <source>Enter search argument</source> <translation>Введите строку для поиска</translation> </message> <message> <source>Find &previous</source> <translation>Найти пред&ыдущее</translation> </message> <message> <source>Find &next</source> <translation>Найте &следующее</translation> </message> <message> <source>&Case sensitive</source> <translation>С &учётом регистра</translation> </message> </context> <context> <name>Trash</name> <message> <source>Trash</source> <translation>Корзина</translation> </message> <message> <source>&Restore</source> <translation>&Восстановить</translation> </message> <message> <source>&Delete</source> <translation>&Удалить</translation> </message> <message> <source>Select the notes you want to delete or restore</source> <translation>Выберите заметки, которые вы хотите удалить или восстановить</translation> </message> <message> <source>Preview</source> <translation>Предварительный просмотр</translation> </message> <message> <source>Deleted notes</source> <translation>Удалённые заметки</translation> </message> <message> <source>Deleting notes</source> <translation>Удаление заметок</translation> </message> <message> <source>Are you sure you want to permanently delete the selected notes?</source> <translation type="unfinished"></translation> </message> </context> <context> <name>Welcome</name> <message> <source>Welcome to nobleNote</source> <translation>Добро пожаловать в nobleNote</translation> </message> <message> <source>Welcome to nobleNote! This is the first time that nobleNote has been started. You can choose a directory where the notes will be saved in.</source> <translation>Добро пожаловать в nobleNote! Это первый запуск программы. Вы можете выбрать каталог, в котором будут храниться заметки.</translation> </message> <message> <source>&Browse</source> <translation>&Обзор</translation> </message> <message> <source>Choose a directory</source> <translation>Выберите каталог</translation> </message> <message> <source>Welcome to nobleNote! This is the first time that nobleNote has been started. You are encouraged to use the standard path, but you can also choose a directory located on the system. Please note that the notes won't be saved on your drive if you do.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The set path for the notes does not exist. Maybe it has been moved or renamed. You can choose a new directory where the notes are or where they will be saved in.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The path where the notes are located is not writable. Maybe your drive is running in read only mode.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The path where the notes are located is not writable. You can choose a new directory where the notes will be saved in. Otherwise changes might not be saved.</source> <translation type="unfinished"></translation> </message> </context> </TS> ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/translations/noblenote_gl.ts����������������������������������������������������0000664�0001750�0001750�00000051136�13502176303�021040� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE TS> <TS version="2.1" language="gl"> <context> <name>Backup</name> <message> <source>Indexing notes...</source> <translation>Indexando as notas...</translation> </message> <message> <source>Indexing trash...</source> <translation>Indexando o lixo...</translation> </message> </context> <context> <name>FileSystemModel</name> <message> <source>Files could not be dropped</source> <translation type="unfinished"></translation> </message> <message> <source>The files could not be dropped because files of the same names are already existing in this notebook: %1</source> <translation type="unfinished"></translation> </message> <message> <source>The file could not be dropped because a file with the same name already exists in this notebook: %1</source> <translation type="unfinished"></translation> </message> <message> <source>File could not be dropped</source> <translation type="unfinished"></translation> </message> </context> <context> <name>HtmlNoteWriter</name> <message> <source>default</source> <translation>predeterminado</translation> </message> <message> <source>untitled note</source> <translation>nota sen título</translation> </message> </context> <context> <name>MainWindow</name> <message> <source>&Minimize</source> <translation>&Minimizar</translation> </message> <message> <source>&Quit</source> <translation>&Saír</translation> </message> <message> <source>default</source> <translation>predeterminado</translation> </message> <message> <source>&Restore</source> <translation>&Restabelecer</translation> </message> <message> <source>Note does not exist</source> <translation>Non existe a nota</translation> </message> <message> <source>new note</source> <translation>nova nota</translation> </message> <message> <source>new note (%1)</source> <translation>nova nota (%1)</translation> </message> <message> <source>Type to search for notes</source> <translation>Escriba para buscar notas</translation> </message> <message> <source>The selected note cannot be opened because it has been moved or renamed!</source> <translation>Non é posíbel abrir a nota seleccionada xa que foi movida ou remomeada.</translation> </message> <message> <source>new notebook</source> <translation>caderno de notas novo</translation> </message> <message> <source>new notebook (%1)</source> <translation>caderno de notas novo (%1)</translation> </message> <message> <source>Delete Notebook</source> <translation>Eliminar este caderno de notas</translation> </message> <message> <source>Are you sure you want to delete the notebook "%1" and move all containing notes to the trash?</source> <translation type="unfinished"></translation> </message> <message> <source>Notebook could not be deleted</source> <translation type="unfinished"></translation> </message> <message> <source>The notebook could not be deleted because one notebook must remain</source> <translation type="unfinished"></translation> </message> <message> <source>The notebook could not be deleted because one or more notes inside the notebook could not be deleted.</source> <translation type="unfinished"></translation> </message> <message> <source>Delete Note</source> <translation>Eliminar a nota</translation> </message> <message> <source>Are you sure you want to move the note %1 to the trash?</source> <translation>Confirma que quere mover a nota %1 ao lixo?</translation> </message> <message> <source>Delete Multiple Notes</source> <translation>Eliminar múltiples notas</translation> </message> <message> <source>&Open notes</source> <translation>&Abrir notas</translation> </message> <message> <source>&Delete notes</source> <translation>&Eliminar notas</translation> </message> <message> <source>Show &Source</source> <translation type="unfinished"></translation> </message> <message> <source>Copy error</source> <translation>Produciuse un erro ao copiar</translation> </message> <message> <source>Notes of the same names already exist in this notebook: %1</source> <translation type="unfinished"></translation> </message> <message> <source>About </source> <translation>Sobre </translation> </message> <message> <source>nobleNote</source> <translation>nobleNote</translation> </message> <message> <source>&File</source> <translation>&Ficheiro</translation> </message> <message> <source>&Settings</source> <translation>&Configuracións</translation> </message> <message> <source>&Help</source> <translation>&Axuda</translation> </message> <message> <source>&View</source> <translation>&Ver</translation> </message> <message> <source>&Edit</source> <translation>&Editar</translation> </message> <message> <source>Ctrl+Q</source> <translation>Ctrl+Q</translation> </message> <message> <source>&Import</source> <translation>&Importar</translation> </message> <message> <source>&Configure...</source> <translation>&Configurar...</translation> </message> <message> <source>Ctrl+P</source> <translation>Ctrl+P</translation> </message> <message> <source>&About</source> <translation>&Sobre</translation> </message> <message> <source>&Show toolbar</source> <translation>&Amosar a barra de ferramentas</translation> </message> <message> <source>Ctrl+Shift+T</source> <translation>Ctrl+Maiús+T</translation> </message> <message> <source>&Trash</source> <translation>&Lixo</translation> </message> <message> <source>Ctrl+T</source> <translation>Ctrl+T</translation> </message> <message> <source>&History</source> <translation>&Historial</translation> </message> <message> <source>Ctrl+Shift+H</source> <translation>Ctrl+Maiús+H</translation> </message> <message> <source>&New notebook</source> <translation>&Novo caderno de notas</translation> </message> <message> <source>Ctrl+N</source> <translation>Ctrl+N</translation> </message> <message> <source>&Rename notebook</source> <translation>&Renomear o caderno de notas</translation> </message> <message> <source>Ctrl+R</source> <translation>Ctrl+R</translation> </message> <message> <source>&Delete notebook</source> <translation>&Eliminar o caderno de notas</translation> </message> <message> <source>Ctrl+D</source> <translation>Ctrl+D</translation> </message> <message> <source>&New note</source> <translation>&Nota nova</translation> </message> <message> <source>Ctrl+Shift+N</source> <translation>Ctrl+Maiús+N</translation> </message> <message> <source>&Rename note</source> <translation>&Renomear a nota</translation> </message> <message> <source>Ctrl+Shift+R</source> <translation>Ctrl+Maiús+R</translation> </message> <message> <source>&Delete note</source> <translation>&Eliminar a nota</translation> </message> <message> <source>Ctrl+Shift+D</source> <translation>Ctrl+Maiús+D</translation> </message> <message> <source>&Cut</source> <translation>&Cortar</translation> </message> <message> <source>Ctrl+X</source> <translation>Ctrl+X</translation> </message> <message> <source>&Paste</source> <translation>&Pegar</translation> </message> <message> <source>Ctrl+V</source> <translation>Ctrl+V</translation> </message> <message> <source>Are you sure you want to move these %1 notes to the trash? %2</source> <translation>Confirma que quere mover estas %1 notas ao lixo? %2</translation> </message> <message> <source>Open recent</source> <translation type="unfinished"></translation> </message> <message> <source>a</source> <translation type="unfinished"></translation> </message> <message> <source><h1>%1 version %2</h1><p><b>%1</b> is a note taking application</p><p>Copyright (C) %3 Christian Metscher, Fabian Deuchler</p><p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.<p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</p></source> <translation type="unfinished"></translation> </message> </context> <context> <name>Note</name> <message> <source>Note-Editor</source> <translation>Editor de notas</translation> </message> <message> <source>Hide Toolbars</source> <translation type="unfinished"></translation> </message> <message> <source>Show Toolbars</source> <translation type="unfinished"></translation> </message> </context> <context> <name>NoteDescriptor</name> <message> <source>Note does not exist</source> <translation>Non existe a nota</translation> </message> <message> <source>This note does not longer exist. Do you want to keep the editor open?</source> <translation type="unfinished"></translation> </message> <message> <source>Note modified</source> <translation>Nota modificada</translation> </message> <message> <source>This note has been modified by another instance of %1. Should the note be saved under a different name? Else the note will be reloaded.</source> <translation type="unfinished"></translation> </message> </context> <context> <name>NoteImporter</name> <message> <source>Select one or more tomboy or gnote notes</source> <translation type="unfinished"></translation> </message> <message> <source>Notes</source> <translation>Notas</translation> </message> <message> <source>Importing notes...</source> <translation>Importando notas...</translation> </message> </context> <context> <name>Preferences</name> <message> <source>Preferences</source> <translation>Preferencias</translation> </message> <message> <source>&Browse ...</source> <translation>&Examinar...</translation> </message> <message> <source>Note editor default font:</source> <translation type="unfinished"></translation> </message> <message> <source>Note editor default size:</source> <translation type="unfinished"></translation> </message> <message> <source>&Show "Show Source" menu entry</source> <translation type="unfinished"></translation> </message> <message> <source>&Close to tray</source> <translation>&Pechar na área de notificación</translation> </message> <message> <source>Automatically convert non-HTML notes to the HTML format. If disabled, non-HTML notes are opened read only.</source> <translation type="unfinished"></translation> </message> <message> <source>Warning</source> <translation>Aviso</translation> </message> <message> <source>Could not write settings!</source> <translation type="unfinished"></translation> </message> <message> <source>Keep old trash folder?</source> <translation>Manter no antigo cartafol do lixo?</translation> </message> <message> <source>Do you want to keep the old trash folder associated with the path %1? (You will be able to see the old files in the trash again if you change back to the previous directory.)</source> <translation type="unfinished"></translation> </message> <message> <source>Couldn't delete trash folder</source> <translation>Non foi posíbel eliminar o cartafol do lixo</translation> </message> <message> <source>Could not delete the trash folder!</source> <translation>Non é posíbel eliminar o cartafol do lixo</translation> </message> <message> <source>Open Directory</source> <translation>Abrir un directorio</translation> </message> <message> <source>The path "%1" is not writable!</source> <translation>Non é posíbel escribir na ruta «%1»</translation> </message> <message> <source>No Write Access</source> <translation>Non hai acceso de escritura</translation> </message> <message> <source>Width:</source> <translation>Largo: </translation> </message> <message> <source>Height:</source> <translation>Alto: </translation> </message> <message> <source>&Touch screen scrolling</source> <translation type="unfinished"></translation> </message> <message> <source>Convert notes to the &HTML format</source> <translation type="unfinished"></translation> </message> <message> <source>Number of recently opened notes</source> <translation type="unfinished"></translation> </message> <message> <source>Root directory:</source> <translation type="unfinished"></translation> </message> <message> <source>Backup directroy:</source> <translation type="unfinished"></translation> </message> <message> <source>(Will be updated after pressing OK.)</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TextFormattingToolbar</name> <message> <source>Format actions</source> <translation>Accións de formato</translation> </message> <message> <source>Formattoolbar</source> <translation></translation> </message> <message> <source>&Bold</source> <translation>&Negriña</translation> </message> <message> <source>&Italic</source> <translation>&Itálica</translation> </message> <message> <source>&Underline</source> <translation>&Subliñado</translation> </message> <message> <source>&Strike Out</source> <translation>&Riscado</translation> </message> <message> <source>&Hyperlink</source> <translation>&Ligazón</translation> </message> <message> <source>&Clear formatting</source> <translation>&Limpar o formato</translation> </message> <message> <source>&Text color...</source> <translation>Cor do &texto…</translation> </message> <message> <source>&Background color...</source> <translation>Cor do &fondo…</translation> </message> <message> <source>Insert hyperlink</source> <translation>Inserir ligazón</translation> </message> <message> <source>Addr&ess:</source> <translation>&Enderezos:</translation> </message> <message> <source>Bullet point</source> <translation type="unfinished"></translation> </message> </context> <context> <name>TextSearchToolbar</name> <message> <source>Search bar</source> <translation>Barra de buscas</translation> </message> <message> <source>Searchtoolbar</source> <translation type="unfinished"></translation> </message> <message> <source>Enter search argument</source> <translation>Introduza o argumento da busca</translation> </message> <message> <source>Find &previous</source> <translation>Buscar &anterior</translation> </message> <message> <source>Find &next</source> <translation>Buscar &seguinte</translation> </message> <message> <source>&Case sensitive</source> <translation>&Distinguir as maiúsculas</translation> </message> </context> <context> <name>Trash</name> <message> <source>Trash</source> <translation>Lixo</translation> </message> <message> <source>&Restore</source> <translation>&Restabelecer</translation> </message> <message> <source>&Delete</source> <translation>&Eliminar</translation> </message> <message> <source>Select the notes you want to delete or restore</source> <translation>Seleccione as notas que quere eliminar ou restaurar</translation> </message> <message> <source>Preview</source> <translation>Vista previa</translation> </message> <message> <source>Deleted notes</source> <translation>Notas eliminadas</translation> </message> <message> <source>Deleting notes</source> <translation>Eliminando notas</translation> </message> <message> <source>Are you sure you want to permanently delete the selected notes?</source> <translation type="unfinished"></translation> </message> </context> <context> <name>Welcome</name> <message> <source>Welcome to nobleNote</source> <translation>Benvido/a a nobleNote</translation> </message> <message> <source>Welcome to nobleNote! This is the first time that nobleNote has been started. You can choose a directory where the notes will be saved in.</source> <translation type="unfinished"></translation> </message> <message> <source>&Browse</source> <translation>&Examinar</translation> </message> <message> <source>Choose a directory</source> <translation>Escolla un directorio</translation> </message> <message> <source>Welcome to nobleNote! This is the first time that nobleNote has been started. You are encouraged to use the standard path, but you can also choose a directory located on the system. Please note that the notes won't be saved on your drive if you do.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The set path for the notes does not exist. Maybe it has been moved or renamed. You can choose a new directory where the notes are or where they will be saved in.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The path where the notes are located is not writable. Maybe your drive is running in read only mode.</source> <translation type="unfinished"></translation> </message> <message> <source>Welcome to nobleNote! The path where the notes are located is not writable. You can choose a new directory where the notes will be saved in. Otherwise changes might not be saved.</source> <translation type="unfinished"></translation> </message> </context> </TS> ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/fileiconprovider.cpp������������������������������������������������������������0000664�0001750�0001750�00000003303�13502176303�017340� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher <hakaishi@web.de>, Fabian Deuchler <Taiko000@gmail.com> * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "fileiconprovider.h" FileIconProvider::FileIconProvider() { } QIcon FileIconProvider::icon(const QFileInfo &info) const { if(info.isDir()) return QIcon(":folder"); if(info.isFile()) { if(cutFiles.contains(info.absoluteFilePath())) return QIcon(":cut_file"); else return QIcon(":file"); } return QFileIconProvider::icon(info); } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/datetime.cpp��������������������������������������������������������������������0000664�0001750�0001750�00000003360�13502176303�015574� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher <hakaishi@web.de>, Fabian Deuchler <Taiko000@gmail.com> * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "datetime.h" QString DateTime::getTimeZoneOffset(QDateTime dt1) { QDateTime dt2 = dt1.toUTC(); dt1.setTimeSpec(Qt::UTC); int offset = dt2.secsTo(dt1) / 3600; if (offset > 0) return QString().sprintf("+%02d:00",offset); return QString().sprintf("%02d:00",offset); } QString DateTime::toISO8601(QDateTime dt) { return dt.toString(Qt::ISODate)+ "." + dt.toString("zzz") + "0000" + getTimeZoneOffset(dt); } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/findfilesystemmodel.cpp���������������������������������������������������������0000664�0001750�0001750�00000020660�13502176303�020050� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher <hakaishi@web.de>, Fabian Deuchler <Taiko000@gmail.com> * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "findfilesystemmodel.h" #include "findfilemodel.h" #include "filesystemmodel.h" #include <QFileSystemModel> #include "htmlnotereader.h" FindFileSystemModel::FindFileSystemModel(QObject *parent) : QSortFilterProxyModel(parent) { } QString FindFileSystemModel::fileName(const QModelIndex &index) const { if(QFileSystemModel* fsm= qobject_cast<QFileSystemModel*>(sourceModel())) return fsm->fileName(mapToSource(index)); else if(FindFileModel* ffm= qobject_cast<FindFileModel*>(sourceModel())) return ffm->fileName(mapToSource(index)); qDebug("FindFileSystemModel::fileName failed: cast failed"); return QString(); } bool FindFileSystemModel::allSizeZero(const QList<QModelIndex> &indices) const { for(QModelIndex idx : indices) { int size = 0; if(QFileSystemModel* fsm= qobject_cast<QFileSystemModel*>(sourceModel())) { // requires QFileInfo wrapper, because QFileSystemModel::size only updates after app restart size = QFileInfo(fsm->filePath(mapToSource(idx))).size(); } else if(FindFileModel* ffm= qobject_cast<FindFileModel*>(sourceModel())) { size = ffm->size(mapToSource(idx)); } if(size > 0) // at least one non-zero { return false; } } return true; } QStringList FindFileSystemModel::fileNames(const QList<QModelIndex> &indices) const { QHash<QModelIndex,QString> names; for(QModelIndex idx : indices) { if(QFileSystemModel* fsm= qobject_cast<QFileSystemModel*>(sourceModel())) names.insert(idx,fsm->fileName(mapToSource(idx))); else if(FindFileModel* ffm= qobject_cast<FindFileModel*>(sourceModel())) names.insert(idx,ffm->fileName(mapToSource(idx))); } return names.values(); } QString FindFileSystemModel::filePath(const QModelIndex &index) const { if(QFileSystemModel* fsm= qobject_cast<QFileSystemModel*>(sourceModel())) return fsm->filePath(mapToSource(index)); else if(FindFileModel* ffm= qobject_cast<FindFileModel*>(sourceModel())) return ffm->filePath(mapToSource(index)); qDebug("FindFileSystemModel::filePath failed: cast failed"); return QString(); } bool FindFileSystemModel::rmdir(const QModelIndex &index) const { if(QFileSystemModel* fsm= qobject_cast<QFileSystemModel*>(sourceModel())) return fsm->rmdir(mapToSource(index)); qDebug("FindFileSystemModel::rmdir failed: cast failed. This method is only implemented for QFileSystemModel"); return false; } QModelIndex FindFileSystemModel::mkdir(const QModelIndex &parent, const QString &name) { if(QFileSystemModel* fsm= qobject_cast<QFileSystemModel*>(sourceModel())) return mapFromSource(fsm->mkdir(mapToSource(parent),name)); qDebug("FindFileSystemModel::mkdir failed: cast failed. This method is only implemented for QFileSystemModel"); return QModelIndex(); } bool FindFileSystemModel::remove(const QModelIndex &index) const { if(QFileSystemModel* fsm= qobject_cast<QFileSystemModel*>(sourceModel())) return fsm->remove(mapToSource(index)); else if(FindFileModel* ffm= qobject_cast<FindFileModel*>(sourceModel())) return ffm->remove(mapToSource(index)); qDebug("FindFileSystemModel::remove failed: cast failed"); return false; } bool FindFileSystemModel::removeList(const QModelIndexList &index) const { bool successfull = true; for(QModelIndex idx : index) { if(QFileSystemModel* fsm= qobject_cast<QFileSystemModel*>(sourceModel())) { if(!fsm->remove(mapToSource(idx))) successfull = false; } else if(FindFileModel* ffm= qobject_cast<FindFileModel*>(sourceModel())) { if(!ffm->remove(mapToSource(idx))) successfull = false; } } if(!successfull) qDebug("FindFileSystemModel::remove failed: one or more files could not be removed"); return successfull; } /*static*/ bool FindFileSystemModel::removeList(const QFileInfoList &fileInfos) { qDebug("FindFileSystemModel::removeList FIXME: removal works?"); bool successfull = true; for(const QFileInfo& fileInfo : fileInfos) { QString path = fileInfo.path(); if(!QFile::remove(fileInfo.path())) successfull = false; } return successfull; } QFileInfo FindFileSystemModel::fileInfo(const QModelIndex &index) const { if(QFileSystemModel* fsm= qobject_cast<QFileSystemModel*>(sourceModel())) return fsm->fileInfo(mapToSource(index)); else if(FindFileModel* ffm= qobject_cast<FindFileModel*>(sourceModel())) return ffm->fileInfo(mapToSource(index)); qDebug("FindFileSystemModel::fileInfo failed : cast failed"); return QFileInfo(); } void FindFileSystemModel::appendFile(QString filePath) { if(FindFileModel* ffm= qobject_cast<FindFileModel*>(sourceModel())) ffm->appendFile(filePath); else qDebug("FindFileSystemModel::appendFile failed: cast failed"); } QModelIndex FindFileSystemModel::setRootPath(const QString &newPath) { if(QFileSystemModel* fsm= qobject_cast<QFileSystemModel*>(sourceModel())) return mapFromSource(fsm->setRootPath(newPath)); qDebug("FindFileSystemModel::setRootPath failed: cast failed"); return QModelIndex(); } QString FindFileSystemModel::rootPath() const { if(QFileSystemModel* fsm= qobject_cast<QFileSystemModel*>(sourceModel())) return fsm->rootPath(); qDebug("FindFileSystemModel::rootPath failed: cast failed"); return QString(); } void FindFileSystemModel::clear() { if(FindFileModel* ffm= qobject_cast<FindFileModel*>(sourceModel())) ffm->clear(); else qDebug("FindFileSystemModel::clear failed: cast failed"); } void FindFileSystemModel::findInFiles(const QString &fileName, const QString &content, const QString &path) { if(FindFileModel* ffm= qobject_cast<FindFileModel*>(sourceModel())) { ffm->findInFiles(fileName,content,path); return; } qDebug("FindFileSystemModel::findInFiles failed: cast failed"); } QModelIndex FindFileSystemModel::index(const QString &path, int column) const { if(QFileSystemModel* fsm= qobject_cast<QFileSystemModel*>(sourceModel())) return mapFromSource(fsm->index(path,column)); qDebug("FindFileSystemModel::index failed: cast failed. This method is only implemented for QFileSystemModel"); return QModelIndex(); } void FindFileSystemModel::copyNotesToBackupDir(const QModelIndexList& indexes) const { for(const QModelIndex& index : indexes) { QString filePath = this->filePath(index); QUuid uuid = HtmlNoteReader::uuid(filePath); if(!uuid.isNull()) QFile::copy(filePath, QSettings().value("backup_dir_path").toString() + QDir::separator() + uuid.toString().mid(1,36)); } } /*static*/ void FindFileSystemModel::copyNotesToBackupDir(const QFileInfoList& fileInfos) { for(const QFileInfo& fileInfo : fileInfos) { QUuid uuid = HtmlNoteReader::uuid(fileInfo.path()); if(!uuid.isNull()) QFile::copy(fileInfo.path(), QSettings().value("backup_dir_path").toString() + QDir::separator() + uuid.toString().mid(1,36)); } } ��������������������������������������������������������������������������������noblenote-1.2.0/src/trash.h�������������������������������������������������������������������������0000664�0001750�0001750�00000003531�13502176303�014566� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher <hakaishi@web.de>, Fabian Deuchler <Taiko000@gmail.com> * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef TRASH_H #define TRASH_H #include "ui_trash.h" #include <QUuid> #include <QFile> #include <QDir> /// /// \brief a Trash window where trashed notes can be inspected and restored /// created by the Backup class /// class Trash : public QDialog, public Ui::Trash { Q_OBJECT public: Trash(QHash<QString,QStringList> *backupDataHash, QWidget *parent = 0); private: QPushButton *deleteOldButton; private slots: void showPreview(); void restoreBackup(); void deleteBackup(); }; #endif //TRASH_H �����������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/xmlnotereader.h�����������������������������������������������������������������0000664�0001750�0001750�00000010205�13502176303�016312� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher <hakaishi@web.de>, Fabian Deuchler <Taiko000@gmail.com> * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef XMLNOTEREADER_H #define XMLNOTEREADER_H #include "abstractnotereader.h" #include <QXmlStreamReader> #include <QTextFrame> #include <QUuid> #include <QDateTime> #include <QFile> #include <QTextDocument> /** * a class reading formatted text in xml files * the format is similar to the xml format used by tomboy/gnote * reading requires a QTextFrame * * Warning: when using a QIODevice for each of the methods XmlNoteReader::read, XmlNoteWriter::write * and the static XmlNoteReader::uuid(QIODevice* devce) * the device must be closed and opened separately * */ class XmlNoteReader : public AbstractNoteReader, protected QXmlStreamReader { public: XmlNoteReader(const QString &filePath, QTextDocument* doc); void read(); // Warning: The application will crash if device* points to a local stack object // that gets destroyed before read() is called void setDevice(QIODevice * device) { QXmlStreamReader::setDevice(device);} QIODevice * device() const { return QXmlStreamReader::device();} // only the root frame is used via QTextFrame* frame = document_->rootFrame(); void setDocument(QTextDocument * document) { document_ = document;} QTextDocument * document() const { return document_;} QUuid uuid() const { return uuid_;} // get the uuid that has been extracted during read() const QString& title() const { return title_;} // get last change date const QDateTime& lastChange() const { return lastChange_;} // get last metadata change date const QDateTime& lastMetadataChange() const { return lastMetadataChange_;} // get create date const QDateTime& createDate() const { return createDate_;} // return the notebook tag, e.g. system:notebook:MyNotebook const QString& tag() const { return tag_; } // reads a uuid from a file, if uuid could not be found, a null uuid is returned static QUuid uuid(QString filePath); // searches all directorys under the given path recursively for a file with the given UUID // returns the first file that contains the given uuid or an empty string if the uuid could not be found or if the given uuid is null static QString findUuid(const QUuid uuid, const QString & path); // heuristic that checks for <note ... > xml element static bool mightBeXmlNote(const QString & filePath); private: void parseXml(); // read the content's of a QIODevice and write the formatted text into a QTextFrame static QUuid parseUuid(QString idStr); void readContent(); // read contents of <note-content> tag QString title_; QTextDocument * document_; QString filePath_; QUuid uuid_; QDateTime lastChange_; QDateTime lastMetadataChange_; QDateTime createDate_; QString tag_; }; #endif // XMLNOTEREADER_H �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/textsearchtoolbar.h�������������������������������������������������������������0000664�0001750�0001750�00000004163�13502176303�017204� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher <hakaishi@web.de>, Fabian Deuchler <Taiko000@gmail.com> * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef TEXTSEARCHTOOLBAR_H #define TEXTSEARCHTOOLBAR_H #include "lineedit.h" #include <QToolBar> #include <QCheckBox> #include <QToolButton> #include <QTextEdit> #include <QLineEdit> class LineEdit; class Highlighter; class TextSearchToolbar : public QToolBar { Q_OBJECT public: explicit TextSearchToolbar(QTextEdit* textEdit,QWidget *parent = 0); QLineEdit* searchLine() { return searchLine_;} public slots: void selectPreviousExpression(); void highlightText(QString str); void selectNextExpression(); void setText(const QString & text); private: QLineEdit *searchLine_; QToolButton *findNext, *findPrevious, *closeSearch; QCheckBox *caseSensitiveBox; QTextEdit *textEdit_; Highlighter *highlighter; QTimer * typingTimer; }; #endif // TEXTSEARCHTOOLBAR_H �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/notedescriptor.cpp��������������������������������������������������������������0000664�0001750�0001750�00000022644�13502176303�017052� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher <hakaishi@web.de>, Fabian Deuchler <Taiko000@gmail.com> * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "notedescriptor.h" #include "htmlnotereader.h" #include "htmlnotewriter.h" #include <QFile> #include <QTimer> #include <QSettings> #include <QMessageBox> #include <QFileInfo> #include <QTextDocument> #include <QDir> #include <QTextStream> #include <QtConcurrentRun> NoteDescriptor::NoteDescriptor(QString filePath,QTextBrowser * textBrowser, TextDocument *document, QWidget *noteWidget) : QObject(noteWidget), readOnly_(false) { initialLock = new Lock; // this will block focusInEvent from the textEdit from signalling stateChange() if this object is constructed noteWidget_ = noteWidget; document_ = document; textBrowser_ = textBrowser; filePath_ = filePath; QTimer::singleShot(0,this,SLOT(load())); // load after gui events have been processed connect(document_,SIGNAL(delayedModificationChanged()),this,SLOT(stateChange())); connect(this,SIGNAL(loadFinished(HtmlNoteReader*)),this,SLOT(onHtmlLoadFinished(HtmlNoteReader*)),Qt::QueuedConnection); // signal across threads, used to load html asynchronous // unlocking stateChange happens in onLoadFinished, which is called by load(); } /** * @brief NoteDescriptor::stateChange * * 1. checks if the file exists and check if its uuid is still the same * 2. rare case: check for modification inside the autosave-interval * 3. reload if modified */ void NoteDescriptor::stateChange() { if(Lock::isLocked()|| readOnly_) return; Lock lock; /// 1. // an filePath_ that still exists and an uuid that has changed means the file has been replaced by another file of the same name if(QFile::exists(filePath_)) { QUuid uuid = HtmlNoteReader::uuid(filePath_); if(!uuid.isNull() && uuid_ != uuid) { findOrReCreate(); } } else // file does not longer exist { findOrReCreate(); } /// 2. // rare: reload a note if it has been modified before autosave has been triggered if(lastChange_ < QFileInfo(filePath_).lastModified()) { if(document_->isModified() && QMessageBox::warning(noteWidget_,tr("Note modified"), tr("This note has been modified by another instance of %1. Should the" " note be saved under a different name? Else the note will be reloaded.").arg( qApp->applicationName()), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { uuid_ = QUuid::createUuid(); title_ = QFileInfo(filePath_).baseName(); createDate_ = QDateTime::currentDateTime(); save(filePath_,uuid_,false); // save under new name with new uuid } else // not modified, silently reload { load(); } return; } /// 3. // reload if modified if(document_->isModified()) { save(filePath_,uuid_,true); document_->setModified(false); return; } } void NoteDescriptor::findOrReCreate() { // search the moved or renamed file by its uuid QString newFilePath = HtmlNoteReader::findUuid(uuid_, QSettings().value("root_path").toString()); if(newFilePath.isEmpty()) { if(QMessageBox::warning(noteWidget_,tr("Note does not exist"), tr("This note does not longer exist. Do you want to keep the editor open?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { title_ = QFileInfo(filePath_).baseName(); if(noteWidget_) noteWidget_->setWindowTitle(title_); // update window title save(filePath_,uuid_,false); // save under old path with new uuid } else { emit close(); } return; } filePath_ = newFilePath; // old filePath_ not longer needed title_ = QFileInfo(filePath_).baseName(); if(noteWidget_) noteWidget_->setWindowTitle(title_); // update window title } void NoteDescriptor::unlockStateChange() { delete initialLock; } void NoteDescriptor::save(const QString& filePath,QUuid uuid, bool overwriteExisting) { if(!overwriteExisting) { // avoid overwriting an existing file (this case might arise when the user clicks a dialog to save a not longer existing note) int counter = 0; QString origPath = filePath_; while(QFile::exists(filePath_)) { ++counter; filePath_ = origPath + QString(" (%1)").arg(counter); } } if(!QDir(QFileInfo(filePath).absolutePath()).exists()) QDir().mkpath(QFileInfo(filePath).absolutePath()); if(!QDir(QSettings().value("backup_dir_path").toString()).exists()) QDir().mkpath(QSettings().value("backup_dir_path").toString()); write(filePath,uuid); // write note QString backup_dir_path = QSettings().value("backup_dir_path").toString(); QString uuidStr = uuid.toString(); uuidStr.chop(1); // } uuidStr = uuidStr.remove(0,1); // { QString backupFilePath = backup_dir_path + QDir::separator() + uuidStr; write(backupFilePath,uuid); // write backup if(noteWidget_) noteWidget_->setWindowTitle(title_); } void NoteDescriptor::write(const QString &filePath, QUuid uuid) { HtmlNoteWriter writer(filePath); writer.setDocument(document_); // TODO uuid null? writer.setUuid(uuid); lastChange_ = QDateTime::currentDateTime(); writer.setLastChange(lastChange_); //writer.setLastMetadataChange(lastMetadataChange_); writer.setCreateDate(createDate_); writer.setTitle(title_); writer.write(); } void NoteDescriptor::load() { AbstractNoteReader * reader; // check if the file is a tomboy note if(XmlNoteReader::mightBeXmlNote(filePath_)) { reader = new XmlNoteReader(filePath_,document_); reader->read(); // XmlNoteReader.read can only be run in the gui thread onLoadFinished(reader); } else { reader = new HtmlNoteReader(filePath_); // run read concurrently // calls onHtmlLoadFinished to set the text document in the gui thread, then calls onLoadFinished QtConcurrent::run(this,&NoteDescriptor::loadHtml,reader); } title_ = QFileInfo(filePath_).baseName(); } void NoteDescriptor::loadHtml(AbstractNoteReader *reader) { reader->read(); emit loadFinished(static_cast<HtmlNoteReader*>(reader)); } // wrapper, because document must be set in ui thread void NoteDescriptor::onHtmlLoadFinished(HtmlNoteReader *reader) { // this call is expensive but cannot moved out of the gui thread because QTextDocument is a QObject which has thread affinity for the // thread is has been created in document_->setHtml(reader->html()); onLoadFinished(reader); } void NoteDescriptor::onLoadFinished(AbstractNoteReader *reader, bool isXmlNote) { if(noteWidget_) noteWidget_->setWindowTitle(title_); // dates can be null, HtmlNoteWriter will generate non null dates createDate_ = reader->createDate(); lastChange_ = QFileInfo(filePath_).lastModified(); uuid_ = reader->uuid(); // can be null QTextCursor cursor(document_); cursor.setPosition(QSettings().value("Notes/"+uuid_.toString()+"_cursor_position").toInt()); textBrowser_->setTextCursor(cursor); delete reader; reader = 0; // incomplete note, overwrite with html format if(isXmlNote /*|| createDate_.isNull()*/ || uuid_.isNull()) { uuid_ = uuid_.isNull() ? QUuid::createUuid() : uuid_; //lastChange_ gets written by save // createDate_ gets written by HtmlNoteWriter readOnly_ = !QSettings().value("convert_notes",true).toBool(); if(!readOnly_) save(filePath_,uuid_,true); // only overwrite if convert_notes is enabled in settings } //lastMetadataChange_ = reader->lastMetadataChange().isNull() ? QFileInfo(filePath).lastModified() : reader->lastMetadataChange(); document_->setModified(false); // avoid emit of delayedModificationChanged() QTimer::singleShot(0,this,SLOT(unlockStateChange())); // enable stateChange() after all events have been processed } bool NoteDescriptor::Lock::isLocked() { return count >0; } int NoteDescriptor::Lock::count = 0; ��������������������������������������������������������������������������������������������noblenote-1.2.0/src/findfilesystemmodel.h�����������������������������������������������������������0000664�0001750�0001750�00000006305�13502176303�017515� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher <hakaishi@web.de>, Fabian Deuchler <Taiko000@gmail.com> * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef FINDFILESYSTEMMODEL_H #define FINDFILESYSTEMMODEL_H #include <QSortFilterProxyModel> #include <QFileInfo> /** * @brief proxy model for both QFileSystemModel and for FindFileModel * that allows access to some methods that exist in both classes * call setSourceModel to an instance of one of these models, * the sourceModel() will be automatically cast to one of these two models * * Important: always use mapToSource and mapFromSource for QModelIndexes */ class FindFileSystemModel : public QSortFilterProxyModel { Q_OBJECT public: explicit FindFileSystemModel(QObject *parent = 0); QString fileName(const QModelIndex & index) const; QStringList fileNames(const QList<QModelIndex> & indices) const; QString filePath(const QModelIndex & index) const; bool rmdir ( const QModelIndex & index ) const; QModelIndex mkdir ( const QModelIndex & parent, const QString & name ); bool remove(const QModelIndex & index) const; bool removeList(const QList<QModelIndex> & index) const; QFileInfo fileInfo(const QModelIndex & index) const; void appendFile(QString filePath); // append file with full path QModelIndex setRootPath(const QString & newPath); QString rootPath() const; void clear(); void findInFiles(const QString& fileName, const QString &content, const QString &path); QModelIndex index ( const QString & path, int column = 0 ) const; // wrapper method for the corresponding QFileSystemModel method void copyNotesToBackupDir(const QModelIndexList &indexes) const; // reads the uuid from each note and copys the note to the backup dir with the uuid as its name static void copyNotesToBackupDir(const QFileInfoList &fileInfos); static bool removeList(const QFileInfoList &fileInfos); bool allSizeZero(const QList<QModelIndex> &indices) const; // true when file size 0 bytes }; #endif // FINDFILESYSTEMMODEL_H ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/htmlnotewriter.h����������������������������������������������������������������0000664�0001750�0001750�00000007140�13502176303�016534� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher <hakaishi@web.de>, Fabian Deuchler <Taiko000@gmail.com> * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef HTMLNOTEWRITER_H #define HTMLNOTEWRITER_H #include <QDateTime> #include <QUuid> #include <QTextDocument> #include <QIODevice> #include <QFile> #include <QCoreApplication> /** * a class writing formatted text in html files * the resulting files can be read by any web browser * * */ class HtmlNoteWriter { Q_DECLARE_TR_FUNCTIONS(HtmlNoteWriter) public: HtmlNoteWriter(const QString &filePath); void write(); // write the content's of document to the specified file void setDocument(QTextDocument* document){ document_ = document; } QTextDocument* document() const { return document_; } // set the note title void setTitle( const QString& title){ title_ = title; } const QString& title() const { return title_; } // uuid is written into the document as a meta element void setUuid(QUuid uuid) { uuid_ = uuid;} QUuid uuid() const {return uuid_;} // does nothing at the moment // set last change date, if not set, the current date is used void setLastChange(const QDateTime& dt) { lastChange_ = dt;} const QDateTime& lastChange() const { return lastChange_;} // does nothing at the moment // set last metadata change date, if not set, the current date is used void setLastMetadataChange(const QDateTime& dt) { lastMetadataChange_ = dt;} const QDateTime& lastMetadataChange() const { return lastMetadataChange_;} // does nothing at the moment // set create date, if not set, the current date is used void setCreateDate(const QDateTime& dt) { createDate_ = dt;} const QDateTime& createDate() const { return createDate_;} // writes the given tomboy xml note as a html note. if creatFolder is true, the file will be created // inside a folder. The name of the folder is determined by the <tag> element // outputPath is a directory static void writeXml2Html(const QString &xmlFilePath, const QString & outputPath); protected: // insert a meta element after the <head> static void insertMetaElement(QString *html, const QString& name, const QString& content); private: QString title_; QTextDocument * document_; QUuid uuid_; QDateTime lastChange_; QDateTime lastMetadataChange_; QDateTime createDate_; QString filePath_; }; #endif // HTMLNOTEWRITER_H ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/textformattingtoolbar.h���������������������������������������������������������0000664�0001750�0001750�00000005531�13502176303�020111� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher <hakaishi@web.de>, Fabian Deuchler <Taiko000@gmail.com> * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #ifndef TEXTFORMATTINGTOOLBAR_H #define TEXTFORMATTINGTOOLBAR_H #include <QToolBar> #include <QFontComboBox> #include <QTextEdit> /** * a toolbar with buttons to format text on a QTextEdit * you must call addToolBar on the MainWindow to add this toolbar * */ class TextFormattingToolbar : public QToolBar { Q_OBJECT public: explicit TextFormattingToolbar(QTextEdit* textEdit,QWidget *parent = 0); public slots: void getFontAndPointSizeOfText(const QTextCharFormat &format); void setFont(QFont font); private slots: void mergeFormatOnWordOrSelection(const QTextCharFormat &format); void clearCharFormat(); // sets a default QTextCharFormat() //void removeWhitespace(); // not connected to a toolbutton void boldText(); void italicText(); void underlinedText(); void strikedOutText(); void insertBulletPoints(); // insert bullet points • void coloredText(); void markedText(); void insertHyperlink(); void fontOfText(const QString &f); void pointSizeOfText(const QString &p); void updateBulletPointToolbarButton(); private: QFontComboBox *fontComboBox; QComboBox *fontSizeComboBox; QAction *actionTextBold; QAction *actionTextItalic; QAction *actionTextUnderline; QAction *actionTextColor; QAction *actionTextBColor; QAction *actionTextStrikeOut; QAction *actionInsertHyperlink; QAction *actionClearFormatting; QAction *actionRemoveWhitespace; QAction *actionBulletPoint; QTextEdit * textEdit_; }; #endif // TEXTFORMATTINGTOOLBAR_H �����������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/noteimporter.cpp����������������������������������������������������������������0000664�0001750�0001750�00000010350�13502176303�016524� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher <hakaishi@web.de>, Fabian Deuchler <Taiko000@gmail.com> * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "noteimporter.h" #include <QFileDialog> #include <QSettings> #include <QWidget> #include <QtConcurrentMap> NoteImporter::NoteImporter(QObject *parent) : QObject(parent) { parentWidget = this->parent()->isWidgetType() ? qobject_cast<QWidget*>(this->parent()) : 0; } void NoteImporter::importDialog() { if(fileDialog) return; importFiles.clear(); //remove old files fileDialog = new QFileDialog(parentWidget, tr("Select one or more tomboy or gnote notes"), QSettings().value("import_path").toString(), tr("Notes")+"(*.note)"); fileDialog->setViewMode(QFileDialog::Detail); fileDialog->setAcceptMode(QFileDialog::AcceptOpen); fileDialog->setFileMode(QFileDialog::ExistingFiles); fileDialog->setOption(QFileDialog::ReadOnly); fileDialog->show(); QObject::connect(fileDialog, SIGNAL(accepted()), this, SLOT(importXmlNotes())); QObject::connect(fileDialog, SIGNAL(rejected()), fileDialog, SLOT(deleteLater())); } void NoteImporter::importXmlNotes() { importFiles = fileDialog->selectedFiles(); if(importFiles.isEmpty()) return; QSettings().setValue("import_path",QFileInfo(importFiles.last()).absolutePath()); dialog = new QProgressDialog(parentWidget); dialog->setLabelText(QString(tr("Importing notes..."))); progressReceiver = new ProgressReceiver(parentWidget); xml2HtmlFunctor.path = QSettings().value("root_path").toString(); xml2HtmlFunctor.p = progressReceiver; futureWatcher = new QFutureWatcher<void>(parentWidget); futureWatcher->setFuture(QtConcurrent::map(importFiles, xml2HtmlFunctor)); QObject::connect(progressReceiver,SIGNAL(valueChanged(int)),dialog, SLOT(setValue(int))); QObject::connect(futureWatcher, SIGNAL(finished()), dialog, SLOT(reset())); QObject::connect(dialog, SIGNAL(canceled()), futureWatcher, SLOT(cancel())); const auto objects = QList<QObject*>() << futureWatcher << dialog << progressReceiver << fileDialog; for(QObject * o : objects) { connect(futureWatcher, SIGNAL(canceled()),o,SLOT(deleteLater())); connect(futureWatcher, SIGNAL(finished()),o,SLOT(deleteLater())); } // QObject::connect(futureWatcher, SIGNAL(canceled()), futureWatcher, SLOT(deleteLater())); // QObject::connect(futureWatcher, SIGNAL(finished()), futureWatcher, SLOT(deleteLater())); // QObject::connect(futureWatcher, SIGNAL(canceled()), dialog, SLOT(deleteLater())); // QObject::connect(futureWatcher, SIGNAL(finished()), dialog, SLOT(deleteLater())); // QObject::connect(futureWatcher, SIGNAL(canceled()), progressReceiver, SLOT(deleteLater())); // QObject::connect(futureWatcher, SIGNAL(finished()), progressReceiver, SLOT(deleteLater())); // QObject::connect(futureWatcher, SIGNAL(canceled()), fileDialog, SLOT(deleteLater())); // QObject::connect(futureWatcher, SIGNAL(finished()), fileDialog, SLOT(deleteLater())); dialog->show(); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/preferences.cpp�����������������������������������������������������������������0000664�0001750�0001750�00000014537�13502176303�016311� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher <hakaishi@web.de>, Fabian Deuchler <Taiko000@gmail.com> * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "preferences.h" #include <QDir> #include <QMessageBox> #include <QTimer> #include <QFileDialog> #include <QRegExp> Preferences::Preferences(QWidget *parent): QDialog(parent) { setupUi(this); settings = new QSettings(this); const auto sizes = QFontDatabase().standardSizes(); for(int size : sizes) fontSizeComboBox->addItem(QString::number(size)); dontQuit->setChecked(settings->value("dont_quit_on_close",false).toBool()); convertNotes->setChecked(settings->value("convert_notes",true).toBool()); showSource->setChecked(settings->value("show_source", false).toBool()); kineticScrolling->setChecked(settings->value("kinetic_scrolling", false).toBool()); silentStart->setChecked(settings->value("Hide_main_at_startup",false).toBool()); sizeSpinHeight->setValue(settings->value("note_editor_default_size",QSize(335,250)).toSize().height()); sizeSpinWidth->setValue(settings->value("note_editor_default_size",QSize(335,250)).toSize().width()); connect(buttonBox, SIGNAL(accepted()), this, SLOT(saveSettings())); connect(browseButton, SIGNAL(clicked(bool)), this, SLOT(setNewPaths())); connect(kineticScrolling,SIGNAL(toggled(bool)),this,SIGNAL(kineticScrollingEnabledChanged(bool))); connect(fontSizeComboBox,SIGNAL(activated(QString)),this,SLOT(setFontSize(QString))); } void Preferences::setFontSize(const QString size) { QFont font; qreal pointSize = size.toFloat(); font.setPointSize(pointSize); font.setFamily(fontComboBox->currentFont().family()); fontComboBox->setFont(font); } void Preferences::showEvent(QShowEvent* show_pref) { rootPathLabel->setText(QDir::toNativeSeparators(settings->value("root_path").toString())); backupPathLabel->setText(QDir::toNativeSeparators(settings->value("backup_dir_path").toString())); rootPath = settings->value("root_path").toString(); originalRootPath = rootPath; QFont font; font.setFamily(settings->value("note_editor_font", "DejaVu Sans").toString()); font.setPointSize(settings->value("note_editor_font_size", 10).toInt()); fontComboBox->setFont(font); fontSizeComboBox->setCurrentIndex(fontSizeComboBox->findText(QString::number (settings->value("note_editor_font_size",10).toInt()))); recentSpin->setValue(settings->value("Number_of_recent_Notes",5).toInt()); QDialog::showEvent(show_pref); } void Preferences::saveSettings() { if(!settings->isWritable()) QMessageBox::warning(this,tr("Warning"),tr("Could not write settings!")); if(rootPath != originalRootPath){ if(QMessageBox::question(this,tr("Keep old trash folder?"), tr("Do you want to keep the old trash folder associated with the path %1? " "(You will be able to see the old files in the trash again if you change " "back to the previous directory.)") .arg(QDir::toNativeSeparators(settings->value("backup_dir_path").toString())), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) { const QList<QFileInfo> backups = QDir(settings->value("backup_dir_path").toString()).entryInfoList(QDir::Files); for(QFileInfo backup : backups) QFile(backup.absoluteFilePath()).remove(); if(!QDir().rmdir(settings->value("backup_dir_path").toString())) QMessageBox::warning(this,tr("Couldn't delete trash folder"), tr("Could not delete the trash folder!")); } settings->setValue("root_path",rootPath); pathChanged(); } settings->setValue("dont_quit_on_close", dontQuit->isChecked()); settings->setValue("convert_notes", convertNotes->isChecked()); settings->setValue("note_editor_default_size", QSize(sizeSpinWidth->value(),sizeSpinHeight->value())); settings->setValue("show_source", showSource->isChecked()); settings->setValue("Hide_main_at_startup", silentStart->isChecked()); settings->setValue("kinetic_scrolling", kineticScrolling->isChecked()); settings->setValue("note_editor_font", fontComboBox->currentFont().family()); settings->setValue("note_editor_font_size", fontComboBox->font().pointSize()); settings->setValue("Number_of_recent_Notes", recentSpin->value()); recentCountChanged(); //to update recent notes list accept(); } QString Preferences::openDir() { QString path; path = QFileDialog::getExistingDirectory(this, tr("Open Directory"), rootPath, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); QFileInfo file(path); if(!file.isWritable() && !path.isEmpty()){ QMessageBox::warning(this,tr("No Write Access"), tr("The path \"%1\" is not writable!").arg(QDir::toNativeSeparators(file.filePath()))); return QString(); } return path; } void Preferences::setNewPaths() { QString newPath = openDir(); if(!newPath.isEmpty()) { rootPath = newPath; rootPathLabel->setText(rootPath); backupPathLabel->setText(tr("(Will be updated after pressing OK.)")); } } �����������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/src/xorcipher.cpp�������������������������������������������������������������������0000664�0001750�0001750�00000003646�13502176303�016012� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/* nobleNote, a note taking application * Copyright (C) 2019 Christian Metscher <hakaishi@web.de>, Fabian Deuchler <Taiko000@gmail.com> * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * nobleNote is licensed under the MIT, see `http://copyfree.org/licenses/mit/license.txt'. */ #include "xorcipher.h" QString XorCipher::encrypt(QString sourceString, ushort key) { QString encryptedString; encryptedString.reserve(sourceString.size()); for(int i = 0; i< sourceString.size(); ++i) { encryptedString+=sourceString.at(i).unicode()^key%255; } return encryptedString; } QString XorCipher::decrypt(QString encryptedString, ushort key) { QString dencryptedString; dencryptedString.reserve(encryptedString.size()); for(int i = 0; i< encryptedString.size(); ++i) { dencryptedString+=encryptedString.at(i).unicode()^key%255; } return dencryptedString; } ������������������������������������������������������������������������������������������noblenote-1.2.0/screenshot/�������������������������������������������������������������������������0000775�0001750�0001750�00000000000�13513631003�014653� 5����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/screenshot/Screenshot1.png����������������������������������������������������������0000664�0001750�0001750�00000100715�13502165236�017573� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR�������l_���sBIT|d�� �IDATxw|E׀{[ڽ BHh!* ]D|ł+(~@k  H %@HB-ew?n$Pd33{fΙ8 &h'+"]c„ Zbb"z"::K&U$99NWb\2ٳݻwt:6mc„ Z߾}իWJ(U`n:Ҙ>}gϞhX ׋,u-%^[nO�&LOddi/LMMr( *R+$IZ jt C]q!I&ƍ?_8]ÓԽjF5?:C� \n�0L&7CQ%<<M@7&-qu ūUt-xjNEß}li+gf:l6PI-Bd4~$Y.H$ATv7TTqFI!j<Ҟ*A=KA@S|#de4$hE 0 bEUպF$*(-k)`ICl) 4Exl.TA+R@;I<xh@zxu-zu-flj;Uy~tz^dQ$< t(ZB-pan"(R^aZv>fF}CitJ+=~~Ț.9E;رc߿ 9'C\J߿qvoN֭پ}; DDD�IJJ*=' J)Ȏyy@RAuy-Fvňf (2!냫1J]z5Lpc3ݰM4]3A(15;vF$I,\IK2a„WիIII̛7r 7(Xi<tcU4άGGp( d$L=\H^/*j2E@{ɋHO8uvm\C=j4-x1j w$#O)߃ /|97Oa+mxᛗ+h)kHTROM R^x<*JǍ7X:mȑ|WxJTŗjvV;vЦM¸3g�G&44vARRR>mCB'yTP4z$U`ԣuz $~�ntlkhH$1F5@@o@V<x=ٙݙ'?xk8 {#eQ# Ёm o g{~&^VYÂ~UUTiGff&ছn*7:22oٳgq1mڴ O4 UU5l6Ǘ_~Y@nj$IX,233;w.7l6W9<d_\^hYoDgң6| "7'�GB?RjV=97:]I33h6 Mbh.7zӄغWJ]iZOSn׏X|\RD~0)CG k֗\ɤ>]ܞ={曉$33TGɜ9s mDPU>};f͚c՝$iZcr-ٳIHH 44Z*lhr@g6 %4IRȋUt:M4;ƕKu$tXL .6 m4?OMC@S:?]̞]2 ގADj<)s ܁>̗ϗҒ!NޞU$qU2("55'x3f0j(<O@I^$Nw*8NdY.^GeNg<T7 o E@|aQFuz@@Kf_ou/Y|>7 ]A+f X,A٦ihwV�h:E,";-k'k\^|<JMStf/�Yfg2N{gϞՎBiI2Xedeeq1n6V+YYYJTTcƌ/@*Jpٛ t3h9RF3NGk@9v }$I.54Yɋ-ω�2�3,F+o4/-ߴ*.kOĆBIτf<V+;wʿE{~WEQx*<gg3UET'nAjj*v!!!dff*nHn&>s U\lD_, ^ AFӃFg1LY: I/WpuRt(DI|Ep*̉p9-bCCw6q`x=d:=2USB 71(}f?&uu:_rͩҙ]PP@6m$++3g ̙3[m۶dddTi.4amĉ'Aهj(7WvÃ8Pt(R, $K3&b-)Z:?f '=qxN_B630}ݎSt;.J>sef߾}�4ma,3nw^ڵkMÆ 9hӦ [nYfU$jժS570H H ؞P 6]vUZMaNNyӜqxN_Cq;UpabX|vj|M022UGCqZ,ȠECdd$dddXpy^20uMd}x֕ЋcO>E 'SS2$fS *%::Y<X,,K GMv~ TM䯢7^L&/3-~l^Mu15$Y|C .l޼w)R iN@p<n^wW.Nw8:L1CDRP5 3<K(V+vZ͂CI1B0B>+q-S(+ހNC .:֭[m6<TPsT{nPD n YXVZnͮ]D<!88N:nݺC,#.h _~y]qITZ@ N\#(H Arʣ*_@@PmA9iIv@P3l߾|IzҲesF j۷cIHH8FTUU9t;v ))霤)tC IHH@s}lYiԨ?' .mC tg)3EQt:93 .mCPgh!N>Ʀ]84mN1iE1Œ8E<˂Fꀯˑ#i'$ Yi0={^ҝҏ؛?Vri8:O عG3Xx+o7 PU@UU$IOǾ}\{0^oxxnN'9bs}R ~O]ݝDDb^"O�#x>4uޑ]u5SNcǎѸqE 6*kңGE)ji/e:%Bll#ڵmwNZݪo/6o"//Eb2iP.Y/$IG`` coW#FFD2W2:N$6$z1XwqCy"uYvXץWԇ\2 .A.gLB.,oDhJ;7߰k׮j]#2C !11ҬC~y T+im8|;NRG=J W}6t$^{rkmܵ[6qjt0{FnAvځNq:41;xp\.\n7GXt196!PJٮ{5VN~g Wo;'Q^wt: ^-�9EOFShoWF=u:dYw_Y*˥aMӸ1̝;MH'[w]\vetҥҸυ|2\T(;L:NҎhz:nۍqr(f"#QTnRn3J2rrr=g&0HO?av+dg#^4<4Qz=z\+,49_&&:2M,'~$IB IϤ~fHdzsEV ^.)qA ey _^_3f䭏F/:dhhc 2zYA/c 2zL@?}ӧOq~KFF5K.UR @cݺu[.\Yrf=app̤^t$: UFFF~ MZPwF=GLdd$k~Yիٕ|{vI>Z5~AAK.&5-lx<6N'995fETSSρ�Eٜ|vWKF=:EQPUNM~C  ZOa7]sazurC?gs^ۻWo~YM6qATU%::X.CER!\hT<JLU'=(x<nnn ǃ&Q͟nrQXhb ^>Ni|ŧDF`wonFGTU~z@pb 突5cN9´i/06B"U.7.տ&/ITK<$yxّz= *EEz4 Y߀V`_ZFJe-gTKyPo~M,f__4~u 00�0<ZBUU?Yf v[@pQϣll%dffKaa!6 UU@K%/�g8].;q9 :EKJI9HZZyDGѤI3kD^IId=HEU@PUEQ4d=Y3eyl߾[,,`N*=ֺunQ}s Î85 7a0x h-(JKp2rxk5]GϬ\4X8o?ZcÎӦM[�4`F#'6!vo$((Mp\c48om!m*y_ݻz˅BʡO˺}N U<rrs9z4)pH[NY_$Q< ?]GXXX>s$aC՘ hzäxhҤ)FɄdbZ18E5sӷzٍz̙=猔=toO�[P@A44TUCa݄׫(*S8ڒȠ-cOJɿzsfGc˯#i^,YD~h޼9hORPP@TTY/;" @�l6[+ҷI+ W+? =vKGx<<u:fш^!x+l ԴØ:9j۷`,K'P~`J ~h(kמr8N£a4j xj$Cufi t# !Ȳ$\ YEp{4LzUPT?C&Sh l8 $~]h6а0{yE�^6E S.4mψ#hذ!Ȳ8ׯ$IU<P]f#00@l6I+VG[۷}@'e4KɈ^ If4Y`(VrKgvvy6#c0ʝ722z!p*A!ajՊ׬:i쯿bl2tԌx7x7�1M>&Itأ ???f3LX%e g-C~q Kp"#q=7$lAbo؊,4;*!SOjoo9NalK/`f<-eDիlFeo.=Kll,q4hpVeRCup6 R٘<H~a!jq!!y'kyG(P:%l{+B͎vҷOroٲc7&a5%!I`iOXXV%KӲeׯI?z-l Te�rћL~PӧI??3 $!#ikD� 4Š+DUeCvӷlKf9z|eٌِh՚Ұ2-]CG` 헟,6<`K yyyLk?^'&&tsHǎϪljsyB@B4M;UՑ4!z=:ڲo.sX,^-;Z,q Z%߿<n:U)5Gl6>cV3;v"+#&> ?k&&@vm1bhаZ'j*&?~~f4Icǎ̛Y:9]~OR|$陹k^ HXh+)T4FQT2ac׮6 VB"bc{e=>YE~}0L?~L"""KJJ jD %eEE+VVz�L~ft:^{b�ѥe\. }f`0`2hݺ۷gYJT#/ۆd7 1c]ta5אIvV|G];w>9/a!6jDhrddp0vp!v1F҇{?K.SX5 oKED~yZPԍƾͧiWU doJ-ѦiT6\;l:|K`4CT.ٛjR, &< tBDD͚5"DUF :ڪkؽzt9X-=Yddd &S &ާ@{pܼ8jeTt؉M[ҠQ,Ytу}08t8-7И"r7+Chа!͛Ǝb|& ҤISvsNfrդχ}AodW@/,ydE/-"WyQ`3&oʞcnXb} MUPUHxCIKK#::Ʉi䐝M&M=2.*y4M+ EBHH{p:8ؽ{v"Ng*΢""N߹g 77CdRع#F|>C:`“ѹKGZN]a<xw~lw}7w}7$=˾M eΜ~7z?vֹeWϝ/.]xtH ;S _p3xsZǭ#rذIvl~Y<< JJ&$$о}{l>|+ר6 q&^/8xbK,f=;v UU "00@[m.mv8 C)x<gԩ|x)^bcc1|sũ/ތV~Cc6O _z%n݆׏<t˖ÕW^Yr9` 885PkVTm۶n(\.ꅚx從L|-QV{` EB݅5%H$.�� �IDAT?ރvOk%czL*Ֆ_ѲeKk~g1TWp!Sӷaw)>mz=aaaXVq:8u|s=Jve^_:Y??bpƓ X,l6j EQQT暘͘fKys&̞Mļ\}5g?~nvv{|u1|pf3&)ǃxIqoW 5G ;@Hp! d|]H^I%u:YOz @^j-~1TWp!Sz=V<SJfo8\PzFVJ^%d~ \%\'-W#>Lx 1 `2JK1<5M][kU:i<nwaA/f+]ǫZW_<dY`0`6 ҡoaDMJ=/9<L&$]eQBmսFp#>C{VNECT TQ4M+U.%ʴd-/ %lInM9@ TJ}XVTUERVm#2bZų,uJ III!..և*)))'-t)By@fسg#??iZ ko ByDZ>@ T1J զ\ϣuu@pRvrʣ\@ \]PU # A@Pmyv"??Ǐ׵( ᄄy9Ǯ]46mԵ(dݴhѢE ϧO>u-EIhh(k֬k1J>kңGE)>SUrqgD==zTeyPP[%URQqzҠN:U뚍7֒4Pjݺu[.,8f+A]cZ}ͥwߺZ?OzxQ~_FJ' /f+o?_M:Uf)/!#|yus_I%aL\'^Kv׆dlC]ckQup4gg@v25&, _?f^V {iw%`Rr;aH0;*5[eTǡa[Fu󸡞 xHx0ʊ!P=au:cƌqUUYj&0D}-.^܉i3d~|C.e Zpϔ}Қ>wasr>^W/$pzE@N/gDG1Dmٸ>I$ bh/י<cG6 q5VrϏi'm֭C•oy"o ϭ"G/f+v~vQ:] _~a̘1z7xdTU#-->7|ÁdܹL<W_}�_v+'|Rn/… y2e 3goΫɓ;w.N�̙36mSNeٲebUKt [r<ߖ5+4{=Gx?Ъvog!9?i[畖 0Yr- _qM׾TMy<UF[Z?]Y+:Q5&F\ nK0BBbзy44%^Iz!X,k;4۶s ;;l':5'jO Q44O:? ڔYNWCSҙ?^iݼ᫃b nշX1_Fhz[wb.TN疧HUOUW+ W )ϿeF}SZz!*~GTUeРA3vXy0L<ӌ5e˖ ^k׮;[n)׳9p�<<\y =z4O?4z+V�`2ѣ'N`۶mdddxkG/dzY}8pntg]ӍҨ<S VȦG&JHT3<3rzYW`ֽƑ4x*kLuv',{u,t?=s5à kƠgWŴܰ,۽h$Z5Uye%w^=1A7'pVz|8ܻ1a,A] ElPaK2%_<EpO2m�oEF:$<7b;§=$RIa ch^|ӎ4U§ү|p^HAh9~ ׁf؁TϐlJ"cT=Yķm<6cl$goJOgL;Yl|ifn>9VXt^Rgewyg9'q8Xvg.fٲ0ivmN4m=SoGlZ.iX35oTcGEnƟi�Ez)EWN*:*[j*rW3}J<sG]͝^kɊ̘16lHhh(�1118 G\.8_^'&&9$I\qa4Ν;F$vEÆ _>z.]pA<zdY&(( ;kؼ}^gi:-;V%z^U*z4Vel߽d5&|?_'tE0N�Yʤf쾛,+ g\˽~N!])',?K~nL~g_UŶmɃgصa ~y^PYx|;2p~S)_N}=fqW>F <b?i08T:wx 3n<E8O" aw9x5"^3dO6Ę\Ǔ[ x=OG"Gq/z]:84FVX3c3 ?DHȞqC0S\?$H Yh{EccSO_KH^??4(K] *T:jt[.\utDyu <:[oϣU$ILvt:ϐ$t_]e,K֯_#Gj*~GH6mc޽ˀOəf4M#++UV$I]Һ44%52[/Ŷ'_w2M}htWҲ2Q;K-?m YC#w<z!;hf3So$)T5E_l&Gzv4o_/qq `3~U.';e5ؼV?JM@anN|I`|D:{cW-CdG dl(dMtx.4&ø׮ Z^cq߿(Iuk6yeƨ:2xz6zܼ`×5IU*_c;9n }L SȲ;t4__c >xsut5C-*~QzqzŮi%NME/0<c³ֹζ>{nT E@Nt:PTu+ʕoYş?ߪSge } r-~zwdb9KVV61~xBBBʝS[ $$$pA͛G X,jՊ#F;2o<:w 7܀|G5sƠWv��$]'f&I2PpIPxPҖRw" i_ܲq8ƦǻШZܨ+>1Y:@1G-,O0%9>iV+8>`a42}ȴQƶ${; �2a~9KYP4PY(!ąF\?þR:U{/ �#޼6ڞ-f13fŠ!*]wcl� k4k0^Ƥsw&ODj7\4{!Vz>e)w[|S,ŷq*'{]*u75YW6"nrlyGWtקF>|dϬZetz233">>իWrTǏ/u|RHDDUUIJJ�>%in, $q!J|Rg;駟#Ǻh}[T_7T =-DS T=Wj6d%_oVVʑ\\<6.1dA4r0$5 gFvKCB e`+HLh^vǖ q#,DDwA ʵl9S@8!r>i%`϶qҮ@.~+tgeR |eWyl$ab<VmNه{Nr=621a$|>ojKf햣85 st+q̭0X 3<ܶr!cZ [hҮ9͉GI۱s+x؉3}'+k"re*a EJ]>V5chM^]qVUOթTy_^RJvs{yI7gM牅GOy3UU5kSLaʔ)⋕dYW^,]W_}Ƶ^KL< VYy|'L2w}N:NDDfѢE<k$''c0ӧ-blݺD:|pRKOOѣÇz`"ymj!fʛ]ϚcT.|i JIȟ *GPX,!H{wyy3MF]Efan@Pq6qc!;*š#߃{WP{FMwVpYsP]^4óy`zw}{??QA$|wEbË9i�Eׅ_,C[xlFdL |]5@hdf݅P"჈ ~} r@,L$ڒ\G^6_qm08~_}z9?S]#Yia槸+)SW,K 3~fNcna:QIOSu*y4M+/|Ӱz>۞_{yJ4˯ª>^Vxw~[V&NXM6'->bĈL@N$66'xc-[e˖'С:tqƕ^ӧ9[M*>''2}r6Xg�ǯ|8WIR n[l44J2kTѽi= BéBi03>KGFr ݸwZEcrsGy0M0_˃Kwa] 52/FҠa(ٚ'a OΦVle*wN,F~EPи>m>^L3$< -FLXd O}.΃Ϭ᏷/gW2DL|]<9e9Br烓c>+>�`Mݓ�7y2uc#kp<9-O(H 7>Me4h)i|G*MXOr`S JOed֕zH&LJ^C5g2?S/xAͰ`Xbz/w`#;ຖFpسg'Nj2#<i_aaw)j#87Ԥ8(IKGRUnJ eÂ.|1nTpz*[B,|> <2u#,,윦wqºPe-8[ǵJ fӦMu-Eƍ ~@pfTjKٷoW&;;Źh jչ@ 0uE&MZ@ ymymI9vںC 9]t) Sz: U),(p !j#@ P@ 6By!j#@ P@ 6^Uwݺu!@ ꐮ]V3Z}gr@ j+Wү_?TU(pMPUw9�{:!38QhNwf AC F"gɒ%hk,N<"fɒ%ʣ&ٛq[$U1qkQ"X.E=噅<"8?Q÷۵YS'bd\e/)kLWOAD e,YҥKYti-z5A^fMy 䡛bk%͉q5לUg<̭x|wp96OesQ.f Ɗмye9q1?ɫ"T\?Eʐ!C8<3Vr]<x0/mu4ɠM >ZlƊND+ IúXߊ،qٍSXvg z.>gJ*$qfаSwA>gWp%kY~{~k|c#ưaFPޔu >z$I"M Lj&>}hLi;I(=d|7brD۹}cf73QIM~ދt(?M x}52)j5Þg@CU5-,/v-@ : ns 5?mopwup.;_VJrX ׻N:ctm &PrYjv񬸍esOm}æX+xN{Gt -y{\'ŹqUZ=&uWܚBHP ps9{b$'ԏ>Gz>bw7fnCKH <7X|䍼ۊ>SlCU[߯uE8oU�r WgoKܝE±埱V妱mWRC|Wԅ7 }9|K {RȾ߆A/*Ѐ9WC|.d>f{^yM*± �~e?pDho/7ʎwhܓGuPPPF99QOS?q=�_yh(q�hÝr ä@ ȨCy[^\W4Y/|Ɔ#ݸsRm$;Bԕwߴ\̟F>N-ܒd[[lKr{#�o�hlZ]0묗cLX^u-` PrXhWHzhErݎt(eMM�D4Н#>dI,v_|Ai9L(6YJO_lnFiI }UUq;"*+LEqYjO-Gܣ=JmhYie9JLr+' ʸ]?�AE*|<qǹ==={>GAQ[^.<ܫP;-\#U_[%#5*ވMY2˾e0>;}hW(ŋg+ҏc7gJD\ s)@AkZ0[s"¡@E,?Ys�� �IDATOf\-Yd8z8Vw01P}ZRJ~'e4￯M'w_�b u[ԚKL*V~OR7̘KfvTG2N3wf4R!z/n-@ovu`iX,vroF!wK)L}mHYK,syHr 7;+Y6S u>*ݩ]}Զp))gUWFv|�@--ΰhʶC[Ouק_D̼a4:K-K~ajftNSpɚ(6BWРuKy㿸dvawӌ9)mզS/&_Kt�8>ۗgJ<<9rWӽv7?}xh7~\|FO輗wIVs=P g>5�G+kN+,Og?N*"iN�fyŵ30>Eыo+N_vVnZu ؃wZœo5GJ>S@x<<V1ӓxIsµ _;T~i@|;tX-[Ƙk %ctpTFt9k:y,W*|m'ќ*>zHr#^AOҬXfH~t#hR�lߝD˙]T?^/kv !nʰalÇ(EAm&W|7ЫB#>Rsdju SBnڼys.Cɓx%o[3m=F|RCǐ(8K2gp ߺ7t 8\tB<x2Ba7 !vBa7 !vBa7 !vBa7 !vBa7 !vBa7 !vBa7 !vBa7 !vBa7 !v+umEɹ9x )SlNZ/ဢ(Bj[!DCI4HOOVjvi̅ ƸEK,&!xP wҠhpprzU} <I�)Ԇj.hEKnٗl%tD \֠_6ɯ[R@q ˠܨ >z%$c`.8DznBwŅ['e`>OlwHWxV~OlV|&ܩ�볥rZ-!=?q \�NTԕ&=ѩT8kØa9: @' L bf@. 2mSS\f !c힇94q0rl0ZꊛGq ce@_}gDRBE m^wS!mxؒرh9=,DBu7p* q^-רBK?:Eld4=B;nxX͘fLD[AMi6+SRX.l 4g5X63sڎ'~-ya,ӻfz35nÜFZZf 94M֬ד9k(#>?,sBqbxXU#ܴZ ƼLذe]z3gx f.Mhx ",@, œ[=tY,kdRQDTw$%S┄BCBiE)+x%^4'^_XJ ]v> 5}Ú?BܕL;k<?:{#"Uxw ΋j1eN[|e\!Jsت}aB!P<B B!&!nB!&!nB!&!nB!&!nB!&!nB!&!nB!&!nB!&qOs <AZ*6 Xc$P3Pcx?EQS{s- pQ[ݞM97xzTuBؿDEE1en`n>0l5Gojd-nŹbFF#K󪻊 Nܶ^xa .Tiߋa(BA3gRN B:u5k-y/Te?0O3^{5PK0yUԐ9'LX2K-EK`FnA(k"ۦDEIKS؞;lXD)RP4^Tm?ezz=zr~GƖWUTpdIZӗ!xgowYN3zEK|?.~:EHjVW״DKF{Z jJ� qO2({ծ,>ά.Eo|~ -!^E><&Nx &你5 v:Egr\ͽLI8u/a^F:ьb9=J^<?/HF~js?_;<fn{\X1ŮK{<c%qw:ʹe[~mcO54ӆeejg~lQݘt-q#p?;mJ?( h%LW2zV|m1K,=54Kb@t*QP?:h49xo5.?bs5tٞr>Gb[<o@Q O }k+ZZ#!m3zGl%fdV{0{tS 5kn }6J~@q(QN+MAqRTƌ^ GЗHa.۲eo:L3hUCodd)2j@"P4:ٞ;!}ScĈ=9rdKepx4;``f Ϳ1eY;kwn;F:*>wr1+q-Znl#1]@?2oe8M w8}C \m99OS:L94(iB1)k ZldĚ3^е|VHLy v{uV"""yԝ\9 +3w63F/k( x^cQ[K˘�- XJh ..Gem[rAJk@9kǯ�//LG8d a<sx/%Uzj gTeOBy�DFFoHk:_a8u8Ǐhy|ǘ+fbl6[ 6):-ݨӧK' c.6fdMi1WkjN$[\/ ƻ]lỳ%a33;a4cܰZFP##2t63bJZ16/)2e.DQHmY/fO==\7 ,9g77mӡʑga<O'4AiNݚ/6ͣ涁jPTgܻsNj1nA7GV!lEzaNRq{癒:t~mYS#Vh[A^b.S*EkH.=BdE2l0Pϒm۶Ѵi{/t|нBdvXs66[7*͛7Sf|nkɏC!DBa"k+q<t/<BM#[!Ƈ"=!8>;=]!=Fa!~<5H ]fYsg(zLeÅ>uʷ;w)%(\Dx_B쯽5C8Rpٴs/=" 5n~Rvv1=!Cd7dBd5ӺP7 gGJ>шSWM;k 4(dj_Y_?+F .3޾<1S:UCV󗇉6pEQ{٬c$BDh\:U˕"0_:Ϧ /EBmR\FS=ƿ[Q\U-N~}ؒiGwd)U *._֙括2U;( N\+B"ȇGAJ_RZyS*3V4iI`bkC* ,DqhŔHn'pn#i\=ғ98%֥ѰsWv"^GN;=çÇj>]FH?ne}<؝|ѣ"NwWSxV~YtOlV|&15zLٰ8fϖ�iԔ=ȁi؂u!ģȇGAϒ2YCNI}3�5^uJ`4UnO/gO)mьm։ЗzRSLQPKe:Lέ˾ڋo8-jY(=ZSvebT-KX>n8di׫-1Nn,@>P]B)*z)Rm:*ԢZ fԘ<U=(z[5NxQ{?Tã %5np#脼jR]$T"wF ظ{!V+n)\IϞ1Q0/32Pq4]B794U7zSW1GxqQ{wnƒ#oYIK.x8-Ry"6ӅD -FO~rL�NxCdO]NT�z>!DPO,HIv]<_j,K?Ƹ p᛻FNImضi {VۀM'2KZx+5<m7M–ˎiܹ#y2WP;{S+R ߟ̢B8m27'YMo,t| c[o /;0g/Z{Fu!#ȏ< !s% YDԉxRIXς-meI%PJ0gԅ0֫4b2.OwU:W2qr%_T++>*Է#餥]w˸ƩZfXw2U+7[DɦƩ/%iQp*͟X2l`1rp9.x$<?5%ŽTo/fʯn~>O߆^=5RGTըQ 6t^W>[cYo_%�֔VSJ;QG* <N_.d!qI  nu8w8*4 xwG_=ՊRo"1|3&2z T Z0Z36u!ģ@J?@֘/]z/Èw{;c:!OVW!DᐒƳ霮3N!BxLw ΋j1eN[|RB;_[ej@mM<u !>y! w̩$&s,ȉ*-{t˯Gbs8k: sP{j!ģ8le%!қ[n|b(ȋb#uC,Wf=O~J뿃8čR'Mx{kv"8;6 !HGTTm0ϤFa55RPtC^6Ǔ~SePeg=٭z8l5aC"E!VwC*ɞMC2wĹ[͙rh+ǧ"F4@Xh7{'lz`fJaƋxxc39a9 fO07]Ŵ> ڵIjɞΛ2OC`y#Uʳ7!qq!gpVIv* BZ"ϺrKő瓖VB#)n!zʅ}M\5EU?N_8$̩I=+kJxc=Vb!?Y uD_J~9?i'[Q_(Y=u& 1urDoyci<yd.9C}Bq E>< ΂eQ}v;83VKM|Ɋid=^Z;¼HrҠ7pO}�.]IqW0iQmEZ6|D(x9#F0`k*ɞINILEGv\2a>,˩kIâ%B]Ҹ~I=g:'b[Bq`K{.x((HIL 8{pupq;0.EX-wJPZ0zڄo~B<LVdfNǚvvGuh[ tǭ&= ,۹_y\HqCu0 9/C=+']Yo $#c { vx&h< 䠫*gͥ]yOx÷E,g5P{sb]J"vžȸ\@CГB񈐒B!jB!&!nB!&!nB!&!nB!&!nB!&!nB!&!nB!&!nB!&!nB!&!nB!V8a ss(M0{S BYW")BQԞi9Wޫ !� u$L's|'t+h4[5S\)*SWL9voʙI-i10`}B!2a+Fkk`1lNHa6T pA((:_jvϾd.%:o-N~}ؒrOa޴UR}z cٻY[?oOF9Ņ['}$b!i4*KxP<?m7bvMS%e>+�+]#!Okp*1W-;uIyOt*0fXEή""m~H?*зK(V7=>X�~�t*{\ƅ.jȱh+nũ.1Z�}E mJeϧ 91Aۯ$_tבN]jSf !cކ-sޣ>BO.]oy{r*i?sXFf~LQf1U`͆4B! EᆇՌldLܾuԔfi9e,u526BqV%a33 =Wj0zLՊ =8šF2@VJ>42YKXC]iBBSaWpjqpt'0N3a~u D 8͜%Y45l�]3Oni;f[1LoS y�+Δ !FS((%xo䷜ڋc~}C) ߦb$vfMϯcB!'Ƴ霮3N!7B!Pq0hSW澅T8 6}!"C!D !nB!&!nB!&!nB!&!nB!&!nB!&!nB!&!nB!&!nB!x-kk載!x<Ŕ)Sz]ɟB{!wȇ̙3SC N:̚56LV1+fS择[ʝֿ'][|r:U =m!}B ՙuҜӠK!Ƈ4]:EV\`i^\|^JqEt#1@>(1qO022Q 3 ̠eЎ^Ӟ+�� �IDATv/s=FIz ht-]9}U/9RSVLV#c >/!x[GarUhܫԡ%G #U91KlhR"P0f>L91y]zQ|k`ң2B<|x1#G$}PB{9a8o;i(�"cTq똱VKpWrqwG0"G.y_*$$ak íuV"""xXvs8Ds�Ɉ9@ՃPi1hr&-ɗHɵWy7e3}>g3}&lQ)J}/;0g/Z{ EKy�DFFo6s:iiin˶4 ^`I͂!qRwڗӁ.asiVt5/)WÊ' 0׺Sp8ӯWi4ƒa1gͩL!HGXH\/õ[f/?4f͏+ߤx|B*+[SVw}.e WC6UF~V>y!�JAFr&]~+x)Æ >�*,ٶmM6Ba(j׮jftf}_Ryfj֬omM<qy!(,B!&!nB!&!nGxb8ϛA gW$7zss(M0{S [BdW@̲^^jdqu=& Jmcx0.:MA !Rã%5H9 Xx<o$vҕ:EAW#c3yŗY7%)k̗D4R9ašY]"3((Z=@ =PA&;X1x �R9 \* Η/9ՌC5PU`iYWyQGBpڵ&"=L1jilOB<&|xS]q;6{%ƝUӸ6"h1rd^u }$ ϊ%p-كO9g5$v`C:αM#ƜұffI] h6n֭).T߄?Yu,so}$b!i4*Kěι<{?hʠu|y,#s ];>?`?ӭ~oמ+5tIxz$NCq E><)7&m'a6ZǼ?z1y#?6M)g,qqkȨv@z`$Z~g{;fq \�NTԕ&=ѩT8kØa9:k5GpO4 Wz ݴ8mEZl:IVbVMfG7%x^v[U!cȇ%B3+,4*gcx~N1_ s9ޮNŦ5g\r~~)\7'2.tQF-F@\]q(N7vaL1Wx*97x[,OBf†#1]@k}-i2HHB=%\jg*gϼT[åIbVa4G퇋:͖EZ2xu;wq$v,Zy4 c>9vڷpE|RSt< Q"?򀂗dFCFv4gɍZ^1#ݚΙU1d/+qa$C 8ʘ>tΈ +i ؼgfjl6c2&rn:jJYɴ2:vda8vŕF5n5'-`JvV|6S{$N8͌}9eCsOSij=eFQs{`ҏ[20Pݺ[~ky}]NP'Tא& ]z[f_5Mѝn;΄ Y%mV /ڥ Ad蚅Sޭb<jnHEL@|\PqKR]!R]!CMC!$<BMC!$<:S_D|!5GxQ9=5Q>3PB#+ɞSہoz6O!xT(xIvrJҠP֝!j_"#|%`RUߔ-\Fd]9MU'Ovet 4[63+Ҡ;?Ϲ6"'L(SFctc|;iEK5Ieko_{w;DRBiJxt&d#NJ|xS['~]TqA{ݷXq2frpd+ 6gVg['T7e�i옱I;HʸD�s_ʟW3_7)g{ &BYٱOR:1]X2C~=fǏ˱]Orf@Li7nB"gx9:(y @WrIGԊgz)l\{"g-Ea*j\M~ZCNI}3 u7itF]ޯqKO@퉓_9'TZo kBV]ݷ Е~cko̽!"/ɮƥR?NtUO݆Ws?"ʔ 2.ƜNjg;TUz&#NkpU&&d\46xϩ *Gr%BC_ :7wt}-z _P!cU]䅏N=k#nȌGX i)zElv.Üjr)du2$. (8!DVGp%ٯc%BX 6wgvƅ=ܮu׫4cɰ ߳T8=IDŏSb7j<]\%D!#wGK3J/B<7"|*Ni\T NէpĔߛ T_Y�t*G_˙tLިΪo/!ă%%م!%مB<$<BMC!$<BM {0zozs)l\R@Y �sH Ϭ <d<qK?LVX0}˱B(y{k|zwjsr1yRG}!DHdQζү;韼˳'w@[)ݻ6WN?QãPJ_xNjEq"A,=밋'3Kk}d~O'z uG(]uZț5mS^$)lO#)`UOa[oơ{зv:%bxTth=8fb\O@oKsS c#x((׽MWs8gbJbWtjf�#{5it V W.ڞy H۸lpe(?iMϢsqUx~)^^y383~V3f{Ob]CxJ T:׆د|w@Ke0�ܶ3_-ϰ\VK|ZBbI+\K`uE.zĵ!VE>< 6%ٯƫN^ƽ*IRw1{Q0>8(* %+tm\ᯏ$ &\b*:0~Xi 7}+ZZ#!m3zJ̪ɬ`4Okb7c˕QƱkDE|A)ArС\9Ž]GKWpLPOG*IfΜɀ{ܯ_Qj֊tO8<^QtIy;ߟ͛7Gy曂fWԸwd ۍe34li#lzΦf~i&_\`K_rS[ 3Żl$)tgySg|l%%9k,4plf̯.x{ Ҟj%fq-4aeeMqlg{/c&%Y7S>6{l\5nٜLQ3mlFv$HpQt-~K* F->ORҠ<.x|a=JŽlrn\6͜=k ywNfd,&FLژU^Oa:^Vs" DogIaٌٜN ̟ JUO_ z37|O% b%-FF9rەߊaHGrY: Fz]ŷ :w~ccn3Tj\B_b,(֟ʟ߶xkT<t6Ǚ> P#Bx"ߋYck{R{Mm 3u{ٮ+zmWpjj mW>e U~7&~7@|dPoe`EMuI|"?!"y!xIx!BIx!BIx!BIx!BIx!BIx!BIx!BIx!Bi_D!DQ(-~l/ !xD\tu֡V fvYZ{Ix!#ٙҥKc0 jjrusyM6V]$.K5pQe(KݎYyHvYc$6TN%"m"t}l<#uzUEKP ^ wB!wv!ʄDZ%4,0«@<?EW&?ѤV&_>FӲBC&JT* ==bZm:R3%˸xaWl>vDT?L@C#AD! ݇!a߾}۳ѕ;-o>v,tq~q>z[l7dledaT>v{Gz?ދD$1zvINsvV>J# w`\G4^Gtqr~α~ �O1bXCsZ1O~æ[JOQ.Kr.ݝDH_F�5ş[2_:N]ט$gz1r[ Pߤ#j-4an&̻R%ǁ˜b[4GUB)Үp6YCenÎ4|DC]>A}^̤%.Bayx+雈;uߝRɳs>52]J젉;J\C^+:y7??Apt[ֺ1üZB} !/<O2t'9Z;E2b8'f>Ծ)t>4l[9csa!#F3&K @Z}{BoyG/4sCU8u?�;Z|!=M|ּsYܿ<(wq|?*$Xsw rX0 z[,4%:Kx=g3tq^o1ӿrT~3CGq0{^nu)93R:l:@eʢUlݷ5;:PE6Aa] @D7>IBO6lm�TڶmM6Ba5k,�'OB!'!nB!&!nnx$|O=CFMwѫkZחm_.Cq|f%WB;U8a7a/LAr,Pp ru{r6O2h껴ǿF605>;CQ>mV#5'd”~I^}SosF~Uw5"%mp.C^Y+j=2v !=lҠh8#~VcNdHHxG_Oj<=F*Ó7GNGףP+ *zjߤqǷxEAʫ_rd3qn�'Iۙ%?Փ`#4[6x6Mx'<(*j-έbqU)(*WB͚ Y8P=ߚ@OD<JE2YH./Y<^^4)`UOc{C1Bةxܭ{4axW;r2)[A/#T>ym]\8#6gb+Q,'`KfϬ6xm7mVneA̧XئcοSX3N.4I4O>{/1/[oJFg>JFNQ>팃Li"sT3)~}-3h|*ef:{;KÁg_tʟW ;Lմ;Xc[l=)VLkXɭ !D!ˋ舣^c׈ TEU o4H2w%jM]_Ss,vFAS ¯]WV G)Lزx2}͔5{ (Zo DlO);p u� Yy#߰`_9F|܃nj4x}P|ʒ#٣&-A#o 3nn0jR'犴l G1b%fdV{0{tS 5k劽qQj\,eZ8L$§t_,iGw%r+8=3isg4g>,W8}.̓pc`[͇jvesJ5g\ fwf&%}!t?.JbԎT|S=aa$}PBa8] 5ŝ9EG `N^6k0M0w$ h,%DMUR-.s'Bɜ8q-gPwPv'ן3O7 j h1f `!R w*u/߉_^C=[+~?M"<vӶ./ןQWt ޺ށyHMQ Bq"$~h7 [F,;vq玔7\߆ƣ4353@2bcۻ88߽¶-J, JjJmvv-O*jlc/"6&<P1QbclRR1>زP싗FC/6M0 taͲC J]d394933#=yg;Unұ5L 4cǣ�a}%ň|{`a1 %= ^-gb-7S]5^NfB.mdŃSLFz9y?AΪ l cI"&GPW crY‡eG6ysL~CvZvs1ǖ!7/vVzl(f/0M5rnF+<n^k8ʯ#`^a·~O+r ɶbUbk`˅˕ ]H@44U1΃,^r?MdV3`mbQ5 uY֯g2b0>쒷*ְ>_|^m üt_&v=kyDM>p5dmdg ?n6n>ǺQhKz5Gdp#+<NsgW|ߤp[A=<fynľ"r#ɷ$wlw5];Nzyz."25`_s��TIDAT 4Mv;pIr3+8DD)&<F à|F'V!*t蕳T|ȓ(O~|>߿7 0f~<earCD$E~LӤ ^7!m'OxH>LQ f<5zS[CDD,Sxey0vVM+<:::ݡ̞cǎ'X.""M5L!"")<DD2X""bCDD,SxeNH$BVVVBDk#P(D4$""- &R""m�LD=����IENDB`���������������������������������������������������noblenote-1.2.0/screenshot/Screenshot0.png����������������������������������������������������������0000664�0001750�0001750�00000103170�13502165236�017570� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������PNG  ��� IHDR�������l_���sBIT|d�� �IDATxw|TU߷Ld2�!& 4bo(ۣugwYY{[t] "ME$L[~ d&PWn{{|~O8E''/7h"sĈL>3L bȲ|e|iؿ?#_BcѢE%\ϮB@ }ٖ"qFJKK/)� `ڴiX sMPlR*^x!˖-@Yh9sL222:=P(躎aHm`$l@ =˱X,g[ƗIl 4觭-Z ؆f:ۭ [M4#$™& PPPf;3w#t~%|iIKK4MT�Z.),",Y ed]BL4]ΗD$,a4ڱ& tC j<]@  7Ynu"ȒR[aARdd$Af/vȘ21%}0g֖GgA*&0 &zxkIi"`uCY1ag[—I貣bHl LA"F `u @$a8l>{/c׃c.4lK\z9v^7}#!2ZDG*M]70BM!<LlѤ2Uӏvk1';�γ<K~Tg sC˘ hsq0+b:n̙1صkGf׮]@uu5t<a(`j* 0BJAIb"(.D A qq5u5KWj,GuWTTp͛$IHtNEu׿u\^WWGaa!ӧOW^ybϟOjj*SWWGbbbiv 01f@G)$uP, Už4MPIӐcdc~0gњ}1kBrԿղi8d ruISiӪgV@{x{gsuא2e(m0"Y=7Ҋt1>[4%1 ]3D"]W-c͛ŋ42 r Èmvٽ{7cƌ!55 /p-B]]w聆0;y(QdI _S3" A"!eMD(VY1TjIp8 ԗs쭷0E W>’V#cKQ]#|a=9Ί7ֽ0^=Jtox?O? wXYPʏSk�&wG?^Jx 3[\ �ֳm_2ljEGlDZ+w)//�`QQQSZgb<~_t'MN^^/"UUUpmqBUU/ nǔ&0ivQQ! =A*HAm*lR (z#mR @O{ 9>-?|K`5q<bUr79`dv_y @)5ehM[r6g1xc"|0˂]N3]8F{]>Ϫqhh|V56%E~N 1ro&##'_UUEFFc߾}ghl< `>mś&//^zZn7IIIK/1h RRRbNmՑMяF7$$U”ed!aj:,J2) Б$e]K +8WI"`SVQ d&�I iHi$4,[[_#XNlC95)m(oomA29j?2^Z(.A�]G pL] Bxbx�{9.\H$ ԗ4M틅@ (&TUEQqyZ!^)Ґd Hft۪`闄lU0!02 Xב~DwdbMu7i7W KUim>w6ITW&7%ϰ0]B |u<7pw[c7t4p(((ॗ^j=˳> СCU]ӦM;MD34S4u+;vS]]adffrm"I)))1l5A'^P€)lS0#:ӊFqX 4"`IO YЋ1ˊ\O%Ija9i~gft!^yuf(򮹎Vp9E.J.O5jtҽ;o2RG>Yeڢ1s .j^TǫQ�3sm^uAhytsE?^t]Gpߏnwէ=&~?%%%yx<Z wIFFz+< ^v]u۶@TR4٢`I֨+KTpN,@RgqB-_0l Q~g׿8smệ)˗?-p0h<^B%, 3pS;n =nPO>n ˭4چ`yya;X8?0K8cusxlzTg˲ܭ[9QNMMM3 y0`��?<wq;ʘH-2|Sv4LtCӱdAG0L7u45)#HV\D,D76OaDN$`K-&z؏ :J ՞@݊*Ks0@Pˍ"A<P$:,'Xq gy¸⵵:t!C9}*8p�ƍcΝߟT '3;v0tИ \4 #d)С*cRHsD"Mr !yd7&믓+GCCɧ˗w<\ с*cwj6 z"XcZH#c8H8J Q@kdeeZtNRRIIIqG01cK0PvͦaQu."郩X&"}K~~>۶mkIpx$zLn"누 hj%K pZ0%TI{_2233q|n՚=#Jb�[o(!|C󆓚G$XK8XEU-Ȋ0oeѣG' c^*=^I$\9$_zk_hq݌={Y n(bzQ@pnĉٸqٖ#n!Sm_*֭[2@ LGO KŪA!C q#@ ⦗G__0ݽ_^D(T nYA3ز/);CgXF1z=#_kscRlMgwx|W'?g$gjKy.mÃgKTg|+?yx>g?XsbS mW2^2,,1{!#"7>. ^^[rV{r9ϑ;?;IvL8eMgM@-+yjoO ae\;13:yOhQM[</#'+F]ͯ~/BeYɞWwmԲmd/ .~&gwm728\R̎]nO;ܸ?@зpFUm(ȝBCf %%]VscDP6ZkEMlWJ`=Y..+AzPa|}OXf-/ls>}{/#͓ʀ 噽~e,<?G6,-f2CԥN熋 $&3b}bUh=rt=4Y']}3*y1ˇ 0jf|=L ߚF^j YC/zϖ�=<} IKef+F~p)d i,>=r;^0!#-<uAgyxO.CpO6Ѓs o?=7b$?dDM=*{qQȜ};#r0y[y'z#{qZţw=1\_;1 q`:a-+&A~-!71K_?yO[=?kʓ,?twZ ロʏUW{Yu&/l۟ p5~];G)Œgp_B:=!֗UsrxڄѰ7[t3\{|mZG8dgg3.V9֫N'Qlk׼͡ΉܙYc#jƫ۲3ɲH\ŷ %c&<KЍ> fI#E $0|}xIL,'>U 7|}6VS#^9O<Cb~s\_gn>Kk4zY9s<F&H %1f JFYAF|\"'d$g %d ϼ x2:WuڿEӼgW%sfM}m|u^p|n?RxnJ&^w!ul _]GE㒍d'Xcu47Y=H}3\%^ȳu6W,J!/VpKR %K(䡿/r7/ՖcԔƑox�θ??h .W^Ko%$.y dzZZs.O^ʷjƒ_#Y~_/?+Ĵ$`Z#^;%Y6=g& -y(RNzg9�+ _6�&n rʭR-wB%h[t| Q:lS?]w%w?sdS3HEcDIHã4RRA:t+G.L%3ꡧxD>x �ݏAؓD3Y񮅚02}478ʳ-:46%m"w?xa+j#OLZĔwR%"+!Ěj?ȀgV/<,n>q%|j>LzBIg?]ohO(L͡:4p$WJ7Q0{KtO k45 壛:cԟWR1 Ň"'ggYLWv1>og+y\Anf1V2^῟AD)up᪂<#q,N)ӿ>K鈫٣Lަ"j8_3&38ɳ%{J7qgbfN`yy5b-Zb饛rԇacsDg;5.OXAf8>?6GBco窘8U(3zuطycxHz ?}w =4^Raޟ~Ǭߤ0#as_3HYtɯ&w9 =Ә~85Xpyx+E+73,݃'c 1:BNaJ+p72i]IZI<w{jۧ0$'~KmY%]�_~9s'ۉt; I~6ܘIw~ 8Og哞EI?pϐ>^XNeo_30OJ?.v:0ZΡ\o f5~Ǯ#.SL -Z|1%C&}#ggCwicU+g]-S?c$8{>fZ&7ƀ>n`}DiUmx<~___#1μ:gOɜ ШYcg1//K#z.p<@ǹ#;Wt\NEsVޯk{ CJ q#@ ⦝۪l9Nfffv;1x3.F [>@ ty nAܴs[3+-@ č0@ 36%h8as9x1t4|>a, $a&`&RG ÇIJJXߏ,˸\.nwiptl8p|E]ill$ p8p\(s3cTW˶ G%l(-$UKi'`ǻ7OJ6&N<{2qV[NOBBBC$ @UUE Offf4FBBl+\,~0. !ٲm^P(D(F2ڬV+.I'aUUX, qKIxHJr: l6Ngt .ʔ)S~:uT�,-yڋWd Z~(%?d{vSQUY¤-!?u47`3P36( dNOsssBKBtV O]]., bŶ(j%=. ]q0~-NEejU:PIӉ۝;E#["1EJ Lyy9(xQծefH;`ƍҝ,E4-uΌJb@L� 1Hp٤FLdLzo)gEW°* ϊx󡤤C<4͘Z$(2$t: qa{슈e,˭ni^j{lδx=jU8vOw}žݟJjJ -Ʀ&PQYI+,>֬]]w>V*KjZH?/Ҁ|> N' >i̙34'] 60et]o3f9|m -YP:tp)dG --> O3RM$j|81 Ǐ"+ ^u:dYP(Ԯ#װ|J端NJ$///MA`PdzT$ID"a*+8t ǎhI)3fL烕+u1_;%%ǏIKKgܸq۩3IBh8L:]W1<˘ǔ)SZݎ%R f(D64BcLT[Z2Ѡ5$t̮>RjΜȇX3M3iȲLff&" MM=8hiϭ9^VFVV:`Q#2d0摒խ'YlX>jjj}H@4ʲ̨Qpݼ¤ϧ a?~UUijlp`ٹsƝGuueee?st]<Z|\'oNJHhӉ4Y!丯3bR 示OStwk|8 #f#р$IX,jki^t: huj$#|ߦҲ* > ; ݁-^/M|{7$&{Xz iYq__Q7ҥKZ=Rrs/4 K^^#!IcSׯbrAF-.7nlYݎEN~P-VV4#ZȀ$KT6xHp݄F7~e�� �IDATp !ߠṙⶊ:#2s3)t[Z-w狠t\z f'?h}}7Æ =p ^Gg}hesfs…\Ա`^ܽء$In:JKJ)*:LjZ*{mBmm-v^~[oISs3j0 Off9˷Uuv,Ȕ %A%{*`W0}ZT6M ! Z_ #uĪ!1i*k<X%X@E?W\Hb`C }ḳިqAeeeL8{MCǟGn~ Ov"5%#FnrRzG ,V+p{vf!_iILL+.gUX,*y&Ln' r&M̆(/�رc G['O=>tD"nǂDaiiӢn#t ,I K} j> L|*6xh&(5ˇbQ5fi|?}ێM-XVWr?:+l0"L3t0@-[6m6"~B0PGSS#۶lE#?~*<JHH`楗vZEaСX &Op8̺uHvYv=lټʀ5k)))b>1]<6mE]icJܻ%ZhgnhtxCHr9)X2aB�_F7IN_vOnH4o$RT#$XSK}E3.r#kl6JLC;rUFJPZ>tF1Pb[ǒ%K;wncضm)))7l8Agg$chs#>7( ,cG(+;jnٴi,sy׿ 5ÓO\aӿx<$&&١KqEu@9O5 #Bl]tU |5jINq|4&D*Qj|X6Q]Bdux@X3 m #bW0Bq8Ȝ# ]kagJ"CI gިAA]]6m"==iӦ~,Y_ ի6l~hʉ༮k膎,GNlN YJD"dEngɬYDfϞ3< X,5;ѫ">]>͖'owphfg6x�}{M. ԇ !P“ّÄ@CDZaVVXV0yC(c"nGjhKJ >?9um>+~Dc=-LW] ;IgLh֯k磏>`ذa̝;իWG1w\ cJV#AtLD״ؓlN"eLEj*F<.K,n'7w� TwkI 8tJ mEk)^C7hPe%ϡ3LX'k0t#ؚh ɘSH 9(H\rNBr2FcIIvL@iL[Vn]K7yAMUV {ʦM;w.K,i}W=Z0 ֯_iL>@L8b9'#=ں*UF7AQ8akDt Бd ӄ^5pTVVx$%X,rF( S^| &5}2P"ş̦ VdBACf7[6J2;^O2}^r,!ɣ CZlwn{ @u%�:kR< n ~.d #Ѯd S&orh89@ledx&bԐ$ Do8^Jb B"NbmnxAYAksNon)'MthZd Gss3ƍ蕚mWtٲe+V0{lVX$Ia/_N<q}Azz[wqX-nhi'/HR[vEbD CdSZZJMM o}'üy-Z>IR:4 S_ d!iem.|6Ѝ™u MN RQY"3Z478U֪g@RLcUqN/D [HH!G5thCeφmd 0!{(dLTh4bG|G(5KYROTYjQ,˔jx#$X u'ɟE>=aB̙3u/1'oo5 A]]$aZy$ bZ|[jj*u$0t"0,5H$}eYfF a&vFRSS{4MJJJPd[o Hܡ3ٷe CI -K9:R'\˿ Io+5} 0p )4{^Cfa(Exn*&Ś�)-!_JE&\&;Ɛ=18a4"x#`('J|Vk8]>h^C]M[l(J7*d4ZK"%X,XL,{V _-Qd:iL{33Azz:۷/sS]īYb45E|cf̘A(ꑆpf% 34-P-*łZG"B!"Z֚FOhk8~)ۃ  1k,Ea)o<q IئthqUn36%-5i$ a[�6 %Yš3:LsjJ1IZ>JV:ƒ<8YT)ꮊע% ݐ6;{: -뱭B$$ lNV,\m Og<.ʼ_66 V;i.!ŋ7A!/%Dst۟Rhw|z{%3sL/^i466xkz!�$a0 @ |~?`b"I4"pEq8nj�O.01c SL:W3#א92lқp$$ƶ�ܤ˖G%E?NkiU~@cs8tݴA?vg"e � Zj%kѰuM%Վ|TG)?!s3:%,QwRK ]thA[ uһ|@7XEj|> TN$}]>5,o=9?([Cm56m,o\F'jp[luL{[N?m 3݃0 VZk׺hnnfٲe̞=O_U]iج6 j$l+=TE0Ns$( SQYAq_eC)+;Niq~Џeɓ'3!`OƑP9΍^n4١_͛['=k}z n+UM&ѿ10tc UB3 0LLäΛUp8[Ts2rE(()^F^6C JQC bɇQw ×`%tR=%Y?\@ɅN|N闍XhF]oGDYޢ!Og?4Mk5 |=)&FÉjmj`ڱdI>몊f'3+ B{S4G2m4JKJOrr2cǎ%''`(4ٻ?P}33xf*?_Smo 뽭**iCQt,NB@&!bA1ؓLl. ١ abuP)g $ _Ё"؜S4TTӠ iN>CƐ4͂WcVvAN bɇ!b`so&cG5׾1 BZ?XU$cUT651,R;.@5ry7illjg6 @ cמ\2c:1N>-ݨHHp( IIn֬YC$&D1 z%33]yA~4hi[ f\Ŧuvvѣ0"\) e8K$8th;[3gv͙ HGC0*'"+DB&6bEM~Ʉ5MSڜY$eF56K ECk9p#é FiXT]Ǻr0M FRN&%M<m:c:/5̜9˗r={6apWb TUeڴi9$ͅ/d|*\ " RU]Mm}-`ەDJj`?^ϖ-tdZqiD"CNN~EQHIIaȲizvSgvqbv fb~)ҢE|z Vi躏pH]k$#�3i,HMSƓDJׄk]9p@LQʊ ,X,6 - aP]] -dYnۂxF!�GaΝF7tmB!�BsSja3⏛E"֯_j% QYYINN'O{r8fǶMӆ:aƞwQNe/]Zʉ{0d Ybz$">t-iDBhfH3PrB+:FQF'iJ_v p81bC !PSSCCC>zLBBIIIt:{4e͛7 2dqiZ?j^EӮB(|p֟&gϷ *. :hƋdeſܣ˘@ '#A!C q#b@ vcÆ gK@ q&MԺxL>`0غx2@ "`.C q#@ F@ č0@ a<@7x nAtk1CLmmmo"55M~~~m<:,ˌ;6 ܢ" :/n%\i@ 8IIIaժUqwCEwu0A!Vo+A|ɓO>ɔ)S9rd<x%K`&r  8* vm<"O<MMM?~<^{muiڵBE t]g\q=. |a222HLL<kIb>�eee|[b IR ի>|x$tʕ+꫅#,˧eo~UU1M_|b&uuu466Ѐ̝;�***Xd UUUdddpM7zP(/L]]?8999|+_7xJ={6cǎ==x K.UW]Eaa!@8p FM裏\.͛GNN%%%| <+Wr3uTVZƍD"2w\$I+VP__Off&񴻷W^yf|I … O{o�>,&MbڵD[h<  ~]O>a477u]Gvv6K.~}݇$IQ8歷b޽A^^ ,j0}0`�QUUENN~2J>S7Mٱc70Mŋ3e&L͛?}݇Fl6n{9`Z B,^ӧ3~xyh5J�l2J FSS`&K.fCQQQK/D~x<r]wvYl˗/o~l6۷ooDe4ٽ{7wu%KzjnV}6 Opwegg:˖-믧_~غ~., ovu+++yw[ׯ;wd|[+,X,L^0*++??$j,K_ZOz[l6F;�8rۿ1b`z*++1 q!2cƌøJ[*++3f $СCٵkWdYvcIJJt 8|0SNEUUrrrx<?~$C1 fϞDQoδix<X,RSS[?i$QQFQ[[eL{3M;|l6[n &`Z$^w޽呛$I5 BYY)itG.F@VVYs 3C?~</23gd۶m?սVhnXBx[N$Z`֚>@rr2펓ef0h 8O?ZaBa{nL$ �Ngkm_uB.CIII 233;MtnKzFnw;MvJpyԯ_?͛ʕ+yZ@ bg#-- Aqq1\wu^/i"I 혦IJJJk$VGkA@oW0`٘3g_|1o\s }kb�cӦM{$&&RTTߡYZ477Ǭ7-^)//o0 ߵz<(((b^yrss۵>$( Ǐgʕddd;vR `ƍ8[}۶m0 t]EBK 4DQv؁iqAF<08vcX `gժUB!LӤmXla6mtCmڵ455:=nuB;FII i駟AeTU <jllt,)L |AÇc\ߧM7`[;Q7n߿?wy' .l=/!!9s搝<4ٰa{EUUӹ$kK_ 4[oeذal߾_nNʶmN{'Nѣ뻝V5{iii\s5k455΂ Z݊ӧO7_i󨱱W^y@ j /$--h"hW?|7tSLSOo}fjjjZ kƬY<ţc0 >C ·Q@ 9}:x /&77o/.!H!Cwoƌ}qI@ Av[@Ţ;zvuָ/$s-[tkXn|XjXV >ǤvϏn< s@ wT?;}gwED* 6l[4j4kI4&Qc7*5쨔EKإl-;3,<}s={DAH$I!H$v#C"H$FD"HڍD"v{[uF=$QFY{O=|k앫 0`ܹM~/۽Jsm%:-G8/c Yvݺ:zT'77Z^/H͆(i Y%y9IMM QPP,s#e"j*(b#k _nHn6F;_.ccYb9l.'۶3zt!+V`Ԩqm1"O|>9993M݁ilݺ   ۸䠤Sê[BlR^4;ITѪ0MśׯSPGXt NrqqؠɝQE$ijHZp8SZZʢx�� �IDATE1bv}_TU"I""=֙r}Q�zw � P0j,â{t-qQ=$&BKK# QRR3f ֩Y%j *"٥!B +ByuSDi@UUl6իVWi*,^}P[$9$_< 7_ Z1A�a bذ9^=$X&񀘀ݛ P0�(+ٙUHNţvaM+  ₒU`)둑I$4M#f0 ˲(a t~E%$|7RZx K*�VlQM,"QLzsόJ&ȣ-n۵Dn+f1 bMX4p7J+&"㰱 sx*fLtȣD"t]0 t]oG^xnM}]N"I6jqST+QX.d9cCFta@|=5s>Ų );øce~!ޑB|vY$c_`^mhH$B4E_ݛsw7"$G"v²T­]EhJl.C/ g�&27ώw^QvC)_˗WPp||]zs!/ӔxU{\5{#MYyql co/#�V;~^yq:- Z+3zn;#FV\BۍA\&bфJڑ؊F繁.à#zݛS[@eÓ9} nLNv~E]@,;hjkc7Aq\KYj?<̺hHޗ߆=::)1L*>uw"lit]p8'M+iRA@ì !=q@P&t_^Ti-VAdՃy7Ly{'Ju>̴K9)(>Ϸ{j$l~1w:(;ߚȢ_Oɍ{<;yxw/Kk Sɥu~o|q~͚,%ϽoΦt[,[ed)ͬP>'q;z>z mgy8qY{+,]E7SoxqeO,>;V^-%mm{^u^&7অT~8'Gq޵H9_^/ Ub\^AJê h PB:‚Z/i{U--^Eu8̆7^dsm\}ѓӮ=9lw ku@ ?Rs-ӡy)굜E`5E<5/oJ/3gf H-)=lg\ bc[.>! ac;&! >߳= ˞cNtnh�1M>(-g"WNCl9>ۥξfD/Bl\t"VHj["fj RSiq y'^us5=%Z$UWV~m &4@ E<<{禫WS%iP;;#ްL;SAA,[m]x8  &k쌦338sٌ? ]Gsױ&Ħ䐒xJS54OP5LL M,S ^t=]i͛7q О/td�`Yf9fO_%cc w[=A]wy1U[K;Dc|tψ}0-Krh$0!~ʲ@Xg7HKs@m4RAXj>| c/V[5,y~UCđn2^>=Cu?ϳsG_;J}r23%\{?ͧ QȲ훩KH "ނVpj<NӠ 4_7r\ϛ+`}~! D3iG*Q1^Š;o a%5 4< UYK]�i?Ԭѹ$1[E˱"[5/v5vEp33-î TA]QDcnٿiOes_N'O}xN0jny:<>&gïNCwfM Vec`ChXc! lݻN`Q?/sa%QEɜګ}܃/a?5:b÷k:1͵h5fl4'<~3gj@ٱw@z|]f�Q6O>j^GØWxM-EW8tmCG݇ݦӊ�=&͘ʰ^uv\n76̾%lN r}M|va/Bu-nGpi-g􌙘,&=>Ч"e=:`£sI#4ݧ굇MU6'֛$՞Ή/ٷ3kRFsD b{OZվf3\ݘqm;/,im].{7kt#ʕ4PLzˍ>ΩG%8;} sͯ?o%e7Ǖň{<?HIČ33g)@QQя3vux4bj\X Bz\DzPbL5}H~S+)V;eKHՑs6Ls̡G-S*1՜0xD'}h6-3~3dxC|S$̳fJBK+!ᰫb:4H(W˕1b Q"U 8ݾWk#bJĵj. ϲyK0�恕=8VJy:,fh-4Kiv,ثIlđ,iQpcWu<VK"gl՜ɪnƪ.gD !LaȯZ?VrHaor*K{6TpGm(z�T WGq,X. Upys;Zd[%?ڒ ʊk$7%rMZW~z)g?/-9xx hHP�!!MIAUa n cB8([ݦ)&6M'pM&gи\cد#d/xdtBF!Oib: TWAhO0PN}M XL,ab!^-K%4Mrrr[՟}h(@ p{Z -$9@(*jLܽ# GFHhhp{j^+Ɂ?~WC"$?`kyl2PD"HD"HM<[ڵ֭�ѣ:zD"l6E4M4M3E"9Й7oYYYm*[SSi5H:&苍8-|i i~} |#eҳqnхXQriջD?|!h&vMغu+ 0@qAIU3ؤfYi;v%ǩUa|?73_ WgӳRzч A;IhKTHZp8SZZʢE1bv{fJ$N^LX]b:Sr�Avz�&]eXtO@?13'$,LijRU EU ())a3M+^j D@!xU<( J|ښCUUl6իVWij, xb Am%|o�+~EĢFxG٭Æ͙I$&-J޽ "햕*J$I'Qf<χ[wqAp*ʂW!%>`kQA4*sK.Y V Oa xNd,+JgB(Ux??r+fwM$*ͅYoju]vv7KXTY= yx}m<3*^o=dJ_t-O+f1 bMX4h&Op I[eKꏒHZ-!oDu0u9+1a\ڵ=ҏ^^8]ai!fjqSEMX(!\"5;@P:J3 i\#x8gxvcA(mH`+$D9.pҸxJ Sbۚb\kO?d\ a>Cd$wQXٖV[VJ5MMEW{HeҼjh)*!V=z>#q_E זDC8EфJڑ؊: P&;hjk#ή =&e?!K4/^Us4WHΜ&qeL=͊->{۹t`!{<:9~=vzdqmE=yת;~) W2?}Ԏiwҷ{y.ō9h $z(&'eF5 .à#zݛS[@Ut$<0yiY8A"#Bz*NEM Խc./R,Ӗsϟ�ͼfF^y29E:*O^Â+s۴YނӘDmUWcy}oMdѯ,> _luNܳY7}~ ok'#7mbY˹Osf%^ݹK?&ZY/w Dy,|r] CgSrCFJ,ximgϳWXn掛$'iaDnEL@4Q( ? !aAěJֈ T4-TYrQ}}J n~緎ل=ǜ~�<ӯcx|5uJttTNd /P\׫)ӹP񍼔_Z"F9 D3 CPJ~j{w oIոs0/1Wocar3  zJkn磧̛ņptDO02V[-g"WNCl9>ۥ is"rD'+f  ph M "\tw_oO|CAjʜ#.?!7>`[/PZx'c3z&v|) :ўaItt`YfYL~yv9gM-P6.<p`HM S#*TUMAu?r UC=DHjkޞ9$΅3g"U9ކI(`Xz[{jU_w`kuL4o] Cڗ IBwY, ( uvSľ4Fc.%&#˧9fuE.GrWF^%$~{o u/m縻'C@׍>wp}+V$N5;5;3]_4SӅj ޣ^[F#-M`M%QA)#=‡[xQ�ݿ22)HӠ,v}`U+Y 2`WcWQ ԰bs�PuUn<n Eݛ5aaw>]lXu<*Vf#yb\ql:p T@ ߮~!H"oF1O=_͚Z0eƀ \g߬@J>S&xϯ2kY܃|o*]գY?kF[xR<2ϐq_۴baZPtx10\nWrAíB)G5M 2^ȍ2'_D@{2e%x[.=˛5 slJo?SS?Ʋ\l�W$^*MӒ{Vwt*N�^9rbP)y^>wOA ƭ2ȗbƌ̙3ڔW &eqO+k\G-6)ƅŰ Ux,+ % ,_Ӈ܁t75yR"iseԨQ}d3gz9 :S]] cG{V>%| Toyv֬YIhz%D6 vRl@& %*v;-#`0%RkjG[LSVͅ2b'Uy Ǽ*<q?1m}H:,fh-43Xvt#& W؈#Y1!1-,Ӣ2Ʈx<Dh٪9Ut"s tuIOgdxBxI:(PRRNeiOT %ZUj(.2+Ѕ@`Qr*.onG%3ڒ ʊk$7%r=+"T:,,1=RE$&@mmpHESR~h4ج-E`ahM Em8aI$94.X(~r#!A#2 L� D#~rkJ`e jY >Έ/tizC4TUEQLi�%3X9p83!szh$ b"jjJ-{H$2~] d4iD"HX}H"H$FpϿ-dutVnQ\jkkzD"l6`&"̛76A4 I$GGd^ETPF44?m>v \Dzrr|ٸ]NJmgBVXQGr۴]"ٟ|>rrZ4M݁ilݺ   ۸䠤Sê[BlR^4;ITѪ0MśׯSPGXt NrqqؠɝQE$i%nb$-8v)--eѢE1]&\txzXgł� %d`XEt -`[:zIRi"D<+UPT_ZPϟϘ1c4Crj D@!xU<( J|ښCUUl6իVWij, xb Am%|o�ߊEٍZ"#[ " 3;ՓHM"a[PU޽{S_$ 5D-+ٙUHNţ{f<χ[$qAp*ʂWT>$5uv;p!FenE<"Kj),ϧeŒB)XE*{o &9n%\6]u=.n7n 7+9Hx 2Z('�X X6%V<l`t,Ӡ.x?f ONe[H#p/>m(V?2\:I:H]1 ]۞=O$VHxVCTZQ:r *4B ZgSxjZJSHgk�sN҉$ruwFD"(!G"cf[Z!nY f*"4%6^_!՗I\NǒX2|Q7Nɛ f/CIŢvߙ>$=˟]Mx\3\1$2wk]ʬc] ~�C<<h?pڠ<R쾁\ZBU^pYNK:0v̓upd3װhɛ\_Mx.eNK PJ .à#zݛS[@ bգ3[:o%%'>ǜ4A`!:"<TԤKm#XUyn�� �IDAT>\pt{X 8utJ|T_zúr71 xrfsrbcYsɼ2J:#ֶ!pu;u<?o&~B>9jj?N5VUX;oe!0ڥzSx7bY{+,]E7Soxq9"r+r?m9w.R=~r$M<oZ(߭ @ e!!#,9Cz6+*W6 #xRu'S9'q/_]jxU�LAKbI=y= ,*߿)4kK4u$+- )T O_t ;זRNƫ�^AdثQq) O㦋{}E˙ȕ�[h)g5b=<("&$bK,'ECVjOuh\mazlE<<*Y3*bɜEN:4F{$ů|/Q7l2G BmjO2mdJvw;G" 2Qo"940$ ͻ8op ȓf\#KN z~5E`Ջ|q 2LALAA,[6{dׯys&PPa>/9yz2*ɁHÄ]*N ؗOGڨQ)hV6no_Oc' c9%^~Oe$zıQ#DQ}3^ᢛ>BI3tT<V/~.|>G78zM<WT¦WNfo+/g\qoX 2*6:vB41#iQK9Q'7K^2O[X_�"hVl_aWʍǭpJ(WsO/׹L>&pu)op˩5M~IUtzt=o]!CV{4[YPbWPmѵ븋zxm `b#0z#5 dv)I_LößSn?&r |ٰV1y'Jrģ~Oӊ.|Hw Êu&qrAT2 9!)l8yr>q-+<#Yt}dm9g7{x닳ԼcckvhPcm\z,oF+1xmb6.+M`n7v9qIأQd\7*Ij2>vŝ֍=5gtԮLX<}e>y=d uh8'1c5sL6(**b„ YzgУWbXҡ6 x,+ % ,_Ӈ܁t75yR"iseԨQ}d3gz9 qvS]] cG=#o(';k_KJH2jM 5kVZ^ 4][,С DBI][0`uZɾmnk:tӵ>ݶzx<-1pd IZaD1C4;]݈ E$6HtALHL ˴ :OzG%3bjd,7bR#30 M\~ͪSs~[RRNeiOT %ZUj(.2+Ѕ@`Qr*.onG%3ڒ ʊk$7%wMvu\!9xx hHP�!!MIAUa n cB8([ݦ)&6M'pM&gи\c8FItX<2 !ː' 41M] \_I4'(a`Z0 HIg`&999V&F* SrpdP9p83!szh$ b"jjJ-{H$2~] dL]AIoD"9!D"Ny> ;kѭ[GurssDl(ihgDr3o<TM((( //k&t#M/{QSAqX[r@ro1A,rGgv9)ݶѣ YbFnӪwdiC4MvuV***0`l㒃Nn SgIy,w '=JSE^~6of\ ΦgOAa-8)a&wF%іdNpϧE1bvD4:E<Dx=N{3bzw � P0j,â{t-qQ=$e`"j(/-P(DII g̘1h>_HV+-o J. 2 lW\ʃridUUfXj~:/pV"IWD,nԊx0X1l؜IDlۂݛ P!nYάDt/ [o| ₒU`)J*Z� 5uv;p!F#_Q$$#. 4q(Ħ�BJn=`{_t-PO-9Di.zSn{:ށ)vWY= yx}T5gOΤ8^I7T\0ePN�N lJx XAE]vG ~:V>uB`< J u0:ӹn/^lm xuH$m6{m+Rqwpj& u_q( <y2O/Pbe3yLFn6Mv8z8B:攢WUw5|�[$fjqSEMX(!\"5.VP:KE[IW,7}͒Hi*8}^vP[4۞:|tOD9.m:fo^r٧4Cg7Bfd b[]V-ELͿfit<A싸^<d' t~WDq 4B,}v6F:4:=҃YAK7 qj0S v)I(jL"k<ԗ o:Nbخ؈!]!ӕnq1cZ ݭg2r`_07m<s\w&v?ڟú,Clx*FQ}BIh~޿¨f<6 ͝1=$<:h+U0 > @6(Pj>▱=Hsj8x_=&e{[t_LN;8kHM X? }'SnSWLzOz ?zs~=,oSa;rx}y?a*VtNݟ_ rw s'NHgVR_eO*i;h䉇YcN AcWu*jRHx s<W7K+|j f {Yp#h ̬\ȫM|b1\Υ:Ot Ѓfi.TYY g^ SI4{3mƗD!X{n o_cW 'M.*ֶro:mQJ?2`6&J-_[q-yv39ża/p57Yo;mj~Ror׀>Aqc NliЇcgjo|Vu'tix\Hԣ*Y,&i¬oZ(߭ @ e!!#,)$5.+'ua/ĿZ-s� #Nۚ8g0R<zX#͐_NpgV#lxE6GP=9S0>ӿ e< Jѽ?] QG{J6(w3WJGNzO8U++q%KDoo|n VU͐p'i;<0zT:ߗk|1:>Grﰹ:zGr&}f_3{j1$l?!OCVjOuh\mazlE<< ~-/}ͶwTOx5�wIC(*4&ӝk姢W4cdnZZ>m:s32Ƞ۩ďۭa.]?!gt=AGG+h~,+[j )Y8�UC+[_Eđޗ|/)->*)9) }Jl@,kd{ r ;J+{bT͐|SSΧO-Nn_w?Hg$&VYpj h}Y.pಁGQdSm_]n=jbksg9v-Gƥ�T";ww%Mu$7\YIee%8O7ZWO7%;{]|`ⱷYhlBX_zvjwf۠hwkAޅA ^w4;1[7h:?_-pi(8B.Jg>ygR0 V:eΊH&Z(a8�lv xڒEuu[X[)l-~7?>Q 'f (fJ }xN0jny:Gzb,,3J5fH? V{m4[EeQ%(cޓsb& _Ɔ@xᮗoܷ.I68Vm'5X̋ǐ!dTvڴ0-އs/fW01O#qKd#)i_Ӌi´b Dްbs &` Y}'ذМ;^ؔL+8pv-~'΋agi<4:[Pd^K#M}M|va/Bu-nGҎt}ѩ^I4~i2eOx[.=˛5b۽Jnj7h"OeNc,mP)dR3y=N6!0Ǥpɨ<v W<;<<T ~>B?4~9=הp?#\Kr,ql?>TG̘1Ú9s&@ 1a„ݿ,3ie |cMqa1,Ph<M g Cf@_51+ǒsόdz3wFzEr0w\FwM8s̡G-SѰ#a1՜0xAa(8s9o sLnۜk4?sCdGSm)^fJBK+!ᰫb:4H(W˕1b Q"U 8ݾW=l$KVhۤۚ&t[R:Gx`q"6޽AvL%@h;&Z"±txZeD4A8HcUDMHtDPD3RpcWu</9xhK`DF#"enƏ~lO}y14UQr*K{6TpGm(z�T WGq,X. Upys;Zsީy<.)}SAL[A%#))&R*g:,,1=RE$&@mmpHESR~h4ج-E`ahM Em8aI$Y׸\chɁD#2 L� D#~rkJ`e jY >Έ/tiolbi Pw$'EEUTT́Ù УuD#hӈ V WVbOmkE"9PUjH$gl6ͳ/+H$$W1VRvArbQ|,BMIGH$>6H Wʨpv)ǝNqe=Pm5U aӨ85[ Tl4#P=kgUY"!R bU:E< <՜m3et[ Qu!']/]1vbzmfd6İ4Ց *lֱQ(rўScZmtxz,jIu[Z/ENLAIjۢt難3wgA3[Ht.%KPXX"txkNtIw�*cɏ2!'Q ~٧3')I$]<Aϔ D MnXȻ"brBCggPK/HSY$IţGB-E�+ln>G⏸~|\+هHD4Ia-0;�]w^(:BM] =RIgg!4M ډhit#!ajƲ ufS/Vl<3j_n˶;HD$&Hȣ A]4SP�v+d4JQ B7!)MdLosAjeyt~ZO#U<J+"VI$U<V"Dhj#dF!v܍!ѐBT Dbz5{gZxR9^:_}ϊfy'i*C|%6vױ'83uE,ֻ hܸEmu n21׎ 'l:>X6Dl~}B25w2[ƿZ TG(C{Hw)oŸVs뚋czrQ/'aR}:99h&+i&N-J7OE6 V, 66!bw aѠ(hwRٴ*HRylo&G6sSeua)=c- {w#Yq6 ZKыVԐR KjoF#WƤĄ7M|kH4ۛ6uBbhP-dewg̙xqvٝe2'3vg<3gNYػY_9/˗*2iwl3( #:oz{}ǂ:?mآ;Ywo4껀_/V@wkvcoKjޖ[B*%m9/ׇu9ޱZiϧ?gWvm9=TZXOlMsμ޸g*%~viVi>T^8USMOj<]wkNj UFSҨ:;T $tf+3w\9.>Ղ,U,Vf>>1 >oH[J HŒڷa,; *5+\T|ǫZ"cvy}wM==v!yblt&p=\Vy/EN t2Ǫϕ|:;V/k$]T&_>Y~M/ZmT˧NJ)QPHWʛ 1^9-5ܶ$]:7/޵YݮLԡ9FWU_*V@wk2(ԵihaV4RF") $<33:<$rjQ-'%Yzu~v~L=8Y3 wzm%/ѱ!m777/5a9j|��IDATCVtWo3{Ƶ9uzNzm9kn֟jnMVL\<HGRCHJ# ɤݎ|zeF~r?>-ݮ~e9K3j>Ǟ#{vTuuP]N5D|yLܻCwҴrFOf]\ alt&JͶT ҕV4HߗesʼS.UXvOSzWKdMT'W/cI>ӹc_YǶk7nKn8cR>SNjeR._ͭ)?8.Y|)I2UbGZmՇ9 twc]YpIÑ|56_^,$*ˀb00QA) 2b;Kͺ ^P[$kc$ɫ*(ixxmyKdN? @_n8SufF㦆TFj& \5P*^QRa[qIBmPa(Mպ\�00n8'&tbaBRv# U[Z'\+ ɹ)[<+� 5}cS[ROJZFrL#Arh4J475vGJ</W|+vFJf‘ I['xz?199ywxk~Z�;������������������������������������������������������������������������������������������������������������������������������������������������Yt=hrrrx|صk`}tbl�0#��3�0#��3�0#��3�0#��3�0#��3�0#��3�0#��3�0#��3�0#��3�ѣ* WO<��=޽ۼ�H$]g�rT �З*V�U1�kT �SQc+�@OFU��U1�tgT �СQUU$IJE###ʲf#�RHZ[9rDZ�`j5>|X$i�q?d^2X|ԉ����IENDB`��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/COPYING�����������������������������������������������������������������������������0000664�0001750�0001750�00000007302�13514614133�013541� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Copyright (c) 2019 Christian Metscher <hakaishi@web.de>, Fabian Deuchler <Taiko000@gmail.com> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Some icons are from Gnome or Oxygen and have different licenses and copy- right holders. File: src/noblenote-icons/preferences.png Copyright: 2007, Nuno F. Pinheiro <nuno@oxygen-icons.org> 2007, David Vignoni <david@oxygen-icons.org> 2007, David J. Miller <miller@oxygen-icons.org> 2007, David Vignoni <david@oxygen-icons.org> 2007, Johann Ollivier Lapeyre <johann@oxygen-icons.org> 2007, Kenneth Wimer <ken@oxygen-icons.org> 2007, Nuno F. Pinheiro <nuno@oxygen-icons.org> 2007, Riccardo Iaconelli <riccardo@oxygen-icons.org> 2007, David J. Miller <miller@oxygen-icons.org> License: LGPL-3 This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. . This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. . You should have received a copy of the GNU Lesser General Public License along with this library. If not, see <http://www.gnu.org/licenses/>. Files: src/noblenote-icons/trash.png src/noblenote-icons/emblem-web.png src/noblenote-icons/format-text* Copyright: 2002-2008, Ulisse Perusin <uli.peru@gmail.com> 2002-2008, Riccardo Buzzotta <raozuzu@yahoo.it> 2002-2008, Josef Vybíral <cornelius@vybiral.info> 2002-2008, Hylke Bons <h.bons@student.rug.nl> 2002-2008, Ricardo González <rick@jinlabs.com> 2002-2008, Lapo Calamandrei <calamandrei@gmail.com> 2002-2008, Rodney Dawes <dobey@novell.com> 2002-2008, Luca Ferretti <elle.uca@libero.it> 2002-2008, Tuomas Kuosmanen <tigert@gimp.org> 2002-2008, Andreas Nilsson <nisses.mail@home.se> 2002-2008, Jakub Steiner <jimmac@novell.com> License: LGPL-3 or CC-BY-SA-3 GNOME icon theme is distributed under the terms of either GNU LGPL v.3 or Creative Commons BY-SA 3.0 license. . . This work is licenced under the Creative Commons Attribution-Share Alike 3.0 United States License. To view a copy of this licence, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California 94105, USA. . When attributing the artwork, using "GNOME Project" is enough. Please link to http://www.gnome.org where available. ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/icon.rc�����������������������������������������������������������������������������0000664�0001750�0001750�00000000123�13502165236�013760� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������IDI_ICON1 ICON DISCARDABLE "src/noblenote-icons/noblenote.ico"���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/README.md���������������������������������������������������������������������������0000664�0001750�0001750�00000005510�13502165236�013766� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������# nobleNote nobleNote is a cross-platform note taking application. Manage notes in a simple two-pane layout with notebooks and an integrated rich text editor. Notes are stored in the html format for maximum compatibility with other applications. It is compatible to the [nobleNoteAndroid](https://github.com/taiko000/nobleNoteAndroid) app for Android. ## Supported Platforms Any Qt: Windows, Linux, macOS, Android ## Sync notes between desktop and mobile devices 1.) Install [nobleNote](https://github.com/hakaishi/nobleNote) on your Linux/Windows/macOS device and find the folder containing the nobleNote notebooks. 2.) In nobleNoteAndroid, select a folder on the external storage (sd-card) using the overflow menu on the main screen. 3.) Use a sync software of your choice (e.g. [Syncthing](https://syncthing.net), Dropbox) to sync the folder containining the notebooks with the same folder on your Linux/Windows/macOS device. nobleNote will detect when notes have been changed on the file system and reload them automatically. ## Screenshots ![Alt text](/screenshot/Screenshot0.png?raw=true "") ![Alt text](/screenshot/Screenshot1.png?raw=true "") ## Installation Note for Windows users: Binary releases can be found on the releases page of this github repository Requires at least Qt 5.0 or newer. It can be build using the QtCreator IDE. ## Building From CLI Dependencies: build-essential, qtbase5-dev, qttools5-dev-tools To compile from source, open a terminal and change into the nobleNote source folder. To install type: qmake sudo make install distclean To uninstall type: qmake (if the Makefile has been removed) sudo make deinstall (Note that ~/.config/nobleNote.conf and the notes at their location won't be removed. Backups are in their default data location.) ## License nobleNote is licensed under the MIT License Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/noblenote.desktop�������������������������������������������������������������������0000664�0001750�0001750�00000000257�13502165236�016072� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������[Desktop Entry] Name=nobleNote Name[de_DE]=nobleNote Exec=noblenote Terminal=false Type=Application Icon=noblenote Categories=Utility; Keywords=Note;Notes;Notice;Sticker;Memo;�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������noblenote-1.2.0/NEWS��������������������������������������������������������������������������������0000664�0001750�0001750�00000002652�13502176303�013207� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Release 1.2.0 ============= - added timer to wait while typing (solves slow search) - fixed renaming problems when renaming from search results Release 1.1.0 ============= - fixed word formatting - added bullet list option - fixed backup path - added "create portable version" - added show/hide tool bars via context menu - save position of notes - other fixes - added recent history of opened notes Release 1.0.8 ============= - fixed restoring multiple notes with same title - fixed text formatting and clearing - removed note titles form trash delete message box - fixed note title bugs Release 1.0.7 ============= - fixed crash when dropping notes on other notes in the search results - added translations for Asturian, Czech, Galician, Malay, Polish, Russian and Ukrainian Release 1.0.6 ============= - fixed Qt 5 incompatibilities - improved note search speed Release 1.0.5 ============= - removed redundant object causing failure on language import - all translation problems solved! translations can now begin Release 1.0.4 ============= - removed redundant objects and their translations - nobleNote is now ready for translating to other languages Release 1.0.3 ============= - removed redundant code and fixed translation strings Release 1.0.2 ============= - more translation fixes Release 1.0.1 ============= - fixed minor translation issues Release 1.0.0 ============= - initial release ��������������������������������������������������������������������������������������noblenote-1.2.0/version.txt�������������������������������������������������������������������������0000664�0001750�0001750�00000000005�13503666131�014730� 0����������������������������������������������������������������������������������������������������ustar �chris���������������������������chris������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1.2.0���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������