package name.abuchen.portfolio.ui.addons; import java.io.IOException; import java.text.MessageFormat; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.inject.Inject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.IJobManager; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.e4.core.di.annotations.Optional; import org.eclipse.e4.core.di.extensions.Preference; import org.eclipse.e4.core.services.events.IEventBroker; import org.eclipse.e4.ui.di.UIEventTopic; import org.eclipse.e4.ui.workbench.IWorkbench; import org.eclipse.e4.ui.workbench.UIEvents; import org.eclipse.e4.ui.workbench.modeling.EPartService; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.jface.window.Window; import org.eclipse.swt.graphics.Image; import org.osgi.service.event.Event; import name.abuchen.portfolio.money.ExchangeRateProvider; import name.abuchen.portfolio.money.ExchangeRateProviderFactory; import name.abuchen.portfolio.ui.Images; import name.abuchen.portfolio.ui.Messages; import name.abuchen.portfolio.ui.PortfolioPlugin; import name.abuchen.portfolio.ui.UIConstants; import name.abuchen.portfolio.ui.log.LogEntryCache; import name.abuchen.portfolio.ui.update.UpdateHelper; import name.abuchen.portfolio.ui.util.ProgressMonitorFactory; import name.abuchen.portfolio.ui.util.RecentFilesCache; @SuppressWarnings("restriction") public class StartupAddon { private static final class UpdateExchangeRatesJob extends Job { private final IEventBroker broker; private final ExchangeRateProviderFactory factory; private final ExchangeRateProvider provider; private boolean loadDone = false; private UpdateExchangeRatesJob(IEventBroker broker, ExchangeRateProviderFactory factory, ExchangeRateProvider provider) { super(MessageFormat.format(Messages.MsgUpdatingExchangeRates, provider.getName())); this.broker = broker; this.factory = factory; this.provider = provider; } @Override protected IStatus run(IProgressMonitor monitor) { if (!loadDone) { // load data from file only the first time around loadFromFile(monitor); loadDone = true; } updateOnline(monitor); schedule(1000L * 60 * 60 * 12); // every 12 hours return Status.OK_STATUS; } private void loadFromFile(IProgressMonitor monitor) { try { provider.load(monitor); } catch (Exception e) { // also catch runtime exceptions to make sure the update // method runs in any case PortfolioPlugin.log(e); } finally { factory.clearCache(); broker.post(UIConstants.Event.ExchangeRates.LOADED, provider); } } private void updateOnline(IProgressMonitor monitor) { try { provider.update(monitor); } catch (IOException e) { PortfolioPlugin.log(e); } finally { factory.clearCache(); broker.post(UIConstants.Event.ExchangeRates.LOADED, provider); } } } @PostConstruct public void setupProgressMontior(ProgressMonitorFactory factory) { IJobManager manager = Job.getJobManager(); manager.setProgressProvider(factory); } @PostConstruct public void setupLogEntryCache(LogEntryCache cache) { // force creation of log entry cache } @PostConstruct public void setupRecentFilesCache(RecentFilesCache cache) { // force creation of recent files cache } @Inject @Optional public void checkForUpdates(@UIEventTopic(UIEvents.UILifeCycle.APP_STARTUP_COMPLETE) Event event, // NOSONAR final IWorkbench workbench, final EPartService partService, @Preference(value = UIConstants.Preferences.AUTO_UPDATE) boolean autoUpdate) { if (autoUpdate) { Job job = new Job(Messages.JobMsgCheckingForUpdates) { @Override protected IStatus run(IProgressMonitor monitor) { try { monitor.beginTask(Messages.JobMsgCheckingForUpdates, 200); UpdateHelper updateHelper = new UpdateHelper(workbench, partService); updateHelper.runUpdate(monitor, true); } catch (CoreException e) // NOSONAR { PortfolioPlugin.log(e.getStatus()); } return Status.OK_STATUS; } }; job.setSystem(true); job.schedule(500); } } @PostConstruct public void updateExchangeRates(IEventBroker broker, ExchangeRateProviderFactory factory) { for (final ExchangeRateProvider provider : factory.getProviders()) { Job job = new UpdateExchangeRatesJob(broker, factory, provider); job.schedule(); } } @PreDestroy public void storeExchangeRates(ExchangeRateProviderFactory factory) { for (ExchangeRateProvider provider : factory.getProviders()) { try { provider.save(new NullProgressMonitor()); } catch (IOException e) { PortfolioPlugin.log(e); } } } @PostConstruct public void setMultipleWindowImages() { // setting window images // http://www.eclipse.org/forums/index.php/t/440442/ Window.setDefaultImages(new Image[] { Images.LOGO_512.image(), Images.LOGO_256.image(), Images.LOGO_128.image(), Images.LOGO_48.image(), Images.LOGO_32.image(), Images.LOGO_16.image() }); } @PostConstruct public void replaceDefaultDialogImages() { ImageRegistry registry = JFaceResources.getImageRegistry(); registry.put(Dialog.DLG_IMG_MESSAGE_ERROR, Images.ERROR.descriptor()); registry.put(Dialog.DLG_IMG_MESSAGE_WARNING, Images.WARNING.descriptor()); registry.put(Dialog.DLG_IMG_MESSAGE_INFO, Images.INFO.descriptor()); } }