/* ******************************************************************************
* 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 org.xmind.ui.internal.wizards;
import java.io.File;
import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.jface.util.SafeRunnable;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.wizard.Wizard;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.DirectoryDialog;
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.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Widget;
import org.eclipse.ui.IImportWizard;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.forms.events.HyperlinkAdapter;
import org.eclipse.ui.forms.events.HyperlinkEvent;
import org.eclipse.ui.forms.widgets.FormText;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.xmind.ui.browser.BrowserSupport;
import org.xmind.ui.internal.MarkerImpExpUtils;
import org.xmind.ui.internal.dialogs.DialogMessages;
import org.xmind.ui.internal.e4models.IModelConstants;
import org.xmind.ui.internal.prefs.MarkerManagerPrefPage;
import org.xmind.ui.internal.utils.E4Utils;
import org.xmind.ui.mindmap.MindMapUI;
import org.xmind.ui.util.PrefUtils;
public class MarkerImportWizard extends Wizard implements IImportWizard {
private static final String PAGE_NAME = "org.xmind.ui.MarkerImportWizardPage"; //$NON-NLS-1$
private class MarkerImportWizardPage extends WizardPage {
private class WidgetListener implements Listener {
public void handleEvent(Event event) {
handleWidgetEvent(event);
}
}
private Button fromFileButton;
private Button fromDirectoryButton;
private Text fileInput;
private Button fileBrowseButton;
private Text folderInput;
private Button folderBrowseButton;
private FormToolkit formToolkit;
private boolean modifyingPathInput = false;
private boolean settingTargetPath = false;
private boolean pathModified = false;
private Listener widgetListener;
protected MarkerImportWizardPage() {
super(PAGE_NAME, WizardMessages.MarkerImportPage_title, null);
setDescription(WizardMessages.MarkerImportPage_description);
}
public void createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayoutData(
new GridData(SWT.FILL, SWT.FILL, true, true));
GridLayout gridLayout = new GridLayout(1, false);
gridLayout.marginWidth = 5;
gridLayout.marginHeight = 5;
gridLayout.verticalSpacing = 5;
gridLayout.horizontalSpacing = 5;
composite.setLayout(gridLayout);
setControl(composite);
formToolkit = new FormToolkit(parent.getDisplay());
composite.addDisposeListener(new DisposeListener() {
public void widgetDisposed(DisposeEvent e) {
formToolkit.dispose();
}
});
formToolkit.setBackground(null);
fromFileButton = new Button(composite, SWT.RADIO);
fromFileButton.setText(WizardMessages.ImportPage_FromFile_text);
hookWidget(fromFileButton, SWT.Selection);
Control fileGroup = createFileControls(composite);
fileGroup.setLayoutData(
new GridData(SWT.FILL, SWT.FILL, true, false));
Label blank = new Label(composite, SWT.NONE);
blank.setLayoutData(
new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
blank.setText(" "); //$NON-NLS-1$
fromDirectoryButton = new Button(composite, SWT.RADIO);
fromDirectoryButton
.setText(WizardMessages.MarkerImportPage_FromFolder_text);
hookWidget(fromDirectoryButton, SWT.Selection);
Control directoryGroup = createFolderGroup(composite);
directoryGroup.setLayoutData(
new GridData(SWT.FILL, SWT.FILL, true, false));
setFileOrFolder(true);
}
protected Control createFileControls(Composite parent) {
Composite group = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(3, false);
layout.marginWidth = 0;
layout.marginHeight = 0;
group.setLayout(layout);
Label blank = new Label(group, SWT.WRAP);
blank.setLayoutData(new GridData(GridData.BEGINNING,
GridData.CENTER, false, false));
blank.setText(" "); //$NON-NLS-1$
fileInput = new Text(group, SWT.SINGLE | SWT.BORDER);
if (getSourcePath() != null) {
fileInput.setText(getSourcePath());
}
fileInput.setLayoutData(
new GridData(GridData.FILL, GridData.FILL, true, false));
hookWidget(fileInput, SWT.Modify);
hookWidget(fileInput, SWT.FocusIn);
fileBrowseButton = new Button(group, SWT.PUSH);
fileBrowseButton.setText(WizardMessages.ImportPage_Browse_text);
int width = fileBrowseButton.computeSize(SWT.DEFAULT,
SWT.DEFAULT).x;
GridData layoutData = new GridData(GridData.END, GridData.CENTER,
false, false);
layoutData.widthHint = Math.max(93, width);
fileBrowseButton.setLayoutData(layoutData);
hookWidget(fileBrowseButton, SWT.Selection);
FormText descriptionText = createDescriptionText(group);
descriptionText.setText(
WizardMessages.MarkerImportPage_FromFile_description, true,
true);
return group;
}
private FormText createDescriptionText(Composite parent) {
FormText descriptionText = formToolkit.createFormText(parent, true);
descriptionText.addHyperlinkListener(new HyperlinkAdapter() {
public void linkActivated(HyperlinkEvent e) {
final Object href = e.getHref();
if (href instanceof String) {
SafeRunner.run(new SafeRunnable() {
public void run() throws Exception {
BrowserSupport.getInstance().createBrowser()
.openURL((String) href);
}
});
}
}
});
descriptionText.setLayoutData(
new GridData(SWT.FILL, SWT.FILL, true, false));
((GridData) descriptionText.getLayoutData()).horizontalSpan = 3;
((GridData) descriptionText.getLayoutData()).widthHint = 400;
return descriptionText;
}
private Control createFolderGroup(Composite parent) {
Composite group = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout(3, false);
layout.marginWidth = 0;
layout.marginHeight = 0;
group.setLayout(layout);
Label blank = new Label(group, SWT.WRAP);
blank.setLayoutData(new GridData(GridData.BEGINNING,
GridData.CENTER, false, false));
blank.setText(" "); //$NON-NLS-1$
folderInput = new Text(group, SWT.SINGLE | SWT.BORDER);
if (getSourcePath() != null) {
folderInput.setText(getSourcePath());
}
folderInput.setLayoutData(
new GridData(GridData.FILL, GridData.FILL, true, false));
hookWidget(folderInput, SWT.Modify);
hookWidget(folderInput, SWT.FocusIn);
folderBrowseButton = new Button(group, SWT.PUSH);
folderBrowseButton.setText(WizardMessages.ImportPage_Browse_text);
int width = folderBrowseButton.computeSize(SWT.DEFAULT,
SWT.DEFAULT).x;
GridData layoutData = new GridData(GridData.END, GridData.CENTER,
false, false);
layoutData.widthHint = Math.max(93, width);
folderBrowseButton.setLayoutData(layoutData);
hookWidget(folderBrowseButton, SWT.Selection);
FormText descriptionText = createDescriptionText(group);
descriptionText.setText(
WizardMessages.MarkerImportPage_FromFolder_description,
true, true);
return group;
}
protected void hookWidget(Widget widget, int eventType) {
if (widgetListener == null) {
widgetListener = new WidgetListener();
}
widget.addListener(eventType, widgetListener);
}
protected void handleWidgetEvent(Event event) {
if (event.widget == fileInput) {
if (event.type == SWT.Modify) {
pathModified = true;
if (!settingTargetPath) {
modifyingPathInput = true;
setSourcePath(fileInput.getText());
modifyingPathInput = false;
}
updateStatus();
} else if (event.type == SWT.FocusIn) {
fileInput.setSelection(
new Point(0, fileInput.getText().length()));
}
} else if (event.widget == fileBrowseButton) {
openFileDialog();
fileInput.setFocus();
} else if (event.widget == folderInput) {
if (event.type == SWT.Modify) {
pathModified = true;
if (!settingTargetPath) {
modifyingPathInput = true;
setSourcePath(folderInput.getText());
modifyingPathInput = false;
}
updateStatus();
} else if (event.type == SWT.FocusIn) {
folderInput.setSelection(
new Point(0, folderInput.getText().length()));
}
} else if (event.widget == folderBrowseButton) {
openDirectoryDialog();
folderInput.setFocus();
} else if (event.widget == fromFileButton) {
setFileOrFolder(true);
} else if (event.widget == fromDirectoryButton) {
setFileOrFolder(false);
}
}
private void setFileOrFolder(boolean fileOrFolder) {
fromFileButton.setSelection(fileOrFolder);
fromDirectoryButton.setSelection(!fileOrFolder);
fileInput.setEnabled(fileOrFolder);
fileBrowseButton.setEnabled(fileOrFolder);
folderInput.setEnabled(!fileOrFolder);
folderBrowseButton.setEnabled(!fileOrFolder);
Text input = fileOrFolder ? fileInput : folderInput;
input.setFocus();
setSourcePath(input.getText());
}
public void dispose() {
super.dispose();
fileInput = null;
fileBrowseButton = null;
folderBrowseButton = null;
folderInput = null;
modifyingPathInput = false;
settingTargetPath = false;
pathModified = false;
}
protected void openFileDialog() {
FileDialog dialog = createFileDialog();
String path = dialog.open();
if (path != null) {
setSourcePath(path);
}
}
protected FileDialog createFileDialog() {
FileDialog dialog = new FileDialog(getShell(), SWT.OPEN);
dialog.setText(WizardMessages.ImportPage_FileDialog_text);
String ext = "*" + MindMapUI.FILE_EXT_MARKER_PACKAGE; //$NON-NLS-1$
dialog.setFilterExtensions(new String[] { ext });
dialog.setFilterNames(new String[] { NLS.bind("{0} ({1})", //$NON-NLS-1$
DialogMessages.MarkerPackageFilterName, ext) });
if (getSourcePath() != null) {
File file = new File(getSourcePath());
dialog.setFilterPath(file.getParent());
dialog.setFileName(file.getName());
}
return dialog;
}
protected void openDirectoryDialog() {
DirectoryDialog dialog = createDirectoryDialog();
String path = dialog.open();
if (path != null) {
setSourcePath(path);
}
}
private DirectoryDialog createDirectoryDialog() {
DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.OPEN);
dialog.setText(WizardMessages.MarkerImportPage_FolderDialog_title);
return dialog;
}
protected void updateStatus() {
setPageComplete(isPageCompletable());
String warningMessage = generateWarningMessage();
if (warningMessage != null) {
setMessage(warningMessage, WARNING);
} else {
setMessage(null);
}
setErrorMessage(generateErrorMessage());
}
protected String generateWarningMessage() {
return null;
}
protected String generateErrorMessage() {
if (pathModified && !hasSourcePath()) {
return WizardMessages.ImportPage_FileNotExists_message;
}
return null;
}
protected boolean isPageCompletable() {
return hasSourcePath();
}
protected void setSourcePath(String path) {
MarkerImportWizard.this.setSourcePath(path);
if (!modifyingPathInput) {
settingTargetPath = true;
if (fileInput.isEnabled()) {
fileInput.setText(path);
} else {
folderInput.setText(path);
}
settingTargetPath = false;
}
}
}
private boolean openMarkerManagerPageOnFinish;
private String sourcePath;
private IWorkbench workbench;
public MarkerImportWizard() {
this(true);
}
public MarkerImportWizard(boolean openMarkerManagerPageOnFinish) {
this.openMarkerManagerPageOnFinish = openMarkerManagerPageOnFinish;
setWindowTitle(WizardMessages.MarkerImportWizard_windowTitle);
}
public void addPages() {
addPage(new MarkerImportWizardPage());
}
public String getSourcePath() {
return sourcePath;
}
public void setSourcePath(String sourcePath) {
this.sourcePath = sourcePath;
}
public boolean hasSourcePath() {
return sourcePath != null;
}
public boolean performFinish() {
final boolean[] finished = new boolean[1];
SafeRunner.run(new SafeRunnable() {
public void run() throws Exception {
MarkerImpExpUtils.importMarkerPackage(sourcePath);
finished[0] = true;
if (openMarkerManagerPageOnFinish) {
openMarkerManagerPage();
} else {
openMarkerView();
}
}
public void handleException(Throwable e) {
finished[0] = false;
super.handleException(e);
}
});
return finished[0];
}
private void openMarkerView() {
if (workbench != null) {
IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
if (window != null) {
E4Utils.showPart(IModelConstants.COMMAND_SHOW_MODEL_PART,
window, IModelConstants.PART_ID_MARKERS, null,
IModelConstants.PART_STACK_ID_RIGHT);
}
}
}
private void openMarkerManagerPage() {
Display.getCurrent().asyncExec(new Runnable() {
public void run() {
PrefUtils.openPrefDialog(null, MarkerManagerPrefPage.ID);
}
});
}
public void init(IWorkbench workbench, IStructuredSelection selection) {
this.workbench = workbench;
}
}