/*
* Copyright (c) 2006-2012 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 net.xmind.share;
import java.io.File;
import java.util.List;
import net.xmind.share.dialog.UploaderDialog;
import net.xmind.share.jobs.UploadJob;
import net.xmind.signin.IAccountInfo;
import net.xmind.signin.XMindNet;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
import org.eclipse.draw2d.Layer;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.xmind.core.Core;
import org.xmind.core.IMeta;
import org.xmind.core.ISheet;
import org.xmind.core.ITopic;
import org.xmind.core.IWorkbook;
import org.xmind.core.util.HyperlinkUtils;
import org.xmind.gef.GEF;
import org.xmind.ui.mindmap.IMindMapViewer;
import org.xmind.ui.mindmap.MindMapExtractor;
import org.xmind.ui.mindmap.MindMapImageExporter;
import org.xmind.ui.mindmap.MindMapUI;
import org.xmind.ui.resources.ColorUtils;
public class Uploader extends JobChangeAdapter {
private Shell parentShell;
private IMindMapViewer sourceViewer;
private IWorkbook workbook;
private MindMapExtractor extractor;
private Info info;
private Point origin;
private Image fullImage;
private File file;
public Uploader(Shell parentShell, IMindMapViewer sourceViewer) {
this.parentShell = parentShell;
this.sourceViewer = sourceViewer;
}
public void upload() {
info = new Info();
if (!signIn()) {
cancel();
return;
}
extractor = new MindMapExtractor(sourceViewer);
workbook = extractor.extract();
trimAttachments();
generatePreview();
if (fullImage == null || origin == null) {
cancel();
MessageDialog.openError(parentShell,
Messages.UploaderDialog_windowTitle,
Messages.failedToGenerateThumbnail);
return;
}
final String mapTitle = getDefaultMapTitle();
info.setProperty(Info.TITLE, mapTitle);
info.setProperty(Info.DESCRIPTION, getDefaultMapDescription());
info.setProperty(Info.FULL_IMAGE, fullImage);
info.setInt(IMeta.ORIGIN_X, origin.x);
info.setInt(IMeta.ORIGIN_Y, origin.y);
info.setProperty(IMeta.BACKGROUND_COLOR, getBackgroundColor());
UploaderDialog dialog = createUploadDialog();
int ret = dialog.open();
if (ret != UploaderDialog.OK) {
cancel();
return;
}
int x = info.getInt(Info.X, 0);
int y = info.getInt(Info.Y, 0);
double scale = info.getDouble(Info.SCALE, 1.0d);
// 300 * 180 -> 150 * 90
scale /= 2;
IMeta meta = workbook.getMeta();
meta.setValue(Info.DESCRIPTION, info.getString(Info.DESCRIPTION));
meta.setValue(Info.X, String.valueOf(x));
meta.setValue(Info.Y, String.valueOf(y));
meta.setValue(Info.SCALE, String.valueOf(scale));
meta.setValue(IMeta.ORIGIN_X, String.valueOf(origin.x));
meta.setValue(IMeta.ORIGIN_Y, String.valueOf(origin.y));
meta.setValue(IMeta.BACKGROUND_COLOR,
info.getString(IMeta.BACKGROUND_COLOR));
meta.setValue(Info.PRIVACY,
info.getString(Info.PRIVACY, Info.PRIVACY_PUBLIC));
meta.setValue(Info.DOWNLOADABLE,
info.getString(Info.DOWNLOADABLE, Info.DOWNLOADABLE_YES));
meta.setValue(Info.LANGUAGE_CHANNEL,
info.getString(Info.LANGUAGE_CHANNEL));
if (file == null) {
String tempFile = Core.getWorkspace()
.getTempFile(
"upload/" //$NON-NLS-1$
+ Core.getIdFactory().createId()
+ MindMapUI.FILE_EXT_XMIND);
file = new File(tempFile);
}
SafeRunner.run(new SafeRunnable(Messages.failedToGenerateUploadFile) {
public void run() throws Exception {
String path = file.getAbsolutePath();
workbook.saveTemp();
workbook.save(path);
}
});
if (!file.exists() || !file.canRead()) {
// some error may have occurred and been catched
// by the above SafeRunner, so we simply return here
//cancel();
return;
}
if (file != null) {
info.setProperty(Info.FILE, file);
info.setProperty(Info.WORKBOOK, workbook);
UploadJob uploadJob = new UploadJob(info);
uploadJob.addJobChangeListener(this);
uploadJob.schedule();
}
}
private String getBackgroundColor() {
Layer layer = sourceViewer.getLayer(GEF.LAYER_BACKGROUND);
if (layer != null) {
Color color = layer.getBackgroundColor();
if (color != null)
return ColorUtils.toString(color);
}
return "#ffffff"; //$NON-NLS-1$
}
private boolean signIn() {
IAccountInfo accountInfo = XMindNet.signIn();
if (accountInfo != null) {
info.setProperty(Info.USER_ID, accountInfo.getUser());
info.setProperty(Info.TOKEN, accountInfo.getAuthToken());
return true;
}
return false;
}
private UploaderDialog createUploadDialog() {
UploaderDialog dialog = new UploaderDialog(parentShell);
dialog.setInfo(info);
return dialog;
}
private void generatePreview() {
final Display display = parentShell.getDisplay();
BusyIndicator.showWhile(display, new Runnable() {
public void run() {
SafeRunner.run(new SafeRunnable(
Messages.failedToGenerateThumbnail) {
public void run() throws Exception {
MindMapImageExporter exporter = new MindMapImageExporter(
display);
exporter.setSourceViewer(sourceViewer);
exporter.setTargetWorkbook(workbook);
fullImage = exporter.createImage();
exporter.export(fullImage);
origin = exporter.calcRelativeOrigin();
}
});
}
});
}
private void cancel() {
clearTemp();
}
private void clearTemp() {
if (fullImage != null) {
fullImage.dispose();
fullImage = null;
}
if (extractor != null) {
extractor.delete();
extractor = null;
}
if (file != null) {
file.delete();
file = null;
}
workbook = null;
}
private String getDefaultMapTitle() {
if (workbook != null) {
return workbook.getPrimarySheet().getRootTopic().getTitleText();
}
return null;
}
private String getDefaultMapDescription() {
if (workbook != null) {
String desc = workbook.getMeta().getValue(IMeta.DESCRIPTION);
if (desc == null || "".equals(desc)) { //$NON-NLS-1$
ITopic rootTopic = workbook.getPrimarySheet().getRootTopic();
List<ITopic> mainTopics = rootTopic
.getChildren(ITopic.ATTACHED);
if (!mainTopics.isEmpty()) {
StringBuffer sb = new StringBuffer(mainTopics.size() * 15);
for (int i = 0; i < mainTopics.size(); i++) {
sb.append(mainTopics.get(i).getTitleText());
if (i < mainTopics.size() - 1) {
sb.append(" / "); //$NON-NLS-1$
}
}
desc = sb.toString();
}
}
return desc;
}
return null;
}
@Override
public void done(final IJobChangeEvent event) {
clearTemp();
}
private void trimAttachments() {
for (ISheet sheet : workbook.getSheets()) {
trimAttachments(sheet.getRootTopic());
}
}
private void trimAttachments(ITopic topic) {
String hyperlink = topic.getHyperlink();
if (hyperlink != null) {
if (HyperlinkUtils.isAttachmentURL(hyperlink)) {
topic.setHyperlink(null);
}
}
}
}