#summary Source code access is now done via plugins

#ttp 330039 	EDITOR: Platform-agnostic editor code depends on Windows-only VSAccessor headers
#detail 	Source code access is now extensible via plugins, so any new editors can be easily added.
#add 	Added SourceCodeAccess module that routes access via plugins.
#change 	Moved much of the old VSAccessor code into a new VisualStudioSourceCodeAccess plugin.
#add 	Added a counterpart XCode plugin & migrated the code from FSourceCodeNavigation (Applescript etc.) into there.
#remove 	Removed applescript for XCode access (it is now done via code).
#remove 	Removed source code access functionality from platform layer.
#add 	Added details customization for source code access settings, so users can choose their own accessor.
#remove 	Removed dependencies on VSAccessor.
#change 	Changed API in SWidget to not require building a string to be parsed, instead this acesses and forwards filenames & line numbers.
#extra 	Tested on Mac by Mark S.
reviewed by 	Andrew.Brown

[CL 2048697 by Thomas Sarkanen in Main branch]
This commit is contained in:
Thomas Sarkanen
2014-04-23 19:19:51 -04:00
committed by UnrealBot
parent 23173e178d
commit 2e3d1f5aae
60 changed files with 1283 additions and 560 deletions

View File

@@ -0,0 +1,134 @@
// Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
#include "SourceCodeAccessPrivatePCH.h"
#include "Runtime/Core/Public/Features/IModularFeatures.h"
#include "SourceCodeAccessModule.h"
#include "SourceCodeAccessSettings.h"
#include "Settings.h"
#include "SourceCodeAccess.generated.inl"
IMPLEMENT_MODULE( FSourceCodeAccessModule, SourceCodeAccess );
#define LOCTEXT_NAMESPACE "SourceCodeAccessModule"
static FName SourceCodeAccessorFeatureName(TEXT("SourceCodeAccessor"));
FSourceCodeAccessModule::FSourceCodeAccessModule()
: CurrentSourceCodeAccessor(nullptr)
{
}
void FSourceCodeAccessModule::StartupModule()
{
GetMutableDefault<USourceCodeAccessSettings>()->LoadConfig();
// Register to check for source control features
IModularFeatures::Get().OnModularFeatureRegistered().AddRaw(this, &FSourceCodeAccessModule::HandleModularFeatureRegistered);
// bind default accessor to editor
IModularFeatures::Get().RegisterModularFeature(SourceCodeAccessorFeatureName, &DefaultSourceCodeAccessor);
// Register to display our settings
ISettingsModule* SettingsModule = ISettingsModule::Get();
if (SettingsModule != nullptr)
{
SettingsModule->RegisterSettings("Editor", "General", "Source Code",
LOCTEXT("TargetSettingsName", "Source Code"),
LOCTEXT("TargetSettingsDescription", "Control how the editor accesses source code."),
GetMutableDefault<USourceCodeAccessSettings>()
);
}
}
void FSourceCodeAccessModule::ShutdownModule()
{
// Unregister our settings
ISettingsModule* SettingsModule = ISettingsModule::Get();
if (SettingsModule != nullptr)
{
SettingsModule->UnregisterSettings("Editor", "General", "Source Code");
}
// unbind default provider from editor
IModularFeatures::Get().UnregisterModularFeature(SourceCodeAccessorFeatureName, &DefaultSourceCodeAccessor);
// we don't care about modular features any more
IModularFeatures::Get().OnModularFeatureRegistered().RemoveAll(this);
}
bool FSourceCodeAccessModule::CanAccessSourceCode() const
{
return CurrentSourceCodeAccessor->CanAccessSourceCode();
}
ISourceCodeAccessor& FSourceCodeAccessModule::GetAccessor() const
{
return *CurrentSourceCodeAccessor;
}
void FSourceCodeAccessModule::SetAccessor(const FName& InName)
{
const int32 FeatureCount = IModularFeatures::Get().GetModularFeatureImplementationCount(SourceCodeAccessorFeatureName);
for(int32 FeatureIndex = 0; FeatureIndex < FeatureCount; FeatureIndex++)
{
IModularFeature* Feature = IModularFeatures::Get().GetModularFeatureImplementation(SourceCodeAccessorFeatureName, FeatureIndex);
check(Feature);
ISourceCodeAccessor& Accessor = *static_cast<ISourceCodeAccessor*>(Feature);
if(InName == Accessor.GetFName())
{
CurrentSourceCodeAccessor = static_cast<ISourceCodeAccessor*>(Feature);
FSlateApplication::Get().SetWidgetReflectorSourceAccessDelegate( FAccessSourceCode::CreateRaw( CurrentSourceCodeAccessor, &ISourceCodeAccessor::OpenFileAtLine ) );
FSlateApplication::Get().SetWidgetReflectorQuerySourceAccessDelegate( FQueryAccessSourceCode::CreateRaw( CurrentSourceCodeAccessor, &ISourceCodeAccessor::CanAccessSourceCode ) );
break;
}
}
}
FLaunchingCodeAccessor& FSourceCodeAccessModule::OnLaunchingCodeAccessor()
{
return LaunchingCodeAccessorDelegate;
}
FDoneLaunchingCodeAccessor& FSourceCodeAccessModule::OnDoneLaunchingCodeAccessor()
{
return DoneLaunchingCodeAccessorDelegate;
}
FLaunchCodeAccessorDeferred& FSourceCodeAccessModule::OnLaunchCodeAccessorDeferred()
{
return LaunchCodeAccessorDeferredDelegate;
}
FOpenFileFailed& FSourceCodeAccessModule::OnOpenFileFailed()
{
return OpenFileFailedDelegate;
}
void FSourceCodeAccessModule::HandleModularFeatureRegistered(const FName& Type)
{
if(Type == SourceCodeAccessorFeatureName)
{
CurrentSourceCodeAccessor = &DefaultSourceCodeAccessor;
const FString PreferredAccessor = GetDefault<USourceCodeAccessSettings>()->PreferredAccessor;
const int32 FeatureCount = IModularFeatures::Get().GetModularFeatureImplementationCount(Type);
for(int32 FeatureIndex = 0; FeatureIndex < FeatureCount; FeatureIndex++)
{
IModularFeature* Feature = IModularFeatures::Get().GetModularFeatureImplementation(Type, FeatureIndex);
check(Feature);
ISourceCodeAccessor& Accessor = *static_cast<ISourceCodeAccessor*>(Feature);
if(PreferredAccessor == Accessor.GetFName().ToString())
{
CurrentSourceCodeAccessor = static_cast<ISourceCodeAccessor*>(Feature);
FSlateApplication::Get().SetWidgetReflectorSourceAccessDelegate( FAccessSourceCode::CreateRaw( CurrentSourceCodeAccessor, &ISourceCodeAccessor::OpenFileAtLine ) );
FSlateApplication::Get().SetWidgetReflectorQuerySourceAccessDelegate( FQueryAccessSourceCode::CreateRaw( CurrentSourceCodeAccessor, &ISourceCodeAccessor::CanAccessSourceCode ) );
break;
}
}
}
}
#undef LOCTEXT_NAMESPACE