/******************************************************************************* * Copyright (c) 2011, 2012 Wind River Systems 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: * Wind River Systems - initial API and implementation *******************************************************************************/ package org.eclipse.debug.internal.ui.actions.expressions; import org.eclipse.debug.core.model.IWatchExpression; import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer; import org.eclipse.debug.internal.ui.views.expression.ExpressionView; import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.jface.action.Action; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; /** * This action activates the cell editor in the expressions view to edit the * expression string. If no expression column found or for multi-line * expressions, revert to the */ public class EditWatchExpressinInPlaceAction extends Action implements ISelectionChangedListener { private ExpressionView fView; private TreeModelViewer fViewer; private EditWatchExpressionAction fEditActionDelegate = new EditWatchExpressionAction(); public EditWatchExpressinInPlaceAction(ExpressionView view) { fView = view; fViewer = (TreeModelViewer)view.getViewer(); fEditActionDelegate.init(view); ISelectionProvider selectionProvider = fView.getSite().getSelectionProvider(); selectionProvider.addSelectionChangedListener(this); fEditActionDelegate.selectionChanged(this, selectionProvider.getSelection()); } @Override public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection selection = fEditActionDelegate.getCurrentSelection(); setEnabled(selection != null && selection.size() == 1); } public void dispose() { fView.getSite().getSelectionProvider().removeSelectionChangedListener(this); } @Override public void run() { IStructuredSelection selelection = fEditActionDelegate.getCurrentSelection(); if (selelection.size() != 1) { return; } // Always edit multi-line expressions in dialog. Otherwise try to find the expression // column and activate cell editor there. int expressionColumn = getExpressionColumnIndex(); IWatchExpression[] expressions = fEditActionDelegate.getSelectedExpressions(); if (expressionColumn != -1 && !isWatchExpressionWithNewLine(expressions)) { fViewer.editElement(selelection.getFirstElement(), expressionColumn); } else if (expressions.length == 1) { fEditActionDelegate.run(this); } } private boolean isWatchExpressionWithNewLine(IWatchExpression[] expressions) { return expressions.length == 1 && expressions[0].getExpressionText().indexOf('\n') != -1; } private int getExpressionColumnIndex() { Object[] columnProperties = fViewer.getColumnProperties(); for (int i = 0; columnProperties != null && i < columnProperties.length; i++) { if (IDebugUIConstants.COLUMN_ID_VARIABLE_NAME.equals(columnProperties[i])) { return i; } } return -1; } }