message: prompt message asking whether to check out config file from source control
diff: #include "EditorStyleSet.h"
  #include "EngineUtils.h"
  #include "Framework/Application/SlateApplication.h"
  +#include "Framework/Notifications/NotificationManager.h"
  +#include "HAL/PlatformFilemanager.h"
  +#include "ISourceControlModule.h"
  +#include "ISourceControlProvider.h"
  #include "Misc/App.h"
  +#include "Misc/MessageDialog.h"
  #include "ScopedTransaction.h"
  +#include "SourceControlOperations.h"
  #include "Widgets/Images/SThrobber.h"
  #include "Widgets/Input/SButton.h"
  #include "Widgets/Input/SCheckBox.h"
  #include "Widgets/Input/SEditableTextBox.h"
  #include "Widgets/Layout/SBorder.h"
  +#include "Widgets/Notifications/SNotificationList.h"
  #include "Widgets/Text/STextBlock.h"
  using namespace CesiumAsync;
  @@ -439,14 +446,61 @@ FReply SelectCesiumIonToken::UseOrCreate() {
  }
  };
  - getToken().thenInMainThread(
  - [pPanel, promise = std::move(promise)](Response<Token>&& response) {
  + getToken().thenInMainThread([pPanel, promise = std::move(promise)](
  + Response<Token>&& response) {
  if (response.value) {
  FCesiumEditorModule::ion().invalidateProjectDefaultTokenDetails();
  UCesiumRuntimeSettings* pSettings =
  GetMutableDefault<UCesiumRuntimeSettings>();
  + if (ISourceControlModule::Get().IsEnabled()) {
  + FString RelativeConfigFilePath = pSettings->GetDefaultConfigFilename();
  + FString ConfigFilePath =
  + FPaths::ConvertRelativePathToFull(RelativeConfigFilePath);
  + FText ConfigFilename =
  + FText::FromString(FPaths::GetCleanFilename(ConfigFilePath));
  +
  + ISourceControlProvider& SourceControlProvider =
  + ISourceControlModule::Get().GetProvider();
  + FSourceControlStatePtr SourceControlState =
  + SourceControlProvider.GetState(
  + ConfigFilePath,
  + EStateCacheUsage::Use);
  +
  + if (SourceControlState.IsValid() &&
  + SourceControlState->IsSourceControlled() &&
  + SourceControlState->CanCheckout()) {
  +
  + FString Message = FString::Format(
  + TEXT(
  + "The default access token is saved in {0} which is currently not checked out. Would you like to check it out from source control?"),
  + {ConfigFilename.ToString()});
  +
  + if (FMessageDialog::Open(
  + EAppMsgType::YesNo,
  + FText::FromString(Message)) == EAppReturnType::Yes) {
  + TArray<FString> FilesToBeCheckedOut;
  + FilesToBeCheckedOut.Add(ConfigFilePath);
  + if (SourceControlState->CanCheckout() ||
  + SourceControlState->IsCheckedOutOther() ||
  + FPlatformFileManager::Get().GetPlatformFile().IsReadOnly(
  + *ConfigFilePath)) {
  + ECommandResult::Type CommandResult =
  + SourceControlProvider.Execute(
  + ISourceControlOperation::Create<FCheckOut>(),
  + FilesToBeCheckedOut);
  + if (CommandResult != ECommandResult::Succeeded) {
  + // Show a notification that the file could not be checked out
  + FNotificationInfo CheckOutError(FText::FromString(TEXT(
  + "Error: Failed to check out the configuration file.")));
  + CheckOutError.ExpireDuration = 3.0f;
  + FSlateNotificationManager::Get().AddNotification(CheckOutError);
  + }
  + }
  + }
  + }
  + }
  FScopedTransaction transaction(
  FText::FromString("Set Project Default Token"));
  pSettings->DefaultIonAccessTokenId =
  