summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorRobert Bieber <robby@bieberphoto.com>2010-06-26 07:59:23 +0000
committerRobert Bieber <robby@bieberphoto.com>2010-06-26 07:59:23 +0000
commitbe70fd89be787e2b24604f9ba785b87c1f8f1d22 (patch)
tree5b7ec98c48d2a5d2dc5078007142d2e92c09a8a2 /utils
parent5300c7014d602c57fcae7f6619f5138d83ba33c0 (diff)
downloadrockbox-be70fd89be787e2b24604f9ba785b87c1f8f1d22.zip
rockbox-be70fd89be787e2b24604f9ba785b87c1f8f1d22.tar.gz
rockbox-be70fd89be787e2b24604f9ba785b87c1f8f1d22.tar.bz2
rockbox-be70fd89be787e2b24604f9ba785b87c1f8f1d22.tar.xz
Theme Editor: Added an edit menu with a find/replace function (copied from an LGPL library)
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27137 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'utils')
-rw-r--r--utils/themeeditor/findreplace/findreplacedialog.cpp64
-rw-r--r--utils/themeeditor/findreplace/findreplacedialog.h80
-rw-r--r--utils/themeeditor/findreplace/findreplacedialog.ui32
-rw-r--r--utils/themeeditor/findreplace/findreplaceform.cpp222
-rw-r--r--utils/themeeditor/findreplace/findreplaceform.h153
-rw-r--r--utils/themeeditor/findreplace/findreplaceform.ui204
-rw-r--r--utils/themeeditor/gui/editorwindow.cpp90
-rw-r--r--utils/themeeditor/gui/editorwindow.h6
-rw-r--r--utils/themeeditor/gui/editorwindow.ui62
-rw-r--r--utils/themeeditor/gui/skindocument.cpp6
-rw-r--r--utils/themeeditor/gui/skindocument.h8
-rw-r--r--utils/themeeditor/themeeditor.pro13
12 files changed, 937 insertions, 3 deletions
diff --git a/utils/themeeditor/findreplace/findreplacedialog.cpp b/utils/themeeditor/findreplace/findreplacedialog.cpp
new file mode 100644
index 0000000..547ad23
--- /dev/null
+++ b/utils/themeeditor/findreplace/findreplacedialog.cpp
@@ -0,0 +1,64 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * This file has been copied from Lorenzo Bettini, with minor modifications
+ * made available under the LGPL version 3, as the original file was licensed
+ *
+ ****************************************************************************
+ *
+ * Copyright (C) 2009 Lorenzo Bettini <http://www.lorenzobettini.it>
+ * See COPYING file that comes with this distribution
+ */
+
+#include "findreplacedialog.h"
+#include "ui_findreplacedialog.h"
+
+FindReplaceDialog::FindReplaceDialog(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::FindReplaceDialog)
+{
+ ui->setupUi(this);
+}
+
+FindReplaceDialog::~FindReplaceDialog()
+{
+ delete ui;
+}
+
+void FindReplaceDialog::changeEvent(QEvent *e)
+{
+ QDialog::changeEvent(e);
+ switch (e->type()) {
+ case QEvent::LanguageChange:
+ ui->retranslateUi(this);
+ break;
+ default:
+ break;
+ }
+}
+
+void FindReplaceDialog::setTextEdit(QPlainTextEdit *textEdit) {
+ ui->findReplaceForm->setTextEdit(textEdit);
+}
+
+void FindReplaceDialog::writeSettings(QSettings &settings, const QString &prefix) {
+ ui->findReplaceForm->writeSettings(settings, prefix);
+}
+
+void FindReplaceDialog::readSettings(QSettings &settings, const QString &prefix) {
+ ui->findReplaceForm->readSettings(settings, prefix);
+}
+
+void FindReplaceDialog::findNext() {
+ ui->findReplaceForm->findNext();
+}
+
+void FindReplaceDialog::findPrev() {
+ ui->findReplaceForm->findPrev();
+}
diff --git a/utils/themeeditor/findreplace/findreplacedialog.h b/utils/themeeditor/findreplace/findreplacedialog.h
new file mode 100644
index 0000000..c3f2539
--- /dev/null
+++ b/utils/themeeditor/findreplace/findreplacedialog.h
@@ -0,0 +1,80 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * This file has been copied from Lorenzo Bettini, with minor modifications
+ * made available under the LGPL version 3, as the original file was licensed
+ *
+ ****************************************************************************
+ *
+ * Copyright (C) 2009 Lorenzo Bettini <http://www.lorenzobettini.it>
+ * See COPYING file that comes with this distribution
+ */
+
+#ifndef FINDREPLACEDIALOG_H
+#define FINDREPLACEDIALOG_H
+
+#include <QDialog>
+#include <QPlainTextEdit>
+
+namespace Ui {
+ class FindReplaceDialog;
+}
+
+class QTextEdit;
+class QSettings;
+
+/**
+ * A find/replace dialog.
+ *
+ * It relies on a FindReplaceForm object (see that class for the functionalities provided).
+ */
+class FindReplaceDialog : public QDialog {
+ Q_OBJECT
+public:
+ FindReplaceDialog(QWidget *parent = 0);
+ virtual ~FindReplaceDialog();
+
+ /**
+ * Associates the text editor where to perform the search
+ * @param textEdit
+ */
+ void setTextEdit(QPlainTextEdit *textEdit);
+
+ /**
+ * Writes the state of the form to the passed settings.
+ * @param settings
+ * @param prefix the prefix to insert in the settings
+ */
+ virtual void writeSettings(QSettings &settings, const QString &prefix = "FindReplaceDialog");
+
+ /**
+ * Reads the state of the form from the passed settings.
+ * @param settings
+ * @param prefix the prefix to look for in the settings
+ */
+ virtual void readSettings(QSettings &settings, const QString &prefix = "FindReplaceDialog");
+
+public slots:
+ /**
+ * Finds the next occurrence
+ */
+ void findNext();
+
+ /**
+ * Finds the previous occurrence
+ */
+ void findPrev();
+
+protected:
+ void changeEvent(QEvent *e);
+
+ Ui::FindReplaceDialog *ui;
+};
+
+#endif // FINDREPLACEDIALOG_H
diff --git a/utils/themeeditor/findreplace/findreplacedialog.ui b/utils/themeeditor/findreplace/findreplacedialog.ui
new file mode 100644
index 0000000..74984b3
--- /dev/null
+++ b/utils/themeeditor/findreplace/findreplacedialog.ui
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>FindReplaceDialog</class>
+ <widget class="QDialog" name="FindReplaceDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>342</width>
+ <height>140</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Find/Replace</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0">
+ <widget class="FindReplaceForm" name="findReplaceForm" native="true"/>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>FindReplaceForm</class>
+ <extends>QWidget</extends>
+ <header location="global">findreplaceform.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/utils/themeeditor/findreplace/findreplaceform.cpp b/utils/themeeditor/findreplace/findreplaceform.cpp
new file mode 100644
index 0000000..cd2700f
--- /dev/null
+++ b/utils/themeeditor/findreplace/findreplaceform.cpp
@@ -0,0 +1,222 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * This file has been copied from Lorenzo Bettini, with minor modifications
+ * made available under the LGPL version 3, as the original file was licensed
+ *
+ ****************************************************************************
+ *
+ * Copyright (C) 2009 Lorenzo Bettini <http://www.lorenzobettini.it>
+ * See COPYING file that comes with this distribution
+ */
+
+#include <QtGui>
+#include <QTextEdit>
+#include <QRegExp>
+#include <QSettings>
+
+#include "findreplaceform.h"
+#include "ui_findreplaceform.h"
+
+#define TEXT_TO_FIND "textToFind"
+#define TEXT_TO_REPLACE "textToReplace"
+#define DOWN_RADIO "downRadio"
+#define UP_RADIO "upRadio"
+#define CASE_CHECK "caseCheck"
+#define WHOLE_CHECK "wholeCheck"
+#define REGEXP_CHECK "regexpCheck"
+
+FindReplaceForm::FindReplaceForm(QWidget *parent) :
+ QWidget(parent),
+ ui(new Ui::FindReplaceForm), textEdit(0)
+{
+ ui->setupUi(this);
+
+ ui->errorLabel->setText("");
+
+ connect(ui->textToFind, SIGNAL(textChanged(QString)), this, SLOT(textToFindChanged()));
+ connect(ui->textToFind, SIGNAL(textChanged(QString)), this, SLOT(validateRegExp(QString)));
+
+ connect(ui->regexCheckBox, SIGNAL(toggled(bool)), this, SLOT(regexpSelected(bool)));
+
+ connect(ui->findButton, SIGNAL(clicked()), this, SLOT(find()));
+ connect(ui->closeButton, SIGNAL(clicked()), parent, SLOT(close()));
+
+ connect(ui->replaceButton, SIGNAL(clicked()), this, SLOT(replace()));
+ connect(ui->replaceAllButton, SIGNAL(clicked()), this, SLOT(replaceAll()));
+}
+
+FindReplaceForm::~FindReplaceForm()
+{
+ delete ui;
+}
+
+void FindReplaceForm::hideReplaceWidgets() {
+ ui->replaceLabel->setVisible(false);
+ ui->textToReplace->setVisible(false);
+ ui->replaceButton->setVisible(false);
+ ui->replaceAllButton->setVisible(false);
+}
+
+void FindReplaceForm::setTextEdit(QPlainTextEdit *textEdit_) {
+ textEdit = textEdit_;
+ connect(textEdit, SIGNAL(copyAvailable(bool)), ui->replaceButton, SLOT(setEnabled(bool)));
+ connect(textEdit, SIGNAL(copyAvailable(bool)), ui->replaceAllButton, SLOT(setEnabled(bool)));
+}
+
+void FindReplaceForm::changeEvent(QEvent *e)
+{
+ QWidget::changeEvent(e);
+ switch (e->type()) {
+ case QEvent::LanguageChange:
+ ui->retranslateUi(this);
+ break;
+ default:
+ break;
+ }
+}
+
+void FindReplaceForm::textToFindChanged() {
+ ui->findButton->setEnabled(ui->textToFind->text().size() > 0);
+}
+
+void FindReplaceForm::regexpSelected(bool sel) {
+ if (sel)
+ validateRegExp(ui->textToFind->text());
+ else
+ validateRegExp("");
+}
+
+void FindReplaceForm::validateRegExp(const QString &text) {
+ if (!ui->regexCheckBox->isChecked() || text.size() == 0) {
+ ui->errorLabel->setText("");
+ return; // nothing to validate
+ }
+
+ QRegExp reg(text,
+ (ui->caseCheckBox->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive));
+
+ if (reg.isValid()) {
+ showError("");
+ } else {
+ showError(reg.errorString());
+ }
+}
+
+void FindReplaceForm::showError(const QString &error) {
+ if (error == "") {
+ ui->errorLabel->setText("");
+ } else {
+ ui->errorLabel->setText("<span style=\" font-weight:600; color:#ff0000;\">" +
+ error +
+ "</span>");
+ }
+}
+
+void FindReplaceForm::showMessage(const QString &message) {
+ if (message == "") {
+ ui->errorLabel->setText("");
+ } else {
+ ui->errorLabel->setText("<span style=\" font-weight:600; color:green;\">" +
+ message +
+ "</span>");
+ }
+}
+
+void FindReplaceForm::find() {
+ find(ui->downRadioButton->isChecked());
+}
+
+void FindReplaceForm::find(bool next) {
+ if (!textEdit)
+ return; // TODO: show some warning?
+
+ // backward search
+ bool back = !next;
+
+ const QString &toSearch = ui->textToFind->text();
+
+ bool result = false;
+
+ QTextDocument::FindFlags flags;
+
+ if (back)
+ flags |= QTextDocument::FindBackward;
+ if (ui->caseCheckBox->isChecked())
+ flags |= QTextDocument::FindCaseSensitively;
+ if (ui->wholeCheckBox->isChecked())
+ flags |= QTextDocument::FindWholeWords;
+
+ if (ui->regexCheckBox->isChecked()) {
+ QRegExp reg(toSearch,
+ (ui->caseCheckBox->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive));
+
+ qDebug() << "searching for regexp: " << reg.pattern();
+
+ textCursor = textEdit->document()->find(reg, textCursor, flags);
+ textEdit->setTextCursor(textCursor);
+ result = (!textCursor.isNull());
+ } else {
+ qDebug() << "searching for: " << toSearch;
+
+ result = textEdit->find(toSearch, flags);
+ }
+
+ if (result) {
+ showError("");
+ } else {
+ showError(tr("no match found"));
+ // move to the beginning of the document for the next find
+ textCursor.setPosition(0);
+ textEdit->setTextCursor(textCursor);
+ }
+}
+
+void FindReplaceForm::replace() {
+ if (!textEdit->textCursor().hasSelection()) {
+ find();
+ } else {
+ textEdit->textCursor().insertText(ui->textToReplace->text());
+ find();
+ }
+}
+
+void FindReplaceForm::replaceAll() {
+ int i=0;
+ while (textEdit->textCursor().hasSelection()){
+ textEdit->textCursor().insertText(ui->textToReplace->text());
+ find();
+ i++;
+ }
+ showMessage(tr("Replaced %1 occurrence(s)").arg(i));
+}
+
+void FindReplaceForm::writeSettings(QSettings &settings, const QString &prefix) {
+ settings.beginGroup(prefix);
+ settings.setValue(TEXT_TO_FIND, ui->textToFind->text());
+ settings.setValue(TEXT_TO_REPLACE, ui->textToReplace->text());
+ settings.setValue(DOWN_RADIO, ui->downRadioButton->isChecked());
+ settings.setValue(UP_RADIO, ui->upRadioButton->isChecked());
+ settings.setValue(CASE_CHECK, ui->caseCheckBox->isChecked());
+ settings.setValue(WHOLE_CHECK, ui->wholeCheckBox->isChecked());
+ settings.setValue(REGEXP_CHECK, ui->regexCheckBox->isChecked());
+ settings.endGroup();
+}
+
+void FindReplaceForm::readSettings(QSettings &settings, const QString &prefix) {
+ settings.beginGroup(prefix);
+ ui->textToFind->setText(settings.value(TEXT_TO_FIND, "").toString());
+ ui->textToReplace->setText(settings.value(TEXT_TO_REPLACE, "").toString());
+ ui->downRadioButton->setChecked(settings.value(DOWN_RADIO, true).toBool());
+ ui->upRadioButton->setChecked(settings.value(UP_RADIO, false).toBool());
+ ui->caseCheckBox->setChecked(settings.value(CASE_CHECK, false).toBool());
+ ui->wholeCheckBox->setChecked(settings.value(WHOLE_CHECK, false).toBool());
+ ui->regexCheckBox->setChecked(settings.value(REGEXP_CHECK, false).toBool());
+ settings.endGroup();
+}
diff --git a/utils/themeeditor/findreplace/findreplaceform.h b/utils/themeeditor/findreplace/findreplaceform.h
new file mode 100644
index 0000000..f18052b
--- /dev/null
+++ b/utils/themeeditor/findreplace/findreplaceform.h
@@ -0,0 +1,153 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * This file has been copied from Lorenzo Bettini, with minor modifications
+ * made available under the LGPL version 3, as the original file was licensed
+ *
+ ****************************************************************************
+ *
+ * Copyright (C) 2009 Lorenzo Bettini <http://www.lorenzobettini.it>
+ * See COPYING file that comes with this distribution
+ */
+
+#ifndef FINDREPLACEFORM_H
+#define FINDREPLACEFORM_H
+
+#include <QWidget>
+#include <QTextCursor>
+#include <QPlainTextEdit>
+
+namespace Ui {
+ class FindReplaceForm;
+}
+
+class QTextEdit;
+class QSettings;
+
+/**
+ * The form for the find/replace dialog. The form presents the typical
+ * widgets you find in standard find/replace dialogs, and it acts on a QTextEdit.
+ *
+ * \image html Screenshot-FindReplace.png
+ *
+ * You need to set the QTextEdit explicitly, using the method setTextEdit(QTextEdit *textEdit).
+ *
+ * For instance
+ * \code
+ * m_findReplaceDialog = new FindReplaceDialog(this);
+ * m_findReplaceDialog->setModal(false);
+ * m_findReplaceDialog->setTextEdit(ui->textEdit);
+ * \endcode
+ *
+ * The find functionalities is available even if the find dialog is not shown: if something
+ * to search for was already specified, the application can call the methods findNext() and
+ * findPrev() (e.g., by connecting them to menu items).
+ *
+ * In case a regular expression is used as the search term, the form also checks whether the
+ * expression is a valid regular expression (You may want to take a look at the syntax of regular expressions:
+ * http://doc.trolltech.com/qregexp.html).
+ *
+ * The form provides also functionalities to save and restore its state using a QSettings object (i.e.,
+ * the last word searched for, the options of the form, etc.) via the methods writeSettings()
+ * and readSettings().
+ *
+ * You can take a look at the \ref examples page.
+ */
+class FindReplaceForm : public QWidget {
+ Q_OBJECT
+public:
+ FindReplaceForm(QWidget *parent = 0);
+ virtual ~FindReplaceForm();
+
+ /**
+ * Associates the text editor where to perform the search
+ * @param textEdit_
+ */
+ void setTextEdit(QPlainTextEdit *textEdit_);
+
+ /// hides replace widgets from the form
+ void hideReplaceWidgets();
+
+ /**
+ * Writes the state of the form to the passed settings.
+ * @param settings
+ * @param prefix the prefix to insert in the settings
+ */
+ virtual void writeSettings(QSettings &settings, const QString &prefix = "FindReplaceDialog");
+
+ /**
+ * Reads the state of the form from the passed settings.
+ * @param settings
+ * @param prefix the prefix to look for in the settings
+ */
+ virtual void readSettings(QSettings &settings, const QString &prefix = "FindReplaceDialog");
+
+public slots:
+ /**
+ * performs the find task
+ * @param down whether to find the next or the previous
+ * occurrence
+ */
+ void find(bool down);
+
+ /**
+ * Finds the next occurrence
+ */
+ void find();
+
+ /**
+ * Finds the next occurrence
+ */
+ void findNext() { find(true); }
+
+ /**
+ * Finds the previous occurrence
+ */
+ void findPrev() { find(false); }
+
+ /**
+ * Replaces the found occurrences and goes to the next occurrence
+ */
+ void replace();
+
+ /**
+ * Replaces all the found occurrences
+ */
+ void replaceAll();
+
+protected:
+ void changeEvent(QEvent *e);
+
+ /// shows an error in the dialog
+ void showError(const QString &error);
+
+ /// shows a message in the dialog
+ void showMessage(const QString &message);
+
+protected slots:
+ /// when the text edit contents changed
+ void textToFindChanged();
+
+ /// checks whether the passed text is a valid regexp
+ void validateRegExp(const QString &text);
+
+ /// the regexp checkbox was selected
+ void regexpSelected(bool sel);
+
+protected:
+ Ui::FindReplaceForm *ui;
+
+ /// for searching into the text
+ QTextCursor textCursor;
+
+ /// the text editor (possibly) associated with this form
+ QPlainTextEdit *textEdit;
+};
+
+#endif // FINDREPLACEFORM_H
diff --git a/utils/themeeditor/findreplace/findreplaceform.ui b/utils/themeeditor/findreplace/findreplaceform.ui
new file mode 100644
index 0000000..acc055c
--- /dev/null
+++ b/utils/themeeditor/findreplace/findreplaceform.ui
@@ -0,0 +1,204 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>FindReplaceForm</class>
+ <widget class="QWidget" name="FindReplaceForm">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>483</width>
+ <height>288</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Form</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0">
+ <layout class="QVBoxLayout" name="verticalLayout_5">
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <layout class="QGridLayout" name="gridLayout_3">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>&amp;Find:</string>
+ </property>
+ <property name="buddy">
+ <cstring>textToFind</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="textToFind"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="replaceLabel">
+ <property name="text">
+ <string>R&amp;eplace with:</string>
+ </property>
+ <property name="buddy">
+ <cstring>textToReplace</cstring>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLineEdit" name="textToReplace"/>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QLabel" name="errorLabel">
+ <property name="text">
+ <string>errorLabel</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>D&amp;irection</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <widget class="QRadioButton" name="downRadioButton">
+ <property name="text">
+ <string>&amp;Down</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="upRadioButton">
+ <property name="text">
+ <string>&amp;Up</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_2">
+ <property name="title">
+ <string>&amp;Options</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_4">
+ <item>
+ <widget class="QCheckBox" name="caseCheckBox">
+ <property name="text">
+ <string>&amp;Case sensitive</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="wholeCheckBox">
+ <property name="text">
+ <string>&amp;Whole words only</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="regexCheckBox">
+ <property name="toolTip">
+ <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;whether the text to search should be interpreted as a regular expression.&lt;/p&gt;
+&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;You may want to take a look at the syntax of regular expressions:&lt;/p&gt;
+&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;a href=&quot;http://doc.trolltech.com/qregexp.html&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0000ff;&quot;&gt;http://doc.trolltech.com/qregexp.html&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>R&amp;egular Expression</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="1">
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="leftMargin">
+ <number>10</number>
+ </property>
+ <item>
+ <widget class="QPushButton" name="findButton">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Find</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="closeButton">
+ <property name="text">
+ <string>&amp;Close</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="replaceButton">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>&amp;Replace</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="replaceAllButton">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Replace &amp;All</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <tabstops>
+ <tabstop>textToFind</tabstop>
+ <tabstop>textToReplace</tabstop>
+ <tabstop>downRadioButton</tabstop>
+ <tabstop>upRadioButton</tabstop>
+ <tabstop>caseCheckBox</tabstop>
+ <tabstop>wholeCheckBox</tabstop>
+ <tabstop>regexCheckBox</tabstop>
+ <tabstop>findButton</tabstop>
+ <tabstop>closeButton</tabstop>
+ </tabstops>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/utils/themeeditor/gui/editorwindow.cpp b/utils/themeeditor/gui/editorwindow.cpp
index b778a1f..ea6c91f 100644
--- a/utils/themeeditor/gui/editorwindow.cpp
+++ b/utils/themeeditor/gui/editorwindow.cpp
@@ -200,6 +200,20 @@ void EditorWindow::setupMenus()
QObject::connect(ui->actionOpen_Project, SIGNAL(triggered()),
this, SLOT(openProject()));
+
+ /* Connecting the edit menu */
+ QObject::connect(ui->actionUndo, SIGNAL(triggered()),
+ this, SLOT(undo()));
+ QObject::connect(ui->actionRedo, SIGNAL(triggered()),
+ this, SLOT(redo()));
+ QObject::connect(ui->actionCut, SIGNAL(triggered()),
+ this, SLOT(cut()));
+ QObject::connect(ui->actionCopy, SIGNAL(triggered()),
+ this, SLOT(copy()));
+ QObject::connect(ui->actionPaste, SIGNAL(triggered()),
+ this, SLOT(paste()));
+ QObject::connect(ui->actionFind_Replace, SIGNAL(triggered()),
+ this, SLOT(findReplace()));
}
void EditorWindow::addTab(TabContent *doc)
@@ -237,6 +251,12 @@ void EditorWindow::shiftTab(int index)
ui->actionClose_Document->setEnabled(false);
ui->actionToolbarSave->setEnabled(false);
ui->fromTree->setEnabled(false);
+ ui->actionUndo->setEnabled(false);
+ ui->actionRedo->setEnabled(false);
+ ui->actionCut->setEnabled(false);
+ ui->actionCopy->setEnabled(false);
+ ui->actionPaste->setEnabled(false);
+ ui->actionFind_Replace->setEnabled(false);
viewer->setScene(0);
}
else if(widget->type() == TabContent::Config)
@@ -245,6 +265,12 @@ void EditorWindow::shiftTab(int index)
ui->actionSave_Document_As->setEnabled(true);
ui->actionClose_Document->setEnabled(true);
ui->actionToolbarSave->setEnabled(true);
+ ui->actionUndo->setEnabled(false);
+ ui->actionRedo->setEnabled(false);
+ ui->actionCut->setEnabled(false);
+ ui->actionCopy->setEnabled(false);
+ ui->actionPaste->setEnabled(false);
+ ui->actionFind_Replace->setEnabled(false);
viewer->setScene(0);
}
else if(widget->type() == TabContent::Skin)
@@ -260,12 +286,26 @@ void EditorWindow::shiftTab(int index)
ui->actionToolbarSave->setEnabled(true);
ui->fromTree->setEnabled(true);
+ ui->actionUndo->setEnabled(true);
+ ui->actionRedo->setEnabled(true);
+ ui->actionCut->setEnabled(true);
+ ui->actionCopy->setEnabled(true);
+ ui->actionPaste->setEnabled(true);
+ ui->actionFind_Replace->setEnabled(true);
+
sizeColumns();
/* Syncing the preview */
viewer->setScene(doc->scene());
}
+
+ /* Hiding all the find/replace dialogs */
+ for(int i = 0; i < ui->editorTabs->count(); i++)
+ if(dynamic_cast<TabContent*>(ui->editorTabs->widget(i))->type() ==
+ TabContent::Skin)
+ dynamic_cast<SkinDocument*>(ui->editorTabs->widget(i))->hideFind();
+
}
bool EditorWindow::closeTab(int index)
@@ -469,6 +509,56 @@ void EditorWindow::lineChanged(int line)
}
+void EditorWindow::undo()
+{
+ TabContent* doc = dynamic_cast<TabContent*>
+ (ui->editorTabs->currentWidget());
+ if(doc->type() == TabContent::Skin)
+ dynamic_cast<SkinDocument*>(doc)->getEditor()->undo();
+}
+
+void EditorWindow::redo()
+{
+ TabContent* doc = dynamic_cast<TabContent*>
+ (ui->editorTabs->currentWidget());
+ if(doc->type() == TabContent::Skin)
+ dynamic_cast<SkinDocument*>(doc)->getEditor()->redo();
+
+}
+
+void EditorWindow::cut()
+{
+ TabContent* doc = dynamic_cast<TabContent*>
+ (ui->editorTabs->currentWidget());
+ if(doc->type() == TabContent::Skin)
+ dynamic_cast<SkinDocument*>(doc)->getEditor()->cut();
+}
+
+void EditorWindow::copy()
+{
+ TabContent* doc = dynamic_cast<TabContent*>
+ (ui->editorTabs->currentWidget());
+ if(doc->type() == TabContent::Skin)
+ dynamic_cast<SkinDocument*>(doc)->getEditor()->copy();
+}
+
+void EditorWindow::paste()
+{
+ TabContent* doc = dynamic_cast<TabContent*>
+ (ui->editorTabs->currentWidget());
+ if(doc->type() == TabContent::Skin)
+ dynamic_cast<SkinDocument*>(doc)->getEditor()->paste();
+}
+
+void EditorWindow::findReplace()
+{
+ TabContent* doc = dynamic_cast<TabContent*>
+ (ui->editorTabs->currentWidget());
+ if(doc->type() == TabContent::Skin)
+ dynamic_cast<SkinDocument*>(doc)->showFind();
+}
+
+
void EditorWindow::expandLine(ParseTreeModel* model, QModelIndex parent,
int line)
{
diff --git a/utils/themeeditor/gui/editorwindow.h b/utils/themeeditor/gui/editorwindow.h
index ab75cc5..6f30249 100644
--- a/utils/themeeditor/gui/editorwindow.h
+++ b/utils/themeeditor/gui/editorwindow.h
@@ -73,6 +73,12 @@ private slots:
void tabTitleChanged(QString title);
void updateCurrent(); /* Generates code in the current tab */
void lineChanged(int line); /* Used for auto-expand */
+ void undo();
+ void redo();
+ void cut();
+ void copy();
+ void paste();
+ void findReplace();
private:
/* Setup functions */
diff --git a/utils/themeeditor/gui/editorwindow.ui b/utils/themeeditor/gui/editorwindow.ui
index 2f84d38..707e246 100644
--- a/utils/themeeditor/gui/editorwindow.ui
+++ b/utils/themeeditor/gui/editorwindow.ui
@@ -70,7 +70,21 @@
<addaction name="separator"/>
<addaction name="actionDevice_Configuration"/>
</widget>
+ <widget class="QMenu" name="menuEdit">
+ <property name="title">
+ <string>&amp;Edit</string>
+ </property>
+ <addaction name="actionUndo"/>
+ <addaction name="actionRedo"/>
+ <addaction name="separator"/>
+ <addaction name="actionCut"/>
+ <addaction name="actionCopy"/>
+ <addaction name="actionPaste"/>
+ <addaction name="separator"/>
+ <addaction name="actionFind_Replace"/>
+ </widget>
<addaction name="menuFile"/>
+ <addaction name="menuEdit"/>
<addaction name="menuView"/>
</widget>
<widget class="QStatusBar" name="statusbar"/>
@@ -303,6 +317,54 @@
<string>Ctrl+D</string>
</property>
</action>
+ <action name="actionUndo">
+ <property name="text">
+ <string>&amp;Undo</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+Z</string>
+ </property>
+ </action>
+ <action name="actionRedo">
+ <property name="text">
+ <string>&amp;Redo</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+Shift+Z</string>
+ </property>
+ </action>
+ <action name="actionCut">
+ <property name="text">
+ <string>C&amp;ut</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+X</string>
+ </property>
+ </action>
+ <action name="actionCopy">
+ <property name="text">
+ <string>&amp;Copy</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+C</string>
+ </property>
+ </action>
+ <action name="actionPaste">
+ <property name="text">
+ <string>&amp;Paste</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+V</string>
+ </property>
+ </action>
+ <action name="actionFind_Replace">
+ <property name="text">
+ <string>&amp;Find/Replace</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+F</string>
+ </property>
+ </action>
</widget>
<tabstops>
<tabstop>projectTree</tabstop>
diff --git a/utils/themeeditor/gui/skindocument.cpp b/utils/themeeditor/gui/skindocument.cpp
index 6863ff5..f8206e1 100644
--- a/utils/themeeditor/gui/skindocument.cpp
+++ b/utils/themeeditor/gui/skindocument.cpp
@@ -151,6 +151,12 @@ void SkinDocument::setupUI()
QObject::connect(device, SIGNAL(settingsChanged()),
this, SLOT(deviceChanged()));
+ /* Attaching the find/replace dialog */
+ findReplace = new FindReplaceDialog(this);
+ findReplace->setModal(false);
+ findReplace->setTextEdit(editor);
+ findReplace->hide();
+
settingsChanged();
}
diff --git a/utils/themeeditor/gui/skindocument.h b/utils/themeeditor/gui/skindocument.h
index c6b3687..1713023 100644
--- a/utils/themeeditor/gui/skindocument.h
+++ b/utils/themeeditor/gui/skindocument.h
@@ -27,6 +27,8 @@
#include <QHBoxLayout>
#include <QGraphicsScene>
+#include "findreplacedialog.h"
+
#include "skinhighlighter.h"
#include "parsetreemodel.h"
#include "preferencesdialog.h"
@@ -61,6 +63,7 @@ public:
QString file() const{ return fileName; }
QString title() const{ return titleText; }
QString getStatus(){ return parseStatus; }
+ CodeEditor* getEditor(){ return editor; }
void genCode(){ editor->document()->setPlainText(model->genCode()); }
void setProject(ProjectModel* project){ this->project = project; }
@@ -73,6 +76,9 @@ public:
QGraphicsScene* scene(){ return model->render(project, device, &fileName); }
+ void showFind(){ findReplace->show(); }
+ void hideFind(){ findReplace->hide(); }
+
signals:
public slots:
@@ -104,6 +110,8 @@ private:
ProjectModel* project;
DeviceState* device;
+
+ FindReplaceDialog* findReplace;
};
#endif // SKINDOCUMENT_H
diff --git a/utils/themeeditor/themeeditor.pro b/utils/themeeditor/themeeditor.pro
index 50cafe0..329500e 100644
--- a/utils/themeeditor/themeeditor.pro
+++ b/utils/themeeditor/themeeditor.pro
@@ -11,6 +11,7 @@ RBBASE_DIR = $$replace(RBBASE_DIR,/utils/themeeditor,)
INCLUDEPATH += gui
INCLUDEPATH += models
INCLUDEPATH += graphics
+INCLUDEPATH += findreplace
# Stuff for the parse lib
libskin_parser.commands = @$(MAKE) \
@@ -40,7 +41,9 @@ HEADERS += models/parsetreemodel.h \
graphics/rbrenderinfo.h \
graphics/rbimage.h \
graphics/rbfont.h \
- gui/devicestate.h
+ gui/devicestate.h \
+ findreplace/findreplaceform.h \
+ findreplace/findreplacedialog.h
SOURCES += main.cpp \
models/parsetreemodel.cpp \
models/parsetreenode.cpp \
@@ -57,7 +60,9 @@ SOURCES += main.cpp \
graphics/rbrenderinfo.cpp \
graphics/rbimage.cpp \
graphics/rbfont.cpp \
- gui/devicestate.cpp
+ gui/devicestate.cpp \
+ findreplace/findreplaceform.cpp \
+ findreplace/findreplacedialog.cpp
OTHER_FILES += README \
resources/windowicon.png \
resources/appicon.xcf \
@@ -69,5 +74,7 @@ OTHER_FILES += README \
FORMS += gui/editorwindow.ui \
gui/preferencesdialog.ui \
gui/configdocument.ui \
- gui/skinviewer.ui
+ gui/skinviewer.ui \
+ findreplace/findreplaceform.ui \
+ findreplace/findreplacedialog.ui
RESOURCES += resources.qrc