Working on removing more statics.

This commit is contained in:
Robin 2019-01-02 00:47:11 +01:00
commit e76e82741f
67 changed files with 445 additions and 443 deletions

View file

@ -9,5 +9,6 @@
<add key="Dapplo.Windows" value="https://ci.appveyor.com/nuget/dapplo-windows-pjnkjqjp7t6a" />
<add key="myget.dotnetcore" value="https://dotnet.myget.org/F/dotnet-core/api/v3/index.json" />
<add key="dotnet-core-latest" value="https://dotnet.myget.org/F/dotnet-core/api/v3/index.json" />
<add key="dotnet-core" value="https://dotnet.myget.org/F/dotnet-core/api/v3/index.json" />
</packageSources>
</configuration>

View file

@ -17,6 +17,7 @@
<UseWPF>true</UseWPF>
<UseWindowsForms>false</UseWindowsForms>
<OsProductName>$(registry:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion@ProductName)</OsProductName>
<RuntimeIdentifiers>win10-x64;win10-x86;win-x64;win-x86</RuntimeIdentifiers>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' != 'Debug' And !$(MSBuildProjectName.Contains('Test')) And !$(MSBuildProjectName.Contains('Demo'))">
@ -45,8 +46,8 @@
<DebugSymbols>True</DebugSymbols>
</PropertyGroup>
<ItemGroup Condition="!$(MSBuildProjectName.Contains('Test')) And !$(MSBuildProjectName.Contains('Demo'))">
<PackageReference Include="Nerdbank.GitVersioning" Version="2.2.33">
<ItemGroup>
<PackageReference Include="Nerdbank.GitVersioning" Version="2.3.38">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>

View file

