text: /**********************************************************************
  
     Audacity - A Digital Audio Editor
     Copyright 1999-2018 Audacity Team
     License: wxwidgets
  
     James Crook
  
  ******************************************************************//**
  
  \file SetLabelCommand.cpp
  \brief Definitions for SetLabelCommand
  
  \class SetLabelCommand
  \brief Command that sets label information
  
  *//*******************************************************************/
  
  #include "../Audacity.h"
  #include "SetLabelCommand.h"
  #include "../Project.h"
  #include "../Track.h"
  #include "../TrackPanel.h"
  #include "../WaveTrack.h"
  #include "../LabelTrack.h"
  #include "../ShuttleGui.h"
  #include "CommandContext.h"
  
  SetLabelCommand::SetLabelCommand()
  {
  }
  
  
  bool SetLabelCommand::DefineParams( ShuttleParams & S ){ 
     S.Define(    mLabelIndex,                            wxT("Label"), 0, 0, 100 );
     S.OptionalY( bHasText       ).Define(  mText,        wxT("Text"),       wxT("empty") );
     S.OptionalY( bHasT0         ).Define(  mT0,          wxT("Start"),      0.0, 0.0, 100000.0);
     S.OptionalY( bHasT1         ).Define(  mT1,          wxT("End"),        0.0, 0.0, 100000.0);
     S.OptionalN( bHasSelected   ).Define(  mbSelected,   wxT("Selected"),   false );
     return true;
  };
  
  void SetLabelCommand::PopulateOrExchange(ShuttleGui & S)
  {
     S.AddSpace(0, 5);
  
     S.StartMultiColumn(2, wxALIGN_CENTER);
     {
        S.TieNumericTextBox( _("Label Index"), mLabelIndex );
     }
     S.EndMultiColumn();
     S.StartMultiColumn(3, wxALIGN_CENTER);
     {
        S.Optional( bHasText      ).TieTextBox(         _("Text:"),     mText );
        S.Optional( bHasT0        ).TieNumericTextBox(  _("Start:"),    mT0 );
        S.Optional( bHasT1        ).TieNumericTextBox(  _("End:"),      mT1 );
        S.Optional( bHasSelected  ).TieCheckBox(        _("Selected:"), mbSelected );
     }
     S.EndMultiColumn();
  }
  
  bool SetLabelCommand::Apply(const CommandContext & context)
  {
     // \todo we have similar code for finding the nth Label, Clip, Track etc.
     // this code could be put in subroutines/reduced.
  
     //wxString mode = GetString(wxT("Type"));
     AudacityProject * p = context.GetProject();
     TrackList *tracks = context.GetProject()->GetTracks();
     TrackListIterator iter(tracks);
     Track *t = iter.First();
     LabelStruct * pLabel = NULL;
     int i=0;
     int nn=0;
  
     LabelTrack *labelTrack = nullptr;
     while (t && i<=mLabelIndex) {
        if (t->GetKind() == Track::Label) {
           labelTrack = static_cast<LabelTrack*>(t);
           if( labelTrack )
           {
              for (nn = 0; 
                 (nn< (int)labelTrack->mLabels.size()) && i<=mLabelIndex; 
                 nn++) {
                 i++;
                 pLabel = &labelTrack->mLabels[nn];
              }
           }
        }
        t = iter.Next();
     }
  
     if ( (i< mLabelIndex) || (pLabel == NULL))
     {
        context.Error(wxT("LabelIndex was invalid."));
        return false;
     }
     if( bHasText )
        pLabel->title = mText;
     if( bHasT0 )
        pLabel->selectedRegion.setT0(mT0, false);
     if( bHasT1 )
        pLabel->selectedRegion.setT1(mT1, false);
     if( bHasT0 || bHasT1 )
        pLabel->selectedRegion.ensureOrdering();
     pLabel->updated = true;
  
     // Only one label can be selected.
     if( bHasSelected ){
        if( mbSelected )
        {
           labelTrack->mSelIndex = nn-1;
           double t0 = pLabel->selectedRegion.t0();
           double t1 = pLabel->selectedRegion.t1();
           p->mViewInfo.selectedRegion.setTimes( t0, t1);
        }
        else if( labelTrack->mSelIndex == (nn-1) )
           labelTrack->mSelIndex = -1;
     }
  
     return true;
  }
  