00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "indielement.h"
00013 #include "indiproperty.h"
00014 #include "indigroup.h"
00015 #include "indidevice.h"
00016
00017 #include "indi/indicom.h"
00018
00019 #include <qcheckbox.h>
00020 #include <qlabel.h>
00021 #include <qlayout.h>
00022 #include <qstring.h>
00023 #include <qptrlist.h>
00024 #include <qslider.h>
00025 #include <qdir.h>
00026
00027 #include <kurl.h>
00028 #include <kfiledialog.h>
00029 #include <kled.h>
00030 #include <ksqueezedtextlabel.h>
00031 #include <klineedit.h>
00032 #include <kpushbutton.h>
00033 #include <klocale.h>
00034 #include <kdebug.h>
00035 #include <kcombobox.h>
00036 #include <knuminput.h>
00037 #include <kdialogbase.h>
00038
00039
00040
00041
00042 XMLAtt * findAtt (XMLEle *ep, const char *name, char errmsg[])
00043 {
00044 XMLAtt *ap = findXMLAtt (ep, name);
00045 if (ap)
00046 return (ap);
00047 if (errmsg)
00048 snprintf (errmsg, ERRMSG_SIZE, "INDI: <%.64s> missing attribute '%.64s'", tagXMLEle(ep),name);
00049 return NULL;
00050 }
00051
00052
00053
00054
00055 XMLEle * findEle (XMLEle *ep, INDI_P *pp, const char *child, char errmsg[])
00056 {
00057 XMLEle *cp = findXMLEle (ep, child);
00058 if (cp)
00059 return (cp);
00060 if (errmsg)
00061 snprintf (errmsg, ERRMSG_SIZE, "INDI: <%.64s %.64s %.64s> missing child '%.64s'", tagXMLEle(ep),
00062 pp->pg->dp->name.ascii(), pp->name.ascii(), child);
00063 return (NULL);
00064 }
00065
00066
00067
00068
00069 INDI_E::INDI_E(INDI_P *parentProperty, QString inName, QString inLabel)
00070 {
00071 name = inName;
00072 label = inLabel;
00073
00074 pp = parentProperty;
00075
00076 EHBox = new QHBoxLayout(0, 0, KDialog::spacingHint());
00077 label_w = NULL;
00078 read_w = NULL;
00079 write_w = NULL;
00080 spin_w = NULL;
00081 slider_w = NULL;
00082 push_w = NULL;
00083 browse_w = NULL;
00084 check_w = NULL;
00085 led_w = NULL;
00086 hSpacer = NULL;
00087
00088 }
00089
00090 INDI_E::~INDI_E()
00091 {
00092 delete (EHBox);
00093 delete (label_w);
00094 delete (read_w);
00095 delete (write_w);
00096 delete (spin_w);
00097 delete (slider_w);
00098 delete (push_w);
00099 delete (browse_w);
00100 delete (check_w);
00101 delete (led_w);
00102 delete (hSpacer);
00103 }
00104
00105 void INDI_E::setupElementLabel()
00106 {
00107 label_w = new KSqueezedTextLabel(pp->pg->propertyContainer);
00108 label_w->setMinimumWidth(ELEMENT_LABEL_WIDTH);
00109 label_w->setMaximumWidth(ELEMENT_LABEL_WIDTH);
00110 label_w->setFrameShape( KSqueezedTextLabel::Box );
00111 label_w->setPaletteBackgroundColor( QColor( 224, 232, 238 ) );
00112 label_w->setTextFormat( QLabel::RichText );
00113 label_w->setAlignment( int( QLabel::WordBreak | QLabel::AlignCenter ) );
00114
00115 if (label.length() > MAX_LABEL_LENGTH)
00116 {
00117 QFont tempFont( label_w->font() );
00118 tempFont.setPointSize( tempFont.pointSize() - MED_INDI_FONT );
00119 label_w->setFont( tempFont );
00120 }
00121
00122 label_w->setText(label);
00123
00124 EHBox->addWidget(label_w);
00125 }
00126
00127 int INDI_E::buildTextGUI(QString initText)
00128 {
00129
00130 setupElementLabel();
00131
00132 text = initText;
00133
00134 switch (pp->perm)
00135 {
00136 case PP_RW:
00137 setupElementRead(ELEMENT_READ_WIDTH);
00138 setupElementWrite(ELEMENT_WRITE_WIDTH);
00139
00140 break;
00141
00142 case PP_RO:
00143 setupElementRead(ELEMENT_FULL_WIDTH);
00144 break;
00145
00146 case PP_WO:
00147 setupElementWrite(ELEMENT_FULL_WIDTH);
00148 break;
00149 }
00150
00151 pp->PVBox->addLayout(EHBox);
00152 return (0);
00153
00154 }
00155
00156 int INDI_E::buildBLOBGUI()
00157 {
00158
00159 setupElementLabel();
00160
00161 text = "INDI DATA STREAM";
00162
00163 switch (pp->perm)
00164 {
00165 case PP_RW:
00166 setupElementRead(ELEMENT_READ_WIDTH);
00167 setupElementWrite(ELEMENT_WRITE_WIDTH);
00168 setupBrowseButton();
00169
00170 break;
00171
00172 case PP_RO:
00173 setupElementRead(ELEMENT_FULL_WIDTH);
00174 break;
00175
00176 case PP_WO:
00177 setupElementWrite(ELEMENT_FULL_WIDTH);
00178 setupBrowseButton();
00179 break;
00180 }
00181
00182 pp->PVBox->addLayout(EHBox);
00183 return (0);
00184
00185 }
00186
00187 int INDI_E::buildNumberGUI (double initValue)
00188 {
00189 bool scale = false;
00190
00191 updateValue(initValue);
00192 setupElementLabel();
00193
00194 if (step != 0 && (max - min)/step <= MAXSCSTEPS)
00195 scale = true;
00196
00197 switch (pp->perm)
00198 {
00199 case PP_RW:
00200 setupElementRead(ELEMENT_READ_WIDTH);
00201 if (scale)
00202 setupElementScale(ELEMENT_WRITE_WIDTH);
00203 else
00204 setupElementWrite(ELEMENT_WRITE_WIDTH);
00205
00206 pp->PVBox->addLayout(EHBox);
00207 break;
00208
00209 case PP_RO:
00210 setupElementRead(ELEMENT_READ_WIDTH);
00211 pp->PVBox->addLayout(EHBox);
00212 break;
00213
00214 case PP_WO:
00215 if (scale)
00216 setupElementScale(ELEMENT_FULL_WIDTH);
00217 else
00218 setupElementWrite(ELEMENT_FULL_WIDTH);
00219
00220 pp->PVBox->addLayout(EHBox);
00221
00222 break;
00223 }
00224
00225 return (0);
00226
00227 }
00228
00229 int INDI_E::buildLightGUI()
00230 {
00231
00232 led_w = new KLed (pp->pg->propertyContainer);
00233 led_w->setMaximumSize(16,16);
00234 led_w->setLook( KLed::Sunken );
00235 drawLt();
00236
00237 EHBox->addWidget(led_w);
00238
00239 setupElementLabel();
00240
00241 pp->PVBox->addLayout(EHBox);
00242
00243 return (0);
00244 }
00245
00246 void INDI_E::drawLt()
00247 {
00248
00249 switch (state)
00250 {
00251 case PS_IDLE:
00252 led_w->setColor(Qt::gray);
00253 break;
00254
00255 case PS_OK:
00256 led_w->setColor(Qt::green);
00257 break;
00258
00259 case PS_BUSY:
00260 led_w->setColor(Qt::yellow);
00261 break;
00262
00263 case PS_ALERT:
00264 led_w->setColor(Qt::red);
00265 break;
00266
00267 default:
00268 break;
00269
00270 }
00271 }
00272
00273
00274 void INDI_E::updateValue(double newValue)
00275 {
00276 char iNumber[32];
00277
00278 value = newValue;
00279
00280 numberFormat(iNumber, format.ascii(), value);
00281 text = iNumber;
00282
00283 }
00284
00285 void INDI_E::setupElementScale(int length)
00286 {
00287
00288 int steps = (int) ((max - min) / step);
00289 spin_w = new KDoubleSpinBox(min, max, step, value, 2, pp->pg->propertyContainer );
00290 slider_w = new QSlider(0, steps, 1, (int) ((value - min) / step), Qt::Horizontal, pp->pg->propertyContainer );
00291
00292 connect(spin_w, SIGNAL(valueChanged(double)), this, SLOT(spinChanged(double )));
00293 connect(slider_w, SIGNAL(sliderMoved(int)), this, SLOT(sliderChanged(int )));
00294
00295
00296
00297 if (length == ELEMENT_FULL_WIDTH)
00298 spin_w->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, spin_w->sizePolicy().hasHeightForWidth() ) );
00299 else
00300 spin_w->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, spin_w->sizePolicy().hasHeightForWidth() ) );
00301
00302 spin_w->setMinimumWidth( (int) (length * 0.45) );
00303 slider_w->setMinimumWidth( (int) (length * 0.55) );
00304
00305 EHBox->addWidget(slider_w);
00306 EHBox->addWidget(spin_w);
00307 }
00308
00309 void INDI_E::spinChanged(double value)
00310 {
00311 int slider_value = (int) ((value - min) / step);
00312 slider_w->setValue(slider_value);
00313 }
00314
00315 void INDI_E::sliderChanged(int value)
00316 {
00317
00318 double spin_value = (value * step) + min;
00319 spin_w->setValue(spin_value);
00320
00321 }
00322
00323 void INDI_E::setMin (double inMin)
00324 {
00325 min = inMin;
00326 if (spin_w)
00327 {
00328 spin_w->setMinValue(min);
00329 spin_w->setValue(value);
00330 }
00331 if (slider_w)
00332 {
00333 slider_w->setMaxValue((int) ((max - min) / step));
00334 slider_w->setMinValue(0);
00335 slider_w->setPageStep(1);
00336 slider_w->setValue( (int) ((value - min) / step ));
00337 }
00338
00339 }
00340
00341 void INDI_E::setMax (double inMax)
00342 {
00343 max = inMax;
00344 if (spin_w)
00345 {
00346 spin_w->setMaxValue(max);
00347 spin_w->setValue(value);
00348 }
00349 if (slider_w)
00350 {
00351 slider_w->setMaxValue((int) ((max - min) / step));
00352 slider_w->setMinValue(0);
00353 slider_w->setPageStep(1);
00354 slider_w->setValue( (int) ((value - min) / step ));
00355 }
00356
00357 }
00358
00359 void INDI_E::setupElementWrite(int length)
00360 {
00361 write_w = new KLineEdit( pp->pg->propertyContainer);
00362 write_w->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)0, (QSizePolicy::SizeType)0, 0, 0, write_w->sizePolicy().hasHeightForWidth() ));
00363 write_w->setMinimumWidth( length );
00364 write_w->setMaximumWidth( length);
00365
00366 QObject::connect(write_w, SIGNAL(returnPressed()), pp, SLOT(newText()));
00367 EHBox->addWidget(write_w);
00368 }
00369
00370
00371 void INDI_E::setupElementRead(int length)
00372 {
00373
00374 read_w = new KLineEdit( pp->pg->propertyContainer );
00375 read_w->setMinimumWidth( length );
00376 read_w->setFocusPolicy( KLineEdit::NoFocus );
00377 read_w->setFrameShape( KLineEdit::GroupBoxPanel );
00378 read_w->setFrameShadow( KLineEdit::Plain );
00379 read_w->setCursorPosition( 0 );
00380 read_w->setAlignment( int( KLineEdit::AlignHCenter ) );
00381 read_w->setReadOnly( TRUE );
00382 read_w->setText(text);
00383
00384 EHBox->addWidget(read_w);
00385
00386 }
00387
00388 void INDI_E::setupBrowseButton()
00389 {
00390 browse_w = new KPushButton("...", pp->pg->propertyContainer);
00391 browse_w->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)5, (QSizePolicy::SizeType)0, 0, 0, browse_w->sizePolicy().hasHeightForWidth() ) );
00392 browse_w->setMinimumWidth( MIN_SET_WIDTH );
00393 browse_w->setMaximumWidth( MAX_SET_WIDTH );
00394
00395 EHBox->addWidget(browse_w);
00396 QObject::connect(browse_w, SIGNAL(clicked()), this, SLOT(browseBlob()));
00397 }
00398
00399
00400 void INDI_E::initNumberValues(double newMin, double newMax, double newStep, char * newFormat)
00401 {
00402 min = newMin;
00403 max = newMax;
00404 step = newStep;
00405 format = newFormat;
00406 }
00407
00408 void INDI_E::browseBlob()
00409 {
00410
00411 KURL currentURL;
00412
00413 currentURL = KFileDialog::getOpenURL( QDir::homeDirPath(), "*");
00414
00415
00416 if (currentURL.isEmpty())
00417 return;
00418
00419 if ( currentURL.isValid() )
00420 write_w->setText(currentURL.path());
00421
00422 }
00423
00424
00425 #include "indielement.moc"