JBoolean
JXFontCharSetMenu::SetCharSet
	(
	const JCharacter* charSet
	)
{
	JIndex newIndex = 0;
	const JIndex count = GetItemCount();
	for (JIndex i=1; i<=count; i++)
		{
		if (GetItemText(i) == charSet)
			{
			newIndex = i;
			break;
			}
		}

	if (newIndex > 0)
		{
		itsCurrIndex = newIndex;
		itsCharSet   = charSet;

		SetPopupChoice(itsCurrIndex);
		if (itsBroadcastChangeFlag)
			{
			Broadcast(CharSetChanged(itsCharSet));
			}
		return kJTrue;
		}
	else
		{
		return kJFalse;
		}
}
void
SCNodeMenu::SetNodeIndex
	(
	const JIndex node
	)
{
	itsNodeIndex = node;
	SetPopupChoice(itsNodeIndex);
	if (itsBroadcastNodeChangeFlag)
		{
		Broadcast(NodeChanged(itsNodeIndex));
		}
}
void
JXDisplayMenu::Receive
	(
	JBroadcaster*	sender,
	const Message&	message
	)
{
	const JPtrArray<JXDisplay>* displayList = (JXGetApplication())->GetDisplayList();

	if (sender == this && message.Is(JXMenu::kNeedsUpdate))
		{
		Broadcast(DisplayNeedsUpdate());
		CheckItem(itsDisplayIndex);
		}
	else if (sender == this && message.Is(JXMenu::kItemSelected))
		{
		const JXMenu::ItemSelected* selection =
			dynamic_cast<const JXMenu::ItemSelected*>(&message);
		assert( selection != NULL );
		ChooseDisplay(selection->GetIndex());
		}

	else if (sender == const_cast<JPtrArray<JXDisplay>*>(displayList))
		{
		// we do this no matter what change occurs

		BuildMenu();
		}

	else if (sender == itsNewDisplayDialog &&
			 message.Is(JXDialogDirector::kDeactivated))
		{
		const JXDialogDirector::Deactivated* info =
			dynamic_cast<const JXDialogDirector::Deactivated*>(&message);
		assert( info != NULL );
		if (info->Successful())
			{
			itsDisplayIndex = itsNewDisplayDialog->GetDisplayIndex();
			Broadcast(DisplayChanged(itsDisplayIndex));
			}
		SetPopupChoice(itsDisplayIndex);
		itsNewDisplayDialog = NULL;
		}

	else
		{
		JXTextMenu::Receive(sender, message);
		}
}
JBoolean
SCComponentMenu::SetCompIndex
	(
	const JIndex compIndex
	)
{
	JIndex menuIndex;
	if (CompIndexToMenuIndex(compIndex, &menuIndex))
		{
		itsMenuIndex = menuIndex;
		SetPopupChoice(itsMenuIndex);
		if (itsBroadcastCompChangeFlag)
			{
			Broadcast(ComponentChanged(compIndex));
			}
		return kJTrue;
		}
	else
		{
		return kJFalse;
		}
}
void
SCComponentMenu::Receive
	(
	JBroadcaster*	sender,
	const Message&	message
	)
{
	JBroadcaster* compList = itsCircuit->GetComponentList();	// insure that it isn't const

	if (sender == this && message.Is(JXMenu::kNeedsUpdate))
		{
		itsBroadcastCompChangeFlag = kJFalse;
		Broadcast(ComponentNeedsUpdate());
		CheckItem(itsMenuIndex);
		itsBroadcastCompChangeFlag = kJTrue;
		}
	else if (sender == this && message.Is(JXMenu::kItemSelected))
		{
		const JXMenu::ItemSelected* selection =
			dynamic_cast<const JXMenu::ItemSelected*>(&message);
		assert( selection != NULL );
		itsMenuIndex = selection->GetIndex();

		JIndex compIndex;
		const JBoolean ok = MenuIndexToCompIndex(itsMenuIndex, &compIndex);
		assert( ok );
		Broadcast(ComponentChanged(compIndex));
		}

	else if (sender == compList)
		{
		JIndex compIndex;
		const JBoolean ok = MenuIndexToCompIndex(itsMenuIndex, &compIndex);
		BuildCompList();

		if (!ok)
			{
			itsMenuIndex = 1;
			}
		else if (message.Is(JOrderedSetT::kElementsInserted))
			{
			const JOrderedSetT::ElementsInserted* info =
				dynamic_cast<const JOrderedSetT::ElementsInserted*>(&message);
			assert( info != NULL && info->GetCount() == 1 );
			info->AdjustIndex(&compIndex);
			const JBoolean ok = CompIndexToMenuIndex(compIndex, &itsMenuIndex);
			assert( ok );
			}
		else if (message.Is(JOrderedSetT::kElementsRemoved))
			{
			const JOrderedSetT::ElementsRemoved* info =
				dynamic_cast<const JOrderedSetT::ElementsRemoved*>(&message);
			assert( info != NULL && info->GetCount() == 1 );
			if (info->AdjustIndex(&compIndex))
				{
				const JBoolean ok = CompIndexToMenuIndex(compIndex, &itsMenuIndex);
				assert( ok );
				}
			else
				{
				itsMenuIndex = 1;
				}
			}
		else if (message.Is(JOrderedSetT::kElementMoved))
			{
			const JOrderedSetT::ElementMoved* info =
				dynamic_cast<const JOrderedSetT::ElementMoved*>(&message);
			assert( info != NULL );
			info->AdjustIndex(&compIndex);
			const JBoolean ok = CompIndexToMenuIndex(compIndex, &itsMenuIndex);
			assert( ok );
			}
		else if (message.Is(JOrderedSetT::kElementsSwapped))
			{
			const JOrderedSetT::ElementsSwapped* info =
				dynamic_cast<const JOrderedSetT::ElementsSwapped*>(&message);
			assert( info != NULL );
			info->AdjustIndex(&compIndex);
			const JBoolean ok = CompIndexToMenuIndex(compIndex, &itsMenuIndex);
			assert( ok );
			}
		else if (message.Is(JOrderedSetT::kSorted))
			{
			assert( 0 );
			}
		// nothing extra required for JOrderedSetT::kElementChanged

		const JIndex savedIndex = itsMenuIndex;
		BuildMenu();
		itsMenuIndex = savedIndex;
		if (itsCompList->IndexValid(itsMenuIndex))
			{
			SetPopupChoice(itsMenuIndex);
			}
		}

	else
		{
		JXTextMenu::Receive(sender, message);
		}
}
void
SCNodeMenu::Receive
	(
	JBroadcaster*	sender,
	const Message&	message
	)
{
	JBroadcaster* nodeList = itsCircuit->GetNodeList();	// insure that it isn't const

	if (sender == this && message.Is(JXMenu::kNeedsUpdate))
		{
		itsBroadcastNodeChangeFlag = kJFalse;
		Broadcast(NodeNeedsUpdate());
		CheckItem(itsNodeIndex);
		itsBroadcastNodeChangeFlag = kJTrue;
		}
	else if (sender == this && message.Is(JXMenu::kItemSelected))
		{
		const JXMenu::ItemSelected* selection =
			dynamic_cast<const JXMenu::ItemSelected*>(&message);
		assert( selection != NULL );
		itsNodeIndex = selection->GetIndex();
		Broadcast(NodeChanged(itsNodeIndex));
		}

	else if (sender == nodeList)
		{
		if (message.Is(JOrderedSetT::kElementsInserted))
			{
			const JOrderedSetT::ElementsInserted* info =
				dynamic_cast<const JOrderedSetT::ElementsInserted*>(&message);
			assert( info != NULL && info->GetCount() == 1 );
			info->AdjustIndex(&itsNodeIndex);
			}
		else if (message.Is(JOrderedSetT::kElementsRemoved))
			{
			const JOrderedSetT::ElementsRemoved* info =
				dynamic_cast<const JOrderedSetT::ElementsRemoved*>(&message);
			assert( info != NULL && info->GetCount() == 1 );
			if (!info->AdjustIndex(&itsNodeIndex))
				{
				itsNodeIndex = 1;
				}
			}
		else if (message.Is(JOrderedSetT::kElementMoved))
			{
			const JOrderedSetT::ElementMoved* info =
				dynamic_cast<const JOrderedSetT::ElementMoved*>(&message);
			assert( info != NULL );
			info->AdjustIndex(&itsNodeIndex);
			}
		else if (message.Is(JOrderedSetT::kElementsSwapped))
			{
			const JOrderedSetT::ElementsSwapped* info =
				dynamic_cast<const JOrderedSetT::ElementsSwapped*>(&message);
			assert( info != NULL );
			info->AdjustIndex(&itsNodeIndex);
			}
		else if (message.Is(JOrderedSetT::kSorted))
			{
			assert( 0 );
			}
		// nothing extra required for JOrderedSetT::kElementChanged

		const JIndex savedNode = itsNodeIndex;
		BuildMenu();
		itsNodeIndex = savedNode;
		SetPopupChoice(itsNodeIndex);
		}

	else
		{
		JXTextMenu::Receive(sender, message);
		}
}