]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.charts/src/org/simantics/charts/export/ExportChartPDF.java
Fixed all line endings of the repository
[simantics/platform.git] / bundles / org.simantics.charts / src / org / simantics / charts / export / ExportChartPDF.java
index 645fb50ea62884a5af8bdb535f42e72acc5065bb..e176f118dbb6ab94c67eb5023f6099c62ebfa7c2 100644 (file)
-package org.simantics.charts.export;\r
-\r
-import java.awt.Graphics2D;\r
-import java.awt.geom.Rectangle2D;\r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.Collections;\r
-import java.util.List;\r
-import java.util.UUID;\r
-\r
-import org.eclipse.core.runtime.IProgressMonitor;\r
-import org.eclipse.core.runtime.OperationCanceledException;\r
-import org.eclipse.core.runtime.preferences.DefaultScope;\r
-import org.eclipse.core.runtime.preferences.InstanceScope;\r
-import org.osgi.service.prefs.Preferences;\r
-import org.simantics.Simantics;\r
-import org.simantics.charts.preference.ChartPreferences;\r
-import org.simantics.charts.query.MilestoneSpecQuery;\r
-import org.simantics.charts.query.TrendSpecQuery;\r
-import org.simantics.databoard.Accessors;\r
-import org.simantics.databoard.accessor.RecordAccessor;\r
-import org.simantics.databoard.accessor.error.AccessorConstructionException;\r
-import org.simantics.databoard.accessor.reference.ChildReference;\r
-import org.simantics.databoard.binding.mutable.Variant;\r
-import org.simantics.databoard.type.RecordType;\r
-import org.simantics.databoard.type.UnionType;\r
-import org.simantics.db.Resource;\r
-import org.simantics.db.exception.DatabaseException;\r
-import org.simantics.db.layer0.request.PossibleModel;\r
-import org.simantics.export.core.ExportContext;\r
-import org.simantics.export.core.error.ExportException;\r
-import org.simantics.export.core.manager.Content;\r
-import org.simantics.export.core.pdf.ExportPdfWriter;\r
-import org.simantics.export.core.pdf.ExportPdfWriter.Page;\r
-import org.simantics.export.core.util.ExportQueries;\r
-import org.simantics.export.core.util.ExporterUtils;\r
-import org.simantics.g2d.canvas.impl.CanvasContext;\r
-import org.simantics.history.History;\r
-import org.simantics.history.HistoryException;\r
-import org.simantics.history.HistoryManager;\r
-import org.simantics.simulation.experiment.IExperiment;\r
-import org.simantics.simulation.experiment.IHistoryExperiment;\r
-import org.simantics.simulation.export.ExperimentExportClass;\r
-import org.simantics.simulation.project.ExperimentManager;\r
-import org.simantics.simulation.project.IExperimentManager;\r
-import org.simantics.trend.TrendInitializer;\r
-import org.simantics.trend.configuration.ItemPlacement;\r
-import org.simantics.trend.configuration.TimeFormat;\r
-import org.simantics.trend.configuration.TrendSpec;\r
-import org.simantics.trend.impl.MilestoneSpec;\r
-import org.simantics.trend.impl.TrendNode;\r
-import org.simantics.utils.datastructures.MapList;\r
-import org.simantics.utils.format.ValueFormat;\r
-import org.simantics.utils.threads.ThreadUtils;\r
-import org.simantics.utils.threads.WorkerThread;\r
-\r
-public class ExportChartPDF extends ExperimentExportClass {\r
-\r
-       public static final RecordType chartOptions;\r
-       \r
-       public static String S_CHART = "Chart";\r
-       public static ChildReference P_ITEMPLACEMENT = ChildReference.parsePath(S_CHART+"/Item Placement");\r
-       public static ChildReference P_TIMEFORMAT = ChildReference.parsePath(S_CHART+"/Time Format");\r
-       public static ChildReference P_VALUEFORMAT = ChildReference.parsePath(S_CHART+"/Value Format");\r
-       \r
-       static {\r
-               chartOptions = new RecordType();\r
-           chartOptions.addComponent("Item Placement", UnionType.newEnum("Stacked", "Overlapping"));\r
-           chartOptions.addComponent("Time Format", UnionType.newEnum("Decimal", "Time"));\r
-           chartOptions.addComponent("Value Format", UnionType.newEnum("Currency", "Scientific", "Engineering", "Default"));\r
-       }\r
-\r
-       @Override\r
-       public void export(List<Content> contents, \r
-                       Object handle,\r
-                       ExportContext ctx, \r
-                       Variant options,\r
-                       IProgressMonitor monitor, \r
-                       MapList<Content, Content> attachmentMap\r
-                       ) throws ExportException {\r
-\r
-               // Flush all experiments, just in case.\r
-               IExperimentManager em = Simantics.getProject().getHint( ExperimentManager.KEY_EXPERIMENT_MANAGER );\r
-               if ( em != null ) {\r
-                       for (IExperiment exp : em.getExperiments()) {\r
-                               if ( exp instanceof IHistoryExperiment ) {\r
-                                       IHistoryExperiment he = (IHistoryExperiment) exp;\r
-                                       try {\r
-                                               he.flushHistory();\r
-                                       } catch (HistoryException e) {\r
-                                       }\r
-                               }\r
-                       }\r
-               }\r
-               \r
-               final ExportPdfWriter writer = (ExportPdfWriter) handle;\r
-        final WorkerThread workerThread = new WorkerThread("Chart PDF Painter");\r
-        workerThread.start();\r
-               try {\r
-                       \r
-                       final RecordAccessor ra = Accessors.getAccessor( options );\r
-                       \r
-                       // Get a list of the history managers the user has selected.\r
-                       List<ModelRef> modelRefs = ExperimentExportClass.getResult(ctx, options, true);\r
-                       List<ChartSettings> charts = new ArrayList<ChartSettings>();\r
-                                               \r
-                       for ( Content content : contents ) {\r
-                               if (monitor.isCanceled())\r
-                                       throw new OperationCanceledException();\r
-\r
-                               Resource chartRes = ctx.session.syncRequest( ExportQueries.toResource(content.url) );\r
-                               Resource model = ctx.session.syncRequest( new PossibleModel( chartRes ) );\r
-                               for (ModelRef modelRef : modelRefs) {\r
-                                       if ( !modelRef.resource.equals(model) ) continue;\r
-                                       for (ExperimentRef experimentRef : modelRef.experiments) {\r
-                                               for (RunRef runRef : experimentRef.runs) {                                              \r
-                                                       if ( runRef.historyFolder == null || !runRef.historyFolder.exists() ) continue;\r
-                                                       HistoryManager history = History.openFileHistory( runRef.historyFolder );\r
-                                                       \r
-                                                       ChartSettings cs = new ChartSettings();\r
-                                                       cs.history = history;\r
-                                                       cs.modelRef = modelRef;\r
-                                                       cs.experimentRef = experimentRef;\r
-                                                       cs.runRef = runRef;\r
-                                                       cs.chartRes = chartRes;\r
-                                                       charts.add( cs );\r
-                                               }                                               \r
-                                       }\r
-                               }                               \r
-                       }\r
-                                               \r
-                                                                       \r
-                       for ( final ChartSettings cs : charts ) {                               \r
-                               UUID id = UUID.randomUUID();\r
-                               final TrendSpec trendSpec = ctx.session.syncRequest( new TrendSpecQuery( id, cs.chartRes ) );\r
-                       if ( cs.modelRef.enabledRunCount() > 1 ) {\r
-                               // Add run ref to the label\r
-                               trendSpec.name += " / " + cs.runRef.label;\r
-                       }\r
-                       \r
-                       \r
-                       final MilestoneSpec milestones = ctx.session.syncRequest( new MilestoneSpecQuery( cs.experimentRef.resource ) );                        \r
-                       //final CanvasContext cctx = new CanvasContext( workerThread );\r
-                       final ExportException[] error = new ExportException[1]; \r
-                       \r
-                ThreadUtils.syncExec(workerThread, new Runnable() {\r
-                    @Override\r
-                    public void run() {\r
-                                       CanvasContext cctx = TrendInitializer.createDefaultCanvas(workerThread, cs.history, null, null, trendSpec);\r
-                                       Page pdfPage = null;\r
-                               try {                                                                   \r
-                                       TrendNode trend = TrendInitializer.getTrendNode( cctx );   \r
-                                       trend.printing = true;\r
-                                       \r
-                                               String s = ExporterUtils.getUnionValue(ra, P_ITEMPLACEMENT);\r
-                                               if ( s!=null ) trend.itemPlacement = ItemPlacement.valueOf(s);\r
-                                               s = ExporterUtils.getUnionValue(ra, P_TIMEFORMAT);\r
-                                               if ( s!=null ) trend.timeFormat = TimeFormat.valueOf(s);\r
-                                               s = ExporterUtils.getUnionValue(ra, P_VALUEFORMAT);\r
-                                       if ( s!=null ) trend.valueFormat = ValueFormat.valueOf(s);\r
-                                       \r
-                                       if (milestones!=null) trend.setMilestones(milestones);\r
-                                               \r
-                                               pdfPage = writer.createPage( null );\r
-                                               Graphics2D g2d = pdfPage.createGraphics( true );\r
-                                               try {\r
-                                                       Rectangle2D clip = new Rectangle2D.Double(0, 0, pdfPage.getWidth(), pdfPage.getHeight());\r
-                                                       g2d.setClip( clip );\r
-                                           g2d.scale(0.25, 0.25);\r
-                                           trend.autoscale(true, true);\r
-                                                       trend.zoomOut();\r
-                                                       trend.layout();\r
-                                                       trend.render( g2d );\r
-                                               } finally {\r
-                                                       trend.cleanup();\r
-                                                       g2d.dispose();\r
-                                                       cs.history.close();\r
-                                               }\r
-                        } catch (ExportException e) {\r
-                               error[0] = e;\r
-                                               } finally {\r
-                               cctx.dispose();\r
-                               if ( pdfPage != null )\r
-                                                               try {\r
-                                                                       pdfPage.close();\r
-                                                               } catch (ExportException e) {\r
-                                                                       if ( error[0]==null ) error[0] = e;\r
-                                                               }\r
-                        }\r
-                    }\r
-                });\r
-                       if ( error[0] != null ) throw error[0];\r
-                               \r
-                       }\r
-               } catch (DatabaseException e) {\r
-                       throw new ExportException( e ); \r
-               } catch (AccessorConstructionException e) {\r
-                       throw new ExportException( e ); \r
-               } finally {\r
-                       workerThread.stopDispatchingEvents(true);\r
-               }\r
-               \r
-       }\r
-\r
-       \r
-       @Override\r
-       public RecordType options(ExportContext context, Collection<String> content) throws ExportException {\r
-               RecordType options = super.options(context, content);\r
-               options.addComponent(S_CHART, chartOptions);\r
-               return options;\r
-       }\r
-\r
-       @Override\r
-       public void fillDefaultPrefs(ExportContext ctx, Variant options) throws ExportException {\r
-               super.fillDefaultPrefs(ctx, options);\r
-               // Read from eclipse preferences\r
-        try {\r
-                       RecordAccessor ra = Accessors.getAccessor(options);                     \r
-                       Preferences instPrefs = InstanceScope.INSTANCE.getNode( ChartPreferences.P_NODE );\r
-                       Preferences defaultPrefs = DefaultScope.INSTANCE.getNode( ChartPreferences.P_NODE );\r
-                       \r
-                       String s;\r
-                       s = ExporterUtils.getPrefString(instPrefs, defaultPrefs, ChartPreferences.P_ITEMPLACEMENT);\r
-                       ExporterUtils.setUnionValue(ra, P_ITEMPLACEMENT, s);\r
-                       \r
-                       s = ExporterUtils.getPrefString(instPrefs, defaultPrefs, ChartPreferences.P_TIMEFORMAT);\r
-                       ExporterUtils.setUnionValue(ra, P_TIMEFORMAT, s);\r
-\r
-                       s = ExporterUtils.getPrefString(instPrefs, defaultPrefs, ChartPreferences.P_VALUEFORMAT);\r
-                       ExporterUtils.setUnionValue(ra, P_VALUEFORMAT, s);\r
-                       \r
-               } catch (AccessorConstructionException e) {\r
-                       throw new ExportException(e);\r
-               }\r
-       }\r
-\r
-       @Override\r
-       public void savePref(Variant options, Preferences contentScopeNode, Preferences workbenchScopeNode) throws ExportException {\r
-               super.savePref(options, contentScopeNode, workbenchScopeNode);\r
-        try {\r
-                       RecordAccessor ra = Accessors.getAccessor(options);                     \r
-                       String s;\r
-                       \r
-                       s = ExporterUtils.getUnionValue(ra, P_ITEMPLACEMENT);\r
-                       ExporterUtils.setPrefString(contentScopeNode, ChartPreferences.P_ITEMPLACEMENT, s);\r
-                       ExporterUtils.setPrefString(workbenchScopeNode, ChartPreferences.P_ITEMPLACEMENT, s);\r
-                       \r
-                       s = ExporterUtils.getUnionValue(ra, P_TIMEFORMAT);\r
-                       ExporterUtils.setPrefString(contentScopeNode, ChartPreferences.P_TIMEFORMAT, s);\r
-                       ExporterUtils.setPrefString(workbenchScopeNode, ChartPreferences.P_TIMEFORMAT, s);\r
-                       \r
-                       s = ExporterUtils.getUnionValue(ra, P_VALUEFORMAT);\r
-                       ExporterUtils.setPrefString(contentScopeNode, ChartPreferences.P_VALUEFORMAT, s);\r
-                       ExporterUtils.setPrefString(workbenchScopeNode, ChartPreferences.P_VALUEFORMAT, s);\r
-                       \r
-               } catch (AccessorConstructionException e) {\r
-                       throw new ExportException(e);\r
-               }\r
-               \r
-       }\r
-\r
-       @Override\r
-       public void loadPref(Variant options, Preferences contentScopeNode, Preferences workbenchScopeNode) throws ExportException {\r
-               super.loadPref(options, contentScopeNode, workbenchScopeNode);\r
-        try {\r
-                       RecordAccessor ra = Accessors.getAccessor(options);                     \r
-                       \r
-                       String s;\r
-                       s = ExporterUtils.getPrefString(contentScopeNode, ChartPreferences.P_ITEMPLACEMENT);\r
-                       if ( s==null ) s = ExporterUtils.getPrefString(workbenchScopeNode, ChartPreferences.P_ITEMPLACEMENT);\r
-                       ExporterUtils.setUnionValue(ra, P_ITEMPLACEMENT, s);\r
-                       \r
-                       s = ExporterUtils.getPrefString(contentScopeNode, ChartPreferences.P_TIMEFORMAT);\r
-                       if ( s==null ) s = ExporterUtils.getPrefString(workbenchScopeNode, ChartPreferences.P_TIMEFORMAT); \r
-                       ExporterUtils.setUnionValue(ra, P_TIMEFORMAT, s);\r
-\r
-                       s = ExporterUtils.getPrefString(contentScopeNode, ChartPreferences.P_VALUEFORMAT);\r
-                       if ( s==null ) s = ExporterUtils.getPrefString(workbenchScopeNode, ChartPreferences.P_VALUEFORMAT); \r
-                       ExporterUtils.setUnionValue(ra, P_VALUEFORMAT, s);\r
-                       \r
-               } catch (AccessorConstructionException e) {\r
-                       throw new ExportException(e);\r
-               }\r
-       }\r
-\r
-       @Override\r
-       public List<String> validate(String contentUri, ExportContext context, Variant options) {\r
-               return Collections.emptyList();\r
-       }\r
-       \r
-       static class ChartSettings {\r
-\r
-               Resource chartRes;\r
-               ModelRef modelRef;\r
-               ExperimentRef experimentRef;\r
-               RunRef runRef;\r
-               HistoryManager history;\r
-               \r
-       }\r
-\r
-}\r
+package org.simantics.charts.export;
+
+import java.awt.Graphics2D;
+import java.awt.geom.Rectangle2D;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.UUID;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.preferences.DefaultScope;
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.osgi.service.prefs.Preferences;
+import org.simantics.Simantics;
+import org.simantics.charts.preference.ChartPreferences;
+import org.simantics.charts.query.MilestoneSpecQuery;
+import org.simantics.charts.query.TrendSpecQuery;
+import org.simantics.databoard.Accessors;
+import org.simantics.databoard.accessor.RecordAccessor;
+import org.simantics.databoard.accessor.error.AccessorConstructionException;
+import org.simantics.databoard.accessor.reference.ChildReference;
+import org.simantics.databoard.binding.mutable.Variant;
+import org.simantics.databoard.type.RecordType;
+import org.simantics.databoard.type.UnionType;
+import org.simantics.db.Resource;
+import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.layer0.request.PossibleModel;
+import org.simantics.export.core.ExportContext;
+import org.simantics.export.core.error.ExportException;
+import org.simantics.export.core.manager.Content;
+import org.simantics.export.core.pdf.ExportPdfWriter;
+import org.simantics.export.core.pdf.ExportPdfWriter.Page;
+import org.simantics.export.core.util.ExportQueries;
+import org.simantics.export.core.util.ExporterUtils;
+import org.simantics.g2d.canvas.impl.CanvasContext;
+import org.simantics.history.History;
+import org.simantics.history.HistoryException;
+import org.simantics.history.HistoryManager;
+import org.simantics.simulation.experiment.IExperiment;
+import org.simantics.simulation.experiment.IHistoryExperiment;
+import org.simantics.simulation.export.ExperimentExportClass;
+import org.simantics.simulation.project.ExperimentManager;
+import org.simantics.simulation.project.IExperimentManager;
+import org.simantics.trend.TrendInitializer;
+import org.simantics.trend.configuration.ItemPlacement;
+import org.simantics.trend.configuration.TimeFormat;
+import org.simantics.trend.configuration.TrendSpec;
+import org.simantics.trend.impl.MilestoneSpec;
+import org.simantics.trend.impl.TrendNode;
+import org.simantics.utils.datastructures.MapList;
+import org.simantics.utils.format.ValueFormat;
+import org.simantics.utils.threads.ThreadUtils;
+import org.simantics.utils.threads.WorkerThread;
+
+public class ExportChartPDF extends ExperimentExportClass {
+
+       public static final RecordType chartOptions;
+       
+       public static String S_CHART = "Chart";
+       public static ChildReference P_ITEMPLACEMENT = ChildReference.parsePath(S_CHART+"/Item Placement");
+       public static ChildReference P_TIMEFORMAT = ChildReference.parsePath(S_CHART+"/Time Format");
+       public static ChildReference P_VALUEFORMAT = ChildReference.parsePath(S_CHART+"/Value Format");
+       
+       static {
+               chartOptions = new RecordType();
+           chartOptions.addComponent("Item Placement", UnionType.newEnum("Stacked", "Overlapping"));
+           chartOptions.addComponent("Time Format", UnionType.newEnum("Decimal", "Time"));
+           chartOptions.addComponent("Value Format", UnionType.newEnum("Currency", "Scientific", "Engineering", "Default"));
+       }
+
+       @Override
+       public void export(List<Content> contents, 
+                       Object handle,
+                       ExportContext ctx, 
+                       Variant options,
+                       IProgressMonitor monitor, 
+                       MapList<Content, Content> attachmentMap
+                       ) throws ExportException {
+
+               // Flush all experiments, just in case.
+               IExperimentManager em = Simantics.getProject().getHint( ExperimentManager.KEY_EXPERIMENT_MANAGER );
+               if ( em != null ) {
+                       for (IExperiment exp : em.getExperiments()) {
+                               if ( exp instanceof IHistoryExperiment ) {
+                                       IHistoryExperiment he = (IHistoryExperiment) exp;
+                                       try {
+                                               he.flushHistory();
+                                       } catch (HistoryException e) {
+                                       }
+                               }
+                       }
+               }
+               
+               final ExportPdfWriter writer = (ExportPdfWriter) handle;
+        final WorkerThread workerThread = new WorkerThread("Chart PDF Painter");
+        workerThread.start();
+               try {
+                       
+                       final RecordAccessor ra = Accessors.getAccessor( options );
+                       
+                       // Get a list of the history managers the user has selected.
+                       List<ModelRef> modelRefs = ExperimentExportClass.getResult(ctx, options, true);
+                       List<ChartSettings> charts = new ArrayList<ChartSettings>();
+                                               
+                       for ( Content content : contents ) {
+                               if (monitor.isCanceled())
+                                       throw new OperationCanceledException();
+
+                               Resource chartRes = ctx.session.syncRequest( ExportQueries.toResource(content.url) );
+                               Resource model = ctx.session.syncRequest( new PossibleModel( chartRes ) );
+                               for (ModelRef modelRef : modelRefs) {
+                                       if ( !modelRef.resource.equals(model) ) continue;
+                                       for (ExperimentRef experimentRef : modelRef.experiments) {
+                                               for (RunRef runRef : experimentRef.runs) {                                              
+                                                       if ( runRef.historyFolder == null || !runRef.historyFolder.exists() ) continue;
+                                                       HistoryManager history = History.openFileHistory( runRef.historyFolder );
+                                                       
+                                                       ChartSettings cs = new ChartSettings();
+                                                       cs.history = history;
+                                                       cs.modelRef = modelRef;
+                                                       cs.experimentRef = experimentRef;
+                                                       cs.runRef = runRef;
+                                                       cs.chartRes = chartRes;
+                                                       charts.add( cs );
+                                               }                                               
+                                       }
+                               }                               
+                       }
+                                               
+                                                                       
+                       for ( final ChartSettings cs : charts ) {                               
+                               UUID id = UUID.randomUUID();
+                               final TrendSpec trendSpec = ctx.session.syncRequest( new TrendSpecQuery( id, cs.chartRes ) );
+                       if ( cs.modelRef.enabledRunCount() > 1 ) {
+                               // Add run ref to the label
+                               trendSpec.name += " / " + cs.runRef.label;
+                       }
+                       
+                       
+                       final MilestoneSpec milestones = ctx.session.syncRequest( new MilestoneSpecQuery( cs.experimentRef.resource ) );                        
+                       //final CanvasContext cctx = new CanvasContext( workerThread );
+                       final ExportException[] error = new ExportException[1]; 
+                       
+                ThreadUtils.syncExec(workerThread, new Runnable() {
+                    @Override
+                    public void run() {
+                                       CanvasContext cctx = TrendInitializer.createDefaultCanvas(workerThread, cs.history, null, null, trendSpec);
+                                       Page pdfPage = null;
+                               try {                                                                   
+                                       TrendNode trend = TrendInitializer.getTrendNode( cctx );   
+                                       trend.printing = true;
+                                       
+                                               String s = ExporterUtils.getUnionValue(ra, P_ITEMPLACEMENT);
+                                               if ( s!=null ) trend.itemPlacement = ItemPlacement.valueOf(s);
+                                               s = ExporterUtils.getUnionValue(ra, P_TIMEFORMAT);
+                                               if ( s!=null ) trend.timeFormat = TimeFormat.valueOf(s);
+                                               s = ExporterUtils.getUnionValue(ra, P_VALUEFORMAT);
+                                       if ( s!=null ) trend.valueFormat = ValueFormat.valueOf(s);
+                                       
+                                       if (milestones!=null) trend.setMilestones(milestones);
+                                               
+                                               pdfPage = writer.createPage( null );
+                                               Graphics2D g2d = pdfPage.createGraphics( true );
+                                               try {
+                                                       Rectangle2D clip = new Rectangle2D.Double(0, 0, pdfPage.getWidth(), pdfPage.getHeight());
+                                                       g2d.setClip( clip );
+                                           g2d.scale(0.25, 0.25);
+                                           trend.autoscale(true, true);
+                                                       trend.zoomOut();
+                                                       trend.layout();
+                                                       trend.render( g2d );
+                                               } finally {
+                                                       trend.cleanup();
+                                                       g2d.dispose();
+                                                       cs.history.close();
+                                               }
+                        } catch (ExportException e) {
+                               error[0] = e;
+                                               } finally {
+                               cctx.dispose();
+                               if ( pdfPage != null )
+                                                               try {
+                                                                       pdfPage.close();
+                                                               } catch (ExportException e) {
+                                                                       if ( error[0]==null ) error[0] = e;
+                                                               }
+                        }
+                    }
+                });
+                       if ( error[0] != null ) throw error[0];
+                               
+                       }
+               } catch (DatabaseException e) {
+                       throw new ExportException( e ); 
+               } catch (AccessorConstructionException e) {
+                       throw new ExportException( e ); 
+               } finally {
+                       workerThread.stopDispatchingEvents(true);
+               }
+               
+       }
+
+       
+       @Override
+       public RecordType options(ExportContext context, Collection<String> content) throws ExportException {
+               RecordType options = super.options(context, content);
+               options.addComponent(S_CHART, chartOptions);
+               return options;
+       }
+
+       @Override
+       public void fillDefaultPrefs(ExportContext ctx, Variant options) throws ExportException {
+               super.fillDefaultPrefs(ctx, options);
+               // Read from eclipse preferences
+        try {
+                       RecordAccessor ra = Accessors.getAccessor(options);                     
+                       Preferences instPrefs = InstanceScope.INSTANCE.getNode( ChartPreferences.P_NODE );
+                       Preferences defaultPrefs = DefaultScope.INSTANCE.getNode( ChartPreferences.P_NODE );
+                       
+                       String s;
+                       s = ExporterUtils.getPrefString(instPrefs, defaultPrefs, ChartPreferences.P_ITEMPLACEMENT);
+                       ExporterUtils.setUnionValue(ra, P_ITEMPLACEMENT, s);
+                       
+                       s = ExporterUtils.getPrefString(instPrefs, defaultPrefs, ChartPreferences.P_TIMEFORMAT);
+                       ExporterUtils.setUnionValue(ra, P_TIMEFORMAT, s);
+
+                       s = ExporterUtils.getPrefString(instPrefs, defaultPrefs, ChartPreferences.P_VALUEFORMAT);
+                       ExporterUtils.setUnionValue(ra, P_VALUEFORMAT, s);
+                       
+               } catch (AccessorConstructionException e) {
+                       throw new ExportException(e);
+               }
+       }
+
+       @Override
+       public void savePref(Variant options, Preferences contentScopeNode, Preferences workbenchScopeNode) throws ExportException {
+               super.savePref(options, contentScopeNode, workbenchScopeNode);
+        try {
+                       RecordAccessor ra = Accessors.getAccessor(options);                     
+                       String s;
+                       
+                       s = ExporterUtils.getUnionValue(ra, P_ITEMPLACEMENT);
+                       ExporterUtils.setPrefString(contentScopeNode, ChartPreferences.P_ITEMPLACEMENT, s);
+                       ExporterUtils.setPrefString(workbenchScopeNode, ChartPreferences.P_ITEMPLACEMENT, s);
+                       
+                       s = ExporterUtils.getUnionValue(ra, P_TIMEFORMAT);
+                       ExporterUtils.setPrefString(contentScopeNode, ChartPreferences.P_TIMEFORMAT, s);
+                       ExporterUtils.setPrefString(workbenchScopeNode, ChartPreferences.P_TIMEFORMAT, s);
+                       
+                       s = ExporterUtils.getUnionValue(ra, P_VALUEFORMAT);
+                       ExporterUtils.setPrefString(contentScopeNode, ChartPreferences.P_VALUEFORMAT, s);
+                       ExporterUtils.setPrefString(workbenchScopeNode, ChartPreferences.P_VALUEFORMAT, s);
+                       
+               } catch (AccessorConstructionException e) {
+                       throw new ExportException(e);
+               }
+               
+       }
+
+       @Override
+       public void loadPref(Variant options, Preferences contentScopeNode, Preferences workbenchScopeNode) throws ExportException {
+               super.loadPref(options, contentScopeNode, workbenchScopeNode);
+        try {
+                       RecordAccessor ra = Accessors.getAccessor(options);                     
+                       
+                       String s;
+                       s = ExporterUtils.getPrefString(contentScopeNode, ChartPreferences.P_ITEMPLACEMENT);
+                       if ( s==null ) s = ExporterUtils.getPrefString(workbenchScopeNode, ChartPreferences.P_ITEMPLACEMENT);
+                       ExporterUtils.setUnionValue(ra, P_ITEMPLACEMENT, s);
+                       
+                       s = ExporterUtils.getPrefString(contentScopeNode, ChartPreferences.P_TIMEFORMAT);
+                       if ( s==null ) s = ExporterUtils.getPrefString(workbenchScopeNode, ChartPreferences.P_TIMEFORMAT); 
+                       ExporterUtils.setUnionValue(ra, P_TIMEFORMAT, s);
+
+                       s = ExporterUtils.getPrefString(contentScopeNode, ChartPreferences.P_VALUEFORMAT);
+                       if ( s==null ) s = ExporterUtils.getPrefString(workbenchScopeNode, ChartPreferences.P_VALUEFORMAT); 
+                       ExporterUtils.setUnionValue(ra, P_VALUEFORMAT, s);
+                       
+               } catch (AccessorConstructionException e) {
+                       throw new ExportException(e);
+               }
+       }
+
+       @Override
+       public List<String> validate(String contentUri, ExportContext context, Variant options) {
+               return Collections.emptyList();
+       }
+       
+       static class ChartSettings {
+
+               Resource chartRes;
+               ModelRef modelRef;
+               ExperimentRef experimentRef;
+               RunRef runRef;
+               HistoryManager history;
+               
+       }
+
+}