d8025698f026f772b825c8356bb36e5b9816b42d
[blender-staging.git] / source / blender / editors / space_view3d / view3d_header.c
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. 
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2004-2008 Blender Foundation.
21  * All rights reserved.
22  *
23  * 
24  * Contributor(s): Blender Foundation
25  *
26  * ***** END GPL LICENSE BLOCK *****
27  */
28
29 #include <string.h>
30 #include <stdio.h>
31 #include <stdlib.h>
32
33 #include "DNA_armature_types.h"
34 #include "DNA_ID.h"
35 #include "DNA_image_types.h"
36 #include "DNA_meshdata_types.h"
37 #include "DNA_mesh_types.h"
38 #include "DNA_object_types.h"
39 #include "DNA_space_types.h"
40 #include "DNA_scene_types.h"
41 #include "DNA_screen_types.h"
42 #include "DNA_texture_types.h"
43 #include "DNA_userdef_types.h" /* U.smooth_viewtx */
44 #include "DNA_view3d_types.h"
45 #include "DNA_windowmanager_types.h"
46
47 #include "MEM_guardedalloc.h"
48
49 #include "BKE_action.h"
50 #include "BKE_context.h"
51 #include "BKE_curve.h"
52 #include "BKE_depsgraph.h"
53 #include "BKE_displist.h"
54 #include "BKE_effect.h"
55 #include "BKE_global.h"
56 #include "BKE_image.h"
57 #include "BKE_library.h"
58 #include "BKE_main.h"
59 #include "BKE_mesh.h"
60 #include "BKE_modifier.h"
61 #include "BKE_particle.h"
62 #include "BKE_screen.h"
63 #include "BKE_utildefines.h" /* for VECCOPY */
64
65 #include "ED_armature.h"
66 #include "ED_object.h"
67 #include "ED_mesh.h"
68 #include "ED_util.h"
69 #include "ED_screen.h"
70 #include "ED_types.h"
71
72 #include "WM_api.h"
73 #include "WM_types.h"
74
75 #include "BIF_gl.h"
76 #include "BIF_glutil.h"
77 #include "BIF_transform.h"
78
79 #include "BLI_arithb.h"
80 #include "BLI_blenlib.h"
81 #include "BLI_editVert.h"
82
83 #include "UI_interface.h"
84 #include "UI_interface_icons.h"
85 #include "UI_resources.h"
86 #include "UI_view2d.h"
87
88 #include "BMF_Api.h"
89
90 #include "view3d_intern.h"
91
92
93 /* View3d->modeselect 
94  * This is a bit of a dodgy hack to enable a 'mode' menu with icons+labels
95  * rather than those buttons.
96  * I know the implementation's not good - it's an experiment to see if this
97  * approach would work well
98  *
99  * This can be cleaned when I make some new 'mode' icons.
100  */
101
102 #define V3D_OBJECTMODE_SEL                      ICON_OBJECT
103 #define V3D_EDITMODE_SEL                        ICON_EDITMODE_HLT
104 #define V3D_SCULPTMODE_SEL                      ICON_SCULPTMODE_HLT
105 #define V3D_FACESELECT_SEL                      ICON_FACESEL_HLT        /* this is not a mode anymore - just a switch */
106 #define V3D_VERTEXPAINTMODE_SEL         ICON_VPAINT_HLT
107 #define V3D_TEXTUREPAINTMODE_SEL        ICON_TPAINT_HLT
108 #define V3D_WEIGHTPAINTMODE_SEL         ICON_WPAINT_HLT
109 #define V3D_POSEMODE_SEL                        ICON_POSE_HLT
110 #define V3D_PARTICLEEDITMODE_SEL        ICON_ANIM
111
112 #define TEST_EDITMESH   if(obedit==0) return; \
113                                                 if( (v3d->lay & obedit->lay)==0 ) return;
114
115 /* XXX port over */
116 static void handle_view3d_lock(void) {}
117 static void allqueue(int x, int y) {}
118 static void persptoetsen(int x) {}
119 static void fly(void) {}
120 static void editmesh_align_view_to_selected(void *x, int y) {}
121 static void play_anim(int x) {}
122 static void add_blockhandler(void *x, int y, int z) {}
123 static void toggle_blockhandler(void *x, int y, int z) {}
124 static void countall(void) {}
125 extern void borderselect();
126 static int retopo_mesh_paint_check() {return 0;}
127
128 /* view3d handler codes */
129 #define VIEW3D_HANDLER_BACKGROUND       1
130 #define VIEW3D_HANDLER_PROPERTIES       2
131 #define VIEW3D_HANDLER_OBJECT           3
132 #define VIEW3D_HANDLER_PREVIEW          4
133 #define VIEW3D_HANDLER_MULTIRES         5
134 #define VIEW3D_HANDLER_TRANSFORM        6
135 #define VIEW3D_HANDLER_GREASEPENCIL 7
136
137 /* end XXX ************* */
138
139
140 /* well... in this file a lot of view mode manipulation happens, so let's have it defined here */
141 void ED_view3d_exit_paint_modes(bContext *C)
142 {
143         if(G.f & G_VERTEXPAINT)
144                 WM_operator_name_call(C, "VIEW3D_OT_vpaint_toggle", WM_OP_EXEC_REGION_WIN, NULL, NULL);
145
146 //      if(G.f & G_TEXTUREPAINT) set_texturepaint();
147 //      if(G.f & G_WEIGHTPAINT) set_wpaint();
148 //      if(G.f & G_SCULPTMODE) set_sculptmode();
149 //      if(G.f & G_PARTICLEEDIT) PE_set_particle_edit();
150         
151         G.f &= ~(G_VERTEXPAINT+G_TEXTUREPAINT+G_WEIGHTPAINT+G_SCULPTMODE+G_PARTICLEEDIT);
152 }
153
154
155
156
157
158 static void do_view3d_buttons(bContext *C, void *arg, int event);
159
160 #define B_SCENELOCK 101
161 #define B_FULL          102
162 #define B_HOME          103
163 #define B_VIEWBUT       104
164 #define B_PERSP         105
165 #define B_VIEWRENDER    106
166 #define B_STARTGAME     107
167 #define B_MODESELECT 108
168 #define B_AROUND        109
169 #define B_SEL_VERT      110
170 #define B_SEL_EDGE      111
171 #define B_SEL_FACE      112
172 #define B_SEL_PATH      113
173 #define B_SEL_POINT     114
174 #define B_SEL_END       115
175 #define B_MAN_TRANS     116
176 #define B_MAN_ROT       117
177 #define B_MAN_SCALE     118
178 #define B_NDOF          119     
179 #define B_MAN_MODE      120
180 #define B_VIEW_BUTSEDIT 121
181 #define B_REDR          122
182 #define B_NOP           123
183 #define B_ACTCOPY       124
184 #define B_ACTPASTE      125
185 #define B_ACTPASTEFLIP 126
186
187 #define B_LAY           201
188
189
190 /* temp hack to get the region window */
191 static ARegion *ed_regionwin(ScrArea *sa)
192 {
193         ARegion *ar;
194         for(ar= sa->regionbase.first; ar; ar= ar->next)
195                 if(ar->regiontype==RGN_TYPE_WINDOW)
196                         return ar;
197         return NULL;
198 }
199
200 /* XXX; all this context stuff...  should become operator */
201 void do_layer_buttons(bContext *C, short event)
202 {
203         wmWindow *win= CTX_wm_window(C);
204         Scene *scene= CTX_data_scene(C);
205         ScrArea *sa= CTX_wm_area(C);
206         View3D *v3d= sa->spacedata.first;
207         static int oldlay= 1;
208         short shift, alt, ctrl;
209         
210         shift= win->eventstate->shift;
211         alt= win->eventstate->alt;
212         ctrl= win->eventstate->ctrl;
213         
214         if(v3d==0) return;
215         if(v3d->localview) return;
216         
217         if(event==-1 && ctrl) {
218                 v3d->scenelock= !v3d->scenelock;
219                 do_view3d_buttons(C, NULL, B_SCENELOCK);
220         } else if (event<0) {
221                 if(v3d->lay== (1<<20)-1) {
222                         if(event==-2 || shift) v3d->lay= oldlay;
223                 }
224                 else {
225                         oldlay= v3d->lay;
226                         v3d->lay= (1<<20)-1;
227                 }
228                 
229                 if(v3d->scenelock) handle_view3d_lock();
230                 
231                 /* new layers might need unflushed events events */
232                 DAG_scene_update_flags(scene, v3d->lay);        /* tags all that moves and flushes */
233         }
234         else {
235                 if(alt) {
236                         if(event<11) event+= 10;
237                 }
238                 if(shift) {
239                         if(v3d->lay & (1<<event)) v3d->lay -= (1<<event);
240                         else    v3d->lay += (1<<event);
241                 }
242                 do_view3d_buttons(C, NULL, event+B_LAY);
243         }
244         ED_area_tag_redraw(sa);
245         
246         if(sa->spacetype==SPACE_OOPS) allqueue(REDRAWVIEW3D, 1); /* 1==also do headwin */
247         if(v3d->drawtype == OB_SHADED) reshadeall_displist(scene);
248         allqueue(REDRAWNLA, 0); 
249 }
250
251 static void do_view3d_view_camerasmenu(bContext *C, void *arg, int event)
252 {
253         Scene *scene= CTX_data_scene(C);
254         View3D *v3d= (View3D*)CTX_wm_space_data(C);
255         Base *base;
256         int i=1;
257         
258         if (event == 1) {
259                 /* Set Active Object as Active Camera */
260                 /* XXX ugly hack alert */
261 //              G.qual |= LR_CTRLKEY;
262                 persptoetsen(PAD0);
263 //              G.qual &= ~LR_CTRLKEY;
264         } else {
265                 /* store settings of current view before allowing overwriting with camera view */
266                 /* this is a copy of the code in toets.c */
267                 if(v3d->persp != V3D_CAMOB) {
268                         QUATCOPY(v3d->lviewquat, v3d->viewquat);
269                         v3d->lview= v3d->view;
270                         v3d->lpersp= v3d->persp;
271                 }
272
273                 for( base = FIRSTBASE; base; base = base->next ) {
274                         if (base->object->type == OB_CAMERA) {
275                                 i++;
276                                 
277                                 if (event==i) {
278                                         
279                                         if (v3d->camera == base->object && v3d->persp==V3D_CAMOB)
280                                                 return;
281                                         
282                                         /* XXX handle smooth view */
283                                         v3d->camera= base->object;
284                                         handle_view3d_lock();
285                                         v3d->persp= V3D_CAMOB;
286                                         v3d->view= 0;
287                                         
288                                         break;
289                                 }
290                         }
291                 }
292         }
293         
294         allqueue(REDRAWVIEW3D, 0);
295 }
296
297 static uiBlock *view3d_view_camerasmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
298 {
299         Scene *scene= CTX_data_scene(C);
300         Base *base;
301         uiBlock *block;
302         short yco= 0, menuwidth=120;
303         int i=1;
304         char camname[48];
305         
306         block= uiBeginBlock(C, handle->region, "view3d_view_camerasmenu", UI_EMBOSSP, UI_HELV);
307         uiBlockSetButmFunc(block, do_view3d_view_camerasmenu, NULL);
308
309         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Active Object as Active Camera|Ctrl NumPad 0",       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
310
311         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, 140, 6, NULL, 0.0, 0.0, 0, 0, "");
312         
313         for( base = FIRSTBASE; base; base = base->next ) {
314                 if (base->object->type == OB_CAMERA) {
315                         i++;
316                         
317                         strcpy(camname, base->object->id.name+2);
318                         if (base->object == scene->camera) strcat(camname, " (Active)");
319                         
320                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, camname,  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0,  i, "");
321                 }
322         }
323         
324         uiBlockSetDirection(block, UI_RIGHT);
325         uiTextBoundsBlock(block, 50);
326         return block;
327 }
328
329 static void do_view3d_view_cameracontrolsmenu(bContext *C, void *arg, int event)
330 {
331         switch(event) {
332         case 0: /* Orbit Left */
333                 persptoetsen(PAD4);
334                 break;
335         case 1: /* Orbit Right */
336                 persptoetsen(PAD6);
337                 break;
338         case 2: /* Orbit Up */
339                 persptoetsen(PAD8);
340                 break;
341         case 3: /* Orbit Down */
342                 persptoetsen(PAD2);
343                 break;
344         case 4: /* Pan left */
345                 /* XXX ugly hack alert */
346 //              G.qual |= LR_CTRLKEY;
347                 persptoetsen(PAD4);
348 //              G.qual &= ~LR_CTRLKEY;
349                 break;
350         case 5: /* Pan right */
351                 /* XXX ugly hack alert */
352 //              G.qual |= LR_CTRLKEY;
353                 persptoetsen(PAD6);
354 //              G.qual &= ~LR_CTRLKEY;
355                 break;
356         case 6: /* Pan up */
357                 /* ugly hack alert */
358 //              G.qual |= LR_CTRLKEY;
359                 persptoetsen(PAD8);
360 //              G.qual &= ~LR_CTRLKEY;
361                 break;
362         case 7: /* Pan down */
363                 /* ugly hack alert */
364 //              G.qual |= LR_CTRLKEY;
365                 persptoetsen(PAD2);
366 //              G.qual &= ~LR_CTRLKEY;
367                 break;
368         case 8: /* Zoom In */
369                 persptoetsen(PADPLUSKEY);
370                 break;
371         case 9: /* Zoom Out */
372                 persptoetsen(PADMINUS);
373                 break;
374         case 10: /* Reset Zoom */
375                 persptoetsen(PADENTER);
376                 break;
377         case 11: /* Camera Fly mode */
378                 fly();
379                 break;
380         }
381         allqueue(REDRAWVIEW3D, 0);
382 }
383
384 static uiBlock *view3d_view_cameracontrolsmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
385 {
386 /*              static short tog=0; */
387         uiBlock *block;
388         short yco= 0, menuwidth=120;
389         
390         block= uiBeginBlock(C, handle->region, "view3d_view_cameracontrolsmenu", UI_EMBOSSP, UI_HELV);
391         uiBlockSetButmFunc(block, do_view3d_view_cameracontrolsmenu, NULL);
392
393         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Camera Fly Mode|Shift F",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
394         
395         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, 140, 6, NULL, 0.0, 0.0, 0, 0, "");
396         
397         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Orbit Left|NumPad 4",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
398         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Orbit Right|NumPad 6", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
399         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Orbit Up|NumPad 8",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
400         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Orbit Down|NumPad 2",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
401         
402         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, 140, 6, NULL, 0.0, 0.0, 0, 0, "");
403         
404         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pan Left|Ctrl NumPad 4", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
405         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pan Right|Ctrl NumPad 6", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
406         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pan Up|Ctrl NumPad 8",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
407         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Pan Down|Ctrl NumPad 2", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
408         
409         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, 140, 6, NULL, 0.0, 0.0, 0, 0, "");
410         
411         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom In|NumPad +", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
412         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom Out|NumPad -",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
413         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Reset Zoom|NumPad Enter",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 10, "");
414
415         uiBlockSetDirection(block, UI_RIGHT);
416         uiTextBoundsBlock(block, 50);
417         return block;
418 }
419
420 static void do_view3d_view_alignviewmenu(bContext *C, void *arg, int event)
421 {
422         Scene *scene= CTX_data_scene(C);
423         ScrArea *sa= CTX_wm_area(C);
424         View3D *v3d= sa->spacedata.first;
425         Object *obedit = CTX_data_edit_object(C);
426         float *curs;
427         
428         switch(event) {
429
430         case 0: /* Align View to Selected (edit/faceselect mode) */
431         case 1:
432         case 2:
433                 if ((obedit) && (obedit->type == OB_MESH)) {
434                         editmesh_align_view_to_selected(v3d, event + 1);
435                 } 
436                 else if (FACESEL_PAINT_TEST) {
437                         Object *obact= OBACT;
438                         if (obact && obact->type==OB_MESH) {
439                                 Mesh *me= obact->data;
440
441                                 if (me->mtface) {
442 // XXX                                  faceselect_align_view_to_selected(v3d, me, event + 1);
443                                         ED_area_tag_redraw(sa);
444                                 }
445                         }
446                 }
447                 break;
448         case 3: /* Center View to Cursor */
449                 curs= give_cursor(scene, v3d);
450                 v3d->ofs[0]= -curs[0];
451                 v3d->ofs[1]= -curs[1];
452                 v3d->ofs[2]= -curs[2];
453                 ED_area_tag_redraw(sa);
454                 break;
455         case 4: /* Align Active Camera to View */
456                 /* XXX This ugly hack is a symptom of the nasty persptoetsen function, 
457                  * but at least it works for now.
458                  */
459 //              G.qual |= LR_CTRLKEY|LR_ALTKEY;
460                 persptoetsen(PAD0);
461 //              G.qual &= ~(LR_CTRLKEY|LR_ALTKEY);
462                 break;
463         case 5: /* Align View to Selected (object mode) */
464 // XXX          mainqenter(PADASTERKEY, 1);
465                 break;
466         case 6: /* Center View and Cursor to Origin */
467                 WM_operator_name_call(C, "VIEW3D_OT_viewcenter", WM_OP_EXEC_REGION_WIN, NULL, NULL);
468                 curs= give_cursor(scene, v3d);
469                 curs[0]=curs[1]=curs[2]= 0.0;
470                 break;
471         }
472         allqueue(REDRAWVIEW3D, 0);
473 }
474
475 static uiBlock *view3d_view_alignviewmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
476 {
477 /*              static short tog=0; */
478         uiBlock *block;
479         Object *obedit = CTX_data_edit_object(C);
480         short yco= 0, menuwidth=120;
481         
482         block= uiBeginBlock(C, handle->region, "view3d_view_alignviewmenu", UI_EMBOSSP, UI_HELV);
483         uiBlockSetButmFunc(block, do_view3d_view_alignviewmenu, NULL);
484
485         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center View to Cursor|C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
486         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center Cursor and View All|Shift C",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
487         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align Active Camera to View|Ctrl Alt NumPad 0",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");   
488
489         if (((obedit) && (obedit->type == OB_MESH)) || (FACESEL_PAINT_TEST)) {
490                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align View to Selected (Top)|Shift V",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
491                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align View to Selected (Front)|Shift V",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
492                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align View to Selected (Side)|Shift V",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
493         } else {
494                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align View to Selected|NumPad *",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
495         }
496         
497         uiBlockSetDirection(block, UI_RIGHT);
498         uiTextBoundsBlock(block, 50);
499         return block;
500 }
501
502 #ifndef DISABLE_PYTHON
503 // XXX static void do_view3d_view_spacehandlers(bContext *C, void *arg, int event)
504 //{
505 //}
506
507 static uiBlock *view3d_view_spacehandlers(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
508 {
509         /* XXX */
510         return NULL;
511 }
512 #endif /* DISABLE_PYTHON */
513
514 static void do_view3d_viewmenu(bContext *C, void *arg, int event)
515 {
516         Scene *scene= CTX_data_scene(C);
517         ScrArea *sa= CTX_wm_area(C);
518         View3D *v3d= sa->spacedata.first;
519         
520         switch(event) {
521         case 0: /* User */
522                 v3d->viewbut = 0;
523                 v3d->persp = V3D_PERSP;
524                 break;
525         case 1: /* Camera */
526                 persptoetsen(PAD0);
527                 break;
528         case 2: /* Top */
529                 persptoetsen(PAD7);
530                 break;
531         case 3: /* Front */
532                 persptoetsen(PAD1);
533                 break;
534         case 4: /* Side */
535                 persptoetsen(PAD3);
536                 break;
537         case 5: /* Perspective */
538                 v3d->persp=V3D_PERSP;
539                 break;
540         case 6: /* Orthographic */
541                 v3d->persp=V3D_ORTHO;
542                 break;
543         case 7: /* Local View */
544                 v3d->localview= 1;
545                 initlocalview(scene, ed_regionwin(sa), v3d);
546                 break;
547         case 8: /* Global View */
548                 v3d->localview= 0;
549                 endlocalview(scene, sa);
550                 break;
551         case 9: /* View All (Home) */
552                 WM_operator_name_call(C, "VIEW3D_OT_viewhome", WM_OP_EXEC_REGION_WIN, NULL, NULL);
553                 break;
554         case 11: /* View Selected */
555                 WM_operator_name_call(C, "VIEW3D_OT_viewcenter", WM_OP_EXEC_REGION_WIN, NULL, NULL);
556                 break;
557         case 13: /* Play Back Animation */
558                 play_anim(0);
559                 break;
560         case 15: /* Background Image... */
561                 add_blockhandler(sa, VIEW3D_HANDLER_BACKGROUND, UI_PNL_UNSTOW);
562                 break;
563         case 16: /* View  Panel */
564                 add_blockhandler(sa, VIEW3D_HANDLER_PROPERTIES, UI_PNL_UNSTOW);
565                 break;
566         case 17: /* Set Clipping Border */
567                 WM_operator_name_call(C, "VIEW3D_OT_clipping", WM_OP_INVOKE_REGION_WIN, NULL, NULL);
568                 break;
569         case 18: /* render preview */
570                 toggle_blockhandler(sa, VIEW3D_HANDLER_PREVIEW, 0);
571                 break;
572         case 19: /* zoom within border */
573 //              view3d_border_zoom();
574                 break;
575         case 20: /* Transform  Space Panel */
576                 add_blockhandler(sa, VIEW3D_HANDLER_TRANSFORM, UI_PNL_UNSTOW);
577                 break;  
578         case 21: /* Grease Pencil */
579                 add_blockhandler(sa, VIEW3D_HANDLER_GREASEPENCIL, UI_PNL_UNSTOW);
580                 break;          
581         case 22: /* View all layers */
582                 do_layer_buttons(C, -2);
583                 break;
584         }
585         allqueue(REDRAWVIEW3D, 1);
586 }
587
588 static uiBlock *view3d_viewmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
589 {
590         ScrArea *sa= CTX_wm_area(C);
591         View3D *v3d= sa->spacedata.first;
592         uiBlock *block;
593         short yco= 0, menuwidth=120;
594         
595         block= uiBeginBlock(C, handle->region, "view3d_viewmenu", UI_EMBOSSP, UI_HELV);
596         uiBlockSetButmFunc(block, do_view3d_viewmenu, NULL);
597         
598         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Orientations...",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 20, "");
599         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Render Preview...|Shift P",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 18, "");
600         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "View Properties...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 16, "");
601         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Background Image...",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 15, "");
602         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Grease Pencil...",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 21, "");
603         
604         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
605         
606         if ((v3d->viewbut == 0) && !(v3d->persp == V3D_CAMOB)) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "User",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
607         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "User",                                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 0, "");
608         if (v3d->persp == V3D_CAMOB) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Camera|NumPad 0",     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
609         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Camera|NumPad 0",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 1, "");
610         if (v3d->viewbut == 1) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Top|NumPad 7",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
611         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Top|NumPad 7",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 2, "");
612         if (v3d->viewbut == 2) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Front|NumPad 1",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
613         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Front|NumPad 1",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 3, "");
614         if (v3d->viewbut == 3) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Side|NumPad 3",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
615         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Side|NumPad 3",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 4, "");
616         
617         uiDefIconTextBlockBut(block, view3d_view_camerasmenu, NULL, ICON_RIGHTARROW_THIN, "Cameras", 0, yco-=20, 120, 19, "");
618         
619         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
620         
621         if(v3d->persp==V3D_PERSP) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Perspective|NumPad 5",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
622         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Perspective|NumPad 5",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 5, "");
623         if(v3d->persp==V3D_ORTHO) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Orthographic|NumPad 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
624         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Orthographic|NumPad 5", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 6, "");
625         
626         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
627         
628         if(v3d->lay== (1<<20)-1) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Previous Layers|Shift ~", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 22, "");
629         else uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show All Layers| ~", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 22, "");
630         
631         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
632         
633         if(v3d->localview) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Local View|NumPad /",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
634         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Local View|NumPad /", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 7, "");
635         if(!v3d->localview) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Global View|NumPad /", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
636         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Global View|NumPad /",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 8, "");
637         
638         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
639         
640         uiDefIconTextBlockBut(block, view3d_view_cameracontrolsmenu, NULL, ICON_RIGHTARROW_THIN, "View Navigation", 0, yco-=20, 120, 19, "");
641         uiDefIconTextBlockBut(block, view3d_view_alignviewmenu, NULL, ICON_RIGHTARROW_THIN, "Align View", 0, yco-=20, 120, 19, "");
642         
643         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
644         
645         if(v3d->flag & V3D_CLIPPING)
646                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Clipping Border|Alt B",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 17, "");
647         else
648                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Set Clipping Border|Alt B",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 17, "");
649         if (v3d->persp==V3D_ORTHO) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Zoom Within Border...|Shift B",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 19, "");
650         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View Selected|NumPad .",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 11, "");
651         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "View All|Home",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 9, "");
652         if(!sa->full) uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Maximize Window|Ctrl UpArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 99, "");
653         else uiDefIconTextBut(block, BUTM, B_FULL, ICON_BLANK1, "Tile Window|Ctrl DownArrow", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 99, "");
654
655         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
656         
657         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Play Back Animation|Alt A",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 13, "");
658
659 #ifndef DISABLE_PYTHON
660         uiDefBut(block, SEPR, 0, "",                                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
661         uiDefIconTextBlockBut(block, view3d_view_spacehandlers, NULL, ICON_RIGHTARROW_THIN, "Space Handler Scripts", 0, yco-=20, 120, 19, "");
662 #endif
663
664         if(handle->region->alignment==RGN_ALIGN_TOP) {
665                 uiBlockSetDirection(block, UI_DOWN);
666         }
667         else {
668                 uiBlockSetDirection(block, UI_TOP);
669                 uiBlockFlipOrder(block);
670         }
671
672         uiTextBoundsBlock(block, 50);
673         
674         return block;
675 }
676
677 void do_view3d_select_object_typemenu(bContext *C, void *arg, int event)
678 {
679 #if 0
680
681         extern void selectall_type(short obtype);
682         
683         switch(event) {
684         case 1: /* Mesh */
685                 selectall_type(OB_MESH);
686                 break;
687         case 2: /* Curve */
688                 selectall_type(OB_CURVE);
689                 break;
690         case 3: /* Surface */
691                 selectall_type(OB_SURF);
692                 break;
693         case 4: /* Meta */
694                 selectall_type(OB_MBALL);
695                 break;
696         case 5: /* Armature */
697                 selectall_type(OB_ARMATURE);
698                 break;
699         case 6: /* Lattice */
700                 selectall_type(OB_LATTICE);
701                 break;
702         case 7: /* Text */
703                 selectall_type(OB_FONT);
704                 break;
705         case 8: /* Empty */
706                 selectall_type(OB_EMPTY);
707                 break;
708         case 9: /* Camera */
709                 selectall_type(OB_CAMERA);
710                 break;
711         case 10: /* Lamp */
712                 selectall_type(OB_LAMP);
713                 break;
714         case 20:
715                 do_layer_buttons(C, -2);
716                 break;
717         }
718         allqueue(REDRAWVIEW3D, 0);
719 #endif
720 }
721
722 static uiBlock *view3d_select_object_typemenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
723 {
724         uiBlock *block;
725         short yco = 20, menuwidth = 120;
726
727         block= uiBeginBlock(C, handle->region, "view3d_select_object_typemenu", UI_EMBOSSP, UI_HELV);
728         uiBlockSetButmFunc(block, do_view3d_select_object_typemenu, NULL);
729
730         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mesh",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
731         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Curve",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
732         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Surface",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
733         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Meta",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
734         
735         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
736         
737         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Armature",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
738         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lattice",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
739         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Text",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
740         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Empty",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
741         
742         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
743         
744         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Camera",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
745         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lamp",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
746         
747         uiBlockSetDirection(block, UI_RIGHT);
748         uiTextBoundsBlock(block, 60);
749         return block;
750 }
751
752 void do_view3d_select_object_layermenu(bContext *C, void *arg, int event)
753 {
754 // XXX  extern void selectall_layer(unsigned int layernum);
755         
756         switch(event) {
757         case 0:
758         case 1:
759         case 2:
760         case 3:
761         case 4:
762         case 5:
763         case 6:
764         case 7:
765         case 8:
766         case 9:
767         case 10:
768         case 11:
769         case 12:
770         case 13:
771         case 14:
772         case 15:
773         case 16:
774         case 17:
775         case 18:
776         case 19:
777         case 20:
778 // XXX          selectall_layer(event);
779                 break;
780         }
781         allqueue(REDRAWVIEW3D, 0);
782 }
783
784 static uiBlock *view3d_select_object_layermenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
785 {
786         uiBlock *block;
787         short xco= 0, yco = 20, menuwidth = 22;
788
789         block= uiBeginBlock(C, handle->region, "view3d_select_object_layermenu", UI_EMBOSSP, UI_HELV);
790         uiBlockSetButmFunc(block, do_view3d_select_object_layermenu, NULL);
791
792         uiDefBut(block, BUTM, 1, "1",           xco, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
793         uiDefBut(block, BUTM, 1, "2",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
794         uiDefBut(block, BUTM, 1, "3",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
795         uiDefBut(block, BUTM, 1, "4",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
796         uiDefBut(block, BUTM, 1, "5",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
797         xco += 6;
798         uiDefBut(block, BUTM, 1, "6",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
799         uiDefBut(block, BUTM, 1, "7",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
800         uiDefBut(block, BUTM, 1, "8",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
801         uiDefBut(block, BUTM, 1, "9",           xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
802         uiDefBut(block, BUTM, 1, "10",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
803         xco = 0;
804         uiDefBut(block, BUTM, 1, "11",          xco, yco-=24, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
805         uiDefBut(block, BUTM, 1, "12",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
806         uiDefBut(block, BUTM, 1, "13",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
807         uiDefBut(block, BUTM, 1, "14",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
808         uiDefBut(block, BUTM, 1, "15",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
809         xco += 6;
810         uiDefBut(block, BUTM, 1, "16",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
811         uiDefBut(block, BUTM, 1, "17",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
812         uiDefBut(block, BUTM, 1, "18",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
813         uiDefBut(block, BUTM, 1, "19",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
814         uiDefBut(block, BUTM, 1, "20",          xco+=(menuwidth+1), yco, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
815         
816         uiBlockSetDirection(block, UI_RIGHT);
817         /*uiTextBoundsBlock(block, 100);*/
818         return block;
819 }
820
821 void do_view3d_select_object_linkedmenu(bContext *C, void *arg, int event)
822 {
823 #if 0
824         switch(event) {
825         case 1: /* Object Ipo */
826         case 2: /* ObData */
827         case 3: /* Current Material */
828         case 4: /* Current Texture */
829                 selectlinks(event);
830                 break;
831         }
832         countall();
833         allqueue(REDRAWVIEW3D, 0);
834 #endif
835 }
836
837 static uiBlock *view3d_select_object_linkedmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
838 {
839         uiBlock *block;
840         short yco = 20, menuwidth = 120;
841
842         block= uiBeginBlock(C, handle->region, "view3d_select_object_linkedmenu", UI_EMBOSSP, UI_HELV);
843         uiBlockSetButmFunc(block, do_view3d_select_object_linkedmenu, NULL);
844
845         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Ipo|Shift L, 1",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
846         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "ObData|Shift L, 2",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
847         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Material|Shift L, 3",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
848         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Texture|Shift L, 4",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
849         
850         uiBlockSetDirection(block, UI_RIGHT);
851         uiTextBoundsBlock(block, 60);
852         return block;
853 }
854
855 void do_view3d_select_object_groupedmenu(bContext *C, void *arg, int event)
856 {
857 #if 0
858         switch(event) {
859         case 1: /* Children */
860         case 2: /* Immediate Children */
861         case 3: /* Parent */
862         case 4: /* Siblings */
863         case 5: /* Type */
864         case 6: /* Objects on Shared Layers */
865         case 7: /* Objects in Same Group */
866         case 8: /* Object Hooks*/
867         case 9: /* Object PassIndex*/
868         case 10: /* Object Color*/
869         case 11: /* Game Properties*/
870                 select_object_grouped((short)event);
871                 break;
872         }
873         allqueue(REDRAWVIEW3D, 0);
874 #endif
875 }
876
877 static uiBlock *view3d_select_object_groupedmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
878 {
879         uiBlock *block;
880         short yco = 20, menuwidth = 120;
881
882         block= uiBeginBlock(C, handle->region, "view3d_select_object_groupedmenu", UI_EMBOSSP, UI_HELV);
883         uiBlockSetButmFunc(block, do_view3d_select_object_groupedmenu, NULL);
884
885         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Children|Shift G, 1",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
886         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Immediate Children|Shift G, 2",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
887         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Parent|Shift G, 3",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
888         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Siblings (Shared Parent)|Shift G, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
889         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Objects of Same Type|Shift G, 5",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
890         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Objects on Shared Layers|Shift G, 6",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
891         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Objects in Same Group|Shift G, 7",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
892         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Hooks|Shift G, 8",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
893         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object PassIndex|Shift G, 9",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
894         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Color|Shift G, 0",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");  
895         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Game Properties|Shift G, Alt+1",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");  
896
897         uiBlockSetDirection(block, UI_RIGHT);
898         uiTextBoundsBlock(block, 60);
899         return block;
900 }
901
902 void do_view3d_select_objectmenu(bContext *C, void *arg, int event)
903 {
904 #if 0
905         switch(event) {
906         
907         case 0: /* border select */
908                 borderselect();
909                 break;
910         case 1: /* Select/Deselect All */
911                 deselectall();
912                 break;
913         case 2: /* inverse */
914                 selectswap();
915                 break;
916         case 3: /* random */
917                 selectrandom();
918                 break;
919         }
920         allqueue(REDRAWVIEW3D, 0);
921 #endif
922 }
923
924 static uiBlock *view3d_select_objectmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
925 {
926         uiBlock *block;
927         short yco= 0, menuwidth=120;
928         
929         block= uiBeginBlock(C, handle->region, "view3d_select_objectmenu", UI_EMBOSSP, UI_HELV);
930         uiBlockSetButmFunc(block, do_view3d_select_objectmenu, NULL);
931         
932         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
933         
934         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
935         
936         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
937         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse|Ctrl I",                                         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
938         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Random",                                                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
939         
940         uiDefIconTextBlockBut(block, view3d_select_object_layermenu, NULL, ICON_RIGHTARROW_THIN, "Select All by Layer", 0, yco-=20, 120, 19, "");
941         uiDefIconTextBlockBut(block, view3d_select_object_typemenu, NULL, ICON_RIGHTARROW_THIN, "Select All by Type", 0, yco-=20, 120, 19, "");
942                 
943         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
944         
945         uiDefIconTextBlockBut(block, view3d_select_object_linkedmenu, NULL, ICON_RIGHTARROW_THIN, "Linked", 0, yco-=20, 120, 19, "");
946         uiDefIconTextBlockBut(block, view3d_select_object_groupedmenu, NULL, ICON_RIGHTARROW_THIN, "Grouped", 0, yco-=20, 120, 19, "");
947
948         if(handle->region->alignment==RGN_ALIGN_TOP) {
949                 uiBlockSetDirection(block, UI_DOWN);
950         }
951         else {
952                 uiBlockSetDirection(block, UI_TOP);
953                 uiBlockFlipOrder(block);
954         }
955         
956         uiTextBoundsBlock(block, 50);
957         return block;
958 }
959
960 void do_view3d_select_meshmenu(bContext *C, void *arg, int event)
961 {
962 #if 0
963 /*      extern void borderselect(void);*/
964
965         switch(event) {
966         
967                 case 0: /* border select */
968                         borderselect();
969                         break;
970                 case 2: /* Select/Deselect all */
971                         deselectall_mesh();
972                         break;
973                 case 3: /* Inverse */
974                         selectswap_mesh();
975                         break;
976                 case 4: /* select linked vertices */
977                         selectconnected_mesh_all();
978                         break;
979                 case 5: /* select random */
980                         selectrandom_mesh();
981                         break;
982                 case 7: /* select more */
983                         select_more();
984                         break;
985                 case 8: /* select less */
986                         select_less();
987                         break;
988                 case 9: /* select non-manifold */
989                         select_non_manifold();
990                         break;
991                 case 11: /* select triangles */
992                         select_faces_by_numverts(3);
993                         break;
994                 case 12: /* select quads */
995                         select_faces_by_numverts(4);
996                         break;
997                 case 13: /* select non-triangles/quads */
998                         select_faces_by_numverts(5);
999                         break;
1000                 case 14: /* select sharp edges */
1001                         select_sharp_edges();
1002                         break;
1003                 case 15: /* select linked flat faces */
1004                         select_linked_flat_faces();
1005                         break;
1006
1007                 case 16: /* path select */
1008                         pathselect();
1009                         ED_undo_push(C, "Path Select");
1010                         break;
1011                 case 17: /* edge loop select */
1012                         loop_multiselect(0);
1013                         break;
1014                 case 18: /* edge ring select */
1015                         loop_multiselect(1);
1016                         break;
1017                 case 19: /* loop to region */
1018                         loop_to_region();
1019                         break;
1020                 case 20: /* region to loop */
1021                         region_to_loop();
1022                         break;
1023                 case 21: /* Select grouped */
1024                         select_mesh_group_menu();
1025                         break;
1026         }
1027         allqueue(REDRAWVIEW3D, 0);
1028 #endif
1029 }
1030
1031
1032 static uiBlock *view3d_select_meshmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
1033 {
1034         uiBlock *block;
1035         short yco= 0, menuwidth=120;
1036         
1037         block= uiBeginBlock(C, handle->region, "view3d_select_meshmenu", UI_EMBOSSP, UI_HELV);
1038         uiBlockSetButmFunc(block, do_view3d_select_meshmenu, NULL);
1039         
1040         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1041         
1042         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1043         
1044         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1045         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse|Ctrl I",                         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1046         
1047         uiDefBut(block, SEPR, 0, "", 0, yco-=6, 
1048                          menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1049         
1050         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Random...",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1051         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, 
1052                                          "Non-Manifold|Ctrl Alt Shift M", 
1053                                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
1054         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, 
1055                                          "Sharp Edges|Ctrl Alt Shift S", 
1056                                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
1057         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, 
1058                                          "Linked Flat Faces|Ctrl Alt Shift F", 
1059                                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
1060         
1061         uiDefBut(block, SEPR, 0, "", 0, yco-=6, 
1062                          menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1063
1064         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, 
1065                                          "Triangles|Ctrl Alt Shift 3", 
1066                                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
1067         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, 
1068                                          "Quads|Ctrl Alt Shift 4", 
1069                                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
1070         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, 
1071                                          "Non-Triangles/Quads|Ctrl Alt Shift 5", 
1072                                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
1073         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, 
1074                                          "Similar to Selection...|Shift G", 
1075                                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 21, "");
1076
1077         uiDefBut(block, SEPR, 0, "", 0, yco-=6, 
1078                          menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1079
1080         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "More|Ctrl NumPad +",
1081                                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1082         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Less|Ctrl NumPad -",
1083                                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
1084
1085         uiDefBut(block, SEPR, 0, "", 0, yco-=6, 
1086                          menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1087
1088         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Linked Vertices|Ctrl L",                         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1089         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Vertex Path|W Alt 7",                            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
1090         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Edge Loop|Ctrl E 6",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
1091         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Edge Ring|Ctrl E 7",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
1092         
1093         uiDefBut(block, SEPR, 0, "", 0, yco-=6, 
1094                          menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1095         
1096         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Loop to Region|Ctrl E 8",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
1097         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Region to Loop|Ctrl E 9",                        0, yco-=20, menuwidth, 20, NULL, 0.0, 0.0, 1, 20, "");  
1098         
1099         if(handle->region->alignment==RGN_ALIGN_TOP) {
1100                 uiBlockSetDirection(block, UI_DOWN);
1101         }
1102         else {
1103                 uiBlockSetDirection(block, UI_TOP);
1104                 uiBlockFlipOrder(block);
1105         }
1106
1107         uiTextBoundsBlock(block, 50);
1108         return block;
1109 }
1110
1111 void do_view3d_select_curvemenu(bContext *C, void *arg, int event)
1112 {
1113 #if 0
1114 /*      extern void borderselect(void);*/
1115
1116         switch(event) {
1117                 case 0: /* border select */
1118                         borderselect();
1119                         break;
1120                 case 2: /* Select/Deselect all */
1121                         deselectall_nurb();
1122                         break;
1123                 case 3: /* Inverse */
1124                         selectswapNurb();
1125                         break;
1126                 /* select connected control points */
1127                 /*case 4:
1128                         G.qual |= LR_CTRLKEY;
1129                         select_connected_nurb();
1130                         G.qual &= ~LR_CTRLKEY;
1131                         break;*/
1132                 case 5: /* select row (nurb) */
1133                         selectrow_nurb();
1134                         break;
1135                 case 7: /* select/deselect first */
1136                         selectend_nurb(FIRST, 1, DESELECT);
1137                         break;
1138                 case 8: /* select/deselect last */ 
1139                         selectend_nurb(LAST, 1, DESELECT);
1140                         break;
1141                 case 9: /* select more */
1142                         select_more_nurb();
1143                         break;
1144                 case 10: /* select less */
1145                         select_less_nurb();
1146                         break;
1147                 case 11: /* select next */
1148                         select_next_nurb();
1149                         break;
1150                 case 12: /* select previous */
1151                         select_prev_nurb();
1152                         break;
1153                 case 13: /* select random */
1154                         select_random_nurb();
1155                         break;
1156                 case 14: /* select every nth */
1157                         select_every_nth_nurb();
1158                         break;
1159         }
1160         allqueue(REDRAWVIEW3D, 0);
1161 #endif
1162 }
1163
1164
1165 static uiBlock *view3d_select_curvemenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
1166 {
1167         Scene *scene= CTX_data_scene(C);
1168         uiBlock *block;
1169         short yco= 0, menuwidth=120;
1170         
1171         block= uiBeginBlock(C, handle->region, "view3d_select_curvemenu", UI_EMBOSSP, UI_HELV);
1172         uiBlockSetButmFunc(block, do_view3d_select_curvemenu, NULL);
1173         
1174         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1175         
1176         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1177         
1178         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1179         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1180         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Random...",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
1181         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Every Nth",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
1182         
1183         if (OBACT->type == OB_SURF) {
1184                 uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1185                 
1186                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Control Point Row|Shift R",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1187         }
1188         else {
1189                 uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1190                 
1191                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect First",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1192                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect Last",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
1193                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Next",                            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
1194                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Previous",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
1195         }
1196         
1197         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1198         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "More|Ctrl NumPad +",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
1199         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Less|Ctrl NumPad -",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
1200         
1201         /* commented out because it seems to only like the LKEY method - based on mouse pointer position :( */
1202         /*uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Connected Control Points|Ctrl L",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");*/
1203                 
1204         if(handle->region->alignment==RGN_ALIGN_TOP) {
1205                 uiBlockSetDirection(block, UI_DOWN);
1206         }
1207         else {
1208                 uiBlockSetDirection(block, UI_TOP);
1209                 uiBlockFlipOrder(block);
1210         }
1211         
1212         uiTextBoundsBlock(block, 50);
1213         return block;
1214 }
1215
1216 void do_view3d_select_metaballmenu(bContext *C, void *arg, int event)
1217 {
1218 #if 0
1219
1220         switch(event) {
1221                 case 0: /* border select */
1222                         borderselect();
1223                         break;
1224                 case 2: /* Select/Deselect all */
1225                         deselectall_mball();
1226                         break;
1227                 case 3: /* Inverse */
1228                         selectinverse_mball();
1229                         break;
1230                 case 4: /* Select Random */
1231                         selectrandom_mball();
1232                         break;
1233         }
1234         allqueue(REDRAWVIEW3D, 0);
1235 #endif
1236 }
1237
1238
1239 static uiBlock *view3d_select_metaballmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
1240 {
1241         uiBlock *block;
1242         short yco= 0, menuwidth=120;
1243         
1244         block= uiBeginBlock(C, handle->region, "view3d_select_metaballmenu", UI_EMBOSSP, UI_HELV);
1245         uiBlockSetButmFunc(block, do_view3d_select_metaballmenu, NULL);
1246         
1247         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1248         
1249         uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1250         
1251         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1252
1253         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1254                 
1255         uiDefBut(block, SEPR, 0, "", 0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1256
1257         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Random...", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1258
1259         if(handle->region->alignment==RGN_ALIGN_TOP) {
1260                 uiBlockSetDirection(block, UI_DOWN);
1261         }
1262         else {
1263                 uiBlockSetDirection(block, UI_TOP);
1264                 uiBlockFlipOrder(block);
1265         }
1266
1267         uiTextBoundsBlock(block, 50);
1268         return block;
1269 }
1270
1271 static void do_view3d_select_latticemenu(bContext *C, void *arg, int event)
1272 {
1273 #if 0
1274 /*      extern void borderselect(void);*/
1275         
1276         switch(event) {
1277                         case 0: /* border select */
1278                         borderselect();
1279                         break;
1280                 case 2: /* Select/Deselect all */
1281                         deselectall_Latt();
1282                         break;
1283         }
1284         allqueue(REDRAWVIEW3D, 0);
1285 #endif
1286 }
1287
1288 static uiBlock *view3d_select_latticemenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
1289 {
1290         uiBlock *block;
1291         short yco= 0, menuwidth=120;
1292         
1293         block= uiBeginBlock(C, handle->region, "view3d_select_latticemenu", UI_EMBOSSP, UI_HELV);
1294         uiBlockSetButmFunc(block, do_view3d_select_latticemenu, NULL);
1295         
1296         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1297         
1298         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1299         
1300         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1301
1302         if(handle->region->alignment==RGN_ALIGN_TOP) {
1303                 uiBlockSetDirection(block, UI_DOWN);
1304         }
1305         else {
1306                 uiBlockSetDirection(block, UI_TOP);
1307                 uiBlockFlipOrder(block);
1308         }
1309
1310         uiTextBoundsBlock(block, 50);
1311         return block;
1312 }
1313
1314 static void do_view3d_select_armaturemenu(bContext *C, void *arg, int event)
1315 {
1316 #if 0
1317 /*      extern void borderselect(void);*/
1318
1319         switch(event) {
1320                 case 0: /* border select */
1321                         borderselect();
1322                         break;
1323                 case 2: /* Select/Deselect all */
1324                         deselectall_armature(1, 1);
1325                         break;
1326                 case 3: /* Swap Select All */
1327                         deselectall_armature(3, 1);
1328                         break;
1329                 case 4: /* Select parent */
1330                         armature_select_hierarchy(BONE_SELECT_PARENT, 0);
1331                         break;
1332                 case 5: /* Select child */
1333                         armature_select_hierarchy(BONE_SELECT_CHILD, 0);
1334                         break;
1335                 case 6: /* Extend Select parent */
1336                         armature_select_hierarchy(BONE_SELECT_PARENT, 1);
1337                         break;
1338                 case 7: /* Extend Select child */
1339                         armature_select_hierarchy(BONE_SELECT_CHILD, 1);
1340                         break;
1341         }
1342         allqueue(REDRAWVIEW3D, 0);
1343 #endif
1344 }
1345
1346 static uiBlock *view3d_select_armaturemenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
1347 {
1348         uiBlock *block;
1349         short yco= 0, menuwidth=120;
1350         
1351         block= uiBeginBlock(C, handle->region, "view3d_select_armaturemenu", UI_EMBOSSP, UI_HELV);
1352         uiBlockSetButmFunc(block, do_view3d_select_armaturemenu, NULL);
1353         
1354         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1355         
1356         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1357         
1358         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1359         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse|Ctrl I",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1360         
1361         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1362         
1363         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Parent|[",                                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1364         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Child|]",                                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1365         
1366         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1367         
1368         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extend Select Parent|Shift [",                                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1369         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extend Select Child|Shift ]",                                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1370         
1371         if(handle->region->alignment==RGN_ALIGN_TOP) {
1372                 uiBlockSetDirection(block, UI_DOWN);
1373         }
1374         else {
1375                 uiBlockSetDirection(block, UI_TOP);
1376                 uiBlockFlipOrder(block);
1377         }
1378
1379         uiTextBoundsBlock(block, 50);
1380         return block;
1381 }
1382
1383 static void do_view3d_select_pose_armaturemenu(bContext *C, void *arg, int event)
1384 {
1385 #if 0
1386 /*      extern void borderselect(void);*/
1387         
1388         switch(event) {
1389         case 0: /* border select */
1390                 borderselect();
1391                 break;
1392         case 2: /* Select/Deselect all */
1393                 deselectall_posearmature(OBACT, 1, 1);
1394                 break;
1395         case 3: /* Select Target(s) of Constraint(s) */
1396                 pose_select_constraint_target();
1397                 break;
1398         case 5: /* Swap Select All */
1399                 deselectall_posearmature(OBACT, 3, 1);
1400                 break;
1401         case 6: /* Select parent */
1402                 pose_select_hierarchy(BONE_SELECT_PARENT, 0);
1403                 break;
1404         case 7: /* Select child */
1405                 pose_select_hierarchy(BONE_SELECT_CHILD, 0);
1406                 break;
1407         case 8: /* Extend Select parent */
1408                 pose_select_hierarchy(BONE_SELECT_PARENT, 1);
1409                 break;
1410         case 9: /* Extend Select child */
1411                 pose_select_hierarchy(BONE_SELECT_CHILD, 1);
1412                 break;
1413         }
1414         allqueue(REDRAWVIEW3D, 0);
1415 #endif
1416 }
1417
1418 static uiBlock *view3d_select_pose_armaturemenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
1419 {
1420         uiBlock *block;
1421         short yco= 0, menuwidth=120;
1422         
1423         block= uiBeginBlock(C, handle->region, "view3d_select_pose_armaturemenu", UI_EMBOSSP, UI_HELV);
1424         uiBlockSetButmFunc(block, do_view3d_select_pose_armaturemenu, NULL);
1425         
1426         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1427         
1428         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1429         
1430         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1431         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Swap Select All|Ctrl I",                         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1432         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Constraint Target|W",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1433         
1434         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1435         
1436         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Parent|[",                                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1437         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select Child|]",                                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1438         
1439         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1440         
1441         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extend Select Parent|Shift [",                                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
1442         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Extend Select Child|Shift ]",                                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
1443         
1444         if(handle->region->alignment==RGN_ALIGN_TOP) {
1445                 uiBlockSetDirection(block, UI_DOWN);
1446         }
1447         else {
1448                 uiBlockSetDirection(block, UI_TOP);
1449                 uiBlockFlipOrder(block);
1450         }
1451
1452         uiTextBoundsBlock(block, 50);
1453         return block;
1454 }
1455
1456 void do_view3d_select_faceselmenu(bContext *C, void *arg, int event)
1457 {
1458 #if 0
1459         /* events >= 6 are registered bpython scripts */
1460 #ifndef DISABLE_PYTHON
1461         if (event >= 6) BPY_menu_do_python(PYMENU_FACESELECT, event - 6);
1462 #endif
1463         
1464         switch(event) {
1465                 case 0: /* border select */
1466                         borderselect();
1467                         break;
1468                 case 2: /* Select/Deselect all */
1469                         deselectall_tface();
1470                         break;
1471                 case 3: /* Select Inverse */
1472                         selectswap_tface();
1473                         break;
1474                 case 4: /* Select Linked */
1475                         select_linked_tfaces(2);
1476                         break;
1477         }
1478         allqueue(REDRAWVIEW3D, 0);
1479 #endif
1480 }
1481
1482 static uiBlock *view3d_select_faceselmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
1483 {
1484         uiBlock *block;
1485         short yco= 0, menuwidth=120;
1486 #ifndef DISABLE_PYTHON
1487 // XXX  BPyMenu *pym;
1488 //      int i = 0;
1489 #endif
1490
1491         block= uiBeginBlock(C, handle->region, "view3d_select_faceselmenu", UI_EMBOSSP, UI_HELV);
1492         uiBlockSetButmFunc(block, do_view3d_select_faceselmenu, NULL);
1493         
1494         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Border Select|B",                                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1495         
1496         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1497         
1498         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Select/Deselect All|A",                          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1499         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Inverse",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1500
1501         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1502         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Linked Faces|Ctrl L",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1503
1504 #ifndef DISABLE_PYTHON
1505 //      uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1506
1507         /* note that we account for the 6 previous entries with i+6: */
1508 //      for (pym = BPyMenuTable[PYMENU_FACESELECT]; pym; pym = pym->next, i++) {
1509 //              uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20,
1510 //                      menuwidth, 19, NULL, 0.0, 0.0, 1, i+6,
1511 //                      pym->tooltip?pym->tooltip:pym->filename);
1512 //      }
1513 #endif
1514         
1515         if(handle->region->alignment==RGN_ALIGN_TOP) {
1516                 uiBlockSetDirection(block, UI_DOWN);
1517         }
1518         else {
1519                 uiBlockSetDirection(block, UI_TOP);
1520                 uiBlockFlipOrder(block);
1521         }
1522
1523         uiTextBoundsBlock(block, 50);
1524         return block;
1525 }
1526
1527 void do_view3d_edit_snapmenu(bContext *C, void *arg, int event)
1528 {
1529 #if 0
1530         switch (event) {
1531         case 1: /*Selection to grid*/
1532             snap_sel_to_grid();
1533                 ED_undo_push(C, "Snap selection to grid");
1534             break;
1535         case 2: /*Selection to cursor*/
1536             snap_sel_to_curs();
1537                 ED_undo_push(C, "Snap selection to cursor");
1538             break;
1539         case 3: /*Selection to center of selection*/
1540             snap_to_center();
1541                 ED_undo_push(C, "Snap selection to center");
1542             break;
1543         case 4: /*Cursor to selection*/
1544             snap_curs_to_sel();
1545             break;
1546         case 5: /*Cursor to grid*/
1547             snap_curs_to_grid();
1548             break;
1549         case 6: /*Cursor to Active*/
1550             snap_curs_to_active();
1551                 ED_undo_push(C, "Snap selection to center");
1552             break;
1553         }
1554         allqueue(REDRAWVIEW3D, 0);
1555 #endif
1556 }
1557
1558 static uiBlock *view3d_edit_snapmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
1559 {
1560         uiBlock *block;
1561         short yco = 20, menuwidth = 120;
1562
1563         block= uiBeginBlock(C, handle->region, "view3d_edit_snapmenu", UI_EMBOSSP, UI_HELV);
1564         uiBlockSetButmFunc(block, do_view3d_edit_snapmenu, NULL);
1565         
1566         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selection -> Grid|Shift S, 1",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1567         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selection -> Cursor|Shift S, 2",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1568         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selection -> Center|Shift S, 3",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1569         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1570         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cursor -> Selection|Shift S, 4",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1571         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cursor -> Grid|Shift S, 5",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1572         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Cursor -> Active|Shift S, 6",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1573         
1574         
1575         
1576         uiBlockSetDirection(block, UI_RIGHT);
1577         uiTextBoundsBlock(block, 60);
1578         return block;
1579 }
1580
1581 void do_view3d_transform_moveaxismenu(bContext *C, void *arg, int event)
1582 {
1583 #if 0
1584         float mat[3][3];
1585         
1586         Mat3One(mat);
1587         
1588         switch(event)
1589         {
1590             case 0: /* X Global */
1591                         initTransform(TFM_TRANSLATION, CTX_NONE);
1592                         BIF_setSingleAxisConstraint(mat[0], " X");
1593                         Transform();
1594                         break;
1595                 case 1: /* Y Global */
1596                         initTransform(TFM_TRANSLATION, CTX_NONE);
1597                         BIF_setSingleAxisConstraint(mat[1], " Y");
1598                         Transform();
1599                         break;
1600                 case 2: /* Z Global */
1601                         initTransform(TFM_TRANSLATION, CTX_NONE);
1602                         BIF_setSingleAxisConstraint(mat[2], " Z");
1603                         Transform();
1604                         break;
1605                 case 3: /* X Local */
1606                         initTransform(TFM_TRANSLATION, CTX_NONE);
1607                         BIF_setLocalAxisConstraint('X', " X");
1608                         Transform();
1609                         break;
1610                 case 4: /* Y Local */
1611                         initTransform(TFM_TRANSLATION, CTX_NONE);
1612                         BIF_setLocalAxisConstraint('Y', " Y");
1613                         Transform();
1614                         break;
1615                 case 5: /* Z Local */
1616                         initTransform(TFM_TRANSLATION, CTX_NONE);
1617                         BIF_setLocalAxisConstraint('Z', " Z");
1618                         Transform();
1619                         break;
1620         }
1621         allqueue(REDRAWVIEW3D, 0);
1622 #endif
1623 }
1624
1625 static uiBlock *view3d_transform_moveaxismenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
1626 {
1627         uiBlock *block;
1628         short yco = 20, menuwidth = 120;
1629
1630         block= uiBeginBlock(C, handle->region, "view3d_transform_moveaxismenu", UI_EMBOSSP, UI_HELV);
1631         uiBlockSetButmFunc(block, do_view3d_transform_moveaxismenu, NULL);
1632
1633         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|G, X",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1634         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|G, Y",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1635         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|G, Z",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1636         
1637         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1638         
1639         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|G, X, X",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1640         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|G, Y, Y",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1641         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|G, Z, Z",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1642         
1643         
1644         uiBlockSetDirection(block, UI_RIGHT);
1645         uiTextBoundsBlock(block, 60);
1646         return block;
1647 }
1648
1649 void do_view3d_transform_rotateaxismenu(bContext *C, void *arg, int event)
1650 {
1651 #if 0
1652         float mat[3][3];
1653         
1654         Mat3One(mat);
1655         
1656         switch(event)
1657         {
1658             case 0: /* X Global */
1659                         initTransform(TFM_ROTATION, CTX_NONE);
1660                         BIF_setSingleAxisConstraint(mat[0], " X");
1661                         Transform();
1662                         break;
1663                 case 1: /* Y Global */
1664                         initTransform(TFM_ROTATION, CTX_NONE);
1665                         BIF_setSingleAxisConstraint(mat[1], " Y");
1666                         Transform();
1667                         break;
1668                 case 2: /* Z Global */
1669                         initTransform(TFM_ROTATION, CTX_NONE);
1670                         BIF_setSingleAxisConstraint(mat[2], " Z");
1671                         Transform();
1672                         break;
1673                 case 3: /* X Local */
1674                         initTransform(TFM_ROTATION, CTX_NONE);
1675                         BIF_setLocalAxisConstraint('X', " X");
1676                         Transform();
1677                         break;
1678                 case 4: /* Y Local */
1679                         initTransform(TFM_ROTATION, CTX_NONE);
1680                         BIF_setLocalAxisConstraint('Y', " Y");
1681                         Transform();
1682                         break;
1683                 case 5: /* Z Local */
1684                         initTransform(TFM_ROTATION, CTX_NONE);
1685                         BIF_setLocalAxisConstraint('Z', " Z");
1686                         Transform();
1687                         break;
1688         }
1689         allqueue(REDRAWVIEW3D, 0);
1690 #endif
1691 }
1692
1693 static uiBlock *view3d_transform_rotateaxismenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
1694 {
1695         uiBlock *block;
1696         short yco = 20, menuwidth = 120;
1697
1698         block= uiBeginBlock(C, handle->region, "view3d_transform_rotateaxismenu", UI_EMBOSSP, UI_HELV);
1699         uiBlockSetButmFunc(block, do_view3d_transform_rotateaxismenu, NULL);
1700
1701         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|R, X",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1702         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|R, Y",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1703         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|R, Z",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1704         
1705         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1706         
1707         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|R, X, X",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1708         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|R, Y, Y",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1709         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|R, Z, Z",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1710         
1711         
1712         uiBlockSetDirection(block, UI_RIGHT);
1713         uiTextBoundsBlock(block, 60);
1714         return block;
1715 }
1716
1717 void do_view3d_transform_scaleaxismenu(bContext *C, void *arg, int event)
1718 {
1719 #if 0
1720         float mat[3][3];
1721         
1722         Mat3One(mat);
1723         
1724         switch(event)
1725         {
1726             case 0: /* X Global */
1727                         initTransform(TFM_RESIZE, CTX_NONE);
1728                         BIF_setSingleAxisConstraint(mat[0], " X");
1729                         Transform();
1730                         break;
1731                 case 1: /* Y Global */
1732                         initTransform(TFM_RESIZE, CTX_NONE);
1733                         BIF_setSingleAxisConstraint(mat[1], " Y");
1734                         Transform();
1735                         break;
1736                 case 2: /* Z Global */
1737                         initTransform(TFM_RESIZE, CTX_NONE);
1738                         BIF_setSingleAxisConstraint(mat[2], " Z");
1739                         Transform();
1740                         break;
1741                 case 3: /* X Local */
1742                         initTransform(TFM_RESIZE, CTX_NONE);
1743                         BIF_setLocalAxisConstraint('X', " X");
1744                         Transform();
1745                         break;
1746                 case 4: /* Y Local */
1747                         initTransform(TFM_RESIZE, CTX_NONE);
1748                         BIF_setLocalAxisConstraint('X', " X");
1749                         Transform();
1750                         break;
1751                 case 5: /* Z Local */
1752                         initTransform(TFM_RESIZE, CTX_NONE);
1753                         BIF_setLocalAxisConstraint('X', " X");
1754                         Transform();
1755                         break;
1756         }
1757         allqueue(REDRAWVIEW3D, 0);
1758 #endif
1759 }
1760
1761 static uiBlock *view3d_transform_scaleaxismenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
1762 {
1763         uiBlock *block;
1764         short yco = 20, menuwidth = 120;
1765
1766         block= uiBeginBlock(C, handle->region, "view3d_transform_scaleaxismenu", UI_EMBOSSP, UI_HELV);
1767         uiBlockSetButmFunc(block, do_view3d_transform_scaleaxismenu, NULL);
1768
1769         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Global|S, X",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
1770         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Global|S, Y",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1771         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Global|S, Z",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1772         
1773         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1774         
1775         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|S, X, X",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1776         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|S, Y, Y",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1777         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|S, Z, Z",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1778         
1779         
1780         uiBlockSetDirection(block, UI_RIGHT);
1781         uiTextBoundsBlock(block, 60);
1782         return block;
1783 }
1784
1785 static void do_view3d_transformmenu(bContext *C, void *arg, int event)
1786 {
1787 #if 0
1788         Scene *scene= CTX_data_scene(C);
1789         
1790         switch(event) {
1791         case 1:
1792                 initTransform(TFM_TRANSLATION, CTX_NONE);
1793                 Transform();
1794                 break;
1795         case 2:
1796                 initTransform(TFM_ROTATION, CTX_NONE);
1797                 Transform();
1798                 break;
1799         case 3:
1800                 initTransform(TFM_RESIZE, CTX_NONE);
1801                 Transform();
1802                 break;
1803         case 4:
1804                 image_aspect();
1805                 break;
1806         case 5:
1807                 initTransform(TFM_TOSPHERE, CTX_NONE);
1808                 Transform();
1809                 break;
1810         case 6:
1811                 initTransform(TFM_SHEAR, CTX_NONE);
1812                 Transform();
1813                 break;
1814         case 7:
1815                 initTransform(TFM_WARP, CTX_NONE);
1816                 Transform();
1817                 break;
1818         case 8:
1819                 initTransform(TFM_PUSHPULL, CTX_NONE);
1820                 Transform();
1821                 break;
1822         case 9:
1823                 if (obedit) {
1824                         if (obedit->type == OB_MESH)
1825                                 initTransform(TFM_SHRINKFATTEN, CTX_NONE);
1826                                 Transform();
1827                 } else error("Only meshes can be shrinked/fattened");
1828                 break;
1829         case 10:
1830                 docenter(0);
1831                 break;
1832         case 11:
1833                 docenter_new();
1834                 break;
1835         case 12:
1836                 docenter_cursor();
1837                 break;
1838         case 13:
1839                 initTransform(TFM_TILT, CTX_NONE);
1840                 Transform();
1841                 break;
1842         case 14:
1843                 initTransform(TFM_CURVE_SHRINKFATTEN, CTX_NONE);
1844                 Transform();
1845                 break;
1846         case 15:
1847                 scene->snap_flag &= ~SCE_SNAP;
1848                 break;
1849         case 16:
1850                 scene->snap_flag |= SCE_SNAP;
1851                 break;
1852         case 17:
1853                 scene->snap_target = SCE_SNAP_TARGET_CLOSEST;
1854                 break;
1855         case 18:
1856                 scene->snap_target = SCE_SNAP_TARGET_CENTER;
1857                 break;
1858         case 19:
1859                 scene->snap_target = SCE_SNAP_TARGET_MEDIAN;
1860                 break;
1861         case 20:
1862                 scene->snap_target = SCE_SNAP_TARGET_ACTIVE;
1863                 break;
1864         case 21:
1865                 alignmenu();
1866                 break;
1867         }
1868         allqueue(REDRAWVIEW3D, 0);
1869 #endif
1870 }
1871
1872 static uiBlock *view3d_transformmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
1873 {
1874         Scene *scene= CTX_data_scene(C);
1875         Object *obedit = CTX_data_edit_object(C);
1876         uiBlock *block;
1877         short yco = 20, menuwidth = 120;
1878
1879         block= uiBeginBlock(C, handle->region, "view3d_transformmenu", UI_EMBOSSP, UI_HELV);
1880         uiBlockSetButmFunc(block, do_view3d_transformmenu, NULL);
1881
1882         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Grab/Move|G",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
1883         uiDefIconTextBlockBut(block, view3d_transform_moveaxismenu, NULL, ICON_RIGHTARROW_THIN, "Grab/Move on Axis", 0, yco-=20, 120, 19, "");
1884                 
1885         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotate|R",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
1886         uiDefIconTextBlockBut(block, view3d_transform_rotateaxismenu, NULL, ICON_RIGHTARROW_THIN, "Rotate on Axis", 0, yco-=20, 120, 19, "");
1887
1888         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale|S",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
1889         uiDefIconTextBlockBut(block, view3d_transform_scaleaxismenu, NULL, ICON_RIGHTARROW_THIN, "Scale on Axis", 0, yco-=20, 120, 19, "");
1890
1891         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1892         
1893         if (obedit) {
1894                 if (obedit->type == OB_MESH)
1895                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shrink/Fatten Along Normals|Alt S",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
1896                 else if (obedit->type == OB_CURVE) {
1897                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Tilt|T", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
1898                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shrink/Fatten Radius|Alt S",     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 14, "");
1899                 }
1900         }
1901         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "To Sphere|Ctrl Shift S",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
1902         if (obedit) uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shear|Ctrl S",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1903         else uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Shear|Ctrl Shift Alt S",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
1904         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Warp|Shift W",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
1905         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Push/Pull|Shift P",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
1906         
1907         if (!obedit) {
1908                 uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1909                 
1910                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Scale to Image Aspect Ratio|Alt V",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
1911         }
1912         
1913         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1914
1915         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "ObData to Center",               0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
1916         if (!obedit) {
1917                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center New",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
1918                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Center Cursor",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 12, "");
1919                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Align to Transform Orientation|Ctrl Alt A", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 21, "");
1920         }
1921         
1922         if (BIF_snappingSupported(obedit))
1923         {
1924                 uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1925         
1926                 if (scene->snap_flag & SCE_SNAP)
1927                 {
1928                         uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Grid",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
1929                         uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
1930                 }
1931                 else
1932                 {
1933                         uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Grid",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 15, "");
1934                         uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
1935                 }
1936                         
1937                 uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
1938
1939                 switch(scene->snap_target)
1940                 {
1941                         case SCE_SNAP_TARGET_CLOSEST:
1942                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap Closest",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
1943                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Center",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
1944                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Median",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
1945                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Active",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
1946                                 break;
1947                         case SCE_SNAP_TARGET_CENTER:
1948                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Closest",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
1949                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap Center",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
1950                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Median",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
1951                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Active",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
1952                                 break;
1953                         case SCE_SNAP_TARGET_MEDIAN:
1954                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Closest",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
1955                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Center",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
1956                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap Median",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
1957                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Active",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
1958                                 break;
1959                         case SCE_SNAP_TARGET_ACTIVE:
1960                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Closest",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
1961                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Center",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
1962                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Snap Median",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
1963                                 uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Snap Active",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 20, "");
1964                                 break;
1965                 }
1966         }
1967
1968         uiBlockSetDirection(block, UI_RIGHT);
1969         uiTextBoundsBlock(block, 60);
1970         return block;
1971 }
1972
1973 void do_view3d_object_mirrormenu(bContext *C, void *arg, int event)
1974 {
1975 #if 0
1976         switch(event) {
1977                 case 0:
1978                         initTransform(TFM_MIRROR, CTX_NO_PET);
1979                         Transform();
1980                         break;
1981                 case 1:
1982                         initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
1983                         BIF_setLocalAxisConstraint('X', " on X axis");
1984                         Transform();
1985                         break;
1986                 case 2:
1987                         initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
1988                         BIF_setLocalAxisConstraint('Y', " on Y axis");
1989                         Transform();
1990                         break;
1991                 case 3:
1992                         initTransform(TFM_MIRROR, CTX_NO_PET|CTX_AUTOCONFIRM);
1993                         BIF_setLocalAxisConstraint('Z', " on Z axis");
1994                         Transform();
1995                         break;
1996         }
1997         allqueue(REDRAWVIEW3D, 0);
1998 #endif
1999 }
2000
2001 static uiBlock *view3d_object_mirrormenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
2002 {
2003         uiBlock *block;
2004         short yco = 20, menuwidth = 120;
2005
2006         block= uiBeginBlock(C, handle->region, "view3d_object_mirrormenu", UI_EMBOSSP, UI_HELV);
2007         uiBlockSetButmFunc(block, do_view3d_object_mirrormenu, NULL);
2008         
2009         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Interactive Mirror|Ctrl M",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2010         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2011         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "X Local|Ctrl M, X",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2012         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Y Local|Ctrl M, Y",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2013         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Z Local|Ctrl M, Z",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2014
2015         uiBlockSetDirection(block, UI_RIGHT);
2016         uiTextBoundsBlock(block, 60);
2017         return block;
2018 }
2019
2020 static void do_view3d_edit_object_transformmenu(bContext *C, void *arg, int event)
2021 {
2022 #if 0
2023         switch(event) {
2024         case 0: /*      clear origin */
2025                 clear_object('o');
2026                 break;
2027         case 1: /* clear scale */
2028                 clear_object('s');
2029                 break;
2030         case 2: /* clear rotation */
2031                 clear_object('r');
2032                 break;
2033         case 3: /* clear location */
2034                 clear_object('g');
2035                 break;
2036         case 4:
2037                 if(OBACT) object_apply_deform(OBACT);
2038                 break;
2039         case 5: /* make duplis real */
2040                 make_duplilist_real();
2041                 break;
2042         case 6: /* apply scale/rotation or deformation */
2043                 apply_objects_locrot();
2044                 break;  
2045         case 7: /* apply visual matrix to objects loc/size/rot */
2046                 apply_objects_visual_tx();
2047                 break;  
2048         }
2049         allqueue(REDRAWVIEW3D, 0);
2050 #endif
2051 }
2052
2053 static uiBlock *view3d_edit_object_transformmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
2054 {
2055         uiBlock *block;
2056         short yco = 20, menuwidth = 120;
2057
2058         block= uiBeginBlock(C, handle->region, "view3d_edit_object_transformmenu", UI_EMBOSSP, UI_HELV);
2059         uiBlockSetButmFunc(block, do_view3d_edit_object_transformmenu, NULL);
2060         
2061         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Scale/Rotation to ObData|Ctrl A, 1",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2062         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Visual Transform|Ctrl A, 2",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2063         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Apply Deformation|Ctrl Shift A",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2064         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Duplicates Real|Ctrl Shift A",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2065         
2066         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2067         
2068         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Location|Alt G", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2069         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Rotation|Alt R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2070         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Scale|Alt S", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2071         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Origin|Alt O",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2072         
2073         uiBlockSetDirection(block, UI_RIGHT);
2074         uiTextBoundsBlock(block, 60);
2075         return block;
2076 }
2077
2078 static void do_view3d_edit_object_makelocalmenu(bContext *C, void *arg, int event)
2079 {
2080 #if 0
2081         switch(event) {
2082                 case 1:
2083                 case 2:
2084                 case 3:
2085                         make_local(event);
2086                         break;
2087         }
2088 #endif
2089 }
2090
2091 static uiBlock *view3d_edit_object_makelocalmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
2092 {       
2093         uiBlock *block;
2094         short yco = 20, menuwidth = 120;
2095         
2096         block= uiBeginBlock(C, handle->region, "view3d_edit_object_makelocalmenu", UI_EMBOSSP, UI_HELV);
2097         uiBlockSetButmFunc(block, do_view3d_edit_object_makelocalmenu, NULL);
2098         
2099         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selected Objects|L, 1",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2100         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Selected Objects and Data|L, 2",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2101         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "All|L, 3",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2102         
2103         uiBlockSetDirection(block, UI_RIGHT);
2104         uiTextBoundsBlock(block, 60);
2105         return block;
2106 }
2107
2108 static void do_view3d_edit_object_makelinksmenu(bContext *C, void *arg, int event)
2109 {
2110 #if 0
2111         switch(event) {
2112         case 1:
2113         case 2:
2114         case 3:
2115         case 4:
2116                 make_links((short)event);
2117                 break;
2118                 }
2119         allqueue(REDRAWVIEW3D, 0);
2120 #endif
2121 }
2122
2123 static uiBlock *view3d_edit_object_makelinksmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
2124 {
2125         Scene *scene= CTX_data_scene(C);
2126         Object *ob=NULL;
2127         
2128         uiBlock *block;
2129         short yco = 20, menuwidth = 120;
2130
2131         block= uiBeginBlock(C, handle->region, "view3d_edit_object_makelinksmenu", UI_EMBOSSP, UI_HELV);
2132         uiBlockSetButmFunc(block, do_view3d_edit_object_makelinksmenu, NULL);
2133         
2134         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "To Scene...|Ctrl L, 1",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2135         
2136         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2137         
2138         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Ipo|Ctrl L, 2",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2139         
2140         if ((ob=OBACT)) {
2141         
2142                 if(ob->type==OB_MESH) {
2143                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mesh Data|Ctrl L, 3",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2144                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2145                 } else if(ob->type==OB_CURVE) {
2146                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Curve Data|Ctrl L, 3",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2147                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2148                 } else if(ob->type==OB_FONT) {
2149                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Text Data|Ctrl L, 3",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2150                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2151                 } else if(ob->type==OB_SURF) {
2152                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Surface Data|Ctrl L, 3",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2153                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 4",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2154                 } else if(ob->type==OB_MBALL) {
2155                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials|Ctrl L, 3",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2156                 } else if(ob->type==OB_CAMERA) {
2157                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Camera Data|Ctrl L, 3",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2158                 } else if(ob->type==OB_LAMP) {
2159                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lamp Data|Ctrl L, 3",            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2160                 } else if(ob->type==OB_LATTICE) {
2161                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Lattice Data|Ctrl L, 3",         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2162                 } else if(ob->type==OB_ARMATURE) {
2163                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Armature Data|Ctrl L, 3",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2164                 }
2165         }
2166         
2167         uiBlockSetDirection(block, UI_RIGHT);
2168         uiTextBoundsBlock(block, 60);
2169         return block;
2170 }
2171
2172 static void do_view3d_edit_object_singleusermenu(bContext *C, void *arg, int event)
2173 {
2174 #if 0
2175         switch(event) {
2176         case 1: /* Object */
2177                 single_object_users(1);
2178                 break;
2179         case 2: /* Object & ObData */ 
2180                 single_object_users(1);
2181                 single_obdata_users(1);
2182                 break;
2183         case 3: /* Object & ObData & Materials+Tex */
2184                 single_object_users(1);
2185                 single_obdata_users(1);
2186                 single_mat_users(1); /* also tex */
2187                 break;
2188         case 4: /* Materials+Tex */
2189                 single_mat_users(1);
2190                 break;
2191         case 5: /* Ipo */
2192                 single_ipo_users(1);
2193                 break;
2194         }
2195         
2196         clear_id_newpoins();
2197         countall();
2198         
2199         allqueue(REDRAWALL, 0);
2200 #endif
2201 }
2202
2203 static uiBlock *view3d_edit_object_singleusermenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
2204 {
2205
2206         uiBlock *block;
2207         short yco = 20, menuwidth = 120;
2208
2209         block= uiBeginBlock(C, handle->region, "view3d_edit_object_singleusermenu", UI_EMBOSSP, UI_HELV);
2210         uiBlockSetButmFunc(block, do_view3d_edit_object_singleusermenu, NULL);
2211         
2212         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object|U, 1",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2213         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object & ObData|U, 2",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2214         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object & ObData & Materials+Tex|U, 3",   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2215         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Materials+Tex|U, 4",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2216         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Ipos|U, 5",                              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2217         
2218         uiBlockSetDirection(block, UI_RIGHT);
2219         uiTextBoundsBlock(block, 60);
2220         return block;
2221 }
2222
2223 static void do_view3d_edit_object_copyattrmenu(bContext *C, void *arg, int event)
2224 {
2225         switch(event) {
2226         case 1:
2227         case 2:
2228         case 3:
2229         case 4:
2230         case 5:
2231         case 6:
2232         case 7:
2233         case 8:
2234         case 9:
2235         case 10:
2236         case 11:
2237         case 17:
2238         case 18:
2239         case 19:
2240         case 20:
2241         case 21:
2242         case 22:
2243         case 23:
2244         case 24:
2245         case 25:
2246         case 26:
2247         case 29:
2248         case 30:
2249 // XXX          copy_attr((short)event);
2250                 break;
2251                 }
2252         allqueue(REDRAWVIEW3D, 0);
2253 }
2254
2255 static uiBlock *view3d_edit_object_copyattrmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
2256 {
2257         Scene *scene= CTX_data_scene(C);
2258         Object *ob=NULL;
2259         
2260         uiBlock *block;
2261         short yco = 20, menuwidth = 120;
2262
2263         block= uiBeginBlock(C, handle->region, "view3d_edit_object_copyattrmenu", UI_EMBOSSP, UI_HELV);
2264         uiBlockSetButmFunc(block, do_view3d_edit_object_copyattrmenu, NULL);
2265         
2266         ob= OBACT;
2267         
2268         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Location|Ctrl C, 1",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2269         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rotation|Ctrl C, 2",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2270         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Size|Ctrl C, 3",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2271         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Drawtype|Ctrl C, 4",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2272         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Time Offset|Ctrl C, 5",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2273         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Dupli|Ctrl C, 6",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2274         
2275         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2276         
2277         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mass|Ctrl C, 7",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2278         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Damping|Ctrl C, 8",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
2279         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "All Physical Attributes|Ctrl C, 11",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");
2280         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Properties|Ctrl C, 9",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
2281         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Logic Bricks|Ctrl C, 10",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
2282         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Protected Transform |Ctrl C",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 29, "");
2283         
2284         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2285         
2286         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Constraints|Ctrl C",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 22, "");
2287         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "NLA Strips|Ctrl C",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 26, "");
2288         
2289         if (ob) {
2290         
2291                 if ((ob->type == OB_MESH) || (ob->type == OB_CURVE) || (ob->type == OB_SURF) ||
2292                                 (ob->type == OB_FONT) || (ob->type == OB_MBALL)) {
2293                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Texture Space|Ctrl C",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 17, "");
2294                 }       
2295                 
2296                 if(ob->type == OB_FONT) {
2297                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Font Settings|Ctrl C",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");
2298                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel Settings|Ctrl C",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
2299                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Curve Resolution|Ctrl C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 25, "");
2300                 }
2301                 if(ob->type == OB_CURVE) {
2302                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel Settings|Ctrl C",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 19, "");
2303                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Curve Resolution|Ctrl C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 25, "");
2304                 }
2305         
2306                 if(ob->type==OB_MESH) {
2307                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subsurf Settings|Ctrl C",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 21, "");
2308                         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Modifiers ...|Ctrl C",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 24, "");
2309                 }
2310                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Object Pass Index|Ctrl C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 30, "");
2311         }
2312         
2313         uiBlockSetDirection(block, UI_RIGHT);
2314         uiTextBoundsBlock(block, 60);
2315         return block;
2316 }
2317
2318
2319 static void do_view3d_edit_object_parentmenu(bContext *C, void *arg, int event)
2320 {
2321 #if 0
2322         switch(event) {
2323         case 0: /* clear parent */
2324                 clear_parent();
2325                 break;
2326         case 1: /* make parent */
2327                 make_parent();
2328                 break;
2329                 }
2330         allqueue(REDRAWVIEW3D, 0);
2331 #endif
2332 }
2333
2334 static uiBlock *view3d_edit_object_parentmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
2335 {
2336         uiBlock *block;
2337         short yco = 20, menuwidth = 120;
2338
2339         block= uiBeginBlock(C, handle->region, "view3d_edit_object_parentmenu", UI_EMBOSSP, UI_HELV);
2340         uiBlockSetButmFunc(block, do_view3d_edit_object_parentmenu, NULL);
2341         
2342         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Parent...|Ctrl P",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2343         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Parent...|Alt P",          0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2344
2345         uiBlockSetDirection(block, UI_RIGHT);
2346         uiTextBoundsBlock(block, 60);
2347         return block;
2348 }
2349
2350 static void do_view3d_edit_object_groupmenu(bContext *C, void *arg, int event)
2351 {
2352 #if 0
2353         switch(event) {
2354                 case 1:
2355                 case 2:
2356                 case 3:
2357                         group_operation(event);
2358                         break;
2359         }
2360         allqueue(REDRAWVIEW3D, 0);
2361 #endif
2362 }
2363
2364 static uiBlock *view3d_edit_object_groupmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
2365 {
2366         uiBlock *block;
2367         short yco = 20, menuwidth = 120;
2368         
2369         block= uiBeginBlock(C, handle->region, "view3d_edit_object_groupmenu", UI_EMBOSSP, UI_HELV);
2370         uiBlockSetButmFunc(block, do_view3d_edit_object_groupmenu, NULL);
2371         
2372         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add to Existing Group|Ctrl G, 1",        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2373         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add to New Group|Ctrl G, 2",     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2374         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Remove from All Groups|Ctrl G, 3",       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2375         
2376         uiBlockSetDirection(block, UI_RIGHT);
2377         uiTextBoundsBlock(block, 60);
2378         return block;
2379 }
2380
2381 static void do_view3d_edit_object_trackmenu(bContext *C, void *arg, int event)
2382 {
2383 #if 0
2384         switch(event) {
2385         case 0: /* clear track */
2386                 clear_track();
2387                 break;
2388         case 1: /* make track */
2389                 make_track();
2390                 break;
2391                 }
2392         allqueue(REDRAWVIEW3D, 0);
2393 #endif
2394 }
2395
2396 static uiBlock *view3d_edit_object_trackmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
2397 {
2398         uiBlock *block;
2399         short yco = 20, menuwidth = 120;
2400
2401         block= uiBeginBlock(C, handle->region, "view3d_edit_object_trackmenu", UI_EMBOSSP, UI_HELV);
2402         uiBlockSetButmFunc(block, do_view3d_edit_object_trackmenu, NULL);
2403         
2404         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Track...|Ctrl T",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2405         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Track...|Alt T",           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2406         
2407         uiBlockSetDirection(block, UI_RIGHT);
2408         uiTextBoundsBlock(block, 60);
2409         return block;
2410 }
2411
2412 static void do_view3d_edit_object_constraintsmenu(bContext *C, void *arg, int event)
2413 {
2414 #if 0
2415         switch(event) {
2416         case 1: /* add constraint */
2417                 add_constraint(0);
2418                 break;
2419         case 2: /* clear constraint */
2420                 ob_clear_constraints();
2421                 break;
2422                 }
2423         allqueue(REDRAWVIEW3D, 0);
2424 #endif
2425 }
2426
2427 static uiBlock *view3d_edit_object_constraintsmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
2428 {
2429         uiBlock *block;
2430         short yco = 20, menuwidth = 120;
2431
2432         block= uiBeginBlock(C, handle->region, "view3d_edit_object_constraintsmenu", UI_EMBOSSP, UI_HELV);
2433         uiBlockSetButmFunc(block, do_view3d_edit_object_constraintsmenu, NULL);
2434         
2435         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Constraint...|Ctrl Alt C",                   0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2436         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Constraints",              0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2437         
2438         uiBlockSetDirection(block, UI_RIGHT);
2439         uiTextBoundsBlock(block, 60);
2440         return block;
2441 }
2442
2443 static void do_view3d_edit_object_showhidemenu(bContext *C, void *arg, int event)
2444 {
2445 #if 0
2446         
2447         switch(event) {
2448                  
2449         case 0: /* show objects */
2450                 show_objects();
2451                 break;
2452         case 1: /* hide selected objects */
2453                 hide_objects(1);
2454                 break;
2455         case 2: /* hide deselected objects */
2456                 hide_objects(0);
2457                 break;
2458         }
2459         allqueue(REDRAWVIEW3D, 0);
2460 #endif
2461 }
2462
2463 static uiBlock *view3d_edit_object_showhidemenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
2464 {
2465         uiBlock *block;
2466         short yco = 20, menuwidth = 120;
2467
2468         block= uiBeginBlock(C, handle->region, "view3d_edit_object_showhidemenu", UI_EMBOSSP, UI_HELV);
2469         uiBlockSetButmFunc(block, do_view3d_edit_object_showhidemenu, NULL);
2470         
2471         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Hidden|Alt H",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2472         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Selected|H",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2473         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Hide Deselected|Shift H",                0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2474
2475         uiBlockSetDirection(block, UI_RIGHT);
2476         uiTextBoundsBlock(block, 60);
2477         return block;
2478 }
2479
2480 #ifndef DISABLE_PYTHON
2481 static void do_view3d_edit_object_scriptsmenu(bContext *C, void *arg, int event)
2482 {
2483 #if 0
2484         BPY_menu_do_python(PYMENU_OBJECT, event);
2485
2486         allqueue(REDRAWVIEW3D, 0);
2487 #endif
2488 }
2489
2490 static uiBlock *view3d_edit_object_scriptsmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
2491 {
2492         uiBlock *block;
2493 //      short yco = 20, menuwidth = 120;
2494 // XXX  BPyMenu *pym;
2495 //      int i = 0;
2496
2497         block= uiBeginBlock(C, handle->region, "v3d_eobject_pymenu", UI_EMBOSSP, UI_HELV);
2498         uiBlockSetButmFunc(block, do_view3d_edit_object_scriptsmenu, NULL);
2499
2500 //      for (pym = BPyMenuTable[PYMENU_OBJECT]; pym; pym = pym->next, i++) {
2501 //              uiDefIconTextBut(block, BUTM, 1, ICON_PYTHON, pym->name, 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, i, pym->tooltip?pym->tooltip:pym->filename);
2502 //      }
2503
2504         uiBlockSetDirection(block, UI_RIGHT);
2505         uiTextBoundsBlock(block, 60);
2506
2507         return block;
2508 }
2509 #endif /* DISABLE_PYTHON */
2510
2511
2512 static void do_view3d_edit_objectmenu(bContext *C, void *arg, int event)
2513 {
2514 #if 0
2515         Scene *scene= CTX_data_scene(C);
2516         ScrArea *sa= CTX_wm_area(C);
2517         View3D *v3d= sa->spacedata.first;
2518         
2519         switch(event) {
2520          
2521         case 0: /* transform    properties*/
2522 // XXX          mainqenter(NKEY, 1);
2523                 break;
2524         case 1: /* delete */
2525                 delete_context_selected();
2526                 break;
2527         case 2: /* duplicate */
2528                 duplicate_context_selected();
2529                 break;
2530         case 3: /* duplicate linked */
2531                 adduplicate(0, 0);
2532                 break;
2533         case 5: /* make single user */
2534                 single_user();
2535                 break;
2536         case 7: /* boolean operation */
2537                 special_editmenu();
2538                 break;
2539         case 8: /* join objects */
2540                 join_menu();
2541                 break;
2542         case 9: /* convert object type */
2543                 convertmenu();
2544                 break;
2545         case 10: /* move to layer */
2546                 movetolayer();
2547                 break;
2548         case 11: /* insert keyframe */
2549                 common_insertkey();
2550                 break;
2551         case 15: /* Object Panel */
2552                 add_blockhandler(sa, VIEW3D_HANDLER_OBJECT, UI_PNL_UNSTOW);
2553                 break;
2554         case 16: /* make proxy object*/
2555                 make_proxy();
2556                 break;
2557         case 18: /* delete keyframe */
2558                 common_deletekey();
2559                 break; 
2560         }
2561         allqueue(REDRAWVIEW3D, 0);
2562 #endif
2563 }
2564
2565 static uiBlock *view3d_edit_objectmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
2566 {
2567         Scene *scene= CTX_data_scene(C);
2568         uiBlock *block;
2569         short yco= 0, menuwidth=120;
2570         
2571         block= uiBeginBlock(C, handle->region, "view3d_edit_objectmenu", UI_EMBOSSP, UI_HELV);
2572         uiBlockSetButmFunc(block, do_view3d_edit_objectmenu, NULL);
2573         
2574         uiDefIconTextBut(block, BUTM, 1, ICON_MENU_PANEL, "Transform Properties|N",             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 0, 15, "");
2575         uiDefIconTextBlockBut(block, view3d_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Transform", 0, yco-=20, 120, 19, "");
2576         uiDefIconTextBlockBut(block, view3d_object_mirrormenu, NULL, ICON_RIGHTARROW_THIN, "Mirror", 0, yco-=20, menuwidth, 19, "");
2577
2578         uiDefIconTextBlockBut(block, view3d_edit_object_transformmenu, NULL, ICON_RIGHTARROW_THIN, "Clear/Apply", 0, yco-=20, 120, 19, "");
2579         uiDefIconTextBlockBut(block, view3d_edit_snapmenu, NULL, ICON_RIGHTARROW_THIN, "Snap", 0, yco-=20, 120, 19, "");
2580         
2581         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2582         
2583         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Insert Keyframe|I",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 11, "");  
2584         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete Keyframe|Alt I",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 18, "");  
2585         
2586         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2587         
2588         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate|Shift D",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2589         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Duplicate Linked|Alt D",                         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2590         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Delete|X",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2591         
2592         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2593         
2594         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Proxy|Ctrl Alt P",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 16, "");
2595         uiDefIconTextBlockBut(block, view3d_edit_object_makelinksmenu, NULL, ICON_RIGHTARROW_THIN, "Make Links", 0, yco-=20, 120, 19, "");
2596         uiDefIconTextBlockBut(block, view3d_edit_object_singleusermenu, NULL, ICON_RIGHTARROW_THIN, "Make Single User", 0, yco-=20, 120, 19, "");
2597         uiDefIconTextBlockBut(block, view3d_edit_object_makelocalmenu, NULL, ICON_RIGHTARROW_THIN, "Make Local", 0, yco-=20, 120, 19, "");
2598         uiDefIconTextBlockBut(block, view3d_edit_object_copyattrmenu, NULL, ICON_RIGHTARROW_THIN, "Copy Attributes", 0, yco-=20, 120, 19, "");
2599         
2600         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2601         
2602         uiDefIconTextBlockBut(block, view3d_edit_object_parentmenu, NULL, ICON_RIGHTARROW_THIN, "Parent", 0, yco-=20, 120, 19, "");
2603         uiDefIconTextBlockBut(block, view3d_edit_object_groupmenu, NULL, ICON_RIGHTARROW_THIN, "Group", 0, yco-=20, 120, 19, "");
2604         uiDefIconTextBlockBut(block, view3d_edit_object_trackmenu, NULL, ICON_RIGHTARROW_THIN, "Track", 0, yco-=20, 120, 19, "");
2605         uiDefIconTextBlockBut(block, view3d_edit_object_constraintsmenu, NULL, ICON_RIGHTARROW_THIN, "Constraints", 0, yco-=20, 120, 19, "");
2606         
2607         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2608         
2609         if (OBACT && OBACT->type == OB_MESH) {
2610                 uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Boolean Operation...|W",                         0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2611         }
2612         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Join Objects|Ctrl J",                            0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
2613         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Convert Object Type...|Alt C",                           0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
2614         
2615         uiDefBut(block, SEPR, 0, "",                    0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2616         
2617         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Move to Layer...|M",                             0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
2618         uiDefIconTextBlockBut(block, view3d_edit_object_showhidemenu, NULL, ICON_RIGHTARROW_THIN, "Show/Hide Objects", 0, yco-=20, 120, 19, "");
2619         
2620 #ifndef DISABLE_PYTHON
2621         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2622         uiDefIconTextBlockBut(block, view3d_edit_object_scriptsmenu, NULL, ICON_RIGHTARROW_THIN, "Scripts", 0, yco-=20, 120, 19, "");
2623 #endif
2624                 
2625         if(handle->region->alignment==RGN_ALIGN_TOP) {
2626                 uiBlockSetDirection(block, UI_DOWN);
2627         }
2628         else {
2629                 uiBlockSetDirection(block, UI_TOP);
2630                 uiBlockFlipOrder(block);
2631         }
2632
2633         uiTextBoundsBlock(block, 50);
2634         return block;
2635 }
2636
2637
2638 static void do_view3d_edit_propfalloffmenu(bContext *C, void *arg, int event)
2639 {
2640         Scene *scene= CTX_data_scene(C);
2641         
2642         scene->prop_mode= event;
2643         
2644         allqueue(REDRAWVIEW3D, 1);
2645 }
2646
2647 static uiBlock *view3d_edit_propfalloffmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
2648 {
2649         Scene *scene= CTX_data_scene(C);
2650         uiBlock *block;
2651         short yco = 20, menuwidth = 120;
2652
2653         block= uiBeginBlock(C, handle->region, "view3d_edit_propfalloffmenu", UI_EMBOSSP, UI_HELV);
2654         uiBlockSetButmFunc(block, do_view3d_edit_propfalloffmenu, NULL);
2655         
2656         if (scene->prop_mode==PROP_SMOOTH) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Smooth|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SMOOTH, "");
2657         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Smooth|Shift O",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SMOOTH, "");
2658         if (scene->prop_mode==PROP_SPHERE) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Sphere|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SPHERE, "");
2659         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Sphere|Shift O",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SPHERE, "");
2660         if (scene->prop_mode==PROP_ROOT) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Root|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_ROOT, "");
2661         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Root|Shift O",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_ROOT, "");
2662         if (scene->prop_mode==PROP_SHARP) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Sharp|Shift O",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SHARP, "");
2663         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Sharp|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_SHARP, "");
2664         if (scene->prop_mode==PROP_LIN) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Linear|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_LIN, "");
2665         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Linear|Shift O",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_LIN, "");
2666         if (scene->prop_mode==PROP_RANDOM) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Random|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_RANDOM, "");
2667         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Random|Shift O",    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_RANDOM, "");
2668         if (scene->prop_mode==PROP_CONST) uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_HLT, "Constant|Shift O", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_CONST, "");
2669         else uiDefIconTextBut(block, BUTM, 1, ICON_CHECKBOX_DEHLT, "Constant|Shift O",  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, PROP_CONST, "");
2670                 
2671         uiBlockSetDirection(block, UI_RIGHT);
2672         uiTextBoundsBlock(block, 60);
2673         return block;
2674 }
2675
2676
2677 void do_view3d_edit_mesh_verticesmenu(bContext *C, void *arg, int event)
2678 {
2679 #if 0
2680         Scene *scene= CTX_data_scene(C);
2681         
2682         switch(event) {
2683         int count; 
2684         
2685         case 0: /* make vertex parent */
2686                 make_parent();
2687                 break;
2688         case 1: /* remove doubles */
2689                 count= removedoublesflag(1, 0, scene->toolsettings->doublimit);
2690                 notice("Removed: %d", count);
2691                 if (count) { /* only undo and redraw if an action is taken */
2692                         DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
2693                         ED_undo_push(C, "Rem Doubles");
2694                 }
2695                 break;
2696         case 2: /* smooth */
2697                 vertexsmooth();
2698                 break;
2699         case 3: /* separate */
2700                 separate_mesh();
2701                 break;
2702         case 4: /*split */
2703                 split_mesh();
2704                 break;
2705         case 5: /*merge */
2706                 mergemenu();
2707                 DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
2708                 break;
2709         case 6: /* add hook */
2710                 add_hook_menu();
2711                 break;
2712         case 7: /* rip */
2713                 mesh_rip();
2714                 break;
2715         }
2716         allqueue(REDRAWVIEW3D, 0);
2717 #endif
2718 }
2719
2720 static uiBlock *view3d_edit_mesh_verticesmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
2721 {
2722         uiBlock *block;
2723         short yco = 20, menuwidth = 120;
2724
2725         block= uiBeginBlock(C, handle->region, "view3d_edit_mesh_verticesmenu", UI_EMBOSSP, UI_HELV);
2726         uiBlockSetButmFunc(block, do_view3d_edit_mesh_verticesmenu, NULL);
2727         
2728         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Merge...|Alt M",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2729         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Rip|V",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2730         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Split|Y",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2731         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Separate|P",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2732         
2733         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2734         
2735         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Smooth|W, Alt 1",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2736         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Remove Doubles|W, 6",                    0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2737         
2738         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2739
2740         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Vertex Parent|Ctrl P",      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2741         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Add Hook|Ctrl H",                        0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2742
2743         uiBlockSetDirection(block, UI_RIGHT);
2744         uiTextBoundsBlock(block, 60);
2745         return block;
2746 }
2747
2748 extern void editmesh_mark_sharp(int set); /* declared in editmesh_mods.c */
2749
2750 void do_view3d_edit_mesh_edgesmenu(bContext *C, void *arg, int event)
2751 {
2752 #if 0
2753         Scene *scene= CTX_data_scene(C);
2754         float fac;
2755         short randfac;
2756
2757         switch(event) {
2758                  
2759         case 0: /* subdivide smooth */
2760                 esubdivideflag(1, 0.0, scene->toolsettings->editbutflag | B_SMOOTH,1,0);
2761                 ED_undo_push(C, "Subdivide Smooth");
2762                 break;
2763         case 1: /*subdivide fractal */
2764                 randfac= 10;
2765                 if(button(&randfac, 1, 100, "Rand fac:")==0) return;
2766                 fac= -( (float)randfac )/100;
2767                 esubdivideflag(1, fac, scene->toolsettings->editbutflag,1,0);
2768                 ED_undo_push(C, "Subdivide Fractal");
2769                 break;
2770         case 2: /* subdivide */
2771                 esubdivideflag(1, 0.0, scene->toolsettings->editbutflag,1,0);
2772                 ED_undo_push(C, "Subdivide");
2773                 break;
2774         case 3: /* knife subdivide */
2775                 KnifeSubdivide(KNIFE_PROMPT);
2776                 break;
2777         case 4: /* Loop subdivide */
2778                 CutEdgeloop(1);
2779                 break;
2780         case 5: /* Make Edge/Face */
2781                 addedgeface_mesh();
2782                 break;
2783         case 6:
2784                 bevel_menu();
2785                 break;
2786         case 7: /* Mark Seam */
2787                 editmesh_mark_seam(0);
2788                 break;
2789         case 8: /* Clear Seam */
2790                 editmesh_mark_seam(1);
2791                 break;
2792         case 9: /* Crease SubSurf */
2793                 if(!multires_level1_test()) {
2794                         initTransform(TFM_CREASE, CTX_EDGE);
2795                         Transform();
2796                 }
2797                 break;
2798         case 10: /* Rotate Edge */
2799                 edge_rotate_selected(2);
2800                 break;
2801         case 11: /* Rotate Edge */
2802                 edge_rotate_selected(1);
2803                 break;
2804         case 12: /* Edgeslide */
2805                 EdgeSlide(0,0.0);
2806                 break;
2807         case 13: /* Edge Loop Delete */
2808                 if(EdgeLoopDelete()) {
2809                         countall();
2810                         ED_undo_push(C, "Erase Edge Loop");
2811                         DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
2812                 }
2813                 break;
2814         case 14: /*Collapse Edges*/
2815                 collapseEdges();
2816                 ED_undo_push(C, "Collapse");
2817                 break;
2818         case 15:
2819                 editmesh_mark_sharp(1);
2820                 ED_undo_push(C, "Mark Sharp");
2821                 DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
2822                 break;
2823         case 16:
2824                 editmesh_mark_sharp(0);
2825                 ED_undo_push(C, "Clear Sharp");
2826                 DAG_object_flush_update(scene, obedit, OB_RECALC_DATA);
2827                 break;
2828         case 17: /* Adjust Bevel Weight */
2829                 if(!multires_level1_test()) {
2830                         initTransform(TFM_BWEIGHT, CTX_EDGE);
2831                         Transform();
2832                 }
2833                 break;
2834         }
2835         allqueue(REDRAWVIEW3D, 0);
2836 #endif
2837 }
2838
2839 static uiBlock *view3d_edit_mesh_edgesmenu(bContext *C, uiMenuBlockHandle *handle, void *arg_unused)
2840 {
2841         uiBlock *block;
2842         short yco = 20, menuwidth = 120;
2843
2844         block= uiBeginBlock(C, handle->region, "view3d_edit_mesh_edgesmenu", UI_EMBOSSP, UI_HELV);
2845         uiBlockSetButmFunc(block, do_view3d_edit_mesh_edgesmenu, NULL);
2846         
2847         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Make Edge/Face|F",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 5, "");
2848         
2849         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2850         
2851         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Bevel|W, Alt 2",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 6, "");
2852         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Loop Subdivide...|Ctrl R",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, "");
2853         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Knife Subdivide...|Shift K",                     0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 3, "");
2854         
2855         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2856         
2857         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide|W, 1",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 2, "");
2858         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide Fractal|W, 3",                 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 1, "");
2859         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Subdivide Smooth|W, 4",                  0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 0, "");
2860
2861         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2862
2863         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mark Seam|Ctrl E",                       0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 7, "");
2864         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Clear Seam|Ctrl E",                      0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
2865         
2866         uiDefBut(block, SEPR, 0, "",                            0, yco-=6, menuwidth, 6, NULL, 0.0, 0.0, 0, 0, "");
2867         
2868         uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Mark Sharp|Ctrl E",    &n