BalloonMsg::BalloonMsg(void *param, const QString &_text, QStringList &btn, QWidget *parent, const QRect *rcParent, bool bModal, bool bAutoHide, unsigned bwidth, const QString &box_msg, bool *bChecked) : QDialog(parent, "ballon", bModal, (bAutoHide ? WType_Popup : WType_TopLevel | WStyle_StaysOnTop) | WStyle_Customize | WStyle_NoBorderEx | WStyle_Tool | WDestructiveClose | WX11BypassWM) { m_param = param; m_parent = parent; m_width = bwidth; m_bAutoHide = bAutoHide; m_bYes = false; m_bChecked = bChecked; bool bTailDown = true; setPalette(QToolTip::palette()); text = _text; QFrame *frm = new QFrame(this); frm->setPalette(palette()); QVBoxLayout *vlay = new QVBoxLayout(frm); vlay->setMargin(0); m_check = NULL; if (!box_msg.isEmpty()){ m_check = new QCheckBox(box_msg, frm); vlay->addWidget(m_check); if (m_bChecked) m_check->setChecked(*m_bChecked); } QHBoxLayout *lay = new QHBoxLayout(vlay); lay->setSpacing(5); lay->addStretch(); unsigned id = 0; bool bFirst = true; for (QStringList::Iterator it = btn.begin(); it != btn.end(); ++it, id++){ BalloonButton *b = new BalloonButton(*it, frm, id); connect(b, SIGNAL(action(int)), this, SLOT(action(int))); lay->addWidget(b); if (bFirst){ b->setDefault(true); bFirst = false; } } setButtonsPict(this); lay->addStretch(); int wndWidth = frm->minimumSizeHint().width(); int hButton = frm->minimumSizeHint().height(); int txtWidth = bwidth; QRect rc; if (rcParent){ rc = *rcParent; }else{ QPoint p = parent->mapToGlobal(parent->rect().topLeft()); rc = QRect(p.x(), p.y(), parent->width(), parent->height()); } if (rc.width() > txtWidth) txtWidth = rc.width(); QSimpleRichText richText(_text, font(), "", QStyleSheet::defaultSheet(), QMimeSourceFactory::defaultFactory(), -1, Qt::blue, false); richText.setWidth(wndWidth); richText.adjustSize(); QSize s(richText.widthUsed(), richText.height()); QSize sMin = frm->minimumSizeHint(); if (s.width() < sMin.width()) s.setWidth(sMin.width()); int BALLOON_SHADOW = BALLOON_SHADOW_DEF; #ifdef WIN32 /* FIXME */ /* if ((GetClassLong(winId(), GCL_STYLE) & CS_DROPSHADOW) && style().inherits("QWindowsXPStyle")) BALLOON_SHADOW = 0; */ #endif resize(s.width() + BALLOON_R * 2 + BALLOON_SHADOW, s.height() + BALLOON_R * 2 + BALLOON_TAIL + BALLOON_SHADOW + hButton + BALLOON_MARGIN); mask = QBitmap(width(), height()); int w = width() - BALLOON_SHADOW; int tailX = w / 2; int posX = rc.left() + rc.width() / 2 + BALLOON_TAIL_WIDTH - tailX; if (posX <= 0) posX = 1; QRect rcScreen = screenGeometry(); if (posX + width() >= rcScreen.width()) posX = rcScreen.width() - 1 - width(); int tx = posX + tailX - BALLOON_TAIL_WIDTH; if (tx < rc.left()) tx = rc.left(); if (tx > rc.left() + rc.width()) tx = rc.left() + rc.width(); tailX = tx + BALLOON_TAIL_WIDTH - posX; if (tailX < BALLOON_R) tailX = BALLOON_R; if (tailX > width() - BALLOON_R - BALLOON_TAIL_WIDTH) tailX = width() - BALLOON_R - BALLOON_TAIL_WIDTH; if (rc.top() <= height() + 2){ bTailDown = false; move(posX, rc.top() + rc.height() + 1); }else{ move(posX, rc.top() - height() - 1); } int pos = 0; int h = height() - BALLOON_SHADOW - BALLOON_TAIL; if (!bTailDown) pos += BALLOON_TAIL; textRect.setRect(BALLOON_R, pos + BALLOON_R, w - BALLOON_R * 2, h); frm->resize(s.width(), hButton); frm->move(BALLOON_R, pos + h - BALLOON_R - hButton); QPainter p; p.begin(&mask); #ifdef WIN32 QColor bg(255, 255, 255); QColor fg(0, 0, 0); #else QColor bg(0, 0, 0); QColor fg(255, 255, 255); #endif p.fillRect(0, 0, width(), height(), bg); p.fillRect(0, pos + BALLOON_R, w, h - BALLOON_R * 2, fg); p.fillRect(BALLOON_R, pos, w - BALLOON_R * 2, h, fg); p.fillRect(BALLOON_SHADOW, pos + BALLOON_R + BALLOON_SHADOW, w, h - BALLOON_R * 2, fg); p.fillRect(BALLOON_R + BALLOON_SHADOW, pos + BALLOON_SHADOW, w - BALLOON_R * 2, h, fg); p.setBrush(fg); p.drawEllipse(0, pos, BALLOON_R * 2, BALLOON_R * 2); p.drawEllipse(w - BALLOON_R * 2, pos, BALLOON_R * 2, BALLOON_R * 2); p.drawEllipse(w - BALLOON_R * 2, pos + h - BALLOON_R * 2, BALLOON_R * 2, BALLOON_R * 2); p.drawEllipse(0, pos + h - BALLOON_R * 2, BALLOON_R * 2, BALLOON_R * 2); p.drawEllipse(BALLOON_SHADOW, pos + BALLOON_SHADOW, BALLOON_R * 2, BALLOON_R * 2); p.drawEllipse(w - BALLOON_R * 2 + BALLOON_SHADOW, pos + BALLOON_SHADOW, BALLOON_R * 2, BALLOON_R * 2); p.drawEllipse(w - BALLOON_R * 2 + BALLOON_SHADOW, pos + h - BALLOON_R * 2 + BALLOON_SHADOW, BALLOON_R * 2, BALLOON_R * 2); p.drawEllipse(BALLOON_SHADOW, pos + h - BALLOON_R * 2 + BALLOON_SHADOW, BALLOON_R * 2, BALLOON_R * 2); QPointArray arr(3); arr.setPoint(0, tailX, bTailDown ? h : pos); arr.setPoint(1, tailX + BALLOON_TAIL_WIDTH, bTailDown ? h : pos); arr.setPoint(2, tailX - BALLOON_TAIL_WIDTH, bTailDown ? height() - BALLOON_SHADOW : 0); p.drawPolygon(arr); arr.setPoint(0, tailX + BALLOON_SHADOW, (bTailDown ? h : pos) + BALLOON_SHADOW); arr.setPoint(1, tailX + BALLOON_TAIL_WIDTH + BALLOON_SHADOW, (bTailDown ? h : pos) + BALLOON_SHADOW); arr.setPoint(2, tailX - BALLOON_TAIL_WIDTH + BALLOON_SHADOW, bTailDown ? height() : BALLOON_SHADOW); p.drawPolygon(arr); p.end(); setMask(mask); qApp->syncX(); QPixmap pict = QPixmap::grabWindow(QApplication::desktop()->winId(), x(), y(), width(), height()); intensity(pict, -0.50f); p.begin(&pict); p.setBrush(colorGroup().background()); p.drawEllipse(0, pos, BALLOON_R * 2, BALLOON_R * 2); p.drawEllipse(w - BALLOON_R * 2, pos, BALLOON_R * 2, BALLOON_R * 2); p.drawEllipse(w - BALLOON_R * 2, pos + h - BALLOON_R * 2, BALLOON_R * 2, BALLOON_R * 2); p.drawEllipse(0, pos + h - BALLOON_R * 2, BALLOON_R * 2, BALLOON_R * 2); arr.setPoint(0, tailX, bTailDown ? h - 1 : pos + 1); arr.setPoint(1, tailX + BALLOON_TAIL_WIDTH, bTailDown ? h - 1 : pos + 1); arr.setPoint(2, tailX - BALLOON_TAIL_WIDTH, bTailDown ? height() - BALLOON_SHADOW : 0); p.drawPolygon(arr); p.fillRect(0, pos + BALLOON_R, w, h - BALLOON_R * 2, colorGroup().background()); p.fillRect(BALLOON_R, pos, w - BALLOON_R * 2, h, colorGroup().background()); p.drawLine(0, pos + BALLOON_R, 0, pos + h - BALLOON_R); p.drawLine(w - 1, pos + BALLOON_R, w - 1, pos + h - BALLOON_R); if (bTailDown){ p.drawLine(BALLOON_R, 0, w - BALLOON_R, 0); p.drawLine(BALLOON_R, h - 1, tailX, h - 1); p.drawLine(tailX + BALLOON_TAIL_WIDTH, h - 1, w - BALLOON_R, h - 1); }else{ p.drawLine(BALLOON_R, pos + h - 1, w - BALLOON_R, pos + h - 1); p.drawLine(BALLOON_R, pos, tailX, pos); p.drawLine(tailX + BALLOON_TAIL_WIDTH, pos, w - BALLOON_R, pos); } p.end(); setBackgroundPixmap(pict); setAutoMask(true); if (!bAutoHide) setFocusPolicy(NoFocus); QWidget *top = NULL; if (parent) top = parent->topLevelWidget(); if (top){ raiseWindow(top); top->installEventFilter(this); } }
TQString KStringHandler::tagURLs( const TQString& text ) { /*static*/ TQRegExp urlEx("(www\\.(?!\\.)|(fish|(f|ht)tp(|s))://)[\\d\\w\\./,:_~\\?=&;#@\\-\\+\\%\\$]+[\\d\\w/]"); TQString richText( text ); int urlPos = 0, urlLen; while ((urlPos = urlEx.search(richText, urlPos)) >= 0) { urlLen = urlEx.matchedLength(); TQString href = richText.mid( urlPos, urlLen ); // Qt doesn't support (?<=pattern) so we do it here if((urlPos > 0) && richText[urlPos-1].isLetterOrNumber()){ urlPos++; continue; } // Don't use TQString::arg since %01, %20, etc could be in the string TQString anchor = "<a href=\"" + href + "\">" + href + "</a>"; richText.replace( urlPos, urlLen, anchor ); urlPos += anchor.length(); } return richText; }
void Qt_help_window::print() { #ifndef QT_NO_PRINTER QPrinter printer; printer.setFullPage(TRUE); if ( printer.setup( this ) ) { QPainter p( &printer ); QPaintDeviceMetrics metrics(p.device()); int dpix = metrics.logicalDpiX(); int dpiy = metrics.logicalDpiY(); const int margin = 72; // pt QRect body(margin*dpix/72, margin*dpiy/72, metrics.width()-margin*dpix/72*2, metrics.height()-margin*dpiy/72*2 ); QSimpleRichText richText( browser->text(), QFont(), browser->context(), browser->styleSheet(), browser->mimeSourceFactory(), body.height() ); richText.setWidth( &p, body.width() ); QRect view( body ); int page = 1; do { richText.draw( &p, body.left(), body.top(), view, colorGroup() ); view.moveBy( 0, body.height() ); p.translate( 0 , -body.height() ); p.drawText( view.right() - p.fontMetrics().width( QString::number(page) ), view.bottom() + p.fontMetrics().ascent() + 5, QString::number(page) ); if ( view.top() >= richText.height() ) break; printer.newPage(); page++; } while (TRUE); } #endif }
QString Tools::tagCrossReferences(const QString &text, bool userLink, HTMLExporter *exporter) { QString richText(text); int urlPos = 0; int urlLen; QRegExp urlEx("\\[\\[(.+)\\]\\]"); urlEx.setMinimal(true); while ((urlPos = urlEx.indexIn(richText, urlPos)) >= 0) { urlLen = urlEx.matchedLength(); QString href = urlEx.cap(1); QStringList hrefParts = href.split('|'); QString anchor; if(exporter) // if we're exporting this basket to html. anchor = crossReferenceForHtml(hrefParts, exporter); else if(userLink) //the link is manually created (ie [[/top level/sub]] ) anchor = crossReferenceForConversion(hrefParts); else // otherwise it's a standard link (ie. [[basket://basket107]] ) anchor = crossReferenceForBasket(hrefParts); richText.replace(urlPos, urlLen, anchor); urlPos += anchor.length(); } return richText; }
/*! * \en * Print browser content. * \_en * \ru * Печатает содержимое браузера. * \_ru */ void aReportBrowser::print() { QPrinter printer; QPainter p; if (!printer.setup()) return; if ( p.begin( &printer ) ){ QPaintDeviceMetrics metrics( p.device() ); int dpiy = metrics.logicalDpiY(); int margin = (int) ( (2/2.54)*dpiy ); // 2 cm margins QRect body( margin, margin, metrics.width() - 2*margin, metrics.height() - 2*margin ); QSimpleRichText richText( textBrowser->text(), QFont(), textBrowser->context(), textBrowser->styleSheet(), textBrowser->mimeSourceFactory(), body.height() ); richText.setWidth( &p, body.width() ); QRect view( body ); int page = 1; do { richText.draw( &p, body.left(), body.top(), view, colorGroup() ); view.moveBy( 0, body.height() ); p.translate( 0 , -body.height() ); p.drawText( view.right() - p.fontMetrics().width( QString::number( page ) ), view.bottom() + p.fontMetrics().ascent() + 5, QString::number( page ) ); if ( view.top() >= richText.height() ) break; printer.newPage(); page++; } while (TRUE); } }
void Help::filePrint() { QPrinter printer; printer.setFullPage(TRUE); if ( printer.setup() ) { QPainter p( &printer ); QPaintDeviceMetrics metrics(p.device()); int dpix = metrics.logicalDpiX(); int dpiy = metrics.logicalDpiY(); const int margin = 72; // pt QRect body(margin*dpix/72, margin*dpiy/72, metrics.width()-margin*dpix/72*2, metrics.height()-margin*dpiy/72*2 ); QFont font("times", 10); QSimpleRichText richText( browser->text(), font, browser->context(), browser->styleSheet(), browser->mimeSourceFactory(), body.height() ); richText.setWidth( &p, body.width() ); QRect view( body ); int page = 1; for (;;) { richText.draw( &p, body.left(), body.top(), view, colorGroup() ); view.moveBy( 0, body.height() ); p.translate( 0 , -body.height() ); p.setFont( font ); p.drawText( view.right() - p.fontMetrics().width( QString::number(page) ), view.bottom() + p.fontMetrics().ascent() + 5, QString::number(page) ); if ( view.top() >= richText.height() ) break; printer.newPage(); page++; } } }
// The following is adapted from KStringHanlder::tagURLs // The adaptation lies in the change to urlEx // Thanks to Richard Heck QString Tools::tagURLs(const QString &text) { QRegExp urlEx("<!DOCTYPE[^\"]+\"([^\"]+)\"[^\"]+\"([^\"]+)/([^/]+)\\.dtd\">"); QString richText(text); int urlPos = 0; int urlLen; if((urlPos = urlEx.search(richText, urlPos)) >= 0) urlPos+=urlEx.matchedLength(); else urlPos=0; urlEx.setPattern("(www\\.(?!\\.)|([a-zA-z]+)://)[\\d\\w\\./,:_~\\?=&;#@\\-\\+\\%\\$]+[\\d\\w/]"); while ((urlPos = urlEx.search(richText, urlPos)) >= 0) { urlLen = urlEx.matchedLength(); QString href = richText.mid(urlPos, urlLen); // Qt doesn't support (?<=pattern) so we do it here if ((urlPos > 0) && richText[urlPos-1].isLetterOrNumber()) { urlPos++; continue; } QString anchor = "<a href=\"" + href + "\">" + href + "</a>"; richText.replace(urlPos, urlLen, anchor); urlPos += anchor.length(); } return richText; }
void BalloonMsg::paintEvent(QPaintEvent*) { QPainter p(this); QSimpleRichText richText(text, font(), "", QStyleSheet::defaultSheet(), QMimeSourceFactory::defaultFactory(), -1, Qt::blue, false); richText.setWidth(m_width); richText.adjustSize(); richText.draw(&p, (width() - textRect.width()) / 2, textRect.y(), QRect(0, 0, width(), height()), QToolTip::palette().active()); p.end(); }
void TipLabel::drawContents(QPainter *p) { QSimpleRichText richText(m_text, font(), "", QStyleSheet::defaultSheet(), QMimeSourceFactory::defaultFactory(), -1, Qt::blue, false); richText.adjustSize(); #if QT_VERSION < 0x300 richText.draw(p, 4, 4, QRegion(0, 0, width(), height()), QToolTip::palette()); #else richText.draw(p, 4, 4, QRect(0, 0, width(), height()), QToolTip::palette().active()); #endif }
void RoutingPluginPrivate::updateDestinationInformation() { if ( m_routingModel->route().currentSegment().isValid() ) { qreal remaining = remainingDistance(); qreal distanceLeft = nextInstructionDistance(); m_audio->update( m_routingModel->route(), distanceLeft, remaining, m_routingModel->deviatedFromRoute() ); m_nearNextInstruction = distanceLeft < thresholdDistance; QString pixmapHtml = "<img src=\":/flag.png\" /><br />"; m_widget.destinationDistanceLabel->setText( pixmapHtml + richText( fuzzyDistance( remaining ) ) ); m_widget.instructionIconLabel->setEnabled( m_nearNextInstruction ); m_widget.progressBar->setMaximum( thresholdDistance ); m_widget.progressBar->setValue( qRound( distanceLeft ) ); updateButtonVisibility(); QString pixmap = MarbleDirs::path( "bitmaps/routing_step.png" ); pixmapHtml = QString( "<img src=\"%1\" />" ).arg( pixmap ); qreal planetRadius = m_marbleWidget->model()->planet()->radius(); GeoDataCoordinates const onRoute = m_routingModel->route().positionOnRoute(); GeoDataCoordinates const ego = m_routingModel->route().position(); qreal const distanceToRoute = planetRadius * distanceSphere( ego, onRoute ); if ( !m_routingModel->route().currentSegment().isValid() ) { m_widget.instructionLabel->setText( richText( QObject::tr( "Calculate a route to get directions." ) ) ); m_widget.instructionIconLabel->setText( pixmapHtml ); } else if ( distanceToRoute > 300.0 ) { m_widget.instructionLabel->setText( richText( QObject::tr( "Route left." ) ) ); m_widget.instructionIconLabel->setText( pixmapHtml ); } else if ( !m_routingModel->route().currentSegment().nextRouteSegment().isValid() ) { m_widget.instructionLabel->setText( richText( QObject::tr( "Destination ahead." ) ) ); m_widget.instructionIconLabel->setText( pixmapHtml ); } else { pixmap = m_routingModel->route().currentSegment().nextRouteSegment().maneuver().directionPixmap(); QString const instructionText = m_routingModel->route().currentSegment().nextRouteSegment().maneuver().instructionText(); m_widget.instructionLabel->setText( richText( "%1" ).arg( instructionText ) ); pixmapHtml = QString( "<p align=\"center\"><img src=\"%1\" /><br />%2</p>" ).arg( pixmap ); m_widget.instructionIconLabel->setText( pixmapHtml.arg( richText( fuzzyDistance( distanceLeft ) ) ) ); if( remaining > 50 ) { m_routeCompleted = false; } else { if ( !m_routeCompleted ) { QString content = QObject::tr( "Arrived at destination. <a href=\"#reverse\">Calculate the way back.</a>" ); m_widget.instructionLabel->setText( richText( "%1" ).arg( content ) ); } m_routeCompleted = true; } } forceRepaint(); } }
void HelpWindow::print() { #ifndef QT_NO_PRINTER QPrinter printer; printer.setFullPage(TRUE); if ( printer.setup() ) { QPainter p( &printer ); QPaintDeviceMetrics metrics(p.device()); int dpix = metrics.logicalDpiX(); int dpiy = metrics.logicalDpiY(); const int margin = 72; // pt QRect body(margin*dpix/72, margin*dpiy/72, metrics.width()-margin*dpix/72*2, metrics.height()-margin*dpiy/72*2 ); QFont font("times", 10); QStringList filePaths = browser->mimeSourceFactory()->filePath(); QString file; QStringList::Iterator it = filePaths.begin(); for ( ; it != filePaths.end(); ++it ) { file = QUrl( *it, QUrl( browser->source() ).path() ).path(); if ( QFile::exists( file ) ) break; else file = QString::null; } if ( file.isEmpty() ) return; QFile f( file ); if ( !f.open( IO_ReadOnly ) ) return; QTextStream ts( &f ); QSimpleRichText richText( ts.read(), font, browser->context(), browser->styleSheet(), browser->mimeSourceFactory(), body.height() ); richText.setWidth( &p, body.width() ); QRect view( body ); int page = 1; do { richText.draw( &p, body.left(), body.top(), view, colorGroup() ); view.moveBy( 0, body.height() ); p.translate( 0 , -body.height() ); p.setFont( font ); p.drawText( view.right() - p.fontMetrics().width( QString::number(page) ), view.bottom() + p.fontMetrics().ascent() + 5, QString::number(page) ); if ( view.top() >= richText.height() ) break; printer.newPage(); page++; } while (TRUE); } #endif }
/*! Scrolls the browser so that the part of the document named \a name is at the top of the view (or as close to the top as the size of the document allows). */ void QTextBrowser::scrollToAnchor(const QString& name) { if ( name.isEmpty() ) return; d->curmark = name; QRichTextIterator it( richText() ); do { if ( it.format()->anchorName() == name ) { QTextParagraph* b = it.outmostParagraph(); if ( b->dirty ) { // QTextView layouts delayed in the background, so this may happen QRichTextFormatter tc( richText() ); tc.gotoParagraph( 0, &richText() ); tc.updateLayout(); resizeContents( QMAX( richText().flow()->widthUsed-1, visibleWidth() ), richText().flow()->height ); } QRect r = it.lineGeometry(); setContentsPos( contentsX(), r.top() ); return; } } while ( it.right( FALSE ) ); }
//! Return sizeHint QSize QwtPushButton::sizeHint() const { QSize hint = QPushButton::sizeHint(); if ( d_indent > 0 ) { if ( (d_alignment & Qt::AlignLeft) || (d_alignment & Qt::AlignRight) ) { hint.setWidth(hint.width() + d_indent); } if ( (d_alignment & Qt::AlignTop) || (d_alignment & Qt::AlignBottom) ) { hint.setHeight(hint.height() + d_indent); } } if ( pixmap() ) return hint; const Qt::TextFormat textFormat = usedTextFormat(); if ( textFormat == Qt::RichText ) { QwtRichText richText(text(), font(), d_alignment); const QSize sizeText = fontMetrics().size(Qt::ShowPrefix, text()); const QSize sizeRichText(richText.boundingRect().size()); int iconHeight = 0; if ( iconSet() && !iconSet()->isNull() ) { iconHeight = iconSet()->pixmap(QIconSet::Small, QIconSet::Normal).height(); } const int heightText = QMAX(iconHeight, sizeText.height()); const int heightRichText = QMAX(iconHeight, sizeRichText.height()); hint.setWidth(hint.width() - sizeText.width() + sizeRichText.width()); hint.setHeight(hint.height() - heightText + heightRichText); } return hint; }
void RoutingPluginPrivate::toggleGuidanceMode( bool enabled ) { if( !m_marbleWidget || m_guidanceModeEnabled == enabled ) { return; } m_guidanceModeEnabled = enabled; updateButtonVisibility(); if( enabled ) { QObject::connect( m_routingModel, SIGNAL(positionChanged()), m_parent, SLOT(updateDestinationInformation()) ); } else { QObject::disconnect( m_routingModel, SIGNAL(positionChanged()), m_parent, SLOT(updateDestinationInformation()) ); } if ( enabled ) { QString const text = QObject::tr( "Starting guidance mode, please wait..." ); m_widget.instructionLabel->setText( richText( "%1" ).arg( text ) ); } if ( enabled ) { RouteRequest* request = m_marbleWidget->model()->routingManager()->routeRequest(); if ( request && request->size() > 0 ) { GeoDataCoordinates source = request->source(); if ( source.isValid() ) { GeoDataLookAt view; view.setCoordinates( source ); // By happy coincidence this equals OpenStreetMap tile level 15 view.setRange( 851.807 ); m_marbleWidget->flyTo( view ); } } } m_marbleWidget->model()->routingManager()->setGuidanceModeEnabled( enabled ); if ( enabled ) { m_routeCompleted = false; } forceRepaint(); }
void ApplicationWindow::print() { #ifndef QT_NO_PRINTER printer->setFullPage( TRUE ); if ( printer->setup(this) ) { // printer dialog statusBar()->message( "Printing..." ); QPainter p; if( !p.begin( printer ) ) { // paint on printer statusBar()->message( "Printing aborted", 2000 ); return; } QPaintDeviceMetrics metrics( p.device() ); int dpiy = metrics.logicalDpiY(); int margin = (int) ( (2/2.54)*dpiy ); // 2 cm margins QRect body( margin, margin, metrics.width() - 2*margin, metrics.height() - 2*margin ); QSimpleRichText richText( QStyleSheet::convertFromPlainText(e->text()), QFont(), e->context(), e->styleSheet(), e->mimeSourceFactory(), body.height() ); richText.setWidth( &p, body.width() ); QRect view( body ); int page = 1; do { richText.draw( &p, body.left(), body.top(), view, colorGroup() ); view.moveBy( 0, body.height() ); p.translate( 0 , -body.height() ); p.drawText( view.right() - p.fontMetrics().width( QString::number( page ) ), view.bottom() + p.fontMetrics().ascent() + 5, QString::number( page ) ); if ( view.top() >= richText.height() ) break; printer->newPage(); page++; } while (TRUE); statusBar()->message( "Printing completed", 2000 ); } else { statusBar()->message( "Printing aborted", 2000 ); } #endif }
void TextEdit::filePrint() { if ( !currentEditor() ) return; #ifndef QT_NO_PRINTER QPrinter printer( QPrinter::HighResolution ); printer.setFullPage(TRUE); if ( printer.setup( this ) ) { QPainter p( &printer ); // Check that there is a valid device to print to. if ( !p.device() ) return; QPaintDeviceMetrics metrics( p.device() ); int dpiy = metrics.logicalDpiY(); int margin = (int) ( (2/2.54)*dpiy ); // 2 cm margins QRect view( margin, margin, metrics.width() - 2*margin, metrics.height() - 2*margin ); QFont font( currentEditor()->QWidget::font() ); font.setPointSize( 10 ); // we define 10pt to be a nice base size for printing QSimpleRichText richText( currentEditor()->text(), font, currentEditor()->context(), currentEditor()->styleSheet(), currentEditor()->mimeSourceFactory(), view.height() ); richText.setWidth( &p, view.width() ); int page = 1; do { richText.draw( &p, margin, margin, view, colorGroup() ); view.moveBy( 0, view.height() ); p.translate( 0 , -view.height() ); p.setFont( font ); p.drawText( view.right() - p.fontMetrics().width( QString::number( page ) ), view.bottom() + p.fontMetrics().ascent() + 5, QString::number( page ) ); if ( view.top() - margin >= richText.height() ) break; printer.newPage(); page++; } while (TRUE); } #endif }
void TextEdit::filePrint() { if ( !currentEditor() ) return; #ifndef QT_NO_PRINTER QPrinter printer; printer.setFullPage(TRUE); QPaintDeviceMetrics screen( this ); printer.setResolution( screen.logicalDpiY() ); if ( printer.setup( this ) ) { QPainter p( &printer ); QPaintDeviceMetrics metrics( p.device() ); int dpix = metrics.logicalDpiX(); int dpiy = metrics.logicalDpiY(); const int margin = 72; // pt QRect body( margin * dpix / 72, margin * dpiy / 72, metrics.width() - margin * dpix / 72 * 2, metrics.height() - margin * dpiy / 72 * 2 ); QFont font( "times", 10 ); QSimpleRichText richText( currentEditor()->text(), font, currentEditor()->context(), currentEditor()->styleSheet(), currentEditor()->mimeSourceFactory(), body.height() ); richText.setWidth( &p, body.width() ); QRect view( body ); int page = 1; do { richText.draw( &p, body.left(), body.top(), view, colorGroup() ); view.moveBy( 0, body.height() ); p.translate( 0 , -body.height() ); p.setFont( font ); p.drawText( view.right() - p.fontMetrics().width( QString::number( page ) ), view.bottom() + p.fontMetrics().ascent() + 5, QString::number( page ) ); if ( view.top() >= richText.height() ) break; printer.newPage(); page++; } while (TRUE); } #endif }
// The following is adapted from KStringHanlder::tagURLs // The adaptation lies in the change to urlEx // Thanks to Richard Heck QString Tools::tagURLs(const QString &text) { QRegExp urlEx("<!DOCTYPE[^\"]+\"([^\"]+)\"[^\"]+\"([^\"]+)/([^/]+)\\.dtd\">"); QString richText(text); int urlPos = 0; int urlLen; if ((urlPos = urlEx.indexIn(richText, urlPos)) >= 0) urlPos += urlEx.matchedLength(); else urlPos = 0; urlEx.setPattern("(www\\.(?!\\.)|(fish|(f|ht)tp(|s))://)[\\d\\w\\./,:_~\\?=&;#@\\-\\+\\%\\$]+[\\d\\w/]"); while ((urlPos = urlEx.indexIn(richText, urlPos)) >= 0) { urlLen = urlEx.matchedLength(); //if this match is already a link don't convert it. if(richText.mid(urlPos - 6, 6) == "href=\"") { urlPos += urlLen; continue; } QString href = richText.mid(urlPos, urlLen); //we handle basket links separately... if(href.contains("basket://")) { urlPos += urlLen; continue; } // Qt doesn't support (?<=pattern) so we do it here if ((urlPos > 0) && richText[urlPos-1].isLetterOrNumber()) { urlPos++; continue; } // Don't use QString::arg since %01, %20, etc could be in the string QString anchor = "<a href=\"" + href + "\">" + href + "</a>"; richText.replace(urlPos, urlLen, anchor); urlPos += anchor.length(); } return richText; }
SubtitleComposer::SString SimpleRichTextEdit::richText() { SubtitleComposer::SString richText(toPlainText()); if(richText.length()) { QTextCursor cursor = textCursor(); QTextCharFormat format; int styleFlags; QRgb styleColor; for(int position = 1, size = richText.length(); position <= size; ++position) { cursor.setPosition(position); format = cursor.charFormat(); styleFlags = 0; if(format.fontWeight() == QFont::Bold) styleFlags |= SubtitleComposer::SString::Bold; if(format.fontItalic()) styleFlags |= SubtitleComposer::SString::Italic; if(format.fontUnderline()) styleFlags |= SubtitleComposer::SString::Underline; if(format.fontStrikeOut()) styleFlags |= SubtitleComposer::SString::StrikeThrough; if(format.foreground().style() != Qt::NoBrush) { styleFlags |= SubtitleComposer::SString::Color; styleColor = format.foreground().color().toRgb().rgb(); } else { styleColor = 0; } richText.setStyleFlagsAt(position - 1, styleFlags); richText.setStyleColorAt(position - 1, styleColor); } } return richText; }
void GraphicTextDialog::accept() { if(plainText().isEmpty()) { QMessageBox::critical(this, tr("Error"), tr("The text must not be empty!")); } else { if(textItem) { SchematicScene *scene = textItem->schematicScene(); QString oldText = textItem->richText(); QString newText = richText(); if(oldText != newText) { if(undoOption == Qucs::PushUndoCmd) { QUndoCommand *cmd = new GraphicTextChangeCmd(textItem, oldText, newText); scene->undoStack()->push(cmd); } else { textItem->setText(newText); } } } QDialog::accept(); } }
QString QTextBrowser::anchorAt(const QPoint& pos) { return richText().anchorAt( QPoint(contentsX(), contentsY() ) + pos ); }
bool QwtPBPaintFilter::cmd(int c, QPainter *painter, QPDevCmdParam *param) { switch(c) { case PdcDrawTextFormatted: case PdcDrawText2Formatted: { Qt::TextFormat textFormat = d_button->usedTextFormat(); if ( textFormat == Qt::PlainText ) { param[1].ival = d_button->alignment(); QRect &r = *((QRect *)param[0].rect); r = indentRect(r); return QPicture::cmd(c, painter, param); } if ( textFormat == Qt::RichText ) { if ( !d_inFilter ) // avoid recursive calls { d_inFilter = TRUE; QwtRichText richText(*param[2].str, painter->font(), d_button->alignment(), painter->pen().color()); richText.draw(painter, indentRect(*param[0].rect)); d_inFilter = FALSE; return TRUE; } } break; } case PdcDrawPixmap: { if ( d_inFilter ) // avoid recursive calls { // There might be pixmaps embedded in rich text. // This problem is solved by the d_inFilter guard // above too. break; } if ( isLabel(param[1].pixmap) && !(d_button->alignment() & Qt::AlignCenter)) { const QRect contentsRect = #if QT_VERSION >= 300 d_button->style().subRect( QStyle::SR_PushButtonContents, d_button); #else d_button->style().pushButtonContentsRect( (QPushButton *)d_button); #endif QRect pixRect = contentsRect; if ( !d_iconRect.isEmpty() ) pixRect.setX(d_iconRect.right()); // Many styles move the label right/down // when the button is down. #if QT_VERSION >= 300 const QRect &r = *((QRect *)param[0].rect); #else const QRect r(*param[0].point, param[1].pixmap->size()); #endif const int offsetY = r.center().y() - pixRect.center().y(); const int offsetX = d_iconRect.isEmpty() ? offsetY : 0; pixRect.moveBy(offsetX, offsetY); if ( d_button->indent() > 0 ) { const int indent = d_button->indent(); const int align = d_button->alignment(); if ( align & Qt::AlignRight ) pixRect.setRight(pixRect.right() - indent); else if ( align & Qt::AlignLeft ) pixRect.setLeft(pixRect.left() + indent); if ( align & Qt::AlignTop ) pixRect.setTop(pixRect.top() + indent); else if ( align & Qt::AlignBottom ) pixRect.setBottom(pixRect.bottom() - indent); } pixRect &= contentsRect; // clip to contentsRect d_inFilter = TRUE; d_button->style().drawItem(painter, #if QT_VERSION >= 300 pixRect, #else pixRect.x(), pixRect.y(), pixRect.width(), pixRect.height(), #endif d_button->alignment(), d_button->colorGroup(), d_button->isEnabled(), param[1].pixmap, QString::null); d_inFilter = FALSE; return TRUE; } else { // We save the position of the icon. We need it later // to align the label pixmap. Hope that there are no styles // that paint the pixmap before the icon. #if QT_VERSION < 300 d_iconRect = QRect(*param[0].point, param[1].pixmap->size()); #else d_iconRect = *param[0].rect; #endif } break; } } return QPicture::cmd(c, painter, param); }
void TipLabel::show(const QRect &tipRect, bool _bState) { int prevH = 0; int x = 0; int y = 0; unsigned totalH = 0; QStringList l; vector<unsigned> heights; QRect rc = screenGeometry(); for (unsigned nDiv = 0;; nDiv++){ bool bState = _bState; QString text = m_text; if (nDiv){ text = "<table><tr><td>"; unsigned hPart = totalH / (nDiv + 1); unsigned h = 0; unsigned i = 0; QString part; for (QStringList::Iterator it = l.begin(); it != l.end(); ++it, i++){ string s; s = (*it).local8Bit(); log(L_DEBUG, "%u %u (%u %u):\n%s", i, heights[i], h, hPart, s.c_str()); if (!part.isEmpty()){ if (heights[i] >= hPart){ log(L_DEBUG, "Div---"); text += part; text += "</td><td>"; part = ""; h = 0; }else{ part += "<hr>"; } } part += *it; h += heights[i]; if (h >= hPart){ log(L_DEBUG, "DDD"); text += part; text += "</td><td>"; part = ""; h = 0; } } text += part; text += "</td></tr></table>"; } QSimpleRichText richText(text, font(), "", QStyleSheet::defaultSheet(), QMimeSourceFactory::defaultFactory(), -1, Qt::blue, false); richText.adjustSize(); QSize s(richText.widthUsed() + 8, richText.height() + 8); resize(s.width(), s.height()); x = tipRect.left() + tipRect.width() / 2 - width(); if (x < 0) x = tipRect.left() + tipRect.width() / 2; if (x + width() > rc.width() - 2) x = rc.width() - 2 - width(); y = 0; if (bState){ y = tipRect.top() - 4 - height(); if (y < 0) bState = false; } if (!bState) y = tipRect.top() + tipRect.height() + 4; if (y + height() > rc.height()) y = tipRect.top() - 4 - height(); if (y < 0) y = tipRect.top() + tipRect.height() + 4; if ((y + s.height() < rc.height()) || (prevH == s.height())){ m_text = text; break; } prevH = s.height(); if (totalH == 0){ totalH = prevH; l = QStringList::split("<hr>", m_text); unsigned i = 0; for (QStringList::Iterator it = l.begin(); it != l.end(); ++it, i++){ QSimpleRichText richText(*it, font(), "", QStyleSheet::defaultSheet(), QMimeSourceFactory::defaultFactory(), -1, Qt::blue, false); richText.adjustSize(); heights.push_back(richText.height() + 8); log(L_DEBUG, "H[%u]=%u", i, richText.height() + 8); } } } move(x, y); QLabel::show(); }