00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
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
00056
00057
00058 void V3dControl::AppWidgetInit(gchar *title, int InWindow){
00059 XSM_DEBUG(DBG_L2, "V3dControl::WidgetInit" );
00060 InWindowFlg = InWindow;
00061
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
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
00109 gtk_container_set_resize_mode (GTK_CONTAINER (widget), GTK_RESIZE_IMMEDIATE);
00110
00111
00112 gtk_container_set_reallocate_redraws (GTK_CONTAINER (widget), TRUE);
00113
00114
00115
00116
00117
00118 gdk_gl_query_version (&major, &minor);
00119 XSM_DEBUG(DBG_L2, "OpenGL extension version - " << major << "." << minor);
00120
00121
00122
00123
00124
00125
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
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
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
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
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
00183 statusbar = gtk_statusbar_new ();
00184 gtk_box_pack_start (GTK_BOX (vbox), statusbar, FALSE, TRUE, 0);
00185 gtk_widget_show (statusbar);
00186
00187
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
00248 ;
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
00258
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
00362
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
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
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
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
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
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
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 }