summaryrefslogtreecommitdiffstats
path: root/unix/tk.spec
blob: 53c5d0043974facc4e758a6d058361eb64323794 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# $Id: tk.spec,v 1.19 2004/03/26 19:57:37 dgp Exp $
# This file is the basis for a binary Tk Linux RPM.

%define version 8.5a2
%define directory /usr/local

Summary: Tk graphical toolkit for the Tcl scripting language.
Name: tk
Version: %{version}
Release: 1
Copyright: BSD
Group: Development/Languages
Source: http://prdownloads.sourceforge.net/tcl/tk%{version}-src.tar.gz
URL: http://www.tcl.tk/
Packager: Carina
Buildroot: /var/tmp/%{name}%{version}
Requires: XFree86-libs >= 3.3.3, XFree86-devel >= 3.3.3, tcl = 8.5a2

%description
The Tcl (Tool Command Language) provides a powerful platform for
creating integration applications that tie together diverse
applications, protocols, devices, and frameworks.  When paired with
the Tk toolkit, Tcl provides the fastest and most powerful way to
create GUI applications that run on PCs, Unix, and Mac OS X.  Tcl
can also be used for a variety of web-related tasks and for creating
powerful command languages for applications.

%prep

%build
./configure --prefix %{directory} --exec-prefix %{directory}
make CFLAGS=$RPM_OPT_FLAGS

%install
rm -rf $RPM_BUILD_ROOT
make INSTALL_ROOT=$RPM_BUILD_ROOT install

%clean
rm -rf $RPM_BUILD_ROOT

