package org.xmind.ui.internal.wizards; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.eclipse.core.runtime.Path; import org.eclipse.jface.dialogs.IPageChangingListener; import org.eclipse.jface.dialogs.PageChangingEvent; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.activities.ITriggerPoint; import org.eclipse.ui.internal.IWorkbenchHelpContextIds; import org.eclipse.ui.internal.WorkbenchMessages; import org.eclipse.ui.internal.WorkbenchPlugin; import org.eclipse.ui.internal.activities.ws.WorkbenchTriggerPoints; import org.eclipse.ui.internal.dialogs.WizardCollectionElement; import org.eclipse.ui.internal.dialogs.WorkbenchWizardElement; import org.eclipse.ui.internal.dialogs.WorkbenchWizardNode; import org.eclipse.ui.wizards.IWizardCategory; import org.eclipse.ui.wizards.IWizardDescriptor; import org.xmind.ui.internal.MindMapMessages; /** * Wizard page class from which an export wizard is selected. * * @since 3.2 */ public class ExportPage extends ImportExportPage { private static final String STORE_SELECTED_EXPORT_WIZARD_ID = DIALOG_SETTING_SECTION_NAME + "STORE_SELECTED_EXPORT_WIZARD_ID"; //$NON-NLS-1$ private static final String STORE_EXPANDED_EXPORT_CATEGORIES = DIALOG_SETTING_SECTION_NAME + "STORE_EXPANDED_EXPORT_CATEGORIES"; //$NON-NLS-1$ private static final String STORE_RECENTLY_USED_WIZARD_IDS = DIALOG_SETTING_SECTION_NAME + "store_recently_used_wizard_ids"; //$NON-NLS-1$ private static final String WIZARD_ID_SPLIT = ";"; //$NON-NLS-1$ private static final int RECENTLY_USED_WIZARD_ID_SIZE = 5; private CategorizedWizardSelectionTree exportTree; /** * Constructor for export wizard selection page. * * @param aWorkbench * @param currentSelection */ public ExportPage(IWorkbench aWorkbench, IStructuredSelection currentSelection) { super(aWorkbench, currentSelection); wizardsOrder = ImportExportPage.getWizardsOrder("export-wizards"); //$NON-NLS-1$ } @Override protected void initialize() { workbench.getHelpSystem().setHelp(getControl(), IWorkbenchHelpContextIds.EXPORT_WIZARD_SELECTION_WIZARD_PAGE); } @Override public void createControl(Composite parent) { super.createControl(parent); final IPageChangingListener listener = new IPageChangingListener() { @Override public void handlePageChanging(PageChangingEvent event) { if (event.getCurrentPage() == ExportPage.this) { IWizardDescriptor wizardDescriptor = ((WorkbenchWizardNode) getSelectedNode()) .getWizardElement(); String selectedId = wizardDescriptor.getId(); List<String> recentWizardIds = getRecentWizardIds(); if (recentWizardIds.contains(selectedId)) { recentWizardIds.remove(selectedId); } if (recentWizardIds.size() > RECENTLY_USED_WIZARD_ID_SIZE - 1) { recentWizardIds .remove(RECENTLY_USED_WIZARD_ID_SIZE - 1); } recentWizardIds.add(0, selectedId); putRecentWizardIds(recentWizardIds); } } }; ((WizardDialog) getContainer()).addPageChangingListener(listener); getControl().addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent e) { if (getContainer() != null) { ((WizardDialog) getContainer()) .removePageChangingListener(listener); } } }); } private List<String> getRecentWizardIds() { String recentIds = getDialogSettings() .get(STORE_RECENTLY_USED_WIZARD_IDS); if (recentIds != null && !recentIds.equals("")) { //$NON-NLS-1$ String[] ids = recentIds.split(WIZARD_ID_SPLIT); return new ArrayList<String>(Arrays.asList(ids)); } return new ArrayList<String>(); } private void putRecentWizardIds(List<String> recentWizardIds) { String recentIds = ""; //$NON-NLS-1$ if (recentWizardIds.size() >= 1) { recentIds += recentWizardIds.get(0); } if (recentWizardIds.size() >= 2) { for (int i = 1; i < recentWizardIds.size(); i++) { recentIds += WIZARD_ID_SPLIT + recentWizardIds.get(i); } } getDialogSettings().put(STORE_RECENTLY_USED_WIZARD_IDS, recentIds); } @Override protected Composite createTreeViewer(Composite parent) { IWizardCategory root = WorkbenchPlugin.getDefault() .getExportWizardRegistry().getRootCategory(); root = insertRecentWizards(root); exportTree = new CategorizedWizardSelectionTree(root, WorkbenchMessages.ExportWizard_selectWizard); Composite exportComp = exportTree.createControl(parent); exportTree.getViewer() .addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { listSelectionChanged(event.getSelection()); } }); exportTree.getViewer() .addDoubleClickListener(new IDoubleClickListener() { @Override public void doubleClick(DoubleClickEvent event) { treeDoubleClicked(event); } }); setTreeViewer(exportTree.getViewer()); return exportComp; } private IWizardCategory insertRecentWizards(IWizardCategory root) { List<String> recentWizardIds = getRecentWizardIds(); if (recentWizardIds.size() == 0) { return root; } List<IWizardDescriptor> wizardDescriptors = new ArrayList<IWizardDescriptor>(); collectWizardDescriptors(wizardDescriptors, root); List<IWizardDescriptor> recentWizards = new ArrayList<IWizardDescriptor>(); for (String wizardId : recentWizardIds) { for (IWizardDescriptor wizardDescriptor : wizardDescriptors) { if (wizardId.contains(wizardDescriptor.getId())) { recentWizards.add(wizardDescriptor); break; } } } if (recentWizards.size() == 0) { return root; } //create new root. WizardCollectionElement newRoot = new WizardCollectionElement("root", //$NON-NLS-1$ null, "root", null); //$NON-NLS-1$ //add recent use WizardCollectionElement recentCategory = new WizardCollectionElement( RECENTLY_USED_CATEGORY_ID, null, MindMapMessages.ExportPage_Categore_Recent_name, newRoot); for (IWizardDescriptor wizardDescriptor : recentWizards) { WorkbenchWizardElement newDescriptor = new WorkbenchWizardElement( ((WorkbenchWizardElement) wizardDescriptor) .getConfigurationElement()); newDescriptor.setParent(recentCategory); recentCategory.add(newDescriptor); } newRoot.add(recentCategory); //add old for (IWizardCategory wizardCategory : root.getCategories()) { newRoot.add((WizardCollectionElement) wizardCategory); } for (IWizardDescriptor wizardDescriptor : root.getWizards()) { newRoot.add(wizardDescriptor); } return newRoot; } private void collectWizardDescriptors(List<IWizardDescriptor> descriptors, IWizardCategory wizardCategory) { if (wizardCategory != null) { descriptors.addAll(Arrays.asList(wizardCategory.getWizards())); for (IWizardCategory category : wizardCategory.getCategories()) { collectWizardDescriptors(descriptors, category); } } } @Override public void saveWidgetValues() { storeExpandedCategories(STORE_EXPANDED_EXPORT_CATEGORIES, exportTree.getViewer()); storeSelectedCategoryAndWizard(STORE_SELECTED_EXPORT_WIZARD_ID, exportTree.getViewer()); super.saveWidgetValues(); } @Override protected void restoreWidgetValues() { IWizardCategory exportRoot = WorkbenchPlugin.getDefault() .getExportWizardRegistry().getRootCategory(); expandPreviouslyExpandedCategories(STORE_EXPANDED_EXPORT_CATEGORIES, exportRoot, exportTree.getViewer()); selectPreviouslySelected(STORE_SELECTED_EXPORT_WIZARD_ID, exportRoot, exportTree.getViewer()); super.restoreWidgetValues(); } @Override protected ITriggerPoint getTriggerPoint() { return getWorkbench().getActivitySupport().getTriggerPointManager() .getTriggerPoint(WorkbenchTriggerPoints.EXPORT_WIZARDS); } @Override protected void updateMessage() { setMessage(WorkbenchMessages.ImportExportPage_chooseExportWizard); super.updateMessage(); } @Override protected void expandPreviouslyExpandedCategories(String setting, IWizardCategory wizardCategories, TreeViewer viewer) { String[] expandedCategoryPaths = getDialogSettings().getArray(setting); if (expandedCategoryPaths == null || expandedCategoryPaths.length == 0) { return; } List<String> idList = Arrays.asList(expandedCategoryPaths); for (IWizardCategory category : wizardCategories.getCategories()) { if (!idList.contains(category.getId())) { viewer.setExpandedState(wizardCategories .findCategory(new Path(category.getId())), false); } } } }