void
JXSearchTextDialog::UpdateDisplay()
{
	const JBoolean hasSearchText = HasSearchText();
	const JBoolean teWritable =
		JConvertToBoolean( itsTE != NULL && itsTE->GetType() == JTextEditor::kFullEditor );

	const JBoolean canSearch = JI2B(itsTE != NULL && !itsTE->IsEmpty() && hasSearchText);
	itsFindFwdButton->SetActive(canSearch);
	itsFindBackButton->SetActive(canSearch);

	const JBoolean canReplace = JI2B(canSearch && teWritable && itsTE->HasSelection());
	itsReplaceButton->SetActive(canReplace);
	itsReplaceFindFwdButton->SetActive(canReplace);
	itsReplaceFindBackButton->SetActive(canReplace);

	const JBoolean canReplaceAll = JI2B(canSearch && teWritable);
	itsReplaceAllFwdButton->SetActive(canReplaceAll);
	itsReplaceAllBackButton->SetActive(canReplaceAll);

	itsReplaceAllInSelButton->SetActive(canReplace);

	itsSingleLineCB->SetActive(itsSearchIsRegexCB->IsChecked());

	itsRetainFocusCB->SetActive(itsStayOpenCB->IsChecked());
}
void
CBSearchTextDialog::UpdateDisplay()
{
	JXSearchTextDialog::UpdateDisplay();

	if (itsFileList->GetRowCount() == 0)
		{
		itsMultifileCB->SetState(kJFalse);
		}

	if (itsMultifileCB->IsChecked() || itsSearchDirCB->IsChecked())
		{
		GetFindBackButton()->Deactivate();
		GetReplaceButton()->Deactivate();
		GetReplaceFindFwdButton()->Deactivate();
		GetReplaceFindBackButton()->Deactivate();
		GetReplaceAllBackButton()->Deactivate();
		GetReplaceAllInSelButton()->Deactivate();

		// These two buttons will already be deactivated if !HasSearchText().

		if (HasSearchText())
			{
			GetFindFwdButton()->Activate();

			if ((CBGetDocumentManager())->WillEditTextFilesLocally())
				{
				GetReplaceAllFwdButton()->Activate();
				}
			}
		}
}
JBoolean
JXSearchTextDialog::GetSearchParameters
	(
	JString*	searchStr,
	JBoolean*	searchIsRegex,
	JBoolean*	caseSensitive,
	JBoolean*	entireWord,
	JBoolean*	wrapSearch,

	JString*	replaceStr,
	JBoolean*	replaceIsRegex,
	JBoolean*	preserveCase,

	JRegex**	regex
	)
	const
{
	if (!HasSearchText())
		{
		(JGetUserNotification())->ReportError("You must enter something for which to search.");
		itsSearchInput->Focus();
		return kJFalse;
		}

	*wrapSearch    = itsWrapSearchCB->IsChecked();
	*caseSensitive = !itsIgnoreCaseCB->IsChecked();
	*preserveCase  = itsPreserveCaseCB->IsChecked();

	*searchStr     = itsSearchInput->GetText();
	*searchIsRegex = itsSearchIsRegexCB->IsChecked();
	if (*searchIsRegex)
		{
		itsRegex->SetCaseSensitive(*caseSensitive);
		itsRegex->SetSingleLine(itsSingleLineCB->IsChecked());
		const JError err = itsRegex->SetPattern(*searchStr);
		if (!err.OK())
			{
			itsSearchInput->Focus();
			err.ReportIfError();
			return kJFalse;
			}
		}

	*replaceStr     = itsReplaceInput->GetText();
	*replaceIsRegex = itsReplaceIsRegexCB->IsChecked();
	if (*replaceIsRegex)
		{
		itsRegex->SetMatchCase(*preserveCase);
		JIndexRange errRange;
		const JError err = itsRegex->SetReplacePattern(*replaceStr, &errRange);
		if (!err.OK())
			{
			itsReplaceInput->Focus();
			itsReplaceInput->SetSelection(errRange);
			err.ReportIfError();
			return kJFalse;
			}
		}

	if (*searchIsRegex ||
		itsSearchInput->IsEntireWord(1, itsSearchInput->GetTextLength()))
		{
		*entireWord = itsEntireWordCB->IsChecked();
		}
	else
		{
		*entireWord = kJFalse;
		}

	*regex = itsRegex;

	// use the original strings, not the substituted ones

	itsPrevSearchMenu->AddString(itsSearchInput->GetText());
	itsPrevReplaceMenu->AddString(itsReplaceInput->GetText());

	// broadcast to other programs who support Xsearch protocol

	if (itsNeedXSearchBcastFlag)
		{
		SetXSearch();
		}

	return kJTrue;
}