# to create the tcl files list, comment out tk in the install section above,
# then run "rpm -bi" then do a find from the build root directory,
# and remove the files in specific directories which suffice by themselves,
# then to create the files list for tk, uncomment tk, comment out tcl,
# then rm -rf $RPM_BUILD_ROOT then rpm --short-circuit -bi then redo a find,
# and remove the files in specific directories which suffice by themselves.
%files -n tk
%defattr(-,root,root)
%{directory}/lib
%{directory}/bin
%{directory}/include
%{directory}/man
>::State StyleSheetValidator::validate ( QString & input, int &pos) const { // base class const State state = ReplacementValidator:: validate(input, pos); if (state != Acceptable) return state; // now check style sheet, create string with newlines const QString styleSheet = qdesigner_internal::TextPropertyEditor::editorStringToString(input, qdesigner_internal::ValidationStyleSheet); const bool valid = qdesigner_internal::StyleSheetEditorDialog::isStyleSheetValid(styleSheet); return valid ? Acceptable : Intermediate; } // A validator for URLs based on QUrl. Enforces complete protocol // specification with a completer (adds a trailing slash) class UrlValidator : public QValidator { public: UrlValidator(QCompleter *completer, QObject *parent); virtual State validate(QString &input, int &pos) const; virtual void fixup(QString &input) const; private: QUrl guessUrlFromString(const QString &string) const; QCompleter *m_completer; }; UrlValidator::UrlValidator(QCompleter *completer, QObject *parent) : QValidator(parent), m_completer(completer) { } QValidator::State UrlValidator::validate(QString &input, int &pos) const { Q_UNUSED(pos); if (input.isEmpty()) return Acceptable; const QUrl url(input, QUrl::StrictMode); if (!url.isValid() || url.isEmpty()) return Intermediate; if (url.scheme().isEmpty()) return Intermediate; if (url.host().isEmpty() && url.path().isEmpty()) return Intermediate; return Acceptable; } void UrlValidator::fixup(QString &input) const { // Don't try to fixup if the user is busy selecting a completion proposal if (const QAbstractItemView *iv = m_completer->popup()) { if (iv->isVisible()) return; } input = guessUrlFromString(input).toString(); } QUrl UrlValidator::guessUrlFromString(const QString &string) const { const QString urlStr = string.trimmed(); const QRegExp qualifiedUrl(QLatin1String("^[a-zA-Z]+\\:.*")); // Check if it looks like a qualified URL. Try parsing it and see. const bool hasSchema = qualifiedUrl.exactMatch(urlStr); if (hasSchema) { const QUrl url(urlStr, QUrl::TolerantMode); if (url.isValid()) return url; } // Might be a Qt resource if (string.startsWith(QLatin1String(":/"))) return QUrl(QLatin1String("qrc") + string); // Might be a file. if (QFile::exists(urlStr)) return QUrl::fromLocalFile(urlStr); // Might be a short url - try to detect the schema. if (!hasSchema) { const int dotIndex = urlStr.indexOf(QLatin1Char('.')); if (dotIndex != -1) { const QString prefix = urlStr.left(dotIndex).toLower(); QString urlString; if (prefix == QLatin1String("ftp")) urlString += prefix; else urlString += QLatin1String("http"); urlString += QLatin1String("://"); urlString += urlStr; const QUrl url(urlString, QUrl::TolerantMode); if (url.isValid()) return url; } } // Fall back to QUrl's own tolerant parser. return QUrl(string, QUrl::TolerantMode); } } namespace qdesigner_internal { // TextPropertyEditor TextPropertyEditor::TextPropertyEditor(QWidget *parent, EmbeddingMode embeddingMode, TextPropertyValidationMode validationMode) : QWidget(parent), m_validationMode(ValidationSingleLine), m_updateMode(UpdateAsYouType), m_lineEdit(new PropertyLineEdit(this)), m_textEdited(false) { switch (embeddingMode) { case EmbeddingNone: break; case EmbeddingTreeView: m_lineEdit->setFrame(false); break; case EmbeddingInPlace: m_lineEdit->setFrame(false); Q_ASSERT(parent); m_lineEdit->setBackgroundRole(parent->backgroundRole()); break; } setFocusProxy(m_lineEdit); connect(m_lineEdit,SIGNAL(editingFinished()), this, SIGNAL(editingFinished())); connect(m_lineEdit,SIGNAL(returnPressed()), this, SLOT(slotEditingFinished())); connect(m_lineEdit,SIGNAL(textChanged(QString)), this, SLOT(slotTextChanged(QString))); connect(m_lineEdit,SIGNAL(textEdited(QString)), this, SLOT(slotTextEdited())); setTextPropertyValidationMode(validationMode); } void TextPropertyEditor::setTextPropertyValidationMode(TextPropertyValidationMode vm) { m_validationMode = vm; m_lineEdit->setWantNewLine(multiLine(m_validationMode)); switch (m_validationMode) { case ValidationStyleSheet: m_lineEdit->setValidator(new StyleSheetValidator(m_lineEdit)); m_lineEdit->setCompleter(0); break; case ValidationMultiLine: case ValidationRichText: // Set a validator that replaces newline characters by literal "\\n". // While it is not possible to actually type a newline characters, // it can be pasted into the line edit. m_lineEdit->setValidator(new ReplacementValidator(m_lineEdit, NewLineChar, EscapedNewLine)); m_lineEdit->setCompleter(0); break; case ValidationSingleLine: // Set a validator that replaces newline characters by a blank. m_lineEdit->setValidator(new ReplacementValidator(m_lineEdit, NewLineChar, QString(QLatin1Char(' ')))); m_lineEdit->setCompleter(0); break; case ValidationObjectName: setRegExpValidator(QLatin1String("[_a-zA-Z][_a-zA-Z0-9]{,1023}")); m_lineEdit->setCompleter(0); break; case ValidationObjectNameScope: setRegExpValidator(QLatin1String("[_a-zA-Z:][_a-zA-Z0-9:]{,1023}")); m_lineEdit->setCompleter(0); break; case ValidationURL: { static QStringList urlCompletions; if (urlCompletions.empty()) { urlCompletions.push_back(QLatin1String("about:blank")); urlCompletions.push_back(QLatin1String("http://")); urlCompletions.push_back(QLatin1String("http://www.")); urlCompletions.push_back(QLatin1String("http://qt.nokia.com/")); urlCompletions.push_back(QLatin1String("file://")); urlCompletions.push_back(QLatin1String("ftp://")); urlCompletions.push_back(QLatin1String("data:")); urlCompletions.push_back(QLatin1String("data:text/html,")); urlCompletions.push_back(QLatin1String("qrc:/")); } QCompleter *completer = new QCompleter(urlCompletions, m_lineEdit); m_lineEdit->setCompleter(completer); m_lineEdit->setValidator(new UrlValidator(completer, m_lineEdit)); } break; } setFocusProxy(m_lineEdit); setText(m_cachedText); markIntermediateState(); } void TextPropertyEditor::setRegExpValidator(const QString &pattern) { const QRegExp regExp(pattern); Q_ASSERT(regExp.isValid()); m_lineEdit->setValidator(new QRegExpValidator(regExp,m_lineEdit)); } QString TextPropertyEditor::text() const { return m_cachedText; } void TextPropertyEditor::markIntermediateState() { if (m_lineEdit->hasAcceptableInput()) { m_lineEdit->setPalette(QPalette()); } else { QPalette palette = m_lineEdit->palette(); palette.setColor(QPalette::Active, QPalette::Text, Qt::red); m_lineEdit->setPalette(palette); } } void TextPropertyEditor::setText(const QString &text) { m_cachedText = text; m_lineEdit->setText(stringToEditorString(text, m_validationMode)); markIntermediateState(); m_textEdited = false; } void TextPropertyEditor::slotTextEdited() { m_textEdited = true; } void TextPropertyEditor::slotTextChanged(const QString &text) { m_cachedText = editorStringToString(text, m_validationMode); markIntermediateState(); if (m_updateMode == UpdateAsYouType) emit textChanged(m_cachedText); } void TextPropertyEditor::slotEditingFinished() { if (m_updateMode == UpdateOnFinished && m_textEdited) { emit textChanged(m_cachedText); m_textEdited = false; } } void TextPropertyEditor::selectAll() { m_lineEdit->selectAll(); } void TextPropertyEditor::clear() { m_lineEdit->clear(); } void TextPropertyEditor::setAlignment(Qt::Alignment alignment) { m_lineEdit->setAlignment(alignment); } void TextPropertyEditor::installEventFilter(QObject *filterObject) { if (m_lineEdit) m_lineEdit->installEventFilter(filterObject); } void TextPropertyEditor::resizeEvent ( QResizeEvent * event ) { m_lineEdit->resize( event->size()); } QSize TextPropertyEditor::sizeHint () const { return m_lineEdit->sizeHint (); } QSize TextPropertyEditor::minimumSizeHint () const { return m_lineEdit->minimumSizeHint (); } // Returns whether newline characters are valid in validationMode. bool TextPropertyEditor::multiLine(TextPropertyValidationMode validationMode) { return validationMode == ValidationMultiLine || validationMode == ValidationStyleSheet || validationMode == ValidationRichText; } // Replace newline characters literal "\n" for inline editing in mode ValidationMultiLine QString TextPropertyEditor::stringToEditorString(const QString &s, TextPropertyValidationMode validationMode) { if (s.isEmpty() || !multiLine(validationMode)) return s; QString rc(s); // protect backslashes rc.replace(QLatin1Char('\\'), QLatin1String("\\\\")); // escape newlines rc.replace(NewLineChar, QString(EscapedNewLine)); return rc; } // Replace literal "\n" by actual new lines for inline editing in mode ValidationMultiLine // Note: As the properties are updated while the user types, it is important // that trailing slashes ('bla\') are not deleted nor ignored, else this will // cause jumping of the cursor QString TextPropertyEditor::editorStringToString(const QString &s, TextPropertyValidationMode validationMode) { if (s.isEmpty() || !multiLine(validationMode)) return s; QString rc(s); for (int pos = 0; (pos = rc.indexOf(QLatin1Char('\\'),pos)) >= 0 ; ) { // found an escaped character. If not a newline or at end of string, leave as is, else insert '\n' const int nextpos = pos + 1; if (nextpos >= rc.length()) // trailing '\\' break; // Escaped NewLine if (rc.at(nextpos) == QChar(QLatin1Char('n'))) rc[nextpos] = NewLineChar; // Remove escape, go past escaped rc.remove(pos,1); pos++; } return rc; } bool TextPropertyEditor::hasAcceptableInput() const { return m_lineEdit->hasAcceptableInput(); } } QT_END_NAMESPACE