/* ******************************************************************************
* Copyright (c) 2006-2013 XMind Ltd. and others.
*
* This file is a part of XMind 3. XMind releases 3 and
* above are dual-licensed under the Eclipse Public License (EPL),
* which is available at http://www.eclipse.org/legal/epl-v10.html
* and the GNU Lesser General Public License (LGPL),
* which is available at http://www.gnu.org/licenses/lgpl.html
* See http://www.xmind.net/license.html for details.
*
* Contributors:
* XMind Ltd. - initial API and implementation
*******************************************************************************/
package org.xmind.ui.internal.exports.vector.svg;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.program.Program;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.xmind.ui.mindmap.IMindMap;
import org.xmind.ui.mindmap.IMindMapImages;
import org.xmind.ui.mindmap.MindMapUI;
import org.xmind.ui.wizards.AbstractMindMapExportPage;
import org.xmind.ui.wizards.DocumentExportWizard;
import org.xmind.ui.wizards.ExportContants;
import org.xmind.ui.wizards.IExporter;
/**
* @author Jason Wong
*/
public class SVGExportWizard extends DocumentExportWizard {
private static final String PAGE_NAME = "org.xmind.ui.export.svgExportPage"; //$NON-NLS-1$
private static final String SECTION_NAME = "org.xmind.ui.export.svg"; //$NON-NLS-1$
private static final String SVG_EXT = ".svg"; //$NON-NLS-1$
private class SVGExportPage extends AbstractMindMapExportPage {
private Button showPlusCheck;
private Button showMinusCheck;
public SVGExportPage() {
super(PAGE_NAME, Messages.SVGPage_Title);
setDescription(Messages.SVGPage_Description);
}
protected void setDialogFilters(FileDialog dialog,
List<String> filterNames, List<String> filterExtensions) {
filterNames.add(0, Messages.SVGPage_FilterName);
filterExtensions.add(0, "*" + SVG_EXT); //$NON-NLS-1$
super.setDialogFilters(dialog, filterNames, filterExtensions);
}
public void createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.verticalSpacing = 25;
layout.marginTop = 20;
composite.setLayout(layout);
setControl(composite);
Control setupGroup = createSetupControls(composite);
setupGroup.setLayoutData(
new GridData(SWT.FILL, SWT.FILL, true, true));
Control fileGroup = createFileControls(composite);
GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, false);
gridData.widthHint = 210;
fileGroup.setLayoutData(gridData);
}
private Control createSetupControls(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout gridLayout = new GridLayout(1, false);
gridLayout.marginWidth = 0;
gridLayout.marginHeight = 0;
gridLayout.verticalSpacing = 20;
gridLayout.horizontalSpacing = 0;
composite.setLayout(gridLayout);
createShowPlusMinusControls(composite);
return composite;
}
private void createShowPlusMinusControls(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
GridLayout gridLayout = new GridLayout(1, false);
gridLayout.marginWidth = 0;
gridLayout.marginHeight = 0;
gridLayout.verticalSpacing = 15;
gridLayout.horizontalSpacing = 0;
composite.setLayout(gridLayout);
Label label = new Label(composite, SWT.NONE);
label.setLayoutData(
new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
label.setText(Messages.ExportWizard_Collapse_Expand_text);
Composite rightGroup = new Composite(composite, SWT.NONE);
GridLayout gridLayout2 = new GridLayout(1, false);
gridLayout2.marginWidth = 0;
gridLayout2.marginHeight = 0;
gridLayout2.verticalSpacing = 15;
gridLayout2.horizontalSpacing = 0;
gridLayout2.marginLeft = 15;
rightGroup.setLayout(gridLayout2);
GridData gridData = new GridData(SWT.FILL, SWT.FILL, false, false);
gridData.widthHint = 300;
gridData.heightHint = SWT.DEFAULT;
rightGroup.setLayoutData(gridData);
createShowPlusCheck(rightGroup);
createShowMinusCheck(rightGroup);
initPlusMinusCheckState();
}
private void createShowPlusCheck(Composite parent) {
showPlusCheck = createPlusMinusCheck(parent,
Messages.SVGExportWizard_showPlusCheck_text,
MindMapUI.getImages().get("plus.png", true).createImage()); //$NON-NLS-1$
}
private void createShowMinusCheck(Composite parent) {
showMinusCheck = createPlusMinusCheck(parent,
Messages.SVGExportWizard_showMinusCheck_text,
MindMapUI.getImages().get("minus.png", true).createImage()); //$NON-NLS-1$
}
private Button createPlusMinusCheck(Composite parent, String text,
Image image) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setBackground(parent.getBackground());
composite.setLayoutData(
new GridData(SWT.LEFT, SWT.CENTER, false, false));
GridLayout gridLayout = new GridLayout(2, false);
gridLayout.marginWidth = 0;
gridLayout.marginHeight = 0;
gridLayout.verticalSpacing = 0;
gridLayout.horizontalSpacing = 5;
composite.setLayout(gridLayout);
Button check = new Button(composite, SWT.CHECK);
check.setBackground(composite.getBackground());
check.setLayoutData(
new GridData(SWT.CENTER, SWT.CENTER, false, false));
check.setText(text);
Label imageLabel = new Label(composite, SWT.NONE);
imageLabel.setBackground(composite.getBackground());
imageLabel.setLayoutData(
new GridData(SWT.CENTER, SWT.CENTER, false, false));
imageLabel.setImage(image);
hookWidget(check, SWT.Selection);
return check;
}
private void initPlusMinusCheckState() {
boolean plusVisible = getBoolean(getDialogSettings(),
ExportContants.PLUS_VISIBLE,
ExportContants.DEFAULT_PLUS_VISIBLE);
boolean minusVisible = getBoolean(getDialogSettings(),
ExportContants.MINUS_VISIBLE,
ExportContants.DEFAULT_MINUS_VISIBLE);
showPlusCheck.setSelection(plusVisible);
showMinusCheck.setSelection(minusVisible);
}
private boolean getBoolean(IDialogSettings settings, String key,
boolean defaultValue) {
boolean value = defaultValue;
if (settings.get(key) != null) {
value = settings.getBoolean(key);
}
return value;
}
@Override
protected void handleWidgetEvent(Event event) {
if (event.widget == showPlusCheck) {
setProperty(ExportContants.PLUS_VISIBLE,
showPlusCheck.getSelection());
} else if (event.widget == showMinusCheck) {
setProperty(ExportContants.MINUS_VISIBLE,
showMinusCheck.getSelection());
} else {
super.handleWidgetEvent(event);
}
}
private void setProperty(String key, boolean value) {
getDialogSettings().put(key, value);
}
}
private SVGExportPage page;
public SVGExportWizard() {
setWindowTitle(Messages.SVGWizard_WindowTitle);
setDialogSettings(SvgPlugin.getDialogSettings(SECTION_NAME));
setDefaultPageImageDescriptor(
MindMapUI.getImages().getWizBan(IMindMapImages.WIZ_EXPORT));
}
@Override
protected IExporter createExporter() {
IMindMap mindmap = getSourceMindMap();
SVGExporter exporter = new SVGExporter(mindmap.getSheet(),
mindmap.getCentralTopic(), getTargetPath(), getSourceViewer(),
getDialogSettings());
exporter.setDialogSettings(getDialogSettings());
exporter.init();
return exporter;
}
@Override
public void openFile(String path, IProgressMonitor monitor) {
boolean edgeExcuteFlag = false;
if (new File(path).exists()) {
monitor.subTask(Messages.ExportPage_Launching);
if (isWin10OrHigher()) {
try {
edgeExcuteFlag = true;
Runtime.getRuntime()
.exec("cmd.exe /c \"start microsoft-edge:" //$NON-NLS-1$
+ new File(path).toURI().toString() + "\""); //$NON-NLS-1$
} catch (IOException e) {
e.printStackTrace();
}
}
if (!edgeExcuteFlag)
Program.launch(path);
}
}
public boolean isWin10OrHigher() {
String osVersion = System.getProperty("os.version"); //$NON-NLS-1$
String osName = System.getProperty("os.name"); //$NON-NLS-1$
if (osName.indexOf("Windows") != -1) //$NON-NLS-1$
if (osVersion.indexOf("10.") != -1 //$NON-NLS-1$
|| Double.valueOf(osVersion) > 6.2
&& Double.valueOf(osVersion) < 7.0)
return true;
return false;
}
@Override
protected void addValidPages() {
addPage(page = new SVGExportPage());
}
@Override
protected String getFormatName() {
return Messages.SVGWizard_FormatName;
}
@Override
protected boolean isExtensionCompatible(String path, String extension) {
return super.isExtensionCompatible(path, extension)
&& SVG_EXT.equalsIgnoreCase(extension);
}
@Override
protected void handleExportException(Throwable e) {
super.handleExportException(e);
page.setErrorMessage(e.getLocalizedMessage());
}
protected String getSuggestedFileName() {
return super.getSuggestedFileName() + SVG_EXT;
}
/*
* (non-Javadoc)
* @see org.xmind.ui.wizards.DocumentExportWizard#doExport(org.eclipse.core.
* runtime.IProgressMonitor, org.eclipse.swt.widgets.Display,
* org.eclipse.swt.widgets.Shell)
*/
@Override
protected void doExport(IProgressMonitor monitor, Display display,
Shell parentShell)
throws InvocationTargetException, InterruptedException {
SvgPlugin.getDefault().getUsageDataCollector()
.increase("ExportToSVGCount"); //$NON-NLS-1$
super.doExport(monitor, display, parentShell);
}
}