// if you pass in -1's for x and y, we'll figure out where it can go, and return where it went
int32_t		LogisticsVariant::addComponent(LogisticsComponent* pComponent, int32_t& xCoord, int32_t& yCoord)
{
	int32_t retVal = canAddComponent(pComponent, xCoord, yCoord);
	if(retVal == 0)
	{
		if(addComponent(pComponent->getID(), xCoord, yCoord))
			return 0;
		else
			return ADD_COMPONENT_FAILED;
	}
	return retVal;
}
void MechLabScreen::update()
{

	if ( bSaveDlg )
	{
		pCurDialog->update();

		if ( pCurDialog->isDone() )
		{
			if ( pCurDialog->getStatus() == YES )
			{
				LogisticsData::instance->acceptMechModifications( pCurDialog->getFileName() );
				pCurDialog->end();
				status = UP;
				bSaveDlg = 0;
			}
			else if ( pCurDialog->getStatus() == NO )
			{
				bSaveDlg = 0;
				pCurDialog->end();
			}
		}

		return;
	}
	else if ( bErrorDlg )
	{
		LogisticsOneButtonDialog::instance()->update();
		if ( LogisticsOneButtonDialog::instance()->isDone() )
			bErrorDlg = 0;

		return;
	}

	if ( !pVariant || status != RUNNING )
		return;

	
	camera.update();

	int oldSel = componentListBox.GetSelectedItem(); // need to check this before we update the list box

	for ( int i = 0; i < MECH_LAB_ATTRIBUTE_METER_COUNT; i++ )
		attributeMeters[i].update();


	if ( !MPlayer || !ChatWindow::instance()->pointInside(userInput->getMouseX(), userInput->getMouseY()) )
		LogisticsScreen::update();

	updateDiagramInput();	


	variantList.update();

	bool vals[4];
	if ( pVariant && status == RUNNING ) // sensor help texts
	{
		int sensorID = pVariant->getSensorID();
		for ( int i = 0; i < 3; i++ )
		{
			if ( sensorID == sensorHelpIDs[i] - IDS_HELP_COMP0 )
				vals[i] = true;
			else
				vals[i] = false;
		}
		vals[3] = pVariant->getECM() > 0;

		for ( i = 0; i < 4; i++ )
		{
			if ( vals[i] )
			{
				if ( sensorRects[i].left <= userInput->getMouseX() &&
					sensorRects[i].right >= userInput->getMouseX() &&
					sensorRects[i].top <= userInput->getMouseY() && 
					sensorRects[i].bottom >= userInput->getMouseY()
					&& !helpTextID )
				{
					helpTextID = sensorHelpIDs[i];
					break;
				}
			}
		}
	}

	// hack, in case the variant list sets the helpID
	if ( ::helpTextID )
	{
		textObjects[helpTextArrayID].setText( helpTextID );
	}

	// see if the variant changed
	EString tmp;
	variantList.EditBox().getEntry(tmp);
	if ( varName.Compare( tmp ) != 0 )
	{
		swapVariant();
	}

	

	if ( status != RUNNING ) // can change after button updates
		return;

	// update the list box
	componentListBox.update();
	int newSel = componentListBox.GetSelectedItem();

	if ( oldSel != newSel  )
	{
		if ( newSel != -1 )
		{
			pSelectedComponent = NULL;
			selI = selJ = -1;
		}
		else
		{
			bool bFound = 0;
			for ( int i = 0; i < componentListBox.GetItemCount(); i++ )
			{
				if ( componentListBox.GetItem( i )->getState() != aListItem::DISABLED
					&& !canAddComponent( ((ComponentListItem*)componentListBox.GetItem( i ))->getComponent() ) )
				{
					bFound = 1;
					break;
				}
			
			}
			if ( !bFound )
				selectFirstDiagramComponent();
		}
	}

	bool bNoDelete = !canRemoveComponent( pSelectedComponent );


	if ( pSelectedComponent  )
	{
		setComponent( pSelectedComponent );
		if ( bNoDelete || (selI == -1 && selJ == -1) )
			getButton( MB_MSG_REMOVE )->disable( 1 );
		else
			getButton( MB_MSG_REMOVE )->disable( 0 );
		getButton( MB_MSG_ADD )->disable( 1 );
	}
	else
	{
		LogisticsComponent* pComp = componentListBox.getComponent();
		if ( pComp )
		{
			setComponent( pComp );
			getButton( MB_MSG_ADD )->disable( 0 );
			getButton( MB_MSG_REMOVE )->disable( 1 );
		}
		else
			getButton( MB_MSG_REMOVE )->disable( 1 );

	}

	long color = 0xffffffff;
	
	float newCost = pVariant->getCost();

	// figure out change
	float costChange = newCost - originalCost;

	if ( curCount && curCount + g_deltaTime < countDownTime  )
	{
		curCount += g_deltaTime;
		float curAmount = previousAmount - (curCount/countDownTime * previousAmount); 
		costChange += curAmount;
		color = 0xffa21600;
		if ( curAmount > 0 )
			color = 0xffc8e100;
	}

	updateHeatMeter();
	updateArmorMeter();
	
	char text[64];
	sprintf( text, "%.0lf ", costChange );
	textObjects[5].setText( text );
	textObjects[5].setColor( color );

	if ( MPlayer && ChatWindow::instance() )
		ChatWindow::instance()->update();




}
void	MechLabScreen::setComponent( LogisticsComponent* pComponent, bool bMessageFromLB )
{
	if ( bMessageFromLB && canAddComponent( pComponent ) ) // if they clicked on a disabled item
	{
		componentListBox.SelectItem( -1 );
		selI = selJ = -1;
		pSelectedComponent = NULL;

		getButton( MB_MSG_ADD )->disable( true );
	}

	if ( pComponent && pComponent == pCurComponent )
		return;

	pCurComponent = pComponent;

	// ammo doesn't deserve a meter
	attributeMeters[3].showGUIWindow( 0 );

	char text[64];
	if ( pCurComponent )
	{
		//set the little spinning figure
		// uncomment this when the art is in, if ever...
		camera.setComponent( pCurComponent->getPictureFileName() );
		textObjects[6].setText( pComponent->getName() );


		// first figure out if this is a jump jet or not
		if ( pCurComponent->getType() == COMPONENT_FORM_JUMPJET )
		{
			showJumpJetItems( 1 );


			// set up jump range
			attributeMeters[4].setValue(((float)pVariant->getMaxJumpRange() * 25.0f) / MAX_JUMP_RANGE );
			sprintf( text, "%ld", pVariant->getMaxJumpRange() * 25);
			textObjects[7].setText( text );
			textObjects[7].setColor( 0xff005392 );
			rects[16].setHelpID( IDS_HELP_PM_JUMP );

	
			// set up heat
			attributeMeters[7].setValue(pCurComponent->getHeat()/LogisticsComponent::MAX_HEAT);
			attributeMeters[7].showGUIWindow( true );
			
			sprintf( text, "%.1lf", pCurComponent->getHeat() );
			textObjects[15].setText( text );
			
			textObjects[8].setText( "" );
			textObjects[9].setText( "" );
			textObjects[10].setText( "" );
			textObjects[13].setText( "" );
			rects[17].setHelpID( IDS_HELP_MC_HEAT_GENERATED );


			attributeMeters[0].showGUIWindow( false );

			rects[18].setHelpID( 0 );
			rects[19].setHelpID( 0 );
			rects[20].setHelpID( 0 );


			

		}
		else if ( pCurComponent->getType() == COMPONENT_FORM_HEATSINK )
		{
			showJumpJetItems( 1 );


			// hide jump range stuff
			attributeMeters[4].showGUIWindow( 0 );
			textObjects[7].showGUIWindow( 0 );
			statics[47].showGUIWindow( 0 );

			textObjects[15].setText( "" );

			// jump range
			statics[48].showGUIWindow( 0 );
			// armor
			statics[49].showGUIWindow( 0 );
			// damage
			statics[30].showGUIWindow( 0 );
			// heat
			statics[55].showGUIWindow( 1 );	


			attributeMeters[7].showGUIWindow( 0 );
	
			// set up heat, negative heat is stored in the damage area of heat sinks, god knows why
			attributeMeters[8].setValue(pCurComponent->getDamage()/LogisticsComponent::MAX_HEAT);
			attributeMeters[8].showGUIWindow( true );
			
			sprintf( text, "+%.1lf", pCurComponent->getDamage() );
			textObjects[16].setText( text );
			textObjects[16].showGUIWindow( true );
			
			textObjects[8].setText( "" );
			textObjects[9].setText( "" );
			textObjects[10].setText( "" );
			textObjects[13].setText( "" );

			attributeMeters[0].showGUIWindow( false );

			rects[16].setHelpID( IDS_HELP_MC_HEAT_GENERATED );
			rects[17].setHelpID( 0 );
			rects[18].setHelpID( 0 );
			rects[19].setHelpID( 0 );
			rects[20].setHelpID( 0 );
		}
		else if ( pCurComponent->getType() == COMPONENT_FORM_BULK )
		{	
			showJumpJetItems( 1 );
			
			// jump range
			statics[48].showGUIWindow( 0 );
			// armor
			statics[49].showGUIWindow( 1 );
			// damage
			statics[30].showGUIWindow( 0 );
			
			sprintf( text, "%.1lf", pCurComponent->getDamage() );
			textObjects[7].setText( text );
			textObjects[7].setColor( 0xff005392 );
			textObjects[8].setText( "" );
			textObjects[9].setText( "" );
			textObjects[10].setText( "" );
			textObjects[15].setText( "" );

			textObjects[13].setText( "" );
			attributeMeters[7].showGUIWindow( false );

			for( int i = 0; i < 4; i++ )
			{
				attributeMeters[i].showGUIWindow( 0 );
			}

			rects[16].setHelpID( IDS_HELP_MC_ARMOR );
			rects[17].setHelpID( 0 );
			rects[18].setHelpID( 0 );
			rects[19].setHelpID( 0 );
			rects[20].setHelpID( 0 );

		}
		else
		{
			long rangeColors[3] = {0xff6e7c00, 0xff005392,0xffa21600  };

			showJumpJetItems( 0 );
			textObjects[7].setText( pCurComponent->getRangeType() + IDS_SHORT_RANGE );
			textObjects[7].setColor( rangeColors[pCurComponent->getRangeType()] );


			attributeMeters[0].showGUIWindow( true );
			attributeMeters[0].setValue(pCurComponent->getDamage()/LogisticsComponent::MAX_DAMAGE);
			sprintf( text, "%.1lf", pCurComponent->getDamage() );
			textObjects[8].setText( text );
			
			if ( pCurComponent->getRecycleTime() )
			{
				attributeMeters[1].setValue((10.f/pCurComponent->getRecycleTime())/LogisticsComponent::MAX_RECYCLE);
				sprintf( text, "%.1lf", 10.f/pCurComponent->getRecycleTime() );
				textObjects[9].setText( text );
			}
			else
			{
				attributeMeters[1].setValue( 0.f );
				sprintf( text, "%.1lf", 0.f );
				textObjects[9].setText( text );
			}
			

			attributeMeters[2].setValue(pCurComponent->getHeat()/LogisticsComponent::MAX_HEAT);
			sprintf( text, "%.1lf", pCurComponent->getHeat() );
			textObjects[10].setText( text );

			attributeMeters[7].showGUIWindow( false );

			if ( !g_unlimitedAmmo )
			{
				sprintf( text, "%ld", pCurComponent->getAmmo() );
				textObjects[13].setText( text );
				attributeMeters[3].setValue( ((float)pCurComponent->getAmmo())/164.f );
			}
			else
				textObjects[13].setText( "" );

			textObjects[15].setText( "" );

			rects[16].setHelpID( IDS_HELP_MC_RANGE );
			rects[17].setHelpID( IDS_HELP_MC_DAMAGE );
			rects[18].setHelpID( IDS_HELP_MC_FIRE_RATE );
			rects[19].setHelpID( IDS_HELP_MC_HEAT_GENERATED );
			if ( !g_userPreferences.unlimitedAmmo )
				rects[20].setHelpID( IDS_HELP_MC_AMMO );
			else
				rects[20].setHelpID( 0 );
			
		}
	}
	else
	{
		for ( int i = 7; i < 11; i++ )
		{
			textObjects[i].setText( "" );
		}

		textObjects[13].setText( "" );

		for ( i = 0; i < 5; i++ )
		{
			attributeMeters[i].setValue( 0 );
			attributeMeters[i].showGUIWindow( 0 );
		}
	}
}