// Path: FileSync/src/de/loskutov/fs/FileSyncPlugin.java
// public class FileSyncPlugin extends AbstractUIPlugin {
// 
//     private static FileSyncPlugin plugin;
// 
//     public static final String PLUGIN_ID = "de.loskutov.FileSync";
// 
//     /**
//      * The constructor.
//      */
//     public FileSyncPlugin() {
//         super();
//         if(plugin != null){
//             throw new IllegalStateException("FileSync plugin is singleton!");
//         }
//         plugin = this;
//     }
// 
//     /**
//      * Returns the shared instance.
//      */
//     public static FileSyncPlugin getDefault() {
//         return plugin;
//     }
// 
//     public static void error(String message, Throwable error) {
//         Shell shell = FileSyncPlugin.getShell();
//         if(message == null){
//             message = "";
//         }
//         if (error != null) {
//             message = message + " " + error.getMessage();
//         }
//         IPreferenceStore store = getDefault().getPreferenceStore();
//         if (store.getBoolean(FileSyncConstants.KEY_ASK_USER)) {
//             MessageDialog.openError(shell, "FileSync error", message);
//         }
//         log(message, error, IStatus.ERROR);
//     }
// 
//     /**
//      * @param statusID
//      *            one of IStatus. constants like IStatus.ERROR etc
//      * @param error
//      */
//     public static void log(String messageID, Throwable error, int statusID) {
//         if (messageID == null) {
//             messageID = error.getMessage();
//             if (messageID == null) {
//                 messageID = error.toString();
//             }
//         }
//         Status status = new Status(statusID, PLUGIN_ID, 0, messageID, error);
//         getDefault().getLog().log(status);
//         if(getDefault().isDebugging()){
//             System.out.println(status);
//         }
//     }
// 
//     public static Shell getShell() {
//         return getDefault().getWorkbench().getActiveWorkbenchWindow().getShell();
//     }
// 
//     /**
//      * Returns an image descriptor for the image file at the given plug-in
//      * relative path.
//      *
//      * @param path
//      *            the path
//      * @return the image descriptor
//      */
//     public static ImageDescriptor getImageDescriptor(String path) {
//         if (path == null) {
//             return null;
//         }
//         ImageRegistry imageRegistry = getDefault().getImageRegistry();
//         ImageDescriptor imageDescriptor = imageRegistry.getDescriptor(path);
//         if (imageDescriptor == null) {
//             imageDescriptor = imageDescriptorFromPlugin(PLUGIN_ID, path);
//             imageRegistry.put(path, imageDescriptor);
//         }
//         return imageDescriptor;
//     }
// 
//     public static Image getImage(String path) {
//         if (path == null) {
//             return null;
//         }
//         // prefetch image, if not jet there
//         ImageDescriptor imageDescriptor = getImageDescriptor(path);
//         if (imageDescriptor != null) {
//             return getDefault().getImageRegistry().get(path);
//         }
//         // TODO error message
//         return null;
//     }
// }


