/*! Makes a scrolled text window with the text taken from the array of character strings in [msg] */ void dia_smsg(const char **msg) { char *p; char *buf; char *lineStart; char *temp; int maxline, maxrow, linesize; long bufsize; int i, twidth, doline; int lastspace, curpos; int maxWidth = (int)(0.8 * QApplication::desktop()->width()); int maxHeight = (int)(0.8 * QApplication::desktop()->height()); int height, width = 0; QString test; QDialog *dlg = new QDialog(); dlg->setAttribute(Qt::WA_DeleteOnClose); for (i = 0, bufsize = 0; msg[i]; i++){ linesize = strlen(msg[i]); bufsize += linesize; } buf = (char *)malloc(bufsize + i + 1); p = buf; for (p = buf, i = 0; msg[i]; i++) { p += strlen (strcpy (p, msg[i])); /* DNM: this macro call caused program built on Irix 6.5 to not run on earlier Irix's. Casting as (int) didn't help - just do explicit tests */ /*if (!isspace (p[-1])) spaces, tabs and newlines are spaces.. */ if (p[-1] != ' ' && p[-1] != '\t' && p[-1] != '\n') *p++ = ' '; /* lines are concatenated, insert a space */ } *--p = 0; /* get rid of trailing space... */ // DNM: count the actual lines and their lengths to get the right size window maxline = 0; maxrow = 1; curpos = 0; lastspace = 40; lineStart = buf; for (p = buf; *p; p++) { doline = 0; if (*p == '\t') curpos = 8 * (curpos/ 8 + 1); else if (*p == ' ') { lastspace = curpos; curpos++; } else if (*p == '\n') { if (curpos >= maxline) maxline = curpos + 1; curpos = 0; doline = p + 1 - lineStart; } else if (curpos > 78 ) { if (lastspace >= maxline) maxline = lastspace + 1; curpos -= lastspace; doline = lastspace; } else curpos++; if (doline) { temp = (char *)malloc(doline + 1); if (temp) { strncpy(temp, lineStart, doline); temp[doline] = 0x00; test = temp; twidth = dlg->fontMetrics().width(test); if (width < twidth) width = twidth; free(temp); } lineStart = p + 1; lastspace = 40; maxrow++; } } if (!maxline & !width) { maxline = curpos + 1; test = ""; for (i = 0; i < maxline + 2; i++) test += "8"; width = dlg->fontMetrics().width(test); } if (maxrow > 50) maxrow = 40; QString qmsg = buf; // Make a vertical layout with the text edit and a close button QVBoxLayout *vbox = new QVBoxLayout(dlg); QTextEdit *edit = new QTextEdit(dlg); edit->setText(qmsg); edit->setReadOnly(true); vbox->addWidget(edit); QHBoxLayout *hbox = diaHBoxLayout(vbox); QPushButton *button = diaPushButton("Close", dlg, hbox); diaSetButtonWidth(button, true, 1.4, "Close"); QObject::connect(button, SIGNAL(clicked()), dlg, SLOT(close())); // Figure out width and height of text and height of button, and set size if (width > maxWidth) width = maxWidth; height = (maxrow + 5) * edit->fontMetrics().height(); if (height > maxHeight) height = maxHeight; QSize hint = hbox->sizeHint(); // This was width + 20 when the width was based on character count alone dlg->resize(width + 60, height + hint.height()); // Set title test = Dia_title; test += " Help"; dlg->setWindowTitle(test); dlg->show(); }
void TumblerWindow::setFontDependentWidths() { diaSetButtonWidth(mHelpButton, ImodPrefs->getRoundedStyle(), 1.2, "Help"); }