/***************************************************************** * Copyright (c) 2011 Texas Instruments and others * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Winnie Lai (Texas Instruments) - Individual Element Number Format (Bug 202556) *****************************************************************/ package org.eclipse.cdt.dsf.debug.ui.viewmodel.numberformat; import java.util.ArrayList; import java.util.List; import org.eclipse.cdt.dsf.concurrent.CountingRequestMonitor; import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; import org.eclipse.cdt.dsf.concurrent.ImmediateExecutor; import org.eclipse.cdt.dsf.debug.ui.viewmodel.actions.VMHandlerUtils; import org.eclipse.cdt.dsf.ui.concurrent.SimpleDisplayExecutor; import org.eclipse.cdt.dsf.ui.viewmodel.IVMContext; import org.eclipse.cdt.dsf.ui.viewmodel.IVMNode; import org.eclipse.cdt.dsf.ui.viewmodel.IVMProvider; import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.ContributionItem; import org.eclipse.jface.action.IContributionItem; import org.eclipse.jface.action.Separator; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ITreeSelection; import org.eclipse.jface.viewers.TreePath; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; /** * Dynamic menu contribution that shows available number formats in the current * selection of the view. * * @since 2.2 */ public class ElementNumberFormatsContribution extends NumberFormatsContribution { private class SelectFormatAction extends Action { private final IElementFormatProvider fProvider; private final IPresentationContext fContext; private final IVMNode[] fNodes; private final Object fViewerInput; private final TreePath[] fElementPaths; private final String fFormatId; SelectFormatAction(IElementFormatProvider provider, IPresentationContext context, IVMNode[] nodes, Object viewerInput, TreePath[] elementPaths, String formatId) { super(formatId == null ? "Restore To Preference" : FormattedValueVMUtil.getFormatLabel(formatId), //$NON-NLS-1$ formatId == null ? AS_PUSH_BUTTON : AS_RADIO_BUTTON); fProvider = provider; fContext = context; fNodes = nodes; fViewerInput = viewerInput; fElementPaths = elementPaths; fFormatId = formatId; } @Override public void run() { if (fFormatId == null) { fProvider.setActiveFormat(fContext, fNodes, fViewerInput, fElementPaths, fFormatId); return; } if (isChecked()) { fProvider.setActiveFormat(fContext, fNodes, fViewerInput, fElementPaths, fFormatId); } } } protected static IContributionItem[] NO_ITEMS = new IContributionItem[] { new ContributionItem() { @Override public void fill(Menu menu, int index) { MenuItem item = new MenuItem(menu, SWT.NONE); item.setEnabled(false); item.setText(MessagesForNumberFormat.NumberFormatContribution_EmptyFormatsList_label); } @Override public boolean isEnabled() { return false; } } }; @Override protected IContributionItem[] getContributionItems() { ISelection selection = VMHandlerUtils.getSelection(fServiceLocator); if (selection == null || selection.isEmpty() || selection instanceof ITreeSelection == false) { return NO_ITEMS; } IVMProvider provider = VMHandlerUtils.getVMProviderForSelection(selection); if (provider instanceof IElementFormatProvider == false) { } if (FORMATS.size() == 0) { return NO_ITEMS; } IPresentationContext context = provider.getPresentationContext(); TreePath[] elementPaths = ((ITreeSelection) selection).getPaths(); IVMNode[] nodes = new IVMNode[elementPaths.length]; final String[] formats = new String[elementPaths.length]; Object viewerInput = null; final List<SelectFormatAction> actions = new ArrayList<SelectFormatAction>(FORMATS.size()); for (String formatId : FORMATS) { actions.add(new SelectFormatAction((IElementFormatProvider) provider, context, nodes, viewerInput, elementPaths, formatId)); } CountingRequestMonitor crm = new CountingRequestMonitor(SimpleDisplayExecutor.getSimpleDisplayExecutor(Display.getDefault()), null) { @Override protected void handleCompleted() { String activeFormat = null; for (int i = 0; i < formats.length; i++) { if (i == 0) { activeFormat = formats[i]; } else if (activeFormat != null && activeFormat.equals(formats[i]) == false) { activeFormat = null; } } if (activeFormat != null) { for (int i = 0; i < actions.size(); i++) { if (activeFormat.equals(actions.get(i).fFormatId)) { actions.get(i).setChecked(true); } } } } }; for (int i = 0; i < elementPaths.length; i++) { Object segment = elementPaths[i].getLastSegment(); if (segment instanceof IVMContext) { nodes[i] = ((IVMContext) segment).getVMNode(); } else { nodes[i] = null; } final int index = i; ((IElementFormatProvider) provider).getActiveFormat(context, nodes[i], viewerInput, elementPaths[i], new DataRequestMonitor<String>(ImmediateExecutor.getInstance(), crm) { @Override protected void handleSuccess() { formats[index] = this.getData(); super.handleSuccess(); } }); } crm.setDoneCount(elementPaths.length); int count = actions.size(); IContributionItem[] items = new IContributionItem[count + 2]; for (int i = 0; i < actions.size(); i++) { items[i] = new ActionContributionItem(actions.get(i)); } items[count] = new Separator(); items[count + 1] = new ActionContributionItem(new SelectFormatAction( (IElementFormatProvider) provider, context, nodes, viewerInput, elementPaths, null)); return items; } }