noblenote-1.0.8/0000755000175000017500000000000012242163557013640 5ustar hakaishihakaishinoblenote-1.0.8/COPYING0000644000175000017500000000730112242167074014672 0ustar hakaishihakaishiCopyright (c) 2012 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. 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 2007, David Vignoni 2007, David J. Miller 2007, David Vignoni 2007, Johann Ollivier Lapeyre 2007, Kenneth Wimer 2007, Nuno F. Pinheiro 2007, Riccardo Iaconelli 2007, David J. Miller 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 . Files: src/noblenote-icons/trash.png src/noblenote-icons/emblem-web.png src/noblenote-icons/format-text* Copyright: 2002-2008, Ulisse Perusin 2002-2008, Riccardo Buzzotta 2002-2008, Josef Vybíral 2002-2008, Hylke Bons 2002-2008, Ricardo González 2002-2008, Lapo Calamandrei 2002-2008, Rodney Dawes 2002-2008, Luca Ferretti 2002-2008, Tuomas Kuosmanen 2002-2008, Andreas Nilsson 2002-2008, Jakub Steiner 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.0.8/changelog0000644000175000017500000000201412123122256015474 0ustar hakaishihakaishiRelease 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.0.8/build/0000755000175000017500000000000012242155131014724 5ustar hakaishihakaishinoblenote-1.0.8/noblenote.desktop0000644000175000017500000000025712242110401017200 0ustar hakaishihakaishi[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.0.8/translations.qrc0000644000175000017500000000017212122634623017062 0ustar hakaishihakaishi src/translations/noblenote_de.qm noblenote-1.0.8/src/0000755000175000017500000000000012247312162014420 5ustar hakaishihakaishinoblenote-1.0.8/src/ui/0000755000175000017500000000000012242154620015033 5ustar hakaishihakaishinoblenote-1.0.8/src/ui/welcome.ui0000644000175000017500000000551412122634623017035 0ustar hakaishihakaishi Welcome 0 0 415 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. &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.0.8/src/ui/trash.ui0000644000175000017500000000704012122634623016517 0ustar hakaishihakaishi 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.0.8/src/ui/mainwindow.ui0000644000175000017500000001641412122634623017557 0ustar hakaishihakaishi MainWindow 0 0 280 331 nobleNote :/nobleNote:/nobleNote Qt::ToolButtonTextUnderIcon 0 0 280 25 &File &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 noblenote-1.0.8/src/ui/preferences.ui0000644000175000017500000001553112122634623017703 0ustar hakaishihakaishi Preferences 0 0 439 383 Preferences :/nobleNote:/nobleNote 10 0 0 75 true Root directory true 0 0 &Browse ... QDialogButtonBox::Cancel|QDialogButtonBox::Ok DejaVu Sans 10 75 true Note editor default font: QLayout::SetDefaultConstraint Width: Height: 65536 5 335 65536 5 250 75 true Note editor default size: Enables drag to scroll touch screen scrolling &Show "Show Source" menu entry Automatically convert non-HTML notes to the HTML format. If disabled, non-HTML notes are opened read only. Convert notes to the HTML format &Close to tray 0 0 QFrame::StyledPanel folder browseButton dontQuit convertNotes showSource kineticScrolling sizeSpinWidth sizeSpinHeight fontComboBox fontSizeComboBox buttonBox buttonBox rejected() Preferences reject() 174 83 174 59 noblenote-1.0.8/src/ui/note.ui0000644000175000017500000000127512122634623016347 0ustar hakaishihakaishi Note 0 0 500 355 Note-Editor :/nobleNote:/nobleNote noblenote-1.0.8/src/lineedit.cpp0000644000175000017500000000537512122634623016734 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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.0.8/src/htmlnotewriter.cpp0000644000175000017500000001176312135062005020215 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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); 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 + "/" + folder); filePath = outputPath + "/"+ folder + "/" + 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() + "/" + uuid); } noblenote-1.0.8/src/welcome.cpp0000644000175000017500000000461112122634623016562 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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); path = new LineEdit(this); #ifdef Q_OS_WIN32 defaultPath = QDir::toNativeSeparators(QDir::homePath()) + "\\" + QApplication::applicationName(); #else defaultPath = QDir::homePath() + "/" + QApplication::applicationName(); #endif 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 str = QFileDialog::getExistingDirectory(this, tr("Choose a directory"), QDir::homePath(), 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()); } noblenote-1.0.8/src/notedescriptor.h0000644000175000017500000000630212122634623017637 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 #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 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(); private: void save(const QString &filePath, QUuid uuid); // calls write with note and backup void write(const QString &filePath, QUuid uuid); // write note file to disc void load(const QString& filePath); // load a note file into the document QUuid uuid_; QWidget * noteWidget_; QString filePath_; TextDocument * document_; QTextBrowser * textBrowser_; QDateTime lastChange_; QDateTime createDate_; //QDateTime lastMetadataChange_; QString title_; 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.0.8/src/fileiconprovider.cpp0000644000175000017500000000330312122634623020467 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 "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.0.8/src/preferences.h0000644000175000017500000000366512122634623017105 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 PREFERENCES_H #define PREFERENCES_H #include "ui_preferences.h" #include #include 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(); void openDir(); signals: void pathChanged(); void kineticScrollingEnabledChanged(bool); protected: virtual void showEvent(QShowEvent* show_pref); }; #endif //PREFERENCES_H noblenote-1.0.8/src/findfilesystemmodel.cpp0000644000175000017500000001735612122634623021207 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 "findfilesystemmodel.h" #include "findfilemodel.h" #include "filesystemmodel.h" #include #include "htmlnotereader.h" FindFileSystemModel::FindFileSystemModel(QObject *parent) : QSortFilterProxyModel(parent) { } QString FindFileSystemModel::fileName(const QModelIndex &index) const { if(QFileSystemModel* fsm= qobject_cast(sourceModel())) return fsm->fileName(mapToSource(index)); else if(FindFileModel* ffm= qobject_cast(sourceModel())) return ffm->fileName(mapToSource(index)); qDebug("FindFileSystemModel::fileName failed: cast failed"); return QString(); } QStringList FindFileSystemModel::fileNames(const QList &index) const { QHash names; foreach(QModelIndex idx, index) { if(QFileSystemModel* fsm= qobject_cast(sourceModel())) names.insert(idx,fsm->fileName(mapToSource(idx))); else if(FindFileModel* ffm= qobject_cast(sourceModel())) names.insert(idx,ffm->fileName(mapToSource(idx))); } return names.values(); } QString FindFileSystemModel::filePath(const QModelIndex &index) const { if(QFileSystemModel* fsm= qobject_cast(sourceModel())) return fsm->filePath(mapToSource(index)); else if(FindFileModel* ffm= qobject_cast(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(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(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(sourceModel())) return fsm->remove(mapToSource(index)); else if(FindFileModel* ffm= qobject_cast(sourceModel())) return ffm->remove(mapToSource(index)); qDebug("FindFileSystemModel::remove failed: cast failed"); return false; } bool FindFileSystemModel::removeList(const QModelIndexList &index) const { bool successfull = true; foreach(QModelIndex idx, index) { if(QFileSystemModel* fsm= qobject_cast(sourceModel())) { if(!fsm->remove(mapToSource(idx))) successfull = false; } else if(FindFileModel* ffm= qobject_cast(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; foreach(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(sourceModel())) return fsm->fileInfo(mapToSource(index)); else if(FindFileModel* ffm= qobject_cast(sourceModel())) return ffm->fileInfo(mapToSource(index)); qDebug("FindFileSystemModel::fileInfo failed : cast failed"); return QFileInfo(); } void FindFileSystemModel::appendFile(QString filePath) { if(FindFileModel* ffm= qobject_cast(sourceModel())) ffm->appendFile(filePath); else qDebug("FindFileSystemModel::appendFile failed: cast failed"); } QModelIndex FindFileSystemModel::setRootPath(const QString &newPath) { if(QFileSystemModel* fsm= qobject_cast(sourceModel())) return mapFromSource(fsm->setRootPath(newPath)); qDebug("FindFileSystemModel::setRootPath failed: cast failed"); return QModelIndex(); } QString FindFileSystemModel::rootPath() const { if(QFileSystemModel* fsm= qobject_cast(sourceModel())) return fsm->rootPath(); qDebug("FindFileSystemModel::rootPath failed: cast failed"); return QString(); } void FindFileSystemModel::clear() { if(FindFileModel* ffm= qobject_cast(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(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(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 { foreach(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() + "/" + uuid.toString().mid(1,36)); } } /*static*/ void FindFileSystemModel::copyNotesToBackupDir(const QFileInfoList& fileInfos) { foreach(const QFileInfo& fileInfo, fileInfos) { QUuid uuid = HtmlNoteReader::uuid(fileInfo.path()); if(!uuid.isNull()) QFile::copy(fileInfo.path(), QSettings().value("backup_dir_path").toString() + "/" + uuid.toString().mid(1,36)); } } noblenote-1.0.8/src/trash.h0000644000175000017500000000334412122634623015717 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 TRASH_H #define TRASH_H #include "ui_trash.h" #include #include #include class Trash : public QDialog, public Ui::Trash { Q_OBJECT public: Trash(QHash *backupDataHash, QWidget *parent = 0); private: QPushButton *deleteOldButton; private slots: void showPreview(); void restoreBackup(); void deleteBackup(); }; #endif //TRASH_H noblenote-1.0.8/src/welcome.h0000644000175000017500000000334712122634623016234 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 WELCOME_H #define WELCOME_H #include "ui_welcome.h" #if QT_VERSION >= 0x050000 #include #else #include #endif class LineEdit; class Welcome : public QDialog, public Ui::Welcome { Q_OBJECT public: Welcome(QWidget *parent = 0); private: LineEdit *path; QString defaultPath; private slots: void openDir(); void setRootDir(); }; #endif // WELCOME_H noblenote-1.0.8/src/htmlnotereader.cpp0000644000175000017500000001373312135061701020144 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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, QTextDocument *doc) { document_ = doc; read(filePath); } // TODO fallback file info also for XmlNoteReader 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); 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); QFileInfo info(filePath); // // fallback dates // if(lastChange_.isNull()) // lastChange_ = info.lastModified(); if(document_) { document_->setHtml(html); titleFromHtml_ = document_->metaInformation(QTextDocument::DocumentTitle); } title_ = info.baseName(); // always use file name } /*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("",metaIdx+1); #if QT_VERSION >= 0x040800 // Qt Version > 4.8 QStringRef metaLine = content.midRef(metaIdx,endIdx-metaIdx+1); // e.g. #else QString metaLine = content.mid(metaIdx,endIdx-metaIdx+1); // e.g. #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(); } // does not work because QXmlStreamReader sometimes reports errors with html // TODO same device for both QTextStreama and QXmlStreamReader allowed? // QXmlStreamReader reader(file); // while(!reader.atEnd()) // { // QXmlStreamReader::TokenType type = reader.readNext(); // qDebug(reader.name().toAscii()); // if(type == QXmlStreamReader::StartElement && reader.name() == "meta") // { // QXmlStreamAttributes attributes = reader.attributes(); // if(!attributes.isEmpty()) // { // if((attributes.value("name") == "uuid" || attributes.value("name") == "id") && attributes.hasAttribute("content")) // uuid_ = QUuid(attributes.value("content").toString()); // } // } // if (reader.hasError()) // { // qDebug("XmlNoteReader::read failed: Error reading xml content"); // return; // } // } noblenote-1.0.8/src/backup.cpp0000644000175000017500000001120712122634623016373 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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::getNoteUuidList() { QFutureIterator it(future1->future()); while(it.hasNext()) noteUuidList << it.next(); } 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(getNoteUuidList())); 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() { backupFiles.clear(); //remove old files //get backup uuids QDir backupDir(QSettings().value("backup_dir_path").toString()); backupFiles = backupDir.entryInfoList(QDir::Files, QDir::Name); foreach(QString uuid, noteUuidList) { if(backupFiles.contains(QFileInfo(QSettings().value("backup_dir_path").toString() + "/" + uuid.mid(1,36)))) { backupFiles.removeOne(QFileInfo(QSettings().value("backup_dir_path").toString() + "/" + uuid.mid(1,36))); backupFiles.removeOne(QFileInfo(QSettings().value("backup_dir_path").toString() + "/" + 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; 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.0.8/src/lineedit.h0000644000175000017500000000334712122634623016376 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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.0.8/src/textformattingtoolbar.cpp0000644000175000017500000002466712122732306021603 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 "textformattingtoolbar.h" #include #include #include #include #include #include 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); 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))); QFontDatabase db; foreach(int size, db.standardSizes()) fontSizeComboBox->addItem(QString::number(size)); connect(textEdit_, SIGNAL(currentCharFormatChanged(QTextCharFormat)), this, SLOT(getFontAndPointSizeOfText(QTextCharFormat))); } void TextFormattingToolbar::mergeFormatOnWordOrSelection(const QTextCharFormat &format){ QTextCursor cursor = textEdit_->textCursor(); QString block = cursor.block().text(); if(!cursor.atBlockStart() && !cursor.atBlockEnd()) if(!(block.at(cursor.positionInBlock()) == ' ') && !(block.at(cursor.positionInBlock()-1) == ' ')) cursor.select(QTextCursor::WordUnderCursor); cursor.mergeCharFormat(format); textEdit_->mergeCurrentCharFormat(format); } void TextFormattingToolbar::clearCharFormat() { QTextCursor cursor = textEdit_->textCursor(); QString block = cursor.block().text(); if(!cursor.atBlockStart() && !cursor.atBlockEnd()) if(!(block.at(cursor.positionInBlock()) == ' ') && !(block.at(cursor.positionInBlock()-1) == ' ')) cursor.select(QTextCursor::WordUnderCursor); cursor.setCharFormat(QTextCharFormat()); textEdit_->setCurrentCharFormat(QTextCharFormat()); } 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::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::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(\\b([a-zA-Z0-9_\\.\\-]+@[a-zA-Z0-9_\\.\\-]+)\\b("+selectedText+""); else cursor.insertHtml(""+selectedText+""); } 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.0.8/src/notedescriptor.cpp0000644000175000017500000002114512122634623020174 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 "notedescriptor.h" #include "htmlnotereader.h" #include "htmlnotewriter.h" #include #include #include #include #include #include #include #include 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; load(filePath_); connect(document_,SIGNAL(delayedModificationChanged()),this,SLOT(stateChange())); QTimer::singleShot(0,this,SLOT(unlockStateChange())); // enable stateChange() after all events have been processed } void NoteDescriptor::stateChange() { if(Lock::isLocked()|| readOnly_) return; Lock lock; // get file Path // uuid_ != reader.uuid() checks if the file has been replaces by another file of the same name if(!QFile::exists(filePath_) || uuid_ != HtmlNoteReader::uuid(filePath_)) { // 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) { // check if file already exists uuid_ = QUuid::createUuid(); int counter = 0; QString origPath = filePath_; while(QFile::exists(filePath_)) { ++counter; filePath_ = origPath + QString(" (%1)").arg(counter); } title_ = QFileInfo(filePath_).baseName(); if(noteWidget_) noteWidget_->setWindowTitle(title_); // update window title save(filePath_,uuid_); // 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 } HtmlNoteReader reader(filePath_); if(lastChange_ < reader.lastChange() && !reader.lastChange().isNull()) // modified elsewhere, lastChange can be null for html files not created with this software { 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(); // check if file already exists int counter = 0; QString origPath = filePath_; while(QFile::exists(filePath_)) { ++counter; filePath_ = origPath + QString(" (%1)").arg(counter); } save(filePath_,uuid_); // save under new name with new uuid } else // not modified, silently reload { load(filePath_); } return; } if(document_->isModified()) { save(filePath_,uuid_); document_->setModified(false); return; } } void NoteDescriptor::unlockStateChange() { delete initialLock; } void NoteDescriptor::save(const QString& filePath,QUuid uuid) { 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 + "/" + 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(const QString& filePath) { AbstractNoteReader * reader; // check if the file is a tomboy note bool isXmlNote = false; if(XmlNoteReader::mightBeXmlNote(filePath)) { reader = new XmlNoteReader(filePath,document_); title_ = reader->title(); isXmlNote = true; } else { reader = new HtmlNoteReader(filePath,document_); title_ = QFileInfo(filePath).baseName(); } if(noteWidget_) noteWidget_->setWindowTitle(title_); // dates can be null, HtmlNoteWriter will generate non null dates lastChange_ = reader->lastChange(); createDate_ = reader->createDate(); 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 || lastChange_.isNull() /*|| 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_); // 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() } //void NoteDescriptor::showSource() //{ // stateChange(); // save current state // QFile file(filePath_); // if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) // { // qDebug("NoteDescriptor::toggleSource failed : could not open filepath"); // return; // } // QString html; // QTextStream in(&file); // html = in.readAll(); // file.close(); // document_->setPlainText(html); // document_->setModified(false); //} bool NoteDescriptor::Lock::isLocked() { return count >0; } int NoteDescriptor::Lock::count = 0; noblenote-1.0.8/src/progressreceiver.cpp0000644000175000017500000000512612122634623020522 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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.0.8/src/htmlnotewriter.h0000644000175000017500000000714012122634623017663 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 HTMLNOTEWRITER_H #define HTMLNOTEWRITER_H #include #include #include #include #include #include /** * 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 element // outputPath is a directory static void writeXml2Html(const QString &xmlFilePath, const QString & outputPath); protected: // insert a meta element after the 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.0.8/src/xmlnotewriter.h0000644000175000017500000000757012122634623017526 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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.0.8/src/textdocument.h0000644000175000017500000000410112122634623017311 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 TEXTDOCUMENT_H #define TEXTDOCUMENT_H #include /** * 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.0.8/src/textdocument.cpp0000644000175000017500000000367312122634623017661 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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.0.8/src/noblenote-icons/0000755000175000017500000000000012242154620017514 5ustar hakaishihakaishinoblenote-1.0.8/src/noblenote-icons/noblenote.png0000644000175000017500000014303312122634623022216 0ustar hakaishihakaishiPNG  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&ys(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.0.8/src/noblenote-icons/filenew.png0000644000175000017500000000335012122634623021657 0ustar hakaishihakaishiPNG  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.0.8/src/noblenote-icons/foldernew.png0000644000175000017500000000737412122634623022225 0ustar hakaishihakaishiPNG  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.0.8/src/noblenote-icons/format-text-italic.png0000644000175000017500000000516612122634623023752 0ustar hakaishihakaishiPNG  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.0.8/src/noblenote-icons/file.png0000644000175000017500000000232212122634623021143 0ustar hakaishihakaishiPNG  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.0.8/src/noblenote-icons/trash.png0000644000175000017500000001212412122634623021346 0ustar hakaishihakaishiPNG  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.0.8/src/noblenote-icons/cut_file.png0000644000175000017500000000237112122634623022022 0ustar hakaishihakaishiPNG  IHDR00WbKGD pHYs B(xtIME "DIDAThYk$Ud&Kf`.L\śͣ xo +e/Y$ x!a˜L{Ut&qw2= eUUX1JLE%KKKL~FDI ~{Fc9k;+++=PUcVԒꍆG=~'kkko>Jў_6js7#=l6oW@U8r"k3!0@F$7^![K<5"\oCw)ZG16vccUȉx(;Lfvvve=daCYsp}}'TڿDxQ fs=v};:0p ~zG_[@jW!!cw^5+"[fK.(Tu&R#}0XE~gDsWNF"3 ]wz5 JB=f{bdU =:1LЧE*R>+y`XpbϟN .UT\cҿe Ve*ĺ"PF\225RBN: yRA!Ee}H:+5D'Ba@ L;QcZFPRpL;'q4? D!h LU]Y cEy A/Jmt#> Te,vs9YbPC|O$XŇC(TeHP{o۶" c-xz/eO&31V{0fnPG/[fkaL k&Ȫcf"B1 ScN25]38=~Uu[B}oIpsQ2%Ƭp.SF{ 遽TkĠ s\0P@Ue{efA'˼khV_ ,g7g3eUd"uv0흋X"jڿSVTѡIENDB`noblenote-1.0.8/src/noblenote-icons/noblenote.ico0000644000175000017500000102007612122634623022206 0ustar hakaishihakaishi ( ( 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.0.8/src/noblenote-icons/clear_formatting.svg0000644000175000017500000002744112122634623023570 0ustar hakaishihakaishi image/svg+xml Asadf Aa noblenote-1.0.8/src/noblenote-icons/format-text-underline.png0000644000175000017500000000521312122634623024463 0ustar hakaishihakaishiPNG  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.0.8/src/noblenote-icons/filerename.png0000644000175000017500000000300712122634623022334 0ustar hakaishihakaishiPNG  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.0.8/src/noblenote-icons/folderremove.png0000644000175000017500000001006112122634623022714 0ustar hakaishihakaishiPNG  IHDR00WsRGBbKGD pHYs  tIME&#?IDATh޵{uy?|ޒdw B T(U@nBVpI hVtZVk-ک3NVS۩.("@s1$A@.dCΞ~Ox^͞=|pɧlzמo `m]Wg? }gw *? |q·w}W~?ڰ_=oټiW\Ï߱W ?/XwJˎǎ<%;_݅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.0.8/src/noblenote-icons/noblenote_32x32.png0000644000175000017500000000432012122634623023052 0ustar hakaishihakaishiPNG  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.0.8/src/noblenote-icons/preferences.png0000644000175000017500000000771212122634623022535 0ustar hakaishihakaishiPNG  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.0.8/src/noblenote-icons/folderrename.png0000644000175000017500000001027412122634623022674 0ustar hakaishihakaishiPNG  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~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(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.0.8/src/noblenote-icons/clear_formatting_smooth_eraser.svg0000644000175000017500000004241412122634623026517 0ustar hakaishihakaishi image/svg+xml Asadf Asadf Aa noblenote-1.0.8/src/noblenote-icons/noblenote.xpm0000644000175000017500000002063112122634623022234 0ustar hakaishihakaishi/* 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.0.8/src/noblenote-icons/noblenote_128x128.png0000644000175000017500000004576612122634623023251 0ustar hakaishihakaishiPNG  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.0.8/src/noblenote-icons/text_formatting.svg0000644000175000017500000027003412122634623023464 0ustar hakaishihakaishi image/svg+xml _ _ I B B I U U _ S S _ noblenote-1.0.8/src/noblenote-icons/fileclose.png0000644000175000017500000000141412122634623022172 0ustar hakaishihakaishiPNG  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.0.8/src/noblenote-icons/emblem-web.png0000644000175000017500000000761512122634623022252 0ustar hakaishihakaishiPNG  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.0.8/src/noblenote-icons/clearFormatting.png0000644000175000017500000000474212122634623023355 0ustar hakaishihakaishiPNG  IHDR00WsRGBbKGD pHYs B(xtIME k bIDAThiTm/ݳ1 Kª`"FRe$Rh"*q!À!+˔I ZFH,EKV%&Fb)04tt~/f8.?_u{οϹ{a#F0>̯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.0.8/src/noblenote-icons/fileremove.png0000644000175000017500000000367012122634623022370 0ustar hakaishihakaishiPNG  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.0.8/src/noblenote-icons/folderrename2.png0000644000175000017500000000666612122634623022770 0ustar hakaishihakaishiPNG  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.0.8/src/xorcipher.cpp0000644000175000017500000000364612122634623017141 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 "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.0.8/src/textformattingtoolbar.h0000644000175000017500000000515512122634623021242 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 TEXTFORMATTINGTOOLBAR_H #define TEXTFORMATTINGTOOLBAR_H #include #include #include /** * 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 boldText(); void italicText(); void underlinedText(); void strikedOutText(); void coloredText(); void markedText(); void insertHyperlink(); void fontOfText(const QString &f); void pointSizeOfText(const QString &p); private: QFontComboBox *fontComboBox; QComboBox *fontSizeComboBox; QAction *actionTextBold; QAction *actionTextItalic; QAction *actionTextUnderline; QAction *actionTextColor; QAction *actionTextBColor; QAction *actionTextStrikeOut; QAction *actionInsertHyperlink; QAction *actionClearFormatting; QTextEdit * textEdit_; }; #endif // TEXTFORMATTINGTOOLBAR_H noblenote-1.0.8/src/xmlnotewriter.cpp0000644000175000017500000001305312135045774020061 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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.0.8/src/noteimporter.h0000644000175000017500000000455412122634623017331 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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.0.8/src/flickcharm.h0000644000175000017500000000345412122634623016703 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 FLICKCHARM_H #define FLICKCHARM_H #include class FlickCharmPrivate; class QAbstractScrollArea; class FlickCharm: public QObject { Q_OBJECT public: FlickCharm(QObject *parent = 0); ~FlickCharm(); void activateOn(QAbstractScrollArea *scrollArea); void deactivateFrom(QAbstractScrollArea *scrollArea); bool eventFilter(QObject *object, QEvent *event); protected: void timerEvent(QTimerEvent *event); private: FlickCharmPrivate *d; }; #endif // FLICKCHARM_H noblenote-1.0.8/src/main.cpp0000644000175000017500000000620312122634623016052 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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" #if QT_VERSION >= 0x050000 #include #include #else #include #include #endif #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); //Configuration file QSettings settings; // ini format does save but in the executables directory, use native format if(!settings.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(!settings.value("import_path").isValid()) settings.setValue("import_path", QDir::homePath()); if(!settings.value("root_path").isValid()) { // root path has not been set before QScopedPointer welcome(new Welcome); if(welcome->exec() == QDialog::Rejected) // welcome writes the root path return 0; // leave main if the user rejects the welcome dialog, else go on } MainWindow window; window.show(); return app.exec(); } noblenote-1.0.8/src/trash.cpp0000644000175000017500000001111612123045060016236 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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); foreach(QString key, backupDataHash->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); foreach(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+"/"+title; int i = 0; while(QFile::exists(filePath)) { i++; filePath = dir+"/"+title+" ("+QString::number(i)+")"; } QFile(dataList.first()).copy(filePath); } delete item; } } void Trash::deleteBackup() { if(treeWidget->selectedItems().isEmpty()) return; QStringList files; QList itemList = treeWidget->selectedItems(); foreach(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; foreach(QString file, files) { if(QFile(file).exists()) QFile(file).remove(); QString uuid = file; uuid.remove(QSettings().value("backup_dir_path").toString() + "/"); QSettings().remove("Notes/" + QUuid(uuid).toString() + "_size"); QSettings().remove("Notes/" + QUuid(uuid).toString() + "_cursor_position"); } foreach(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.0.8/src/textsearchtoolbar.cpp0000644000175000017500000001130412122634623020661 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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" TextSearchToolbar::TextSearchToolbar(QTextEdit * textEdit, QWidget *parent) : QToolBar(parent), textEdit_(textEdit){ setWindowTitle(tr("Search bar")); setObjectName(tr("Searchtoolbar")); 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_, SIGNAL(textChanged(QString)), this, SLOT(selectNextExpression())); 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.0.8/src/abstractnotereader.h0000644000175000017500000000465012122634623020453 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 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.0.8/src/textsearchtoolbar.h0000644000175000017500000000413012122634623020325 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 TEXTSEARCHTOOLBAR_H #define TEXTSEARCHTOOLBAR_H #include "lineedit.h" #include #include #include #include #include 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; }; #endif // TEXTSEARCHTOOLBAR_H noblenote-1.0.8/src/xorcipher.h0000644000175000017500000000325712122634623016604 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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.0.8/src/backup.h0000644000175000017500000000636212122634623016046 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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; class Backup : public QObject { Q_OBJECT public: Backup(QWidget *parent); QWidget *parent_; private: QTextDocument *document; QPushButton *deleteOldButton; QStringList noteFiles; QFutureWatcher *future1; QFutureWatcher *future2; ProgressReceiver *progressReceiver1, *progressReceiver2; QProgressDialog *progressDialog1, *progressDialog2; QStringList noteUuidList; QList backupFiles; //don't ever use a local stack variable QHash backupDataHash; Trash *trash; struct GetUuid { ProgressReceiver *p; typedef QString result_type; QString operator()(QString file) { p->postProgressEvent(); return HtmlNoteReader::uuid(file).toString(); } }; struct SetupBackup { ProgressReceiver *p; QHash *hash; void operator()(const QFileInfo &file) { QTextDocument *d = new QTextDocument; HtmlNoteReader *reader = new HtmlNoteReader(file.absoluteFilePath(),d); QStringList data; data << reader->titleFromHtml() << file.absoluteFilePath() << d->toHtml(); hash->insert(file.absoluteFilePath(),data); p->postProgressEvent(); delete d; delete reader; } }; GetUuid getUuid; SetupBackup setupBackup; private slots: void getNoteUuidList(); void getNotes(); void setupBackups(); void showTrash(); }; #endif //BACKUP_H noblenote-1.0.8/src/findfilemodel.cpp0000644000175000017500000001461212122634623017732 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 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(); } bool FindFileModel::remove(const QModelIndex &index) { bool b = QFile::remove(itemFromIndex(index)->data(Qt::UserRole + 1).toString()); 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("/") > 1) filePathTrunc.remove(0,filePathTrunc.indexOf("/")+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); //value can be folder/filename or simply filename return QFile::rename(filePath(index),fileInfo(index).path() + "/" + QFileInfo(value.toString()).fileName()); } 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; QStringList files; QDirIterator it(path, QDirIterator::Subdirectories); while(it.hasNext()) { QString filePath = it.next(); if(it.fileInfo().isFile()) files << filePath; } if(future.isRunning()) future.cancel(); else QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); 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() { foreach(QString fileName, future.results()) 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) { 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()); } #if QT_VERSION >= 0x050000 return text.remove(QRegExp("<[^>]*>")).contains(QString::toHtmlEscaped(content),Qt::CaseInsensitive); #else return text.remove(QRegExp("<[^>]*>")).contains(Qt::escape(content),Qt::CaseInsensitive); #endif } return false; } noblenote-1.0.8/src/mainwindow.cpp0000644000175000017500000010260412247312104017277 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 "flickcharm.h" #include "noteimporter.h" #include #include #include #include #include #include #include #include #include #include #include #if QT_VERSION >= 0x050000 #include #else #include #endif MainWindow::MainWindow() { setupUi(this); //TrayIcon QIcon icon = QIcon(":nobleNote"); minimizeRestoreAction = new QAction(tr("&Minimize"),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); //foreach(QString str, noteFSModel->mimeTypes()) // qDebug() << "mime types: " << str; 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); flickCharm = new FlickCharm(this); QList listViews; listViews << folderView << noteView; foreach(QListView* list, listViews) // add drag drop options { if(QSettings().value("kinetic_scrolling", false).toBool()) { flickCharm->activateOn(list);// enable kinetic scrolling for touchscreens } 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(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())); } MainWindow::~MainWindow() { delete folderIconProvider; delete noteIconProvider; } void MainWindow::selectFolder() { if(folderView->selectionModel()->selectedIndexes().isEmpty()) return; folderActivated(folderView->selectionModel()->selectedIndexes().first()); } void MainWindow::writeBackupDirPath() { QString suffix = QSettings().value("root_path").toString(); #ifdef Q_OS_WIN32 suffix.replace("\\", "_"); #else suffix.replace("/", "_"); #endif #ifdef Q_OS_WIN32 suffix.prepend("_"); suffix.remove(":"); QString backupPath = QDesktopServices::storageLocation(QDesktopServices::DataLocation); // reduce extraordinary long path, replaces .../nobleNote/nobleNote/... with .../nobleNote/... if(backupPath.contains("\\" + qApp->organizationName() + "\\" + qApp->applicationName())) { backupPath.replace("\\" + qApp->organizationName() + "\\" + qApp->applicationName(),"\\" +qApp->applicationName()); } #else QString backupPath = QDir::homePath() + "/.local/share/" + qApp->applicationName(); #endif QSettings().setValue("backup_dir_path", backupPath + "/backups" + suffix); } void MainWindow::changeRootIndex(){ if(!openNotes.isEmpty()){ foreach(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() + "/" + defaultDirName)); // set default dir as current note folder } else noteView->setRootIndex(noteModel->setRootPath(QSettings().value("root_path").toString() + "/" + 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() + "/" + 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))); } 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) { 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 + "/" + oldName); if(w) w->setWindowTitle(QFileInfo(path + "/" + newName).baseName()); noteView->model()->sort(0); noteView->setCurrentIndex(noteModel->index(filePath)); noteView->scrollTo(noteView->selectionModel()->selectedRows().first()); } 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 void MainWindow::showEvent(QShowEvent* show_window){ if(QSettings().contains("mainwindow_size")) restoreGeometry(QSettings().value("mainwindow_size").toByteArray()); if(QSettings().contains("splitter")) splitter->restoreState(QSettings().value("splitter").toByteArray()); if(QSettings().value("open_notes").isValid()) foreach(QString path, QSettings().value("open_notes").toStringList()) { // 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->show(); } } QMainWindow::showEvent(show_window); } 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()); qApp->quit(); } 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(){ QList indexes = noteView->selectionModel()->selectedRows(); foreach(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; Note* note = new Note(notePath); openNotes += note; note->setObjectName(notePath); QStringList savedOpenNoteList; if(QSettings().value("open_notes").isValid()) savedOpenNoteList = QSettings().value("open_notes").toStringList(); savedOpenNoteList.append(notePath); QSettings().setValue("open_notes",savedOpenNoteList); if(QSettings().value("kinetic_scrolling", false).toBool()) { flickCharm->activateOn(note->textEdit()); } // only show the searchBar if the note contains the search text if(noteModel->sourceModel() == findNoteModel && note->textEdit()->document()->toPlainText().contains(searchText->text(),Qt::CaseInsensitive)) note->setSearchBarText(searchText->text()); note->show(); } } 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()) { flickCharm->activateOn(textEdit); } 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() + "/" + tr("new notebook"); int counter = 0; while(QDir(path).exists()) { ++counter; path = folderModel->rootPath() + "/" + 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() + "/" + tr("new note"); int counter = 0; while(QFile::exists(filePath)) { ++counter; filePath = noteModel->rootPath() + "/" + 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); noteView->scrollTo(noteView->selectionModel()->selectedRows().first()); } void MainWindow::renameFolder(){ if(!folderView->selectionModel()->selectedRows().isEmpty()) folderView->edit(folderView->selectionModel()->selectedRows().first()); } 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); QStringList fileList = QDir(path).entryList(QDir::NoDotAndDotDot | QDir::Dirs | QDir::Files); QModelIndexList indexes; foreach(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; int numNotes = noteView->selectionModel()->selectedRows().size(); QString names; foreach(QString name, noteModel->fileNames(noteView->selectionModel()->selectedRows())) names += "\"" + name + "\"\n"; QString title = tr("Delete Note"); QString text = tr("Are you sure you want to move the note %1 to the trash?").arg(names); 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); } 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; widgets << noteView << folderView; foreach(QWidget * w, openNotes) if(Note * note = qobject_cast(w)) widgets << note->textEdit(); if(b) { foreach(QAbstractScrollArea* widget, widgets) if(widget) flickCharm->activateOn(widget); } else { foreach(QAbstractScrollArea* widget, widgets) if(widget) flickCharm->deactivateFrom(widget); } } 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()) foreach(QModelIndex idx, noteView->selectionModel()->selectedRows()) shortcutNoteList << noteModel->filePath(idx); if(!shortcutNoteList.isEmpty()) action_Paste->setEnabled(true); if(noteIconProvider) delete noteIconProvider; noteIconProvider = new FileIconProvider(); noteIconProvider->setCutFiles(shortcutNoteList); noteFSModel->setIconProvider(noteIconProvider); } void MainWindow::pasteFiles() { if(shortcutNoteList.isEmpty()) return; QString copyErrorFiles; foreach(QString note, shortcutNoteList) { if(!QFile(note).copy(folderModel->filePath( folderView->selectionModel()->selectedRows().first()) + "/" + 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); } } 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 ") + QApplication::applicationName(), tr("