import java.net.MalformedURLException;
import java.net.URL;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.browser.IWebBrowser;
import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
import de.loskutov.fs.FileSyncPlugin;

            public void handleEvent(Event event) {
                handleUrlClick("http://marketplace.eclipse.org/content/filesync");
            }
        });

        link = new Link(commonPanel, SWT.NONE);
        link.setFont(font);
        link.setText(" - <a>make a donation to support plugin development</a>");
        link.setToolTipText("You do NOT need a PayPal account!");
        link.addListener (SWT.Selection, new Listener () {
            @Override
            public void handleEvent(Event event) {
                handleUrlClick("https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=R5SHJLNGUXKHU");
            }
        });
    }

    private static void handleUrlClick(final String urlStr) {
        try {
            IWorkbenchBrowserSupport support = PlatformUI.getWorkbench().getBrowserSupport();
            IWebBrowser externalBrowser = support.getExternalBrowser();
            if(externalBrowser != null){
                externalBrowser.openURL(new URL(urlStr));
            } else {
                IWebBrowser browser = support.createBrowser(urlStr);
                if(browser != null){
                    browser.openURL(new URL(urlStr));
                }
            }
        } catch (PartInitException e) {

// Path: FileSync/src/de/loskutov/fs/FileSyncPlugin.java
// public class FileSyncPlugin extends AbstractUIPlugin {
// 
//     private static FileSyncPlugin plugin;
// 
//     public static final String PLUGIN_ID = "de.loskutov.FileSync";
// 
//     /**
//      * The constructor.
//      */
//     public FileSyncPlugin() {
//         super();
//         if(plugin != null){
//             throw new IllegalStateException("FileSync plugin is singleton!");
//         }
//         plugin = this;
//     }
// 
//     /**
//      * Returns the shared instance.
//      */
//     public static FileSyncPlugin getDefault() {
//         return plugin;
//     }
// 
//     public static void error(String message, Throwable error) {
//         Shell shell = FileSyncPlugin.getShell();
//         if(message == null){
//             message = "";
//         }
//         if (error != null) {
//             message = message + " " + error.getMessage();
//         }
//         IPreferenceStore store = getDefault().getPreferenceStore();
//         if (store.getBoolean(FileSyncConstants.KEY_ASK_USER)) {
//             MessageDialog.openError(shell, "FileSync error", message);
//         }
//         log(message, error, IStatus.ERROR);
//     }
// 
//     /**
//      * @param statusID
//      *            one of IStatus. constants like IStatus.ERROR etc
//      * @param error
//      */
//     public static void log(String messageID, Throwable error, int statusID) {
//         if (messageID == null) {
//             messageID = error.getMessage();
//             if (messageID == null) {
//                 messageID = error.toString();
//             }
//         }
//         Status status = new Status(statusID, PLUGIN_ID, 0, messageID, error);
//         getDefault().getLog().log(status);
//         if(getDefault().isDebugging()){
//             System.out.println(status);
//         }
//     }
// 
//     public static Shell getShell() {
//         return getDefault().getWorkbench().getActiveWorkbenchWindow().getShell();
//     }
// 
//     /**
//      * Returns an image descriptor for the image file at the given plug-in
//      * relative path.
//      *
//      * @param path
//      *            the path
//      * @return the image descriptor
//      */
//     public static ImageDescriptor getImageDescriptor(String path) {
//         if (path == null) {
//             return null;
//         }
//         ImageRegistry imageRegistry = getDefault().getImageRegistry();
//         ImageDescriptor imageDescriptor = imageRegistry.getDescriptor(path);
//         if (imageDescriptor == null) {
//             imageDescriptor = imageDescriptorFromPlugin(PLUGIN_ID, path);
//             imageRegistry.put(path, imageDescriptor);
//         }
//         return imageDescriptor;
//     }
// 
//     public static Image getImage(String path) {
//         if (path == null) {
//             return null;
//         }
//         // prefetch image, if not jet there
//         ImageDescriptor imageDescriptor = getImageDescriptor(path);
//         if (imageDescriptor != null) {
//             return getDefault().getImageRegistry().get(path);
//         }
//         // TODO error message
//         return null;
//     }
// }


// Path: FileSync/src/de/loskutov/fs/properties/SupportPanel.java
import java.net.MalformedURLException;
import java.net.URL;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.browser.IWebBrowser;
import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
import de.loskutov.fs.FileSyncPlugin;

            public void handleEvent(Event event) {
                handleUrlClick("http://marketplace.eclipse.org/content/filesync");
            }
        });

        link = new Link(commonPanel, SWT.NONE);
        link.setFont(font);
        link.setText(" - <a>make a donation to support plugin development</a>");
        link.setToolTipText("You do NOT need a PayPal account!");
        link.addListener (SWT.Selection, new Listener () {
            @Override
            public void handleEvent(Event event) {
                handleUrlClick("https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=R5SHJLNGUXKHU");
            }
        });
    }

    private static void handleUrlClick(final String urlStr) {
        try {
            IWorkbenchBrowserSupport support = PlatformUI.getWorkbench().getBrowserSupport();
            IWebBrowser externalBrowser = support.getExternalBrowser();
            if(externalBrowser != null){
                externalBrowser.openURL(new URL(urlStr));
            } else {
                IWebBrowser browser = support.createBrowser(urlStr);
                if(browser != null){
                    browser.openURL(new URL(urlStr));
                }
            }
        } catch (PartInitException e) {

            FileSyncPlugin.log("Failed to open url " + urlStr, e, IStatus.ERROR);
