prevent popup deactivation while button_down
[goodguy/history.git] / cinelerra-5.0 / cinelerra / editpanel.C
1
2 /*
3  * CINELERRA
4  * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
5  * 
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (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
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  * 
20  */
21
22 #include "awindow.h"
23 #include "awindowgui.h"
24 #include "bcsignals.h"
25 #include "clipedit.h"
26 #include "cplayback.h"
27 #include "cwindow.h"
28 #include "cwindowgui.h"
29 #include "editpanel.h"
30 #include "edl.h"
31 #include "edlsession.h"
32 #include "filexml.h"
33 #include "keys.h"
34 #include "language.h"
35 #include "localsession.h"
36 #include "mainclock.h"
37 #include "mainundo.h"
38 #include "mbuttons.h"
39 #include "meterpanel.h"
40 #include "mwindow.h"
41 #include "mwindowgui.h"
42 #include "playbackengine.h"
43 #include "theme.h"
44 #include "timebar.h"
45 #include "trackcanvas.h"
46 #include "transportque.h"
47 #include "zoombar.h"
48
49
50
51 EditPanel::EditPanel(MWindow *mwindow, 
52         BC_WindowBase *subwindow,
53         int x, 
54         int y, 
55         int editing_mode, 
56         int use_editing_mode,
57         int use_keyframe, 
58         int use_splice,   // Extra buttons
59         int use_overwrite,
60         int use_lift,
61         int use_extract,
62         int use_copy, 
63         int use_paste, 
64         int use_undo,
65         int use_fit,
66         int use_labels,
67         int use_toclip,
68         int use_meters,
69         int is_mwindow,
70         int use_cut,
71         int use_commercial)
72 {
73         this->editing_mode = editing_mode;
74         this->use_editing_mode = use_editing_mode;
75         this->use_keyframe = use_keyframe;
76         this->use_splice = use_splice;
77         this->use_overwrite = use_overwrite;
78         this->use_lift = 0;
79         this->use_extract = 0;
80         this->use_copy = use_copy;
81         this->use_paste = use_paste;
82         this->use_undo = use_undo;
83         this->mwindow = mwindow;
84         this->subwindow = subwindow;
85         this->use_fit = use_fit;
86         this->use_labels = use_labels;
87         this->use_toclip = use_toclip;
88         this->use_meters = use_meters;
89         this->is_mwindow = is_mwindow;
90         this->use_cut = use_cut;
91         this->use_commercial = use_commercial;
92
93         this->x = x;
94         this->y = y;
95         this->fit = 0;
96         this->fit_autos = 0;
97         this->inpoint = 0;
98         this->outpoint = 0;
99         this->splice = 0;
100         this->overwrite = 0;
101         this->lift = 0;
102         this->extract = 0;
103         this->clip = 0;
104         this->cut = 0;
105         this->commercial = 0;
106         this->copy = 0;
107         this->paste = 0;
108         this->labelbutton = 0;
109         this->prevlabel = 0;
110         this->nextlabel = 0;
111         this->prevedit = 0;
112         this->nextedit = 0;
113         this->undo = 0;
114         this->redo = 0;
115         this->meter_panel = 0;
116         this->meters = 0;
117         this->arrow = 0;
118         this->ibeam = 0;
119         this->keyframe = 0;
120 }
121
122 EditPanel::~EditPanel()
123 {
124 }
125
126 void EditPanel::set_meters(MeterPanel *meter_panel)
127 {
128         this->meter_panel = meter_panel;
129 }
130
131
132 void EditPanel::update()
133 {
134         int new_editing_mode = mwindow->edl->session->editing_mode;
135         if(arrow) arrow->update(new_editing_mode == EDITING_ARROW);
136         if(ibeam) ibeam->update(new_editing_mode == EDITING_IBEAM);
137         if(keyframe) keyframe->update(mwindow->edl->session->auto_keyframes);
138         if(meters) 
139         {
140 //printf("EditPanel::update %d %p %p\n", __LINE__, subwindow, (BC_WindowBase*)mwindow->cwindow->gui);
141                 if(subwindow == (BC_WindowBase*)mwindow->cwindow->gui)
142                 {
143 //printf("EditPanel::update %d %d\n", __LINE__, mwindow->edl->session->cwindow_meter);
144                         meters->update(mwindow->edl->session->cwindow_meter);
145                         mwindow->cwindow->gui->update_meters();
146                 }
147                 else
148                 {
149 //printf("EditPanel::update %d %d\n", __LINE__, mwindow->edl->session->vwindow_meter);
150                         meters->update(mwindow->edl->session->vwindow_meter);
151                 }
152         }
153         subwindow->flush();
154 }
155
156 void EditPanel::delete_buttons()
157 {
158         if(use_editing_mode)
159         {
160                 if(arrow) delete arrow;
161                 if(ibeam) delete ibeam;
162         }
163         
164         if(use_keyframe)
165                 delete keyframe;
166
167
168         if(inpoint) delete inpoint;
169         if(outpoint) delete outpoint;
170         if(use_copy) delete copy;
171         if(use_splice) delete splice;
172         if(use_overwrite) delete overwrite;
173         if(use_lift) delete lift;
174         if(use_extract) delete extract;
175         if(cut) delete cut;
176         if(commercial) delete commercial;
177         if(copy) delete copy;
178         if(use_paste) delete paste;
179
180         if(use_labels)
181         {       
182                 delete labelbutton;
183                 delete prevlabel;
184                 delete nextlabel;
185                 delete prevedit;
186                 delete nextedit;
187         }
188
189         if(use_fit) 
190         {
191                 delete fit;
192                 delete fit_autos;
193         }
194         if(use_undo)
195         {
196                 delete undo;
197                 delete redo;
198         }
199         
200         prevlabel = 0;
201         nextlabel = 0;
202         prevedit = 0; 
203         nextedit = 0;
204 }
205
206 int EditPanel::calculate_w(MWindow *mwindow, int use_keyframe, int total_buttons)
207 {
208         int result = 0;
209         int button_w = mwindow->theme->get_image_set("ibeam")[0]->get_w();
210         if(use_keyframe)
211         {
212                 result += button_w + mwindow->theme->toggle_margin;
213         }
214         
215         result += button_w * total_buttons;
216         return result;
217 }
218
219 int EditPanel::calculate_h(MWindow *mwindow)
220 {
221         return mwindow->theme->get_image_set("ibeam")[0]->get_h();
222 }
223
224 void EditPanel::create_buttons()
225 {
226         x1 = x, y1 = y;
227
228
229 SET_TRACE
230         if(use_editing_mode)
231         {
232                 subwindow->add_subwindow(arrow = new ArrowButton(mwindow, this, x1, y1));
233                 x1 += arrow->get_w();
234                 subwindow->add_subwindow(ibeam = new IBeamButton(mwindow, this, x1, y1));
235                 x1 += ibeam->get_w();
236         }
237
238         if(use_keyframe)
239         {
240                 subwindow->add_subwindow(keyframe = new KeyFrameButton(mwindow, this, x1, y1));
241                 x1 += keyframe->get_w();
242                 x1 += mwindow->theme->toggle_margin;
243         }
244
245 // Mandatory
246         subwindow->add_subwindow(inpoint = new EditInPoint(mwindow, this, x1, y1));
247         x1 += inpoint->get_w();
248         subwindow->add_subwindow(outpoint = new EditOutPoint(mwindow, this, x1, y1));
249         x1 += outpoint->get_w();
250         if(use_splice)
251         {
252                 subwindow->add_subwindow(splice = new EditSplice(mwindow, this, x1, y1));
253                 x1 += splice->get_w();
254         }
255         if(use_overwrite)
256         {
257                 subwindow->add_subwindow(overwrite = new EditOverwrite(mwindow, this, x1, y1));
258                 x1 += overwrite->get_w();
259         }
260         if(use_lift)
261         {
262                 subwindow->add_subwindow(lift = new EditLift(mwindow, this, x1, y1));
263                 x1 += lift->get_w();
264         }
265         if(use_extract)
266         {
267                 subwindow->add_subwindow(extract = new EditExtract(mwindow, this, x1, y1));
268                 x1 += extract->get_w();
269         }
270         if(use_toclip)
271         {
272                 subwindow->add_subwindow(clip = new EditToClip(mwindow, this, x1, y1));
273                 x1 += clip->get_w();
274         }
275         
276         if(use_cut)
277         {
278                 subwindow->add_subwindow(cut = new EditCut(mwindow, this, x1, y1));
279                 x1 += cut->get_w();
280         }
281         if(use_copy)
282         {
283                 subwindow->add_subwindow(copy = new EditCopy(mwindow, this, x1, y1));
284                 x1 += copy->get_w();
285         }
286         if(use_paste)
287         {
288                 subwindow->add_subwindow(paste = new EditPaste(mwindow, this, x1, y1));
289                 x1 += paste->get_w();
290         }
291         
292         if(use_meters)
293         {
294                 if(!meter_panel)
295                 {
296                         printf("EditPanel::create_objects: meter_panel == 0\n");
297                 }
298                 subwindow->add_subwindow(meters = new MeterShow(mwindow, meter_panel, x1, y1));
299                 x1 += meters->get_w();
300         }
301
302         if(use_labels)
303         {
304                 subwindow->add_subwindow(labelbutton = new EditLabelbutton(mwindow, 
305                         this, 
306                         x1, 
307                         y1));
308                 x1 += labelbutton->get_w();
309                 subwindow->add_subwindow(prevlabel = new EditPrevLabel(mwindow, 
310                         this, 
311                         x1, 
312                         y1,
313                         is_mwindow));
314                 x1 += prevlabel->get_w();
315                 subwindow->add_subwindow(nextlabel = new EditNextLabel(mwindow, 
316                         this, 
317                         x1, 
318                         y1,
319                         is_mwindow));
320                 x1 += nextlabel->get_w();
321         }
322
323 // all windows except VWindow since it's only implemented in MWindow.
324         if(use_cut)
325         {
326                 subwindow->add_subwindow(prevedit = new EditPrevEdit(mwindow, 
327                         this, 
328                         x1, 
329                         y1,
330                         is_mwindow));
331                 x1 += prevedit->get_w();
332                 subwindow->add_subwindow(nextedit = new EditNextEdit(mwindow, 
333                         this, 
334                         x1, 
335                         y1,
336                         is_mwindow));
337                 x1 += nextedit->get_w();
338         }
339
340         if(use_fit)
341         {
342                 subwindow->add_subwindow(fit = new EditFit(mwindow, this, x1, y1));
343                 x1 += fit->get_w();
344                 subwindow->add_subwindow(fit_autos = new EditFitAutos(mwindow, this, x1, y1));
345                 x1 += fit_autos->get_w();
346         }
347
348         if(use_undo)
349         {
350                 subwindow->add_subwindow(undo = new EditUndo(mwindow, this, x1, y1));
351                 x1 += undo->get_w();
352                 subwindow->add_subwindow(redo = new EditRedo(mwindow, this, x1, y1));
353                 x1 += redo->get_w();
354         }
355
356         if(use_commercial)
357         {
358                 subwindow->add_subwindow(commercial = new EditCommercial(mwindow, this, x1, y1));
359                 x1 += commercial->get_w();
360         }
361 SET_TRACE
362 }
363
364
365
366 void EditPanel::toggle_label()
367 {
368         mwindow->toggle_label(is_mwindow);
369 }
370
371 void EditPanel::prev_label()
372 {
373         int shift_down = subwindow->shift_down();
374         int have_mwindow_lock = mwindow->gui->get_window_lock();
375         int have_subwindow_lock =
376                  subwindow->get_top_level() == mwindow->gui->get_top_level() ?
377                          0 : subwindow->get_window_lock();
378         if(have_mwindow_lock)
379                 mwindow->gui->unlock_window();
380         if(have_subwindow_lock)
381                 subwindow->unlock_window();
382
383         mwindow->gui->mbuttons->transport->handle_transport(STOP, 1, 0, 0);
384
385         if(have_subwindow_lock)
386                 subwindow->lock_window("EditPanel::prev_label 1");
387
388         mwindow->gui->lock_window("EditPanel::prev_label 2");
389
390         mwindow->prev_label(shift_down);
391
392         if(!have_mwindow_lock)
393                 mwindow->gui->unlock_window();
394 }
395
396 void EditPanel::next_label()
397 {
398         int shift_down = subwindow->shift_down();
399         int have_mwindow_lock = mwindow->gui->get_window_lock();
400         int have_subwindow_lock =
401                  subwindow->get_top_level() == mwindow->gui->get_top_level() ?
402                          0 : subwindow->get_window_lock();
403         if(have_mwindow_lock)
404                 mwindow->gui->unlock_window();
405         if(have_subwindow_lock)
406                 subwindow->unlock_window();
407
408         mwindow->gui->mbuttons->transport->handle_transport(STOP, 1, 0, 0);
409
410         if(have_subwindow_lock)
411                 subwindow->lock_window("EditPanel::next_label 1");
412
413         mwindow->gui->lock_window("EditPanel::next_label 2");
414
415         mwindow->next_label(shift_down);
416
417         if(!have_mwindow_lock)
418                 mwindow->gui->unlock_window();
419 }
420
421
422
423 void EditPanel::prev_edit()
424 {
425         int shift_down = subwindow->shift_down();
426         int have_mwindow_lock = mwindow->gui->get_window_lock();
427         int have_subwindow_lock =
428                  subwindow->get_top_level() == mwindow->gui->get_top_level() ?
429                          0 : subwindow->get_window_lock();
430         if(have_mwindow_lock)
431                 mwindow->gui->unlock_window();
432         if(have_subwindow_lock)
433                 subwindow->unlock_window();
434
435         mwindow->gui->mbuttons->transport->handle_transport(STOP, 1, 0, 0);
436
437         if(have_subwindow_lock)
438                 subwindow->lock_window("EditPanel::prev_edit 1");
439
440         mwindow->gui->lock_window("EditPanel::prev_edit 2");
441
442         mwindow->prev_edit_handle(shift_down);
443
444         if(!have_mwindow_lock)
445                 mwindow->gui->unlock_window();
446 }
447
448 void EditPanel::next_edit()
449 {
450         int shift_down = subwindow->shift_down();
451         int have_mwindow_lock = mwindow->gui->get_window_lock();
452         int have_subwindow_lock =
453                  subwindow->get_top_level() == mwindow->gui->get_top_level() ?
454                          0 : subwindow->get_window_lock();
455         if(have_mwindow_lock)
456                 mwindow->gui->unlock_window();
457         if(have_subwindow_lock)
458                 subwindow->unlock_window();
459
460         mwindow->gui->mbuttons->transport->handle_transport(STOP, 1, 0, 0);
461
462         if(have_subwindow_lock)
463                 subwindow->lock_window("EditPanel::next_edit 1");
464
465         mwindow->gui->lock_window("EditPanel::next_edit 2");
466
467         mwindow->next_edit_handle(shift_down);
468
469         if(!have_mwindow_lock)
470                 mwindow->gui->unlock_window();
471 }
472
473
474
475
476
477
478
479 void EditPanel::reposition_buttons(int x, int y)
480 {
481         this->x = x; 
482         this->y = y;
483         x1 = x, y1 = y;
484
485         if(use_editing_mode)
486         {
487                 arrow->reposition_window(x1, y1);
488                 x1 += arrow->get_w();
489                 ibeam->reposition_window(x1, y1);
490                 x1 += ibeam->get_w();
491         }
492
493         if(use_keyframe)
494         {
495                 keyframe->reposition_window(x1, y1);
496                 x1 += keyframe->get_w();
497                 x1 += mwindow->theme->toggle_margin;
498         }
499
500         inpoint->reposition_window(x1, y1);
501         x1 += inpoint->get_w();
502         outpoint->reposition_window(x1, y1);
503         x1 += outpoint->get_w();
504         if(use_splice)
505         {
506                 splice->reposition_window(x1, y1);
507                 x1 += splice->get_w();
508         }
509         if(use_overwrite)
510         {
511                 overwrite->reposition_window(x1, y1);
512                 x1 += overwrite->get_w();
513         }
514         if(use_lift)
515         {
516                 lift->reposition_window(x1, y1);
517                 x1 += lift->get_w();
518         }
519         if(use_extract)
520         {
521                 extract->reposition_window(x1, y1);
522                 x1 += extract->get_w();
523         }
524         if(use_toclip)
525         {
526                 clip->reposition_window(x1, y1);
527                 x1 += clip->get_w();
528         }
529         if(use_cut)
530         {
531                 cut->reposition_window(x1, y1);
532                 x1 += cut->get_w();
533         }
534         if(use_copy)
535         {
536                 copy->reposition_window(x1, y1);
537                 x1 += copy->get_w();
538         }
539         if(use_paste)
540         {
541                 paste->reposition_window(x1, y1);
542                 x1 += paste->get_w();
543         }
544
545         if(use_meters)
546         {
547                 meters->reposition_window(x1, y1);
548                 x1 += meters->get_w();
549         }
550
551         if(use_labels)
552         {
553                 labelbutton->reposition_window(x1, y1);
554                 x1 += labelbutton->get_w();
555                 prevlabel->reposition_window(x1, y1);
556                 x1 += prevlabel->get_w();
557                 nextlabel->reposition_window(x1, y1);
558                 x1 += nextlabel->get_w();
559         }
560
561         if(prevedit) 
562         {
563                 prevedit->reposition_window(x1, y1);
564                 x1 += prevedit->get_w();
565         }
566         
567         if(nextedit)
568         {
569                 nextedit->reposition_window(x1, y1);
570                 x1 += nextedit->get_w();
571         }
572
573         if(use_fit)
574         {
575                 fit->reposition_window(x1, y1);
576                 x1 += fit->get_w();
577                 fit_autos->reposition_window(x1, y1);
578                 x1 += fit_autos->get_w();
579         }
580
581         if(use_undo)
582         {
583                 undo->reposition_window(x1, y1);
584                 x1 += undo->get_w();
585                 redo->reposition_window(x1, y1);
586                 x1 += redo->get_w();
587         }
588 }
589
590
591
592 void EditPanel::create_objects()
593 {
594         create_buttons();
595 }
596
597 int EditPanel::get_w()
598 {
599         return x1 - x;
600 }
601
602
603 void EditPanel::copy_selection()
604 {
605         mwindow->copy();
606 }
607
608 void EditPanel::splice_selection()
609 {
610 }
611
612 void EditPanel::overwrite_selection()
613 {
614 }
615
616 void EditPanel::set_inpoint()
617 {
618         mwindow->set_inpoint(1);
619 }
620
621 void EditPanel::set_outpoint()
622 {
623         mwindow->set_outpoint(1);
624 }
625
626 void EditPanel::clear_inpoint()
627 {
628         mwindow->delete_inpoint();
629 }
630
631 void EditPanel::clear_outpoint()
632 {
633         mwindow->delete_outpoint();
634 }
635
636 void EditPanel::to_clip()
637 {
638         subwindow->unlock_window();
639         mwindow->to_clip();
640         subwindow->lock_window("EditPanel::to_clip");
641 }
642
643
644 EditInPoint::EditInPoint(MWindow *mwindow, EditPanel *panel, int x, int y)
645  : BC_Button(x, y, mwindow->theme->get_image_set("inbutton"))
646 {
647         this->mwindow = mwindow;
648         this->panel = panel;
649         set_tooltip(_("In point ( [ )"));
650 }
651 EditInPoint::~EditInPoint()
652 {
653 }
654 int EditInPoint::handle_event()
655 {
656         panel->set_inpoint();
657         return 1;
658 }
659 int EditInPoint::keypress_event()
660 {
661         if(get_keypress() == '[') 
662         {
663                 panel->set_inpoint();
664                 return 1;
665         }
666         return 0;
667 }
668
669 EditOutPoint::EditOutPoint(MWindow *mwindow, EditPanel *panel, int x, int y)
670  : BC_Button(x, y, mwindow->theme->get_image_set("outbutton"))
671 {
672         this->mwindow = mwindow;
673         this->panel = panel;
674         set_tooltip(_("Out point ( ] )"));
675 }
676 EditOutPoint::~EditOutPoint()
677 {
678 }
679 int EditOutPoint::handle_event()
680 {
681         panel->set_outpoint();
682         return 1;
683 }
684 int EditOutPoint::keypress_event()
685 {
686         if(get_keypress() == ']') 
687         {
688                 panel->set_outpoint();
689                 return 1;
690         }
691         return 0;
692 }
693
694
695 EditNextLabel::EditNextLabel(MWindow *mwindow, 
696         EditPanel *panel, 
697         int x, 
698         int y,
699         int is_mwindow)
700  : BC_Button(x, y, mwindow->theme->get_image_set("nextlabel"))
701 {
702         this->mwindow = mwindow;
703         this->panel = panel;
704         this->is_mwindow = is_mwindow;
705         set_tooltip(_("Next label ( ctrl -> )"));
706 }
707 EditNextLabel::~EditNextLabel()
708 {
709 }
710 int EditNextLabel::keypress_event()
711 {
712         if(get_keypress() == RIGHT && ctrl_down())
713                 return handle_event();
714         return 0;
715 }
716 int EditNextLabel::handle_event()
717 {
718         panel->next_label();
719         return 1;
720 }
721
722 EditPrevLabel::EditPrevLabel(MWindow *mwindow, 
723         EditPanel *panel, 
724         int x, 
725         int y,
726         int is_mwindow)
727  : BC_Button(x, y, mwindow->theme->get_image_set("prevlabel"))
728 {
729         this->mwindow = mwindow;
730         this->panel = panel;
731         this->is_mwindow = is_mwindow;
732         set_tooltip(_("Previous label ( ctrl <- )"));
733 }
734 EditPrevLabel::~EditPrevLabel()
735 {
736 }
737 int EditPrevLabel::keypress_event()
738 {
739         if(get_keypress() == LEFT && ctrl_down())
740                 return handle_event();
741         return 0;
742 }
743 int EditPrevLabel::handle_event()
744 {
745         panel->prev_label();
746         return 1;
747 }
748
749
750
751 EditNextEdit::EditNextEdit(MWindow *mwindow, 
752         EditPanel *panel, 
753         int x, 
754         int y,
755         int is_mwindow)
756  : BC_Button(x, y, mwindow->theme->get_image_set("nextedit"))
757 {
758         this->mwindow = mwindow;
759         this->panel = panel;
760         this->is_mwindow = is_mwindow;
761         set_tooltip(_("Next edit ( alt -> )"));
762 }
763 EditNextEdit::~EditNextEdit()
764 {
765 }
766 int EditNextEdit::keypress_event()
767 {
768         if(get_keypress() == RIGHT && alt_down())
769                 return handle_event();
770         return 0;
771 }
772 int EditNextEdit::handle_event()
773 {
774         panel->next_edit();
775         return 1;
776 }
777
778 EditPrevEdit::EditPrevEdit(MWindow *mwindow, 
779         EditPanel *panel, 
780         int x, 
781         int y,
782         int is_mwindow)
783  : BC_Button(x, y, mwindow->theme->get_image_set("prevedit"))
784 {
785         this->mwindow = mwindow;
786         this->panel = panel;
787         this->is_mwindow = is_mwindow;
788         set_tooltip(_("Previous edit (alt <- )"));
789 }
790 EditPrevEdit::~EditPrevEdit()
791 {
792 }
793 int EditPrevEdit::keypress_event()
794 {
795         if(get_keypress() == LEFT && alt_down())
796                 return handle_event();
797         return 0;
798 }
799 int EditPrevEdit::handle_event()
800 {
801         panel->prev_edit();
802         return 1;
803 }
804
805
806
807 EditLift::EditLift(MWindow *mwindow, EditPanel *panel, int x, int y)
808  : BC_Button(x, y, mwindow->theme->lift_data)
809 {
810         this->mwindow = mwindow;
811         this->panel = panel;
812         set_tooltip(_("Lift"));
813 }
814 EditLift::~EditLift()
815 {
816 }
817 int EditLift::handle_event()
818 {
819         return 1;
820 }
821
822 EditOverwrite::EditOverwrite(MWindow *mwindow, EditPanel *panel, int x, int y)
823  : BC_Button(x, y, mwindow->theme->overwrite_data)
824 {
825         this->mwindow = mwindow;
826         this->panel = panel;
827         set_tooltip(_("Overwrite ( b )"));
828 }
829 EditOverwrite::~EditOverwrite()
830 {
831 }
832 int EditOverwrite::handle_event()
833 {
834         panel->overwrite_selection();
835         return 1;
836 }
837 int EditOverwrite::keypress_event()
838 {
839         if(get_keypress() == 'b')
840         {
841                 handle_event();
842                 return 1;
843         }
844         return 0;
845 }
846
847 EditExtract::EditExtract(MWindow *mwindow, EditPanel *panel, int x, int y)
848  : BC_Button(x, y, mwindow->theme->extract_data)
849 {
850         this->mwindow = mwindow;
851         this->panel = panel;
852         set_tooltip(_("Extract"));
853 }
854 EditExtract::~EditExtract()
855 {
856 }
857 int EditExtract::handle_event()
858 {
859 //      mwindow->extract_selection();
860         return 1;
861 }
862
863 EditToClip::EditToClip(MWindow *mwindow, EditPanel *panel, int x, int y)
864  : BC_Button(x, y, mwindow->theme->get_image_set("toclip"))
865 {
866         this->mwindow = mwindow;
867         this->panel = panel;
868         set_tooltip(_("To clip ( i )"));
869 }
870 EditToClip::~EditToClip()
871 {
872 }
873 int EditToClip::handle_event()
874 {
875         panel->to_clip();
876         return 1;
877 }
878
879 int EditToClip::keypress_event()
880 {
881         if(get_keypress() == 'i')
882         {
883                 handle_event();
884                 return 1;
885         }
886         return 0;
887 }
888
889 EditSplice::EditSplice(MWindow *mwindow, EditPanel *panel, int x, int y)
890  : BC_Button(x, y, mwindow->theme->splice_data)
891 {
892         this->mwindow = mwindow;
893         this->panel = panel;
894         set_tooltip(_("Splice ( v )"));
895 }
896 EditSplice::~EditSplice()
897 {
898 }
899 int EditSplice::handle_event()
900 {
901         panel->splice_selection();
902         return 1;
903 }
904 int EditSplice::keypress_event()
905 {
906         if(get_keypress() == 'v')
907         {
908                 handle_event();
909                 return 1;
910         }
911         return 0;
912 }
913
914 EditCut::EditCut(MWindow *mwindow, EditPanel *panel, int x, int y)
915  : BC_Button(x, y, mwindow->theme->get_image_set("cut"))
916 {
917         this->mwindow = mwindow;
918         this->panel = panel;
919         set_tooltip(_("Cut ( x )"));
920 }
921 EditCut::~EditCut()
922 {
923 }
924 int EditCut::keypress_event()
925 {
926         if(get_keypress() == 'x')
927                 return handle_event();
928         return 0;
929 }
930
931 int EditCut::handle_event()
932 {
933         int have_mwindow_lock = mwindow->gui->get_window_lock();
934         if(!have_mwindow_lock)
935                 mwindow->gui->lock_window("EditCut::handle_event");
936
937         mwindow->cut();
938
939         if(!have_mwindow_lock)
940                 mwindow->gui->unlock_window();
941         return 1;
942 }
943
944 EditCommercial::EditCommercial(MWindow *mwindow, EditPanel *panel, int x, int y)
945  : BC_Button(x, y, mwindow->theme->get_image_set("commercial"))
946 {
947         this->mwindow = mwindow;
948         this->panel = panel;
949         set_tooltip(_("Commercial ( shift X )"));
950 }
951 EditCommercial::~EditCommercial()
952 {
953 }
954 int EditCommercial::keypress_event()
955 {
956         if(get_keypress() == 'X')
957                 return handle_event();
958         return 0;
959 }
960
961 int EditCommercial::handle_event()
962 {
963         int have_mwindow_lock = mwindow->gui->get_window_lock();
964         if(have_mwindow_lock)
965                 mwindow->gui->unlock_window();
966         mwindow->commit_commercial();
967         if( !mwindow->put_commercial() ) {
968                 mwindow->gui->lock_window("EditCommercial::handle_event 1");
969                 mwindow->cut();
970                 if(!have_mwindow_lock)
971                         mwindow->gui->unlock_window();
972                 mwindow->activate_commercial();
973                 return 1;
974         }
975         mwindow->undo_commercial();
976         if(have_mwindow_lock)
977                 mwindow->gui->lock_window("EditCommercial::handle_event 2");
978         return 1;
979 }
980
981 EditCopy::EditCopy(MWindow *mwindow, EditPanel *panel, int x, int y)
982  : BC_Button(x, y, mwindow->theme->get_image_set("copy"))
983 {
984         this->mwindow = mwindow;
985         this->panel = panel;
986         set_tooltip(_("Copy ( c )"));
987 }
988 EditCopy::~EditCopy()
989 {
990 }
991
992 int EditCopy::keypress_event()
993 {
994         if(get_keypress() == 'c')
995                 return handle_event();
996         return 0;
997 }
998 int EditCopy::handle_event()
999 {
1000         panel->copy_selection();
1001         return 1;
1002 }
1003
1004 EditAppend::EditAppend(MWindow *mwindow, EditPanel *panel, int x, int y)
1005  : BC_Button(x, y, mwindow->theme->append_data)
1006 {
1007         this->mwindow = mwindow;
1008         this->panel = panel;
1009         set_tooltip(_("Append to end of track"));
1010 }
1011 EditAppend::~EditAppend()
1012 {
1013 }
1014
1015
1016 int EditAppend::handle_event()
1017 {
1018         return 1;
1019 }
1020
1021
1022 EditInsert::EditInsert(MWindow *mwindow, EditPanel *panel, int x, int y)
1023  : BC_Button(x, y, mwindow->theme->insert_data)
1024 {
1025         this->mwindow = mwindow;
1026         this->panel = panel;
1027         set_tooltip(_("Insert before beginning of track"));
1028 }
1029 EditInsert::~EditInsert()
1030 {
1031 }
1032
1033
1034 int EditInsert::handle_event()
1035 {
1036         
1037         return 1;
1038 }
1039
1040
1041 EditPaste::EditPaste(MWindow *mwindow, EditPanel *panel, int x, int y)
1042  : BC_Button(x, y, mwindow->theme->get_image_set("paste"))
1043 {
1044         this->mwindow = mwindow;
1045         this->panel = panel;
1046         set_tooltip(_("Paste ( v )"));
1047 }
1048 EditPaste::~EditPaste()
1049 {
1050 }
1051
1052 int EditPaste::keypress_event()
1053 {
1054         if(get_keypress() == 'v')
1055                 return handle_event();
1056         return 0;
1057 }
1058 int EditPaste::handle_event()
1059 {
1060         int have_mwindow_lock = mwindow->gui->get_window_lock();
1061         if(!have_mwindow_lock)
1062                 mwindow->gui->lock_window("EditPaste::handle_event");
1063
1064         mwindow->paste();
1065
1066         if(!have_mwindow_lock)
1067                 mwindow->gui->unlock_window();
1068         return 1;
1069 }
1070
1071
1072
1073 EditTransition::EditTransition(MWindow *mwindow, EditPanel *panel, int x, int y)
1074  : BC_Button(x, y, mwindow->theme->transition_data)
1075 {
1076         this->mwindow = mwindow;
1077         this->panel = panel;
1078         set_tooltip(_("Set transition"));
1079 }
1080 EditTransition::~EditTransition()
1081 {
1082 }
1083 int EditTransition::handle_event()
1084 {
1085         return 1;
1086 }
1087
1088 EditPresentation::EditPresentation(MWindow *mwindow, EditPanel *panel, int x, int y)
1089  : BC_Button(x, y, mwindow->theme->presentation_data)
1090 {
1091         this->mwindow = mwindow;
1092         this->panel = panel;
1093         set_tooltip(_("Set presentation up to current position"));
1094 }
1095 EditPresentation::~EditPresentation()
1096 {
1097 }
1098 int EditPresentation::handle_event()
1099 {
1100         return 1;
1101 }
1102
1103 EditUndo::EditUndo(MWindow *mwindow, EditPanel *panel, int x, int y)
1104  : BC_Button(x, y, mwindow->theme->get_image_set("undo"))
1105 {
1106         this->mwindow = mwindow;
1107         this->panel = panel;
1108         set_tooltip(_("Undo ( z )"));
1109 }
1110 EditUndo::~EditUndo()
1111 {
1112 }
1113 int EditUndo::keypress_event()
1114 {
1115         if(get_keypress() == 'z')
1116                 return handle_event();
1117         return 0;
1118 }
1119 int EditUndo::handle_event()
1120 {
1121         mwindow->undo_entry(panel->subwindow);
1122         return 1;
1123 }
1124
1125 EditRedo::EditRedo(MWindow *mwindow, EditPanel *panel, int x, int y)
1126  : BC_Button(x, y, mwindow->theme->get_image_set("redo"))
1127 {
1128         this->mwindow = mwindow;
1129         this->panel = panel;
1130         set_tooltip(_("Redo ( shift Z )"));
1131 }
1132 EditRedo::~EditRedo()
1133 {
1134 }
1135 int EditRedo::keypress_event()
1136 {
1137         if(get_keypress() == 'Z')
1138                 return handle_event();
1139         return 0;
1140 }
1141 int EditRedo::handle_event()
1142 {
1143         mwindow->redo_entry(panel->subwindow);
1144         return 1;
1145 };
1146
1147
1148
1149
1150
1151 EditLabelbutton::EditLabelbutton(MWindow *mwindow, EditPanel *panel, int x, int y)
1152  : BC_Button(x, y, mwindow->theme->get_image_set("labelbutton"))
1153 {
1154         this->mwindow = mwindow;
1155         this->panel = panel;
1156         set_tooltip(_("Toggle label at current position ( l )"));
1157 }
1158
1159 EditLabelbutton::~EditLabelbutton()
1160 {
1161 }
1162 int EditLabelbutton::keypress_event()
1163 {
1164         if(get_keypress() == 'l')
1165                 return handle_event();
1166         return 0;
1167 }
1168 int EditLabelbutton::handle_event()
1169 {
1170         panel->toggle_label();
1171         return 1;
1172 }
1173
1174
1175
1176
1177
1178
1179
1180 EditFit::EditFit(MWindow *mwindow, EditPanel *panel, int x, int y)
1181  : BC_Button(x, y, mwindow->theme->get_image_set("fit"))
1182 {
1183         this->mwindow = mwindow;
1184         this->panel = panel;
1185         set_tooltip(_("Fit selection to display ( f )"));
1186 }
1187 EditFit::~EditFit()
1188 {
1189 }
1190 int EditFit::keypress_event()
1191 {
1192         if(!alt_down() && get_keypress() == 'f') 
1193         {
1194                 handle_event();
1195                 return 1;
1196         }
1197         return 0;
1198 }
1199 int EditFit::handle_event()
1200 {
1201         mwindow->fit_selection();
1202         return 1;
1203 }
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213 EditFitAutos::EditFitAutos(MWindow *mwindow, EditPanel *panel, int x, int y)
1214  : BC_Button(x, y, mwindow->theme->get_image_set("fitautos"))
1215 {
1216         this->mwindow = mwindow;
1217         this->panel = panel;
1218         set_tooltip(_("Fit autos to display ( Alt + f )"));
1219 }
1220 EditFitAutos::~EditFitAutos()
1221 {
1222 }
1223 int EditFitAutos::keypress_event()
1224 {
1225         if(alt_down() && get_keypress() == 'f') 
1226         {
1227                 handle_event();
1228                 return 1;
1229         }
1230         return 0;
1231 }
1232 int EditFitAutos::handle_event()
1233 {
1234         mwindow->fit_autos();
1235         return 1;
1236 }
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250 ArrowButton::ArrowButton(MWindow *mwindow, EditPanel *panel, int x, int y)
1251  : BC_Toggle(x, 
1252         y, 
1253         mwindow->theme->get_image_set("arrow"),
1254         mwindow->edl->session->editing_mode == EDITING_ARROW,
1255         "",
1256         0,
1257         0,
1258         0)
1259 {
1260         this->mwindow = mwindow;
1261         this->panel = panel;
1262         set_tooltip(_("Drag and drop editing mode"));
1263 }
1264
1265 int ArrowButton::handle_event()
1266 {
1267         update(1);
1268         panel->ibeam->update(0);
1269         mwindow->set_editing_mode(EDITING_ARROW, 
1270                 !panel->is_mwindow, 
1271                 panel->is_mwindow);
1272 // Nothing after this
1273         return 1;
1274 }
1275
1276
1277 IBeamButton::IBeamButton(MWindow *mwindow, EditPanel *panel, int x, int y)
1278  : BC_Toggle(x, 
1279         y, 
1280         mwindow->theme->get_image_set("ibeam"),
1281         mwindow->edl->session->editing_mode == EDITING_IBEAM,
1282         "",
1283         0,
1284         0,
1285         0)
1286 {
1287         this->mwindow = mwindow;
1288         this->panel = panel;
1289         set_tooltip(_("Cut and paste editing mode"));
1290 }
1291
1292 int IBeamButton::handle_event()
1293 {
1294         update(1);
1295         panel->arrow->update(0);
1296         mwindow->set_editing_mode(EDITING_IBEAM, 
1297                 !panel->is_mwindow, 
1298                 panel->is_mwindow);
1299 // Nothing after this
1300         return 1;
1301 }
1302
1303 KeyFrameButton::KeyFrameButton(MWindow *mwindow, EditPanel *panel, int x, int y)
1304  : BC_Toggle(x, 
1305         y, 
1306         mwindow->theme->get_image_set("autokeyframe"),
1307         mwindow->edl->session->auto_keyframes,
1308         "",
1309         0,
1310         0,
1311         0)
1312 {
1313         this->mwindow = mwindow;
1314         this->panel = panel;
1315         set_tooltip(_("Generate keyframes while tweeking"));
1316 }
1317
1318 int KeyFrameButton::handle_event()
1319 {
1320         mwindow->set_auto_keyframes(get_value(), 
1321                 !panel->is_mwindow, 
1322                 panel->is_mwindow);
1323         return 1;
1324 }
1325
1326