+ _video_frame_rate->Bind (wxEVT_TEXT, boost::bind (&TimingPanel::video_frame_rate_changed, this));
+ _set_video_frame_rate->Bind (wxEVT_BUTTON, boost::bind (&TimingPanel::set_video_frame_rate, this));
+
+ shared_ptr<FilmViewer> fv = _viewer.lock ();
+ DCPOMATIC_ASSERT (fv);
+ fv->ImageChanged.connect (boost::bind (&TimingPanel::setup_sensitivity, this));
+
+ setup_sensitivity ();
+ add_to_grid ();
+}
+
+void
+TimingPanel::add_to_grid ()
+{
+ bool const full = Config::instance()->interface_complexity() == Config::INTERFACE_FULL;
+
+ int r = 0;
+
+ wxSizer* labels = new wxBoxSizer (wxHORIZONTAL);
+ labels->Add (_h_label, 1, wxEXPAND);
+ add_label_to_sizer (labels, _colon[0], false);
+ labels->Add (_m_label, 1, wxEXPAND);
+ add_label_to_sizer (labels, _colon[1], false);
+ labels->Add (_s_label, 1, wxEXPAND);
+ add_label_to_sizer (labels, _colon[2], false);
+ labels->Add (_f_label, 1, wxEXPAND);
+ _grid->Add (labels, wxGBPosition(r, 1));
+ ++r;
+
+ add_label_to_sizer (_grid, _position_label, true, wxGBPosition(r, 0));
+ _grid->Add (_position, wxGBPosition(r, 1));
+ ++r;
+
+ _move_to_start_of_reel->Show (full);
+ _full_length_label->Show (full);
+ _full_length->Show (full);
+ _play_length_label->Show (full);
+ _play_length->Show (full);
+ _video_frame_rate_label->Show (full);
+ _video_frame_rate->Show (full);
+ _set_video_frame_rate->Show (full);
+ _tip->Show (full);
+
+ if (full) {
+ _grid->Add (_move_to_start_of_reel, wxGBPosition(r, 1));
+ ++r;
+
+ add_label_to_sizer (_grid, _full_length_label, true, wxGBPosition(r, 0));
+ _grid->Add (_full_length, wxGBPosition(r, 1));
+ ++r;
+ }
+
+ add_label_to_sizer (_grid, _trim_start_label, true, wxGBPosition(r, 0));
+ _grid->Add (_trim_start, wxGBPosition(r, 1));
+ ++r;
+
+ _grid->Add (_trim_start_to_playhead, wxGBPosition(r, 1));
+ ++r;
+
+ add_label_to_sizer (_grid, _trim_end_label, true, wxGBPosition(r, 0));
+ _grid->Add (_trim_end, wxGBPosition(r, 1));
+ ++r;
+
+ _grid->Add (_trim_end_to_playhead, wxGBPosition(r, 1));
+ ++r;
+
+ if (full) {
+ add_label_to_sizer (_grid, _play_length_label, true, wxGBPosition(r, 0));
+ _grid->Add (_play_length, wxGBPosition(r, 1));
+ ++r;
+
+ {
+ add_label_to_sizer (_grid, _video_frame_rate_label, true, wxGBPosition(r, 0));
+ wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL);
+ s->Add (_video_frame_rate, 1, wxEXPAND);
+ s->Add (_set_video_frame_rate, 0, wxLEFT | wxRIGHT, 8);
+ _grid->Add (s, wxGBPosition(r, 1), wxGBSpan(1, 2));
+ }
+ ++r;
+
+ _grid->Add (_tip, wxGBPosition(r, 1), wxGBSpan(1, 2));
+ }
+
+ /* Completely speculative fix for #891 */
+ _grid->Layout ();
+}
+
+void
+TimingPanel::update_full_length ()
+{
+ set<DCPTime> check;
+ BOOST_FOREACH (shared_ptr<const Content> i, _parent->selected ()) {
+ check.insert (i->full_length(_parent->film()));
+ }
+
+ if (check.size() == 1) {
+ _full_length->set (_parent->selected().front()->full_length(_parent->film()), _parent->film()->video_frame_rate());
+ } else {
+ _full_length->clear ();
+ }
+}
+
+void
+TimingPanel::update_play_length ()
+{
+ set<DCPTime> check;
+ BOOST_FOREACH (shared_ptr<const Content> i, _parent->selected ()) {
+ check.insert (i->length_after_trim(_parent->film()));
+ }
+
+ if (check.size() == 1) {
+ _play_length->set (_parent->selected().front()->length_after_trim(_parent->film()), _parent->film()->video_frame_rate());
+ } else {
+ _play_length->clear ();
+ }