void VideoRegionsConfigDialog::apply()
{
  // FIXME: Bad code

  
  AutoLock al(m_config);

  //
  // Clear old video classes names container
  //

  StringVector *videoClasses = m_config->getVideoClassNames();
  videoClasses->clear();
  std::vector<Rect> *videoRects = m_config->getVideoRects();
  videoRects->clear();

  //
  // Split text from text area to string array
  //
  
  StringStorage classNames;
  m_videoClasses.getText(&classNames);
  size_t count = 0;
  TCHAR delimiters[] = _T(" \n\r\t,;");

  classNames.split(delimiters, NULL, &count);
  if (count != 0) {
    std::vector<StringStorage> chunks(count);
    classNames.split(delimiters, &chunks.front(), &count);

    for (size_t i = 0; i < count; i++) {
      if (!chunks[i].isEmpty()) {
          videoClasses->push_back(chunks[i].getString());
      }
    }
  }

  StringStorage videoRectsStringStorage;
  m_videoRects.getText(&videoRectsStringStorage);
  count = 0;

  videoRectsStringStorage.split(delimiters, NULL, &count);
  if (count != 0) {
    std::vector<StringStorage> chunks(count);
    videoRectsStringStorage.split(delimiters, &chunks.front(), &count);

    for (size_t i = 0; i < count; i++) {
      if (!chunks[i].isEmpty()) {
        try {
          videoRects->push_back(RectSerializer::toRect(&chunks[i]));
        } catch (...) {
          // Ignore wrong formatted strings
        }
      }
    }
  }

  //
  // TODO: Create parseUInt method
  //

  StringStorage vriss;

  m_videoRecognitionInterval.getText(&vriss);

  int interval;
  StringParser::parseInt(vriss.getString(), &interval);
  m_config->setVideoRecognitionInterval((unsigned int)interval);
}