4 * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
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.
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.
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
23 #include "awindowgui.h"
24 #include "bcsignals.h"
26 #include "cplayback.h"
28 #include "cwindowgui.h"
29 #include "editpanel.h"
31 #include "edlsession.h"
35 #include "localsession.h"
36 #include "mainclock.h"
39 #include "meterpanel.h"
41 #include "mwindowgui.h"
42 #include "playbackengine.h"
45 #include "trackcanvas.h"
46 #include "transportque.h"
48 #include "manualgoto.h"
52 EditPanel::EditPanel(MWindow *mwindow,
53 BC_WindowBase *subwindow,
60 int use_splice, // Extra buttons
75 this->window_id = window_id;
76 this->editing_mode = editing_mode;
77 this->use_editing_mode = use_editing_mode;
78 this->use_keyframe = use_keyframe;
79 this->use_splice = use_splice;
80 this->use_overwrite = use_overwrite;
81 this->use_copy = use_copy;
82 this->use_paste = use_paste;
83 this->use_undo = use_undo;
84 this->mwindow = mwindow;
85 this->subwindow = subwindow;
86 this->use_fit = use_fit;
87 this->use_labels = use_labels;
88 this->use_locklabels = use_locklabels;
89 this->use_toclip = use_toclip;
90 this->use_meters = use_meters;
91 this->use_cut = use_cut;
92 this->use_commercial = use_commercial;
93 this->use_goto = use_goto;
94 this->use_clk2play = use_clk2play;
106 this->commercial = 0;
109 this->labelbutton = 0;
116 this->meter_panel = 0;
122 this->click2play = 0;
126 EditPanel::~EditPanel()
130 void EditPanel::set_meters(MeterPanel *meter_panel)
132 this->meter_panel = meter_panel;
136 void EditPanel::update()
138 int new_editing_mode = mwindow->edl->session->editing_mode;
139 if( arrow ) arrow->update(new_editing_mode == EDITING_ARROW);
140 if( ibeam ) ibeam->update(new_editing_mode == EDITING_IBEAM);
141 if( keyframe ) keyframe->update(mwindow->edl->session->auto_keyframes);
142 if( locklabels ) locklabels->set_value(mwindow->edl->session->labels_follow_edits);
144 int value = !is_vwindow() ?
145 mwindow->edl->session->cwindow_click2play :
146 mwindow->edl->session->vwindow_click2play ;
147 click2play->set_value(value);
151 meters->update(mwindow->edl->session->cwindow_meter);
152 mwindow->cwindow->gui->update_meters();
155 meters->update(mwindow->edl->session->vwindow_meter);
161 int EditPanel::calculate_w(MWindow *mwindow, int use_keyframe, int total_buttons)
164 int button_w = mwindow->theme->get_image_set("ibeam")[0]->get_w();
166 result += button_w + mwindow->theme->toggle_margin;
169 result += button_w * total_buttons;
173 int EditPanel::calculate_h(MWindow *mwindow)
175 return mwindow->theme->get_image_set("ibeam")[0]->get_h();
178 void EditPanel::create_buttons()
182 if( use_editing_mode ) {
183 arrow = new ArrowButton(mwindow, this, x1, y1);
184 subwindow->add_subwindow(arrow);
185 x1 += arrow->get_w();
186 ibeam = new IBeamButton(mwindow, this, x1, y1);
187 subwindow->add_subwindow(ibeam);
188 x1 += ibeam->get_w();
189 x1 += mwindow->theme->toggle_margin;
193 keyframe = new KeyFrameButton(mwindow, this, x1, y1);
194 subwindow->add_subwindow(keyframe);
195 x1 += keyframe->get_w();
198 if( use_locklabels ) {
199 locklabels = new LockLabelsButton(mwindow, this, x1, y1);
200 subwindow->add_subwindow(locklabels);
201 x1 += locklabels->get_w();
204 if( use_keyframe || use_locklabels )
205 x1 += mwindow->theme->toggle_margin;
208 inpoint = new EditInPoint(mwindow, this, x1, y1);
209 subwindow->add_subwindow(inpoint);
210 x1 += inpoint->get_w();
211 outpoint = new EditOutPoint(mwindow, this, x1, y1);
212 subwindow->add_subwindow(outpoint);
213 x1 += outpoint->get_w();
216 splice = new EditSplice(mwindow, this, x1, y1);
217 subwindow->add_subwindow(splice);
218 x1 += splice->get_w();
221 if( use_overwrite ) {
222 overwrite = new EditOverwrite(mwindow, this, x1, y1);
223 subwindow->add_subwindow(overwrite);
224 x1 += overwrite->get_w();
228 clip = new EditToClip(mwindow, this, x1, y1);
229 subwindow->add_subwindow(clip);
234 cut = new EditCut(mwindow, this, x1, y1);
235 subwindow->add_subwindow(cut);
240 copy = new EditCopy(mwindow, this, x1, y1);
241 subwindow->add_subwindow(copy);
246 paste = new EditPaste(mwindow, this, x1, y1);
247 subwindow->add_subwindow(paste);
248 x1 += paste->get_w();
253 meters = new MeterShow(mwindow, meter_panel, x1, y1);
254 subwindow->add_subwindow(meters);
255 x1 += meters->get_w();
258 printf("EditPanel::create_objects: meter_panel == 0\n");
262 labelbutton = new EditLabelbutton(mwindow, this, x1, y1);
263 subwindow->add_subwindow(labelbutton);
264 x1 += labelbutton->get_w();
265 prevlabel = new EditPrevLabel(mwindow, this, x1, y1);
266 subwindow->add_subwindow(prevlabel);
267 x1 += prevlabel->get_w();
268 nextlabel = new EditNextLabel(mwindow, this, x1, y1);
269 subwindow->add_subwindow(nextlabel);
270 x1 += nextlabel->get_w();
273 // all windows except VWindow since it's only implemented in MWindow.
275 prevedit = new EditPrevEdit(mwindow, this, x1, y1);
276 subwindow->add_subwindow(prevedit);
277 x1 += prevedit->get_w();
278 nextedit = new EditNextEdit(mwindow, this, x1, y1);
279 subwindow->add_subwindow(nextedit);
280 x1 += nextedit->get_w();
284 fit = new EditFit(mwindow, this, x1, y1);
285 subwindow->add_subwindow(fit);
287 fit_autos = new EditFitAutos(mwindow, this, x1, y1);
288 subwindow->add_subwindow(fit_autos);
289 x1 += fit_autos->get_w();
293 undo = new EditUndo(mwindow, this, x1, y1);
294 subwindow->add_subwindow(undo);
296 redo = new EditRedo(mwindow, this, x1, y1);
297 subwindow->add_subwindow(redo);
302 mangoto = new EditManualGoto(mwindow, this, x1, y1);
303 subwindow->add_subwindow(mangoto);
304 x1 += mangoto->get_w();
308 click2play = new EditClick2Play(mwindow, this, x1, y1+5);
309 subwindow->add_subwindow(click2play);
310 x1 += click2play->get_w();
313 if( use_commercial ) {
314 commercial = new EditCommercial(mwindow, this, x1, y1);
315 subwindow->add_subwindow(commercial);
316 x1 += commercial->get_w();
320 void EditPanel::reposition_buttons(int x, int y)
326 if( use_editing_mode ) {
327 arrow->reposition_window(x1, y1);
328 x1 += arrow->get_w();
329 ibeam->reposition_window(x1, y1);
330 x1 += ibeam->get_w();
331 x1 += mwindow->theme->toggle_margin;
335 keyframe->reposition_window(x1, y1);
336 x1 += keyframe->get_w();
339 if( use_locklabels ) {
340 locklabels->reposition_window(x1,y1);
341 x1 += locklabels->get_w();
344 if( use_keyframe || use_locklabels )
345 x1 += mwindow->theme->toggle_margin;
347 inpoint->reposition_window(x1, y1);
348 x1 += inpoint->get_w();
349 outpoint->reposition_window(x1, y1);
350 x1 += outpoint->get_w();
352 splice->reposition_window(x1, y1);
353 x1 += splice->get_w();
355 if( use_overwrite ) {
356 overwrite->reposition_window(x1, y1);
357 x1 += overwrite->get_w();
360 clip->reposition_window(x1, y1);
364 cut->reposition_window(x1, y1);
368 copy->reposition_window(x1, y1);
372 paste->reposition_window(x1, y1);
373 x1 += paste->get_w();
377 meters->reposition_window(x1, y1);
378 x1 += meters->get_w();
382 labelbutton->reposition_window(x1, y1);
383 x1 += labelbutton->get_w();
384 prevlabel->reposition_window(x1, y1);
385 x1 += prevlabel->get_w();
386 nextlabel->reposition_window(x1, y1);
387 x1 += nextlabel->get_w();
391 prevedit->reposition_window(x1, y1);
392 x1 += prevedit->get_w();
396 nextedit->reposition_window(x1, y1);
397 x1 += nextedit->get_w();
401 fit->reposition_window(x1, y1);
403 fit_autos->reposition_window(x1, y1);
404 x1 += fit_autos->get_w();
408 undo->reposition_window(x1, y1);
410 redo->reposition_window(x1, y1);
415 mangoto->reposition_window(x1, y1);
416 x1 += mangoto->get_w();
419 click2play->reposition_window(x1, y1+5);
420 x1 += click2play->get_w();
424 void EditPanel::create_objects()
429 int EditPanel::get_w()
435 EditLabelbutton::EditLabelbutton(MWindow *mwindow, EditPanel *panel, int x, int y)
436 : BC_Button(x, y, mwindow->theme->get_image_set("labelbutton"))
438 this->mwindow = mwindow;
440 set_tooltip(_("Toggle label at current position ( l )"));
443 EditLabelbutton::~EditLabelbutton()
446 int EditLabelbutton::keypress_event()
448 if( get_keypress() == 'l' && !alt_down() )
449 return handle_event();
452 int EditLabelbutton::handle_event()
454 panel->panel_toggle_label();
459 EditNextLabel::EditNextLabel(MWindow *mwindow,
460 EditPanel *panel, int x, int y)
461 : BC_Button(x, y, mwindow->theme->get_image_set("nextlabel"))
463 this->mwindow = mwindow;
465 set_tooltip(_("Next label ( ctrl -> )"));
467 EditNextLabel::~EditNextLabel()
470 int EditNextLabel::keypress_event()
473 int key = get_keypress();
474 if( (key == RIGHT || key == '.') && !alt_down() ) {
475 panel->panel_next_label(0);
478 if( key == '>' && alt_down() ) {
479 panel->panel_next_label(1);
485 int EditNextLabel::handle_event()
487 int cut = ctrl_down() && alt_down();
488 panel->panel_next_label(cut);
493 EditPrevLabel::EditPrevLabel(MWindow *mwindow,
494 EditPanel *panel, int x, int y)
495 : BC_Button(x, y, mwindow->theme->get_image_set("prevlabel"))
497 this->mwindow = mwindow;
499 set_tooltip(_("Previous label ( ctrl <- )"));
501 EditPrevLabel::~EditPrevLabel()
504 int EditPrevLabel::keypress_event()
507 int key = get_keypress();
508 if( (key == LEFT || key == ',') && !alt_down() ) {
509 panel->panel_prev_label(0);
512 if( key == '<' && alt_down() ) {
513 panel->panel_prev_label(1);
519 int EditPrevLabel::handle_event()
521 int cut = ctrl_down() && alt_down();
522 panel->panel_prev_label(cut);
527 EditPrevEdit::EditPrevEdit(MWindow *mwindow,
528 EditPanel *panel, int x, int y)
529 : BC_Button(x, y, mwindow->theme->get_image_set("prevedit"))
531 this->mwindow = mwindow;
533 set_tooltip(_("Previous edit (alt <- )"));
535 EditPrevEdit::~EditPrevEdit()
538 int EditPrevEdit::keypress_event()
541 int key = get_keypress();
542 if( (key == LEFT || key == ',') && !ctrl_down() ) {
543 panel->panel_prev_edit(0);
546 if( key == ',' && ctrl_down() ) {
547 panel->panel_prev_edit(1);
553 int EditPrevEdit::handle_event()
555 int cut = ctrl_down() && alt_down();
556 panel->panel_prev_edit(cut);
561 EditNextEdit::EditNextEdit(MWindow *mwindow,
562 EditPanel *panel, int x, int y)
563 : BC_Button(x, y, mwindow->theme->get_image_set("nextedit"))
565 this->mwindow = mwindow;
567 set_tooltip(_("Next edit ( alt -> )"));
569 EditNextEdit::~EditNextEdit()
572 int EditNextEdit::keypress_event()
575 int key = get_keypress();
576 if( (key == RIGHT || key == '.') && !ctrl_down() ) {
577 panel->panel_next_edit(0);
580 if( key == '.' && ctrl_down() ) {
581 panel->panel_next_edit(1);
587 int EditNextEdit::handle_event()
589 int cut = ctrl_down() && alt_down();
590 panel->panel_next_edit(cut);
595 EditCopy::EditCopy(MWindow *mwindow, EditPanel *panel, int x, int y)
596 : BC_Button(x, y, mwindow->theme->get_image_set("copy"))
598 this->mwindow = mwindow;
600 set_tooltip(_("Copy ( c )"));
602 EditCopy::~EditCopy()
606 int EditCopy::keypress_event()
608 if( alt_down() ) return 0;
609 if( (get_keypress() == 'c' && !ctrl_down()) ||
610 (panel->is_vwindow() && get_keypress() == 'C') ) {
611 return handle_event();
615 int EditCopy::handle_event()
617 panel->panel_copy_selection();
621 //overwrite_selection
622 EditOverwrite::EditOverwrite(MWindow *mwindow, EditPanel *panel, int x, int y)
623 : BC_Button(x, y, mwindow->theme->overwrite_data)
625 this->mwindow = mwindow;
627 set_tooltip(_("Overwrite ( b )"));
629 EditOverwrite::~EditOverwrite()
632 int EditOverwrite::handle_event()
634 panel->panel_overwrite_selection();
637 int EditOverwrite::keypress_event()
639 if( alt_down() ) return 0;
640 if( get_keypress() == 'b' ||
641 (panel->is_vwindow() && get_keypress() == 'B') ) {
650 EditInPoint::EditInPoint(MWindow *mwindow, EditPanel *panel, int x, int y)
651 : BC_Button(x, y, mwindow->theme->get_image_set("inbutton"))
653 this->mwindow = mwindow;
655 set_tooltip(_("In point ( [ or < )"));
657 EditInPoint::~EditInPoint()
660 int EditInPoint::handle_event()
662 panel->panel_set_inpoint();
665 int EditInPoint::keypress_event()
667 int key = get_keypress();
670 panel->panel_unset_inoutpoint();
674 else if( !alt_down() ) {
675 if( key == '[' || key == '<' ) {
676 panel->panel_set_inpoint();
685 EditOutPoint::EditOutPoint(MWindow *mwindow, EditPanel *panel, int x, int y)
686 : BC_Button(x, y, mwindow->theme->get_image_set("outbutton"))
688 this->mwindow = mwindow;
690 set_tooltip(_("Out point ( ] or > )"));
692 EditOutPoint::~EditOutPoint()
695 int EditOutPoint::handle_event()
697 panel->panel_set_outpoint();
700 int EditOutPoint::keypress_event()
702 int key = get_keypress();
705 panel->panel_unset_inoutpoint();
709 else if( !alt_down() ) {
710 if( key == ']' || key == '>' ) {
711 panel->panel_set_outpoint();
719 EditSplice::EditSplice(MWindow *mwindow, EditPanel *panel, int x, int y)
720 : BC_Button(x, y, mwindow->theme->splice_data)
722 this->mwindow = mwindow;
724 set_tooltip(_("Splice ( v )"));
726 EditSplice::~EditSplice()
729 int EditSplice::handle_event()
731 panel->panel_splice_selection();
734 int EditSplice::keypress_event()
736 if( alt_down() ) return 0;
737 if( (get_keypress() == 'v' && !ctrl_down()) ||
738 (panel->is_vwindow() && get_keypress() == 'V') ) {
746 EditToClip::EditToClip(MWindow *mwindow, EditPanel *panel, int x, int y)
747 : BC_Button(x, y, mwindow->theme->get_image_set("toclip"))
749 this->mwindow = mwindow;
751 set_tooltip(_("To clip ( i )"));
753 EditToClip::~EditToClip()
756 int EditToClip::handle_event()
758 panel->panel_to_clip();
762 int EditToClip::keypress_event()
764 if( alt_down() ) return 0;
765 if( get_keypress() == 'i' ||
766 (panel->is_vwindow() && get_keypress() == 'I') ) {
774 EditCut::EditCut(MWindow *mwindow, EditPanel *panel, int x, int y)
775 : BC_Button(x, y, mwindow->theme->get_image_set("cut"))
777 this->mwindow = mwindow;
779 set_tooltip(_("Split | Cut ( x )"));
784 int EditCut::keypress_event()
786 if( ctrl_down() || shift_down() || alt_down() )
788 if( get_keypress() == 'x' )
789 return handle_event();
793 int EditCut::handle_event()
800 EditPaste::EditPaste(MWindow *mwindow, EditPanel *panel, int x, int y)
801 : BC_Button(x, y, mwindow->theme->get_image_set("paste"))
803 this->mwindow = mwindow;
805 set_tooltip(_("Paste ( v )"));
807 EditPaste::~EditPaste()
811 int EditPaste::keypress_event()
813 if( get_keypress() == 'v' && !ctrl_down() )
814 return handle_event();
817 int EditPaste::handle_event()
819 panel->panel_paste();
824 EditFit::EditFit(MWindow *mwindow, EditPanel *panel, int x, int y)
825 : BC_Button(x, y, mwindow->theme->get_image_set("fit"))
827 this->mwindow = mwindow;
829 set_tooltip(_("Fit selection to display ( f )"));
834 int EditFit::keypress_event()
836 if( !alt_down() && get_keypress() == 'f' ) {
842 int EditFit::handle_event()
844 panel->panel_fit_selection();
849 EditFitAutos::EditFitAutos(MWindow *mwindow, EditPanel *panel, int x, int y)
850 : BC_Button(x, y, mwindow->theme->get_image_set("fitautos"))
852 this->mwindow = mwindow;
854 set_tooltip(_("Fit all autos to display ( Alt + f )"));
856 EditFitAutos::~EditFitAutos()
859 int EditFitAutos::keypress_event()
861 if( get_keypress() == 'f' && alt_down() ) {
862 panel->panel_fit_autos(!ctrl_down() ? 1 : 0);
867 int EditFitAutos::handle_event()
869 panel->panel_fit_autos(1);
874 ArrowButton::ArrowButton(MWindow *mwindow, EditPanel *panel, int x, int y)
876 mwindow->theme->get_image_set("arrow"),
877 mwindow->edl->session->editing_mode == EDITING_ARROW,
880 this->mwindow = mwindow;
882 set_tooltip(_("Drag and drop editing mode"));
885 int ArrowButton::handle_event()
888 panel->ibeam->update(0);
889 panel->panel_set_editing_mode(EDITING_ARROW);
890 // Nothing after this
894 IBeamButton::IBeamButton(MWindow *mwindow, EditPanel *panel, int x, int y)
896 mwindow->theme->get_image_set("ibeam"),
897 mwindow->edl->session->editing_mode == EDITING_IBEAM,
900 this->mwindow = mwindow;
902 set_tooltip(_("Cut and paste editing mode"));
905 int IBeamButton::handle_event()
908 panel->arrow->update(0);
909 panel->panel_set_editing_mode(EDITING_IBEAM);
910 // Nothing after this
915 KeyFrameButton::KeyFrameButton(MWindow *mwindow, EditPanel *panel, int x, int y)
917 mwindow->theme->get_image_set("autokeyframe"),
918 mwindow->edl->session->auto_keyframes,
921 this->mwindow = mwindow;
923 set_tooltip(_("Generate keyframes while tweeking (j)"));
926 int KeyFrameButton::handle_event()
928 panel->panel_set_auto_keyframes(get_value());
932 int KeyFrameButton::keypress_event()
934 int key = get_keypress();
935 if( key == 'j' && !ctrl_down() && !shift_down() && !alt_down() ) {
936 int value = get_value() ? 0 : 1;
938 panel->panel_set_auto_keyframes(value);
944 //set_labels_follow_edits
945 LockLabelsButton::LockLabelsButton(MWindow *mwindow, EditPanel *panel, int x, int y)
947 mwindow->theme->get_image_set("locklabels"),
948 mwindow->edl->session->labels_follow_edits,
951 this->mwindow = mwindow;
953 set_tooltip(_("Lock labels from moving with edits"));
956 int LockLabelsButton::handle_event()
958 panel->panel_set_labels_follow_edits(get_value());
964 EditManualGoto::EditManualGoto(MWindow *mwindow, EditPanel *panel, int x, int y)
965 : BC_Button(x, y, mwindow->theme->get_image_set("goto"))
967 this->mwindow = mwindow;
969 mangoto = new ManualGoto(mwindow, panel);
970 set_tooltip(_("Manual goto ( g )"));
972 EditManualGoto::~EditManualGoto()
976 int EditManualGoto::handle_event()
982 int EditManualGoto::keypress_event()
984 if( get_keypress() == 'g' ) {
992 EditClick2Play::EditClick2Play(MWindow *mwindow, EditPanel *panel, int x, int y)
993 : BC_Toggle(x, y, mwindow->theme->get_image_set("playpatch_data"),
994 !panel->is_vwindow() ?
995 mwindow->edl->session->cwindow_click2play :
996 mwindow->edl->session->vwindow_click2play)
998 this->mwindow = mwindow;
1000 set_tooltip(_("Click to play (p)"));
1002 int EditClick2Play::handle_event()
1004 int value = get_value();
1005 panel->set_click_to_play(value);
1008 int EditClick2Play::keypress_event()
1010 int key = get_keypress();
1011 if( key == 'p' && !ctrl_down() && !shift_down() && !alt_down() ) {
1012 int value = get_value() ? 0 : 1;
1014 panel->set_click_to_play(value);
1021 EditCommercial::EditCommercial(MWindow *mwindow, EditPanel *panel, int x, int y)
1022 : BC_Button(x, y, mwindow->theme->get_image_set("commercial"))
1024 this->mwindow = mwindow;
1025 this->panel = panel;
1026 set_tooltip(_("Commercial ( shift A )"));
1028 EditCommercial::~EditCommercial()
1031 int EditCommercial::keypress_event()
1033 if( ctrl_down() || !shift_down() || alt_down() )
1035 if( get_keypress() == 'A' )
1036 return handle_event();
1040 int EditCommercial::handle_event()
1042 int have_mwindow_lock = mwindow->gui->get_window_lock();
1043 if( have_mwindow_lock )
1044 mwindow->gui->unlock_window();
1045 mwindow->commit_commercial();
1046 if( !mwindow->put_commercial() ) {
1047 mwindow->gui->lock_window("EditCommercial::handle_event 1");
1049 if( !have_mwindow_lock )
1050 mwindow->gui->unlock_window();
1051 mwindow->activate_commercial();
1054 mwindow->undo_commercial();
1055 if( have_mwindow_lock )
1056 mwindow->gui->lock_window("EditCommercial::handle_event 2");
1061 EditUndo::EditUndo(MWindow *mwindow, EditPanel *panel, int x, int y)
1062 : BC_Button(x, y, mwindow->theme->get_image_set("undo"))
1064 this->mwindow = mwindow;
1065 this->panel = panel;
1066 set_tooltip(_("Undo ( z )"));
1068 EditUndo::~EditUndo()
1071 int EditUndo::keypress_event()
1073 if( ctrl_down() || shift_down() || alt_down() )
1075 if( get_keypress() == 'z' )
1076 return handle_event();
1079 int EditUndo::handle_event()
1081 mwindow->undo_entry(panel->subwindow);
1085 EditRedo::EditRedo(MWindow *mwindow, EditPanel *panel, int x, int y)
1086 : BC_Button(x, y, mwindow->theme->get_image_set("redo"))
1088 this->mwindow = mwindow;
1089 this->panel = panel;
1090 set_tooltip(_("Redo ( shift Z )"));
1092 EditRedo::~EditRedo()
1095 int EditRedo::keypress_event()
1097 if( ctrl_down() || !shift_down() || alt_down() )
1099 if( get_keypress() == 'Z' )
1100 return handle_event();
1103 int EditRedo::handle_event()
1105 mwindow->redo_entry(panel->subwindow);