this repo has no description
1/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ 2/* 3 * Main authors: 4 * Guido Tack <tack@gecode.org> 5 * 6 * Copyright: 7 * Guido Tack, 2006 8 * 9 * This file is part of Gecode, the generic constraint 10 * development environment: 11 * http://www.gecode.org 12 * 13 * Permission is hereby granted, free of charge, to any person obtaining 14 * a copy of this software and associated documentation files (the 15 * "Software"), to deal in the Software without restriction, including 16 * without limitation the rights to use, copy, modify, merge, publish, 17 * distribute, sublicense, and/or sell copies of the Software, and to 18 * permit persons to whom the Software is furnished to do so, subject to 19 * the following conditions: 20 * 21 * The above copyright notice and this permission notice shall be 22 * included in all copies or substantial portions of the Software. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 28 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 29 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 30 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 31 * 32 */ 33 34#include <QtGui> 35#if QT_VERSION >= 0x050000 36#include <QtWidgets> 37#endif 38 39#include <iostream> 40#include <gecode/gist/textoutput.hh> 41#include <gecode/gist/gecodelogo.hh> 42 43namespace Gecode { namespace Gist { 44 45 /// \brief An outputstream that prints on a QTextEdit 46 class GistOutputStream 47 : public std::basic_ostream<char, std::char_traits<char> > { 48 /// \brief Buffer for printing on a QTextEdit 49 class Buf 50 : public std::basic_streambuf<char, std::char_traits<char> > { 51 QString buffer; 52 QTextEdit* editor; 53 public: 54 void flush(void) { 55 QTextBlockFormat bf = editor->textCursor().blockFormat(); 56 bf.setBottomMargin(0); 57 editor->textCursor().setBlockFormat(bf); 58 editor->append(buffer); 59 buffer.clear(); 60 } 61 virtual int overflow(int v = std::char_traits<char>::eof()) { 62 if (v == '\n') { 63 flush(); 64 } else { 65 buffer += (char)v; 66 } 67 return v; 68 } 69 Buf(QTextEdit* e) : editor(e) {} 70 }; 71 72 Buf _buf; 73 public: 74 GistOutputStream(QTextEdit* editor) 75 : std::basic_ostream<char, std::char_traits<char> >(&_buf), 76 _buf(editor) { 77 clear(); 78 } 79 void flush(void) { 80 _buf.flush(); 81 } 82 }; 83 84 TextOutputI::TextOutputI(const std::string& name, QWidget *parent) 85 : QMainWindow(parent) { 86 Logos logos; 87 88 QPixmap myPic; 89 myPic.loadFromData(logos.gistLogo, logos.gistLogoSize); 90 setWindowIcon(myPic); 91 92 QFont font; 93 QString fontFamily("Courier"); 94 font.setFamily(fontFamily); 95 font.setFixedPitch(true); 96 font.setPointSize(12); 97 98 99 editor = new QTextEdit; 100 editor->setFont(font); 101 editor->setReadOnly(true); 102 editor->setLineWrapMode(QTextEdit::FixedColumnWidth); 103 editor->setLineWrapColumnOrWidth(80); 104 os = new GistOutputStream(editor); 105 106 QAction* clearText = new QAction("Clear", this); 107 clearText->setShortcut(QKeySequence("Ctrl+K")); 108 this->addAction(clearText); 109 connect(clearText, SIGNAL(triggered()), editor, 110 SLOT(clear())); 111 112 QAction* closeWindow = new QAction("Close window", this); 113 closeWindow->setShortcut(QKeySequence("Ctrl+W")); 114 this->addAction(closeWindow); 115 connect(closeWindow, SIGNAL(triggered()), this, 116 SLOT(close())); 117 118 QToolBar* t = addToolBar("Tools"); 119 t->setFloatable(false); 120 t->setMovable(false); 121 t->addAction(clearText); 122 123 stayOnTop = new QAction("Stay on top", this); 124 stayOnTop->setCheckable(true); 125 t->addAction(stayOnTop); 126 connect(stayOnTop, SIGNAL(changed()), this, 127 SLOT(changeStayOnTop())); 128 129 changeStayOnTop(); 130 setCentralWidget(editor); 131 setWindowTitle(QString((std::string("Gist Console: ") + name).c_str())); 132 133 setAttribute(Qt::WA_QuitOnClose, false); 134 setAttribute(Qt::WA_DeleteOnClose, false); 135 resize(600,300); 136 } 137 138 TextOutputI::~TextOutputI(void) { 139 delete os; 140 } 141 142 std::ostream& 143 TextOutputI::getStream(void) { 144 return *os; 145 } 146 147 void 148 TextOutputI::flush(void) { 149 static_cast<GistOutputStream*>(os)->flush(); 150 } 151 152 void 153 TextOutputI::insertHtml(const QString& s) { 154 QTextBlockFormat bf = editor->textCursor().blockFormat(); 155 bf.setBottomMargin(0); 156 editor->textCursor().setBlockFormat(bf); 157 editor->insertHtml(s); 158 editor->ensureCursorVisible(); 159 } 160 161 void TextOutputI::changeStayOnTop(void) { 162 QPoint p = pos(); 163 if (stayOnTop->isChecked()) { 164 setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint); 165 } else { 166 setWindowFlags(windowFlags() & ~Qt::WindowStaysOnTopHint); 167 } 168 move(p); 169 show(); 170 } 171 172}} 173 174// STATISTICS: gist-any