app_v3dcontrol.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 
00029 #include <locale.h>
00030 #include <libintl.h>
00031 
00032 #include "gnome-res.h"
00033 
00034 #include "gxsm_app.h"
00035 
00036 #include "unit.h"
00037 #include "pcs.h"
00038 #include "xsmtypes.h"
00039 #include "action_id.h"
00040 #include "glbvars.h"
00041 
00042 #include "app_profile.h"
00043 #include "app_vobj.h"
00044 #include "app_v3dcontrol.h"
00045 #include "app_v3dpopupdef.h"
00046 
00047 #include <gtk/gtk.h>
00048 #include <gtk/gtkgl.h>
00049 #include <GL/gl.h>
00050 #include <GL/glu.h>
00051 
00052 #include <gdk/gdkkeysyms.h>
00053 
00054 
00055 // V3dControl
00056 // ========================================
00057 
00058 void V3dControl::AppWidgetInit(gchar *title, int InWindow){
00059         XSM_DEBUG(DBG_L2, "V3dControl::WidgetInit" );
00060         InWindowFlg = InWindow;
00061         // we have our own window
00062         if(InWindowFlg){
00063                 widget = gtk_window_new (GTK_WINDOW_TOPLEVEL);
00064                 gtk_object_set_data (GTK_OBJECT (widget), "widget", widget);
00065                 gtk_window_set_title (GTK_WINDOW (widget), title);
00066                 gtk_window_set_policy (GTK_WINDOW (widget), TRUE, TRUE, FALSE);
00067                 gtk_signal_connect(GTK_OBJECT(widget),
00068                                    "delete_event",
00069                                    GTK_SIGNAL_FUNC(App::close_scan_event_cb),
00070                                    this);
00071         }else{
00072                 widget = NULL;
00073         }
00074         vbox = gtk_vbox_new (FALSE, 0);
00075         gtk_object_set_data (GTK_OBJECT (widget), "vbox", vbox);
00076         gtk_widget_show (vbox);
00077   
00078         if(widget)
00079                 gtk_container_add (GTK_CONTAINER (widget), vbox);
00080         else
00081                 // we are only a pure widget
00082                 widget=vbox;
00083         XSM_DEBUG(DBG_L2, "V3dControl::WidgetInit done." );
00084 }
00085 
00086 V3dControl::V3dControl (char *title, int ChNo, Scan *sc, 
00087                         GCallback realize,
00088                         GCallback configure_event,
00089                         GCallback expose_event,
00090                         void *vdata){
00091         GtkWidget *statusbar;
00092         GdkGLConfig *glconfig;
00093         gint major, minor;
00094 
00095         XSM_DEBUG(DBG_L2, "V3dControl::V3dControl" );
00096 
00097         WheelFkt = &Surf3d::Zoom;
00098         scan = sc;
00099         chno=ChNo;
00100 
00101         AppWidgetInit(title);
00102         gtk_object_set_data  (GTK_OBJECT (widget), "Ch", (void*)ChNo);
00103         gtk_object_set_data  (GTK_OBJECT (widget), "ChNo", (void*)(ChNo+1));
00104         gapp->configure_drop_on_widget(widget);
00105 
00106         gtk_window_set_default_size(GTK_WINDOW(widget), 300, 200);
00107 
00108         // Perform the resizes immediately
00109         gtk_container_set_resize_mode (GTK_CONTAINER (widget), GTK_RESIZE_IMMEDIATE);
00110 
00111         // Get automatically redrawn if any of their children changed allocation
00112         gtk_container_set_reallocate_redraws (GTK_CONTAINER (widget), TRUE);
00113 
00114         /*
00115          * Query OpenGL extension version.
00116          */
00117         
00118         gdk_gl_query_version (&major, &minor);
00119         XSM_DEBUG(DBG_L2, "OpenGL extension version - " << major << "." << minor);
00120 
00121         /*
00122          * Configure OpenGL-capable visual.
00123          */
00124 
00125         /* Try double-buffered visual */
00126         glconfig = gdk_gl_config_new_by_mode ((GdkGLConfigMode) (GDK_GL_MODE_RGB    |
00127                                                                  GDK_GL_MODE_DEPTH  |
00128                                                                  GDK_GL_MODE_DOUBLE));
00129 
00130         if (glconfig == NULL)
00131         {
00132                 XSM_DEBUG (DBG_L2, 
00133                            "*** Cannot find the double-buffered visual.\n"
00134                            "*** Trying single-buffered visual.");
00135                 
00136                 /* Try single-buffered visual */
00137                 glconfig = gdk_gl_config_new_by_mode ((GdkGLConfigMode) (GDK_GL_MODE_RGB   |
00138                                                                          GDK_GL_MODE_DEPTH));
00139                 if (glconfig == NULL)
00140                 {
00141                         XSM_DEBUG (DBG_L2, "*** No appropriate OpenGL-capable visual found.");
00142                         //                      glarea = gtk_label_new (gdk_gl_get_info ());
00143                         glarea = gtk_label_new ("No appropriate OpenGL-capable visual found.");
00144                 }
00145         }
00146 
00147         if (glconfig){
00148                 glarea = gtk_drawing_area_new ();
00149 
00150                 gtk_widget_set_size_request (glarea, 300, 200);
00151 
00152                 /* Set OpenGL-capability to the widget. */
00153                 gtk_widget_set_gl_capability (glarea,
00154                                               glconfig,
00155                                               NULL,
00156                                               TRUE,
00157                                               GDK_GL_RGBA_TYPE);
00158                 
00159                 gtk_widget_add_events (glarea,
00160                                        GDK_BUTTON1_MOTION_MASK    |
00161                                        GDK_BUTTON2_MOTION_MASK    |
00162                                        GDK_BUTTON_PRESS_MASK      |
00163                                        GDK_VISIBILITY_NOTIFY_MASK);
00164                 
00165                 g_signal_connect_after (G_OBJECT (glarea), "realize",
00166                                         G_CALLBACK (realize), NULL);
00167                 g_signal_connect (G_OBJECT (glarea), "configure_event",
00168                                   G_CALLBACK (configure_event), NULL);
00169                 g_signal_connect (G_OBJECT (glarea), "expose_event",
00170                                   G_CALLBACK (expose_event), NULL);
00171                 
00172         }
00173         
00174         // put glarea into window and show it all
00175         gtk_box_pack_start (GTK_BOX (vbox), glarea, TRUE, TRUE, 0);
00176         gtk_widget_show (GTK_WIDGET (glarea));
00177         
00178         gtk_signal_connect (GTK_OBJECT (glarea), "event",
00179                             (GtkSignalFunc) V3dControl::glarea_event_cb,
00180                             this);
00181 
00182         // New Statusbar
00183         statusbar = gtk_statusbar_new ();
00184         gtk_box_pack_start (GTK_BOX (vbox), statusbar, FALSE, TRUE, 0);
00185         gtk_widget_show (statusbar);
00186 
00187         // New PopUp Menu
00188         VPopup = gnome_popup_menu_new (scan_v3d_popup_menu);
00189         gnome_popup_menu_attach (VPopup, glarea, this);
00190 
00191         gtk_object_set_data (GTK_OBJECT (glarea), "vdata", vdata);
00192         gtk_object_set_data (GTK_OBJECT (glarea), "statusbar", statusbar);
00193         gtk_object_set_data (GTK_OBJECT (glarea), "Ch", (void*)ChNo);
00194         gtk_object_set_data (GTK_OBJECT (glarea), "V3dControl", this);
00195         gtk_object_set_data (GTK_OBJECT (glarea), "viewpopup", VPopup);
00196 
00197         gtk_widget_show (widget);
00198         XSM_DEBUG(DBG_L2, "V3dControl::V3dControl done." );
00199 }
00200 
00201 V3dControl::~V3dControl (){
00202         XSM_DEBUG(DBG_L2, "~V3dControl in" );
00203         gtk_widget_destroy (glarea);
00204         XSM_DEBUG(DBG_L2, "~V3dControl out" );
00205 }
00206 
00207 void V3dControl::SetTitle(char *title){
00208         gtk_window_set_title (GTK_WINDOW (widget), title);
00209         CheckOptions();
00210 }
00211 
00212 void V3dControl::SetActive(int flg){
00213         GtkWidget *statusbar = (GtkWidget*)gtk_object_get_data (GTK_OBJECT (glarea), "statusbar");
00214         gint statusid  = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), "drag");
00215 
00216         if(flg){
00217                 gtk_statusbar_push(GTK_STATUSBAR(statusbar), statusid, "channel is active now");
00218         }else{
00219                 gtk_statusbar_push(GTK_STATUSBAR(statusbar), statusid, "inactive");
00220         }
00221 }
00222 
00223 void V3dControl::CheckOptions(){
00224         GtkWidget *menushell;
00225         GtkWidget *menuitem;
00226         gint pos;
00227         gchar *vmode=NULL;
00228 
00229         switch(scan->GetVM()){
00230         case SCAN_V_DIRECT: vmode=g_strconcat(_("View"),"/Direct", NULL); break;
00231         case SCAN_V_QUICK:  vmode=g_strconcat(_("View"),"/Quick", NULL); break;
00232         case SCAN_V_LOG:    vmode=g_strconcat(_("View"),"/Logarithmic", NULL); break;
00233         case SCAN_V_DIFFERENTIAL:    vmode=g_strconcat(_("View"),"/Differential", NULL); break;
00234         case SCAN_V_PERIODIC:    vmode=g_strconcat(_("View"),"/Periodic", NULL); break;
00235         }
00236         if(vmode){
00237                 menushell = (GtkWidget*)gnome_app_find_menu_pos 
00238                         (
00239                                 (GtkWidget*)gtk_object_get_data (GTK_OBJECT (glarea), "viewpopup"), 
00240                                 vmode, 
00241                                 &pos
00242                                 );
00243                 g_free(vmode);
00244                 if(menushell){
00245                         menuitem = (GtkWidget*)g_list_nth_data(GTK_MENU_SHELL (menushell) -> children, --pos);
00246                         if(menuitem)
00247                                 //      gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
00248                                 ; // crshed. :=(
00249                 }
00250         }
00251 }
00252 
00253 gint V3dControl::glarea_event_cb(GtkWidget *glarea, GdkEvent *event, V3dControl *vc){
00254         static int dragging=FALSE;
00255         static int busy=0;
00256         static double xs,ys;
00257         //  gchar *mld;
00258         //  GdkCursor *fleur;
00259         double x,y;
00260         x = event->button.x;
00261         y = event->button.y;
00262         switch (event->type) 
00263         {
00264         case GDK_BUTTON_PRESS:
00265                 switch(event->button.button) 
00266                 {
00267                 case 1: 
00268                         dragging=TRUE;
00269                         xs=x; ys=y;
00270                         break;
00271                 case 2:
00272                         dragging=TRUE;
00273                         xs=x; ys=y;
00274                         break;
00275                 case 3: 
00276                         break;
00277                 case 4:
00278                         (((Surf3d*)gtk_object_get_data (GTK_OBJECT (glarea), "vdata"))->*(vc->WheelFkt))(1.0);
00279                         break;
00280                 case 5:
00281                         (((Surf3d*)gtk_object_get_data (GTK_OBJECT (glarea), "vdata"))->*(vc->WheelFkt))(-1.0);
00282                         break;
00283                 }
00284                 break;
00285 
00286         case GDK_MOTION_NOTIFY:
00287                 if(!busy){
00288                         busy=1;
00289                         if (dragging && (event->motion.state & GDK_BUTTON1_MASK)){
00290                                 ((Surf3d*)gtk_object_get_data (GTK_OBJECT (glarea), "vdata"))->Rotate(1, xs-x);
00291                                 ((Surf3d*)gtk_object_get_data (GTK_OBJECT (glarea), "vdata"))->Rotate(2, y-ys);
00292                                 ((Surf3d*)gtk_object_get_data (GTK_OBJECT (glarea), "vdata"))->GLdrawscene(); 
00293                                 xs=x; ys=y;
00294                         }
00295                         if (dragging && (event->motion.state & GDK_BUTTON2_MASK)){
00296                                 ((Surf3d*)gtk_object_get_data (GTK_OBJECT (glarea), "vdata"))->Translate(0, x-xs);
00297                                 ((Surf3d*)gtk_object_get_data (GTK_OBJECT (glarea), "vdata"))->Translate(1, ys-y);
00298                                 ((Surf3d*)gtk_object_get_data (GTK_OBJECT (glarea), "vdata"))->GLdrawscene(); 
00299                                 xs=x; ys=y;
00300                         }
00301                         busy=0;
00302                 }
00303                 break;
00304 
00305         case GDK_BUTTON_RELEASE:
00306                 switch(event->button.button){
00307                 case 1:
00308                         dragging=FALSE;
00309                         break;
00310                 case 2:
00311                         dragging=FALSE;
00312                         break;
00313                 }
00314                 break;
00315         default: break;
00316         }
00317         return FALSE;
00318 }
00319 
00320 void V3dControl::Activate_callback (GtkWidget *widget, V3dControl *vc){
00321         gapp->xsm->ActivateChannel(vc->chno);
00322 }
00323 void V3dControl::SetOff_callback (GtkWidget *widget, V3dControl *vc){
00324         gapp->xsm->SetMode(vc->chno, ID_CH_M_OFF);
00325 }
00326 void V3dControl::SetOn_callback (GtkWidget *widget, V3dControl *vc){
00327         gapp->xsm->SetMode(vc->chno, ID_CH_M_ON);
00328 }
00329 void V3dControl::SetMath_callback (GtkWidget *widget, V3dControl *vc){
00330         gapp->xsm->SetMode(vc->chno, ID_CH_M_MATH);
00331 }
00332 void V3dControl::SetX_callback (GtkWidget *widget, V3dControl *vc){
00333         gapp->xsm->SetMode(vc->chno, ID_CH_M_X);
00334 }
00335 
00336 void V3dControl::AutoDisp_callback (GtkWidget *widget, V3dControl *vc){
00337         gapp->xsm->ActivateChannel(vc->chno);
00338         gapp->xsm->AutoDisplay();
00339 }
00340 
00341 void V3dControl::apply_all_callback (GtkWidget *widget, V3dControl *vc){
00342         ((Surf3d*)gtk_object_get_data (GTK_OBJECT (vc->glarea), "vdata"))
00343                 ->GLupdate(gtk_object_get_data (GTK_OBJECT (vc->glarea), "vdata"));
00344 }
00345 
00346 void V3dControl::view_file_openhere_callback (GtkWidget *widget, V3dControl *vc){
00347         gapp->xsm->ActivateChannel(vc->chno);
00348         gapp->xsm->load();
00349 }
00350 
00351 void V3dControl::view_file_save_callback (GtkWidget *widget, V3dControl *vc){
00352         gapp->xsm->save(TRUE, NULL, vc->chno);
00353 }
00354 
00355 void V3dControl::view_file_save_as_callback (GtkWidget *widget, V3dControl *vc){
00356         gapp->xsm->save(FALSE, NULL, vc->chno);
00357 }
00358 
00359 void V3dControl::view_file_save_image_callback (GtkWidget *widget, V3dControl *vc){
00360         XSM_DEBUG(DBG_L2, "Sorry, I'm working on!" );
00361 //      ((Surf3d*)gtk_object_get_data (GTK_OBJECT (vc->glarea), "vdata"))->
00362 //              save_to_image(imagename);
00363 }
00364 
00365 void V3dControl::view_file_print_callback (GtkWidget *widget, V3dControl *vc){
00366         gapp->xsm->ActivateChannel(vc->chno);
00367         gapp->file_print_callback(widget, NULL);
00368 }
00369 
00370 void V3dControl::view_file_kill_callback (GtkWidget *widget, V3dControl *vc){
00371         gapp->xsm->SetMode(vc->chno, ID_CH_M_OFF);
00372 }
00373 
00374 // ---------------
00375 
00376 void V3dControl::view_view_direct_callback (GtkWidget *widget, V3dControl *vc){
00377         if (GTK_CHECK_MENU_ITEM (widget)->active){
00378                 //    vc->scan->SetVM(SCAN_V_DIRECT);
00379                 gapp->xsm->ActivateChannel(vc->chno);
00380                 gapp->xsm->SetVM(SCAN_V_DIRECT);
00381         }
00382 }
00383 
00384 void V3dControl::view_view_quick_callback (GtkWidget *widget, V3dControl *vc){
00385         if (GTK_CHECK_MENU_ITEM (widget)->active){
00386                 //    vc->scan->SetVM(SCAN_V_QUICK);
00387                 gapp->xsm->ActivateChannel(vc->chno);    
00388                 gapp->xsm->SetVM(SCAN_V_QUICK);
00389         }
00390 }
00391 
00392 void V3dControl::view_view_log_callback (GtkWidget *widget, V3dControl *vc){
00393         if (GTK_CHECK_MENU_ITEM (widget)->active){
00394                 //    vc->scan->SetVM(SCAN_V_LOG);
00395                 gapp->xsm->ActivateChannel(vc->chno);
00396                 gapp->xsm->SetVM(SCAN_V_LOG);
00397         }
00398 }
00399 
00400 void V3dControl::view_view_horizont_callback (GtkWidget *widget, V3dControl *vc){
00401         if (GTK_CHECK_MENU_ITEM (widget)->active){
00402                 //    vc->scan->SetVM(SCAN_V_HORIZONTAL);
00403                 gapp->xsm->ActivateChannel(vc->chno);
00404                 gapp->xsm->SetVM(SCAN_V_HORIZONTAL);
00405         }
00406 }
00407 
00408 void V3dControl::view_view_periodic_callback (GtkWidget *widget, V3dControl *vc){
00409         if (GTK_CHECK_MENU_ITEM (widget)->active)
00410                 //    vc->scan->SetVM(SCAN_V_PERIODIC);
00411                 gapp->xsm->ActivateChannel(vc->chno);
00412         gapp->xsm->SetVM(SCAN_V_PERIODIC);
00413 }
00414 
00415 void V3dControl::view_view_differential_callback (GtkWidget *widget, V3dControl *vc){
00416         if (GTK_CHECK_MENU_ITEM (widget)->active)
00417                 //    vc->scan->SetVM(SCAN_V_DIFFERENTIAL);
00418                 gapp->xsm->ActivateChannel(vc->chno);
00419         gapp->xsm->SetVM(SCAN_V_DIFFERENTIAL);
00420 }
00421 
00422 void V3dControl::view_GL_Mesh_callback (GtkWidget *widget, V3dControl *vc){
00423         ((Surf3d*)gtk_object_get_data (GTK_OBJECT (vc->glarea), "vdata"))->
00424                 GLModes(ID_GL_Mesh, (GTK_CHECK_MENU_ITEM (widget)->active));
00425 }
00426 void V3dControl::view_GL_Ticks_callback (GtkWidget *widget, V3dControl *vc){
00427         ((Surf3d*)gtk_object_get_data (GTK_OBJECT (vc->glarea), "vdata"))->
00428                 GLModes(ID_GL_Ticks, (GTK_CHECK_MENU_ITEM (widget)->active));
00429 }
00430 void V3dControl::view_GL_Smooth_callback (GtkWidget *widget, V3dControl *vc){
00431         ((Surf3d*)gtk_object_get_data (GTK_OBJECT (vc->glarea), "vdata"))->
00432                 GLModes(ID_GL_Smooth, (GTK_CHECK_MENU_ITEM (widget)->active));
00433 }
00434 void V3dControl::view_GL_nZP_callback (GtkWidget *widget, V3dControl *vc){
00435         ((Surf3d*)gtk_object_get_data (GTK_OBJECT (vc->glarea), "vdata"))->
00436                 GLModes(ID_GL_nZP, (GTK_CHECK_MENU_ITEM (widget)->active));
00437 }
00438 
00439 void V3dControl::view_GL_Wh_zoom_callback (GtkWidget *widget, V3dControl *vc){
00440         if( GTK_CHECK_MENU_ITEM (widget)->active )
00441                 vc->WheelFkt = &Surf3d::Zoom; 
00442 }
00443 void V3dControl::view_GL_Wh_rotX_callback (GtkWidget *widget, V3dControl *vc){
00444         if( GTK_CHECK_MENU_ITEM (widget)->active )
00445                 vc->WheelFkt = &Surf3d::RotateX;
00446 }
00447 void V3dControl::view_GL_Wh_rotY_callback (GtkWidget *widget, V3dControl *vc){
00448         if( GTK_CHECK_MENU_ITEM (widget)->active )
00449                 vc->WheelFkt = &Surf3d::RotateY;
00450 }
00451 void V3dControl::view_GL_Wh_rotZ_callback (GtkWidget *widget, V3dControl *vc){
00452         if( GTK_CHECK_MENU_ITEM (widget)->active )
00453                 vc->WheelFkt = &Surf3d::RotateZ;
00454 }
00455 void V3dControl::view_GL_Wh_Zskl_callback (GtkWidget *widget, V3dControl *vc){
00456         if( GTK_CHECK_MENU_ITEM (widget)->active )
00457                 vc->WheelFkt = &Surf3d::HeightSkl; 
00458 }
00459 
00460 void V3dControl::preferences_callback (GtkWidget *widget, V3dControl *vc){
00461         ((Surf3d*)gtk_object_get_data (GTK_OBJECT (vc->glarea), "vdata"))->
00462                 preferences();
00463 }

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