/* Copyright (C) 2009 Mobile Sorcery AB
This program is free software; you can redistribute it and/or modify it
under the terms of the Eclipse Public License v1.0.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the Eclipse Public License v1.0 for
more details.
You should have received a copy of the Eclipse Public License v1.0 along
with this program. It is also available at http://www.eclipse.org/legal/epl-v10.html
*/
package com.mobilesorcery.sdk.fontsupport.internal.wizard;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.text.MessageFormat;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.preference.ColorSelector;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import com.mobilesorcery.sdk.core.Util;
import com.mobilesorcery.sdk.fontsupport.MOF;
public class GenerateMOFWizard extends Wizard {
class GenerateMOFRunnable implements IRunnableWithProgress {
private File fontFile;
private File mofFile;
private RGB fontColor;
public GenerateMOFRunnable(File fontFile, File mofFile, RGB fontColor) {
this.fontFile = fontFile;
this.mofFile = mofFile;
this.fontColor = fontColor;
}
public void run(IProgressMonitor monitor)
throws InvocationTargetException, InterruptedException {
try {
monitor.beginTask(Messages.GenerateMOFWizard_0, 2);
MOF.generate(new SubProgressMonitor(monitor, 1), fontFile, mofFile, fontColor);
IFile[] refreshThis = ResourcesPlugin.getWorkspace().getRoot().findFilesForLocation(new Path(mofFile.getAbsolutePath()));
for (int i = 0; i < refreshThis.length; i++) {
refreshThis[i].getParent().refreshLocal(IResource.DEPTH_ONE, new SubProgressMonitor(monitor, 1));
}
} catch (Exception e) {
throw new InvocationTargetException(e, MessageFormat.format(Messages.GenerateMOFWizard_1, e.getMessage()));
} finally {
monitor.done();
}
}
}
public class MOFConfigPage extends WizardPage {
private File file;
private Text outputFile;
private ColorSelector color;
protected MOFConfigPage(String pageName) {
super(pageName);
setNeedsProgressMonitor(true);
setTitle(Messages.GenerateMOFWizard_2);
setDescription(Messages.GenerateMOFWizard_3);
}
public void createControl(Composite parent) {
Composite main = new Composite(parent, SWT.NONE);
main.setLayout(new GridLayout(2, false));
Label fileLabel = new Label(main, SWT.NONE);
fileLabel.setText(Messages.GenerateMOFWizard_4);
Label fileLocationLabel = new Label(main, SWT.NONE);
fileLocationLabel.setText(file.getAbsolutePath());
Label outputFileLabel = new Label(main, SWT.NONE);
outputFileLabel.setText(Messages.GenerateMOFWizard_5);
outputFile = new Text(main, SWT.BORDER);
outputFile.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
outputFile.addModifyListener(new ModifyListener() {
public void modifyText(ModifyEvent e) {
validate();
}
});
outputFile.setText(computeDefaultOutputFile(file));
Label colorLabel = new Label(main, SWT.NONE);
colorLabel.setText(Messages.GenerateMOFWizard_6);
color = new ColorSelector(main);
color.setColorValue(MOF.DEFAULT_COLOR);
setControl(main);
}
private String computeDefaultOutputFile(File inputFile) {
inputFile.getName();
return Util.replaceExtension(inputFile.getName(), MOF.MOF_FILE_EXTENSION);
}
public void setFile(File file) {
this.file = file;
}
public String getOutputFile() {
return this.outputFile.getText();
}
public RGB getOutputColor() {
return color.getColorValue();
}
}
private MOFConfigPage mofConfigPage;
private File file;
public GenerateMOFWizard() {
super();
}
public void addPages() {
mofConfigPage = new MOFConfigPage(Messages.GenerateMOFWizard_7);
mofConfigPage.setFile(file);
addPage(mofConfigPage);
}
public boolean performFinish() {
File outputFile = getOutputFile();
RGB color = mofConfigPage.getOutputColor();
GenerateMOFRunnable mofRunnable = new GenerateMOFRunnable(file, outputFile, color);
try {
mofConfigPage.setErrorMessage(null);
this.getContainer().run(true, true, mofRunnable);
return true;
} catch (Exception e) {
String errorMessage = MessageFormat.format(
Messages.GenerateMOFWizard_8,
e.getMessage());
mofConfigPage.setErrorMessage(errorMessage);
MessageDialog.openError(getShell(), Messages.GenerateMOFWizard_0, errorMessage);
return false;
}
}
private File getOutputFile() {
String output = mofConfigPage.getOutputFile();
return Util.relativeTo(file, output);
}
public void validate() {
String message = null;
int severity = IMessageProvider.NONE;
File outputFile = getOutputFile();
if (outputFile.exists()) {
message = Messages.GenerateMOFWizard_9;
severity = IMessageProvider.WARNING;
}
mofConfigPage.setMessage(message, severity);
}
public void setFilename(File osFile) {
this.file = osFile;
}
}