00001
00002
00003
00004
00005
00006
00007 #include "EngaugeAssert.h"
00008 #include "Logger.h"
00009 #include <QFrame>
00010 #include <QHBoxLayout>
00011 #include <QLineEdit>
00012 #include <QStatusBar>
00013 #include <QTextEdit>
00014 #include <QTimer>
00015 #include <QWhatsThis>
00016 #include "StatusBar.h"
00017 #include "ZoomFactor.h"
00018 #include "ZoomLabels.h"
00019
00020 const QString LABEL_COORDS_SCREEN (QObject::tr ("Coordinates (pixels):"));
00021 const QString LABEL_COORDS_GRAPH (QObject::tr ("Coordinates (graph):"));
00022 const QString LABEL_RESOLUTION_GRAPH (QObject::tr ("Resolution (graph):"));
00023
00024 const int TEMPORARY_MESSAGE_LIFETIME = 5000;
00025
00026 const int MIN_WIDTH_ZOOM = 110;
00027 const int MIN_WIDTH_COMBO_UNITS = 160;
00028 const int MIN_SIZE_EDIT_COORDS = 250;
00029 const int MAX_HEIGHT_EDIT_COORDS = 24;
00030
00031 StatusBar::StatusBar(QStatusBar &statusBar) :
00032 m_statusBar (statusBar),
00033 m_statusBarMode (STATUS_BAR_MODE_ALWAYS),
00034 m_timer (0)
00035 {
00036 createZoom ();
00037 createZoomMaps ();
00038 createGroupUnits ();
00039
00040 connect (&m_statusBar, SIGNAL (messageChanged (const QString &)), this, SLOT (slotStatusBarChanged (const QString &)));
00041
00042 m_statusBar.setMaximumHeight (60);
00043 m_statusBar.hide();
00044 }
00045
00046 StatusBar::~StatusBar ()
00047 {
00048 if (m_timer != 0) {
00049 delete m_timer;
00050 m_timer = 0;
00051 }
00052 }
00053
00054 void StatusBar::createGroupUnits ()
00055 {
00056 m_cmbUnits = new QComboBox;
00057 m_cmbUnits->setEnabled (false);
00058 m_cmbUnits->addItem (LABEL_COORDS_SCREEN, QVariant (STATUS_BAR_UNITS_COORDS_SCREEN));
00059 m_cmbUnits->addItem (LABEL_COORDS_GRAPH, QVariant (STATUS_BAR_UNITS_COORDS_GRAPH));
00060 m_cmbUnits->addItem (LABEL_RESOLUTION_GRAPH, QVariant (STATUS_BAR_UNITS_RESOLUTION_GRAPH));
00061 m_cmbUnits->setCurrentText (LABEL_COORDS_GRAPH);
00062 m_cmbUnits->setMinimumWidth (MIN_WIDTH_COMBO_UNITS);
00063 m_cmbUnits->setToolTip (tr ("Select cursor coordinate values to display."));
00064 m_cmbUnits->setWhatsThis (tr("Select Cursor Coordinate Values\n\n"
00065 "Values at cursor coordinates to display. Coordinates are in screen (pixels) or "
00066 "graph units. Resolution (which is the number of graph units per pixel) is "
00067 "in graph units. Graph units are only available after axis points have been defined."));
00068 connect (m_cmbUnits, SIGNAL (activated(const QString &)), this, SLOT (slotComboUnits (const QString &)));
00069
00070 m_editCoords = new QTextEdit;
00071 m_editCoords->setEnabled (false);
00072 m_editCoords->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
00073 m_editCoords->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
00074 m_editCoords->setMinimumSize (MIN_SIZE_EDIT_COORDS, MAX_HEIGHT_EDIT_COORDS);
00075 m_editCoords->setMaximumHeight (MAX_HEIGHT_EDIT_COORDS);
00076 m_editCoords->setReadOnly(true);
00077 m_editCoords->setToolTip (tr ("Cursor coordinate values."));
00078 m_editCoords->setWhatsThis (tr ("Cursor Coordinate Values\n\n"
00079 "Values at cursor coordinates. Coordinates are in screen (pixels) or "
00080 "graph units. Resolution (which is the number of graph units per pixel) is "
00081 "in graph units. Graph units are only available after axis points have been defined."));
00082
00083 m_groupUnits = new QFrame;
00084 m_groupUnits->setFrameStyle (QFrame::Box);
00085 QPalette *palette = new QPalette;
00086 palette->setColor (QPalette::Foreground, Qt::gray);
00087 m_groupUnits->setPalette (*palette);
00088
00089 QHBoxLayout *groupLayout = new QHBoxLayout;
00090 m_groupUnits->setLayout (groupLayout);
00091 groupLayout->setContentsMargins (0, 0, 0, 0);
00092 groupLayout->addWidget (m_cmbUnits);
00093 groupLayout->addWidget (m_editCoords);
00094 groupLayout->setMargin (2);
00095
00096 m_statusBar.addPermanentWidget (m_groupUnits);
00097 }
00098
00099 void StatusBar::createZoom ()
00100 {
00101 m_cmbZoom = new QComboBox ();
00102 m_cmbZoom->setEnabled (false);
00103 m_cmbZoom->setMinimumWidth (MIN_WIDTH_ZOOM);
00104 m_cmbZoom->addItem (LABEL_ZOOM_16_TO_1);
00105 m_cmbZoom->addItem (LABEL_ZOOM_16_TO_1_FARTHER);
00106 m_cmbZoom->addItem (LABEL_ZOOM_8_TO_1_CLOSER);
00107 m_cmbZoom->addItem (LABEL_ZOOM_8_TO_1);
00108 m_cmbZoom->addItem (LABEL_ZOOM_8_TO_1_FARTHER);
00109 m_cmbZoom->addItem (LABEL_ZOOM_4_TO_1_CLOSER);
00110 m_cmbZoom->addItem (LABEL_ZOOM_4_TO_1);
00111 m_cmbZoom->addItem (LABEL_ZOOM_4_TO_1_FARTHER);
00112 m_cmbZoom->addItem (LABEL_ZOOM_2_TO_1_CLOSER);
00113 m_cmbZoom->addItem (LABEL_ZOOM_2_TO_1);
00114 m_cmbZoom->addItem (LABEL_ZOOM_2_TO_1_FARTHER);
00115 m_cmbZoom->addItem (LABEL_ZOOM_1_TO_1_CLOSER);
00116 m_cmbZoom->addItem (LABEL_ZOOM_1_TO_1);
00117 m_cmbZoom->addItem (LABEL_ZOOM_1_TO_1_FARTHER);
00118 m_cmbZoom->addItem (LABEL_ZOOM_1_TO_2_CLOSER);
00119 m_cmbZoom->addItem (LABEL_ZOOM_1_TO_2);
00120 m_cmbZoom->addItem (LABEL_ZOOM_1_TO_2_FARTHER);
00121 m_cmbZoom->addItem (LABEL_ZOOM_1_TO_4_CLOSER);
00122 m_cmbZoom->addItem (LABEL_ZOOM_1_TO_4);
00123 m_cmbZoom->addItem (LABEL_ZOOM_1_TO_4_FARTHER);
00124 m_cmbZoom->addItem (LABEL_ZOOM_1_TO_8_CLOSER);
00125 m_cmbZoom->addItem (LABEL_ZOOM_1_TO_8);
00126 m_cmbZoom->addItem (LABEL_ZOOM_1_TO_8_FARTHER);
00127 m_cmbZoom->addItem (LABEL_ZOOM_1_TO_16_CLOSER);
00128 m_cmbZoom->addItem (LABEL_ZOOM_1_TO_16);
00129 m_cmbZoom->addItem (LABEL_ZOOM_FILL);
00130 m_cmbZoom->setCurrentText (LABEL_ZOOM_1_TO_1);
00131 m_cmbZoom->setMaximumWidth (80);
00132 m_cmbZoom->setToolTip (tr ("Select zoom."));
00133 m_cmbZoom->setWhatsThis (tr("Select Zoom\n\n"
00134 "Points can be more accurately placed by zooming in."));
00135
00136 connect (m_cmbZoom, SIGNAL (currentTextChanged(const QString &)), this, SLOT (slotComboZoom (const QString &)));
00137
00138 m_statusBar.addPermanentWidget (m_cmbZoom);
00139 }
00140
00141 void StatusBar::createZoomMaps ()
00142 {
00143 m_zoomMapToLabel [ZOOM_16_TO_1] = LABEL_ZOOM_16_TO_1;
00144 m_zoomMapToLabel [ZOOM_16_TO_1_FARTHER] = LABEL_ZOOM_16_TO_1_FARTHER;
00145 m_zoomMapToLabel [ZOOM_8_TO_1_CLOSER] = LABEL_ZOOM_8_TO_1_CLOSER;
00146 m_zoomMapToLabel [ZOOM_8_TO_1] = LABEL_ZOOM_8_TO_1;
00147 m_zoomMapToLabel [ZOOM_8_TO_1_FARTHER] = LABEL_ZOOM_8_TO_1_FARTHER;
00148 m_zoomMapToLabel [ZOOM_4_TO_1_CLOSER] = LABEL_ZOOM_4_TO_1_CLOSER;
00149 m_zoomMapToLabel [ZOOM_4_TO_1] = LABEL_ZOOM_4_TO_1;
00150 m_zoomMapToLabel [ZOOM_4_TO_1_FARTHER] = LABEL_ZOOM_4_TO_1_FARTHER;
00151 m_zoomMapToLabel [ZOOM_2_TO_1_CLOSER] = LABEL_ZOOM_2_TO_1_CLOSER;
00152 m_zoomMapToLabel [ZOOM_2_TO_1] = LABEL_ZOOM_2_TO_1;
00153 m_zoomMapToLabel [ZOOM_2_TO_1_FARTHER] = LABEL_ZOOM_2_TO_1_FARTHER;
00154 m_zoomMapToLabel [ZOOM_1_TO_1_CLOSER] = LABEL_ZOOM_1_TO_1_CLOSER;
00155 m_zoomMapToLabel [ZOOM_1_TO_1] = LABEL_ZOOM_1_TO_1;
00156 m_zoomMapToLabel [ZOOM_1_TO_1_FARTHER] = LABEL_ZOOM_1_TO_1_FARTHER;
00157 m_zoomMapToLabel [ZOOM_1_TO_2_CLOSER] = LABEL_ZOOM_1_TO_2_CLOSER;
00158 m_zoomMapToLabel [ZOOM_1_TO_2] = LABEL_ZOOM_1_TO_2;
00159 m_zoomMapToLabel [ZOOM_1_TO_2_FARTHER] = LABEL_ZOOM_1_TO_2_FARTHER;
00160 m_zoomMapToLabel [ZOOM_1_TO_4_CLOSER] = LABEL_ZOOM_1_TO_4_CLOSER;
00161 m_zoomMapToLabel [ZOOM_1_TO_4] = LABEL_ZOOM_1_TO_4;
00162 m_zoomMapToLabel [ZOOM_1_TO_4_FARTHER] = LABEL_ZOOM_1_TO_4_FARTHER;
00163 m_zoomMapToLabel [ZOOM_1_TO_8_CLOSER] = LABEL_ZOOM_1_TO_8_CLOSER;
00164 m_zoomMapToLabel [ZOOM_1_TO_8] = LABEL_ZOOM_1_TO_8;
00165 m_zoomMapToLabel [ZOOM_1_TO_8_FARTHER] = LABEL_ZOOM_1_TO_8_FARTHER;
00166 m_zoomMapToLabel [ZOOM_1_TO_16_CLOSER] = LABEL_ZOOM_1_TO_16_CLOSER;
00167 m_zoomMapToLabel [ZOOM_1_TO_16] = LABEL_ZOOM_1_TO_16;
00168 m_zoomMapToLabel [ZOOM_FILL] = LABEL_ZOOM_FILL;
00169
00170 m_zoomMapFromLabel [LABEL_ZOOM_16_TO_1] = ZOOM_16_TO_1;
00171 m_zoomMapFromLabel [LABEL_ZOOM_16_TO_1_FARTHER] = ZOOM_16_TO_1_FARTHER;
00172 m_zoomMapFromLabel [LABEL_ZOOM_8_TO_1_CLOSER] = ZOOM_8_TO_1_CLOSER;
00173 m_zoomMapFromLabel [LABEL_ZOOM_8_TO_1] = ZOOM_8_TO_1;
00174 m_zoomMapFromLabel [LABEL_ZOOM_8_TO_1_FARTHER] = ZOOM_8_TO_1_FARTHER;
00175 m_zoomMapFromLabel [LABEL_ZOOM_4_TO_1_CLOSER] = ZOOM_4_TO_1_CLOSER;
00176 m_zoomMapFromLabel [LABEL_ZOOM_4_TO_1] = ZOOM_4_TO_1;
00177 m_zoomMapFromLabel [LABEL_ZOOM_4_TO_1_FARTHER] = ZOOM_4_TO_1_FARTHER;
00178 m_zoomMapFromLabel [LABEL_ZOOM_2_TO_1_CLOSER] = ZOOM_2_TO_1_CLOSER;
00179 m_zoomMapFromLabel [LABEL_ZOOM_2_TO_1] = ZOOM_2_TO_1;
00180 m_zoomMapFromLabel [LABEL_ZOOM_2_TO_1_FARTHER] = ZOOM_2_TO_1_FARTHER;
00181 m_zoomMapFromLabel [LABEL_ZOOM_1_TO_1_CLOSER] = ZOOM_1_TO_1_CLOSER;
00182 m_zoomMapFromLabel [LABEL_ZOOM_1_TO_1] = ZOOM_1_TO_1;
00183 m_zoomMapFromLabel [LABEL_ZOOM_1_TO_1_FARTHER] = ZOOM_1_TO_1_FARTHER;
00184 m_zoomMapFromLabel [LABEL_ZOOM_1_TO_2_CLOSER] = ZOOM_1_TO_2_CLOSER;
00185 m_zoomMapFromLabel [LABEL_ZOOM_1_TO_2] = ZOOM_1_TO_2;
00186 m_zoomMapFromLabel [LABEL_ZOOM_1_TO_2_FARTHER] = ZOOM_1_TO_2_FARTHER;
00187 m_zoomMapFromLabel [LABEL_ZOOM_1_TO_4_CLOSER] = ZOOM_1_TO_4_CLOSER;
00188 m_zoomMapFromLabel [LABEL_ZOOM_1_TO_4] = ZOOM_1_TO_4;
00189 m_zoomMapFromLabel [LABEL_ZOOM_1_TO_4_FARTHER] = ZOOM_1_TO_4_FARTHER;
00190 m_zoomMapFromLabel [LABEL_ZOOM_1_TO_8_CLOSER] = ZOOM_1_TO_8_CLOSER;
00191 m_zoomMapFromLabel [LABEL_ZOOM_1_TO_8] = ZOOM_1_TO_8;
00192 m_zoomMapFromLabel [LABEL_ZOOM_1_TO_8_FARTHER] = ZOOM_1_TO_8_FARTHER;
00193 m_zoomMapFromLabel [LABEL_ZOOM_1_TO_16_CLOSER] = ZOOM_1_TO_16_CLOSER;
00194 m_zoomMapFromLabel [LABEL_ZOOM_1_TO_16] = ZOOM_1_TO_16;
00195 m_zoomMapFromLabel [LABEL_ZOOM_FILL] = ZOOM_FILL;
00196 }
00197
00198 void StatusBar::setCoordinates (const QString &coordsScreen,
00199 const QString &coordsGraph,
00200 const QString &resolutionGraph)
00201 {
00202
00203
00204
00205
00206
00207 if (m_cmbUnits->isEnabled ()) {
00208
00209 m_coordsScreen = coordsScreen;
00210 m_coordsGraph = coordsGraph;
00211 m_resolutionGraph = resolutionGraph;
00212
00213 updateCoordsText();
00214 }
00215 }
00216
00217 void StatusBar::setStatusBarMode(StatusBarMode statusBarMode)
00218 {
00219 m_statusBarMode = statusBarMode;
00220 if (m_statusBarMode == STATUS_BAR_MODE_ALWAYS) {
00221 m_statusBar.show();
00222 } else {
00223 m_statusBar.hide();
00224 }
00225 }
00226
00227 void StatusBar::showTemporaryMessage(const QString &message)
00228 {
00229 LOG4CPP_DEBUG_S ((*mainCat)) << "StatusBar::showTemporaryMessage message=" << message.toLatin1 ().data ();
00230
00231 if (m_statusBarMode != STATUS_BAR_MODE_NEVER) {
00232 if (m_statusBarMode == STATUS_BAR_MODE_TEMPORARY) {
00233
00234
00235 m_timer = new QTimer;
00236 connect (m_timer, SIGNAL (timeout ()), this, SLOT (slotTimeout()));
00237 m_timer->setSingleShot(true);
00238 m_timer->start (0);
00239 }
00240 m_statusBar.showMessage (message, TEMPORARY_MESSAGE_LIFETIME);
00241 }
00242 }
00243
00244 void StatusBar::slotComboUnits (const QString &text)
00245 {
00246 LOG4CPP_DEBUG_S ((*mainCat)) << "StatusBar::slotComboUnits text=" << text.toLatin1 ().data ();
00247
00248 updateCoordsText();
00249 }
00250
00251 void StatusBar::slotComboZoom (const QString &text)
00252 {
00253 LOG4CPP_DEBUG_S ((*mainCat)) << "StatusBar::slotComboZoom text=" << text.toLatin1 ().data ();
00254
00255 ENGAUGE_ASSERT (m_zoomMapFromLabel.contains (text));
00256 ZoomFactor zoomFactor = m_zoomMapFromLabel [text];
00257 emit signalZoom (zoomFactor);
00258 }
00259
00260 void StatusBar::slotStatusBarChanged(const QString &message)
00261 {
00262 LOG4CPP_DEBUG_S ((*mainCat)) << "StatusBar::slotStatusBarChanged message=" << message.toLatin1 ().data ();
00263
00264 if (m_statusBarMode == STATUS_BAR_MODE_TEMPORARY) {
00265 m_statusBar.hide();
00266 }
00267 }
00268
00269 void StatusBar::slotTimeout()
00270 {
00271 LOG4CPP_INFO_S ((*mainCat)) << "StatusBar::slotTimeout";
00272
00273 delete m_timer;
00274 m_timer = 0;
00275
00276 m_statusBar.show();
00277 }
00278
00279 void StatusBar::slotZoom(int zoom)
00280 {
00281 LOG4CPP_INFO_S ((*mainCat)) << "StatusBar::slotZoom zoom=" << zoom;
00282
00283
00284 ZoomFactor zoomFactor = (ZoomFactor) zoom;
00285 ENGAUGE_ASSERT (m_zoomMapToLabel.contains (zoomFactor));
00286 m_cmbZoom->setCurrentText (m_zoomMapToLabel [zoomFactor]);
00287 }
00288
00289 void StatusBar::updateCoordsText()
00290 {
00291 if (m_cmbUnits->currentText() == LABEL_COORDS_SCREEN) {
00292 m_editCoords->setText (m_coordsScreen);
00293 } else if (m_cmbUnits->currentText() == LABEL_COORDS_GRAPH) {
00294 m_editCoords->setText (m_coordsGraph);
00295 } else {
00296 m_editCoords->setText (m_resolutionGraph);
00297 }
00298 }
00299
00300 void StatusBar::wakeUp ()
00301 {
00302 if (!m_cmbUnits->isEnabled ()) {
00303
00304
00305 m_cmbZoom->setEnabled (true);
00306 m_cmbUnits->setEnabled (true);
00307 m_editCoords->setEnabled (true);
00308 }
00309 }