app_spm.C

Go to the documentation of this file.
00001 /* Gxsm - Gnome X Scanning Microscopy
00002  * universal STM/AFM/SARLS/SPALEED/... controlling and
00003  * data analysis software
00004  * 
00005  * Copyright (C) 1999,2000,2001,2002,2003 Percy Zahl
00006  *
00007  * Authors: Percy Zahl <zahl@users.sf.net>
00008  * additional features: Andreas Klust <klust@users.sf.net>
00009  * WWW Home: http://gxsm.sf.net
00010  *
00011  * This program is free software; you can redistribute it and/or modify
00012  * it under the terms of the GNU General Public License as published by
00013  * the Free Software Foundation; either version 2 of the License, or
00014  * (at your option) any later version.
00015  *
00016  * This program is distributed in the hope that it will be useful,
00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019  * GNU General Public License for more details.
00020  *
00021  * You should have received a copy of the GNU General Public License
00022  * along with this program; if not, write to the Free Software
00023  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
00024  */
00025 
00026 /* -*- Mode: C++; indent-tabs-mode: nil; c-basic-offset: 8 c-style: "K&R" -*- */
00027 
00028 #include <locale.h>
00029 #include <libintl.h>
00030 
00031 
00032 #include "gxsm_app.h"
00033 
00034 #include "unit.h"
00035 #include "pcs.h"
00036 #include "xsmtypes.h"
00037 #include <gtk/gtk.h>
00038 #include "glbvars.h"
00039 
00040 #include "gtkspinbuttonsci.h"
00041 
00042 void callback_view( GtkWidget *widget, gpointer data ){
00043         XSM_DEBUG(DBG_L3, "cb_view");
00044         if (gapp && GTK_TOGGLE_BUTTON (widget)->active) 
00045                 gapp->xsm->SetVM((long)data);
00046 }
00047 
00048 void cbtext( GtkEditable *widget, App *ap ){
00049         XSM_DEBUG(DBG_L3, "ui.comment changed!!");
00050         ap->ui_setcomment();
00051 }
00052 
00053 void cbbasename( GtkWidget *widget, App *ap ){
00054         ap->as_setdata();
00055 }
00056 
00057 void cb_display_changed( Param_Control* pcs, void *ap ){
00058         XSM_DEBUG(DBG_L3, "cb_display_changed");
00059         ((App*)ap)->xsm->SetVM();
00060 }
00061 
00062 void cb_display_changed_hilo( Param_Control* pcs, void *ap ){
00063         XSM_DEBUG(DBG_L3, "cb_display_changed_hilo");
00064         Scan *sc;
00065         if( (sc=((App*)ap)->xsm->ActiveScan) )
00066                 ((App*)ap)->xsm->AutoDisplay( ((App*)ap)->xsm->data.display.GetCntHigh(),
00067                                               ((App*)ap)->xsm->data.display.GetCntLow()
00068                         );
00069 }
00070 
00071 void cb_setmode( GtkWidget *widget, int data ){
00072         XSM_DEBUG(DBG_L3, "cb_setmode");
00073         if (GTK_TOGGLE_BUTTON (widget)->active) 
00074                 gapp->xsm->SetModeFlg(data);
00075         else
00076                 gapp->xsm->ClrModeFlg(data);
00077         
00078         if(IS_SPALEED_CTRL){
00079                 gapp->spa_mode_switch_check();
00080                 gapp->spa_SeV_unit_switch_check();
00081                 gapp->spm_update_all();
00082         }
00083 }
00084 
00085 GtkWidget* App::create_control (){
00086         GtkWidget *vbox;
00087         vbox = gtk_vbox_new (FALSE, 0);
00088         gtk_container_border_width (GTK_CONTAINER (vbox), BorderWidth);
00089         gtk_widget_show (vbox);
00090         return(vbox);
00091 }
00092 
00093 void App::spm_range_check(Param_Control* pcs, gpointer app){
00094         App* a = (App*)app;
00095         XSM_DEBUG(DBG_L3,  "range check" );
00096         XSM_Instrument *Inst = a->xsm->Inst;
00097         SCAN_DATA *data = &(a->xsm->data);
00098         
00099         if(IS_SPALEED_CTRL){
00100                 // always calc steps
00101                 data->s.dx = data->s.rx/(data->s.nx-1);
00102                 // force dx==dy
00103                 if(0){
00104                         data->s.dy = data->s.ry/(data->s.ny-1);
00105                         data->s.ry = data->s.dy*(data->s.ny-1);
00106                 }else{
00107                         // alway range from points and dx if ry!=0
00108                         if(data->s.ry > 0.){
00109                                 data->s.dy = data->s.dx;
00110                                 data->s.ry = (data->s.ny-1)*data->s.dy;
00111                         }else{
00112                                 data->s.dy = 0.;
00113                                 data->s.ry = 0.;
00114                         }
00115                         
00116                 }
00117         }else{
00118                 if(a->xsm->IsMode(MODE_SETPOINTS)){
00119                         // Points from Range & dx
00120                         data->s.nx = 1 + R2INT(data->s.rx/data->s.dx);
00121                         data->s.dx = MAX(1,R2INT(data->s.dx/Inst->XResolution()))*Inst->XResolution();
00122                         data->s.rx = (data->s.nx-1) * data->s.dx;
00123                         
00124                         if(data->s.dy>=Inst->YResolution()/2.){ // allow dy = 0 for special purposes ...
00125                                 data->s.ny = 1 + R2INT(data->s.ry/data->s.dy);
00126                                 data->s.dy = MAX(1,R2INT(data->s.dy/Inst->YResolution()))*Inst->YResolution();
00127                                 data->s.ry = (data->s.ny-1) * data->s.dy;
00128                         }
00129                 }else
00130                         if(a->xsm->IsMode(MODE_SETSTEPS)){
00131                                 // dx from Range & Points
00132                                 XSM_DEBUG(DBG_L3,  "fixpoints" );
00133                                 data->s.dx = data->s.rx/(data->s.nx-1);
00134                                 data->s.dx = MAX(1,R2INT(data->s.dx/Inst->XResolution()))*Inst->XResolution();
00135                                 data->s.rx = (data->s.nx-1) * data->s.dx;
00136                                 
00137                                 data->s.dy = data->s.ry/(data->s.ny-1);
00138                                 data->s.dy = MAX(1,R2INT(data->s.dy/Inst->YResolution()))*Inst->YResolution();
00139                                 data->s.ry = (data->s.ny-1) * data->s.dy;
00140                         }else{
00141                                 // rx from dx & Points
00142                                 XSM_DEBUG(DBG_L3,  "fixsteps"  );
00143                                 data->s.dx = MAX(1,R2INT(data->s.dx/Inst->XResolution()))*Inst->XResolution();
00144                                 data->s.rx = (data->s.nx-1) * data->s.dx;
00145                                 
00146                                 data->s.dy = MAX(1,R2INT(data->s.dy/Inst->YResolution()))*Inst->YResolution();
00147                                 data->s.ry = (data->s.ny-1) * data->s.dy;
00148                         }
00149         }
00150         if(gtk_object_get_data ( GTK_OBJECT (a->spm_control), "EC_Rx")){
00151                 ((Gtk_EntryControl*)gtk_object_get_data ( GTK_OBJECT (a->spm_control), "EC_Rx"))
00152                         ->setMax(a->xsm->XRangeMax());
00153                 XSM_DEBUG(DBG_L3,  "Rx Max: " << a->xsm->XRangeMax() );
00154         }
00155         if(gtk_object_get_data ( GTK_OBJECT (a->spm_control), "EC_Ry")){
00156                 ((Gtk_EntryControl*)gtk_object_get_data ( GTK_OBJECT (a->spm_control), "EC_Ry"))
00157                         ->setMax(a->xsm->YRangeMax());
00158                 XSM_DEBUG(DBG_L3,  "Ry Max: " << a->xsm->YRangeMax() );
00159         }
00160         if(gtk_object_get_data ( GTK_OBJECT (a->spm_control), "EC_Stx"))
00161                 ((Gtk_EntryControl*)gtk_object_get_data ( GTK_OBJECT (a->spm_control), "EC_Stx"))
00162                         ->setMax(a->xsm->XStepMax());
00163         if(gtk_object_get_data ( GTK_OBJECT (a->spm_control), "EC_Sty"))
00164                 ((Gtk_EntryControl*)gtk_object_get_data ( GTK_OBJECT (a->spm_control), "EC_Sty"))
00165                         ->setMax(a->xsm->YStepMax());
00166         
00167         if(gtk_object_get_data ( GTK_OBJECT (a->spm_control), "EC_Offx")){
00168                 ((Gtk_EntryControl*)gtk_object_get_data ( GTK_OBJECT (a->spm_control), "EC_Offx"))
00169                         ->setMax(a->xsm->XOffsetMax());
00170                 ((Gtk_EntryControl*)gtk_object_get_data ( GTK_OBJECT (a->spm_control), "EC_Offx"))
00171                         ->setMin(a->xsm->XOffsetMin());
00172         }
00173         if(gtk_object_get_data ( GTK_OBJECT (a->spm_control), "EC_Offy")){
00174                 ((Gtk_EntryControl*)gtk_object_get_data ( GTK_OBJECT (a->spm_control), "EC_Offy"))
00175                         ->setMax(a->xsm->YOffsetMax());
00176                 ((Gtk_EntryControl*)gtk_object_get_data ( GTK_OBJECT (a->spm_control), "EC_Offy"))
00177                         ->setMin(a->xsm->YOffsetMin());
00178         }
00179         
00180         a->spm_update_all();
00181         
00182 // **=  data->hardpars.LS_dnx = R2INT(Inst->XA2Dig(data->s.dx));
00183 // **=  data->hardpars.LS_nx2scan = data->s.nx;
00184         data->s.dz = Inst->ZResolution();
00185 
00186         a->SignalSPMRangeEventToPlugins();
00187                 
00188         if(IS_SPALEED_CTRL)
00189                 a->spa_show_scan_time();
00190 }
00191 
00192 void App::spm_offset_check(Param_Control* pcs, gpointer app){
00193         App* a = (App*)app;
00194         XSM_DEBUG(DBG_L3,  "offset check"  );
00195         XSM_Instrument *Inst = ((App*)app)->xsm->Inst;
00196         SCAN_DATA *data = &((App*)app)->xsm->data;
00197         
00198         // move to 0,0 in offset coordinate system (never rotated)
00199         if(IS_SPALEED_CTRL) // add additional offset
00200                         ((App*)app)->xsm->hardware->SetOffset 
00201                                         (R2INT(Inst->X0A2Dig(data->s.x0) 
00202                                                    + data->s.SPA_OrgX/Inst->X0Resolution()),
00203                                          R2INT(Inst->Y0A2Dig(data->s.y0) 
00204                                                    + data->s.SPA_OrgY/Inst->Y0Resolution()));
00205         else
00206                         ((App*)app)->xsm->hardware->SetOffset
00207                                         (R2INT(Inst->X0A2Dig(data->s.x0)),
00208                                          R2INT(Inst->Y0A2Dig(data->s.y0)));
00209         
00210         ((App*)app)->spm_update_all();
00211 
00212         a->SignalSPMRangeEventToPlugins();
00213 
00214         // simply to 0,0 now
00215         ((App*)app)->xsm->hardware->MovetoXY(0, 0);
00216 
00217 #if 0   
00218         // move to center of first line in scan coordinate system (may be rotated)
00219 
00220         //-todo-offset-
00221         // SPM: Center of first (top) line is 0,0
00222         // SPALEED: Center of Scan is 0,0 and top center is 0,-ny/2*dy
00223 
00224         if(IS_SPALEED_CTRL){
00225                 ((App*)app)->xsm->hardware->MovetoXY(0, R2INT(Inst->YA2Dig((-data->s.ny/2)*data->s.dy)));
00226         }else{
00227                 ((App*)app)->xsm->hardware->MovetoXY(0, 0);
00228         }
00229 #endif
00230 }
00231 
00232 void App::spm_nlayer_update(Param_Control* pcs, gpointer app){
00233 //      XSM_DEBUG(DBG_L3,  "nlayer check"  );
00234 //      SCAN_DATA *data = &((App*)app)->xsm->data;
00235 //      XSM_DEBUG(DBG_L3, "nlayer check: " << data->lp.nvalues);
00236 
00237 //      GTK_ADJUSTMENT (((Gtk_EntryControl*)pcs)->GetAdjustment ())->upper = (gfloat)(data->lp.nvalues-1);
00238 }
00239 
00240 void App::spm_select_layer(Param_Control* pcs, gpointer app){
00241         gchar *valtxt = NULL;
00242         int i3d = gapp->xsm->data.display.vlayer;
00243         if (i3d < 0) 
00244                 i3d = 0;
00245 
00246 //      XSM_DEBUG(DBG_L3, "Select Layer: " << i3d);
00247 
00248         if (((App*)app)->xsm->ActiveScan){
00249                 double lastlayer = (double)(((App*)app)->xsm->ActiveScan->mem2d->GetNv ()-1);
00250                 if (lastlayer > 1.){
00251                         pcs->setMax (lastlayer);
00252                         GTK_ADJUSTMENT (((Gtk_EntryControl*)pcs)->GetAdjustment ())->upper = (gfloat)lastlayer;
00253                 }
00254                 if (i3d < ((App*)app)->xsm->ActiveScan->mem2d->GetNv ()){
00255                         ((App*)app)->xsm->ActiveScan->mem2d->SetLayer (i3d);
00256                         ((App*)app)->xsm->SetRedraw();
00257                         if (((App*)app)->xsm->ActiveScan->data.Vunit)
00258                                 valtxt = ((App*)app)->xsm->ActiveScan->data.Vunit->UsrString (
00259                                         ((App*)app)->xsm->ActiveScan->mem2d->data->GetVLookup (i3d));
00260                         else
00261                                 valtxt = g_strdup ("-U-");
00262                 }else{
00263                         XSM_DEBUG(DBG_L3, "Sorry, requested layer is out of range!" );
00264                         valtxt = g_strdup("--");
00265                 }
00266 
00267 
00268         }else{
00269                 valtxt = g_strdup("*");
00270         }
00271 
00272         gtk_label_set
00273           ( GTK_LABEL ((GtkWidget*) gtk_object_get_data
00274             ( GTK_OBJECT (((App*)app)->spm_control), "LayerSelectValue")),
00275             valtxt
00276             );
00277         g_free (valtxt);
00278 
00279         ((App*)app)->xsm->SetVM();
00280 }
00281 
00282 void App::spa_energy_check(Param_Control* pcs, gpointer app){
00283         XSM_Instrument *Inst = ((App*)app)->xsm->Inst;
00284         SCAN_DATA *data = &((App*)app)->xsm->data;
00285         
00286         XSM_DEBUG(DBG_L3,  "energy changed !"  );
00287 
00288         // to be changed/removed in future of *-HwI-* redesign  
00289 // **=  data->hardpars.SPA_EnergyVolt = Inst->eV2V(data->hardpars.SPA_Energy); 
00290         data->s.Bias = Inst->eV2V(data->s.Energy); 
00291 // **=  ((App*)app)->xsm->hardware->PutParameter(&data->hardpars);
00292         
00293         // update all Energy dependent Voltages if in BZ Mode:
00294         if(((App*)app)->xsm->IsMode(MODE_BZUNIT)){
00295 // **==         double etmp=data->hardpars.SPA_Energy;
00296                 double etmp=Inst->eV2V(data->s.Energy); 
00297                 XSM_DEBUG(DBG_L3,  "energy check: recalc new Volt from BZ"  );
00298                 g_slist_foreach (
00299                         (GSList*)gtk_object_get_data (
00300                                 GTK_OBJECT (((App*)app)->spm_control), 
00301                                 "SPA_EnergyDepend_list"),
00302                         (GFunc) App::recalc_volt_from_new_Energy, &etmp);
00303         }
00304 // **== ((App*)app)->xsm->BZ_Unit->SetE(data->hardpars.SPA_Energy);
00305         ((App*)app)->xsm->BZ_Unit->SetE(data->s.Energy);
00306         ((App*)app)->spm_update_all();
00307 }
00308 
00309 void App::spa_show_scan_time(){
00310         double s,m,h;
00311         gchar *t;
00312         s = xsm->data.s.GateTime * xsm->data.s.nx*xsm->data.s.ny;
00313         h = floor(s/3600.);
00314         m = floor((s-h*3600.)/60.);
00315         s-= h*3600.+m*60.;
00316         SetStatus("approx Scantime", 
00317                   t=g_strdup_printf("%.0f:%02.0f:%02.0f",h,m,s));
00318         g_free(t);
00319 }
00320 
00321 void App::spa_gate_check(Param_Control* pcs, gpointer app){
00322         App *a = (App*)app;
00323         a->xsm->data.display.cnttime  = a->xsm->data.s.GateTime;
00324         //  a->xsm->CPSHiLoUnit->Change(a->xsm->data.display.cnttime); // only for hi/lo
00325         a->xsm->CPSHiLoUnit->Change(1.); // only for hi/lo
00326         a->spa_show_scan_time();
00327 }
00328 
00329 void App::spa_SeV_unit_switch_check(){
00330         static int lastmode=MODE_ENERGY_EV;
00331         if(gapp->xsm->IsMode(MODE_ENERGY_EV)){
00332                 if(lastmode == MODE_ENERGY_EV) return;
00333                 lastmode = MODE_ENERGY_EV;
00334                 ((Gtk_EntryControl *) gtk_object_get_data( GTK_OBJECT (spm_control), "SPA_Energy"))->changeUnit(gapp->xsm->EnergyUnit);
00335         }else{
00336                 if(lastmode == MODE_ENERGY_S) return;
00337                 lastmode = MODE_ENERGY_S;
00338                 ((Gtk_EntryControl *) gtk_object_get_data( GTK_OBJECT (spm_control), "SPA_Energy"))->changeUnit(gapp->xsm->YSUnit);
00339         }
00340 }
00341 
00342 void App::recalc_volt_from_new_Energy(double* x, double *Eneu){
00343         BZUnit BZEnew(*gapp->xsm->BZ_Unit);
00344         BZEnew.SetE(*Eneu);
00345         // convert: from Volt(Eold) to BZ to Volt(Enew):
00346         *x = BZEnew.Usr2Base(gapp->xsm->BZ_Unit->Base2Usr(*x));
00347 }
00348 
00349 
00350 void App::spa_switch_unit(Param_Control* pcs, gpointer data){
00351         pcs->changeUnit((UnitObj*)data);
00352 }
00353 
00354 void App::spa_mode_switch_check(){
00355         static int lastmode=MODE_VOLTUNIT;
00356         
00357         if(gapp->xsm->IsMode(MODE_BZUNIT)){
00358                 if(lastmode == MODE_BZUNIT) return;
00359                 lastmode = MODE_BZUNIT;
00360                 //  gapp->xsm->BZ_Unit->SetE(data->hardpars.SPA_Energy);
00361                 XSM_DEBUG(DBG_L3,  "mode switch check: recalc BZ from Volt"  );
00362                 g_slist_foreach (
00363                         (GSList*)gtk_object_get_data (
00364                                 GTK_OBJECT (gapp->spm_control), 
00365                                 "SPA_EnergyDependEC_list"),
00366                         (GFunc) App::spa_switch_unit, gapp->xsm->BZ_Unit);
00367                 gapp->spm_update_all();
00368         }else{
00369                 if(lastmode == MODE_VOLTUNIT) return;
00370                 lastmode = MODE_VOLTUNIT;
00371                 XSM_DEBUG(DBG_L3,  "mode switch check: recalc Volt from BZ" );
00372                 g_slist_foreach (
00373                         (GSList*)gtk_object_get_data (
00374                                 GTK_OBJECT (gapp->spm_control), 
00375                                 "SPA_EnergyDependEC_list"),
00376                         (GFunc) App::spa_switch_unit, gapp->xsm->VoltUnit);
00377         }
00378         spm_range_check(NULL, gapp);
00379 }
00380 
00381 // Controll Fields used by STM and AFM
00382 // ========================================
00383 GtkWidget* App::create_spm_control (){
00384         GSList *EC_list=NULL;
00385         GSList *EC_ScanFix_list=NULL;
00386         
00387         Gtk_EntryControl *ec;
00388         
00389         GtkWidget *vbox;
00390         GtkWidget *vbox_side;
00391         GtkWidget *hbox;
00392         GtkWidget *frame_param, *vbox_param, *hbox_param;
00393         GtkWidget *frame_view, *vbox_view;
00394         
00395         GtkWidget *input, *inputM, *inputC;
00396         GtkWidget *inputMR, *inputMS, *inputMN; // M wie Master, R,S,N wie Range, Step, NPoints
00397         GtkWidget *inputCR, *inputCS, *inputCN; // C wie Client
00398 
00399         GtkWidget *radiobutton;
00400         GSList    *radiogroup;
00401         
00402         vbox = gtk_vbox_new (FALSE, 0);
00403         gtk_widget_show (vbox);
00404         
00405         gtk_box_pack_start (GTK_BOX (main_control), vbox, TRUE, TRUE, 0);
00406         
00407         hbox = gtk_hbox_new (FALSE, 0);
00408         gtk_widget_show (hbox);
00409         gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
00410         
00411         frame_param = gtk_frame_new ("Scan Parameter");
00412         gtk_widget_show (frame_param);
00413         gtk_container_add (GTK_CONTAINER (hbox), frame_param);
00414         
00415         vbox_param = gtk_vbox_new (FALSE, 0);
00416         gtk_widget_show (vbox_param);
00417         gtk_container_add (GTK_CONTAINER (frame_param), vbox_param);
00418         
00419         // Range controls
00420         XSM_DEBUG(DBG_L3, "creating range controls");
00421         inputMR = mygtk_create_input("Range XY", vbox_param, hbox_param);
00422         ec = new Gtk_EntryControl (xsm->X_Unit, MLD_WERT_NICHT_OK, &xsm->data.s.rx,
00423                                    0.,
00424                                    //                        xsm->XRangeMin(),
00425                                    xsm->XRangeMax(), 
00426                                    xsm->AktUnit->prec1, inputMR);
00427         ec->Set_ChangeNoticeFkt(App::spm_range_check, this);
00428         EC_list = g_slist_prepend( EC_list, ec);
00429         EC_ScanFix_list = g_slist_prepend( EC_ScanFix_list, ec);
00430         RemoteEntryList = ec->AddEntry2RemoteList("RangeX", RemoteEntryList);
00431         gtk_object_set_data( GTK_OBJECT (vbox), "EC_Rx", ec);
00432         
00433         inputCR= mygtk_add_input(hbox_param);
00434         ec = new Gtk_EntryControl (xsm->Y_Unit, MLD_WERT_NICHT_OK, &xsm->data.s.ry,
00435                                    0.,
00436                                    //                        xsm->YRangeMin(), 
00437                                    xsm->YRangeMax(), 
00438                                    xsm->AktUnit->prec1, inputCR);
00439         ec->Set_ChangeNoticeFkt(App::spm_range_check, this);
00440         EC_list = g_slist_prepend( EC_list, ec);
00441         EC_ScanFix_list = g_slist_prepend( EC_ScanFix_list, ec);
00442         RemoteEntryList = ec->AddEntry2RemoteList("RangeY", RemoteEntryList);
00443         gtk_object_set_data( GTK_OBJECT (vbox), "EC_Ry", ec);
00444         
00445         inputMS = mygtk_create_input("Steps XY", vbox_param, hbox_param);
00446         ec = new Gtk_EntryControl (xsm->X_Unit, MLD_WERT_NICHT_OK,&xsm->data.s.dx,
00447                                    0.,
00448                                    //                         xsm->XStepMin(),
00449                                    xsm->XStepMax(), 
00450                                    xsm->AktUnit->prec2, inputMS);
00451         ec->Set_ChangeNoticeFkt(App::spm_range_check, this);
00452         EC_list = g_slist_prepend( EC_list, ec);
00453         EC_ScanFix_list = g_slist_prepend( EC_ScanFix_list, ec);
00454         inputCS = mygtk_add_input(hbox_param);
00455         RemoteEntryList = ec->AddEntry2RemoteList("StepsX", RemoteEntryList);
00456         gtk_object_set_data( GTK_OBJECT (vbox), "EC_Stx", ec);
00457         ec = new Gtk_EntryControl (xsm->Y_Unit, MLD_WERT_NICHT_OK,&xsm->data.s.dy,
00458                                    0.,
00459                                    //                        xsm->YStepMin(),
00460                                    xsm->YStepMax(), 
00461                                    xsm->AktUnit->prec2, inputCS);
00462         ec->Set_ChangeNoticeFkt(App::spm_range_check, this);
00463         EC_list = g_slist_prepend( EC_list, ec);
00464         EC_ScanFix_list = g_slist_prepend( EC_ScanFix_list, ec);
00465         RemoteEntryList = ec->AddEntry2RemoteList("StepsY", RemoteEntryList);
00466         gtk_object_set_data( GTK_OBJECT (vbox), "EC_Sty", ec);
00467         
00468         
00469         inputMN = mygtk_create_input("Points XY", vbox_param, hbox_param);
00470         ec = new Gtk_EntryControl (xsm->Unity, MLD_WERT_NICHT_OK,&xsm->data.s.nx,
00471                                    xsm->XMinPoints(), xsm->XMaxPoints(), 
00472                                    "4.0f", inputMN);
00473         ec->Set_ChangeNoticeFkt(App::spm_range_check, this);
00474         EC_list = g_slist_prepend( EC_list, ec);
00475         EC_ScanFix_list = g_slist_prepend( EC_ScanFix_list, ec);
00476         RemoteEntryList = ec->AddEntry2RemoteList("PointsX", RemoteEntryList);
00477         gtk_object_set_data( GTK_OBJECT (vbox), "EC_Pnx", ec);
00478         inputCN = mygtk_add_input(hbox_param);
00479         ec = new Gtk_EntryControl (xsm->Unity, MLD_WERT_NICHT_OK,&xsm->data.s.ny,
00480                                    xsm->YMinPoints(), xsm->YMaxPoints(), 
00481                                    "4.0f", inputCN);
00482         ec->Set_ChangeNoticeFkt(App::spm_range_check, this);
00483         EC_list = g_slist_prepend( EC_list, ec);
00484         EC_ScanFix_list = g_slist_prepend( EC_ScanFix_list, ec);
00485         RemoteEntryList = ec->AddEntry2RemoteList("PointsY", RemoteEntryList);
00486         gtk_object_set_data( GTK_OBJECT (vbox), "EC_Pny", ec);
00487         
00488         
00489         // Setup Interconnections: for Range Fields
00490         // ========================================
00491         // Master Range X has client Range Y:
00492         gtk_object_set_data( GTK_OBJECT (inputMR), "HasClient", inputCR);
00493         
00494         // Master Steps X has client Steps Y:
00495         gtk_object_set_data( GTK_OBJECT (inputMS), "HasClient", inputCS);
00496         
00497         // Master Points X has client Points Y:
00498         gtk_object_set_data( GTK_OBJECT (inputMN), "HasClient", inputCN);
00499         
00500         // Offset
00501         XSM_DEBUG(DBG_L3, "creating Offset controls");
00502         inputM = mygtk_create_input("Offset XY", vbox_param, hbox_param);
00503         ec = new Gtk_EntryControl 
00504                 (xsm->X_Unit, MLD_WERT_NICHT_OK, &xsm->data.s.x0,
00505                  xsm->XOffsetMin(), xsm->XOffsetMax(), xsm->AktUnit->prec1, inputM);
00506         EC_list = g_slist_prepend( EC_list, ec);
00507         RemoteEntryList = ec->AddEntry2RemoteList("OffsetX", RemoteEntryList);
00508         ec->Set_ChangeNoticeFkt(App::spm_offset_check, this);
00509         gtk_object_set_data( GTK_OBJECT (vbox), "EC_Offx", ec);
00510         
00511         inputC = mygtk_add_input(hbox_param);
00512         ec = new Gtk_EntryControl 
00513                 (xsm->Y_Unit, MLD_WERT_NICHT_OK, &xsm->data.s.y0,
00514                  xsm->YOffsetMin(), xsm->YOffsetMax(), xsm->AktUnit->prec1, inputC);
00515         EC_list = g_slist_prepend( EC_list, ec);
00516         //  gtk_object_set_data( GTK_OBJECT (inputM), "HasClient", inputC);
00517         RemoteEntryList = ec->AddEntry2RemoteList("OffsetY", RemoteEntryList);
00518         ec->Set_ChangeNoticeFkt(App::spm_offset_check, this);
00519         gtk_object_set_data( GTK_OBJECT (vbox), "EC_Offy", ec);
00520         
00521 
00522         // Layers...
00523         input = mygtk_create_input("Layers", vbox_param, hbox_param, 100, 50);
00524         ec = new Gtk_EntryControl 
00525                 (xsm->Unity, MLD_WERT_NICHT_OK, &xsm->data.s.nvalues,
00526                  1., xsm->MaxValues(), ".0f", input);
00527         EC_list = g_slist_prepend( EC_list, ec);
00528         RemoteEntryList = ec->AddEntry2RemoteList("Layers", RemoteEntryList);
00529 //      ec->Set_ChangeNoticeFkt(App::spm_nlayer_update, this);
00530         gtk_object_set_data( GTK_OBJECT (vbox), "EC_Layers", ec);
00531 //      EC_ScanFix_list = g_slist_prepend( EC_ScanFix_list, ec);
00532         ec->Freeze ();
00533 
00534         input = mygtk_add_spin(_(" "), hbox_param, 0, 0);
00535         gtk_object_set_data( GTK_OBJECT (vbox), "LayerSelectSpin", input);
00536         ec = new Gtk_EntryControl (xsm->Unity, _("Layer out of range"), &xsm->data.display.vlayer, 0., 10., ".0f", input, 1., 10.);
00537         ec->Set_ChangeNoticeFkt(App::spm_select_layer, this);
00538         SetupScale (ec->GetAdjustment(), hbox_param);
00539         EC_list = g_slist_prepend( EC_list, ec);
00540         RemoteEntryList = ec->AddEntry2RemoteList("LayerSelect", RemoteEntryList);
00541 
00542         input = gtk_label_new ("-.--#");
00543         gtk_widget_set_size_request (input, 50, -1);
00544         gtk_widget_show (input);
00545         gtk_box_pack_start (GTK_BOX (hbox_param), input, TRUE, FALSE, GNOME_PAD);
00546         gtk_object_set_data( GTK_OBJECT (vbox), "LayerSelectValue", input);
00547         
00548 
00549         // Rotation
00550         XSM_DEBUG(DBG_L3, "creating Rotation controls");
00551         input = mygtk_create_spin_input("Rotation", vbox_param, hbox_param);
00552         gtk_object_set_data( GTK_OBJECT (input), "Adjustment_PCS_Name", (void*)("SPM_Rotation"));
00553         ec = new Gtk_EntryControl 
00554                 (xsm->ArcUnit, MLD_WERT_NICHT_OK, &xsm->data.s.alpha,
00555                  -360., 360., "6g", input, 1., 15.);
00556         SetupScale (ec->GetAdjustment (), hbox_param);
00557         EC_list = g_slist_prepend( EC_list, ec);
00558         EC_ScanFix_list = g_slist_prepend( EC_ScanFix_list, ec);
00559         ec->Set_ChangeNoticeFkt(App::spm_offset_check, this);
00560         RemoteEntryList = ec->AddEntry2RemoteList("Rotation", RemoteEntryList);
00561         
00562         // Display
00563         XSM_DEBUG(DBG_L3, "creating Display controls");
00564         input = mygtk_create_spin_input("VRange Z", vbox_param, hbox_param);
00565         gtk_object_set_data( GTK_OBJECT (input), "Adjustment_PCS_Name", (void*)("SPM_VRangeZ"));
00566         ec = new Gtk_EntryControl 
00567                 (xsm->data.Zunit, MLD_WERT_NICHT_OK, &xsm->data.display.vrange_z,
00568                  -5000., 5000., ".3g", input, 1., 10.);
00569         SetupScale(ec->GetAdjustment(), hbox_param);
00570         ec->Set_ChangeNoticeFkt(cb_display_changed, this);
00571         EC_list = g_slist_prepend( EC_list, ec);
00572         RemoteEntryList = ec->AddEntry2RemoteList("VRangeZ", RemoteEntryList);
00573         gtk_object_set_data( GTK_OBJECT (vbox), "SPM_EC_VRangeZ", ec);
00574         
00575         input = mygtk_create_spin_input("VOffset Z", vbox_param, hbox_param);
00576         gtk_object_set_data( GTK_OBJECT (input), "Adjustment_PCS_Name", (void*)("SPM_VOffsetZ"));
00577         ec = new Gtk_EntryControl 
00578                 (xsm->data.Zunit, MLD_WERT_NICHT_OK, &xsm->data.display.voffset_z,
00579                  -5000., 5000., ".2g", input, 1., 10.);
00580         SetupScale(ec->GetAdjustment(), hbox_param);
00581         ec->Set_ChangeNoticeFkt(cb_display_changed, this);
00582         EC_list = g_slist_prepend( EC_list, ec);
00583         RemoteEntryList = ec->AddEntry2RemoteList("VOffsetZ", RemoteEntryList);
00584         gtk_object_set_data( GTK_OBJECT (vbox), "SPM_EC_VOffsetZ", ec);
00585         
00586         // --------------------------------------------------
00587         // Range automatism control... Calc: Range,Points,Steps
00588         vbox_side = gtk_vbox_new (FALSE, 0);
00589         gtk_widget_show (vbox_side);
00590         gtk_box_pack_start (GTK_BOX (hbox), vbox_side, TRUE, TRUE, 0);
00591         
00592         frame_view = gtk_frame_new ("Calculate");
00593         gtk_widget_show (frame_view);
00594         gtk_container_add (GTK_CONTAINER (vbox_side), frame_view);
00595         
00596         vbox_view = gtk_vbox_new (FALSE, 0);
00597         gtk_widget_show (vbox_view);
00598         gtk_container_add (GTK_CONTAINER (frame_view), vbox_view);
00599         
00600         // --------------------------------------------------
00601         radiobutton = gtk_radio_button_new_with_label( NULL, "Steps");
00602         gtk_box_pack_start (GTK_BOX (vbox_view), radiobutton, TRUE, TRUE, 0);
00603         gtk_widget_show (radiobutton);
00604         gtk_signal_connect (GTK_OBJECT (radiobutton), "clicked",
00605                             GTK_SIGNAL_FUNC (cb_setmode), (void*)MODE_SETSTEPS);
00606         
00607         radiogroup = gtk_radio_button_group (GTK_RADIO_BUTTON (radiobutton));
00608         
00609         radiobutton = gtk_radio_button_new_with_label (radiogroup, "Range");
00610         gtk_box_pack_start (GTK_BOX (vbox_view), radiobutton, TRUE, TRUE, 0);
00611         gtk_widget_show (radiobutton);
00612         gtk_signal_connect (GTK_OBJECT (radiobutton), "clicked",
00613                             GTK_SIGNAL_FUNC (cb_setmode), (void*)MODE_SETRANGE);
00614         
00615         radiogroup = gtk_radio_button_group (GTK_RADIO_BUTTON (radiobutton));
00616         
00617         radiobutton = gtk_radio_button_new_with_label( radiogroup, "Points");
00618         gtk_box_pack_start (GTK_BOX (vbox_view), radiobutton, TRUE, TRUE, 0);
00619         gtk_widget_show (radiobutton);
00620         gtk_signal_connect (GTK_OBJECT (radiobutton), "clicked",
00621                             GTK_SIGNAL_FUNC (cb_setmode), (void*)MODE_SETPOINTS);
00622         
00623         
00624         // View Mode Radiobuttons
00625         // --------------------------------------------------
00626         frame_view = gtk_frame_new ("View");
00627         gtk_widget_show (frame_view);
00628         gtk_container_add (GTK_CONTAINER (vbox_side), frame_view);
00629         
00630         vbox_view = gtk_vbox_new (FALSE, 0);
00631         gtk_widget_show (vbox_view);
00632         gtk_container_add (GTK_CONTAINER (frame_view), vbox_view);
00633         
00634         radiobutton = gtk_radio_button_new_with_label (NULL, "Quick");
00635         gtk_object_set_data( GTK_OBJECT (vbox), "quickbutton", radiobutton);
00636         gtk_box_pack_start (GTK_BOX (vbox_view), radiobutton, TRUE, TRUE, 0);
00637         gtk_widget_show (radiobutton);
00638         /* Connect the "clicked" signal of the button to our callback */
00639         gtk_signal_connect (GTK_OBJECT (radiobutton), "clicked",
00640                             GTK_SIGNAL_FUNC (callback_view), (gpointer) SCAN_V_QUICK);
00641         
00642         radiogroup = gtk_radio_button_group (GTK_RADIO_BUTTON (radiobutton));
00643         
00644         radiobutton = gtk_radio_button_new_with_label( radiogroup, "Direct");
00645         gtk_object_set_data( GTK_OBJECT (vbox), "directbutton", radiobutton);
00646         gtk_box_pack_start (GTK_BOX (vbox_view), radiobutton, TRUE, TRUE, 0);
00647         gtk_widget_show (radiobutton);
00648         gtk_signal_connect (GTK_OBJECT (radiobutton), "clicked",
00649                             GTK_SIGNAL_FUNC (callback_view), (gpointer) SCAN_V_DIRECT);
00650         
00651         radiogroup = gtk_radio_button_group (GTK_RADIO_BUTTON (radiobutton));
00652         
00653         radiobutton = gtk_radio_button_new_with_label( radiogroup, "Plane");
00654         gtk_object_set_data( GTK_OBJECT (vbox), "planesubbutton", radiobutton);
00655         gtk_box_pack_start (GTK_BOX (vbox_view), radiobutton, TRUE, TRUE, 0);
00656         gtk_widget_show (radiobutton);
00657         gtk_signal_connect (GTK_OBJECT (radiobutton), "clicked",
00658                             GTK_SIGNAL_FUNC (callback_view), (gpointer) SCAN_V_PLANESUB);
00659         
00660         radiogroup = gtk_radio_button_group (GTK_RADIO_BUTTON (radiobutton));
00661         
00662         radiobutton = gtk_radio_button_new_with_label( radiogroup, "Logarith.");
00663         gtk_object_set_data( GTK_OBJECT (vbox), "logbutton", radiobutton);
00664         gtk_box_pack_start (GTK_BOX (vbox_view), radiobutton, TRUE, TRUE, 0);
00665         gtk_widget_show (radiobutton);
00666         gtk_signal_connect (GTK_OBJECT (radiobutton), "clicked",
00667                             GTK_SIGNAL_FUNC (callback_view), (gpointer) SCAN_V_LOG);
00668         
00669         radiogroup = gtk_radio_button_group (GTK_RADIO_BUTTON (radiobutton));
00670         
00671         radiobutton = gtk_radio_button_new_with_label( radiogroup, "Horizont");
00672         gtk_object_set_data( GTK_OBJECT (vbox), "horizontalbutton", radiobutton);
00673         gtk_box_pack_start (GTK_BOX (vbox_view), radiobutton, TRUE, TRUE, 0);
00674 //      gtk_widget_show (radiobutton);
00675         gtk_signal_connect (GTK_OBJECT (radiobutton), "clicked",
00676                             GTK_SIGNAL_FUNC (callback_view), (gpointer) SCAN_V_HORIZONTAL);
00677         
00678         radiogroup = gtk_radio_button_group (GTK_RADIO_BUTTON (radiobutton));
00679         
00680         radiobutton = gtk_radio_button_new_with_label( radiogroup, "Diff.");
00681         gtk_object_set_data( GTK_OBJECT (vbox), "differentialbutton", radiobutton);
00682         gtk_box_pack_start (GTK_BOX (vbox_view), radiobutton, TRUE, TRUE, 0);
00683         gtk_widget_show (radiobutton);
00684         gtk_signal_connect (GTK_OBJECT (radiobutton), "clicked",
00685                             GTK_SIGNAL_FUNC (callback_view), (gpointer) SCAN_V_DIFFERENTIAL);
00686         
00687         radiogroup = gtk_radio_button_group (GTK_RADIO_BUTTON (radiobutton));
00688         
00689         radiobutton = gtk_radio_button_new_with_label( radiogroup, "Periodic");
00690         gtk_object_set_data( GTK_OBJECT (vbox), "periodicbutton", radiobutton);
00691         gtk_box_pack_start (GTK_BOX (vbox_view), radiobutton, TRUE, TRUE, 0);
00692 //      gtk_widget_show (radiobutton);
00693         gtk_signal_connect (GTK_OBJECT (radiobutton), "clicked",
00694                             GTK_SIGNAL_FUNC (callback_view), (gpointer) SCAN_V_HORIZONTAL);
00695         
00696         
00697         // save lists away...
00698         
00699         gtk_object_set_data( GTK_OBJECT (vbox), "SPM_EC_list", EC_list);
00700         gtk_object_set_data( GTK_OBJECT (vbox), "SPM_SCANFIX_EC_list", EC_ScanFix_list);
00701         
00702         return(vbox);
00703 }
00704 
00705 // Updates all SPM Entry Fields in List !!!
00706 void App::spm_update_all(int Vflg){
00707         if(!spm_control) return;
00708         XSM_DEBUG(DBG_L3, "------ App::spm_update_all -------");
00709         if(gapp){
00710                 gapp->xsm->SetRedraw(FALSE); // suppress redraw on each displayrelevat field, do redraw only once at end !
00711                 
00712                 gapp->xsm->data.UpdateUnits();
00713 
00714                 // Update Units in VRange/Offset_Z entry
00715                 if (gtk_object_get_data( GTK_OBJECT (spm_control), "SPM_EC_VRangeZ"))
00716                         ((Gtk_EntryControl*)gtk_object_get_data( GTK_OBJECT (spm_control), "SPM_EC_VRangeZ"))->changeUnit(gapp->xsm->data.Zunit);
00717 
00718                 if (gtk_object_get_data( GTK_OBJECT (spm_control), "SPM_EC_VOffsetZ"))
00719                         ((Gtk_EntryControl*)gtk_object_get_data( GTK_OBJECT (spm_control), "SPM_EC_VOffsetZ"))->changeUnit(gapp->xsm->data.Zunit);
00720 
00721                 g_slist_foreach (
00722                         (GSList*)gtk_object_get_data (
00723                                 GTK_OBJECT (spm_control), "SPM_EC_list"),
00724                         (GFunc) App::update_ec, NULL);
00725         }
00726         if(Vflg<0) Vflg=-Vflg;
00727         XSM_DEBUG(DBG_L3, "App::spm_update_all - Vflg=" << Vflg);
00728         switch(Vflg){
00729         case 0: break;
00730         case SCAN_V_DIRECT:
00731                 gtk_toggle_button_set_active( (GtkToggleButton*)gtk_object_get_data( GTK_OBJECT (spm_control), "directbutton"), TRUE);
00732                 break;
00733         case SCAN_V_QUICK:
00734                 gtk_toggle_button_set_active( (GtkToggleButton*)gtk_object_get_data( GTK_OBJECT (spm_control), "quickbutton"), TRUE);
00735                 break;
00736         case SCAN_V_PLANESUB:
00737                 gtk_toggle_button_set_active( (GtkToggleButton*)gtk_object_get_data( GTK_OBJECT (spm_control), "planesubbutton"), TRUE);
00738                 break;
00739         case SCAN_V_LOG:
00740                 gtk_toggle_button_set_active( (GtkToggleButton*)gtk_object_get_data( GTK_OBJECT (spm_control), "logbutton"), TRUE);
00741                 break;
00742         case SCAN_V_HORIZONTAL:
00743                 gtk_toggle_button_set_active( (GtkToggleButton*)gtk_object_get_data( GTK_OBJECT (spm_control), "horziontalbutton"), TRUE);
00744                 break;
00745         case SCAN_V_PERIODIC:
00746                 gtk_toggle_button_set_active( (GtkToggleButton*)gtk_object_get_data( GTK_OBJECT (spm_control), "periodicbutton"), TRUE);
00747                 break;
00748         case SCAN_V_DIFFERENTIAL:
00749                 gtk_toggle_button_set_active( (GtkToggleButton*)gtk_object_get_data( GTK_OBJECT (spm_control), "differentialbutton"), TRUE);
00750                 break;
00751         }
00752         if(gapp)
00753                 gapp->xsm->SetRedraw(); // Enable redraw and do one redraw !
00754         
00755         ui_update();
00756         as_update();
00757         XSM_DEBUG(DBG_L3, "App::spm_update_all done");
00758 }
00759 
00760 void App::spm_freeze_scanparam(){
00761         g_slist_foreach (
00762                 (GSList*)gtk_object_get_data (
00763                         GTK_OBJECT (spm_control), 
00764                         "SPM_SCANFIX_EC_list"),
00765                 (GFunc) App::freeze_ec, NULL);
00766 }
00767 
00768 void App::spm_thaw_scanparam(){
00769         g_slist_foreach (
00770                 (GSList*) gtk_object_get_data (
00771                         GTK_OBJECT (spm_control), 
00772                         "SPM_SCANFIX_EC_list"),
00773                 (GFunc) App::thaw_ec, NULL);
00774 }
00775 
00776 GtkWidget* App::create_spa_control (){
00777         GSList *EC_list=NULL;
00778         GSList *EC_ScanFix_list=NULL;
00779         GSList *EC_EnergyDep_list=NULL;
00780         GSList *EC_EnergyDepEC_list=NULL;
00781         GSList *EC_Ysize_list=NULL;
00782         
00783         Gtk_EntryControl *ec;
00784         
00785         GtkWidget *vboxmode;
00786         GtkWidget *vbox;
00787         GtkWidget *hbox;
00788         GtkWidget *frame_param, *vbox_param, *hbox_param;
00789         GtkWidget *frame_view, *vbox_view;
00790         
00791         GtkWidget *input, *inputM, *inputC;
00792         GtkWidget *inputMR, *inputMN; // M wie Master, R,S,N wie Range, Step, NPoints
00793         GtkWidget *inputCR, *inputCN; // C wie Client
00794         
00795         GtkWidget *radiobutton;
00796         GSList    *radiogroup;
00797         
00798         vbox = gtk_vbox_new (FALSE, 0);
00799         gtk_widget_show (vbox);
00800         
00801         gtk_box_pack_start (GTK_BOX (main_control), vbox, TRUE, TRUE, 0);
00802         
00803         hbox = gtk_hbox_new (FALSE, 0);
00804         gtk_widget_show (hbox);
00805         gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
00806         
00807         frame_param = gtk_frame_new ("Scan Parameter");
00808         gtk_widget_show (frame_param);
00809         gtk_container_add (GTK_CONTAINER (hbox), frame_param);
00810         
00811         vbox_param = gtk_vbox_new (FALSE, 0);
00812         gtk_widget_show (vbox_param);
00813         gtk_container_add (GTK_CONTAINER (frame_param), vbox_param);
00814         
00815         
00816         // Range controls
00817         XSM_DEBUG(DBG_L3, "creating range controls");
00818         inputMR = mygtk_create_input("Length XY", vbox_param, hbox_param);
00819         ec = new Gtk_EntryControl (xsm->X_Unit, MLD_WERT_NICHT_OK, &xsm->data.s.rx,
00820                                    0.,
00821                                    //                        xsm->XRangeMin(),
00822                                    xsm->XRangeMax(), 
00823                                    xsm->AktUnit->prec1, inputMR);
00824         ec->Set_ChangeNoticeFkt(App::spm_range_check, this);
00825         EC_list = g_slist_prepend( EC_list, ec);
00826         EC_ScanFix_list = g_slist_prepend( EC_ScanFix_list, ec);
00827         EC_EnergyDep_list = g_slist_prepend( EC_EnergyDep_list, &xsm->data.s.rx);
00828         EC_EnergyDepEC_list = g_slist_prepend( EC_EnergyDepEC_list, ec);
00829         RemoteEntryList = ec->AddEntry2RemoteList("LengthX", RemoteEntryList);
00830         gtk_object_set_data( GTK_OBJECT (vbox), "EC_Rx", ec);
00831         
00832         inputCR= mygtk_add_input(hbox_param);
00833         ec = new Gtk_EntryControl (xsm->Y_Unit, MLD_WERT_NICHT_OK, &xsm->data.s.ry,
00834                                    0.,
00835                                    //                        xsm->YRangeMin(),
00836                                    xsm->YRangeMax(), 
00837                                    xsm->AktUnit->prec1, inputCR);
00838         ec->Set_ChangeNoticeFkt(App::spm_range_check, this);
00839         EC_list = g_slist_prepend( EC_list, ec);
00840         EC_ScanFix_list = g_slist_prepend( EC_ScanFix_list, ec);
00841         EC_EnergyDep_list = g_slist_prepend( EC_EnergyDep_list, &xsm->data.s.ry);
00842         EC_EnergyDepEC_list = g_slist_prepend( EC_EnergyDepEC_list, ec);
00843         EC_Ysize_list = g_slist_prepend( EC_Ysize_list, inputCR);
00844         RemoteEntryList = ec->AddEntry2RemoteList("LengthY", RemoteEntryList);
00845         gtk_object_set_data( GTK_OBJECT (vbox), "EC_Rlisty", ec);
00846         
00847         inputMN = mygtk_create_input("Points XY", vbox_param, hbox_param);
00848         ec = new Gtk_EntryControl (xsm->Unity, MLD_WERT_NICHT_OK,&xsm->data.s.nx,
00849                                    xsm->XMinPoints(), xsm->XMaxPoints(), 
00850                                    "4.0f", inputMN);
00851         ec->Set_ChangeNoticeFkt(App::spm_range_check, this);
00852         EC_list = g_slist_prepend( EC_list, ec);
00853         EC_ScanFix_list = g_slist_prepend( EC_ScanFix_list, ec);
00854         RemoteEntryList = ec->AddEntry2RemoteList("PointsX", RemoteEntryList);
00855         gtk_object_set_data( GTK_OBJECT (vbox), "EC_Pnx", ec);
00856         inputCN = mygtk_add_input(hbox_param);
00857         ec = new Gtk_EntryControl (xsm->Unity, MLD_WERT_NICHT_OK,&xsm->data.s.ny,
00858                                    xsm->YMinPoints(), xsm->YMaxPoints(), 
00859                                    "4.0f", inputCN);
00860         ec->Set_ChangeNoticeFkt(App::spm_range_check, this);
00861         EC_list = g_slist_prepend( EC_list, ec);
00862         EC_ScanFix_list = g_slist_prepend( EC_ScanFix_list, ec);
00863         EC_Ysize_list = g_slist_prepend( EC_Ysize_list, inputCN);
00864         RemoteEntryList = ec->AddEntry2RemoteList("PointsY", RemoteEntryList);
00865         gtk_object_set_data( GTK_OBJECT (vbox), "EC_Pny", ec);
00866         
00867         // Setup Interconnections:
00868         // Master Length X has client Length Y
00869         gtk_object_set_data( GTK_OBJECT (inputMR), "HasClient", inputCR);
00870         // Master Points X has client Points Y
00871         gtk_object_set_data( GTK_OBJECT (inputMN), "HasClient", inputCN);
00872         
00873         // Offset realtiv to (0,0) Offset, used as invariant Point of Rotation
00874         XSM_DEBUG(DBG_L3, "creating Offset controls");
00875         inputM = mygtk_create_input("Offset XY", vbox_param, hbox_param);
00876         ec = new Gtk_EntryControl 
00877                 (xsm->X_Unit, MLD_WERT_NICHT_OK, &xsm->data.s.x0,
00878                  xsm->XOffsetMin(), xsm->XOffsetMax(), xsm->AktUnit->prec1, inputM);
00879         EC_list = g_slist_prepend( EC_list, ec);
00880         EC_ScanFix_list = g_slist_prepend( EC_ScanFix_list, ec);
00881         EC_EnergyDep_list = g_slist_prepend( EC_EnergyDep_list, &xsm->data.s.x0);
00882         EC_EnergyDepEC_list = g_slist_prepend( EC_EnergyDepEC_list, ec);
00883         RemoteEntryList = ec->AddEntry2RemoteList("OffsetX", RemoteEntryList);
00884         ec->Set_ChangeNoticeFkt(App::spm_offset_check, this);
00885         
00886         inputC = mygtk_add_input(hbox_param);
00887         ec = new Gtk_EntryControl 
00888                 (xsm->Y_Unit, MLD_WERT_NICHT_OK, &xsm->data.s.y0,
00889                  xsm->YOffsetMin(), xsm->YOffsetMax(), xsm->AktUnit->prec1, inputC);
00890         EC_list = g_slist_prepend( EC_list, ec);
00891         //  gtk_object_set_data( GTK_OBJECT (inputM), "HasClient", inputC);
00892         EC_ScanFix_list = g_slist_prepend( EC_ScanFix_list, ec);
00893         EC_EnergyDep_list = g_slist_prepend( EC_EnergyDep_list, &xsm->data.s.y0);
00894         EC_EnergyDepEC_list = g_slist_prepend( EC_EnergyDepEC_list, ec);
00895         RemoteEntryList = ec->AddEntry2RemoteList("OffsetY", RemoteEntryList);
00896         ec->Set_ChangeNoticeFkt(App::spm_offset_check, this);
00897         
00898         // Rotation
00899         XSM_DEBUG(DBG_L3, "creating Rotation controls");
00900         input = mygtk_create_spin_input("Rotation", vbox_param, hbox_param);
00901         gtk_object_set_data( GTK_OBJECT (input), "Adjustment_PCS_Name", (void*)("SPA_Rotation"));
00902         ec = new Gtk_EntryControl 
00903                 (xsm->ArcUnit, MLD_WERT_NICHT_OK, &xsm->data.s.alpha,
00904                  -360., 360., "6g", input, 1., 15.);
00905         EC_list = g_slist_prepend( EC_list, ec);
00906         EC_ScanFix_list = g_slist_prepend( EC_ScanFix_list, ec);
00907         RemoteEntryList = ec->AddEntry2RemoteList("Rotation", RemoteEntryList);
00908         
00909         // Gatetime
00910         input = mygtk_create_input("Gatetime", vbox_param, hbox_param);
00911         ec = new Gtk_EntryControl 
00912                 (xsm->TimeUnitms, MLD_WERT_NICHT_OK, &xsm->data.s.GateTime,
00913                  1e-4, 60., ".1f", input);
00914         ec->Set_ChangeNoticeFkt(App::spa_gate_check, this);
00915         EC_list = g_slist_prepend( EC_list, ec);
00916         EC_ScanFix_list = g_slist_prepend( EC_ScanFix_list, ec);
00917         RemoteEntryList = ec->AddEntry2RemoteList("Gatetime", RemoteEntryList);
00918         
00919         // Energy
00920         input = mygtk_create_spin_input("Energy", vbox_param, hbox_param);
00921         gtk_object_set_data( GTK_OBJECT (input), "Adjustment_PCS_Name", (void*)("SPA_Energy"));
00922         ec = new Gtk_EntryControl 
00923                 (xsm->EnergyUnit, MLD_WERT_NICHT_OK, &xsm->data.s.Energy,
00924                  0., 500., ".2f", input, 0.1, 1.);
00925         ec->Set_ChangeNoticeFkt(App::spa_energy_check, this);
00926         EC_list = g_slist_prepend( EC_list, ec);
00927         EC_ScanFix_list = g_slist_prepend( EC_ScanFix_list, ec);
00928         spa_energy_check(NULL, this); // First call initializes internal Eold
00929         RemoteEntryList = ec->AddEntry2RemoteList("Energy", RemoteEntryList);
00930         gtk_object_set_data( GTK_OBJECT (vbox), "SPA_Energy", ec);
00931         
00932         
00933         // Display
00934         XSM_DEBUG(DBG_L3, "creating Display controls");
00935         input = mygtk_create_spin_input("CPS high", vbox_param, hbox_param);
00936         gtk_object_set_data( GTK_OBJECT (input), "Adjustment_PCS_Name", (void*)("SPA_CPS_High"));
00937         ec = new Gtk_EntryControl 
00938                 (xsm->CPSHiLoUnit, MLD_WERT_NICHT_OK, &xsm->data.display.cpshigh,
00939                  10., 10e6, ".0f", input, 1., 100.);
00940         SetupScale(ec->GetAdjustment(), hbox_param);
00941         ec->Set_ChangeNoticeFkt(cb_display_changed_hilo, this);
00942         EC_list = g_slist_prepend( EC_list, ec);
00943         RemoteEntryList = ec->AddEntry2RemoteList("CPShigh", RemoteEntryList);
00944         
00945         input = mygtk_create_spin_input("CPS low", vbox_param, hbox_param);
00946         gtk_object_set_data( GTK_OBJECT (input), "Adjustment_PCS_Name", (void*)("SPA_CPS_Low"));
00947         ec = new Gtk_EntryControl 
00948                 (xsm->CPSHiLoUnit, MLD_WERT_NICHT_OK, &xsm->data.display.cpslow,
00949                  0., 10e6,".0f", input, 1., 100.);
00950         SetupScale(ec->GetAdjustment(), hbox_param);
00951         ec->Set_ChangeNoticeFkt(cb_display_changed_hilo, this);
00952         EC_list = g_slist_prepend( EC_list, ec);
00953         RemoteEntryList = ec->AddEntry2RemoteList("CPSlow", RemoteEntryList);
00954         
00955         
00956 #define SPA_CONTRAST_CONTROLS
00957 #ifdef SPA_CONTRAST_CONTROLS
00958         // Display
00959         input = mygtk_create_spin_input("VRange Z", vbox_param, hbox_param);
00960         gtk_object_set_data( GTK_OBJECT (input), "Adjustment_PCS_Name", (void*)("SPA_VRangeZ"));
00961         ec = new Gtk_EntryControl 
00962                 (xsm->data.Zunit, MLD_WERT_NICHT_OK, &xsm->data.display.vrange_z,
00963                  -1e6, 1e6, ".3g", input, 1., 100. );
00964         SetupScale(ec->GetAdjustment(), hbox_param);
00965         ec->Set_ChangeNoticeFkt(cb_display_changed, this);
00966         EC_list = g_slist_prepend( EC_list, ec);
00967         RemoteEntryList = ec->AddEntry2RemoteList("VRangeZ", RemoteEntryList);
00968         gtk_object_set_data( GTK_OBJECT (vbox), "SPM_EC_VRangeZ", ec);
00969         
00970         input = mygtk_create_spin_input("VOffset Z", vbox_param, hbox_param);
00971         gtk_object_set_data( GTK_OBJECT (input), "Adjustment_PCS_Name", (void*)("SPA_VOffsetZ"));
00972         ec = new Gtk_EntryControl 
00973                 (xsm->data.Zunit, MLD_WERT_NICHT_OK, &xsm->data.display.voffset_z,
00974                  -1e6, 1e6, ".2g", input, 1., 100.);
00975         SetupScale(ec->GetAdjustment(), hbox_param);
00976         ec->Set_ChangeNoticeFkt(cb_display_changed, this);
00977         EC_list = g_slist_prepend( EC_list, ec);
00978         RemoteEntryList = ec->AddEntry2RemoteList("VOffsetZ", RemoteEntryList);
00979         gtk_object_set_data( GTK_OBJECT (vbox), "SPM_EC_VOffsetZ", ec);
00980 #endif
00981         
00982         // SPA Offset to (0,0) - for more comfort...
00983         XSM_DEBUG(DBG_L3, "creating Offset controls");
00984         inputM = mygtk_create_input("Offset (0,0)", vbox_param, hbox_param);
00985         ec = new Gtk_EntryControl 
00986                 (xsm->VoltUnit, MLD_WERT_NICHT_OK, &xsm->data.s.SPA_OrgX,
00987                  xsm->XOffsetMin(), xsm->XOffsetMax(), xsm->AktUnit->prec2, inputM);
00988         EC_list = g_slist_prepend( EC_list, ec);
00989         EC_ScanFix_list = g_slist_prepend( EC_ScanFix_list, ec);
00990         RemoteEntryList = ec->AddEntry2RemoteList("Offset00X", RemoteEntryList);
00991         ec->Set_ChangeNoticeFkt(App::spm_offset_check, this);
00992         
00993         inputC = mygtk_add_input(hbox_param);
00994         ec = new Gtk_EntryControl
00995                 (xsm->VoltUnit, MLD_WERT_NICHT_OK, &xsm->data.s.SPA_OrgY,
00996                  xsm->YOffsetMin(), xsm->YOffsetMax(), xsm->AktUnit->prec2, inputC);
00997         EC_list = g_slist_prepend( EC_list, ec);
00998         //  gtk_object_set_data( GTK_OBJECT (inputM), "HasClient", inputC);
00999         EC_ScanFix_list = g_slist_prepend( EC_ScanFix_list, ec);
01000         RemoteEntryList = ec->AddEntry2RemoteList("Offset00Y", RemoteEntryList);
01001         ec->Set_ChangeNoticeFkt(App::spm_offset_check, this);
01002         
01003         
01004         // --------------------------------------------------
01005         // Mode Select
01006         vboxmode = gtk_vbox_new (FALSE, 0);
01007         gtk_widget_show (vboxmode);
01008         gtk_box_pack_start (GTK_BOX (hbox), vboxmode, TRUE, TRUE, 0);
01009         
01010         frame_view = gtk_frame_new ("Modes");
01011         gtk_widget_show (frame_view);
01012         gtk_container_add (GTK_CONTAINER (vboxmode), frame_view);
01013         
01014         vbox_view = gtk_vbox_new (FALSE, 0);
01015         gtk_widget_show (vbox_view);
01016         gtk_container_add (GTK_CONTAINER (frame_view), vbox_view);
01017         
01018         // --------------------------------------------------
01019         // Units Mode: %BZ / Volt
01020         radiobutton = gtk_radio_button_new_with_label (NULL, "Volt");
01021         gtk_box_pack_start (GTK_BOX (vbox_view), radiobutton, TRUE, TRUE, 0);
01022         gtk_widget_show (radiobutton);
01023         gtk_signal_connect (GTK_OBJECT (radiobutton), "clicked",
01024                             GTK_SIGNAL_FUNC (cb_setmode), (void*)MODE_VOLTUNIT);
01025         
01026         radiogroup = gtk_radio_button_group (GTK_RADIO_BUTTON (radiobutton));
01027         
01028         radiobutton = gtk_radio_button_new_with_label( radiogroup, "%BZ");
01029         gtk_box_pack_start (GTK_BOX (vbox_view), radiobutton, TRUE, TRUE, 0);
01030         gtk_widget_show (radiobutton);
01031         gtk_signal_connect (GTK_OBJECT (radiobutton), "clicked",
01032                             GTK_SIGNAL_FUNC (cb_setmode), (void*)MODE_BZUNIT);
01033         
01034         // --------------------------------------------------
01035         
01036         gtk_box_pack_start (GTK_BOX (vbox_view), gtk_hseparator_new (), TRUE, TRUE, 0);
01037         
01038         // --------------------------------------------------
01039         // Energy Mode: Energy [eV] / Phase [1]
01040         radiobutton = gtk_radio_button_new_with_label (NULL, "Energy");
01041         gtk_box_pack_start (GTK_BOX (vbox_view), radiobutton, TRUE, TRUE, 0);
01042         gtk_widget_show (radiobutton);
01043         gtk_signal_connect (GTK_OBJECT (radiobutton), "clicked",
01044                             GTK_SIGNAL_FUNC (cb_setmode), (void*)MODE_ENERGY_EV);
01045         
01046         radiogroup = gtk_radio_button_group (GTK_RADIO_BUTTON (radiobutton));
01047         
01048         radiobutton = gtk_radio_button_new_with_label( radiogroup, "Phase");
01049         gtk_box_pack_start (GTK_BOX (vbox_view), radiobutton, TRUE, TRUE, 0);
01050         gtk_widget_show (radiobutton);
01051         gtk_signal_connect (GTK_OBJECT (radiobutton), "clicked",
01052                             GTK_SIGNAL_FUNC (cb_setmode), (void*)MODE_ENERGY_S);
01053         
01054         /*
01055         // --------------------------------------------------
01056         // Scan Mode: 2D / 1D
01057         radiobutton = gtk_radio_button_new_with_label (NULL, "2D Scan");
01058         gtk_box_pack_start (GTK_BOX (vbox_view), radiobutton, TRUE, TRUE, 0);
01059         gtk_widget_show (radiobutton);
01060         gtk_signal_connect (GTK_OBJECT (radiobutton), "clicked",
01061         GTK_SIGNAL_FUNC (cb_setmode), (void*)MODE_2DIMSCAN);
01062         
01063         radiogroup = gtk_radio_button_group (GTK_RADIO_BUTTON (radiobutton));
01064         
01065         radiobutton = gtk_radio_button_new_with_label( radiogroup, "1D Scan");
01066         gtk_box_pack_start (GTK_BOX (vbox_view), radiobutton, TRUE, TRUE, 0);
01067         gtk_widget_show (radiobutton);
01068         gtk_signal_connect (GTK_OBJECT (radiobutton), "clicked",
01069         GTK_SIGNAL_FUNC (cb_setmode), (void*)MODE_1DIMSCAN);
01070         
01071         */
01072 
01073         // View Mode Radiobuttons
01074         // --------------------------------------------------
01075         frame_view = gtk_frame_new ("View");
01076         gtk_widget_show (frame_view);
01077         gtk_container_add (GTK_CONTAINER (vboxmode), frame_view);
01078         
01079         vbox_view = gtk_vbox_new (FALSE, 0);
01080         gtk_widget_show (vbox_view);
01081         gtk_container_add (GTK_CONTAINER (frame_view), vbox_view);
01082         
01083         radiobutton = gtk_radio_button_new_with_label (NULL, "Quick");
01084         gtk_object_set_data( GTK_OBJECT (vbox), "quickbutton", radiobutton);
01085         gtk_box_pack_start (GTK_BOX (vbox_view), radiobutton, TRUE, TRUE, 0);
01086         gtk_widget_show (radiobutton);
01087 
01088         // Connect the "clicked" signal of the button to our callback
01089         gtk_signal_connect (GTK_OBJECT (radiobutton), "clicked",
01090                             GTK_SIGNAL_FUNC (callback_view), (gpointer) SCAN_V_QUICK);
01091         
01092         radiogroup = gtk_radio_button_group (GTK_RADIO_BUTTON (radiobutton));
01093         
01094         radiobutton = gtk_radio_button_new_with_label( radiogroup, "Direct");
01095         gtk_object_set_data( GTK_OBJECT (vbox), "directbutton", radiobutton);
01096         gtk_box_pack_start (GTK_BOX (vbox_view), radiobutton, TRUE, TRUE, 0);
01097         gtk_widget_show (radiobutton);
01098         gtk_signal_connect (GTK_OBJECT (radiobutton), "clicked",
01099                             GTK_SIGNAL_FUNC (callback_view), (gpointer) SCAN_V_DIRECT);
01100         
01101         radiogroup = gtk_radio_button_group (GTK_RADIO_BUTTON (radiobutton));
01102         
01103         radiobutton = gtk_radio_button_new_with_label( radiogroup, "Plane");
01104         gtk_object_set_data( GTK_OBJECT (vbox), "planesubbutton", radiobutton);
01105         gtk_box_pack_start (GTK_BOX (vbox_view), radiobutton, TRUE, TRUE, 0);
01106         gtk_widget_show (radiobutton);
01107         gtk_signal_connect (GTK_OBJECT (radiobutton), "clicked",
01108                             GTK_SIGNAL_FUNC (callback_view), (gpointer) SCAN_V_PLANESUB);
01109         
01110         radiogroup = gtk_radio_button_group (GTK_RADIO_BUTTON (radiobutton));
01111         
01112         radiobutton = gtk_radio_button_new_with_label( radiogroup, "Logarith.");
01113         gtk_object_set_data( GTK_OBJECT (vbox), "logbutton", radiobutton);
01114         gtk_box_pack_start (GTK_BOX (vbox_view), radiobutton, TRUE, TRUE, 0);
01115         gtk_widget_show (radiobutton);
01116         gtk_signal_connect (GTK_OBJECT (radiobutton), "clicked",
01117                             GTK_SIGNAL_FUNC (callback_view), (gpointer) SCAN_V_LOG);
01118         
01119         radiogroup = gtk_radio_button_group (GTK_RADIO_BUTTON (radiobutton));
01120         
01121         radiobutton = gtk_radio_button_new_with_label( radiogroup, "Horizont");
01122         gtk_object_set_data( GTK_OBJECT (vbox), "horizontbutton", radiobutton);
01123         gtk_box_pack_start (GTK_BOX (vbox_view), radiobutton, TRUE, TRUE, 0);
01124         gtk_widget_show (radiobutton);
01125         gtk_signal_connect (GTK_OBJECT (radiobutton), "clicked",
01126                             GTK_SIGNAL_FUNC (callback_view), (gpointer) SCAN_V_HORIZONTAL);
01127         
01128         radiogroup = gtk_radio_button_group (GTK_RADIO_BUTTON (radiobutton));
01129         
01130         radiobutton = gtk_radio_button_new_with_label( radiogroup, "Diff.");
01131         gtk_object_set_data( GTK_OBJECT (vbox), "differentialbutton", radiobutton);
01132         gtk_box_pack_start (GTK_BOX (vbox_view), radiobutton, TRUE, TRUE, 0);
01133         gtk_widget_show (radiobutton);
01134         gtk_signal_connect (GTK_OBJECT (radiobutton), "clicked",
01135                             GTK_SIGNAL_FUNC (callback_view), (gpointer) SCAN_V_DIFFERENTIAL);
01136                 
01137         radiogroup = gtk_radio_button_group (GTK_RADIO_BUTTON (radiobutton));
01138         
01139         radiobutton = gtk_radio_button_new_with_label( radiogroup, "Periodic");
01140         gtk_object_set_data( GTK_OBJECT (vbox), "periodicbutton", radiobutton);
01141         gtk_box_pack_start (GTK_BOX (vbox_view), radiobutton, TRUE, TRUE, 0);
01142         gtk_widget_show (radiobutton);
01143         
01144         
01145         // save lists away
01146         gtk_object_set_data( GTK_OBJECT (vbox), "SPM_EC_list", EC_list);
01147         gtk_object_set_data( GTK_OBJECT (vbox), "SPM_SCANFIX_EC_list", EC_ScanFix_list);
01148         gtk_object_set_data( GTK_OBJECT (vbox), "SPA_EnergyDepend_list", EC_EnergyDep_list);
01149         gtk_object_set_data( GTK_OBJECT (vbox), "SPA_EnergyDependEC_list", EC_EnergyDepEC_list);
01150         gtk_object_set_data( GTK_OBJECT (vbox), "SPA_Ysize_entrys", EC_Ysize_list);
01151         
01152         return(vbox);
01153 }
01154 
01155 
01156 void App::spa_update(){
01157         g_slist_foreach (
01158                 (GSList*) gtk_object_get_data (
01159                         GTK_OBJECT (spm_control), "SPM_EC_list"),
01160                 (GFunc) App::update_ec, NULL);
01161         ui_update();
01162         as_update();
01163 }
01164 
01165 GtkWidget* App::create_as_control (){
01166         GSList *EC_list=NULL;
01167         
01168         GtkWidget *vbox;
01169         GtkWidget *hbox;
01170         GtkWidget *frame_param, *vbox_param, *hbox_param;
01171         
01172         GtkWidget *input;
01173         
01174         GtkWidget *checkbutton;
01175         
01176         vbox = gtk_vbox_new (FALSE, 0);
01177         gtk_widget_show (vbox);
01178         
01179         gtk_box_pack_start (GTK_BOX (main_control), vbox, TRUE, TRUE, 0);
01180         
01181         hbox = gtk_hbox_new (FALSE, 0);
01182         gtk_widget_show (hbox);
01183         gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
01184         
01185         frame_param = gtk_frame_new (_("File/Autosave"));
01186         gtk_widget_show (frame_param);
01187         gtk_container_add (GTK_CONTAINER (hbox), frame_param);
01188         
01189         vbox_param = gtk_vbox_new (FALSE, 0);
01190         gtk_widget_show (vbox_param);
01191         gtk_container_add (GTK_CONTAINER (frame_param), vbox_param);
01192         
01193         input = mygtk_create_input(_("Basename/#"), vbox_param, hbox_param);
01194         gtk_object_set_data( GTK_OBJECT (vbox), "basename", input);
01195         gtk_signal_connect (GTK_OBJECT (input), "changed",
01196                             GTK_SIGNAL_FUNC (cbbasename),
01197                             this);
01198         
01199         input = mygtk_add_input(hbox_param);
01200         static Gtk_EntryControl Counter(xsm->Unity, MLD_WERT_NICHT_OK, &xsm->counter,
01201                                         0., 99999., "05.0f", input);
01202         EC_list = g_slist_prepend( EC_list, &Counter);
01203         RemoteEntryList = Counter.AddEntry2RemoteList(_("Counter"), RemoteEntryList);
01204         
01205         checkbutton = gtk_check_button_new_with_label( _("Auto Save"));
01206         gtk_box_pack_start (GTK_BOX (hbox_param), checkbutton, TRUE, TRUE, 0);
01207         gtk_widget_show (checkbutton);
01208         gtk_signal_connect (GTK_OBJECT (checkbutton), "clicked",
01209                             GTK_SIGNAL_FUNC (cb_setmode), (void*)MODE_AUTOSAVE);
01210         
01211         input = mygtk_create_input(_("Originalname"), vbox_param, hbox_param);
01212         gtk_object_set_data( GTK_OBJECT (vbox), "originalname", input);
01213         gtk_entry_set_editable(GTK_ENTRY(input), FALSE);
01214         
01215         // save List away...
01216         gtk_object_set_data( GTK_OBJECT (vbox), "AS_EC_list", EC_list);
01217         
01218         return(vbox);
01219 }
01220 
01221 
01222 void App::as_update(){
01223         g_slist_foreach (
01224                 (GSList*) gtk_object_get_data (
01225                         GTK_OBJECT (as_control), "AS_EC_list"),
01226                 (GFunc) App::update_ec, NULL);
01227         gtk_entry_set_text ((GTK_ENTRY (gtk_object_get_data( GTK_OBJECT (as_control), "basename"))), 
01228                             xsm->data.ui.basename);
01229         gtk_entry_set_text ((GTK_ENTRY (gtk_object_get_data( GTK_OBJECT (as_control), "originalname"))), 
01230                             xsm->data.ui.originalname);
01231 }
01232 
01233 void App::as_setdata(){
01234         xsm->data.ui.SetBaseName (
01235                 gtk_entry_get_text (GTK_ENTRY 
01236                                     (gtk_object_get_data( GTK_OBJECT (as_control), 
01237                                                           "basename") ) )
01238                 );
01239 }
01240 
01241 GtkWidget* App::create_ui_control (){
01242         //  GSList *EC_list=NULL;
01243         
01244         GtkWidget *vbox;
01245         GtkWidget *vbox_frame, *h;
01246         GtkWidget *frame;
01247         GtkWidget *text, *input;
01248         GtkWidget *scrolled_window;
01249         
01250         vbox = gtk_vbox_new (FALSE, 0);
01251         gtk_box_pack_start (GTK_BOX (main_control), vbox, TRUE, TRUE, 0);
01252 
01253         frame = gtk_frame_new (_("User Info & Comment"));
01254         gtk_container_add (GTK_CONTAINER (vbox), frame);
01255         
01256         vbox_frame = gtk_vbox_new (FALSE, 0);
01257         gtk_container_add (GTK_CONTAINER (frame), vbox_frame);
01258         
01259         text = gtk_text_view_new ();
01260         scrolled_window = gtk_scrolled_window_new (NULL, NULL);
01261         gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
01262         gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_IN);
01263         gtk_widget_set_size_request (scrolled_window, -1, 70);
01264 
01265         gtk_container_add (GTK_CONTAINER (scrolled_window),
01266                            GTK_WIDGET (text)) ;
01267         gtk_container_add (GTK_CONTAINER (vbox_frame),
01268                            scrolled_window);
01269 
01270         GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text));
01271         gtk_text_buffer_set_text (buffer, _("Hey here is no comment yet!"), -1);
01272         gtk_object_set_data( GTK_OBJECT (vbox), "comment", buffer);
01273 //      gtk_signal_connect (GTK_OBJECT (buffer), "changed",
01274 //                          GTK_SIGNAL_FUNC (cbtext), this);
01275         
01276         input = mygtk_create_input(_("Date of Scan"), vbox_frame, h);
01277         gtk_object_set_data( GTK_OBJECT (vbox), "dateofscan", input);
01278         gtk_entry_set_editable(GTK_ENTRY(input), FALSE);
01279         
01280         
01281         //  EC_list = g_slist_prepend( EC_list, &Rx);
01282         //  gtk_object_set_data( GTK_OBJECT (vbox), "UI_EC_list", EC_list);
01283         
01284         gtk_widget_show_all (vbox);
01285         return(vbox);
01286 }
01287 
01288 void App::ui_update(){
01289         static gchar* comment_tmp = NULL;
01290         if(xsm->data.ui.comment){
01291 #if 1
01292                 if (comment_tmp){ // signal changed did not work, workaround here
01293                         if (!strcmp (comment_tmp, xsm->data.ui.comment))
01294                                 ui_setcomment ();
01295                         g_free (comment_tmp);
01296                         comment_tmp = g_strdup (xsm->data.ui.comment);
01297                 } else 
01298                         comment_tmp = g_strdup (xsm->data.ui.comment);
01299 #endif
01300                 GtkTextBuffer *buffer = (GtkTextBuffer*)gtk_object_get_data( GTK_OBJECT (ui_control), "comment");
01301 
01302                 const gchar *ve=NULL;
01303                 if (!g_utf8_validate ((const gchar*) xsm->data.ui.comment, -1, &ve)){
01304                         gsize br, bw;
01305                         g_print ("\nERROR at:\n");
01306                         g_print ((const gchar*) ve);
01307                         
01308                         g_print ((const gchar*) xsm->data.ui.comment);
01309                         
01310                         gchar *tmp = g_convert_with_fallback ((const gchar*) xsm->data.ui.comment,
01311                                                                strlen ((const gchar*) xsm->data.ui.comment),
01312                                                                "UTF-8",
01313                                                                "G_LOCALE",
01314                                                                "?",
01315                                                                &br, &bw,
01316                                                                NULL);
01317                         if (!tmp)
01318                                 tmp = g_strdup_printf ("Error while converting to UTF8. <%2x> r%d, w%d, l%d", 
01319                                                        *ve, (int)br, (int)bw, (int)strlen ((const gchar*) xsm->data.ui.comment));
01320                         g_free(xsm->data.ui.comment);
01321                         xsm->data.ui.comment = g_strdup (tmp);
01322                         g_free (tmp);
01323                 }
01324                 gtk_text_buffer_set_text ( buffer, (const gchar*) xsm->data.ui.comment, -1);
01325         }
01326         if(xsm->data.ui.dateofscan){
01327                 gtk_entry_set_text ((GTK_ENTRY (gtk_object_get_data( GTK_OBJECT (ui_control), 
01328                                                                      "dateofscan"))),
01329                                     xsm->data.ui.dateofscan);
01330         }
01331         XSM_DEBUG(0, "ui.comment updated from data: " << xsm->data.ui.comment);
01332         //  g_slist_foreach(gtk_object_get_data( GTK_OBJECT (ui_control), "UI_EC_list"),
01333         //                (GFunc) App::update_ec, NULL);
01334 }
01335 
01336 void App::ui_setcomment(){
01337         GtkTextIter s,e;
01338         GtkTextBuffer *buffer = (GtkTextBuffer*)gtk_object_get_data( GTK_OBJECT (ui_control), "comment");
01339         gtk_text_buffer_get_bounds (buffer, &s, &e);
01340 
01341         gchar *txt = gtk_text_buffer_get_text (buffer, &s, &e, FALSE);
01342 
01343         g_free(xsm->data.ui.comment);
01344         xsm->data.ui.comment = g_strdup (txt);
01345         XSM_DEBUG(0, "ui.comment changed: " << xsm->data.ui.comment);
01346 }

Generated on Sat Apr 1 09:03:48 2006 for GXSM by  doxygen 1.4.6