/*******************************************************************************
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * Copyright (c) 2007, 2017 Association for Decentralized Information Management
* in Industry THTH ry.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
*
* Contributors:
* VTT Technical Research Centre of Finland - initial API and implementation
+ * Semantum Oy - initial selection handling improvements
*******************************************************************************/
package org.simantics.modeling.ui.pdf;
import java.util.Collection;
import java.util.Collections;
import java.util.Deque;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
-import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.preference.IPersistentPreferenceStore;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.IFilter;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.preferences.ScopedPreferenceStore;
+import org.simantics.NameLabelMode;
+import org.simantics.NameLabelUtil;
import org.simantics.Simantics;
-import org.simantics.browsing.ui.graph.impl.request.GetName;
import org.simantics.db.ReadGraph;
import org.simantics.db.Resource;
import org.simantics.db.common.NamedResource;
import org.simantics.db.common.request.ObjectsWithType;
+import org.simantics.db.common.request.PossibleIndexRoot;
import org.simantics.db.common.request.ReadRequest;
import org.simantics.db.exception.DatabaseException;
-import org.simantics.db.layer0.request.ActiveModels;
import org.simantics.db.management.ISessionContext;
import org.simantics.layer0.Layer0;
import org.simantics.modeling.requests.Node;
import org.simantics.ui.SimanticsUI;
import org.simantics.ui.utils.ResourceAdaptionUtils;
import org.simantics.utils.FileUtils;
+import org.simantics.utils.strings.AlphanumComparator;
import org.simantics.utils.ui.ErrorLogger;
import org.simantics.utils.ui.ExceptionUtils;
import org.simantics.utils.ui.workbench.StringMemento;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class PDFDiagramExportWizard extends Wizard implements IExportWizard {
+ private static final Logger LOGGER = LoggerFactory.getLogger(PDFDiagramExportWizard.class);
+
private static final int MAX_RECENT_EXPORT_PATHS = 10;
private static final String TAG_PATH = "path";
Deque<String> recentExportPaths;
boolean zoomToFit;
- boolean attachTG, attachWiki;
+ boolean attachTG, attachWiki, addPageNumbers;
- PDFExportPlan exportPlan;
+ PDFExportPlan exportPlan;
private boolean readPreferences() {
IPreferenceStore store = new ScopedPreferenceStore(InstanceScope.INSTANCE, Activator.PLUGIN_ID);
zoomToFit = store.getBoolean(Preferences.DIAGRAM_EXPORT_PDF_ZOOM_TO_FIT);
attachTG = store.getBoolean(Preferences.DIAGRAM_EXPORT_PDF_ATTACH_TG);
attachWiki = store.getBoolean(Preferences.DIAGRAM_EXPORT_PDF_ATTACH_WIKI);
+ addPageNumbers = store.getBoolean(Preferences.DIAGRAM_EXPORT_PDF_ADD_PAGE_NUMBERS);
return true;
}
store.putValue(Preferences.DIAGRAM_EXPORT_PDF_ZOOM_TO_FIT, String.valueOf(zoomToFit));
store.putValue(Preferences.DIAGRAM_EXPORT_PDF_ATTACH_TG, String.valueOf(attachTG));
store.putValue(Preferences.DIAGRAM_EXPORT_PDF_ATTACH_WIKI, String.valueOf(attachWiki));
+ store.putValue(Preferences.DIAGRAM_EXPORT_PDF_ADD_PAGE_NUMBERS, String.valueOf(addPageNumbers));
if (store.needsSaving())
store.save();
}
private Deque<String> decodePaths(String recentPathsPref) {
- Deque<String> result = new LinkedList<String>();
+ Deque<String> result = new LinkedList<>();
try {
StringMemento sm = new StringMemento(recentPathsPref);
for (IMemento m : sm.getChildren(TAG_PATH)) {
}
private NamedResource toNamedResource(ReadGraph graph, Resource r) throws DatabaseException {
- String name = graph.syncRequest(new GetName(r));
+ String name = NameLabelUtil.modalName(graph, r, NameLabelMode.NAME_AND_LABEL);
return new NamedResource(name, r);
}
exportPlan = new PDFExportPlan(ctx, recentExportPaths);
exportPlan.project = project;
- final Object selectedObject = selection.getFirstElement();
+ exportPlan.initialSelection = selection;
exportPlan.fitContentToPageMargins = zoomToFit;
exportPlan.attachTG = attachTG;
exportPlan.attachWiki = attachWiki;
+ exportPlan.addPageNumbers = addPageNumbers;
// Get all model names
try {
exportPlan.sessionContext.getSession().syncRequest(new ReadRequest() {
@Override
public void run(ReadGraph graph) throws DatabaseException {
- Resource selection = ResourceAdaptionUtils.toSingleResource(selectedObject);
- if (selection != null) {
- //exportModel.selection = new NamedResource(name + " (input selection)", selection);
- exportPlan.selection = toNamedResource(graph, selection);
- exportPlan.selectableModels.add(exportPlan.selection);
- } else {
- for (Resource activeModel : graph.syncRequest(new ActiveModels(exportPlan.project.get()))) {
- selection = activeModel;
- exportPlan.selection = toNamedResource(graph, activeModel);
- exportPlan.selectableModels.add( exportPlan.selection );
- break;
- }
- }
+ Set<Resource> processed = new HashSet<>();
+ List<NamedResource> models = new ArrayList<>();
- List<NamedResource> models = new ArrayList<NamedResource>();
-
Collection<Resource> ontologies = Simantics.applySCL("Simantics/SharedOntologies", "traverseSharedOntologies", graph, graph.getRootLibrary());
- for (Resource model : ontologies) {
- if (model.equals(selection))
- continue;
- models.add( toNamedResource(graph, model) );
+ for (Resource root : ontologies) {
+ if (processed.add(root))
+ models.add( toNamedResource(graph, root) );
}
-
+
for (Resource model : graph.syncRequest(new ObjectsWithType(exportPlan.project.get(),
Layer0.getInstance(graph).ConsistsOf, SimulationResource.getInstance(graph).Model))) {
- if (model.equals(selection))
- continue;
- models.add( toNamedResource(graph, model) );
+ if (processed.add(model))
+ models.add( toNamedResource(graph, model) );
}
- Collections.sort(models);
+ Collections.sort(models, AlphanumComparator.CASE_INSENSITIVE_COMPARATOR);
exportPlan.selectableModels.addAll(models);
- if (selection == null && !exportPlan.selectableModels.isEmpty()) {
+
+ Resource selected = ResourceAdaptionUtils.toSingleResource(selection.getFirstElement());
+ Resource indexRoot = selected != null ? graph.sync(new PossibleIndexRoot(selected)) : null;
+ if (indexRoot != null)
+ exportPlan.initialModelSelection = exportPlan.selection = toNamedResource(graph, indexRoot);
+
+ if (exportPlan.selection == null && !exportPlan.selectableModels.isEmpty())
exportPlan.selection = exportPlan.selectableModels.get(0);
- }
}
});
} catch (DatabaseException e) {
- e.printStackTrace();
+ LOGGER.error("Failed to initialize diagram PDF export wizard input data.", e);
}
}
recentExportPaths.addFirst(exportPlan.exportLocation.getAbsolutePath());
// Remove duplicates
- Set<String> dups = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);
+ Set<String> dups = new TreeSet<>(String.CASE_INSENSITIVE_ORDER);
for (Iterator<String> it = recentExportPaths.iterator(); it.hasNext();) {
String path = it.next();
if (!dups.add(path)) {
zoomToFit = exportPlan.fitContentToPageMargins;
attachTG = exportPlan.attachTG;
attachWiki = exportPlan.attachWiki;
+ addPageNumbers = exportPlan.addPageNumbers;
writePreferences();
} catch (IOException e) {
long start = System.currentTimeMillis();
try {
- getContainer().run(true, true, new IRunnableWithProgress() {
- @Override
- public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
- try {
- // Print pdf
- DiagramPrinter.printToPdf(monitor, exportPlan, exportPlan.exportLocation.toString(), exportPlan.selectedNodes, exportPlan.sessionContext);
-
- } catch (PdfException e) {
- throw new InvocationTargetException(e);
- } finally {
- monitor.done();
- }
+ getContainer().run(true, true, monitor -> {
+ try {
+ DiagramPrinter.printToPdf(monitor, exportPlan, exportPlan.exportLocation.toString(), exportPlan.selectedNodes);
+ } catch (PdfException e) {
+ throw new InvocationTargetException(e);
+ } finally {
+ monitor.done();
}
});
} catch (InvocationTargetException e) {
return false;
}
long end = System.currentTimeMillis();
- System.out.println("PDF export took " + ((end - start) * 1e-3) + " seconds.");
+ LOGGER.info("PDF export took " + ((end - start) * 1e-3) + " seconds.");
return true;
}