void CtrlrPanelCanvas::pasteGroupComponent(const ValueTree &groupTree, const int destinationX, const int destinationY)
{
	if (groupTree.hasType ("groupTree"))
	{
		CtrlrComponent *parent		= addNewComponent (groupTree.getChild(0), 0, true);
		if (destinationX >= 0 && destinationY >= 0)
			parent->setTopLeftPosition (destinationX, destinationY);
		else
			parent->setTopLeftPosition (parent->getX()+(parent->getWidth()/2), parent->getY()+(parent->getHeight()/2));

		CtrlrGroup *group			= dynamic_cast<CtrlrGroup*>(parent);
		CtrlrTabsComponent *tabs	= dynamic_cast<CtrlrTabsComponent*>(parent);

		for (int i=0; i<groupTree.getChild(0).getNumChildren(); i++)
		{
			if (groupTree.getChild(0).getChild(i).hasType(Ids::modulator))
			{
				CtrlrComponent *child = addNewComponent (groupTree.getChild(0).getChild(i), 0, true);
				if (group && child)
				{
					group->setOwned(child, true);
				}

				if (tabs && child)
				{
					tabs->setOwned(child, child->getProperty(Ids::componentTabId), true);
				}
			}
		}
	}
}
void CtrlrPanelCanvas::handleRightClickOnCanvas(const MouseEvent &e)
{
	const bool em = getOwner().getProperty(Ids::uiPanelEditMode);

	if (!em)
	{
		PopupMenu m = getRightClickComponentMenu(e);
		handleComponentPopupMenu(e, m.show());
		return;
	}

	PopupMenu m;

	if (em)
	{
		m = CtrlrComponentTypeManager::getComponentMenu(em);
		getEditMenu(m);
	}
	else
	{
		m = getRightClickComponentMenu(e);
	}

	const int ret = m.show();

	if (ret >= 4096)
	{
		handleComponentPopupMenu(e, ret);
	}
	else if (ret == 1024)
	{
		getOwner().setProperty (Ids::uiPanelEditMode, !em);
		getOwner().editModeChanged();
	}
	else if (ret < 1024 && ret > 10)
	{
		PopupMenu::MenuItemIterator iterator((const PopupMenu &)m);
		while (iterator.next())
		{
			if (iterator.getItem().subMenu)
			{
				PopupMenu::MenuItemIterator iterator2(*iterator.getItem().subMenu);
					while (iterator2.next())
				{
					if (iterator2.getItem().itemID == ret)
					{
						addNewComponent (iterator2.getItem().text, e.getPosition(), e.eventComponent);
					}
				}
			}
		}
	}
	else if (ret >= 2048 && ret < 4096)
	{
		handleEditMenu (ret, e);
	}
}
bool BOARD_NETLIST_UPDATER::UpdateNetlist( NETLIST& aNetlist )
{
    wxString msg;
    m_errorCount = 0;
    m_warningCount = 0;

    if( !m_isDryRun )
    {
        m_board->SetStatus( 0 );
    }

    for( int i = 0; i < (int) aNetlist.GetCount();  i++ )
    {
        COMPONENT* component = aNetlist.GetComponent( i );
        MODULE* footprint = NULL;

        msg.Printf( _( "Processing component \"%s:%s:%s\".\n" ),
                    GetChars( component->GetReference() ),
                    GetChars( component->GetTimeStamp() ),
                    GetChars( component->GetFPID().Format() ) );
        m_reporter->Report( msg, REPORTER::RPT_INFO );

        if( aNetlist.IsFindByTimeStamp() )
            footprint = m_board->FindModule( component->GetTimeStamp(), true );
        else
            footprint = m_board->FindModule( component->GetReference() );

        if( footprint )        // An existing footprint.
        {
            MODULE* newFootprint = replaceComponent( aNetlist, footprint, component );

            if( newFootprint )
                footprint = newFootprint;
        }
        else
        {
            footprint = addNewComponent( component );
        }

        if( footprint )
        {
            updateComponentParameters( footprint, component );
            updateComponentPadConnections( footprint, component );
        }
    }

    //aNetlist.GetDeleteExtraFootprints()

    if( m_deleteUnusedComponents )
        deleteUnusedComponents( aNetlist );

    if( m_deleteSinglePadNets )
        deleteSinglePadNets();

    if( !m_isDryRun )
    {
        m_commit.Push( _( "Update netlist" ) );
        m_frame->Compile_Ratsnest( NULL, false );
        m_board->GetRatsnest()->ProcessBoard();
        testConnectivity( aNetlist );
    }

    // Update the ratsnest
    m_reporter->Report( wxT( "" ), REPORTER::RPT_ACTION );
    m_reporter->Report( wxT( "" ), REPORTER::RPT_ACTION );

    msg.Printf( _( "Total warnings: %d, errors: %d." ), m_warningCount, m_errorCount );
    m_reporter->Report( msg, REPORTER::RPT_ACTION );

    if( m_errorCount )
    {
        m_reporter->Report( _( "Errors occured during the netlist update. Unless you "
                               "fix them, your board will not be consistent with the schematics." ),
                            REPORTER::RPT_ERROR );

        return false;
    }
    else
    {
        m_reporter->Report( _( "Netlist update successful!" ), REPORTER::RPT_ACTION );
    }

    return true;
}