/* * Greenshot - a free and open source screenshot tool * Copyright (C) 2007-2012 Thomas Braun, Jens Klingen, Robin Krom * * For more information see: http://getgreenshot.org/ * The Greenshot project is hosted on Sourceforge: http://sourceforge.net/projects/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 . */ using System; using System.Collections.Generic; using Greenshot.Plugin; using GreenshotPlugin.Core; using Greenshot.Destinations; namespace Greenshot.Helpers { /// /// Description of DestinationHelper. /// public static class DestinationHelper { private static log4net.ILog LOG = log4net.LogManager.GetLogger(typeof(DestinationHelper)); private static Dictionary RegisteredDestinations = new Dictionary(); /// Initialize the destinations static DestinationHelper() { foreach(Type destinationType in InterfaceUtils.GetSubclassesOf(typeof(IDestination),true)) { // Only take our own if (!"Greenshot.Destinations".Equals(destinationType.Namespace)) { continue; } if (!destinationType.IsAbstract) { IDestination destination; try { destination = (IDestination)Activator.CreateInstance(destinationType); } catch (Exception e) { LOG.ErrorFormat("Can't create instance of {0}", destinationType); LOG.Error(e); continue; } if (destination.isActive) { LOG.DebugFormat("Found destination {0} with designation {1}", destinationType.Name, destination.Designation); RegisterDestination(destination); } else { LOG.DebugFormat("Ignoring destination {0} with designation {1}", destinationType.Name, destination.Designation); } } } } /// /// Register your destination here, if it doesn't come from a plugin and needs to be available /// /// public static void RegisterDestination(IDestination destination) { // don't test the key, an exception should happen wenn it's not unique RegisteredDestinations.Add(destination.Designation, destination); } /// /// Method to get all the destinations from the plugins /// /// List private static List GetPluginDestinations() { List destinations = new List(); foreach (PluginAttribute pluginAttribute in PluginHelper.instance.Plugins.Keys) { IGreenshotPlugin plugin = PluginHelper.instance.Plugins[pluginAttribute]; try { var dests = plugin.Destinations(); if (dests != null) { destinations.AddRange(dests); } } catch (Exception ex) { LOG.ErrorFormat("Couldn't get destinations from the plugin {0}", pluginAttribute.Name); LOG.Error(ex); } } destinations.Sort(); return destinations; } /// /// Get a list of all destinations, registered or supplied by a plugin /// /// public static List GetAllDestinations() { List destinations = new List(); destinations.AddRange(RegisteredDestinations.Values); destinations.AddRange(GetPluginDestinations()); destinations.Sort(); return destinations; } /// /// Get a destination by a designation /// /// Designation of the destination /// IDestination or null public static IDestination GetDestination(string designation) { if (designation == null) { return null; } if (RegisteredDestinations.ContainsKey(designation)) { return RegisteredDestinations[designation]; } foreach (IDestination destination in GetPluginDestinations()) { if (designation.Equals(destination.Designation)) { return destination; } } return null; } /// /// A simple helper method which will call ExportCapture for the destination with the specified designation /// /// /// /// public static void ExportCapture(bool manuallyInitiated, string designation, ISurface surface, ICaptureDetails captureDetails) { if (RegisteredDestinations.ContainsKey(designation)) { IDestination destination = RegisteredDestinations[designation]; if (destination.isActive) { if (destination.ExportCapture(manuallyInitiated, surface, captureDetails)) { // Export worked, set the modified flag to false if the export wasn't to the editor or picker if (!EditorDestination.DESIGNATION.Equals(designation) && !PickerDestination.DESIGNATION.Equals(designation)) { surface.Modified = false; } } } } } } }