@ -187,7 +187,7 @@ namespace Greenshot.Addon.Confluence
private bool Upload(ISurface surfaceToUpload, Content page, string filename, out string errorMessage)
{
var outputSettings = new SurfaceOutputSettings(_confluenceConfiguration.UploadFormat, _confluenceConfiguration.UploadJpegQuality, _confluenceConfiguration.UploadReduceColors);
var outputSettings = new SurfaceOutputSettings(CoreConfiguration, _confluenceConfiguration.UploadFormat, _confluenceConfiguration.UploadJpegQuality, _confluenceConfiguration.UploadReduceColors);
errorMessage = null;
try
{

View file

@ -4,92 +4,6 @@
<xs:element name="Weavers">
<xs:complexType>
<xs:all>
<xs:element name="Costura" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:all>
<xs:element minOccurs="0" maxOccurs="1" name="ExcludeAssemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" maxOccurs="1" name="IncludeAssemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" maxOccurs="1" name="Unmanaged32Assemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with line breaks.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" maxOccurs="1" name="Unmanaged64Assemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of unmanaged 64 bit assembly names to include, delimited with line breaks.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" maxOccurs="1" name="PreloadOrder" type="xs:string">
<xs:annotation>
<xs:documentation>The order of preloaded assemblies, delimited with line breaks.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:all>
<xs:attribute name="CreateTemporaryAssemblies" type="xs:boolean">
<xs:annotation>
<xs:documentation>This will copy embedded files to disk before loading them into memory. This is helpful for some scenarios that expected an assembly to be loaded from a physical file.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="IncludeDebugSymbols" type="xs:boolean">
<xs:annotation>
<xs:documentation>Controls if .pdbs for reference assemblies are also embedded.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="DisableCompression" type="xs:boolean">
<xs:annotation>
<xs:documentation>Embedded assemblies are compressed by default, and uncompressed when they are loaded. You can turn compression off with this option.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="DisableCleanup" type="xs:boolean">
<xs:annotation>
<xs:documentation>As part of Costura, embedded assemblies are no longer included as part of the build. This cleanup can be turned off.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="LoadAtModuleInit" type="xs:boolean">
<xs:annotation>
<xs:documentation>Costura by default will load as part of the module initialization. This flag disables that behavior. Make sure you call CosturaUtility.Initialize() somewhere in your code.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="IgnoreSatelliteAssemblies" type="xs:boolean">
<xs:annotation>
<xs:documentation>Costura will by default use assemblies with a name like 'resources.dll' as a satellite resource and prepend the output path. This flag disables that behavior.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="ExcludeAssemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with |</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="IncludeAssemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of assembly names to include from the default action of "embed all Copy Local references", delimited with |.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="Unmanaged32Assemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of unmanaged 32 bit assembly names to include, delimited with |.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="Unmanaged64Assemblies" type="xs:string">
<xs:annotation>
<xs:documentation>A list of unmanaged 64 bit assembly names to include, delimited with |.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="PreloadOrder" type="xs:string">
<xs:annotation>
<xs:documentation>The order of preloaded assemblies, delimited with |.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:element name="AutoProperties" minOccurs="0" maxOccurs="1" type="xs:anyType" />
</xs:all>
<xs:attribute name="VerifyAssembly" type="xs:boolean">

View file

@ -51,7 +51,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
private static readonly AdjustableArrowCap ARROW_CAP = new AdjustableArrowCap(4, 6);
public ArrowContainer(Surface parent) : base(parent)
public ArrowContainer(Surface parent, IEditorConfiguration editorConfiguration) : base(parent, editorConfiguration)
{
}

View file

@ -61,12 +61,12 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
private Bitmap _bitmap;
public BitmapContainer(Surface parent, string filename) : this(parent)
public BitmapContainer(Surface parent, string filename, IEditorConfiguration editorConfiguration) : this(parent, editorConfiguration)
{
Load(filename);
}
public BitmapContainer(Surface parent) : base(parent)
public BitmapContainer(Surface parent, IEditorConfiguration editorConfiguration) : base(parent, editorConfiguration)
{
FieldChanged += BitmapContainer_OnFieldChanged;
Init();

View file

@ -39,7 +39,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
/// </summary>
public class CropContainer : DrawableContainer
{
public CropContainer(Surface parent) : base(parent)
public CropContainer(Surface parent, IEditorConfiguration editorConfiguration) : base(parent, editorConfiguration)
{
Init();
}

View file

@ -46,12 +46,12 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
protected Cursor cursor;
public CursorContainer(Surface parent) : base(parent)
public CursorContainer(Surface parent, IEditorConfiguration editorConfiguration) : base(parent, editorConfiguration)
{
Init();
}
public CursorContainer(Surface parent, string filename) : this(parent)
public CursorContainer(Surface parent, string filename, IEditorConfiguration editorConfiguration) : this(parent, editorConfiguration)
{
Load(filename);
}

View file

@ -59,8 +59,6 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
private const int M11 = 0;
private const int M22 = 3;
private static readonly LogSource Log = new LogSource();
// TODO: Solve, was static reference!
protected static readonly IEditorConfiguration EditorConfig = new EditorConfigurationImpl();
/// <summary>
/// List of available Adorners
@ -98,7 +96,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
private int width;
public DrawableContainer(Surface parent)
public DrawableContainer(Surface parent, IEditorConfiguration editorConfiguration) : base(editorConfiguration)
{
InitializeFields();
_parent = parent;

View file

@ -41,8 +41,8 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
[Serializable]
public class EllipseContainer : DrawableContainer
{
public EllipseContainer(Surface parent) : base(parent)
{
public EllipseContainer(Surface parent, IEditorConfiguration editorConfiguration) : base(parent, editorConfiguration)
{
CreateDefaultAdorners();
}

View file

@ -37,8 +37,6 @@ namespace Greenshot.Addon.LegacyEditor.Drawing.Fields
public abstract class AbstractFieldHolder : IFieldHolder
{
private static readonly LogSource Log = new LogSource();
// TODO: Solve, was static reference!
private static readonly IEditorConfiguration EditorConfig = new EditorConfigurationImpl();
[NonSerialized]
private readonly IDictionary<IField, PropertyChangedEventHandler> _handlers = new Dictionary<IField, PropertyChangedEventHandler>();
@ -61,7 +59,10 @@ namespace Greenshot.Addon.LegacyEditor.Drawing.Fields
private IDictionary<IFieldType, IField> _fieldsByType = new Dictionary<IFieldType, IField>();
private readonly IList<IField> fields = new List<IField>();
[OnDeserialized]
[NonSerialized]
protected readonly IEditorConfiguration _editorConfiguration;
[OnDeserialized]
private void OnDeserialized(StreamingContext context)
{
_fieldsByType = new Dictionary<IFieldType, IField>();
@ -73,9 +74,13 @@ namespace Greenshot.Addon.LegacyEditor.Drawing.Fields
}
}
public AbstractFieldHolder(IEditorConfiguration editorConfiguration)
{
_editorConfiguration = editorConfiguration;
}
public void AddField(Type requestingType, IFieldType fieldType, object fieldValue)
{
AddField(EditorConfig.CreateField(requestingType, fieldType, fieldValue));
AddField(_editorConfiguration.CreateField(requestingType, fieldType, fieldValue));
}
public virtual void AddField(IField field)

View file

@ -46,7 +46,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing.Fields
[NonSerialized] private EventHandler childrenChanged;
public AbstractFieldHolderWithChildren()
public AbstractFieldHolderWithChildren(IEditorConfiguration editorConfiguration) : base(editorConfiguration)
{
_fieldChangedEventHandler = OnFieldChanged;
}

View file

@ -49,13 +49,10 @@ namespace Greenshot.Addon.LegacyEditor.Drawing.Fields
[Serializable]
public sealed class FieldAggregator : AbstractFieldHolder
{
// TODO: Solve, was static reference!
private static readonly IEditorConfiguration EditorConfig = new EditorConfigurationImpl();
private readonly IDrawableContainerList _boundContainers;
private bool _internalUpdateRunning;
public FieldAggregator(ISurface parent)
public FieldAggregator(ISurface parent, IEditorConfiguration editorConfiguration) : base(editorConfiguration)
{
foreach (var fieldType in FieldTypes.Values)
{
@ -225,7 +222,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing.Fields
drawableContainerField.Value = field.Value;
// update last used from DC field, so that scope is honored
EditorConfig.UpdateLastFieldValue(drawableContainerField);
_editorConfiguration.UpdateLastFieldValue(drawableContainerField);
}
}
}

View file

@ -58,7 +58,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
HIGHLIGHT
}
public FilterContainer(Surface parent) : base(parent)
public FilterContainer(Surface parent, IEditorConfiguration editorConfiguration) : base(parent, editorConfiguration)
{
Init();
}

View file

@ -48,7 +48,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing.Filters
[NonSerialized] private PropertyChangedEventHandler propertyChanged;
public AbstractFilter(DrawableContainer parent)
public AbstractFilter(DrawableContainer parent, IEditorConfiguration editorConfiguration) : base(editorConfiguration)
{
this.parent = parent;
}

View file

@ -40,7 +40,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing.Filters
{
public double previewQuality;
public BlurFilter(DrawableContainer parent) : base(parent)
public BlurFilter(DrawableContainer parent, IEditorConfiguration editorConfiguration) : base(parent, editorConfiguration)
{
AddField(GetType(), FieldTypes.BLUR_RADIUS, 3);
AddField(GetType(), FieldTypes.PREVIEW_QUALITY, 1.0d);

View file

@ -38,7 +38,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing.Filters
[Serializable]
public class BrightnessFilter : AbstractFilter
{
public BrightnessFilter(DrawableContainer parent) : base(parent)
public BrightnessFilter(DrawableContainer parent, IEditorConfiguration editorConfiguration) : base(parent, editorConfiguration)
{
AddField(GetType(), FieldTypes.BRIGHTNESS, 0.9d);
}

View file

@ -40,7 +40,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing.Filters
[Serializable]
public class GrayscaleFilter : AbstractFilter
{
public GrayscaleFilter(DrawableContainer parent) : base(parent)
public GrayscaleFilter(DrawableContainer parent, IEditorConfiguration editorConfiguration) : base(parent, editorConfiguration)
{
}

View file

@ -39,7 +39,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing.Filters
[Serializable]
public class HighlightFilter : AbstractFilter
{
public HighlightFilter(DrawableContainer parent) : base(parent)
public HighlightFilter(DrawableContainer parent, IEditorConfiguration editorConfiguration) : base(parent, editorConfiguration)
{
AddField(GetType(), FieldTypes.FILL_COLOR, Color.Yellow);
}

View file

@ -38,7 +38,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing.Filters
[Serializable]
public class MagnifierFilter : AbstractFilter
{
public MagnifierFilter(DrawableContainer parent) : base(parent)
public MagnifierFilter(DrawableContainer parent, IEditorConfiguration editorConfiguration) : base(parent, editorConfiguration)
{
AddField(GetType(), FieldTypes.MAGNIFICATION_FACTOR, 2);
}

View file

@ -43,7 +43,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing.Filters
[Serializable]
public class PixelizationFilter : AbstractFilter
{
public PixelizationFilter(DrawableContainer parent) : base(parent)
public PixelizationFilter(DrawableContainer parent, IEditorConfiguration editorConfiguration) : base(parent, editorConfiguration)
{
AddField(GetType(), FieldTypes.PIXEL_SIZE, 5);
}

View file

@ -44,18 +44,19 @@ namespace Greenshot.Addon.LegacyEditor.Drawing {
private NativeRect myBounds = NativeRect.Empty;
private NativePoint lastMouse = NativePoint.Empty;
private readonly List<NativePointFloat> capturePoints = new List<NativePointFloat>();
[NonSerialized] private GraphicsPath freehandPath = new GraphicsPath();
[NonSerialized]
private GraphicsPath freehandPath = new GraphicsPath();
private bool isRecalculated;
/// <summary>
/// Constructor
/// </summary>
public FreehandContainer(Surface parent) : base(parent) {
public FreehandContainer(Surface parent, IEditorConfiguration editorConfiguration) : base(parent, editorConfiguration) {
Width = parent.Width;
Height = parent.Height;
Top = 0;
Left = 0;
}
}
protected override void InitializeFields() {
AddField(GetType(), FieldTypes.LINE_THICKNESS, 3);
@ -105,10 +106,10 @@ namespace Greenshot.Addon.LegacyEditor.Drawing {
public override bool HandleMouseMove(int mouseX, int mouseY) {
NativePoint previousPoint = capturePoints[capturePoints.Count-1];
if (GeometryHelper.Distance2D(previousPoint.X, previousPoint.Y, mouseX, mouseY) >= 2*EditorConfig.FreehandSensitivity) {
if (GeometryHelper.Distance2D(previousPoint.X, previousPoint.Y, mouseX, mouseY) >= 2* _editorConfiguration.FreehandSensitivity) {
capturePoints.Add(new NativePoint(mouseX, mouseY));
}
if (GeometryHelper.Distance2D(lastMouse.X, lastMouse.Y, mouseX, mouseY) < EditorConfig.FreehandSensitivity)
if (GeometryHelper.Distance2D(lastMouse.X, lastMouse.Y, mouseX, mouseY) < _editorConfiguration.FreehandSensitivity)
{
return true;
}
@ -131,7 +132,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing {
/// </summary>
public override void HandleMouseUp(int mouseX, int mouseY) {
// Make sure we don't loose the ending point
if (GeometryHelper.Distance2D(lastMouse.X, lastMouse.Y, mouseX, mouseY) >= EditorConfig.FreehandSensitivity) {
if (GeometryHelper.Distance2D(lastMouse.X, lastMouse.Y, mouseX, mouseY) >= _editorConfiguration.FreehandSensitivity) {
capturePoints.Add(new NativePoint(mouseX, mouseY));
}
RecalculatePath();

View file

@ -39,7 +39,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
[Serializable]
public class HighlightContainer : FilterContainer
{
public HighlightContainer(Surface parent) : base(parent)
public HighlightContainer(Surface parent, IEditorConfiguration editorConfiguration) : base(parent, editorConfiguration)
{
Init();
}
@ -86,29 +86,29 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
switch (preset)
{
case PreparedFilter.TEXT_HIGHTLIGHT:
Add(new HighlightFilter(this));
Add(new HighlightFilter(this, _editorConfiguration));
break;
case PreparedFilter.AREA_HIGHLIGHT:
var brightnessFilter = new BrightnessFilter(this)
var brightnessFilter = new BrightnessFilter(this, _editorConfiguration)
{
Invert = true
};
Add(brightnessFilter);
var blurFilter = new BlurFilter(this)
var blurFilter = new BlurFilter(this, _editorConfiguration)
{
Invert = true
};
Add(blurFilter);
break;
case PreparedFilter.GRAYSCALE:
AbstractFilter f = new GrayscaleFilter(this)
AbstractFilter f = new GrayscaleFilter(this, _editorConfiguration)
{
Invert = true
};
Add(f);
break;
case PreparedFilter.MAGNIFICATION:
Add(new MagnifierFilter(this));
Add(new MagnifierFilter(this, _editorConfiguration));
break;
}
}

View file

@ -45,12 +45,12 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
protected Icon icon;
public IconContainer(Surface parent) : base(parent)
public IconContainer(Surface parent, IEditorConfiguration editorConfiguration) : base(parent, editorConfiguration)
{
Init();
}
public IconContainer(Surface parent, string filename) : base(parent)
public IconContainer(Surface parent, string filename, IEditorConfiguration editorConfiguration) : base(parent, editorConfiguration)
{
Load(filename);
}

View file

@ -44,7 +44,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
{
public static readonly int MAX_CLICK_DISTANCE_TOLERANCE = 10;
public LineContainer(Surface parent) : base(parent)
public LineContainer(Surface parent, IEditorConfiguration editorConfiguration) : base(parent, editorConfiguration)
{
Init();
}

View file

@ -39,7 +39,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
[Serializable]
public class ObfuscateContainer : FilterContainer
{
public ObfuscateContainer(Surface parent) : base(parent)
public ObfuscateContainer(Surface parent, IEditorConfiguration editorConfiguration) : base(parent, editorConfiguration)
{
Init();
}
@ -83,10 +83,10 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
switch (preset)
{
case PreparedFilter.BLUR:
Add(new BlurFilter(this));
Add(new BlurFilter(this, _editorConfiguration));
break;
case PreparedFilter.PIXELIZE:
Add(new PixelizationFilter(this));
Add(new PixelizationFilter(this, _editorConfiguration));
break;
}
}

View file

@ -35,7 +35,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing {
[Serializable]
public class RectangleContainer : DrawableContainer {
public RectangleContainer(Surface parent) : base(parent) {
public RectangleContainer(Surface parent, IEditorConfiguration editorConfiguration) : base(parent, editorConfiguration) {
Init();
}

View file

@ -46,8 +46,8 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
{
private NativePoint _initialGripperPoint;
public SpeechbubbleContainer(Surface parent)
: base(parent)
public SpeechbubbleContainer(Surface parent, IEditorConfiguration editorConfiguration)
: base(parent, editorConfiguration)
{
}

View file

@ -50,7 +50,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
private float fontSize = 16;
public StepLabelContainer(Surface parent) : base(parent)
public StepLabelContainer(Surface parent, IEditorConfiguration editorConfiguration) : base(parent, editorConfiguration)
{
parent.AddStepLabel(this);
InitContent();

View file

@ -57,8 +57,6 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
public sealed class Surface : Control, ISurface, INotifyPropertyChanged
{
private static readonly LogSource Log = new LogSource();
// TODO: Solve, was static reference!
private static readonly ICoreConfiguration conf = new CoreConfigurationImpl();
/// <summary>
/// The number of Surfaces in existance
@ -70,7 +68,15 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
/// </summary>
private readonly IDrawableContainerList _elements;
[NonSerialized] private readonly Stack<IMemento> _redoStack = new Stack<IMemento>();
[NonSerialized]
private readonly IEditorConfiguration _editorConfiguration;
[NonSerialized]
private readonly ICoreConfiguration _coreConfiguration;
[NonSerialized]
private readonly Stack<IMemento> _redoStack = new Stack<IMemento>();
/// <summary>
/// all stepLabels for the surface, needed with serialization
@ -80,12 +86,14 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
/// <summary>
/// Undo/Redo stacks, should not be serialized as the file would be way to big
/// </summary>
[NonSerialized] private readonly Stack<IMemento> _undoStack = new Stack<IMemento>();
[NonSerialized]
private readonly Stack<IMemento> _undoStack = new Stack<IMemento>();
/// <summary>
/// all selected elements, do not serialize
/// </summary>
[NonSerialized] private readonly IDrawableContainerList selectedElements;
[NonSerialized]
private readonly IDrawableContainerList selectedElements;
/// <summary>
/// The buffer is only for drawing on it when using filters (to supply access)
@ -94,7 +102,8 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
/// The actual bitmap is in the paintbox...
/// TODO: Check if this buffer is still needed!
/// </summary>
[NonSerialized] private Bitmap _buffer;
[NonSerialized]
private Bitmap _buffer;
/// <summary>
/// This value is used to start counting the step labels
@ -104,7 +113,8 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
/// <summary>
/// the cropcontainer, when cropping this is set, do not serialize
/// </summary>
[NonSerialized] private IDrawableContainer _cropContainer;
[NonSerialized]
private IDrawableContainer _cropContainer;
/// <summary>
/// the cursor container, needed with serialization as we need a direct acces to it.
@ -114,14 +124,17 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
/// <summary>
/// the element we are drawing with, do not serialize
/// </summary>
[NonSerialized] private IDrawableContainer _drawingElement;
[NonSerialized]
private IDrawableContainer _drawingElement;
/// <summary>
/// current drawing mode, do not serialize!
/// </summary>
[NonSerialized] private DrawingModes _drawingMode = DrawingModes.None;
[NonSerialized]
private DrawingModes _drawingMode = DrawingModes.None;
[NonSerialized] private SurfaceDrawingModeEventHandler _drawingModeChanged;
[NonSerialized]
private SurfaceDrawingModeEventHandler _drawingModeChanged;
/// <summary>
/// all elements on the surface, needed with serialization
@ -136,22 +149,26 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
/// <summary>
/// inUndoRedo makes sure we don't undo/redo while in a undo/redo action
/// </summary>
[NonSerialized] private bool _inUndoRedo;
[NonSerialized]
private bool _inUndoRedo;
/// <summary>
/// Make only one surfacemove cycle undoable, see SurfaceMouseMove
/// </summary>
[NonSerialized] private bool _isSurfaceMoveMadeUndoable;
[NonSerialized]
private bool _isSurfaceMoveMadeUndoable;
/// <summary>
/// the keyslocked flag helps with focus issues
/// </summary>
[NonSerialized] private bool _keysLocked;
[NonSerialized]
private bool _keysLocked;
/// <summary>
/// Last save location, do not serialize!
/// </summary>
[NonSerialized] private string _lastSaveFullPath;
[NonSerialized]
private string _lastSaveFullPath;
/// <summary>
/// the modified flag specifies if the surface has had modifications after the last export.
@ -164,47 +181,56 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
/// <summary>
/// are we in a mouse down, do not serialize
/// </summary>
[NonSerialized] private bool _mouseDown;
[NonSerialized]
private bool _mouseDown;
/// <summary>
/// The selected element for the mouse down, do not serialize
/// </summary>
[NonSerialized] private IDrawableContainer _mouseDownElement;
[NonSerialized]
private IDrawableContainer _mouseDownElement;
/// <summary>
/// Location of the mouse-down (it "starts" here), do not serialize
/// </summary>
[NonSerialized] private NativePoint _mouseStart = NativePoint.Empty;
[NonSerialized]
private NativePoint _mouseStart = NativePoint.Empty;
[NonSerialized] private SurfaceElementEventHandler _movingElementChanged;
[NonSerialized]
private SurfaceElementEventHandler _movingElementChanged;
/// <summary>
/// Event handlers (do not serialize!)
/// </summary>
[NonSerialized] private PropertyChangedEventHandler _propertyChanged;
[NonSerialized]
private PropertyChangedEventHandler _propertyChanged;
[NonSerialized] private SurfaceMessageEventHandler _surfaceMessage;
[NonSerialized]
private SurfaceMessageEventHandler _surfaceMessage;
[NonSerialized] private SurfaceSizeChangeEventHandler _surfaceSizeChanged;
[NonSerialized]
private SurfaceSizeChangeEventHandler _surfaceSizeChanged;
/// <summary>
/// the brush which is used for transparent backgrounds, set by the editor, do not serialize
/// </summary>
[NonSerialized] private Brush _transparencyBackgroundBrush;
[NonSerialized]
private Brush _transparencyBackgroundBrush;
/// <summary>
/// the element we want to draw with (not yet drawn), do not serialize
/// </summary>
[NonSerialized] private IDrawableContainer _undrawnElement;
[NonSerialized]
private IDrawableContainer _undrawnElement;
// Property to identify the Surface ID
/// <summary>
/// Base Surface constructor
/// </summary>
public Surface()
public Surface(ICoreConfiguration coreConfiguration, IEditorConfiguration editorConfiguration)
{
_fieldAggregator = new FieldAggregator(this);
_fieldAggregator = new FieldAggregator(this, editorConfiguration);
Count++;
_elements = new DrawableContainerList(ID);
selectedElements = new DrawableContainerList(ID);
@ -234,7 +260,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
/// Surface constructor with an image
/// </summary>
/// <param name="newBitmap">Bitmap</param>
public Surface(Bitmap newBitmap) : this()
public Surface(ICoreConfiguration coreConfiguration, IEditorConfiguration editorConfiguration, Bitmap newBitmap) : this(coreConfiguration, editorConfiguration)
{
Log.Debug().WriteLine("Got Bitmap with dimensions {0} and format {1}", newBitmap.Size, newBitmap.PixelFormat);
SetBitmap(newBitmap, true);
@ -244,7 +270,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
/// Surface contructor with a capture
/// </summary>
/// <param name="capture"></param>
public Surface(ICapture capture) : this()
public Surface(ICoreConfiguration coreConfiguration, IEditorConfiguration editorConfiguration, ICapture capture) : this(coreConfiguration, editorConfiguration)
{
SetCapture(capture);
}
@ -1135,41 +1161,41 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
switch (DrawingMode)
{
case DrawingModes.Rect:
_undrawnElement = new RectangleContainer(this);
_undrawnElement = new RectangleContainer(this, _editorConfiguration);
break;
case DrawingModes.Ellipse:
_undrawnElement = new EllipseContainer(this);
_undrawnElement = new EllipseContainer(this, _editorConfiguration);
break;
case DrawingModes.Text:
_undrawnElement = new TextContainer(this);
_undrawnElement = new TextContainer(this, _editorConfiguration);
break;
case DrawingModes.SpeechBubble:
_undrawnElement = new SpeechbubbleContainer(this);
_undrawnElement = new SpeechbubbleContainer(this, _editorConfiguration);
break;
case DrawingModes.StepLabel:
_undrawnElement = new StepLabelContainer(this);
_undrawnElement = new StepLabelContainer(this, _editorConfiguration);
break;
case DrawingModes.Line:
_undrawnElement = new LineContainer(this);
_undrawnElement = new LineContainer(this, _editorConfiguration);
break;
case DrawingModes.Arrow:
_undrawnElement = new ArrowContainer(this);
_undrawnElement = new ArrowContainer(this, _editorConfiguration);
break;
case DrawingModes.Highlight:
_undrawnElement = new HighlightContainer(this);
_undrawnElement = new HighlightContainer(this, _editorConfiguration);
break;
case DrawingModes.Obfuscate:
_undrawnElement = new ObfuscateContainer(this);
_undrawnElement = new ObfuscateContainer(this, _editorConfiguration);
break;
case DrawingModes.Crop:
_cropContainer = new CropContainer(this);
_cropContainer = new CropContainer(this, _editorConfiguration);
_undrawnElement = _cropContainer;
break;
case DrawingModes.Bitmap:
_undrawnElement = new BitmapContainer(this);
_undrawnElement = new BitmapContainer(this, _editorConfiguration);
break;
case DrawingModes.Path:
_undrawnElement = new FreehandContainer(this);
_undrawnElement = new FreehandContainer(this, _editorConfiguration);
break;
case DrawingModes.None:
_undrawnElement = null;
@ -1190,7 +1216,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
NativeRect cropRectangle;
using (var tmpImage = GetBitmapForExport())
{
cropRectangle = tmpImage.FindAutoCropRectangle(conf.AutoCropDifference);
cropRectangle = tmpImage.FindAutoCropRectangle(_coreConfiguration.AutoCropDifference);
}
if (!IsCropPossible(ref cropRectangle))
{
@ -1880,7 +1906,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
public IBitmapContainer AddImageContainer(Bitmap bitmap, int x, int y)
{
var bitmapContainer = new BitmapContainer(this)
var bitmapContainer = new BitmapContainer(this, _editorConfiguration)
{
Bitmap = bitmap,
Left = x,
@ -1892,7 +1918,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
public IBitmapContainer AddImageContainer(string filename, int x, int y)
{
var bitmapContainer = new BitmapContainer(this);
var bitmapContainer = new BitmapContainer(this, _editorConfiguration);
bitmapContainer.Load(filename);
bitmapContainer.Left = x;
bitmapContainer.Top = y;
@ -1902,7 +1928,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
public IIconContainer AddIconContainer(Icon icon, int x, int y)
{
var iconContainer = new IconContainer(this)
var iconContainer = new IconContainer(this, _editorConfiguration)
{
Icon = icon,
Left = x,
@ -1914,7 +1940,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
public IIconContainer AddIconContainer(string filename, int x, int y)
{
var iconContainer = new IconContainer(this);
var iconContainer = new IconContainer(this, _editorConfiguration);
iconContainer.Load(filename);
iconContainer.Left = x;
iconContainer.Top = y;
@ -1924,7 +1950,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
public ICursorContainer AddCursorContainer(Cursor cursor, int x, int y)
{
var cursorContainer = new CursorContainer(this)
var cursorContainer = new CursorContainer(this, _editorConfiguration)
{
Cursor = cursor,
Left = x,
@ -1936,7 +1962,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
public ICursorContainer AddCursorContainer(string filename, int x, int y)
{
var cursorContainer = new CursorContainer(this);
var cursorContainer = new CursorContainer(this, _editorConfiguration);
cursorContainer.Load(filename);
cursorContainer.Left = x;
cursorContainer.Top = y;
@ -1947,7 +1973,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
public ITextContainer AddTextContainer(string text, HorizontalAlignment horizontalAlignment, VerticalAlignment verticalAlignment, FontFamily family, float size,
bool italic, bool bold, bool shadow, int borderSize, Color color, Color fillColor)
{
var textContainer = new TextContainer(this) {Text = text};
var textContainer = new TextContainer(this, _editorConfiguration) {Text = text};
textContainer.SetFieldValue(FieldTypes.FONT_FAMILY, family.Name);
textContainer.SetFieldValue(FieldTypes.FONT_BOLD, bold);
textContainer.SetFieldValue(FieldTypes.FONT_ITALIC, italic);

View file

@ -90,7 +90,7 @@ namespace Greenshot.Addon.LegacyEditor.Drawing
}
}
public TextContainer(Surface parent) : base(parent)
public TextContainer(Surface parent, IEditorConfiguration editorConfiguration) : base(parent, editorConfiguration)
{
Init();
}

View file

@ -106,7 +106,7 @@ namespace Greenshot.Addon.OCR
/// <param name="surface">Has the Image and the capture details</param>
public string DoOcr(ISurface surface)
{
var outputSettings = new SurfaceOutputSettings(OutputFormats.bmp, 0, true)
var outputSettings = new SurfaceOutputSettings(CoreConfiguration, OutputFormats.bmp, 0, true)
{
ReduceColors = true,
SaveBackgroundOnly = true

View file

@ -118,7 +118,7 @@ namespace Greenshot.Addon.Office.Destinations
var imageFile = captureDetails.Filename;
if (imageFile == null || surface.Modified || !Regex.IsMatch(imageFile, @".*(\.png|\.gif|\.jpg|\.jpeg|\.tiff|\.bmp)$"))
{
imageFile = ImageOutput.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings().PreventGreenshotFormat());
imageFile = ImageOutput.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings(CoreConfiguration).PreventGreenshotFormat());
createdFile = true;
}
if (_workbookName != null)

View file

@ -47,7 +47,8 @@ namespace Greenshot.Addon.Office.Destinations
[Destination("OneNote", DestinationOrder.OneNote)]
public class OneNoteDestination : AbstractDestination
{
private readonly ExportNotification _exportNotification;
private readonly OneNoteExporter _oneNoteExporter;
private readonly ExportNotification _exportNotification;
private const int IconApplication = 0;
private static readonly LogSource Log = new LogSource();
private readonly string _exePath;
@ -60,11 +61,13 @@ namespace Greenshot.Addon.Office.Destinations
/// <param name="greenshotLanguage">IGreenshotLanguage</param>
/// <param name="exportNotification">ExportNotification</param>
public OneNoteDestination(
OneNoteExporter oneNoteExporter,
ICoreConfiguration coreConfiguration,
IGreenshotLanguage greenshotLanguage,
ExportNotification exportNotification
) : base(coreConfiguration, greenshotLanguage)
{
this._oneNoteExporter = oneNoteExporter;
_exportNotification = exportNotification;
_exePath = PluginUtils.GetExePath("ONENOTE.EXE");
if (_exePath != null && !File.Exists(_exePath))
@ -80,11 +83,12 @@ namespace Greenshot.Addon.Office.Destinations
/// <param name="coreConfiguration">ICoreConfiguration</param>
/// <param name="greenshotLanguage">IGreenshotLanguage</param>
/// <param name="exportNotification">ExportNotification</param>
protected OneNoteDestination(OneNotePage page,
protected OneNoteDestination(OneNoteExporter oneNoteExporter,
OneNotePage page,
ICoreConfiguration coreConfiguration,
IGreenshotLanguage greenshotLanguage,
ExportNotification exportNotification
) : this(coreConfiguration, greenshotLanguage, exportNotification)
) : this(oneNoteExporter, coreConfiguration, greenshotLanguage, exportNotification)
{
_page = page;
}
@ -119,7 +123,7 @@ namespace Greenshot.Addon.Office.Destinations
{
try
{
return OneNoteExporter.GetPages().Where(currentPage => currentPage.IsCurrentlyViewed).Select(currentPage => new OneNoteDestination(currentPage, CoreConfiguration, GreenshotLanguage, _exportNotification));
return _oneNoteExporter.GetPages().Where(currentPage => currentPage.IsCurrentlyViewed).Select(currentPage => new OneNoteDestination(_oneNoteExporter, currentPage, CoreConfiguration, GreenshotLanguage, _exportNotification));
}
catch (COMException cEx)
{
@ -145,7 +149,7 @@ namespace Greenshot.Addon.Office.Destinations
{
try
{
exportInformation.ExportMade = OneNoteExporter.ExportToNewPage(surface);
exportInformation.ExportMade = _oneNoteExporter.ExportToNewPage(surface);
}
catch (Exception ex)
{
@ -157,7 +161,7 @@ namespace Greenshot.Addon.Office.Destinations
{
try
{
exportInformation.ExportMade = OneNoteExporter.ExportToPage(surface, _page);
exportInformation.ExportMade = _oneNoteExporter.ExportToPage(surface, _page);
}
catch (Exception ex)
{

View file

@ -172,7 +172,7 @@ namespace Greenshot.Addon.Office.Destinations
var tmpFile = captureDetails.Filename;
if (tmpFile == null || surface.Modified || !Regex.IsMatch(tmpFile, @".*(\.png|\.gif|\.jpg|\.jpeg|\.tiff|\.bmp)$"))
{
tmpFile = ImageOutput.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings().PreventGreenshotFormat());
tmpFile = ImageOutput.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings(CoreConfiguration).PreventGreenshotFormat());
}
else
{

View file

@ -141,7 +141,7 @@ namespace Greenshot.Addon.Office.Destinations
var imageSize = Size.Empty;
if (tmpFile == null || surface.Modified || !Regex.IsMatch(tmpFile, @".*(\.png|\.gif|\.jpg|\.jpeg|\.tiff|\.bmp)$"))
{
tmpFile = ImageOutput.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings().PreventGreenshotFormat());
tmpFile = ImageOutput.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings(CoreConfiguration).PreventGreenshotFormat());
imageSize = surface.Screenshot.Size;
}
if (_presentationName != null)

View file

@ -126,7 +126,7 @@ namespace Greenshot.Addon.Office.Destinations
var tmpFile = captureDetails.Filename;
if (tmpFile == null || surface.Modified || !Regex.IsMatch(tmpFile, @".*(\.png|\.gif|\.jpg|\.jpeg|\.tiff|\.bmp)$"))
{
tmpFile = ImageOutput.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings().PreventGreenshotFormat());
tmpFile = ImageOutput.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings(CoreConfiguration).PreventGreenshotFormat());
}
if (_documentCaption != null)
{

View file

@ -29,6 +29,7 @@ using Dapplo.Config.Language;
using Greenshot.Addon.Office.Configuration;
using Greenshot.Addon.Office.Configuration.Impl;
using Greenshot.Addon.Office.Destinations;
using Greenshot.Addon.Office.OfficeExport;
using Greenshot.Addon.Office.ViewModels;
using Greenshot.Addons.Components;
using Greenshot.Addons.Core;
@ -80,6 +81,11 @@ namespace Greenshot.Addon.Office
.RegisterType<OneNoteDestination>()
.As<IDestination>()
.SingleInstance();
builder
.RegisterType<OneNoteExporter>()
.AsSelf()
.SingleInstance();
}
if (PluginUtils.GetExePath("OUTLOOK.EXE") != null)

View file

@ -45,19 +45,25 @@ namespace Greenshot.Addon.Office.OfficeExport
/// OneNote exporter
/// More details about OneNote: http://msdn.microsoft.com/en-us/magazine/ff796230.aspx
/// </summary>
public static class OneNoteExporter
public class OneNoteExporter
{
private const string XmlImageContent = "<one:Image format=\"png\"><one:Size width=\"{1}.0\" height=\"{2}.0\" isSetByUser=\"true\" /><one:Data>{0}</one:Data></one:Image>";
private const string XmlOutline = "<?xml version=\"1.0\"?><one:Page xmlns:one=\"{2}\" ID=\"{1}\"><one:Title><one:OE><one:T><![CDATA[{3}]]></one:T></one:OE></one:Title>{0}</one:Page>";
private const string OnenoteNamespace2010 = "http://schemas.microsoft.com/office/onenote/2010/onenote";
private static readonly LogSource Log = new LogSource();
private readonly ICoreConfiguration _coreConfiguration;
public OneNoteExporter(ICoreConfiguration coreConfiguration)
{
_coreConfiguration = coreConfiguration;
}
/// <summary>
/// Create a new page in the "unfiled notes section", with the title of the capture, and export the capture there.
/// </summary>
/// <param name="surfaceToUpload">ISurface</param>
/// <returns>bool true if export worked</returns>
public static bool ExportToNewPage(ISurface surfaceToUpload)
public bool ExportToNewPage(ISurface surfaceToUpload)
{
using (var oneNoteApplication = GetOrCreateOneNoteApplication())
{
@ -83,7 +89,7 @@ namespace Greenshot.Addon.Office.OfficeExport
/// <param name="surfaceToUpload">ISurface</param>
/// <param name="page">OneNotePage</param>
/// <returns>bool true if everything worked</returns>
public static bool ExportToPage(ISurface surfaceToUpload, OneNotePage page)
public bool ExportToPage(ISurface surfaceToUpload, OneNotePage page)
{
using (var oneNoteApplication = GetOrCreateOneNoteApplication())
{
@ -98,7 +104,7 @@ namespace Greenshot.Addon.Office.OfficeExport
/// <param name="surfaceToUpload">ISurface</param>
/// <param name="page">OneNotePage</param>
/// <returns>bool true if everything worked</returns>
private static bool ExportToPage(IDisposableCom<Application> oneNoteApplication, ISurface surfaceToUpload, OneNotePage page)
private bool ExportToPage(IDisposableCom<Application> oneNoteApplication, ISurface surfaceToUpload, OneNotePage page)
{
if (oneNoteApplication == null)
{
@ -107,7 +113,7 @@ namespace Greenshot.Addon.Office.OfficeExport
using (var pngStream = new MemoryStream())
{
var pngOutputSettings = new SurfaceOutputSettings(OutputFormats.png, 100, false);
var pngOutputSettings = new SurfaceOutputSettings(_coreConfiguration, OutputFormats.png, 100, false);
ImageOutput.SaveToStream(surfaceToUpload, pngStream, pngOutputSettings);
var base64String = Convert.ToBase64String(pngStream.GetBuffer());
var imageXmlStr = string.Format(XmlImageContent, base64String, surfaceToUpload.Screenshot.Width, surfaceToUpload.Screenshot.Height);
@ -130,7 +136,7 @@ namespace Greenshot.Addon.Office.OfficeExport
/// Call this to get the running Excel application, returns null if there isn't any.
/// </summary>
/// <returns>ComDisposable for Excel.Application or null</returns>
private static IDisposableCom<Application> GetOneNoteApplication()
private IDisposableCom<Application> GetOneNoteApplication()
{
IDisposableCom<Application> oneNoteApplication;
try
@ -149,7 +155,7 @@ namespace Greenshot.Addon.Office.OfficeExport
/// Call this to get the running OneNote application, or create a new instance
/// </summary>
/// <returns>ComDisposable for OneNote.Application</returns>
private static IDisposableCom<Application> GetOrCreateOneNoteApplication()
private IDisposableCom<Application> GetOrCreateOneNoteApplication()
{
var oneNoteApplication = GetOneNoteApplication();
if (oneNoteApplication == null)
@ -163,7 +169,7 @@ namespace Greenshot.Addon.Office.OfficeExport
/// Get the captions of all the open word documents
/// </summary>
/// <returns></returns>
public static IList<OneNotePage> GetPages()
public IList<OneNotePage> GetPages()
{
var pages = new List<OneNotePage>();
try
@ -276,7 +282,7 @@ namespace Greenshot.Addon.Office.OfficeExport
/// <param name="oneNoteApplication"></param>
/// <param name="specialLocation">SpecialLocation</param>
/// <returns>string with section ID</returns>
private static string GetSectionId(IDisposableCom<Application> oneNoteApplication, SpecialLocation specialLocation)
private string GetSectionId(IDisposableCom<Application> oneNoteApplication, SpecialLocation specialLocation)
{
if (oneNoteApplication == null)
{

View file

@ -21,6 +21,7 @@
using Autofac;
using Dapplo.Addons;
using Greenshot.Addons.Interfaces;
using Dapplo.Windows.Common;
using Greenshot.Addons.Components;
@ -37,6 +38,14 @@ namespace Greenshot.Addon.Win10
.RegisterType<Win10OcrDestination>()
.As<IDestination>()
.SingleInstance();
#if !NETCOREAPP3_0
builder
.RegisterType<Win10FormEnhancer>()
.As<IFormEnhancer>()
.SingleInstance();
#endif
builder
.RegisterType<Win10ShareDestination>()
.As<IDestination>()

View file

@ -0,0 +1,85 @@
#region Greenshot GNU General Public License
// Greenshot - a free and open source screenshot tool
// Copyright (C) 2007-2018 Thomas Braun, Jens Klingen, Robin Krom
//
// For more information see: http://getgreenshot.org/
// The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 1 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#endregion
#if !NETCOREAPP3_0
using System;
using System.Windows.Forms;
using Greenshot.Addons.Interfaces;
using Microsoft.Toolkit.Forms.UI.XamlHost;
namespace Greenshot.Addon.Win10
{
public class Win10FormEnhancer : IFormEnhancer
{
private WindowsXamlHost inkCanvasHost;
private WindowsXamlHost inkToolbarHost;
private Windows.UI.Xaml.Controls.InkCanvas inkCanvas;
private Windows.UI.Xaml.Controls.InkToolbar inkToolbar;
public void InitializeComponent(Form target)
{
// InkCanvas
inkCanvasHost = new WindowsXamlHost();
inkCanvasHost.InitialTypeName = "Windows.UI.Xaml.Controls.InkCanvas";
inkCanvasHost.ChildChanged += InkCanvas_ChildChanged;
// InkToolbar
inkToolbarHost = new WindowsXamlHost();
inkToolbarHost.InitialTypeName = "Windows.UI.Xaml.Controls.InkToolbar";
inkToolbarHost.ChildChanged += InkToolbar_ChildChanged;
// Layout
inkToolbarHost.Top = 0;
inkToolbarHost.Left = 0;
inkToolbarHost.Height = 50;
inkToolbarHost.Dock = DockStyle.Top;
inkCanvasHost.Dock = DockStyle.Fill;
// Add to Window
target.Controls.Add(inkToolbarHost);
target.Controls.Add(inkCanvasHost);
}
private void InkToolbar_ChildChanged(object sender, EventArgs e)
{
inkToolbar = ((WindowsXamlHost)sender).Child as Windows.UI.Xaml.Controls.InkToolbar;
InitializeUwpControls();
}
private void InkCanvas_ChildChanged(object sender, EventArgs e)
{
inkCanvas = ((WindowsXamlHost)sender).Child as Windows.UI.Xaml.Controls.InkCanvas;
InitializeUwpControls();
}
private void InitializeUwpControls()
{
if (inkToolbar == null || inkCanvas == null)
{
return;
}
inkToolbar.TargetInkCanvas = inkCanvas;
}
}
}
#endif

View file

@ -84,7 +84,7 @@ namespace Greenshot.Addon.Win10
var ocrEngine = OcrEngine.TryCreateFromUserProfileLanguages();
using (var imageStream = new MemoryStream())
{
ImageOutput.SaveToStream(surface, imageStream, new SurfaceOutputSettings());
ImageOutput.SaveToStream(surface, imageStream, new SurfaceOutputSettings(CoreConfiguration));
imageStream.Position = 0;
var decoder = await BitmapDecoder.CreateAsync(imageStream.AsRandomAccessStream());

View file

@ -159,7 +159,7 @@ namespace Greenshot.Addon.Win10
using (var logoStream = new MemoryRandomAccessStream())
using (var thumbnailStream = new MemoryRandomAccessStream())
{
var outputSettings = new SurfaceOutputSettings();
var outputSettings = new SurfaceOutputSettings(CoreConfiguration);
outputSettings.PreventGreenshotFormat();
// Create capture for export

View file

@ -26,6 +26,7 @@ using System.Collections.Generic;
using System.Drawing;
using System.Windows;
using Dapplo.Config.Ini;
using Dapplo.Log;
using Dapplo.Windows.Common.Structs;
using Dapplo.Windows.User32.Structs;
using Greenshot.Addons.Core;

View file

@ -648,7 +648,7 @@ EndSelection:<<<<<<<4
var disposeImage = false;
try
{
var outputSettings = new SurfaceOutputSettings(OutputFormats.png, 100, false);
var outputSettings = new SurfaceOutputSettings(CoreConfig, OutputFormats.png, 100, false);
// Create the image which is going to be saved so we don't create it multiple times
disposeImage = ImageOutput.CreateBitmapFromSurface(surface, outputSettings, out bitmapToSave);
try
@ -658,7 +658,7 @@ EndSelection:<<<<<<<4
{
pngStream = new MemoryStream();
// PNG works for e.g. Powerpoint
var pngOutputSettings = new SurfaceOutputSettings(OutputFormats.png, 100, false);
var pngOutputSettings = new SurfaceOutputSettings(CoreConfig, OutputFormats.png, 100, false);
ImageOutput.SaveToStream(bitmapToSave, null, pngStream, pngOutputSettings);
pngStream.Seek(0, SeekOrigin.Begin);
// Set the PNG stream
@ -677,7 +677,7 @@ EndSelection:<<<<<<<4
using (var tmpBmpStream = new MemoryStream())
{
// Save image as BMP
var bmpOutputSettings = new SurfaceOutputSettings(OutputFormats.bmp, 100, false);
var bmpOutputSettings = new SurfaceOutputSettings(CoreConfig, OutputFormats.bmp, 100, false);
ImageOutput.SaveToStream(bitmapToSave, null, tmpBmpStream, bmpOutputSettings);
dibStream = new MemoryStream();
@ -736,7 +736,7 @@ EndSelection:<<<<<<<4
// Set the HTML
if (CoreConfig.ClipboardFormats.Contains(ClipboardFormats.HTML))
{
var tmpFile = ImageOutput.SaveToTmpFile(surface, new SurfaceOutputSettings(OutputFormats.png, 100, false), null);
var tmpFile = ImageOutput.SaveToTmpFile(surface, new SurfaceOutputSettings(CoreConfig, OutputFormats.png, 100, false), null);
var html = GetHtmlString(surface, tmpFile);
dataObject.SetText(html, TextDataFormat.Html);
}
@ -745,7 +745,7 @@ EndSelection:<<<<<<<4
string html;
using (var tmpPngStream = new MemoryStream())
{
var pngOutputSettings = new SurfaceOutputSettings(OutputFormats.png, 100, false)
var pngOutputSettings = new SurfaceOutputSettings(CoreConfig, OutputFormats.png, 100, false)
{
// Do not allow to reduce the colors, some applications dislike 256 color images
// reported with bug #3594681

View file

@ -28,6 +28,7 @@ using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using Dapplo.Log;
using Greenshot.Addons.Core.Enums;
#endregion
@ -39,6 +40,8 @@ namespace Greenshot.Addons.Core
/// </summary>
public static class CoreConfigurationExtensions
{
private static readonly LogSource Log = new LogSource();
/// <summary>
/// Validate the values in the ICoreConfiguration, correct them where needed
/// </summary>
@ -194,6 +197,30 @@ namespace Greenshot.Addons.Core
coreConfiguration.WebRequestReadWriteTimeout = 100;
}
// TitleFix processor
var corruptKeys = new List<string>();
foreach (var key in coreConfiguration.ActiveTitleFixes)
{
if (coreConfiguration.TitleFixMatcher.ContainsKey(key))
{
continue;
}
Log.Warn().WriteLine("Key {0} not found, configuration is broken! Disabling this key!", key);
corruptKeys.Add(key);
}
// Fix configuration if needed
if (corruptKeys.Count <= 0)
{
return;
}
foreach (var corruptKey in corruptKeys)
{
// Removing any reference to the key
coreConfiguration.ActiveTitleFixes.Remove(corruptKey);
coreConfiguration.TitleFixMatcher.Remove(corruptKey);
coreConfiguration.TitleFixReplacer.Remove(corruptKey);
}
coreConfiguration.ValidateAndCorrect();
}
}

View file

@ -136,7 +136,7 @@ namespace Greenshot.Addons.Core
try
{
var fileNameWithExtension = saveImageFileDialog.FileNameWithExtension;
var outputSettings = new SurfaceOutputSettings(FormatForFilename(fileNameWithExtension));
var outputSettings = new SurfaceOutputSettings(CoreConfig, FormatForFilename(fileNameWithExtension));
if (CoreConfig.OutputFilePromptQuality)
{
// TODO: Resolve, was static reference

View file

@ -1,99 +0,0 @@
#region Greenshot GNU General Public License
// Greenshot - a free and open source screenshot tool
// Copyright (C) 2007-2018 Thomas Braun, Jens Klingen, Robin Krom
//
// For more information see: http://getgreenshot.org/
// The Greenshot project is hosted on GitHub https://github.com/greenshot/greenshot
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 1 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
#endregion
#region Usings
using System;
using System.Collections.Generic;
using System.Threading;
using Dapplo.Log;
using Greenshot.Addons.Interfaces;
#endregion
namespace Greenshot.Addons.Core
{
/// <summary>
/// Description of InterfaceUtils.
/// </summary>
public static class InterfaceUtils
{
private static readonly LogSource Log = new LogSource();
public static List<Type> GetSubclassesOf(Type type, bool excludeSystemTypes)
{
var list = new List<Type>();
foreach (var currentAssembly in Thread.GetDomain().GetAssemblies())
{
try
{
var types = currentAssembly.GetTypes();
if (!excludeSystemTypes || excludeSystemTypes && !currentAssembly.FullName.StartsWith("System."))
{
foreach (var currentType in types)
{
if (type.IsInterface)
{
if (currentType.GetInterface(type.FullName) != null)
{
list.Add(currentType);
}
}
else if (currentType.IsSubclassOf(type))
{
list.Add(currentType);
}
}
}
}
catch (Exception ex)
{
Log.Warn().WriteLine("Problem getting subclasses of type: {0}, message: {1}", type.FullName, ex.Message);
}
}
return list;
}
public static List<IProcessor> GetProcessors()
{
var processors = new List<IProcessor>();
foreach (var processorType in GetSubclassesOf(typeof(IProcessor), true))
{
if (!processorType.IsAbstract)
{
var processor = (IProcessor) Activator.CreateInstance(processorType);
if (processor.IsActive)
{
Log.Debug().WriteLine("Found processor {0} with designation {1}", processorType.Name, processor.Designation);
processors.Add(processor);
}
else
{
Log.Debug().WriteLine("Ignoring processor {0} with designation {1}", processorType.Name, processor.Designation);
}
}
}
return processors;
}
}
}

View file

@ -195,12 +195,12 @@ namespace Greenshot.Addons.Extensions
/// </summary>
/// <param name="clipboardAccessToken">IClipboardAccessToken</param>
/// <param name="surface">ISurface</param>
public static void SetAsFormat17(this IClipboardAccessToken clipboardAccessToken, ISurface surface)
public static void SetAsFormat17(this IClipboardAccessToken clipboardAccessToken, ISurface surface, ICoreConfiguration coreConfiguration)
{
// Create the stream for the clipboard
using (var dibV5Stream = new MemoryStream())
{
var outputSettings = new SurfaceOutputSettings(OutputFormats.bmp, 100, false);
var outputSettings = new SurfaceOutputSettings(coreConfiguration, OutputFormats.bmp, 100, false);
bool dispose = ImageOutput.CreateBitmapFromSurface(surface, outputSettings, out var bitmapToSave);
// Create the BITMAPINFOHEADER
var header = BitmapInfoHeader.Create(bitmapToSave.Width, bitmapToSave.Height, 32);
@ -269,11 +269,11 @@ namespace Greenshot.Addons.Extensions
/// </summary>
/// <param name="clipboardAccessToken">IClipboardAccessToken</param>
/// <param name="surface">ISurface</param>
public static void SetAsDeviceIndependendBitmap(this IClipboardAccessToken clipboardAccessToken, ISurface surface)
public static void SetAsDeviceIndependendBitmap(this IClipboardAccessToken clipboardAccessToken, ISurface surface, ICoreConfiguration coreConfiguration)
{
using (var bitmapStream = new MemoryStream())
{
ImageOutput.SaveToStream(surface, bitmapStream, new SurfaceOutputSettings{Format = OutputFormats.bmp});
ImageOutput.SaveToStream(surface, bitmapStream, new SurfaceOutputSettings(coreConfiguration) {Format = OutputFormats.bmp});
bitmapStream.Seek(Marshal.SizeOf(typeof(BitmapFileHeader)), SeekOrigin.Begin);
// Set the stream
clipboardAccessToken.SetAsStream(StandardClipboardFormats.DeviceIndependentBitmap, bitmapStream);

View file

@ -136,9 +136,9 @@ EndSelection:<<<<<<<4
/// </summary>
/// <param name="clipboardAccessToken">IClipboardAccessToken</param>
/// <param name="surface">ISurface</param>
public static void SetAsHtml(this IClipboardAccessToken clipboardAccessToken, ISurface surface)
public static void SetAsHtml(this IClipboardAccessToken clipboardAccessToken, ISurface surface, ICoreConfiguration coreConfiguration)
{
var pngOutputSettings = new SurfaceOutputSettings(OutputFormats.png, 100, false);
var pngOutputSettings = new SurfaceOutputSettings(coreConfiguration, OutputFormats.png, 100, false);
// This file is automatically deleted when Greenshot exits.
var filename = ImageOutput.SaveNamedTmpFile(surface, surface.CaptureDetails, pngOutputSettings);
// Set the PNG stream
@ -152,11 +152,11 @@ EndSelection:<<<<<<<4
/// </summary>
/// <param name="clipboardAccessToken">IClipboardAccessToken</param>
/// <param name="surface">ISurface</param>
public static void SetAsEmbeddedHtml(this IClipboardAccessToken clipboardAccessToken, ISurface surface)
public static void SetAsEmbeddedHtml(this IClipboardAccessToken clipboardAccessToken, ISurface surface, ICoreConfiguration coreConfiguration)
{
using (var pngStream = new MemoryStream())
{
var pngOutputSettings = new SurfaceOutputSettings(OutputFormats.png, 100, false);
var pngOutputSettings = new SurfaceOutputSettings(coreConfiguration, OutputFormats.png, 100, false);
ImageOutput.SaveToStream(surface, pngStream, pngOutputSettings);
pngStream.Seek(0, SeekOrigin.Begin);
// Set the PNG stream

View file

@ -0,0 +1,16 @@
using System.Windows.Forms;
namespace Greenshot.Addons.Interfaces
{
/// <summary>
/// This interface makes it possible to enhance forms by e.g. injecting components
/// </summary>
public interface IFormEnhancer
{
/// <summary>
/// This is called during the InitializeComponent of the form
/// </summary>
/// <param name="target">Form</param>
void InitializeComponent(Form target);
}
}

View file

@ -35,38 +35,32 @@ namespace Greenshot.Addons.Interfaces.Plugin
{
public class SurfaceOutputSettings
{
// TODO: Solve, was static reference!
private static readonly ICoreConfiguration CoreConfig = new CoreConfigurationImpl();
private bool _disableReduceColors;
private bool _reduceColors;
public SurfaceOutputSettings()
public SurfaceOutputSettings(IFileConfiguration fileConfiguration)
{
_disableReduceColors = false;
Format = CoreConfig.OutputFileFormat;
JPGQuality = CoreConfig.OutputFileJpegQuality;
ReduceColors = CoreConfig.OutputFileReduceColors;
Format = fileConfiguration.OutputFileFormat;
JPGQuality = fileConfiguration.OutputFileJpegQuality;
ReduceColors = fileConfiguration.OutputFileReduceColors;
}
public SurfaceOutputSettings(OutputFormats format) : this()
public SurfaceOutputSettings(IFileConfiguration fileConfiguration, OutputFormats format) : this(fileConfiguration)
{
Format = format;
}
public SurfaceOutputSettings(OutputFormats format, int quality) : this(format)
public SurfaceOutputSettings(IFileConfiguration fileConfiguration, OutputFormats format, int quality) : this(fileConfiguration, format)
{
JPGQuality = quality;
}
public SurfaceOutputSettings(OutputFormats format, int quality, bool reduceColors) : this(format, quality)
public SurfaceOutputSettings(IFileConfiguration fileConfiguration, OutputFormats format, int quality, bool reduceColors) : this(fileConfiguration, format, quality)
{
ReduceColors = reduceColors;
}
public SurfaceOutputSettings(IFileConfiguration fileConfiguration) : this(fileConfiguration.OutputFileFormat, fileConfiguration.OutputFileJpegQuality, fileConfiguration.OutputFileReduceColors)
{
}
public OutputFormats Format { get; set; }
public int JPGQuality { get; set; }

View file

@ -170,6 +170,7 @@ Global
{9801F62C-540F-4BFE-9211-6405DEDE563B}.Debug|x86.ActiveCfg = Debug|Any CPU
{9801F62C-540F-4BFE-9211-6405DEDE563B}.Debug|x86.Build.0 = Debug|Any CPU
{9801F62C-540F-4BFE-9211-6405DEDE563B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9801F62C-540F-4BFE-9211-6405DEDE563B}.Release|Any CPU.Build.0 = Release|Any CPU
{9801F62C-540F-4BFE-9211-6405DEDE563B}.Release|x86.ActiveCfg = Release|Any CPU
{9801F62C-540F-4BFE-9211-6405DEDE563B}.Release|x86.Build.0 = Release|Any CPU
{D106F86C-CD3D-44FF-B151-2A5D47268B5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU

View file

@ -26,6 +26,7 @@
#region Usings
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Principal;
@ -60,6 +61,7 @@ namespace Greenshot.Components
private readonly HotkeyService _hotkeyService;
private readonly DestinationHolder _destinationHolder;
private ServiceHost _host;
private IEnumerable<IFormEnhancer> _formEnhancers;
public static string Identity
{
@ -75,8 +77,10 @@ namespace Greenshot.Components
ICoreConfiguration coreConfiguration,
MainForm mainForm,
HotkeyService hotkeyService,
DestinationHolder destinationHolder)
DestinationHolder destinationHolder,
IEnumerable<IFormEnhancer> formEnhancers = null)
{
_formEnhancers = formEnhancers;
_coreConfiguration = coreConfiguration;
_mainForm = mainForm;
_hotkeyService = hotkeyService;
@ -137,7 +141,7 @@ namespace Greenshot.Components
Log.Debug().WriteLine("Open file requested: {0}", filename);
if (File.Exists(filename))
{
CaptureHelper.CaptureFile(filename);
CaptureHelper.CaptureFile(_formEnhancers, filename);
}
else
{
@ -167,13 +171,13 @@ namespace Greenshot.Components
switch (captureMode.ToLower())
{
case "region":
CaptureHelper.CaptureRegion(false, destination);
CaptureHelper.CaptureRegion(_formEnhancers, false, destination);
break;
case "window":
CaptureHelper.CaptureWindow(false, destination);
CaptureHelper.CaptureWindow(_formEnhancers, false, destination);
break;
case "fullscreen":
CaptureHelper.CaptureFullscreen(false, ScreenCaptureMode.FullScreen, destination);
CaptureHelper.CaptureFullscreen(_formEnhancers, false, ScreenCaptureMode.FullScreen, destination);
break;
default:
Log.Warn().WriteLine("Unknown capture option");

View file

@ -22,12 +22,14 @@
#endregion
using System;
using System.Collections.Generic;
using System.Reactive.Linq;
using Caliburn.Micro;
using Dapplo.Addons;
using Dapplo.Log;
using Dapplo.Windows.Input.Keyboard;
using Greenshot.Addons.Core;
using Greenshot.Addons.Interfaces;
using Greenshot.Helpers;
namespace Greenshot.Components
@ -40,11 +42,13 @@ namespace Greenshot.Components
{
private static readonly LogSource Log = new LogSource();
private readonly ICoreConfiguration _coreConfiguration;
private readonly IEnumerable<IFormEnhancer> _formEnhancers;
private IDisposable _subscriptions;
public HotkeyService(ICoreConfiguration coreConfiguration)
public HotkeyService(ICoreConfiguration coreConfiguration, IEnumerable<IFormEnhancer> formEnhancers = null)
{
_coreConfiguration = coreConfiguration;
_formEnhancers = formEnhancers;
}
/// <summary>
@ -116,36 +120,36 @@ namespace Greenshot.Components
private void CaptureRegion(KeyboardHookEventArgs keyboardHookEventArgs)
{
Execute.BeginOnUIThread(() => CaptureHelper.CaptureRegion(true));
Execute.BeginOnUIThread(() => CaptureHelper.CaptureRegion(_formEnhancers, true));
}
private void CaptureWindow(KeyboardHookEventArgs keyboardHookEventArgs)
{
if (_coreConfiguration.CaptureWindowsInteractive)
{
Execute.BeginOnUIThread(() => CaptureHelper.CaptureWindowInteractive(true));
Execute.BeginOnUIThread(() => CaptureHelper.CaptureWindowInteractive(_formEnhancers, true));
}
else
{
Execute.BeginOnUIThread(() => CaptureHelper.CaptureWindow(true));
Execute.BeginOnUIThread(() => CaptureHelper.CaptureWindow(_formEnhancers, true));
}
}
private void CaptureFullscreen(KeyboardHookEventArgs keyboardHookEventArgs)
{
Execute.BeginOnUIThread(() => CaptureHelper.CaptureFullscreen(true, _coreConfiguration.ScreenCaptureMode));
Execute.BeginOnUIThread(() => CaptureHelper.CaptureFullscreen(_formEnhancers, true, _coreConfiguration.ScreenCaptureMode));
}
private void CaptureLast(KeyboardHookEventArgs keyboardHookEventArgs)
{
Execute.BeginOnUIThread(() => CaptureHelper.CaptureLastRegion(true));
Execute.BeginOnUIThread(() => CaptureHelper.CaptureLastRegion(_formEnhancers, true));
}
private void CaptureIe(KeyboardHookEventArgs keyboardHookEventArgs)
{
if (_coreConfiguration.IECapture)
{
Execute.BeginOnUIThread(() => CaptureHelper.CaptureIe(true, null));
Execute.BeginOnUIThread(() => CaptureHelper.CaptureIe(_formEnhancers, true, null));
}
}
}

View file

@ -83,22 +83,22 @@ namespace Greenshot.Destinations
switch (clipboardFormat)
{
case ClipboardFormats.DIB:
clipboardAccessToken.SetAsDeviceIndependendBitmap(surface);
clipboardAccessToken.SetAsDeviceIndependendBitmap(surface, CoreConfiguration);
break;
case ClipboardFormats.DIBV5:
clipboardAccessToken.SetAsFormat17(surface);
clipboardAccessToken.SetAsFormat17(surface, CoreConfiguration);
break;
case ClipboardFormats.PNG:
clipboardAccessToken.SetAsBitmap(surface, new SurfaceOutputSettings(OutputFormats.png));
clipboardAccessToken.SetAsBitmap(surface, new SurfaceOutputSettings(CoreConfiguration, OutputFormats.png));
break;
case ClipboardFormats.BITMAP:
clipboardAccessToken.SetAsBitmap(surface, new SurfaceOutputSettings(OutputFormats.bmp));
clipboardAccessToken.SetAsBitmap(surface, new SurfaceOutputSettings(CoreConfiguration, OutputFormats.bmp));
break;
case ClipboardFormats.HTML:
clipboardAccessToken.SetAsHtml(surface);
clipboardAccessToken.SetAsHtml(surface, CoreConfiguration);
break;
case ClipboardFormats.HTMLDATAURL:
clipboardAccessToken.SetAsEmbeddedHtml(surface);
clipboardAccessToken.SetAsEmbeddedHtml(surface, CoreConfiguration);
break;
}
}

View file

@ -70,7 +70,7 @@ namespace Greenshot.Destinations
bool overwrite;
string fullPath;
// Get output settings from the configuration
var outputSettings = new SurfaceOutputSettings();
var outputSettings = new SurfaceOutputSettings(CoreConfiguration);
if (captureDetails?.Filename != null)
{

View file

@ -67,6 +67,15 @@ namespace Greenshot.Forms {
this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.CaptureFormKeyDown);
this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.CaptureFormKeyUp);
this.Visible = false;
if (_formEnhancers != null)
{
foreach (var enhancer in _formEnhancers)
{
enhancer.InitializeComponent(this);
}
}
this.ResumeLayout(false);
}
}

View file

@ -64,6 +64,7 @@ namespace Greenshot.Forms
private readonly ICapture _capture;
private readonly bool _isZoomerTransparent;
private readonly IList<IInteropWindow> _windows;
private readonly IEnumerable<IFormEnhancer> _formEnhancers;
private NativeRect _captureRect = NativeRect.Empty;
private NativePoint _cursorPos;
private FixMode _fixMode = FixMode.None;
@ -94,7 +95,7 @@ namespace Greenshot.Forms
/// <param name="coreConfiguration">ICoreConfiguration</param>
/// <param name="capture">ICapture</param>
/// <param name="windows">IList of IInteropWindow</param>
public CaptureForm(ICoreConfiguration coreConfiguration, ICapture capture, IList<IInteropWindow> windows) : base(coreConfiguration, null)
public CaptureForm(ICoreConfiguration coreConfiguration, ICapture capture, IList<IInteropWindow> windows, IEnumerable<IFormEnhancer> formEnhancers) : base(coreConfiguration, null)
{
_isZoomerTransparent = _coreConfiguration.ZoomerOpacity < 1;
ManualLanguageApply = true;
@ -105,6 +106,7 @@ namespace Greenshot.Forms
_capture = capture;
_windows = windows;
_formEnhancers = formEnhancers;
UsedCaptureMode = capture.CaptureDetails.CaptureMode;
//

View file

@ -62,6 +62,7 @@ using Screen = System.Windows.Forms.Screen;
using Dapplo.Config.Ini;
using Dapplo.Windows.User32;
using Greenshot.Addons.Resources;
using Greenshot.Addons.Interfaces;
#endregion
@ -83,6 +84,8 @@ namespace Greenshot.Forms
private readonly Timer _doubleClickTimer = new Timer();
private readonly DestinationHolder _destinationHolder;
private readonly IEnumerable<IFormEnhancer> _formEnhancers;
// Thumbnail preview
private ThumbnailForm _thumbnailForm;
@ -94,7 +97,9 @@ namespace Greenshot.Forms
GreenshotResources greenshotResources,
Func<Owned<ConfigViewModel>> configViewModelFactory,
Func<Owned<AboutForm>> aboutFormFactory,
DestinationHolder destinationHolder) : base(greenshotLanguage)
DestinationHolder destinationHolder,
IEnumerable<IFormEnhancer> formEnhancers = null
) : base(greenshotLanguage)
{
_coreConfiguration = coreConfiguration;
_windowManager = windowManager;
@ -102,6 +107,7 @@ namespace Greenshot.Forms
_configViewModelFactory = configViewModelFactory;
_aboutFormFactory = aboutFormFactory;
_destinationHolder = destinationHolder;
_formEnhancers = formEnhancers;
Instance = this;
}
@ -281,7 +287,7 @@ namespace Greenshot.Forms
if (File.Exists(_coreConfiguration.OutputFileAsFullpath))
{
CaptureHelper.CaptureFile(_coreConfiguration.OutputFileAsFullpath, _destinationHolder.SortedActiveDestinations.Find("Editor"));
CaptureHelper.CaptureFile(_formEnhancers, _coreConfiguration.OutputFileAsFullpath, _destinationHolder.SortedActiveDestinations.Find("Editor"));
}
break;
case ClickActions.OPEN_SETTINGS:
@ -453,7 +459,7 @@ namespace Greenshot.Forms
if (File.Exists(openFileDialog.FileName))
{
CaptureHelper.CaptureFile(openFileDialog.FileName);
CaptureHelper.CaptureFile(_formEnhancers, openFileDialog.FileName);
}
}
@ -461,7 +467,7 @@ namespace Greenshot.Forms
{
if (_coreConfiguration.IECapture)
{
CaptureHelper.CaptureIe(true, null);
CaptureHelper.CaptureIe(_formEnhancers, true, null);
}
}
@ -600,7 +606,7 @@ namespace Greenshot.Forms
var allScreensBounds = DisplayInfo.ScreenBounds;
var captureScreenItem = new ToolStripMenuItem(_greenshotLanguage.ContextmenuCapturefullscreenAll);
captureScreenItem.Click += (o, args) => BeginInvoke((MethodInvoker) (() => CaptureHelper.CaptureFullscreen(false, ScreenCaptureMode.FullScreen)));
captureScreenItem.Click += (o, args) => BeginInvoke((MethodInvoker) (() => CaptureHelper.CaptureFullscreen(_formEnhancers, false, ScreenCaptureMode.FullScreen)));
captureScreenMenuItem.DropDownItems.Add(captureScreenItem);
foreach (var displayInfo in DisplayInfo.AllDisplayInfos)
{
@ -623,7 +629,7 @@ namespace Greenshot.Forms
deviceAlignment += " " + _greenshotLanguage.ContextmenuCapturefullscreenRight;
}
captureScreenItem = new ToolStripMenuItem(deviceAlignment);
captureScreenItem.Click += (o, args) => BeginInvoke((MethodInvoker) (() => CaptureHelper.CaptureRegion(false, screenToCapture.Bounds)));
captureScreenItem.Click += (o, args) => BeginInvoke((MethodInvoker) (() => CaptureHelper.CaptureRegion(_formEnhancers, false, screenToCapture.Bounds)));
captureScreenMenuItem.DropDownItems.Add(captureScreenItem);
}
}
@ -718,12 +724,12 @@ namespace Greenshot.Forms
private void CaptureAreaToolStripMenuItemClick(object sender, EventArgs e)
{
BeginInvoke((MethodInvoker) delegate { CaptureHelper.CaptureRegion(false); });
BeginInvoke((MethodInvoker) delegate { CaptureHelper.CaptureRegion(_formEnhancers, false); });
}
private void CaptureClipboardToolStripMenuItemClick(object sender, EventArgs e)
{
BeginInvoke(new System.Action(() => CaptureHelper.CaptureClipboard()));
BeginInvoke(new System.Action(() => CaptureHelper.CaptureClipboard(_formEnhancers)));
}
private void OpenFileToolStripMenuItemClick(object sender, EventArgs e)
@ -733,17 +739,17 @@ namespace Greenshot.Forms
private void CaptureFullScreenToolStripMenuItemClick(object sender, EventArgs e)
{
BeginInvoke((MethodInvoker) delegate { CaptureHelper.CaptureFullscreen(false, _coreConfiguration.ScreenCaptureMode); });
BeginInvoke((MethodInvoker) delegate { CaptureHelper.CaptureFullscreen(_formEnhancers, false, _coreConfiguration.ScreenCaptureMode); });
}
private void Contextmenu_capturelastregionClick(object sender, EventArgs e)
{
BeginInvoke((MethodInvoker) delegate { CaptureHelper.CaptureLastRegion(false); });
BeginInvoke((MethodInvoker) delegate { CaptureHelper.CaptureLastRegion(_formEnhancers, false); });
}
private void Contextmenu_capturewindow_Click(object sender, EventArgs e)
{
BeginInvoke((MethodInvoker) delegate { CaptureHelper.CaptureWindowInteractive(false); });
BeginInvoke((MethodInvoker) delegate { CaptureHelper.CaptureWindowInteractive(_formEnhancers, false); });
}
private void Contextmenu_capturewindowfromlist_Click(object sender, EventArgs e)
@ -754,7 +760,7 @@ namespace Greenshot.Forms
try
{
var windowToCapture = (InteropWindow) clickedItem.Tag;
CaptureHelper.CaptureWindow(windowToCapture);
CaptureHelper.CaptureWindow(_formEnhancers, windowToCapture);
}
catch (Exception exception)
{
@ -794,7 +800,7 @@ namespace Greenshot.Forms
}
try
{
CaptureHelper.CaptureIe(false, ieWindowToCapture);
CaptureHelper.CaptureIe(_formEnhancers, false, ieWindowToCapture);
}
catch (Exception exception)
{
@ -912,7 +918,7 @@ namespace Greenshot.Forms
if (!_coreConfiguration.IsWriteProtected("Destinations"))
{
// screenshot destination
selectList = new ToolStripMenuSelectList("destinations", true)
selectList = new ToolStripMenuSelectList(_coreConfiguration, "destinations", true)
{
Text = _greenshotLanguage.SettingsDestination
};
@ -929,7 +935,7 @@ namespace Greenshot.Forms
if (!_coreConfiguration.IsWriteProtected("WindowCaptureMode"))
{
// Capture Modes
selectList = new ToolStripMenuSelectList("capturemodes", false)
selectList = new ToolStripMenuSelectList(_coreConfiguration,"capturemodes", false)
{
Text = _greenshotLanguage.SettingsWindowCaptureMode
};
@ -951,7 +957,7 @@ namespace Greenshot.Forms
}
// print options
selectList = new ToolStripMenuSelectList("printoptions", true)
selectList = new ToolStripMenuSelectList(_coreConfiguration, "printoptions", true)
{
Text = _greenshotLanguage.SettingsPrintoptions
};
@ -979,7 +985,7 @@ namespace Greenshot.Forms
}
// effects
selectList = new ToolStripMenuSelectList("effects", true)
selectList = new ToolStripMenuSelectList(_coreConfiguration, "effects", true)
{
Text = _greenshotLanguage.SettingsVisualization
};

View file

@ -41,30 +41,28 @@ namespace Greenshot.Forms
/// </summary>
public sealed class ToolStripMenuSelectList : ToolStripMenuItem
{
// TODO: Solve, was static reference!
private static readonly ICoreConfiguration CoreConfig = new CoreConfigurationImpl();
private static Image _defaultImage;
private readonly bool _multiCheckAllowed;
private bool _updateInProgress;
public ToolStripMenuSelectList(object identifier, bool allowMultiCheck)
public ToolStripMenuSelectList(ICoreConfiguration coreConfig, object identifier, bool allowMultiCheck)
{
Identifier = identifier;
CheckOnClick = false;
_multiCheckAllowed = allowMultiCheck;
if (_defaultImage == null || _defaultImage.Size != CoreConfig.IconSize)
if (_defaultImage == null || _defaultImage.Size != coreConfig.IconSize)
{
_defaultImage?.Dispose();
_defaultImage = BitmapFactory.CreateEmpty(CoreConfig.IconSize.Width, CoreConfig.IconSize.Height, PixelFormat.Format32bppArgb, Color.Transparent);
_defaultImage = BitmapFactory.CreateEmpty(coreConfig.IconSize.Width, coreConfig.IconSize.Height, PixelFormat.Format32bppArgb, Color.Transparent);
}
Image = _defaultImage;
}
public ToolStripMenuSelectList() : this(null, false)
public ToolStripMenuSelectList(ICoreConfiguration coreConfig) : this(coreConfig, null, false)
{
}
public ToolStripMenuSelectList(object identifier) : this(identifier, false)
public ToolStripMenuSelectList(ICoreConfiguration coreConfig, object identifier) : this(coreConfig, identifier, false)
{
}

View file

@ -32,11 +32,13 @@ using Dapplo.CaliburnMicro.Security;
using Dapplo.Config.Ini;
using Dapplo.Config.Language;
using Greenshot.Addons.Components;
using Greenshot.Addons.Interfaces;
using Greenshot.Components;
using Greenshot.Configuration;
using Greenshot.Configuration.Impl;
using Greenshot.Forms;
using Greenshot.Helpers;
using Greenshot.Processors;
using Greenshot.Ui.Configuration.ViewModels;
using Greenshot.Ui.Misc.ViewModels;
using Greenshot.Ui.Notifications.ViewModels;
@ -134,6 +136,12 @@ namespace Greenshot
.AsSelf()
.SingleInstance();
// Processors
builder
.RegisterType<TitleFixProcessor>()
.As<IProcessor>()
.SingleInstance();
// Destinations
builder
.RegisterAssemblyTypes(ThisAssembly)

View file

@ -66,6 +66,7 @@ namespace Greenshot.Helpers
private readonly bool _captureMouseCursor;
private ICapture _capture;
private CaptureMode _captureMode;
private readonly IEnumerable<IFormEnhancer> _formEnhancers;
private NativeRect _captureRect = NativeRect.Empty;
private ScreenCaptureMode _screenCaptureMode = ScreenCaptureMode.Auto;
// TODO: when we get the screen capture code working correctly, this needs to be enabled
@ -74,27 +75,28 @@ namespace Greenshot.Helpers
private readonly DestinationHolder _destinationHolder;
private readonly IEnumerable<IProcessor> _processors;
public CaptureHelper(CaptureMode captureMode)
public CaptureHelper(IEnumerable<IFormEnhancer> formEnhancers, CaptureMode captureMode)
{
_captureMode = captureMode;
_formEnhancers = formEnhancers;
_capture = new Capture();
_destinationHolder = DestinationHolder.Instance;
// TODO: Fix this
_processors = Enumerable.Empty<IProcessor>();
}
public CaptureHelper(CaptureMode captureMode, bool captureMouseCursor) : this(captureMode)
public CaptureHelper(IEnumerable<IFormEnhancer> formEnhancers, CaptureMode captureMode, bool captureMouseCursor) : this(formEnhancers, captureMode)
{
_captureMouseCursor = captureMouseCursor;
}
public CaptureHelper(CaptureMode captureMode, bool captureMouseCursor, ScreenCaptureMode screenCaptureMode) : this(captureMode)
public CaptureHelper(IEnumerable<IFormEnhancer> formEnhancers, CaptureMode captureMode, bool captureMouseCursor, ScreenCaptureMode screenCaptureMode) : this(formEnhancers, captureMode)
{
_captureMouseCursor = captureMouseCursor;
_screenCaptureMode = screenCaptureMode;
}
public CaptureHelper(CaptureMode captureMode, bool captureMouseCursor, IDestination destination) : this(captureMode, captureMouseCursor)
public CaptureHelper(IEnumerable<IFormEnhancer> formEnhancers, CaptureMode captureMode, bool captureMouseCursor, IDestination destination) : this(formEnhancers, captureMode, captureMouseCursor)
{
if (destination != null)
{
@ -138,100 +140,100 @@ namespace Greenshot.Helpers
}
}
public static void CaptureClipboard(IDestination destination = null)
public static void CaptureClipboard(IEnumerable<IFormEnhancer> formEnhancers, IDestination destination = null)
{
using (var captureHelper = new CaptureHelper(CaptureMode.Clipboard, false, destination))
using (var captureHelper = new CaptureHelper(formEnhancers, CaptureMode.Clipboard, false, destination))
{
captureHelper.MakeCapture();
}
}
public static void CaptureRegion(bool captureMouse, IDestination destination = null)
public static void CaptureRegion(IEnumerable<IFormEnhancer> formEnhancers, bool captureMouse, IDestination destination = null)
{
using (var captureHelper = new CaptureHelper(CaptureMode.Region, captureMouse, destination))
using (var captureHelper = new CaptureHelper(formEnhancers, CaptureMode.Region, captureMouse, destination))
{
captureHelper.MakeCapture();
}
}
public static void CaptureRegion(bool captureMouse, NativeRect region)
public static void CaptureRegion(IEnumerable<IFormEnhancer> formEnhancers, bool captureMouse, NativeRect region)
{
using (var captureHelper = new CaptureHelper(CaptureMode.Region, captureMouse))
using (var captureHelper = new CaptureHelper(formEnhancers, CaptureMode.Region, captureMouse))
{
captureHelper.MakeCapture(region);
}
}
public static void CaptureFullscreen(bool captureMouse, ScreenCaptureMode screenCaptureMode, IDestination destination = null)
public static void CaptureFullscreen(IEnumerable<IFormEnhancer> formEnhancers, bool captureMouse, ScreenCaptureMode screenCaptureMode, IDestination destination = null)
{
using (var captureHelper = new CaptureHelper(CaptureMode.FullScreen, captureMouse, destination))
using (var captureHelper = new CaptureHelper(formEnhancers, CaptureMode.FullScreen, captureMouse, destination))
{
captureHelper._screenCaptureMode = screenCaptureMode;
captureHelper.MakeCapture();
}
}
public static void CaptureLastRegion(bool captureMouse)
public static void CaptureLastRegion(IEnumerable<IFormEnhancer> formEnhancers, bool captureMouse)
{
using (var captureHelper = new CaptureHelper(CaptureMode.LastRegion, captureMouse))
using (var captureHelper = new CaptureHelper(formEnhancers, CaptureMode.LastRegion, captureMouse))
{
captureHelper.MakeCapture();
}
}
public static void CaptureIe(bool captureMouse, IInteropWindow windowToCapture)
public static void CaptureIe(IEnumerable<IFormEnhancer> formEnhancers, bool captureMouse, IInteropWindow windowToCapture)
{
using (var captureHelper = new CaptureHelper(CaptureMode.IE, captureMouse))
using (var captureHelper = new CaptureHelper(formEnhancers, CaptureMode.IE, captureMouse))
{
captureHelper.SelectedCaptureWindow = windowToCapture;
captureHelper.MakeCapture();
}
}
public static void CaptureWindow(bool captureMouse, IDestination destination = null)
public static void CaptureWindow(IEnumerable<IFormEnhancer> formEnhancers, bool captureMouse, IDestination destination = null)
{
using (var captureHelper = new CaptureHelper(CaptureMode.ActiveWindow, captureMouse, destination))
using (var captureHelper = new CaptureHelper(formEnhancers, CaptureMode.ActiveWindow, captureMouse, destination))
{
captureHelper.MakeCapture();
}
}
public static void CaptureWindow(IInteropWindow windowToCapture)
public static void CaptureWindow(IEnumerable<IFormEnhancer> formEnhancers, IInteropWindow windowToCapture)
{
using (var captureHelper = new CaptureHelper(CaptureMode.ActiveWindow))
using (var captureHelper = new CaptureHelper(formEnhancers, CaptureMode.ActiveWindow))
{
captureHelper.SelectedCaptureWindow = windowToCapture;
captureHelper.MakeCapture();
}
}
public static void CaptureWindowInteractive(bool captureMouse)
public static void CaptureWindowInteractive(IEnumerable<IFormEnhancer> formEnhancers, bool captureMouse)
{
using (var captureHelper = new CaptureHelper(CaptureMode.Window))
using (var captureHelper = new CaptureHelper(formEnhancers, CaptureMode.Window))
{
captureHelper.MakeCapture();
}
}
public static void CaptureFile(string filename)
public static void CaptureFile(IEnumerable<IFormEnhancer> formEnhancers, string filename)
{
using (var captureHelper = new CaptureHelper(CaptureMode.File))
using (var captureHelper = new CaptureHelper(formEnhancers, CaptureMode.File))
{
captureHelper.MakeCapture(filename);
}
}
public static void CaptureFile(string filename, IDestination destination)
public static void CaptureFile(IEnumerable<IFormEnhancer> formEnhancers, string filename, IDestination destination)
{
using (var captureHelper = new CaptureHelper(CaptureMode.File))
using (var captureHelper = new CaptureHelper(formEnhancers, CaptureMode.File))
{
captureHelper.AddDestination(destination).MakeCapture(filename);
}
}
public static void ImportCapture(ICapture captureToImport)
public static void ImportCapture(IEnumerable<IFormEnhancer> formEnhancers, ICapture captureToImport)
{
using (var captureHelper = new CaptureHelper(CaptureMode.File))
using (var captureHelper = new CaptureHelper(formEnhancers, CaptureMode.File))
{
captureHelper._capture = captureToImport;
captureHelper.HandleCapture();
@ -1030,7 +1032,7 @@ namespace Greenshot.Helpers
// }
//}
using (var captureForm = new CaptureForm(CoreConfig, _capture, _windows))
using (var captureForm = new CaptureForm(CoreConfig, _capture, _windows, _formEnhancers))
{
// Make sure the form is hidden after showing, even if an exception occurs, so all errors will be shown
DialogResult result;

View file

@ -120,7 +120,7 @@ namespace Greenshot.Helpers
/// <param name="captureDetails">ICaptureDetails</param>
public static void SendImage(ISurface surface, ICaptureDetails captureDetails)
{
var tmpFile = ImageOutput.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings());
var tmpFile = ImageOutput.SaveNamedTmpFile(surface, captureDetails, new SurfaceOutputSettings(CoreConfig));
if (tmpFile != null)
{

View file

@ -195,7 +195,7 @@ namespace Greenshot.Helpers
private void DrawImageForPrint(object sender, PrintPageEventArgs e)
{
// Create the output settins
var printOutputSettings = new SurfaceOutputSettings(OutputFormats.png, 100, false);
var printOutputSettings = new SurfaceOutputSettings(_coreConfig, OutputFormats.png, 100, false);
ApplyEffects(printOutputSettings);

View file

@ -39,36 +39,12 @@ namespace Greenshot.Processors
/// </summary>
public class TitleFixProcessor : AbstractProcessor
{
private static readonly LogSource Log = new LogSource();
// TODO: Solve, was static reference!
private static readonly ICoreConfiguration config = new CoreConfigurationImpl();
private readonly ICoreConfiguration _coreConfiguration;
public TitleFixProcessor()
public TitleFixProcessor(ICoreConfiguration coreConfiguration)
{
var corruptKeys = new List<string>();
foreach (var key in config.ActiveTitleFixes)
{
if (config.TitleFixMatcher.ContainsKey(key))
{
continue;
}
Log.Warn().WriteLine("Key {0} not found, configuration is broken! Disabling this key!", key);
corruptKeys.Add(key);
}
// Fix configuration if needed
if (corruptKeys.Count <= 0)
{
return;
}
foreach (var corruptKey in corruptKeys)
{
// Removing any reference to the key
config.ActiveTitleFixes.Remove(corruptKey);
config.TitleFixMatcher.Remove(corruptKey);
config.TitleFixReplacer.Remove(corruptKey);
}
}
_coreConfiguration = coreConfiguration;
}
public override string Designation => "TitleFix";
@ -81,10 +57,10 @@ namespace Greenshot.Processors
if (!string.IsNullOrEmpty(title))
{
title = title.Trim();
foreach (var titleIdentifier in config.ActiveTitleFixes)
foreach (var titleIdentifier in _coreConfiguration.ActiveTitleFixes)
{
var regexpString = config.TitleFixMatcher[titleIdentifier];
var replaceString = config.TitleFixReplacer[titleIdentifier];
var regexpString = _coreConfiguration.TitleFixMatcher[titleIdentifier];
var replaceString = _coreConfiguration.TitleFixReplacer[titleIdentifier];
if (replaceString == null)
{
replaceString = "";

View file

@ -78,7 +78,7 @@ namespace Greenshot
#if !NETCOREAPP3_0
.WithoutCopyOfAssembliesToProbingPath()
#endif
.WithAssemblyPatterns("Greenshot.Addon*")
.WithAssemblyPatterns("Greenshot.Addon.*")
.BuildApplicationConfig();
var application = new Dapplication(applicationConfig)