* Licence details can be found in the file COPYING.
*
* \author Dekel Tsur
+ * \author Richard Heck
*
* Full author contact details are available in file CREDITS.
*/
#ifndef QTHELPERS_H
#define QTHELPERS_H
-#include "lyxlength.h"
-#include "support/docstring.h"
+#include "ColorSet.h"
+#include "Length.h"
+#include "support/qstring_helpers.h"
+#include "support/filetools.h"
+#include "qt_i18n.h"
-#include <QChar>
-#include <QString>
-
-#include <vector>
-#include <utility>
-#include <boost/assert.hpp>
+#include <QHeaderView>
class QComboBox;
class QLineEdit;
-
-class LengthCombo;
+class QCheckBox;
+class QString;
+class QWidget;
+template <class T> class QList;
namespace lyx {
-std::string makeFontName(std::string const & family, std::string const & foundry);
+namespace support { class FileName; }
-std::pair<std::string,std::string> parseFontName(std::string const & name);
+class BufferParams;
+
+namespace frontend {
+
+class LengthCombo;
-/// method to get a LyXLength from widgets (LengthCombo)
+/// method to get a Length from widgets (LengthCombo)
std::string widgetsToLength(QLineEdit const * input, LengthCombo const * combo);
-/// method to get a LyXLength from widgets (QComboBox)
-LyXLength widgetsToLength(QLineEdit const * input, QComboBox const * combo);
+/// method to get a Length from widgets (QComboBox)
+Length widgetsToLength(QLineEdit const * input, QComboBox const * combo);
-/// method to set widgets from a LyXLength
+/// method to set widgets from a Length
+//FIXME Remove default_unit argument for the first form. FIXME Change
+// all the code to remove default_unit argument when equal to the
+// default.
void lengthToWidgets(QLineEdit * input, LengthCombo * combo,
- std::string const & len, LyXLength::UNIT default_unit);
-
-/// format a string to the given width
-docstring const formatted(docstring const & text, int w = 80);
-
-/**
- * toqstr - convert char * into Qt's unicode (UTF16)
- *
- * Use this whenever there's a user-visible string that is encoded
- * for the locale (menus, dialogs etc.)
- */
-inline QString const toqstr(char const * str)
-{
- return QString::fromUtf8(str);
-}
-
-
+ Length const & len,
+ Length::UNIT default_unit = Length::defaultUnit());
+/// method to set widgets from a string
+void lengthToWidgets(QLineEdit * input, LengthCombo * combo,
+ std::string const & len,
+ Length::UNIT default_unit = Length::defaultUnit());
+/// method to set widgets from a docstring
+void lengthToWidgets(QLineEdit * input, LengthCombo * combo,
+docstring const & len, Length::UNIT default_unit);
+
+/// method to get a double value from a localized widget (QLineEdit)
+double widgetToDouble(QLineEdit const * input);
+/// method to get a double value from a localized widget (QLineEdit)
+std::string widgetToDoubleStr(QLineEdit const * input);
+/// method to set a (localized) double value in a widget (QLineEdit)
+void doubleToWidget(QLineEdit * input, double const & value,
+ char f = 'g', int prec = 6);
+/// method to set a (localized) double value in a widget (QLineEdit)
+void doubleToWidget(QLineEdit * input, std::string const & value,
+ char f = 'g', int prec = 6);
/**
- * toqstr - convert string into unicode
- *
- * Use this whenever there's a user-visible string that is encoded
- * for the locale (menus, dialogs etc.)
+ * method to format localized floating point numbers without
+ * ever using scientific notation
*/
-inline QString const toqstr(std::string const & str)
-{
- return toqstr(str.c_str());
-}
+QString formatLocFPNumber(double d);
+/// Method to sort colors by GUI name in combo widgets
+bool ColorSorter(ColorCode lhs, ColorCode rhs);
-/**
- * toqstr - convert ucs4 into QString
- *
- * QString uses utf16 internally.
- */
-inline char_type const qchar_to_ucs4(QChar const & qchar) {
- return static_cast<char_type>(qchar.unicode());
-}
-
-inline QChar const ucs4_to_qchar(char_type const ucs4) {
- // FIXME: The following cast is not a real conversion but it work
- // for the ucs2 subrange of unicode. Instead of an assertion we should
- // return some special characters that indicates that its display is
- // not supported.
- BOOST_ASSERT(ucs4 < 65536);
- return QChar(static_cast<unsigned short>(ucs4));
-}
-
-
-#if QT_VERSION >= 0x040200
-inline QString const toqstr(docstring const & ucs4)
-{
- // If possible we let qt do the work, since this version does not
- // need to be superfast.
- return QString::fromUcs4(reinterpret_cast<uint const *>(ucs4.data()), ucs4.length());
-}
-#else
-QString const toqstr(docstring const & ucs4);
-#endif
-
+/// colors a widget red if invalid
+void setValid(QWidget * widget, bool valid);
-inline void ucs4_to_qstring(char_type const * str, size_t ls, QString & s)
-{
- int i = static_cast<int>(ls);
- s.resize(i);
- for (; --i >= 0;)
- s[i] = ucs4_to_qchar(str[i]);
-}
+// set focus and highlight the current item if there is no selection already
+void focusAndHighlight(QAbstractItemView * w);
+/// Qt5 changed setSectionMode to setSectionResizeMode
+/// These wrappers work for Qt4 and Qt5
+void setSectionResizeMode(QHeaderView * view,
+ int logicalIndex, QHeaderView::ResizeMode mode);
+void setSectionResizeMode(QHeaderView * view,
+ QHeaderView::ResizeMode mode);
-docstring const qstring_to_ucs4(QString const & qstr);
+} // namespace frontend
/**
- * qt_ - i18nize string and convert to unicode
+ * qt_ - i18nize string and convert to QString
*
* Use this in qt4/ instead of _()
*/
-QString const qt_(char const * str, const char * comment = 0);
+QString const qt_(std::string const & str);
+QString const qt_(QString const & qstr);
+
+
+///
+support::FileName libFileSearch(QString const & dir, QString const & name,
+ QString const & ext = QString(),
+ support::search_mode mode = support::must_exist);
+
+///
+support::FileName imageLibFileSearch(QString & dir, QString const & name,
+ QString const & ext = QString(),
+ support::search_mode mode = support::must_exist);
+
+/** Wrappers around browseFile which try to provide a filename
+ relative to relpath.
+
+\param title: title for dialog
+
+\param filters: *.ps, etc
+
+\param save: whether to save dialog info (current path, etc) for next use.
+
+The \param labelN and \param dirN arguments provide for extra buttons
+in the dialog (e.g., "Templates" and a path to that directory).
+
+The difference between the functions concerns when we think we have a
+relative path.
+
+In \c browseRelToParent, we return a relative path only if it IS NOT of
+ the form "../../foo.txt".
+
+In \c browseRelToSub, we return a relative path only if it IS of the
+ form "../../foo.txt".
+*/
+QString browseRelToParent(QString const & filename,
+ QString const & relpath,
+ QString const & title,
+ QStringList const & filters,
+ bool save = false,
+ QString const & label1 = QString(),
+ QString const & dir1 = QString(),
+ QString const & label2 = QString(),
+ QString const & dir2 = QString());
+
+QString browseRelToSub(QString const & filename,
+ QString const & relpath,
+ QString const & title,
+ QStringList const & filters,
+ bool save = false,
+ QString const & label1 = QString(),
+ QString const & dir1 = QString(),
+ QString const & label2 = QString(),
+ QString const & dir2 = QString());
+
+/** Build filelists of all availabe bst/cls/sty-files. Done through
+* kpsewhich and an external script, saved in *Files.lst.
+* \param arg: cls, sty, bst, or bib, as required by TeXFiles.py.
+* Can be a list of these, too.
+*/
+void rescanTexStyles(std::string const & arg = empty_string());
+
+/** Fill \c contents from one of the three texfiles.
+ * Each entry in the file list is returned as a name_with_path
+ */
+QStringList texFileList(QString const & filename);
+/// Convert internal line endings to line endings as expected by the OS
+QString const externalLineEnding(docstring const & str);
-/**
- * qt_ - i18nize string and convert to unicode
- *
- * Use this in qt4/ instead of _()
- */
-QString const qt_(std::string const & str);
+/// Convert line endings in any formnat to internal line endings
+docstring const internalLineEnding(QString const & str);
+// wrapper around the docstring versions
+QString internalPath(QString const &);
+QString onlyFileName(QString const & str);
+QString onlyPath(QString const & str);
+QStringList fileFilters(QString const & description);
-/**
- * fromqstr - convert QString into std::string in locale
- *
- * Return the QString encoded in the locale
+QString changeExtension(QString const & oldname, QString const & extension);
+
+/// Remove the extension from \p name
+QString removeExtension(QString const & name);
+
+/** Add the extension \p ext to \p name.
+ Use this instead of changeExtension if you know that \p name is without
+ extension, because changeExtension would wrongly interpret \p name if it
+ contains a dot.
*/
-std::string const fromqstr(QString const & str);
+QString addExtension(QString const & name, QString const & extension);
+
+/// Return the extension of the file (not including the .)
+QString getExtension(QString const & name);
+QString makeAbsPath(QString const & relpath, QString const & base);
+QString changeExtension(QString const & oldname, QString const & ext);
+
+/// Format \param text for display as a ToolTip, breaking at lines of \param
+/// width ems. Note: this function is expensive. Better call it in a delayed
+/// manner, i.e. not to fill in a model (see for instance the function
+/// ToolTipFormatter::eventFilter).
+///
+/// When is it called automatically? Whenever the tooltip is not already rich
+/// text beginning with <html>, and is defined by the following functions:
+/// - QWidget::setToolTip(),
+/// - QAbstractItemModel::setData(..., Qt::ToolTipRole),
+/// - Inset::toolTip()
+///
+/// In other words, tooltips can use Qt html, and the tooltip will still be
+/// correctly broken. Moreover, it is possible to specify an entirely custom
+/// tooltip (not subject to automatic formatting) by giving it in its entirety,
+/// i.e. starting with <html>.
+QString formatToolTip(QString text, int width = 30);
+
+
+#if QT_VERSION < 0x050300
+// Very partial implementation of QSignalBlocker for archaic qt versions.
+class QSignalBlocker {
+public:
+ explicit QSignalBlocker(QObject * o)
+ : obj(o), init_state(obj && obj->blockSignals(true)) {}
+
+ ~QSignalBlocker() {
+ if (obj)
+ obj->blockSignals(init_state);
+ }
+private:
+ QObject * obj;
+ bool init_state;
+};
+#endif
+
+
+// Check if qstr is understood as rich text (Qt HTML) and if so, produce a
+// rendering in plain text.
+QString qtHtmlToPlainText(QString const & qstr);
} // namespace lyx