00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <iostream>
00029 #include "pcs.h"
00030 #include "xsmdebug.h"
00031 #include "gtkspinbuttonsci.h"
00032
00033 #define EC_INF 1e133
00034
00035 GtkTooltips *remote_pcs_tips = NULL;
00036
00037 int total_message_count = 0;
00038 int total_message_count_int = 0;
00039
00040 Param_Control::Param_Control(UnitObj *U, char *W, double *V, double VMi, double VMa, char *p){
00041 unit = U;
00042 warning = W ? g_strdup(W) : NULL;
00043 Dval = V; Ival=0; ULval=0; Sval=0;
00044 setMin (VMi);
00045 setMax (VMa);
00046 prec = g_strdup(p);
00047 Init();
00048 }
00049
00050 Param_Control::Param_Control(UnitObj *U, char *W, unsigned long *V, double VMi, double VMa, char *p){
00051 unit = U;
00052 warning = W ? g_strdup(W) : NULL;
00053 ULval = V; Ival=0; Dval=0; Sval=0;
00054 setMin (VMi);
00055 setMax (VMa);
00056 prec = g_strdup(p);
00057 Init();
00058 }
00059
00060 Param_Control::Param_Control(UnitObj *U, char *W, int *V, double VMi, double VMa, char *p){
00061 unit = U;
00062 warning = W ? g_strdup(W) : NULL;
00063 Ival = V; ULval=0; Dval=0; Sval=0;
00064 setMin (VMi);
00065 setMax (VMa);
00066 prec = g_strdup(p);
00067 Init();
00068 }
00069
00070 Param_Control::Param_Control(UnitObj *U, char *W, short *V, double VMi, double VMa, char *p){
00071 unit = U;
00072 warning = W ? g_strdup(W) : NULL;
00073 Sval = V; ULval=0; Ival=0; Dval=0;
00074 setMin (VMi);
00075 setMax (VMa);
00076 prec = g_strdup(p);
00077 Init();
00078 }
00079
00080 Param_Control::~Param_Control(){
00081 if (warning)
00082 g_free (warning);
00083 g_free(prec);
00084 if (refname)
00085 g_free (refname);
00086 if (info)
00087 g_free (info);
00088 }
00089
00090 void Param_Control::Val(double *V){
00091 Dval = V; Ival=0; Sval=0;
00092 }
00093
00094 void Param_Control::Val(int *V){
00095 Ival = V; Dval=0; Sval=0;
00096 }
00097
00098 void Param_Control::Val(unsigned long *V){
00099 ULval=V; Ival = 0; Dval=0; Sval=0;
00100 }
00101
00102 void Param_Control::Val(short *V){
00103 Sval = V; Ival=0; Dval=0;
00104 }
00105
00106 void Param_Control::setMax(double VMa, double Vmax_warn){
00107 vMax = VMa;
00108 vMax_warn = Vmax_warn;
00109 update_limits ();
00110 }
00111
00112 void Param_Control::setMin(double VMi, double Vmin_warn){
00113 vMin = VMi;
00114 vMin_warn = Vmin_warn;
00115 update_limits ();
00116 }
00117
00118 void Param_Control::set_exclude(double V_ex_lo, double V_ex_hi){
00119 v_ex_lo = V_ex_lo;
00120 v_ex_hi = V_ex_hi;
00121 update_limits ();
00122 }
00123
00124 void Param_Control::set_info (gchar* Info){
00125 if (info)
00126 g_free (info);
00127 info = NULL;
00128 if (Info)
00129 info = g_strdup (Info);
00130 }
00131
00132 void Param_Control::Prec(char *p){
00133 g_free(prec);
00134 prec = g_strdup(p);
00135 }
00136
00137 gint Param_Control::ShowMessage(char *txt, char *options, gint default_choice){
00138 XSM_DEBUG(DBG_L2, txt );
00139
00140 if (options)
00141 XSM_DEBUG(DBG_L2, options );
00142
00143 return default_choice;
00144 }
00145
00146 void Param_Control::Put_Value(){
00147 char txt[64];
00148 Get_UsrString(txt);
00149 XSM_DEBUG(DBG_L2, txt );
00150 }
00151
00152 double Param_Control::Get_dValue(){
00153 if(Dval)
00154 return *Dval;
00155 else
00156 if(Ival)
00157 return (double)*Ival;
00158 else
00159 if(Sval)
00160 return (double)*Sval;
00161 else
00162 if(ULval)
00163 return (double)*ULval;
00164 return 0.;
00165 }
00166
00167 gchar *Param_Control::Get_UsrString(){
00168 gchar *fmt = g_strdup_printf("%%%s %s %s", prec, unit->Symbol(), info?info:" ");
00169 gchar *txt;
00170 txt = g_strdup_printf(fmt, unit->Base2Usr(Get_dValue()));
00171 g_free(fmt);
00172 return txt;
00173 }
00174
00175 void Param_Control::Get_UsrString(char *txt){
00176 gchar *fmt = g_strdup_printf("%%%s %s %s", prec, unit->Symbol(), info?info:" ");
00177 sprintf(txt, fmt, unit->Base2Usr(Get_dValue()));
00178 g_free(fmt);
00179 }
00180
00181 void Param_Control::Set_FromValue(double nVal){
00182 if(nVal <= vMax && nVal >= vMin){
00183 if(nVal >= vMax_warn || nVal <= vMin_warn){
00184 if (ShowMessage ("Value is outside of WARNING limits!", "Force|Cancel", 0)){
00185 Put_Value ();
00186 return;
00187 }
00188 }
00189
00190 if(nVal >= v_ex_lo && nVal <= v_ex_hi){
00191 if (ShowMessage ("Value is within EXCLUDE range!", "Force|Cancel", 0) == 0){
00192 Put_Value ();
00193 return;
00194 }
00195 }
00196
00197 if(Dval)
00198 *Dval = nVal;
00199 else
00200 if(Ival)
00201 *Ival = (int)nVal;
00202 else
00203 if(Sval)
00204 *Sval = (short)nVal;
00205 else
00206 if(ULval)
00207 *ULval = (unsigned long)nVal;
00208 }
00209 else{
00210 gchar *ref = g_strconcat("[",refname ? refname:" ","]",NULL);
00211 gchar *txt = g_strdup_printf("%s %s: %g ... %g %s",
00212 MLD_VALID_RANGE,
00213 ref,
00214 unit->Base2Usr(vMin),
00215 unit->Base2Usr(vMax),
00216 unit->Symbol());
00217
00218 if (warning)
00219 ShowMessage(txt);
00220 else
00221 g_print (txt);
00222
00223 g_free(txt);
00224 g_free(ref);
00225 }
00226 Put_Value();
00227 }
00228
00229 void Param_Control::Set_Parameter(double value, int flg, int usr2base){
00230 char ctxt[64];
00231 if(flg){
00232 if(usr2base)
00233 Set_FromValue(unit->Usr2Base(value));
00234 else
00235 Set_FromValue(value);
00236 }else{
00237 Get_UsrString(ctxt);
00238 XSM_DEBUG(DBG_L2, "Set Value [" << ctxt << "] = " );
00239 std::cin >> ctxt;
00240 Set_FromValue(unit->Usr2Base(atof(ctxt)));
00241 }
00242 if(ChangeNoticeFkt)
00243 (*ChangeNoticeFkt)(this, FktData);
00244 }
00245
00246 void Gtk_EntryControl::adjustment_callback(GtkAdjustment *adj, Gtk_EntryControl *gpcs){
00247
00248 if (!adj) return;
00249
00250
00251
00252
00253
00254
00255 gpcs->Set_Parameter(adj->value, TRUE);
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276 }
00277
00278
00279 gint Gtk_EntryControl::ShowMessage(char *txt, char *options, gint default_choice){
00280 if (!txt)
00281 return 0;
00282
00283 ++total_message_count_int;
00284 if (++total_message_count > 6){
00285 std::cerr << "[" << total_message_count_int << "] Repeted Messag(es), popup blocked: " << txt << std::endl;
00286 --total_message_count;
00287 return 0;
00288 }
00289
00290
00291 if (options){
00292 GtkWidget *label = gtk_label_new (_(txt));
00293 gtk_widget_show (label);
00294
00295 GtkWidget *dialog = gtk_dialog_new_with_buttons (_("Please confirm!"),
00296 NULL,
00297 (GtkDialogFlags)(GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT),
00298 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
00299 GTK_STOCK_CANCEL, default_choice,
00300 NULL);
00301
00302 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
00303 label, TRUE, TRUE, GNOME_PAD);
00304
00305 gint result = gtk_dialog_run (GTK_DIALOG (dialog));
00306 gtk_widget_destroy (dialog);
00307
00308 --total_message_count;
00309 return result;
00310 } else {
00311 GtkWidget *dialog = gtk_message_dialog_new (NULL,
00312 GTK_DIALOG_DESTROY_WITH_PARENT,
00313 GTK_MESSAGE_INFO,
00314 GTK_BUTTONS_CLOSE,
00315 txt);
00316
00317 g_signal_connect_swapped (GTK_OBJECT (dialog), "response",
00318 G_CALLBACK (gtk_widget_destroy),
00319 GTK_OBJECT (dialog));
00320 gtk_widget_show (dialog);
00321
00322 --total_message_count;
00323 return default_choice;
00324 }
00325
00326 return -1;
00327 }
00328
00329 GtkWidget* make_edit (const gchar* labeltxt, GtkBox* vbox){
00330 GtkWidget *label, *entry, *hbox;
00331
00332 hbox = gtk_hbox_new (FALSE, 0);
00333 gtk_widget_show (hbox);
00334 gtk_container_add (GTK_CONTAINER (vbox), hbox);
00335
00336 label = gtk_label_new (labeltxt);
00337 gtk_widget_show (label);
00338 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, GNOME_PAD);
00339
00340 gtk_widget_set_size_request (label, 150, -1);
00341 gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_RIGHT);
00342
00343 entry = gtk_entry_new ();
00344 gtk_widget_set_size_request (entry, 100, -1);
00345 gtk_widget_show (entry);
00346 gtk_container_add (GTK_CONTAINER (hbox), entry);
00347
00348 return entry;
00349 }
00350
00351
00352 void Gtk_EntryControl::pcs_adjustment_configure (){
00353 if (! gtk_object_get_data( GTK_OBJECT (entry), "Adjustment_PCS_Name"))
00354 return;
00355
00356 get_pcs_configuartion ();
00357 gchar *tmp = g_strconcat (_("Info:"\
00358 "\nYou can also use the gconf-editor to modify"\
00359 "\nthis settings, the gconf path is:"),
00360 "\n /apps/gxsm2/Adjustments/",
00361 (gchar*) gtk_object_get_data( GTK_OBJECT (entry),
00362 "Adjustment_PCS_Name"),
00363 NULL);
00364
00365 GtkWidget *label = gtk_label_new (tmp);
00366 gtk_widget_show (label);
00367 g_free (tmp);
00368
00369 tmp = g_strconcat (_("Configure"),
00370 " ",
00371 (gchar*) gtk_object_get_data( GTK_OBJECT (entry),
00372 "Adjustment_PCS_Name"),
00373 NULL);
00374
00375 GtkWidget *dialog = gtk_dialog_new_with_buttons (tmp,
00376 NULL,
00377 (GtkDialogFlags)(GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT),
00378 GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
00379 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
00380 NULL);
00381 g_free (tmp); tmp=NULL;
00382
00383 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), label, TRUE, TRUE, GNOME_PAD);
00384 GtkWidget *input;
00385 Gtk_EntryControl *ec;
00386
00387 gchar *msg = NULL;
00388
00389 input = make_edit (_("Upper Limit"), GTK_BOX(GTK_DIALOG(dialog)->vbox));
00390 ec = new Gtk_EntryControl (unit, msg, &vMax, -EC_INF, EC_INF, prec, input);
00391 input = make_edit (_("Upper Warn"), GTK_BOX(GTK_DIALOG(dialog)->vbox));
00392 ec = new Gtk_EntryControl (unit, msg, &vMax_warn, -EC_INF, EC_INF, prec, input);
00393 input = make_edit (_("Lower Warn"), GTK_BOX(GTK_DIALOG(dialog)->vbox));
00394 ec = new Gtk_EntryControl (unit, msg, &vMin_warn, -EC_INF, EC_INF, prec, input);
00395 input = make_edit (_("Lower Limit"), GTK_BOX(GTK_DIALOG(dialog)->vbox));
00396 ec = new Gtk_EntryControl (unit, msg, &vMin, -EC_INF, EC_INF, prec, input);
00397
00398 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_hseparator_new (), TRUE, TRUE, GNOME_PAD);
00399
00400 input = make_edit (_("Exclude Hi"), GTK_BOX(GTK_DIALOG(dialog)->vbox));
00401 ec = new Gtk_EntryControl (unit, msg, &v_ex_hi, -EC_INF, EC_INF, prec, input);
00402 input = make_edit (_("Exclude Lo"), GTK_BOX(GTK_DIALOG(dialog)->vbox));
00403 ec = new Gtk_EntryControl (unit, msg, &v_ex_lo, -EC_INF, EC_INF, prec, input);
00404
00405 gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), gtk_hseparator_new (), TRUE, TRUE, GNOME_PAD);
00406
00407 input = make_edit (_("Step [B1]"), GTK_BOX(GTK_DIALOG(dialog)->vbox));
00408 ec = new Gtk_EntryControl (unit, msg, &step, -EC_INF, EC_INF, prec, input);
00409 input = make_edit (_("Page [B2]"), GTK_BOX(GTK_DIALOG(dialog)->vbox));
00410 ec = new Gtk_EntryControl (unit, msg, &page, -EC_INF, EC_INF, prec, input);
00411 input = make_edit (_("Pg10 [B3]"), GTK_BOX(GTK_DIALOG(dialog)->vbox));
00412 ec = new Gtk_EntryControl (unit, msg, &page10, -EC_INF, EC_INF, prec, input);
00413
00414 UnitObj *unity = new UnitObj(" "," ");
00415 input = make_edit (_("Progressive"), GTK_BOX(GTK_DIALOG(dialog)->vbox));
00416 ec = new Gtk_EntryControl (unity, msg, &progressive, 0., 1., "g", input);
00417
00418 gint result = gtk_dialog_run (GTK_DIALOG (dialog));
00419
00420 gtk_widget_destroy (dialog);
00421 delete unity;
00422
00423 if (result == GTK_RESPONSE_ACCEPT)
00424 put_pcs_configuartion ();
00425 }
00426
00427 #define XRM_GET_WD(L, V) tdv = g_strdup_printf ("%g", V); xrm.Get (L, &V, tdv); g_free (tdv)
00428
00429 void Gtk_EntryControl::get_pcs_configuartion (){
00430 XSM_DEBUG (DBG_L2, "GET-PCS-ADJ:\n");
00431 if (! gtk_object_get_data( GTK_OBJECT (entry), "Adjustment_PCS_Name"))
00432 return;
00433
00434 gchar *tdv=NULL;
00435 XsmRescourceManager xrm("Adjustments",
00436 (gchar*)gtk_object_get_data( GTK_OBJECT (entry),
00437 "Adjustment_PCS_Name"));
00438
00439 XSM_DEBUG(DBG_L2, ((gchar*)gtk_object_get_data( GTK_OBJECT (entry), "Adjustment_PCS_Name")));
00440
00441 XRM_GET_WD ("upper_limit", vMax);
00442 XRM_GET_WD ("upper_warn", vMax_warn);
00443 XRM_GET_WD ("lower_warn", vMin_warn);
00444 XRM_GET_WD ("lower_limit", vMin);
00445 XRM_GET_WD ("exclude_hi", v_ex_hi);
00446 XRM_GET_WD ("exclude_lo", v_ex_lo);
00447 XRM_GET_WD ("step", step);
00448 XRM_GET_WD ("page", page);
00449 XRM_GET_WD ("page10", page10);
00450 XRM_GET_WD ("progressive", progressive);
00451 }
00452
00453 #define XRM_PUT_WD(L, V) xrm.Put (L, V);
00454
00455 void Gtk_EntryControl::put_pcs_configuartion (){
00456 XSM_DEBUG(DBG_L2, "PUT-PCS-ADJ:\n");
00457 if (! gtk_object_get_data( GTK_OBJECT (entry), "Adjustment_PCS_Name"))
00458 return;
00459
00460 XsmRescourceManager xrm("Adjustments",
00461 (gchar*)gtk_object_get_data( GTK_OBJECT (entry),
00462 "Adjustment_PCS_Name"));
00463
00464 XSM_DEBUG(DBG_L2, ((gchar*)gtk_object_get_data( GTK_OBJECT (entry), "Adjustment_PCS_Name")));
00465
00466 XRM_PUT_WD ("upper_limit", vMax);
00467 XRM_PUT_WD ("upper_warn", vMax_warn);
00468 XRM_PUT_WD ("lower_warn", vMin_warn);
00469 XRM_PUT_WD ("lower_limit", vMin);
00470 XRM_PUT_WD ("exclude_hi", v_ex_hi);
00471 XRM_PUT_WD ("exclude_lo", v_ex_lo);
00472 XRM_PUT_WD ("step", step);
00473 XRM_PUT_WD ("page", page);
00474 XRM_PUT_WD ("page10", page10);
00475 XRM_PUT_WD ("progressive", progressive);
00476
00477 if (GTK_IS_SPIN_BUTTON_SCI (entry)){
00478 gtk_spin_button_sci_configure (GTK_SPIN_BUTTON_SCI (entry),
00479 GTK_ADJUSTMENT (adj), progressive, 0);
00480 gtk_spin_button_sci_set_increments (GTK_SPIN_BUTTON_SCI (entry),
00481 step, page);
00482 }
00483 if (adj){
00484 GTK_ADJUSTMENT (adj) -> upper = vMax;
00485 GTK_ADJUSTMENT (adj) -> lower = vMin;
00486 gtk_adjustment_changed (GTK_ADJUSTMENT (adj));
00487 }
00488 }
00489
00490 static gint
00491 ec_gtk_spin_button_sci_output (GtkSpinbuttonsci *spin_button_sci)
00492 {
00493 gchar *buf = ((Gtk_EntryControl *)gtk_object_get_data( GTK_OBJECT (spin_button_sci), "Gtk_EntryControl"))->Get_UsrString();
00494 if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button_sci))))
00495 gtk_entry_set_text (GTK_ENTRY (spin_button_sci), buf);
00496 g_free (buf);
00497 return TRUE;
00498 }
00499
00500 static gint
00501 ec_gtk_spin_button_sci_input (GtkSpinbuttonsci *spin_button_sci,
00502 gdouble *new_val)
00503 {
00504 gchar *err = NULL;
00505 *new_val = g_strtod (gtk_entry_get_text (GTK_ENTRY (spin_button_sci)), &err);
00506 *new_val = (gdouble)(((Gtk_EntryControl *)gtk_object_get_data( GTK_OBJECT (spin_button_sci), "Gtk_EntryControl"))->Convert2Base (*new_val));
00507
00508 if (*err)
00509 return GTK_INPUT_ERROR;
00510 else
00511 return FALSE;
00512 }
00513
00514 static void
00515 ec_pcs_adjustment_configure (GtkWidget *menuitem, Gtk_EntryControl *gpcs){
00516 gpcs->pcs_adjustment_configure ();
00517 }
00518
00519
00520 static void
00521 ec_pcs_populate_popup (GtkEntry *entry, GtkMenu *menu, Gtk_EntryControl* gpcs){
00522 GtkWidget *menuitem;
00523
00524 menuitem = gtk_separator_menu_item_new ();
00525 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
00526 gtk_widget_show (menuitem);
00527
00528 gchar *cfg_label = g_strconcat (_("Configure"),
00529 " ",
00530 gtk_object_get_data( GTK_OBJECT (entry),
00531 "Adjustment_PCS_Name"),
00532 NULL);
00533
00534 menuitem = gtk_menu_item_new_with_label (cfg_label);
00535 g_signal_connect (menuitem, "activate",
00536 G_CALLBACK (ec_pcs_adjustment_configure), gpcs);
00537
00538 gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem);
00539 gtk_widget_show (menuitem);
00540 }
00541
00542 void Gtk_EntryControl::InitRegisterCb(double AdjStep, double AdjPage, double AdjProg){
00543 adj=NULL;
00544 enable_client = TRUE;
00545
00546 page10 = 10.*AdjPage;
00547 page = AdjPage;
00548 step = AdjStep;
00549 progressive = AdjProg;
00550
00551 if (GTK_IS_SPIN_BUTTON_SCI (entry)){
00552 XSM_DEBUG (DBG_L2, "Entry is GTK_IS_SPIN_BUTTON_SCI, retrieving PCS adj configuration.\n");
00553 get_pcs_configuartion ();
00554 }
00555
00556 Put_Value();
00557
00558 gtk_object_set_data( GTK_OBJECT (entry), "Gtk_EntryControl", this);
00559 gtk_signal_connect (GTK_OBJECT (entry), "activate",
00560 GTK_SIGNAL_FUNC (&Gtk_EntryControl::update_callback),
00561 (gpointer) NULL);
00562 gtk_signal_connect (GTK_OBJECT (entry), "focus_out_event",
00563 GTK_SIGNAL_FUNC (&Gtk_EntryControl::update_callback),
00564 (gpointer) NULL);
00565
00566 if(AdjStep){
00567 gtk_signal_connect (GTK_OBJECT (entry), "populate_popup",
00568 GTK_SIGNAL_FUNC (&ec_pcs_populate_popup),
00569 (gpointer) this);
00570
00571 adj = gtk_adjustment_new( Get_dValue (), vMin, vMax, step, page, 0);
00572 gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
00573 GTK_SIGNAL_FUNC (Gtk_EntryControl::adjustment_callback), this);
00574
00575 if (GTK_IS_SPIN_BUTTON_SCI (entry)){
00576 gtk_signal_connect (GTK_OBJECT (entry), "output",
00577 GTK_SIGNAL_FUNC (&ec_gtk_spin_button_sci_output),
00578 (gpointer) NULL);
00579 gtk_signal_connect (GTK_OBJECT (entry), "input",
00580 GTK_SIGNAL_FUNC (&ec_gtk_spin_button_sci_input),
00581 (gpointer) NULL);
00582 gtk_spin_button_sci_configure (GTK_SPIN_BUTTON_SCI (entry),
00583 GTK_ADJUSTMENT (adj), progressive, 0);
00584 }
00585 }
00586 }
00587
00588 GSList *Gtk_EntryControl::AddEntry2RemoteList(gchar *RefName, GSList *remotelist){
00589 gchar *help;
00590 if(refname)
00591 g_free (refname);
00592 refname = g_strdup(RefName);
00593
00594 if (!remote_pcs_tips){
00595 remote_pcs_tips = gtk_tooltips_new ();
00596 gtk_tooltips_disable (remote_pcs_tips);
00597 }
00598
00599 help = g_strconcat ("Remote example: set (\"", refname, "\", \"12.3\")\n", NULL);
00600 gtk_tooltips_set_tip (GTK_TOOLTIPS (remote_pcs_tips), entry, refname, help);
00601
00602 return g_slist_prepend(remotelist, this);
00603 }