void MidiInstrumentMapper::RemoveAllMaps() {
     midiMapsMutex.Lock();
     midiMaps.clear();
     SetDefaultMap(-1);
     fireMidiInstrumentMapCountChanged(Maps().size());
     midiMapsMutex.Unlock();
 }
 int MidiInstrumentMapper::AddMap(String MapName) throw (Exception) {
     int ID;
     midiMapsMutex.Lock();
     if (midiMaps.empty()) ID = 0;
     else {
         // get the highest existing map ID
         uint lastIndex = (--(midiMaps.end()))->first;
         // check if we reached the index limit
         if (lastIndex + 1 < lastIndex) {
             // search for an unoccupied map ID starting from 0
             for (uint i = 0; i < lastIndex; i++) {
                 if (midiMaps.find(i) != midiMaps.end()) continue;
                 // we found an unused ID, so insert the new map there
                 ID = i;
                 goto __create_map;
             }
             throw Exception("Internal error: could not find unoccupied MIDI instrument map ID.");
         }
         ID = lastIndex + 1;
     }
     __create_map:
     midiMaps[ID].name = MapName;
     
     fireMidiInstrumentMapCountChanged(Maps().size());
     // If there were no maps until now we must set a default map.
     if (midiMaps.size() == 1) SetDefaultMap(ID);
     midiMapsMutex.Unlock();
     
     return ID;
 }
int main( int argc, char **argv )
{
  QApplication app(argc,argv);

  qt4plot Plot;

  std::vector< scigraphics::graphMV* > Maps( 12, (scigraphics::graphMV*)NULL );

  Maps[0] = Plot.createGraph<scigraphics::graphMV>( "gray" );
  Maps[1] = Plot.createGraph<scigraphics::graphMV>( "color1" );
  Maps[2] = Plot.createGraph<scigraphics::graphMV>( "color2" );

  Maps[0]->getView().setColorStrategy( new scigraphics::map::graphViewRectangle::grayscalePointColorStrategy() );
  Maps[1]->getView().setColorStrategy( new scigraphics::map::graphViewRectangle::redYellowBluePointColorStrategy() );
  Maps[2]->getView().setColorStrategy( new scigraphics::map::graphViewRectangle::yellowRedBluePointColorStrategy() );
 
  const size_t SizeX = 20*8, SizeY = 20*8;
  for ( unsigned i = 0; i < Maps.size(); ++i )
  {
    if ( Maps[i] == NULL )
      continue;
    Maps[i]->resize( SizeX, SizeY );
    Maps[i]->setIntervalX( -3, 2 );
    Maps[i]->setIntervalY( -5, 3 );
  }

  for ( unsigned ix = 0; ix < SizeX; ix++ )
  {
    for ( unsigned iy = 0; iy < SizeY; iy++ ) 
    {
      scigraphics::graphMV *Map = Maps[ ix > iy && SizeX-ix > iy ? 0 : 
                                            ix < iy && SizeX-ix < iy ? 1 : 2 ];
      if ( Map == NULL )
        continue;
      double x = Map->coordinateX(ix);
      double y = Map->coordinateY(iy);
      double Value = std::sin(x*y);
      if ( ix == SizeX/4 )
        Value = 1;
      Map->set( ix, iy, Value );
      //std::cout << "Set: " << ix << " " << iy << " -> ( " << x << " " << y << " ) -> " << Sqr->at( ix, iy ) << std::endl;
    }
  }

  qt4plotSettings Settings;
  Settings.addSettingWidget( new qt4plotSettingsSelections(&Settings) );
  //Settings.replaceLayout( new QVBoxLayout() );
  Settings.connectToPlot(&Plot);
  Settings.show();
 

  Plot.move( 200, 200 );
  Plot.resize( 700, 800 );
  Plot.show();
  Plot.replot();

  return app.exec();
}
 void MidiInstrumentMapper::RemoveMap(int Map) {
     midiMapsMutex.Lock();
     midiMaps.erase(Map);
     if(Map == GetDefaultMap()) {
         SetDefaultMap(midiMaps.empty() ? -1 : (*(midiMaps.begin())).first);
     }
     fireMidiInstrumentMapCountChanged(Maps().size());
     midiMapsMutex.Unlock();
 }