diff --git a/.launch/Build SCViewer.launch b/.launch/Build SCViewer.launch index 267d93e..6f30297 100644 --- a/.launch/Build SCViewer.launch +++ b/.launch/Build SCViewer.launch @@ -1,5 +1,6 @@ + @@ -12,6 +13,9 @@ + + + diff --git a/.launch/Set SCViewer version.launch b/.launch/Set SCViewer version.launch index cf907bd..d293261 100644 --- a/.launch/Set SCViewer version.launch +++ b/.launch/Set SCViewer version.launch @@ -1,5 +1,6 @@ + @@ -15,6 +16,9 @@ + + + diff --git a/plugins/com.minres.scviewer.e4.application/Application.e4xmi b/plugins/com.minres.scviewer.e4.application/Application.e4xmi index b4b56a0..f896b0f 100644 --- a/plugins/com.minres.scviewer.e4.application/Application.e4xmi +++ b/plugins/com.minres.scviewer.e4.application/Application.e4xmi @@ -56,7 +56,7 @@ - + diff --git a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/UpdateHandler.java b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/UpdateHandler.java index 1c26b8d..077ac14 100644 --- a/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/UpdateHandler.java +++ b/plugins/com.minres.scviewer.e4.application/src/com/minres/scviewer/e4/application/handlers/UpdateHandler.java @@ -1,24 +1,140 @@ - package com.minres.scviewer.e4.application.handlers; +import java.lang.reflect.InvocationTargetException; +import java.net.URI; +import java.net.URISyntaxException; + +import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.SubMonitor; +import org.eclipse.core.runtime.jobs.IJobChangeEvent; +import org.eclipse.core.runtime.jobs.JobChangeAdapter; import org.eclipse.e4.core.di.annotations.Execute; import org.eclipse.e4.ui.di.UISynchronize; import org.eclipse.e4.ui.workbench.IWorkbench; import org.eclipse.equinox.p2.core.IProvisioningAgent; +import org.eclipse.equinox.p2.operations.ProvisioningJob; import org.eclipse.equinox.p2.operations.ProvisioningSession; import org.eclipse.equinox.p2.operations.UpdateOperation; import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.dialogs.ProgressMonitorDialog; +import org.eclipse.jface.operation.IRunnableWithProgress; public class UpdateHandler { + + boolean cancelled = false; + @Execute - public void execute(IProvisioningAgent agent, UISynchronize synchronize, IWorkbench workbench) { - ProvisioningSession session = new ProvisioningSession(agent); - UpdateOperation operation = new UpdateOperation(session); - IStatus status = operation.resolveModal(null); - if(status.getCode() == UpdateOperation.STATUS_NOTHING_TO_UPDATE) { - MessageDialog.openInformation(null, "Information", "Nothing to update"); + public void execute(IProvisioningAgent agent, UISynchronize sync, IWorkbench workbench) { + // update using a progress monitor + IRunnableWithProgress runnable = new IRunnableWithProgress() { + @Override + public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { + update(agent, monitor, sync, workbench); + } + }; + try { + new ProgressMonitorDialog(null).run(true, true, runnable); + } catch (InvocationTargetException | InterruptedException e) { + e.printStackTrace(); } } - -} \ No newline at end of file + + private IStatus update(IProvisioningAgent agent, IProgressMonitor monitor, UISynchronize sync, + IWorkbench workbench) { + ProvisioningSession session = new ProvisioningSession(agent); + // update the whole running profile, otherwise specify IUs + UpdateOperation operation = new UpdateOperation(session); + try { + operation.getProvisioningContext().setArtifactRepositories(new URI("http://https://minres.github.io/SCViewer/repository")); + operation.getProvisioningContext().setMetadataRepositories(new URI("http://https://minres.github.io/SCViewer/repository")); + } catch (URISyntaxException e) {} + SubMonitor sub = SubMonitor.convert(monitor, "Checking for application updates...", 200); + // check if updates are available + IStatus status = operation.resolveModal(sub.newChild(100)); + if (status.getCode() == UpdateOperation.STATUS_NOTHING_TO_UPDATE) { + showMessage(sync, "Nothing to update"); + return Status.CANCEL_STATUS; + } else { + ProvisioningJob provisioningJob = operation.getProvisioningJob(sub.newChild(100)); + if (provisioningJob != null) { + sync.syncExec(new Runnable() { + @Override + public void run() { + boolean performUpdate = MessageDialog.openQuestion(null, "Updates available", + "There are updates available. Do you want to install them now?"); + if (performUpdate) { + provisioningJob.addJobChangeListener(new JobChangeAdapter() { + @Override + public void done(IJobChangeEvent event) { + if (event.getResult().isOK()) { + sync.syncExec(new Runnable() { + + @Override + public void run() { + boolean restart = MessageDialog.openQuestion(null, + "Updates installed, restart?", + "Updates have been installed successfully, do you want to restart?"); + if (restart) { + workbench.restart(); + } + } + }); + } else { + showError(sync, event.getResult().getMessage()); + cancelled = true; + } + } + }); + // since we switched to the UI thread for interacting with the user + // we need to schedule the provisioning thread, otherwise it would + // be executed also in the UI thread and not in a background thread + provisioningJob.schedule(); + } else { + cancelled = true; + } + } + }); + } else { + if (operation.hasResolved()) { + showError(sync, "Couldn't get provisioning job: " + operation.getResolutionResult()); + } else { + showError(sync, "Couldn't resolve provisioning job"); + } + cancelled = true; + } + } + if (cancelled) { + // reset cancelled flag + cancelled = false; + return Status.CANCEL_STATUS; + } + return Status.OK_STATUS; + } + + private void showMessage(UISynchronize sync, final String message) { + // as the provision needs to be executed in a background thread + // we need to ensure that the message dialog is executed in + // the UI thread + sync.syncExec(new Runnable() { + + @Override + public void run() { + MessageDialog.openInformation(null, "Information", message); + } + }); + } + + private void showError(UISynchronize sync, final String message) { + // as the provision needs to be executed in a background thread + // we need to ensure that the message dialog is executed in + // the UI thread + sync.syncExec(new Runnable() { + @Override + public void run() { + MessageDialog.openError(null, "Error", message); + } + }); + } +} diff --git a/products/com.minres.scviewer.e4.product/scviewer.product b/products/com.minres.scviewer.e4.product/scviewer.product index 63caa8e..062b842 100644 --- a/products/com.minres.scviewer.e4.product/scviewer.product +++ b/products/com.minres.scviewer.e4.product/scviewer.product @@ -1,7 +1,7 @@ - + @@ -63,7 +63,7 @@ - + diff --git a/releng/com.minres.scviewer.target/com.minres.scviewer.target.target b/releng/com.minres.scviewer.target/com.minres.scviewer.target.target index e77999c..d36c8ee 100644 --- a/releng/com.minres.scviewer.target/com.minres.scviewer.target.target +++ b/releng/com.minres.scviewer.target/com.minres.scviewer.target.target @@ -12,6 +12,8 @@ + + @@ -26,7 +28,7 @@ - + diff --git a/releng/com.minres.scviewer.updateSite/category.xml b/releng/com.minres.scviewer.updateSite/category.xml index 204beb5..9eaf4bb 100644 --- a/releng/com.minres.scviewer.updateSite/category.xml +++ b/releng/com.minres.scviewer.updateSite/category.xml @@ -18,6 +18,15 @@ + + + + + + + + + Viewer for transaction recording outputs of the SystemC Verification (SCV) library @@ -29,4 +38,7 @@ + + +