%1 version %2

%1 is a note taking application

" "

Copyright (C) 2012 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.

" ).arg(QApplication::applicationName()).arg(version) //: %1 is the application name, also do not translate the licence text #ifdef Q_CC_GNU + "

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

Qt " + QString(QT_VERSION_STR) + "

"); // the Qt version this build is linked against } noblenote-1.0.8/src/filesystemmodel.h0000644000175000017500000001225212122634623020001 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 FILESYSTEMMODEL_H #define FILESYSTEMMODEL_H #include #include #include #include #include /** * @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 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; foreach(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 dirList = dirs.entryInfoList(QDir::Dirs|QDir::NoDotAndDotDot, QDir::Name); //Search for the right dir QString parentPath; foreach(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 foreach(QString file, files) { #ifdef Q_OS_WIN32 QString path = parentPath + "\\" + QFileInfo(file).fileName(); #else QString path = parentPath + "/" + QFileInfo(file).fileName(); #endif if(!QFileInfo(path).exists()) files.removeOne(file); } bool dropped = QFileSystemModel::dropMimeData(data,action,row,column,parent); if(!dropped) { QString existingFiles; foreach(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 return true; //files sucessfully dropped } return false; // dropped between items } }; #endif // FILESYSTEMMODEL_H noblenote-1.0.8/src/xmlnotereader.cpp0000644000175000017500000002404012135061673020001 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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; 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); read(); // 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::read() { 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.0.8/src/preferences.cpp0000644000175000017500000001322512122634623017431 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 "preferences.h" #include #include #include #include #include Preferences::Preferences(QWidget *parent): QDialog(parent) { setupUi(this); settings = new QSettings(this); QFontDatabase db; foreach(int size, db.standardSizes()) 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()); 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(openDir())); 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) { pathLabel->setText(settings->value("root_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()))); 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) { QList backups = QDir(settings->value("backup_dir_path").toString()).entryInfoList(QDir::Files); foreach(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("kinetic_scrolling", kineticScrolling->isChecked()); settings->setValue("note_editor_font", fontComboBox->currentFont().family()); settings->setValue("note_editor_font_size", fontComboBox->font().pointSize()); accept(); } void 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; } if(!path.isEmpty()) { rootPath = path; pathLabel->setText(rootPath); } } noblenote-1.0.8/src/datetime.cpp0000644000175000017500000000336012122634623016723 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 "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.0.8/src/textbrowser.cpp0000644000175000017500000000412312122634623017515 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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.0.8/src/translations/0000755000175000017500000000000012242155131017135 5ustar hakaishihakaishinoblenote-1.0.8/src/translations/noblenote_ms.ts0000644000175000017500000005136312122634623022206 0ustar hakaishihakaishi Backup Indexing notes... Mengindeks nota... Indexing trash... mengindeks sampah... FileSystemModel Files could not be dropped Fail tidak dapat dilepaskan The files could not be dropped because files of the same names are already existing in this notebook: %1 Fail tidak dapat dilepaskan kerana fail dengan nama yang sama sudah wujud dalam buku nota ini: %1 The file could not be dropped because a file with the same name already exists in this notebook: %1 Fail tidak dapat dilepaskan kerana fail dengan nama yang sama sudah wujud dalam buku nota ini: %1 File could not be dropped Fail tidak dapat dilepaskan HtmlNoteWriter default lalai untitled note nota tidak bertajuk MainWindow &Minimize &Minimumkan &Quit &Keluar default lalai &Restore &Pulih Note does not exist Nota tidak wujud new note nota baru new note (%1) nota baru (%1) Type to search for notes Taip untuk gelintar nota The selected note cannot be opened because it has been moved or renamed! Nota terpilih tidak dapat dibuka kerana ia telah dibuang atau dinamakan semula! new notebook buku nota baru new notebook (%1) buku nota baru (%1) Delete Notebook Padam Buku Nota Are you sure you want to delete the notebook "%1" and move all containing notes to the trash? Anda pasti hendak padam buku nota "%1" dan alih semua nota yang terkandung ke tong sampah? Notebook could not be deleted Buku nota tidak dapat dipadam The notebook could not be deleted because one notebook must remain Buku nota tidak dapat dipadam kerana satu buku nota mesti kekal disana The notebook could not be deleted because one or more notes inside the notebook could not be deleted. Buku nota tidak dapat dipadam kerana satu buku nota atau lebih nota di dalam buku nota tidak dapat dipadam. Delete Note Padam Nota Are you sure you want to move the note %1 to the trash? Anda pasti hendak alihkan nota %1 ke tong sampah? Delete Multiple Notes Padam Nota Berbilang &Open notes &Buka nota &Delete notes Pa&dam nota Show &Source Papar &Sumber Copy error Ralat salin Notes of the same names already exist in this notebook: %1 Nota dari nama yang sama sudah wujud dalam buku nota ini: %1 About Perihal <h1>%1 version %2</h1><p><b>%1</b> is a note taking application</p><p>Copyright (C) 2012 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> <h1>%1 versi %2</h1><p><b>%1</b> adalah aplikasi pengambilan note </p><p>Hakcipta (C) 2012 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> nobleNote nobleNote &File &Fail &Settings &Tetapan &Help &Bantuan &View &Lihat &Edit &Sunting Ctrl+Q Ctrl+Q &Import &Import &Configure... Kon&figur... Ctrl+P Ctrl+P &About Perih&al &Show toolbar Papa&r palan alat Ctrl+Shift+T Ctrl+Shift+T &Trash &Tong Sampah Ctrl+T Ctrl+T &History Se&jarah Ctrl+Shift+H Ctrl+Shift+H &New notebook Buku nota ba&ru Ctrl+N Ctrl+N &Rename notebook &Nama semula buku nota Ctrl+R Ctrl+R &Delete notebook Pa&dam buku nota Ctrl+D Ctrl+D &New note Buku &nota Ctrl+Shift+N Ctrl+Shift+N &Rename note &Nama semula nota Ctrl+Shift+R Ctrl+Shift+R &Delete note Pa&dam nota Ctrl+Shift+D Ctrl+Shift+D &Cut Po&tong Ctrl+X Ctrl+X &Paste Tam&pal Ctrl+V Ctrl+V Are you sure you want to move these %1 notes to the trash? %2 Anda pasti hendak alihkan %1 nota ini ke tong sampah? %2 Note Note-Editor Penyunting-Nota NoteDescriptor Note does not exist Nota tidak wujud This note does not longer exist. Do you want to keep the editor open? Nota ini tidak lagi wujud. Anda hendak kekalkan penyunting terbuka? Note modified Nota diubahsuai 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. Nota ini telah diubahsuai oleh kejadian lain %1. Patutkah nota disiimpan dibawah nama yang berbeza? Jika tidak nota akan dimuatkan semula. NoteImporter Select one or more tomboy or gnote notes Pilih satu atau lebih tomboy atau nota gnote Notes Nota Importing notes... Mengimport nota... Preferences Preferences Keutamaan &Browse ... La&yar ... Note editor default font: Fon lalai penyunting nota: Note editor default size: Saiz lalai penyunting nota: &Show "Show Source" menu entry P&apar masukan menu "Papar Sumber" Convert notes to the HTML format Tukar nota ke format HTML &Close to tray T&utup ke talam Automatically convert non-HTML notes to the HTML format. If disabled, non-HTML notes are opened read only. Tukar nota bukan-HTML secara automatik ke format HTML. Jika dilumpuhkan, nota bukan-HTML dibuka sebagai baca sahaja. Root directory Direktori root folder folder Warning Amaran Could not write settings! Tidak dapat tulis tetapan! Keep old trash folder? Kekalkan folder tong sampah lama? 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.) 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.) Couldn't delete trash folder Tidak dapat padam folder tong sampah Could not delete the trash folder! Tidak dapat padam folder tong sampah! Open Directory Buka Direktori The path "%1" is not writable! Laluan "%1" tidak boleh ditulis! No Write Access Tiada Capaian Tulis Width: Lebar: Height: Tinggi: &Touch screen scrolling &Penatalan skrin sentuh TextFormattingToolbar Format actions Tindakan format Formattoolbar Palang alat format &Bold Te&bal &Italic &Condong &Underline &Garis Bawah &Strike Out &Coret Tembus &Hyperlink &Hiperpautan &Clear formatting K&osongkan pemformatan &Text color... &Warna teks... &Background color... Warna &latar belakang... Insert hyperlink Sisip hiperpautan Addr&ess: Ala&mat: TextSearchToolbar Search bar Palang gelintar Searchtoolbar Palang alat gelintar Enter search argument Masukkan argumen gelintar Find &previous Cari terda&hulu Find &next Cari b&rikutnya &Case sensitive Sensitif &kata Trash Trash Tong sampah &Restore Pu&lih &Delete Pa&dam Select the notes you want to delete or restore Pilih nota yang anda hendak padam atau pulihkan Preview Pratonton Deleted notes Nota dipadam Deleting notes Memadam nota Are you sure you want to permanently delete these notes? %1 Anda pasti hendak memadam nota ini secara kekal? %1 Welcome Welcome to nobleNote Selamat datang ke nobleNote 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. Selamat datang ke nobleNote! Ini merupakan kali pertama nobleNote telah dimulakan. Anda boleh direktori yang mana nota akan disimpankan. &Browse La&yar Choose a directory Pilih direktori noblenote-1.0.8/src/translations/noblenote_pl.ts0000644000175000017500000005226512122634623022204 0ustar hakaishihakaishi Backup Indexing notes... Indeksowanie notatek... Indexing trash... Indeksowanie kosza... FileSystemModel Files could not be dropped Pliki nie mogły być upuszczone The files could not be dropped because files of the same names are already existing in this notebook: %1 Pliki nie mogły zostać upuszczone, ponieważ pliki z takimi samymi nazwami już istnieją w tym notesie: %1 The file could not be dropped because a file with the same name already exists in this notebook: %1 Plik nie mógł zostać upuszczony, ponieważ plik z taką samą nazwą już istnieje w tym notesie: %1 File could not be dropped Plik nie mógł zostać upuszczony HtmlNoteWriter default domyślny untitled note notatka bez tytułu MainWindow &Minimize &Minimalizuj &Quit &Wyjdź default domyślny &Restore &Przywróć Note does not exist Notatka nie istnieje new note nowa notatka new note (%1) nowa notatka (%1) Type to search for notes Szukaj notatek The selected note cannot be opened because it has been moved or renamed! Nie można otworzyć zaznaczonej notatki, ponieważ została przeniesiona lub jej nazwa uległa zmianie! new notebook nowy notes new notebook (%1) nowy notes (%1) Delete Notebook Usuń notes Are you sure you want to delete the notebook "%1" and move all containing notes to the trash? Jesteś pewien, że chcesz usunąć notes "%1" i przenieść całą jego zawartość do kosza? Notebook could not be deleted Nie można usunąć notesu The notebook could not be deleted because one notebook must remain Nie można usunąć tego notesu, ponieważ jeden notes musi pozostać The notebook could not be deleted because one or more notes inside the notebook could not be deleted. Notes nie może zostać usunięty, ponieważ nie można usunąć jednej lub więcej notatek w tym notesie. Delete Note Usuń notatkę Are you sure you want to move the note %1 to the trash? Jesteś pewien, że chcesz przenieść notatkę %1 do kosza? Delete Multiple Notes Usuń wiele notatek &Open notes &Otwórz notatki &Delete notes &Usuń notatki Show &Source Pokaż &Źródło Copy error Błąd kopiowania Notes of the same names already exist in this notebook: %1 Notatki o tych samych nazwach już istnieją w tym notesie: %1 About O programie <h1>%1 version %2</h1><p><b>%1</b> is a note taking application</p><p>Copyright (C) 2012 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> <h1>%1 version %2</h1><p><b>%1</b> jest aplikacją do robienia notatek</p><p>Copyright (C) 2012 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> nobleNote nobleNote &File &Plik &Settings &Ustawienia &Help &Pomoc &View &Widok &Edit &Edycja Ctrl+Q Ctrl+Q &Import &Import &Configure... &Konfiguracja... Ctrl+P Ctrl+P &About &O programie &Show toolbar &Pokaż pasek narzędzi Ctrl+Shift+T Ctrl+Shift+T &Trash &Kosz Ctrl+T Ctrl+T &History &Historia Ctrl+Shift+H Ctrl+Shift+H &New notebook &Nowy notes Ctrl+N Ctrl+N &Rename notebook &Zmień nazwę notesu Ctrl+R Ctrl+R &Delete notebook &Usuń notes Ctrl+D Ctrl+D &New note &Nowa notatka Ctrl+Shift+N Ctrl+Shift+N &Rename note &Zmień nazwę notatki Ctrl+Shift+R Ctrl+Shift+R &Delete note &Usuń notatkę Ctrl+Shift+D Ctrl+Shift+D &Cut &Wytnij Ctrl+X Ctrl+X &Paste &Wklej Ctrl+V Ctrl+V Are you sure you want to move these %1 notes to the trash? %2 Jesteś pewien, że chcesz przenieść te %1 notatek do kosza? %2 Note Note-Editor Edytor notatek NoteDescriptor Note does not exist Notatka nie istnieje This note does not longer exist. Do you want to keep the editor open? Ta notatka już nie istnieje. Czy chcesz pozostawić edytor otwarty? Note modified Notatka zmodyfikowana 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. Ta notatka została zmodyfikowana przez inny proces %1. Zapisać notatkę pod inną nazwą? W przeciwnym razie notatka zostanie załadowana ponownie. NoteImporter Select one or more tomboy or gnote notes Zaznacz jedną lub więcej notatek aplikacji tomboy lub gnote Notes Notatki Importing notes... Importowanie notatek... Preferences Preferences Preferencje &Browse ... &Przeglądaj ... Note editor default font: Domyślna czcionka edytora notatek: Note editor default size: Domyślny rozmiar edytora notatek: &Show "Show Source" menu entry &Pokazuj "Pokaż źródło" w menu Convert notes to the HTML format Konwertuj notatki do formatu HTML &Close to tray &Zamykaj do obszaru powiadomień Automatically convert non-HTML notes to the HTML format. If disabled, non-HTML notes are opened read only. Automatycznie konwertuj notatki do formatu HTML. Jeśli wyłączone, notatki w formatach innych niż HTML będą otwierane tylko do odczytu. Root directory Katalog główny folder folder Warning Ostrzeżenie Could not write settings! Nie można zapisać ustawień! Keep old trash folder? Zachować stary katalog kosza? 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.) 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.) Couldn't delete trash folder Nie można usunąć katalogu kosza Could not delete the trash folder! Nie można usunąć katalogu kosza! Open Directory Otwórz katalog The path "%1" is not writable! Ścieżka "%1" nie jest zapisywalna! No Write Access Brak praw do zapisu Width: Szerokość: Height: Wysokość: &Touch screen scrolling &Przewijanie dotykowe TextFormattingToolbar Format actions Formatowanie Formattoolbar Pasek narzędzi formatowania &Bold &Pogrubienie &Italic &Kursywa &Underline &Podkreślenie &Strike Out &Przekreślenie &Hyperlink &Hiperłącze &Clear formatting &Wyczyść formatowanie &Text color... &Kolor tekstu &Background color... &Kolor tła Insert hyperlink Wstaw hiperłącze Addr&ess: Adr&es: TextSearchToolbar Search bar Pasek wyszukiwania Searchtoolbar Pasek narzędzi wyszukiwania Enter search argument Wprowadź argument do wyszukiwania Find &previous Znajdź &poprzedni Find &next Znajdź &następny &Case sensitive &Rozróżnaj wielkość znaków Trash Trash Kosz &Restore &Przywróć &Delete &Usuń Select the notes you want to delete or restore Zaznacz notatki, które chcesz usunąć lub przywrócić Preview Podgląd Deleted notes Usunięte notatki Deleting notes Usuwanie notatek Are you sure you want to permanently delete these notes? %1 Jesteś pewien, że chcesz trwale usunąć te notatki? %1 Welcome Welcome to nobleNote Witaj w nobleNote 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. Witaj w nobleNote! Program nobleNote został uruchomiony pierwszy raz. Możesz wybrać katalog, w którym twoje notatki będą zapisywane. &Browse &Przeglądaj Choose a directory Wybierz katalog noblenote-1.0.8/src/translations/noblenote_de_DE.ts0000644000175000017500000004761612122634623022535 0ustar hakaishihakaishi Backup Indexing notes... Indiziere Notizen... Indexing trash... Indiziere Papierkorb... FileSystemModel Files could not be dropped Dateien konnten nicht abgelegt werden The files could not be dropped because files of the same names are already existing in this notebook: %1 Die Dateien konnten nicht abgelegt werden da in diesem Verzeichnis bereits Dateien mit diesen Namen existieren: %1 The file could not be dropped because a file with the same name already exists in this notebook: %1 Die Datei konnten nicht abgelegt werden da in diesem Verzeichnis bereits eine Datei mit diesen Namen existiert: %1 File could not be dropped Datei konnte nicht abgelegt werden HtmlNoteWriter default Standard untitled note Unbenannte Notiz MainWindow &Minimize &Minimieren &Quit &Schließen default Vorgabe &Restore &Wiederherstellen Note does not exist Notiz existiert nicht new note Neue Notiz new note (%1) Neue Notiz (%1) Type to search for notes Zum suchen nach Notizen tippen The selected note cannot be opened because it has been moved or renamed! Die ausgewählte Notiz kann nicht geöffnet werden, weil sie verschoben oder umbenannt wurde! new notebook Neues Notizbuch new notebook (%1) Neues Notizbuch (%1) Delete Notebook Lösche Notizbuch Are you sure you want to delete the notebook "%1" and move all containing notes to the trash? Sind Sie sicher, dass Sie das Notizbuch "%1" löschen und alle enthaltenen Notizen in den Papierkorb schieben wollen? Notebook could not be deleted Notizbuch konnte nicht gelöscht werden The notebook could not be deleted because one notebook must remain Das Notizbuch konnte nicht gelöscht werden da mindestens ein Notizbuch vorhanden sein muss The notebook could not be deleted because one or more notes inside the notebook could not be deleted. Das Notizbuch konnte nicht gelöscht werden, da eine oder mehrere Notizen in dem Notizbuch nicht gelöscht werden konnten. Delete Note Lösche Notiz Are you sure you want to move the note %1 to the trash? Sind Sie sicher, dass Sie die Notiz %1 in den Papierkob schieben wollen? Delete Multiple Notes Löschen mehrerer Notizen bestätigen &Open notes Notiz &öffnen &Delete notes Notizen &löschen Show &Source &Quelltext anzeigen Copy error Fehler beim Kopieren Notes of the same names already exist in this notebook: %1 In diesem Notizbuch existieren bereits Notizen mit diesem Namen: %1 About Über <h1>%1 version %2</h1><p><b>%1</b> is a note taking application</p><p>Copyright (C) 2012 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> nobleNote nobleNote &File &Datei &Settings &Einstellungen &Help &Hilfe &View &Ansicht &Edit &Bearbeiten Ctrl+Q Strg+Q &Import &Importieren &Configure... &Anpassen... Ctrl+P Strg+P &About &Über &Show toolbar &Werkzeugleiste anzeigen Ctrl+Shift+T Strg+Umschalt+T &Trash &Papierkorb Ctrl+T Strg+T &History &Verlauf Ctrl+Shift+H Strg+Umschalt+H &New notebook &Neues Notizbuch Ctrl+N Strg+N &Rename notebook Notizbuch &umbenennen Ctrl+R Strg+R &Delete notebook Notizbuch &löschen Ctrl+D Strg+D &New note &Neue Notiz Ctrl+Shift+N Strg+Umschalt+N &Rename note Notiz &umbenennen Ctrl+Shift+R Strg+Umschalt+R &Delete note Notiz &löschen Ctrl+Shift+D Strg+Umschalt+D &Cut &Ausschneiden Ctrl+X Strg+X &Paste &Einfügen Ctrl+V Strg+V Are you sure you want to move these %1 notes to the trash? %2 Sind Sie sicher, dass Sie dise %1 Notizen in den Papierkorb verschieben wollen? %2 Note Note-Editor Notiz-Editor NoteDescriptor Note does not exist Notiz existiert nicht This note does not longer exist. Do you want to keep the editor open? Diese Notiz existiert nicht mehr. Wollen Sie den Notizeditor geöffnet lassen? Note modified Die Notiz wurde modifiziert 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. 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. NoteImporter Select one or more tomboy or gnote notes Wählen Sie eine oder mehrere Tomboy- oder Gnote-Notizen aus Notes Notizen Importing notes... Importiere Notizen... Preferences Preferences Einstellungen &Browse ... &Durchsuchen... Note editor default font: Notizeditor Standardschriftart: Note editor default size: Notizeditor Standardgröße: &Show "Show Source" menu entry Convert notes to the HTML format Konvertiere Notizen in das HTML-Format &Close to tray Automatically convert non-HTML notes to the HTML format. If disabled, non-HTML notes are opened read only. Konvertiere nicht-HTML Notizen automatisch in das HTML-Format. Wenn deaktiviert, werden nicht-HTML Notizen schreibgeschützt geöffnet. Root directory folder Verzeichnis Warning Warnung Could not write settings! Einstellungen konnten nicht geschrieben werden! Keep old trash folder? Alten Papierkorb-Ordner behalten? 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.) Couldn't delete trash folder Konnte das Papierkorb-Ordner nicht löschen Could not delete the trash folder! Konnte den Papierkorb-Ordner nicht löschen! Open Directory Ordner öffnen The path "%1" is not writable! Der Pfad "%1" ist nicht beschreibbar! No Write Access Kein Schreibzugriff Width: Breite: Height: Höhe: &Touch screen scrolling TextFormattingToolbar Format actions Formatierungs-Aktionen Formattoolbar Formatierungs-Werkzeugleiste &Bold &Fett &Italic &Kursiv &Underline &Unterstrichen &Strike Out &Durchgestrichen &Hyperlink &Hyperlink &Clear formatting Formatierung &löschen &Text color... &Textfarbe... &Background color... &Hintergrundfarbe... Insert hyperlink Hyperlink einfügen Addr&ess: &Adresse: TextSearchToolbar Search bar Suchleiste Searchtoolbar Suchleiste Enter search argument Suchbegriff eingeben Find &previous &aufwärts Find &next a&bwärts &Case sensitive &Groß- und Kleinschreibung beachten Trash Trash Papierkorb &Restore &Wiederherstellen &Delete &Löschen Select the notes you want to delete or restore Wählen Sie die Notizen aus, die Sie Löschen oder Wiederherstellen möchten Preview Vorschau Deleted notes Gelöschte Notizen Deleting notes Löschen von Notizen Are you sure you want to permanently delete these notes? %1 Sind Sie sicher, dass Sie die markierten Notizen endgültig löschen wollen? %1 Welcome Welcome to nobleNote Willkommen bei nobleNote 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. Willkommen bei nobleNote! Dies ist das erste Mal, dass nobleNote gestartet wurde. Sie können ein Verzeichnis wählen, wo die Notizen gespeichert werden. &Browse &Duchsuchen Choose a directory Ordner auswählen noblenote-1.0.8/src/translations/noblenote_gl.ts0000644000175000017500000004516312122634623022172 0ustar hakaishihakaishi Backup Indexing notes... Indexando as notas... Indexing trash... Indexando o lixo... FileSystemModel Files could not be dropped The files could not be dropped because files of the same names are already existing in this notebook: %1 The file could not be dropped because a file with the same name already exists in this notebook: %1 File could not be dropped HtmlNoteWriter default predeterminado untitled note nota sen título MainWindow &Minimize &Minimizar &Quit &Saír default predeterminado &Restore &Restabelecer Note does not exist Non existe a nota new note nova nota new note (%1) nova nota (%1) Type to search for notes Escriba para buscar notas The selected note cannot be opened because it has been moved or renamed! Non é posíbel abrir a nota seleccionada xa que foi movida ou remomeada. new notebook caderno de notas novo new notebook (%1) caderno de notas novo (%1) Delete Notebook Eliminar este caderno de notas Are you sure you want to delete the notebook "%1" and move all containing notes to the trash? Notebook could not be deleted The notebook could not be deleted because one notebook must remain The notebook could not be deleted because one or more notes inside the notebook could not be deleted. Delete Note Eliminar a nota Are you sure you want to move the note %1 to the trash? Confirma que quere mover a nota %1 ao lixo? Delete Multiple Notes Eliminar múltiples notas &Open notes &Abrir notas &Delete notes &Eliminar notas Show &Source Copy error Produciuse un erro ao copiar Notes of the same names already exist in this notebook: %1 About Sobre <h1>%1 version %2</h1><p><b>%1</b> is a note taking application</p><p>Copyright (C) 2012 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> nobleNote nobleNote &File &Ficheiro &Settings &Configuracións &Help &Axuda &View &Ver &Edit &Editar Ctrl+Q Ctrl+Q &Import &Importar &Configure... &Configurar... Ctrl+P Ctrl+P &About &Sobre &Show toolbar &Amosar a barra de ferramentas Ctrl+Shift+T Ctrl+Maiús+T &Trash &Lixo Ctrl+T Ctrl+T &History &Historial Ctrl+Shift+H Ctrl+Maiús+H &New notebook &Novo caderno de notas Ctrl+N Ctrl+N &Rename notebook &Renomear o caderno de notas Ctrl+R Ctrl+R &Delete notebook &Eliminar o caderno de notas Ctrl+D Ctrl+D &New note &Nota nova Ctrl+Shift+N Ctrl+Maiús+N &Rename note &Renomear a nota Ctrl+Shift+R Ctrl+Maiús+R &Delete note &Eliminar a nota Ctrl+Shift+D Ctrl+Maiús+D &Cut &Cortar Ctrl+X Ctrl+X &Paste &Pegar Ctrl+V Ctrl+V Are you sure you want to move these %1 notes to the trash? %2 Confirma que quere mover estas %1 notas ao lixo? %2 Note Note-Editor Editor de notas NoteDescriptor Note does not exist Non existe a nota This note does not longer exist. Do you want to keep the editor open? Note modified Nota modificada 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. NoteImporter Select one or more tomboy or gnote notes Notes Notas Importing notes... Importando notas... Preferences Preferences Preferencias &Browse ... &Examinar... Note editor default font: Note editor default size: &Show "Show Source" menu entry Convert notes to the HTML format Converter notas ao formato HTML &Close to tray &Pechar na área de notificación Automatically convert non-HTML notes to the HTML format. If disabled, non-HTML notes are opened read only. Root directory Directorio raíz folder cartafol Warning Aviso Could not write settings! Keep old trash folder? Manter no antigo cartafol do lixo? 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.) Couldn't delete trash folder Non foi posíbel eliminar o cartafol do lixo Could not delete the trash folder! Non é posíbel eliminar o cartafol do lixo Open Directory Abrir un directorio The path "%1" is not writable! Non é posíbel escribir na ruta «%1» No Write Access Non hai acceso de escritura Width: Largo: Height: Alto: &Touch screen scrolling TextFormattingToolbar Format actions Accións de formato Formattoolbar &Bold &Negriña &Italic &Itálica &Underline &Subliñado &Strike Out &Riscado &Hyperlink &Ligazón &Clear formatting &Limpar o formato &Text color... Cor do &texto… &Background color... Cor do &fondo… Insert hyperlink Inserir ligazón Addr&ess: &Enderezos: TextSearchToolbar Search bar Barra de buscas Searchtoolbar Enter search argument Introduza o argumento da busca Find &previous Buscar &anterior Find &next Buscar &seguinte &Case sensitive &Distinguir as maiúsculas Trash Trash Lixo &Restore &Restabelecer &Delete &Eliminar Select the notes you want to delete or restore Seleccione as notas que quere eliminar ou restaurar Preview Vista previa Deleted notes Notas eliminadas Deleting notes Eliminando notas Are you sure you want to permanently delete these notes? %1 Confirma que quere eliminar estas notas permanentemente? %1 Welcome Welcome to nobleNote Benvido/a a nobleNote 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. &Browse &Examinar Choose a directory Escolla un directorio noblenote-1.0.8/src/translations/noblenote_de.ts0000644000175000017500000005010212132703267022147 0ustar hakaishihakaishi Backup Indexing notes... Indiziere Notizen... Indexing trash... Indiziere Papierkorb... FileSystemModel Files could not be dropped Dateien konnten nicht abgelegt werden The files could not be dropped because files of the same names are already existing in this notebook: %1 Die Dateien konnten nicht abgelegt werden da in diesem Verzeichnis bereits Dateien mit diesen Namen existieren: %1 The file could not be dropped because a file with the same name already exists in this notebook: %1 Die Datei konnten nicht abgelegt werden da in diesem Verzeichnis bereits eine Datei mit diesen Namen existiert: %1 File could not be dropped Datei konnte nicht abgelegt werden HtmlNoteWriter default Standard untitled note Unbenannte Notiz MainWindow &Minimize &Minimieren &Quit &Beenden default Vorgabe &Restore &Wiederherstellen Note does not exist Notiz existiert nicht new note Neue Notiz new note (%1) Neue Notiz (%1) Type to search for notes Zum suchen nach Notizen tippen The selected note cannot be opened because it has been moved or renamed! Die ausgewählte Notiz kann nicht geöffnet werden, weil sie verschoben oder umbenannt wurde! new notebook Neues Notizbuch new notebook (%1) Neues Notizbuch (%1) Delete Notebook Lösche Notizbuch Are you sure you want to delete the notebook "%1" and move all containing notes to the trash? Sind Sie sicher, dass Sie das Notizbuch "%1" löschen und alle enthaltenen Notizen in den Papierkorb schieben wollen? Notebook could not be deleted Notizbuch konnte nicht gelöscht werden The notebook could not be deleted because one notebook must remain Das Notizbuch konnte nicht gelöscht werden da mindestens ein Notizbuch vorhanden sein muss The notebook could not be deleted because one or more notes inside the notebook could not be deleted. Das Notizbuch konnte nicht gelöscht werden, da eine oder mehrere Notizen in dem Notizbuch nicht gelöscht werden konnten. Delete Note Lösche Notiz Are you sure you want to move the note %1 to the trash? Sind Sie sicher, dass Sie die Notiz %1 in den Papierkob schieben wollen? Delete Multiple Notes Löschen mehrerer Notizen bestätigen &Open notes Notiz &öffnen &Delete notes Notizen &löschen Show &Source &Quelltext anzeigen Copy error Fehler beim Kopieren Notes of the same names already exist in this notebook: %1 In diesem Notizbuch existieren bereits Notizen mit diesem Namen: %1 About Über <h1>%1 version %2</h1><p><b>%1</b> is a note taking application</p><p>Copyright (C) 2012 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> nobleNote nobleNote &File &Datei &Settings &Einstellungen &Help &Hilfe &View &Ansicht &Edit &Bearbeiten Ctrl+Q Strg+Q &Import &Importieren &Configure... &Anpassen... Ctrl+P Strg+P &About &Über &Show toolbar &Werkzeugleiste anzeigen Ctrl+Shift+T Strg+Umschalt+T &Trash &Papierkorb Ctrl+T Strg+T &History &Verlauf Ctrl+Shift+H Strg+Umschalt+H &New notebook &Neues Notizbuch Ctrl+N Strg+N &Rename notebook Notizbuch &umbenennen Ctrl+R Strg+R &Delete notebook Notizbuch &löschen Ctrl+D Strg+D &New note &Neue Notiz Ctrl+Shift+N Strg+Umschalt+N &Rename note Notiz &umbenennen Ctrl+Shift+R Strg+Umschalt+R &Delete note Notiz &löschen Ctrl+Shift+D Strg+Umschalt+D &Cut &Ausschneiden Ctrl+X Strg+X &Paste &Einfügen Ctrl+V Strg+V Are you sure you want to move these %1 notes to the trash? %2 Sind Sie sicher, dass Sie dise %1 Notizen in den Papierkorb verschieben wollen? %2 Note Note-Editor Notiz-Editor NoteDescriptor Note does not exist Notiz existiert nicht This note does not longer exist. Do you want to keep the editor open? Diese Notiz existiert nicht mehr. Wollen Sie den Notizeditor geöffnet lassen? Note modified Die Notiz wurde modifiziert 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. 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. NoteImporter Select one or more tomboy or gnote notes Wählen Sie eine oder mehrere Tomboy- oder Gnote-Notizen aus Notes Notizen Importing notes... Importiere Notizen... Preferences Preferences Einstellungen &Browse ... &Durchsuchen... Note editor default font: Notizeditor Standardschriftart: Note editor default size: Notizeditor Standardgröße: &Show "Show Source" menu entry Convert notes to the HTML format Konvertiere Notizen in das HTML-Format &Close to tray Automatically convert non-HTML notes to the HTML format. If disabled, non-HTML notes are opened read only. Konvertiere nicht-HTML Notizen automatisch in das HTML-Format. Wenn deaktiviert, werden nicht-HTML Notizen schreibgeschützt geöffnet. Root directory folder Verzeichnis Warning Warnung Could not write settings! Einstellungen konnten nicht geschrieben werden! Keep old trash folder? Alten Papierkorb-Ordner behalten? 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.) Couldn't delete trash folder Konnte das Papierkorb-Ordner nicht löschen Could not delete the trash folder! Konnte den Papierkorb-Ordner nicht löschen! Open Directory Ordner öffnen The path "%1" is not writable! Der Pfad "%1" ist nicht beschreibbar! No Write Access Kein Schreibzugriff Width: Breite: Height: Höhe: touch screen scrolling TextFormattingToolbar Format actions Formatierungs-Aktionen Formattoolbar Formatierungs-Werkzeugleiste &Bold &Fett &Italic &Kursiv &Underline &Unterstrichen &Strike Out &Durchgestrichen &Hyperlink &Hyperlink &Clear formatting Formatierung &löschen &Text color... &Textfarbe... &Background color... &Hintergrundfarbe... Insert hyperlink Hyperlink einfügen Addr&ess: &Adresse: TextSearchToolbar Search bar Suchleiste Searchtoolbar Suchleiste Enter search argument Suchbegriff eingeben Find &previous &aufwärts Find &next a&bwärts &Case sensitive &Groß- und Kleinschreibung beachten Trash Trash Papierkorb &Restore &Wiederherstellen &Delete &Löschen Select the notes you want to delete or restore Wählen Sie die Notizen aus, die Sie Löschen oder Wiederherstellen möchten Preview Vorschau Deleted notes Gelöschte Notizen Deleting notes Löschen von Notizen Are you sure you want to permanently delete these notes? %1 Sind Sie sicher, dass Sie die markierten Notizen endgültig löschen wollen? %1 Are you sure you want to permanently delete the selected notes? Welcome Welcome to nobleNote Willkommen bei nobleNote 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. Willkommen bei nobleNote! Dies ist das erste Mal, dass nobleNote gestartet wurde. Sie können ein Verzeichnis wählen, wo die Notizen gespeichert werden. &Browse &Duchsuchen Choose a directory Ordner auswählen noblenote-1.0.8/src/translations/noblenote_ru.ts0000644000175000017500000006117312122634623022215 0ustar hakaishihakaishi Backup Indexing notes... Индексация заметок… Indexing trash... Индексация корзины… FileSystemModel Files could not be dropped Файлы не могут быть перемещены The files could not be dropped because files of the same names are already existing in this notebook: %1 Файлы не могут быть перемещены, поскольку файлы с такими именами уже существуют в этом блокноте: %1 The file could not be dropped because a file with the same name already exists in this notebook: %1 Файлы не могут быть перемещены, поскольку файл с такими именем уже существует в этом блокноте: %1 File could not be dropped Файл не может быть перемещён HtmlNoteWriter default по умолчанию untitled note без названия MainWindow &Minimize &Свернуть &Quit &Выход default по умолчанию &Restore Восст&ановить Note does not exist Заметка не существует new note новая заметка new note (%1) новая заметка (%1) Type to search for notes Поиск заметок The selected note cannot be opened because it has been moved or renamed! Выбранная заметка не может быть открыта, поскольку она была перемещена или переименована! new notebook новый блокнот new notebook (%1) новый блокнот (%1) Delete Notebook Удалить блокнот Are you sure you want to delete the notebook "%1" and move all containing notes to the trash? Удалить блокнот «%1» и переместить всё его содержимое в корзину? Notebook could not be deleted Блокнот не может быть удалён The notebook could not be deleted because one notebook must remain Этот блокнот не может быть удалён, поскольку должен остаться хотя бы один блокнот The notebook could not be deleted because one or more notes inside the notebook could not be deleted. Этот блокнот не может быть удалён, поскольку одна или несколько заметок в нём не могут быть удалены Delete Note Удалить заметку Are you sure you want to move the note %1 to the trash? Переместить заметку %1 в корзину? Delete Multiple Notes Множественное удаление &Open notes &Открыть заметки &Delete notes &Удалить заметки Show &Source Показать &исходный текст Copy error Ошибка копирования Notes of the same names already exist in this notebook: %1 Заметки с такими названиями уже существуют в этом блокноте: %1 About О программе <h1>%1 version %2</h1><p><b>%1</b> is a note taking application</p><p>Copyright (C) 2012 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> <h1>%1, версия %2</h1><p><b>%1</b> — приложение для создания заметок</p><p>Авторские права (C) 2012 Christian Metscher, Fabian Deuchler</p><p>Данная лицензия разрешает лицам, получившим копию данного программного обеспечения и сопутствующей документации (в дальнейшем именуемыми «Программное Обеспечение»), безвозмездно использовать Программное Обеспечение без ограничений, включая неограниченное право на использование, копирование, изменение, добавление, публикацию, распространение, сублицензирование и/или продажу копий Программного Обеспечения, также как и лицам, которым предоставляется данное Программное Обеспечение, при соблюдении следующих условий:</p>Указанное выше уведомление об авторском праве и данные условия должны быть включены во все копии или значимые части данного Программного Обеспечения.<p>ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ НАРУШЕНИЙ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ ОТВЕТСТВЕННОСТИ ПО ИСКАМ О ВОЗМЕЩЕНИИ УЩЕРБА, УБЫТКОВ ИЛИ ДРУГИХ ТРЕБОВАНИЙ ПО ДЕЙСТВУЮЩИМ КОНТРАКТАМ, ДЕЛИКТАМ ИЛИ ИНОМУ, ВОЗНИКШИМ ИЗ, ИМЕЮЩИМ ПРИЧИНОЙ ИЛИ СВЯЗАННЫМ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.</p> nobleNote nobleNote &File &Файл &Settings &Настройки &Help &Справка &View &Вид &Edit &Правка Ctrl+Q Ctrl+Q &Import &Импортировать &Configure... &Настроить… Ctrl+P Ctrl+P &About &О программе &Show toolbar По&казать панель инструментов Ctrl+Shift+T Ctrl+Shift+T &Trash &Корзина Ctrl+T Ctrl+T &History &История Ctrl+Shift+H Ctrl+Shift+H &New notebook &Новый блокнот Ctrl+N Ctrl+N &Rename notebook &Переименовать блокнот Ctrl+R Ctrl+R &Delete notebook &Удалить блокнот Ctrl+D Ctrl+D &New note &Новая заметка Ctrl+Shift+N Ctrl+Shift+N &Rename note &Переименовать заметку Ctrl+Shift+R Ctrl+Shift+R &Delete note &Удалить заметку Ctrl+Shift+D Ctrl+Shift+D &Cut &Вырезать Ctrl+X Ctrl+X &Paste В&ставить Ctrl+V Ctrl+V Are you sure you want to move these %1 notes to the trash? %2 Переместить эти заметки %1 в корзину? %2 Note Note-Editor Редактор заметок NoteDescriptor Note does not exist Заметка не существует This note does not longer exist. Do you want to keep the editor open? Эта заметка более не существует. Не закрывать редактор? Note modified Заметка изменена 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. Эта заметка была изменена другим экземпляром %1. Сохранить заметку под другим именем? В противном случае, заметка будет перезаписана. NoteImporter Select one or more tomboy or gnote notes Выберите одну или более заметок Tomboy или Gnote Notes Заметки Importing notes... Импортирую заметки… Preferences Preferences Параметры &Browse ... &Обзор… Note editor default font: Шрифт редактора заметок по умолчанию: Note editor default size: Размеры редактора заметок по умолчанию: &Show "Show Source" menu entry &Отображать строку меню «Показать исходный текст» Convert notes to the HTML format Конвертировать заметки в HTML &Close to tray &Свернуть в трей Automatically convert non-HTML notes to the HTML format. If disabled, non-HTML notes are opened read only. Автоматически конвертировать заметки в формат HTML. Если отключено, заметки в формате, отличном от HTML будут открываться в режиме «только для чтения». Root directory Корневой каталог folder папка Warning Предупреждение Could not write settings! Не могу сохранить настройки! Keep old trash folder? Сохранить старый путь к корзины? 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.) Сохранить старую папку для корзины, ассоциированную с путём %1? (Вы сможете снова увидеть старые файлы в корзине, если выберете путь, который был до этого.) Couldn't delete trash folder Не могу удалить папку корзины Could not delete the trash folder! Не могу удалить папку корзины! Open Directory Открыть каталог The path "%1" is not writable! Путь «%1» не имеет прав на запись! No Write Access Нет прав на запись Width: Ширина: Height: Высота: &Touch screen scrolling &Прокрутка на сенсорном экране TextFormattingToolbar Format actions Форматирование Formattoolbar Панель форматирования &Bold &Полужирный &Italic &Курсив &Underline По&дчёркнутый &Strike Out &Зачёркнутый &Hyperlink &Ссылка &Clear formatting &Очистить форматирование &Text color... &Цвет текста… &Background color... Цвет &фона… Insert hyperlink Вставить гиперссылку Addr&ess: А&дрес: TextSearchToolbar Search bar Строка поиска Searchtoolbar Поиск Enter search argument Введите строку для поиска Find &previous Найти пред&ыдущее Find &next Найте &следующее &Case sensitive С &учётом регистра Trash Trash Корзина &Restore &Восстановить &Delete &Удалить Select the notes you want to delete or restore Выберите заметки, которые вы хотите удалить или восстановить Preview Предварительный просмотр Deleted notes Удалённые заметки Deleting notes Удаление заметок Are you sure you want to permanently delete these notes? %1 Вы уверены, что вы хотите окончательно удалить эти заметки? %1 Welcome Welcome to nobleNote Добро пожаловать в nobleNote 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. Добро пожаловать в nobleNote! Это первый запуск программы. Вы можете выбрать каталог, в котором будут храниться заметки. &Browse &Обзор Choose a directory Выберите каталог noblenote-1.0.8/src/translations/noblenote_ast.ts0000644000175000017500000004647712122634623022370 0ustar hakaishihakaishi Backup Indexing notes... Indexando les notes... Indexing trash... Indexando la basoria... FileSystemModel Files could not be dropped Nun se pudieron soltar los ficheros The files could not be dropped because files of the same names are already existing in this notebook: %1 Nun se pudieron soltar los ficheros porque yá esisten ficheros colos mesmos nomes nesti cuadernu de notes: %1 The file could not be dropped because a file with the same name already exists in this notebook: %1 Nun se pudo soltar el ficheru porque yá esiste un ficheru col mesmu nome nesti cuadernu de notes: %1 File could not be dropped Nun se pudo soltar el ficheru HtmlNoteWriter default predetermináu untitled note nota ensin títulu MainWindow &Minimize A&menorgar &Quit &Colar default predetermináu &Restore &Restaurar Note does not exist La nota nun esiste new note nota nueva new note (%1) nota nueva (%1) Type to search for notes Escribi pa guetar notes The selected note cannot be opened because it has been moved or renamed! ¡La nota seleicionada nun se pue abrir porque se movió o camudó de nome! new notebook cuadernu de notes nuevu new notebook (%1) cuadernu de notes nuevu (%1) Delete Notebook Desaniciar esti cuadernu de notes Are you sure you want to delete the notebook "%1" and move all containing notes to the trash? ¿Tas seguru de que quies desaniciar el cuadernu de notes "%1" y mover a la basoria toles notes que contién? Notebook could not be deleted El cuadernu de notes nun se pudo desaniciar The notebook could not be deleted because one notebook must remain El cuadernu de notes nun se pudo desaniciar porque tien de quedar un cuadernu The notebook could not be deleted because one or more notes inside the notebook could not be deleted. El cuadernu de notes nun se pudo desaniciar porque una o más notes del cuadernu nun se pudo desaniciar. Delete Note Desaniciar nota Are you sure you want to move the note %1 to the trash? ¿Tas seguru de que quies mover la nota %1 a la basoria? Delete Multiple Notes Desaniciar múltiples notes &Open notes &Abrir notes &Delete notes &Desaniciar notes Show &Source Ver &fonte Copy error Copiar error Notes of the same names already exist in this notebook: %1 Yá esisten notes colos mesmos nomes nesti cuadernu de notes: %1 About Tocante a <h1>%1 version %2</h1><p><b>%1</b> is a note taking application</p><p>Copyright (C) 2012 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> nobleNote nobleNote &File &Ficheru &Settings Preferencie&s &Help A&yuda &View &Ver &Edit &Editar Ctrl+Q Ctrl+Q &Import &Importar &Configure... &Configurar... Ctrl+P Ctrl+P &About Tocante &a &Show toolbar Amo&sar barra de ferramientes Ctrl+Shift+T Ctrl+Mayús+T &Trash &Papelera Ctrl+T Ctrl+T &History &Historial Ctrl+Shift+H Ctrl+Mayús+H &New notebook &Nuevu cuadernu de notes Ctrl+N Ctrl+N &Rename notebook &Renomar cuadernu de notes Ctrl+R Ctrl+R &Delete notebook &Desaniciar cuadernu de notes Ctrl+D Ctrl+D &New note &Nota nueva Ctrl+Shift+N Ctrl+Mayús+N &Rename note &Renomar nota Ctrl+Shift+R Ctrl+Mayús+R &Delete note &Desaniciar nota Ctrl+Shift+D Ctrl+Mayús+D &Cut &Cortar Ctrl+X Ctrl+X &Paste A&pegar Ctrl+V Ctrl+V Are you sure you want to move these %1 notes to the trash? %2 ¿Tas seguru de que quies mover les %1 notes a la basoria? %2 Note Note-Editor Editor de notes NoteDescriptor Note does not exist La nota nun esiste This note does not longer exist. Do you want to keep the editor open? Esta nota yá nun esiste. ¿Quies caltener abiertu l'editor? Note modified Nota camudada 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. Esta nota camudóla otra instancia de %1. ¿Tien de guardase la nota baxo otru nome? D'otra miente la nota recargaráse. NoteImporter Select one or more tomboy or gnote notes Seleiciona una o más notes de tomboy o gnote Notes Notes Importing notes... Importando notes... Preferences Preferences Preferencies &Browse ... &Esaminar... Note editor default font: Fonte predeterminada del editor de notes: Note editor default size: Tamañu predetermináu del editor de notes: &Show "Show Source" menu entry Amo&sar la entrada de menú "Ver fonte" Convert notes to the HTML format Convertir notes al formatu HTML &Close to tray &Zarrar a la bandexa Automatically convert non-HTML notes to the HTML format. If disabled, non-HTML notes are opened read only. Root directory folder carpeta Warning Avisu Could not write settings! Keep old trash folder? 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.) Couldn't delete trash folder Could not delete the trash folder! Open Directory Abrir direutoriu The path "%1" is not writable! No Write Access Nun hai accesu d'escritura Width: Anchor: Height: Altor: &Touch screen scrolling &Desplazamientu con pantalla táctil TextFormattingToolbar Format actions Aiciones de formatu Formattoolbar Barraferramientesformatu &Bold &Negrina &Italic &Cursiva &Underline &Sorrayáu &Strike Out Tac&háu &Hyperlink &Hiperenllaz &Clear formatting &Text color... Color de &testu... &Background color... Color de &fondu... Insert hyperlink Inxertar hiperenllaz Addr&ess: TextSearchToolbar Search bar Barra de gueta Searchtoolbar Barraferramientesgueta Enter search argument Escribir l'argumentu de la gueta Find &previous Alcontrar &anterior Find &next Alcontrar &siguiente &Case sensitive Trash Trash Basoria &Restore &Restaurar &Delete &Desaniciar Select the notes you want to delete or restore Preview Deleted notes Deleting notes Are you sure you want to permanently delete these notes? %1 Welcome Welcome to nobleNote 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. &Browse Choose a directory Escoyer un direutoriu noblenote-1.0.8/src/translations/noblenote_uk.ts0000644000175000017500000006165512122634623022213 0ustar hakaishihakaishi Backup Indexing notes... Індексуємо нотатки… Indexing trash... Індексуємо смітник… FileSystemModel Files could not be dropped Не вдалося скинути файли The files could not be dropped because files of the same names are already existing in this notebook: %1 Не вдалося скинути файли, оскільки у цьому нотатнику вже є файли з такими самими назвами: %1 The file could not be dropped because a file with the same name already exists in this notebook: %1 Не вдалося скинути файл, оскільки у цьому нотатнику вже є файл з такою самою назвою: %1 File could not be dropped Не вдалося скинути файл HtmlNoteWriter default типовий untitled note нотатка без назви MainWindow &Minimize &Мінімізувати &Quit Ви&йти default типовий &Restore Від&новити Note does not exist Нотатки не існує new note нова нотатка new note (%1) нова нотатка (%1) Type to search for notes Введіть ключове слово для пошуку The selected note cannot be opened because it has been moved or renamed! Позначену нотатку не вдалося відкрити, оскільки її було пересунуто або перейменовано! new notebook новий нотатник new notebook (%1) новий нотатник (%1) Delete Notebook Вилучити нотатник Are you sure you want to delete the notebook "%1" and move all containing notes to the trash? Ви справді хочете вилучити нотатник «%1» і пересунути весь його вміст до смітника? Notebook could not be deleted Не вдалося вилучити нотатник The notebook could not be deleted because one notebook must remain Цей нотатник не можна вилучати, оскільки у програми має залишатися принаймні один нотатник The notebook could not be deleted because one or more notes inside the notebook could not be deleted. Цей нотатник не можна вилучати, оскільки програмі не вдалося вилучити одну або декілька нотаток, що у ньому містяться. Delete Note Вилучення нотатки Are you sure you want to move the note %1 to the trash? Ви справді хочете пересунути нотатку %1 до смітника? Delete Multiple Notes Вилучення декількох нотаток &Open notes Ві&дкрити нотатки &Delete notes Ви&лучити нотатки Show &Source Показати &код Copy error Помилка копіювання Notes of the same names already exist in this notebook: %1 У цьому нотатнику вже є нотатки з такими самими назвами: %1 About Про <h1>%1 version %2</h1><p><b>%1</b> is a note taking application</p><p>Copyright (C) 2012 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> <h1>%1, версія %2</h1><p><b>%1</b> — програма для роботи з нотатками</p><p>Авторські права належать Christian Metscher, Fabian Deuchler, 2012</p><p>Будь-кому, хто отримав копію цього програмного забезпечення та пов’язаних з ним файлів документації (надалі «Програмного забезпечення) надається дозвіл безкоштовно працювати з Програмним забезпеченням без обмежень, зокрема без обмежень щодо права використання, копіювання, внесення змін, об’єднання, оприлюднення, поширення, повторного ліцензування і/або продажу копій Програмного забезпечення, а також надавати Програмне забезпечення особам, для яких його було створено, ті ж права відповідно до таких умов:</p>Разом з усіма копіями Програмного забезпечення або його суттєвих частин має бути надано це сповіщення щодо авторських прав.<p>ЦЕ ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ НАДАЄТЬСЯ У ПОТОЧНОМУ СТАНІ, БЕЗ БУДЬ-ЯКИХ ГАРАНТІЙ, ЯВНИХ ЧИ НЕЯВНИХ, ЗОКРЕМА, АЛЕ НЕ ОБМЕЖУЮЧИСЬ, ГАРАНТІЙ ПРАЦЕЗДАТНОСТІ ЧИ ПРИДАТНОСТІ ДЛЯ ВИКОНАННЯ ПЕВНОЇ МЕТИ ТА ГАРАНТІЙ ЗБЕРЕЖЕННЯ ЦІЛІСНОСТІ ДАНИХ. АВТОРИ ТА ВЛАСНИКИ АВТОРСЬКИХ ПРАВ ЗА ЖОДНИХ ОБСТАВИН НЕ ВИЗНАЮТЬ СЕБЕ СТОРОНОЮ БУДЬ-ЯКИХ СКАРГ, ПОВ’ЯЗАНИХ З ЗАВДАНОЮ ШКОДОЮ АБО ІНШИМИ НЕЗРУЧНОСТЯМИ ПІД ЧАС РОБОТИ ЗА НАЙМОМ, ПРАВОПОРУШЕННЯ АБО ІНШИХ ОБСТАВИН, ЩО Є ПРЯМИМ, ОПОСЕРЕДКОВАНИМ ЧИ ПОВ’ЯЗАНИМ НАСЛІДКОМ РОБОТИ, ВИКОРИСТАННЯ АБО ІНШИХ АСПЕКТІВ, ПОВ’ЯЗАНИХ З ПРОГРАМНИМ ЗАБЕЗПЕЧЕННЯМ.</p> nobleNote nobleNote &File &Файл &Settings П&араметри &Help &Довідка &View П&ерегляд &Edit З&міни Ctrl+Q Ctrl+Q &Import &Імпорт &Configure... &Налаштувати… Ctrl+P Ctrl+P &About Пр&о програму &Show toolbar &Показати панель Ctrl+Shift+T Ctrl+Shift+T &Trash С&мітник Ctrl+T Ctrl+T &History &Журнал Ctrl+Shift+H Ctrl+Shift+H &New notebook С&творити нотатник Ctrl+N Ctrl+N &Rename notebook Пере&йменувати нотатник Ctrl+R Ctrl+R &Delete notebook Ви&лучити нотатник Ctrl+D Ctrl+D &New note С&творити нотатку Ctrl+Shift+N Ctrl+Shift+N &Rename note Пере&йменувати нотатку Ctrl+Shift+R Ctrl+Shift+R &Delete note Ви&лучити нотатку Ctrl+Shift+D Ctrl+Shift+D &Cut Ви&різати Ctrl+X Ctrl+X &Paste &Вставити Ctrl+V Ctrl+V Are you sure you want to move these %1 notes to the trash? %2 Ви справді хочете пересунути ці %1 нотатки до смітника? %2 Note Note-Editor Редактор нотаток NoteDescriptor Note does not exist Нотатки не існує This note does not longer exist. Do you want to keep the editor open? Цієї нотатки більше немає. Хочете залишити вікно редактора відкритим? Note modified Нотатку змінено 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. До цієї нотатки було внесено зміни за допомогою іншого екземпляра %1. Зберегти нотатку з використанням іншої назви? Якщо нотатку не буде збережено, програма просто завантажить її новий вміст. NoteImporter Select one or more tomboy or gnote notes Позначте одну або декілька нотаток tomboy або gnote Notes Нотатки Importing notes... Імпортуємо нотатки… Preferences Preferences Параметри &Browse ... Ви&брати… Note editor default font: Типовий шрифти редактора нотаток: Note editor default size: Типовий розмір шрифту редактора нотаток: &Show "Show Source" menu entry &Показувати пункт меню «Показати код» Convert notes to the HTML format Перетворювати нотатки до формату HTML &Close to tray З&гортати до лотка Automatically convert non-HTML notes to the HTML format. If disabled, non-HTML notes are opened read only. Перетворювати нотатки у форматі, відмінному від HTML, у нотатки у форматі HTML. Якщо пункт не буде позначено, нотатки, що зберігаються не у форматі HTML, відкриватимуться у режимі лише читання. Root directory Коренева тека folder тека Warning Попередження Could not write settings! Не вдалося записати значення параметрів! Keep old trash folder? Зберегти стару теку смітника? 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.) Хочете зберегти стару теку смітника, пов’язану з адресою каталогу %1? (Якщо ви повернетеся до старої адреси каталогу, ви зможете переглянути старі файли, що зберігаються у у цьому каталозі-смітнику.) Couldn't delete trash folder Не вдалося вилучити теку смітника Could not delete the trash folder! Не вдалося вилучити теку смітника! Open Directory Відкриття каталогу The path "%1" is not writable! Запис до каталогу з адресою «%1» заборонено! No Write Access Немає доступу для запису Width: Ширина: Height: Висота: &Touch screen scrolling гортання за допомогою сенсорного екрана TextFormattingToolbar Format actions Дії з форматування Formattoolbar Панель форматування &Bold &Жирний &Italic &Курсив &Underline П&ідкреслений &Strike Out &Закреслений &Hyperlink Г&іперпосилання &Clear formatting З&няти форматування &Text color... Колір т&ексту… &Background color... Колір &тла… Insert hyperlink Вставити гіперпосилання Addr&ess: &Адреса: TextSearchToolbar Search bar Панель пошуку Searchtoolbar Панель пошуку Enter search argument Вкажіть ключове слово пошуку Find &previous Знайти &позаду Find &next Знайти &далі &Case sensitive &З урахуванням регістру Trash Trash Смітник &Restore &Відновити &Delete Ви&лучити Select the notes you want to delete or restore Позначте нотатки, які ви хочете вилучити або відновити Preview Перегляд Deleted notes Вилучені нотатки Deleting notes Вилучаємо нотатки Are you sure you want to permanently delete these notes? %1 Ви справді хочете остаточно вилучити ці нотатки? %1 Welcome Welcome to nobleNote Вітаємо у nobleNote 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. Вітаємо у nobleNote! Ви вперше запустили nobleNote у цій системі. Зараз ви можете вибрати каталог, у якому зберігатимуться нотатки. &Browse В&казати Choose a directory Виберіть каталог noblenote-1.0.8/src/translations/noblenote_es.ts0000644000175000017500000004555012122634623022177 0ustar hakaishihakaishi Backup Indexing notes... Indizando las notas… Indexing trash... Indizando la papelera… FileSystemModel Files could not be dropped No se pudieron soltar los archivos The files could not be dropped because files of the same names are already existing in this notebook: %1 The file could not be dropped because a file with the same name already exists in this notebook: %1 File could not be dropped No se pudo soltar el archivo HtmlNoteWriter default predeterminado untitled note nota sin título MainWindow &Minimize &Minimizar &Quit &Salir default predeterminado &Restore &Restaurar Note does not exist La nota no existe new note nota nueva new note (%1) nota nueva (%1) Type to search for notes Escriba para buscar notas The selected note cannot be opened because it has been moved or renamed! No se puede abrir la nota seleccionada porque se ha movido o renombrado. new notebook Nueva libreta de notas new notebook (%1) Delete Notebook Are you sure you want to delete the notebook "%1" and move all containing notes to the trash? ¿Está seguro de que desea eliminar la libreta de notas «%1» y mover todas las notas que contiene a la papelera? Notebook could not be deleted The notebook could not be deleted because one notebook must remain The notebook could not be deleted because one or more notes inside the notebook could not be deleted. Delete Note Eliminar nota Are you sure you want to move the note %1 to the trash? ¿Está seguro de que quiere mover la nota %1 a la papelera? Delete Multiple Notes Eliminar múltiples notas &Open notes &Abrir notas &Delete notes &Eliminar notas Show &Source Mostrar código &fuente Copy error Copiar error Notes of the same names already exist in this notebook: %1 About Acerca de <h1>%1 version %2</h1><p><b>%1</b> is a note taking application</p><p>Copyright (C) 2012 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> nobleNote nobleNote &File &Archivo &Settings &Configuración &Help Ay&uda &View &Ver &Edit &Editar Ctrl+Q Ctrl+Q &Import &Importar &Configure... &Configurar… Ctrl+P Ctrl+P &About &Acerca de &Show toolbar &Mostrar barra de herramientas Ctrl+Shift+T Ctrl+Mayús+T &Trash Mover a la &papelera Ctrl+T Ctrl+T &History &Histórico Ctrl+Shift+H Ctrl+Mayús+H &New notebook Ctrl+N Ctrl+N &Rename notebook Ctrl+R &Delete notebook Ctrl+D Ctrl+D &New note &Nota nueva Ctrl+Shift+N Ctrl+Mayús+N &Rename note &Renombrar nota Ctrl+Shift+R Ctrl+Mayús+R &Delete note &Eliminar nota Ctrl+Shift+D Ctrl+Mayús+D &Cut &Cortar Ctrl+X Ctrl+X &Paste &Pegar Ctrl+V Ctrl+V Are you sure you want to move these %1 notes to the trash? %2 ¿Está seguro de que quiere mover estas %1 notas a la papelera? %2 Note Note-Editor Editor de notas NoteDescriptor Note does not exist La nota no existe This note does not longer exist. Do you want to keep the editor open? Esta nota actualmente ya no existe. ¿Desea mantener el editor abierto? Note modified Nota modificada 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. NoteImporter Select one or more tomboy or gnote notes Seleccione una o más notas de tomboy o gnote Notes Notas Importing notes... Importando notas… Preferences Preferences Preferencias &Browse ... &Examinar… Note editor default font: Note editor default size: &Show "Show Source" menu entry &Mostrar opción de menú «Mostrar código fuente» Convert notes to the HTML format Convertir notas al formato HTML &Close to tray &Cerrar en el área de notificación Automatically convert non-HTML notes to the HTML format. If disabled, non-HTML notes are opened read only. Root directory Directorio raíz folder carpeta Warning Aviso Could not write settings! Keep old trash folder? ¿Mantener la carpeta de papelera anterior? 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.) Couldn't delete trash folder No se pudo eliminar la carpeta de papelera Could not delete the trash folder! Open Directory Abrir directorio The path "%1" is not writable! La ruta «%1» no es escribible. No Write Access Sin acceso de escritura Width: Anchura: Height: Altura: &Touch screen scrolling TextFormattingToolbar Format actions Acciones de formato Formattoolbar &Bold &Negrita &Italic &Cursiva &Underline &Subrayado &Strike Out &Tachado &Hyperlink &Hiperenlace &Clear formatting &Limpiar formato &Text color... Color del &texto… &Background color... Color del &fondo… Insert hyperlink Insertar hiperenlace Addr&ess: &Dirección: TextSearchToolbar Search bar Barra de búsqueda Searchtoolbar Enter search argument Find &previous Buscar &anterior Find &next Buscar &siguiente &Case sensitive Trash Trash Papelera &Restore &Restaurar &Delete &Eliminar Select the notes you want to delete or restore Seleccione las notas que quiere eliminar o restaurar Preview Previsualización Deleted notes Notas eliminadas Deleting notes Eliminando notas Are you sure you want to permanently delete these notes? %1 ¿Está seguro de que quiere eliminar estas notas permanentemente? %1 Welcome Welcome to nobleNote Bienvenido/a nobleNote 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. &Browse &Examinar Choose a directory Elija un directorio noblenote-1.0.8/src/translations/noblenote_cs.ts0000644000175000017500000005232012122634623022166 0ustar hakaishihakaishi Backup Indexing notes... Indexují se poznámky... Indexing trash... Indexuje se koš... FileSystemModel Files could not be dropped Soubory nemohou být puštěny The files could not be dropped because files of the same names are already existing in this notebook: %1 Soubory nemohli být puštěny, protože soubory se stejnými názvy již existují v tomto poznámkovém bloku: %1 The file could not be dropped because a file with the same name already exists in this notebook: %1 Soubor nemohl být puštěn, protože soubor se stejným názvem již existuje v tomto poznámkovém bloku: %1 File could not be dropped Soubor nemohl být puštěn HtmlNoteWriter default výchozí untitled note Nepojmenovaná poznámka MainWindow &Minimize &Zmenšit &Quit &Ukončit default výchozí &Restore &Obnovit Note does not exist Poznámka neexistuje new note nová poznámka new note (%1) nová poznámka (%1) Type to search for notes Zadejte text pro vyhledávání poznámek The selected note cannot be opened because it has been moved or renamed! Zvolená poznámka nemůže být otevřena, protože byla přesunuta nebo přejmenována! new notebook nový poznámkový blok new notebook (%1) nový poznámkový blok (%1) Delete Notebook Smazat poznámkový blok Are you sure you want to delete the notebook "%1" and move all containing notes to the trash? Opravdu chcete smazat poznámkový blok "%1" a přesunout všechny obsažené poznámky do koše? Notebook could not be deleted Poznámkový blok nemohl být smazán The notebook could not be deleted because one notebook must remain Poznámkový blok nemohl být smazán, protože jeden musí zůstat The notebook could not be deleted because one or more notes inside the notebook could not be deleted. Poznámkový blok nemohl být smazán protože jedna nebo více poznámek uvnitř nemohou být smazány. Delete Note Odstranit poznámku Are you sure you want to move the note %1 to the trash? Jste si jisti, že chcete přesunout poznámku %1 do koše? Delete Multiple Notes Smazat více poznámek &Open notes &Otevřít poznámky &Delete notes &Smazat poznámky Show &Source Zobrazit &Zdroj Copy error Chyba při kopírování Notes of the same names already exist in this notebook: %1 Poznámky se stejnými názvy již existují v tomto poznámkovém bloku: %1 About O programu <h1>%1 version %2</h1><p><b>%1</b> is a note taking application</p><p>Copyright (C) 2012 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> <h1>%1 verze%2</h1><p><b>%1</b> je psaní poznámek aplikace</p><p>Copyright (C) 2012 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> nobleNote nobleNote &File &Soubor &Settings &Nastavení &Help &Nápověda &View &Náhled &Edit &Upravit Ctrl+Q Ctrl+Q &Import &Import &Configure... &Nastavit... Ctrl+P Ctrl+P &About &O programu &Show toolbar &Zobrazit nástrojovou lištu Ctrl+Shift+T Ctrl+Shift+T &Trash &Koš Ctrl+T Ctrl+T &History &Historie Ctrl+Shift+H Ctrl+Shift+H &New notebook &Nový poznámkový blok Ctrl+N Ctrl+N &Rename notebook &Přejmenovat poznámkový blok Ctrl+R Ctrl+R &Delete notebook &Smazat poznámkový blok Ctrl+D Ctrl+D &New note &Nová poznámka Ctrl+Shift+N Ctrl+Shift+N &Rename note &Přejmenovat poznámku Ctrl+Shift+R Ctrl+Shift+R &Delete note &Smazat poznámku Ctrl+Shift+D Ctrl+Shift+D &Cut &Vyjmout Ctrl+X Ctrl+X &Paste &Vložit Ctrl+V Ctrl+V Are you sure you want to move these %1 notes to the trash? %2 Jste si jistý, že chcete přesunout tyto %1 poznámky do koše? %2 Note Note-Editor Editor-poznámek NoteDescriptor Note does not exist Poznámka neexistuje This note does not longer exist. Do you want to keep the editor open? Tato poznámka již neexistuje. Chcete nechat editor otevřený? Note modified Poznámka byla upravena 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. 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. NoteImporter Select one or more tomboy or gnote notes Vyberte jednu, nebo více tomboy, nebo gnote poznámek Notes Poznámky Importing notes... Importují se poznámky... Preferences Preferences Nastavení &Browse ... &Procházet ... Note editor default font: Standardní písmo poznámkového editoru: Note editor default size: Standardní velikost poznámkového editoru: &Show "Show Source" menu entry &Zobrazit "Zobrazit zdroj" položku menu Convert notes to the HTML format Převést poznámky do HTML formátu &Close to tray &Zavřít do lišty Automatically convert non-HTML notes to the HTML format. If disabled, non-HTML notes are opened read only. 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í. Root directory Adresář roota folder adresář Warning Varování Could not write settings! Nelze zapsat nastavení! Keep old trash folder? Zachovat starý adresář koše? 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.) 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.) Couldn't delete trash folder Nelze smazat adresář koše Could not delete the trash folder! Nelze smazat adresář koše! Open Directory Otevřít adresář The path "%1" is not writable! Cesta "%1" není zapisovatelná! No Write Access Bez přístupu zapisování Width: Šířka: Height: Výška: &Touch screen scrolling &Posun dotykové obrazovky TextFormattingToolbar Format actions Akce formátování Formattoolbar Nástrojová lišta formátování &Bold &Tučné &Italic &Kurzíva &Underline &Podtržené &Strike Out &Přeškrtnuté &Hyperlink &Odkaz &Clear formatting &Čisté formátování &Text color... &Barva textu... &Background color... &Barva pozadí... Insert hyperlink Vloží hypertextový odkaz Addr&ess: &Adresa: TextSearchToolbar Search bar Lišta hledání Searchtoolbar Nástrojová lišta vyhledávání Enter search argument Vložte parametr vyhledávání Find &previous Hledat &předchozí Find &next Najdi &následující &Case sensitive &Rozlišovat velká/malá Trash Trash Koš &Restore &Obnovit &Delete &Smazat Select the notes you want to delete or restore Vyberte poznámky, které chcete smazat, nebo obnovit Preview Náhled Deleted notes Smazané poznámky Deleting notes Mažou se poznámky Are you sure you want to permanently delete these notes? %1 Jste si jisti, že chcete trvale odstranit tyto poznámky? %1 Welcome Welcome to nobleNote Vítejte v nobleNote 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. Vítejte v nobleNote! Toto je poprvé, co byl spuštěn nobleNote. Můžete vybrat adresář, kam budou poznámky uloženy. &Browse &Procházet Choose a directory Vyberte adresář noblenote-1.0.8/src/progressreceiver.h0000644000175000017500000000545612122634623020175 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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.0.8/src/noteimporter.cpp0000644000175000017500000001035112122634623017654 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 "noteimporter.h" #include #include #include #include NoteImporter::NoteImporter(QObject *parent) : QObject(parent) { parentWidget = this->parent()->isWidgetType() ? qobject_cast(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(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())); QList objects; objects << futureWatcher << dialog << progressReceiver << fileDialog; foreach(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.0.8/src/htmlnotereader.h0000644000175000017500000000717712122634623017623 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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, QTextDocument* doc = 0); void setDocument(QTextDocument * document) { document_ = document;} QTextDocument * document() const { return document_;} // get the uuid that has been extracted during read() QUuid uuid() const { return uuid_;} const QString& title() const { return title_;} // file name const QString& titleFromHtml() const { return titleFromHtml_;} // returns the title from the html header // 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_;} // // 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 titleFromHtml_; QTextDocument * document_; QUuid uuid_; QDateTime lastChange_; QDateTime lastMetadataChange_; QDateTime createDate_; }; #endif // HTMLNOTEREADER_H noblenote-1.0.8/src/highlighter.cpp0000644000175000017500000000414512122634623017427 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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); foreach(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.0.8/src/note.h0000644000175000017500000000464612122634623015551 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 "textbrowser.h" class TextFormattingToolbar; class TextSearchToolbar; class Highlighter; class NoteDescriptor; 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;} private: TextBrowser *textBrowser; TextDocument *textDocument; TextFormattingToolbar *toolbar; TextSearchToolbar *searchBar; NoteDescriptor *noteDescriptor_; public slots: void setSearchBarText(QString str); protected: void keyPressEvent(QKeyEvent *k); void keyReleaseEvent(QKeyEvent *k); virtual void showEvent(QShowEvent* event); virtual void closeEvent(QCloseEvent *close_Note); }; #endif noblenote-1.0.8/src/highlighter.h0000644000175000017500000000366512122634623017102 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 HIGHLIGHTER_H #define HIGHLIGHTER_H #include #include #include 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 highlightingRules; QTextCharFormat linkFormat; QTextCharFormat keywordFormat; }; #endif //HIGHLIGHTER_H noblenote-1.0.8/src/note.cpp0000644000175000017500000001263112122634623016075 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 "flickcharm.h" Note::Note(QString filePath, QWidget *parent) : QMainWindow(parent){ setupUi(this); setAttribute(Qt::WA_DeleteOnClose); 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 // FlickCharm * flickCharm = new FlickCharm(this); // flickCharm->activateOn(textBrowser); 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("Toolbars/state").toByteArray()); connect(noteDescriptor_,SIGNAL(close()),this,SLOT(close())); connect(textBrowser,SIGNAL(signalFocusInEvent()),this->noteDescriptor_,SLOT(stateChange())); } void Note::highlightText(const QString &str) { searchBar->highlightText(str); } void Note::showEvent(QShowEvent* event){ 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); QMainWindow::showEvent(event); } void Note::closeEvent(QCloseEvent* close_Note){ QSettings().setValue("Notes/"+noteDescriptor_->uuid().toString()+"_size", size()); QSettings().setValue("Toolbars/state", saveState()); QSettings().setValue("Notes/"+noteDescriptor_->uuid().toString()+"_cursor_position", textBrowser->textCursor().position()); QStringList savedOpenNoteList = QSettings().value("open_notes").toStringList(); savedOpenNoteList.removeOne(noteDescriptor_->filePath()); QSettings().setValue("open_notes", savedOpenNoteList); if(textDocument->isModified()) noteDescriptor_->stateChange(); QMainWindow::closeEvent(close_Note); } 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(); } } void Note::keyReleaseEvent(QKeyEvent *k){ Q_UNUSED(k); textBrowser->setReadOnly(noteDescriptor_->readOnly()); textBrowser->setTextInteractionFlags(textBrowser->textInteractionFlags()| Qt::LinksAccessibleByMouse); } void Note::setSearchBarText(QString str) { searchBar->setText(str); searchBar->selectNextExpression(); searchBar->setVisible(true); } noblenote-1.0.8/src/datetime.h0000644000175000017500000000302112122634623016362 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 DATETIME_H #define DATETIME_H #include #include class DateTime { public: static QString getTimeZoneOffset(QDateTime dt1); static QString toISO8601(QDateTime dt); }; #endif // DATETIME_H noblenote-1.0.8/src/xmlnotereader.h0000644000175000017500000001013212122634623017440 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 XMLNOTEREADER_H #define XMLNOTEREADER_H #include "abstractnotereader.h" #include #include #include #include #include #include /** * 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 = 0); // 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 xml element static bool mightBeXmlNote(const QString & filePath); private: void read(); // 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 tag QString title_; QTextDocument * document_; QUuid uuid_; QDateTime lastChange_; QDateTime lastMetadataChange_; QDateTime createDate_; QString tag_; }; #endif // XMLNOTEREADER_H noblenote-1.0.8/src/mainwindow.h0000644000175000017500000001311212247312104016737 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 #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 /** * @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 quit(); private: Welcome *welcome; 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; FlickCharm *flickCharm; // kinetic scrolling for both list views and all notes 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); 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 openAllNotes(); 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); // enable flickCharm 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.0.8/src/findfilemodel.h0000644000175000017500000000576712122634623017412 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 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.0.8/src/findfilesystemmodel.h0000644000175000017500000000614512122634623020646 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 FINDFILESYSTEMMODEL_H #define FINDFILESYSTEMMODEL_H #include #include /** * @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 & index) 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 & 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); }; #endif // FINDFILESYSTEMMODEL_H noblenote-1.0.8/src/textbrowser.h0000644000175000017500000000360012122634623017161 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 TEXTBROWSER_H #define TEXTBROWSER_H #include /** * 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.0.8/src/flickcharm.cpp0000644000175000017500000002324412122634623017235 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 "flickcharm.h" #include #include #include #include #include #include #include #include //#include //#include #include struct FlickData { typedef enum { Steady, Pressed, ManualScroll, AutoScroll, Stop } State; State state; QWidget *widget; QPoint pressPos; QPoint offset; QPoint dragPos; QPoint speed; QList ignored; }; class FlickCharmPrivate { public: QHash flickData; QBasicTimer ticker; }; FlickCharm::FlickCharm(QObject *parent): QObject(parent) { d = new FlickCharmPrivate; } FlickCharm::~FlickCharm() { delete d; } void FlickCharm::activateOn(QAbstractScrollArea *scrollArea) { if (scrollArea) { scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); QWidget *viewport = scrollArea->viewport(); viewport->installEventFilter(this); scrollArea->installEventFilter(this); d->flickData.remove(viewport); d->flickData[viewport] = new FlickData; d->flickData[viewport]->widget = scrollArea; d->flickData[viewport]->state = FlickData::Steady; return; } // QWebView *webView = qobject_cast(widget); // if (webView) { // QWebFrame *frame = webView->page()->mainFrame(); // frame->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff); // frame->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff); // webView->installEventFilter(this); // d->flickData.remove(webView); // d->flickData[webView] = new FlickData; // d->flickData[webView]->widget = webView; // d->flickData[webView]->state = FlickData::Steady; // return; // } qWarning() << "FlickCharm only works on QAbstractScrollArea (and derived classes)"; qWarning() << "or QWebView (and derived classes)"; } void FlickCharm::deactivateFrom(QAbstractScrollArea *scrollArea) { if (scrollArea) { QWidget *viewport = scrollArea->viewport(); scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); viewport->removeEventFilter(this); scrollArea->removeEventFilter(this); delete d->flickData[viewport]; d->flickData.remove(viewport); return; } // QWebView *webView = qobject_cast(widget); // if (webView) { // webView->removeEventFilter(this); // delete d->flickData[webView]; // d->flickData.remove(webView); // return; // } } static QPoint scrollOffset(QWidget *widget) { int x = 0, y = 0; QAbstractScrollArea *scrollArea = qobject_cast(widget); if (scrollArea) { x = scrollArea->horizontalScrollBar()->value(); y = scrollArea->verticalScrollBar()->value(); } // QWebView *webView = qobject_cast(widget); // if (webView) { // QWebFrame *frame = webView->page()->mainFrame(); // x = frame->evaluateJavaScript("window.scrollX").toInt(); // y = frame->evaluateJavaScript("window.scrollY").toInt(); // } return QPoint(x, y); } static void setScrollOffset(QWidget *widget, const QPoint &p) { QAbstractScrollArea *scrollArea = qobject_cast(widget); if (scrollArea) { scrollArea->horizontalScrollBar()->setValue(p.x()); scrollArea->verticalScrollBar()->setValue(p.y()); } // QWebView *webView = qobject_cast(widget); // QWebFrame *frame = webView ? webView->page()->mainFrame() : 0; // if (frame) // frame->evaluateJavaScript(QString("window.scrollTo(%1,%2);").arg(p.x()).arg(p.y())); } static QPoint deaccelerate(const QPoint &speed, int a = 1, int max = 64) { int x = qBound(-max, speed.x(), max); int y = qBound(-max, speed.y(), max); x = (x == 0) ? x : (x > 0) ? qMax(0, x - a) : qMin(0, x + a); y = (y == 0) ? y : (y > 0) ? qMax(0, y - a) : qMin(0, y + a); return QPoint(x, y); } bool FlickCharm::eventFilter(QObject *object, QEvent *event) { if (!object->isWidgetType()) return false; QEvent::Type type = event->type(); if (type != QEvent::MouseButtonPress && type != QEvent::MouseButtonRelease && type != QEvent::MouseMove) return false; QMouseEvent *mouseEvent = static_cast(event); if (!mouseEvent || mouseEvent->modifiers() != Qt::NoModifier) return false; QWidget *viewport = static_cast(object); FlickData *data = d->flickData.value(viewport); if (!viewport || !data || data->ignored.removeAll(event)) return false; bool consumed = false; switch (data->state) { case FlickData::Steady: if (mouseEvent->type() == QEvent::MouseButtonPress) if (mouseEvent->buttons() == Qt::LeftButton) { consumed = true; data->state = FlickData::Pressed; data->pressPos = mouseEvent->pos(); data->offset = scrollOffset(data->widget); } break; case FlickData::Pressed: if (mouseEvent->type() == QEvent::MouseButtonRelease) { consumed = true; data->state = FlickData::Steady; QMouseEvent *event1 = new QMouseEvent(QEvent::MouseButtonPress, data->pressPos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); QMouseEvent *event2 = new QMouseEvent(*mouseEvent); data->ignored << event1; data->ignored << event2; QApplication::postEvent(object, event1); QApplication::postEvent(object, event2); } if (mouseEvent->type() == QEvent::MouseMove) { consumed = true; data->state = FlickData::ManualScroll; data->dragPos = QCursor::pos(); if (!d->ticker.isActive()) d->ticker.start(20, this); } break; case FlickData::ManualScroll: if (mouseEvent->type() == QEvent::MouseMove) { consumed = true; QPoint delta = mouseEvent->pos() - data->pressPos; setScrollOffset(data->widget, data->offset - delta); } if (mouseEvent->type() == QEvent::MouseButtonRelease) { consumed = true; data->state = FlickData::AutoScroll; } break; case FlickData::AutoScroll: if (mouseEvent->type() == QEvent::MouseButtonPress) { consumed = true; data->state = FlickData::Stop; data->speed = QPoint(0, 0); data->pressPos = mouseEvent->pos(); data->offset = scrollOffset(data->widget); } if (mouseEvent->type() == QEvent::MouseButtonRelease) { consumed = true; data->state = FlickData::Steady; data->speed = QPoint(0, 0); } break; case FlickData::Stop: if (mouseEvent->type() == QEvent::MouseButtonRelease) { consumed = true; data->state = FlickData::Steady; } if (mouseEvent->type() == QEvent::MouseMove) { consumed = true; data->state = FlickData::ManualScroll; data->dragPos = QCursor::pos(); if (!d->ticker.isActive()) d->ticker.start(20, this); } break; default: break; } return consumed; } void FlickCharm::timerEvent(QTimerEvent *event) { int count = 0; QHashIterator item(d->flickData); while (item.hasNext()) { item.next(); FlickData *data = item.value(); if (data->state == FlickData::ManualScroll) { count++; data->speed = QCursor::pos() - data->dragPos; data->dragPos = QCursor::pos(); } if (data->state == FlickData::AutoScroll) { count++; data->speed = deaccelerate(data->speed); QPoint p = scrollOffset(data->widget); setScrollOffset(data->widget, p - data->speed); if (data->speed == QPoint(0, 0)) data->state = FlickData::Steady; } } if (!count) d->ticker.stop(); QObject::timerEvent(event); } noblenote-1.0.8/src/fileiconprovider.h0000644000175000017500000000324412122634623020140 0ustar hakaishihakaishi/* nobleNote, a note taking application * Copyright (C) 2012 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 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.0.8/bin/0000755000175000017500000000000012242155131014375 5ustar hakaishihakaishinoblenote-1.0.8/version.txt0000644000175000017500000000000612123046475016057 0ustar hakaishihakaishi1.0.8 noblenote-1.0.8/nobleNote.pro0000644000175000017500000000553412122634623016310 0ustar hakaishihakaishiTEMPLATE = app TARGET = bin/noblenote DEPENDPATH = . src INCLUDEPATH = . src OBJECTS_DIR = build MOC_DIR = build UI_DIR = build RCC_DIR = build greaterThan(QT_MAJOR_VERSION, 4): QT += widgets concurrent win32 { QMAKE_LFLAGS += -static-libgcc RESOURCES += translations.qrc # 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/flickcharm.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/flickcharm.cpp \ src/noteimporter.cpp RESOURCES += nobleNote.qrc TRANSLATIONS = src/translations/noblenote_de.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.0.8/README0000644000175000017500000000070212122634623014511 0ustar hakaishihakaishinobleNote INSTALL: ======== Dependencies: libqt4-dev, build-essential If you want to install from source, open a terminal and change into this folder. To install type: qmake sudo make install distclean UNINSTALL: ========== 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.) noblenote-1.0.8/icon.rc0000644000175000017500000000012312122634623015104 0ustar hakaishihakaishiIDI_ICON1 ICON DISCARDABLE "src/noblenote-icons/noblenote.ico"noblenote-1.0.8/nobleNote.qrc0000644000175000017500000000300112242154762016264 0ustar hakaishihakaishi 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