--- /dev/null
+package com.quantum.wizards;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import com.quantum.Messages;
+import com.quantum.QuantumPlugin;
+import com.quantum.model.Bookmark;
+import com.quantum.model.BookmarkCollection;
+import com.quantum.model.xml.ModelToXMLConverter;
+import com.quantum.ui.dialog.ExceptionDisplayDialog;
+import com.quantum.util.xml.XMLHelper;
+
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+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.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+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.FileDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.w3c.dom.Document;
+
+/**
+ * @author BC
+ */
+public class ExportBookmarkWizardPage extends WizardPage {
+
+ public class ContentProvider implements ITreeContentProvider {
+
+ public Object[] getChildren(Object parentElement) {
+ if (parentElement instanceof BookmarkCollection) {
+ return ((BookmarkCollection) parentElement).getBookmarks();
+ } else {
+ return new Object[0];
+ }
+ }
+ public Object getParent(Object element) {
+ if (element instanceof Bookmark) {
+ return BookmarkCollection.getInstance();
+ } else {
+ return null;
+ }
+ }
+ public boolean hasChildren(Object element) {
+ if (element instanceof BookmarkCollection) {
+ return ((BookmarkCollection) element).getBookmarks().length > 0;
+ } else {
+ return false;
+ }
+ }
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+ public void dispose() {
+ }
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ }
+ }
+
+ public class LabelProvider implements ILabelProvider {
+
+ public Image getImage(Object element) {
+ if (element instanceof Bookmark) {
+ return QuantumPlugin.getImage("bookmarks.gif");
+ } else {
+ return null;
+ }
+ }
+
+ public String getText(Object element) {
+
+ if (element instanceof Bookmark) {
+ return ((Bookmark) element).getName();
+ } else {
+ return element.toString();
+ }
+ }
+
+ public void addListener(ILabelProviderListener listener) {
+ }
+
+ public void dispose() {
+ }
+
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ public void removeListener(ILabelProviderListener listener) {
+ }
+ }
+
+ private CheckboxTreeViewer treeViewer;
+ private Text fileNameText;
+
+ private boolean sourceIsSelected = false;
+ private boolean destinationIsSelected = false;
+
+ /**
+ * @param pageName
+ */
+ protected ExportBookmarkWizardPage() {
+ super("page1");
+ setTitle(Messages.getString(getClass(), "title"));
+ }
+
+ public void createControl(Composite pageContainer) {
+ this.sourceIsSelected = false;
+ this.destinationIsSelected = false;
+
+ Composite composite = new Composite(pageContainer, SWT.NULL);
+ composite.setLayout(new GridLayout());
+ composite.setLayoutData(
+ new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
+
+ this.treeViewer = new CheckboxTreeViewer(composite,
+ SWT.CHECK | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
+ this.treeViewer.setContentProvider(new ContentProvider());
+ this.treeViewer.setLabelProvider(new LabelProvider());
+ this.treeViewer.setInput(BookmarkCollection.getInstance());
+ selectAll();
+
+ this.treeViewer.addCheckStateListener(new ICheckStateListener() {
+ public void checkStateChanged(CheckStateChangedEvent event) {
+ setSourceIsSelected(
+ ExportBookmarkWizardPage.this.treeViewer.getCheckedElements().length > 0);
+ }
+ });
+
+ GridData data = new GridData();
+ data.horizontalAlignment = GridData.HORIZONTAL_ALIGN_FILL;
+ data.verticalAlignment = GridData.VERTICAL_ALIGN_BEGINNING;
+ data.grabExcessHorizontalSpace = true;
+ data.heightHint = 200;
+ data.widthHint = 400;
+ this.treeViewer.getControl().setLayoutData(data);
+
+ Composite buttons = new Composite(composite, SWT.NULL);
+ buttons.setLayout(new GridLayout(2, false));
+ buttons.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
+
+ Button selectAll = new Button(buttons, SWT.NONE);
+ selectAll.setText(Messages.getString(getClass(), "selectAll"));
+ selectAll.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent event) {
+ selectAll();
+ }
+ });
+
+ Button deselectAll = new Button(buttons, SWT.NONE);
+ deselectAll.setText(Messages.getString(getClass(), "deselectAll"));
+ deselectAll.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent event) {
+ deselectAll();
+ }
+ });
+
+ createDestinationArea(composite);
+
+ setControl(composite);
+ }
+
+ private void createDestinationArea(Composite composite) {
+ GridData data;
+ Composite fileArea = new Composite(composite, SWT.NULL);
+ fileArea.setLayout(new GridLayout(3, false));
+ fileArea.setLayoutData(
+ new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL));
+ Label label = new Label(fileArea, SWT.NONE);
+ label.setText("File name:");
+
+ this.fileNameText = new Text(fileArea, SWT.BORDER);
+ data = new GridData();
+ data.horizontalAlignment = GridData.HORIZONTAL_ALIGN_FILL;
+ data.widthHint = 300;
+ this.fileNameText.setLayoutData(data);
+ this.fileNameText.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent event) {
+ String text = ((Text) event.getSource()).getText();
+ setDestinationIsSelected(text != null && text.trim().length() > 0);
+ }
+ });
+
+ Button button = new Button(fileArea, SWT.NONE);
+ button.setText("Browse");
+ button.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent event) {
+ promptForFile();
+ }
+ });
+ }
+
+ private void setSourceIsSelected(boolean selected) {
+ this.sourceIsSelected = selected;
+ setPageComplete(selected & this.destinationIsSelected);
+ }
+
+ private void setDestinationIsSelected(boolean selected) {
+ this.destinationIsSelected = selected;
+ setPageComplete(selected & this.sourceIsSelected);
+ }
+
+ protected void promptForFile() {
+
+ FileDialog dialog = new FileDialog(getShell(), SWT.SAVE);
+ dialog.setFilterExtensions(new String[] { "xml" });
+ dialog.setFilterNames(new String[] { "XML Files (*.xml)"});
+ String filename = dialog.open();
+ if (filename != null) {
+ this.fileNameText.setText(filename);
+ }
+ }
+ protected void deselectAll() {
+ this.treeViewer.setCheckedElements(new Object[0]);
+ setSourceIsSelected(false);
+ }
+
+ protected void selectAll() {
+ Bookmark[] bookmarks = BookmarkCollection.getInstance().getBookmarks();
+ this.treeViewer.setCheckedElements(bookmarks);
+ setSourceIsSelected(bookmarks.length > 0);
+ }
+
+ public boolean finish() {
+
+ String fileName = this.fileNameText.getText();
+ File file = new File(fileName);
+ if (file.exists()) {
+ // prompt for overwrite
+ } else if (!file.getParentFile().exists()) {
+ // do what?
+ }
+
+ try {
+ Object[] bookmarks = this.treeViewer.getCheckedElements();
+ Document document = XMLHelper.createEmptyDocument();
+ ModelToXMLConverter.getInstance().createRoot(document);
+
+ for (int i = 0, length = (bookmarks == null) ? 0 : bookmarks.length;
+ i < length;
+ i++) {
+ ModelToXMLConverter.getInstance().convert(
+ document.getDocumentElement(), (Bookmark) bookmarks[i]);
+ }
+
+ FileWriter writer = new FileWriter(file);
+ try {
+ XMLHelper.write(writer, document);
+ } finally {
+ writer.close();
+ }
+ } catch (IOException e) {
+ ExceptionDisplayDialog.openError(getShell(),
+ Messages.getString(getClass(), "error.IOException.title"),
+ Messages.getString(getClass(), "error.IOException.message",
+ new Object[] { fileName }), e);
+ } catch (ParserConfigurationException e) {
+ ExceptionDisplayDialog.openError(getShell(),
+ Messages.getString(getClass(), "error.IOException.title"),
+ Messages.getString(getClass(), "error.IOException.message",
+ new Object[] { fileName }), e);
+ }
+
+ return true;
+ }
+}