package org.xmind.ui.internal.actions; import java.io.File; import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.jface.action.IContributionItem; import org.eclipse.ui.actions.CompoundContributionItem; import org.eclipse.ui.internal.IPreferenceConstants; import org.eclipse.ui.internal.WorkbenchPlugin; import org.eclipse.ui.menus.CommandContributionItem; import org.eclipse.ui.menus.CommandContributionItemParameter; import org.eclipse.ui.menus.IWorkbenchContribution; import org.eclipse.ui.services.IServiceLocator; import org.xmind.ui.commands.MindMapCommandConstants; import org.xmind.ui.editor.IEditorHistory; import org.xmind.ui.internal.protocols.FilePathParser; public class RecentFileListContributionItem extends CompoundContributionItem implements IWorkbenchContribution { private static final int MAX_SIZE = 50; private IServiceLocator serviceLocator; public RecentFileListContributionItem() { } public RecentFileListContributionItem(String id) { super(id); } @Override protected IContributionItem[] getContributionItems() { List<IContributionItem> items = new ArrayList<IContributionItem>(); fillItems(items); IContributionItem[] itemArray = new IContributionItem[items.size()]; items.toArray(itemArray); return itemArray; } private void fillItems(List<IContributionItem> items) { if (serviceLocator == null) return; IEditorHistory editorHistory = serviceLocator .getService(IEditorHistory.class); if (editorHistory == null) return; URI[] pinnedInputURIs = editorHistory.getPinnedInputURIs(); int pinnedItensToShow = Math.min(pinnedInputURIs.length, MAX_SIZE); int unpinnedItemsToShow = WorkbenchPlugin.getDefault() .getPreferenceStore().getInt(IPreferenceConstants.RECENT_FILES); URI[] unpinnedInputURIs = editorHistory .getUnpinnedInputURIs(unpinnedItemsToShow); unpinnedItemsToShow = Math.min(MAX_SIZE, unpinnedInputURIs.length); URI[] inputURIs = new URI[pinnedItensToShow + unpinnedItemsToShow]; System.arraycopy(pinnedInputURIs, 0, inputURIs, 0, pinnedItensToShow); System.arraycopy(unpinnedInputURIs, 0, inputURIs, pinnedItensToShow, Math.min(unpinnedItemsToShow, unpinnedInputURIs.length)); Map<URI, String> labels = new HashMap<URI, String>(inputURIs.length); FilePathParser.calculateFileURILabels(inputURIs, labels); for (int index = 0; index < inputURIs.length; index++) { URI inputURI = inputURIs[index]; if (inputURI.getScheme().equalsIgnoreCase("file")) //$NON-NLS-1$ if (new File(inputURI).exists()) { items.add(makeHistoryCommandItem(inputURI, index, labels.get(inputURI))); } } } private IContributionItem makeHistoryCommandItem(URI item, int index, String label) { String indexStr = Integer.toString(index + 1); String id = "org.xmind.ui.file.recent." + indexStr; //$NON-NLS-1$ CommandContributionItemParameter parameter = new CommandContributionItemParameter( serviceLocator, id, MindMapCommandConstants.OPEN_WORKBOOK, CommandContributionItem.STYLE_PUSH); if (label == null) { label = item.toString(); } parameter.label = String.format("&%s %s", indexStr, label); //$NON-NLS-1$ Map<Object, Object> params = new HashMap<Object, Object>(); params.put(MindMapCommandConstants.OPEN_WORKBOOK_PARAM_URI, item.toString()); parameter.parameters = params; return new CommandContributionItem(parameter); } public void initialize(IServiceLocator serviceLocator) { this.serviceLocator = serviceLocator; } }