void SpectralLibraryMatchResults::elementModified(Subject& subject, const std::string& signal, const boost::any& value)
{
   // check for rename
   RasterElement* pRaster = dynamic_cast<RasterElement*>(&subject);
   if (pRaster != NULL)
   {
      ResultsPage* pPage = getPage(pRaster);
      if (pPage != NULL)
      {
         int index = mpTabWidget->indexOf(pPage);
         if (index != -1 && mpTabWidget->tabToolTip(index).toStdString() != pRaster->getName())
         {
            mpTabWidget->setTabText(index, QString::fromStdString(pRaster->getDisplayName(true)));
            mpTabWidget->setTabToolTip(index, QString::fromStdString(pRaster->getName()));
         }
      }
   }
}
bool PropertiesRasterLayer::initialize(SessionItem* pSessionItem)
{
   mpRasterLayer = dynamic_cast<RasterLayer*>(pSessionItem);
   if (mpRasterLayer == NULL)
   {
      return false;
   }

   mInitializing = true;

   // Populate the raster element combos with raster elements of the same size as the layer element
   mRasterElements.clear();
   QStringList elementNames;

   RasterElement* pRasterElement = dynamic_cast<RasterElement*>(mpRasterLayer->getDataElement());
   if (pRasterElement != NULL)
   {
      const RasterDataDescriptor* pDescriptor =
         dynamic_cast<const RasterDataDescriptor*>(pRasterElement->getDataDescriptor());
      if (pDescriptor != NULL)
      {
         unsigned int rows = pDescriptor->getRowCount();
         unsigned int columns = pDescriptor->getColumnCount();

         Service<ModelServices> pModel;
         vector<DataElement*> rasterElements = pModel->getElements("RasterElement");

         for (unsigned int i = 0; i < rasterElements.size(); ++i)
         {
            RasterElement* pCurrentRasterElement = dynamic_cast<RasterElement*>(rasterElements[i]);
            if (pCurrentRasterElement != NULL)
            {
               unsigned int currentRows = 0;
               unsigned int currentColumns = 0;

               const RasterDataDescriptor* pCurrentDescriptor =
                  dynamic_cast<const RasterDataDescriptor*>(pCurrentRasterElement->getDataDescriptor());
               if (pCurrentDescriptor != NULL)
               {
                  currentRows = pCurrentDescriptor->getRowCount();
                  currentColumns = pCurrentDescriptor->getColumnCount();
               }

               if ((currentRows == rows) && (currentColumns == columns))
               {
                  mRasterElements.push_back(pCurrentRasterElement);

                  string displayName = pCurrentRasterElement->getDisplayName();
                  if (displayName.empty() == true)
                  {
                     displayName = pCurrentRasterElement->getName();
                  }

                  if (displayName.empty() == false)
                  {
                     elementNames.append(QString::fromStdString(displayName));
                  }
               }
            }
         }
      }
   }

   mpGrayElementCombo->clear();
   mpGrayElementCombo->addItems(elementNames);

   mpRedElementCombo->clear();
   mpRedElementCombo->addItems(elementNames);

   mpGreenElementCombo->clear();
   mpGreenElementCombo->addItems(elementNames);

   mpBlueElementCombo->clear();
   mpBlueElementCombo->addItems(elementNames);

   // Display configuration
   DisplayMode displayMode = mpRasterLayer->getDisplayMode();
   if (displayMode == GRAYSCALE_MODE)
   {
      mpDisplayModeCombo->setCurrentIndex(0);
   }
   else if (displayMode == RGB_MODE)
   {
      mpDisplayModeCombo->setCurrentIndex(1);
   }

   mpComplexComponentCombo->setCurrentValue(mpRasterLayer->getComplexComponent());
   mpOpacitySpin->setValue(static_cast<int>(mpRasterLayer->getAlpha()));

   // Grayscale
   int grayIndex = getElementIndex(mpRasterLayer->getDisplayedRasterElement(GRAY));
   mpGrayElementCombo->setCurrentIndex(grayIndex);

   double dGrayLower = 0.0;
   double dGrayUpper = 0.0;
   mpRasterLayer->getStretchValues(GRAY, dGrayLower, dGrayUpper);

   mpGrayLowerSpin->setValue(dGrayLower);
   mpGrayUpperSpin->setValue(dGrayUpper);
   mGrayUnits = mpRasterLayer->getStretchUnits(GRAY);
   mpGrayUnitsCombo->setCurrentValue(mGrayUnits);
   mpGrayStretchTypeCombo->setCurrentValue(mpRasterLayer->getStretchType(GRAYSCALE_MODE));

   // RGB
   int redIndex = getElementIndex(mpRasterLayer->getDisplayedRasterElement(RED));
   mpRedElementCombo->setCurrentIndex(redIndex);

   int greenIndex = getElementIndex(mpRasterLayer->getDisplayedRasterElement(GREEN));
   mpGreenElementCombo->setCurrentIndex(greenIndex);

   int blueIndex = getElementIndex(mpRasterLayer->getDisplayedRasterElement(BLUE));
   mpBlueElementCombo->setCurrentIndex(blueIndex);

   double dRedLower = 0.0;
   double dRedUpper = 0.0;
   double dGreenLower = 0.0;
   double dGreenUpper = 0.0;
   double dBlueLower = 0.0;
   double dBlueUpper = 0.0;
   mpRasterLayer->getStretchValues(RED, dRedLower, dRedUpper);
   mpRasterLayer->getStretchValues(GREEN, dGreenLower, dGreenUpper);
   mpRasterLayer->getStretchValues(BLUE, dBlueLower, dBlueUpper);

   mpRedLowerSpin->setValue(dRedLower);
   mpRedUpperSpin->setValue(dRedUpper);
   mpGreenLowerSpin->setValue(dGreenLower);
   mpGreenUpperSpin->setValue(dGreenUpper);
   mpBlueLowerSpin->setValue(dBlueLower);
   mpBlueUpperSpin->setValue(dBlueUpper);

   mRedUnits = mpRasterLayer->getStretchUnits(RED);
   mGreenUnits = mpRasterLayer->getStretchUnits(GREEN);
   mBlueUnits = mpRasterLayer->getStretchUnits(BLUE);
   mpRedUnitsCombo->setCurrentValue(mRedUnits);
   mpGreenUnitsCombo->setCurrentValue(mGreenUnits);
   mpBlueUnitsCombo->setCurrentValue(mBlueUnits);
   mpRgbStretchTypeCombo->setCurrentValue(mpRasterLayer->getStretchType(RGB_MODE));

   // Graphics acceleration
   mpAccelerationCheck->setChecked(mpRasterLayer->isGpuImageEnabled());
   mpFilterCheck->setEnabled(mpRasterLayer->isGpuImageEnabled());
   mpFilterList->setEnabled(false);
   mpFilterList->clearSelection();

   if (mpFilterCheck->isEnabled())
   {
      vector<string> filters = mpRasterLayer->getEnabledFilterNames();
      mpFilterCheck->setChecked(!(filters.empty()));
      mpFilterList->setEnabled(!(filters.empty()));

      for (vector<string>::iterator iter = filters.begin(); iter != filters.end(); ++iter)
      {
         QString filterName = QString::fromStdString(*iter);
         if (filterName.isEmpty() == false)
         {
            QList<QListWidgetItem*> filterItems = mpFilterList->findItems(filterName, Qt::MatchExactly);
            for (int i = 0; i < filterItems.count(); ++i)
            {
               QListWidgetItem* pItem = filterItems[i];
               if (pItem != NULL)
               {
                  pItem->setSelected(true);
               }
            }
         }
      }
   }

   resetModifiers();
   mInitializing = false;
   return true;
}