package org.eclipse.jdt.internal.debug.ui.display;/* * (c) Copyright IBM Corp. 2000, 2001. * All Rights Reserved. */import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import org.eclipse.core.runtime.IStatus;import org.eclipse.core.runtime.Status;import org.eclipse.debug.core.model.IStackFrame;import org.eclipse.jdt.core.IJavaElement;import org.eclipse.jdt.core.IJavaProject;import org.eclipse.jdt.debug.core.IJavaStackFrame;import org.eclipse.jdt.internal.debug.ui.IHelpContextIds;import org.eclipse.jdt.internal.debug.ui.JDIContentAssistPreference;import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin;import org.eclipse.jdt.internal.debug.ui.JDISourceViewer;import org.eclipse.jdt.internal.ui.JavaPlugin;import org.eclipse.jdt.ui.text.JavaTextTools;import org.eclipse.jface.action.IAction;import org.eclipse.jface.action.IMenuListener;import org.eclipse.jface.action.IMenuManager;import org.eclipse.jface.action.IToolBarManager;import org.eclipse.jface.action.MenuManager;import org.eclipse.jface.action.Separator;import org.eclipse.jface.dialogs.ErrorDialog;import org.eclipse.jface.text.BadLocationException;import org.eclipse.jface.text.Document;import org.eclipse.jface.text.IDocument;import org.eclipse.jface.text.ITextOperationTarget;import org.eclipse.jface.text.ITextSelection;import org.eclipse.jface.text.contentassist.ContentAssistant;import org.eclipse.jface.text.contentassist.IContentAssistant;import org.eclipse.jface.text.source.ISourceViewer;import org.eclipse.jface.util.IPropertyChangeListener;import org.eclipse.jface.util.PropertyChangeEvent;import org.eclipse.jface.viewers.ISelectionChangedListener;import org.eclipse.jface.viewers.SelectionChangedEvent;import org.eclipse.swt.SWT;import org.eclipse.swt.custom.VerifyKeyListener;import org.eclipse.swt.events.VerifyEvent;import org.eclipse.swt.widgets.Composite;import org.eclipse.swt.widgets.Menu;import org.eclipse.ui.IActionBars;import org.eclipse.ui.IMemento;import org.eclipse.ui.IViewSite;import org.eclipse.ui.IWorkbenchActionConstants;import org.eclipse.ui.PartInitException;import org.eclipse.ui.help.ViewContextComputer;import org.eclipse.ui.help.WorkbenchHelp;import org.eclipse.ui.part.ViewPart;import org.eclipse.ui.texteditor.ITextEditorActionConstants;import org.eclipse.ui.texteditor.IUpdate;public class DisplayView extends ViewPart implements IPropertyChangeListener, ISelectionChangedListener {			/**	 * Display view identifier (value <code>"org.eclipse.debug.ui.DisplayView"</code>).	 */	public static final String ID_DISPLAY_VIEW= "org.eclipse.jdt.debug.ui.DisplayView"; //$NON-NLS-1$		/**	 * Constants used in persisting/restoring the state of this view	 * in an IMemento.	 */	protected static final String LINE_OFFSET= "line_offset_"; //$NON-NLS-1$	protected static final String TABS= "tab_offset_"; //$NON-NLS-1$	protected static final String CONTENTS= "contents"; //$NON-NLS-1$			class DataDisplay implements IDataDisplay {		/**		 * @see IDataDisplay#clear()		 */		public void clear() {			IDocument document= fSourceViewer.getDocument();			if (document != null) {				document.set(""); //$NON-NLS-1$			}		}				/**		 * @see IDataDisplay#displayExpression(String)		 */		public void displayExpression(String expression) {			ITextSelection selection= (ITextSelection)fSourceViewer.getSelection();			int offset= selection.getOffset();			expression= expression.trim();			StringBuffer buffer= new StringBuffer(expression);			buffer.append(System.getProperty("line.separator")); //$NON-NLS-1$			buffer.append("\t"); //$NON-NLS-1$			expression= buffer.toString();			try {				fSourceViewer.getDocument().replace(offset, selection.getLength(), expression);					fSourceViewer.setSelectedRange(offset + expression.length(), 0);					fSourceViewer.revealRange(offset, expression.length());			} catch (BadLocationException ble) {				JDIDebugUIPlugin.logError(ble);			}		}						/**		 * @see IDataDisplay#displayExpressionValue(String)		 */		public void displayExpressionValue(String value) {			value= value + System.getProperty("line.separator"); //$NON-NLS-1$			ITextSelection selection= (ITextSelection)fSourceViewer.getSelection();			int offset= selection.getOffset();			int length= value.length();			int replace= selection.getLength() - offset;			if (replace < 0) {				replace= 0;			}			try {				fSourceViewer.getDocument().replace(offset, replace, value);				} catch (BadLocationException ble) {				JDIDebugUIPlugin.logError(ble);			}			fSourceViewer.setSelectedRange(offset + length, 0);				fSourceViewer.revealRange(offset, length);		}	}				protected IDataDisplay fDataDisplay= new DataDisplay();		protected List fLineOffsets;	protected List fTabOffsets;		protected JDISourceViewer fSourceViewer;	protected IAction fClearDisplayAction;	protected DisplayAction fDisplayAction;	protected InspectAction fInspectAction;	protected IAction fContentAssistAction;	protected Map fGlobalActions= new HashMap(4);	protected List fSelectionActions= new ArrayList(4);	protected String fRestoredContents= null;		/**	 * @see ViewPart#createChild(IWorkbenchPartContainer)	 */	public void createPartControl(Composite parent) {				int styles= SWT.V_SCROLL | SWT.H_SCROLL | SWT.MULTI | SWT.FULL_SELECTION;		fSourceViewer= new JDISourceViewer(parent, null, styles);		JavaTextTools textTools= JavaPlugin.getDefault().getJavaTextTools();		fSourceViewer.configure(new DisplayViewerConfiguration(textTools, this));		fSourceViewer.addSelectionChangedListener(this);		JavaPlugin.getDefault().getPreferenceStore().addPropertyChangeListener(this);		IDocument doc= null;		if (fRestoredContents != null) {			doc= new Document(fRestoredContents);			Integer offset;			for (int i= 0; i < fLineOffsets.size(); i++) {				offset= (Integer)fLineOffsets.get(i);				try {					doc.replace(offset.intValue(), 1, doc.getLegalLineDelimiters()[0]);				} catch (BadLocationException ble) {					JDIDebugUIPlugin.logError(ble);				}			}			for (int i= 0; i < fTabOffsets.size(); i++) {				offset= (Integer)fTabOffsets.get(i);				try {					doc.replace(offset.intValue(), 1, "\t"); //$NON-NLS-1$				} catch (BadLocationException ble) {					JDIDebugUIPlugin.logError(ble);				}			}		} else {			doc= new Document();		}		fSourceViewer.setDocument(doc);		fRestoredContents= null;		initializeActions();		initializeToolBar();		// create context menu		MenuManager menuMgr = new MenuManager("#PopUp", ID_DISPLAY_VIEW); //$NON-NLS-1$		menuMgr.setRemoveAllWhenShown(true);		menuMgr.addMenuListener(new IMenuListener() {			public void menuAboutToShow(IMenuManager mgr) {				fillContextMenu(mgr);			}		});				Menu menu = menuMgr.createContextMenu(fSourceViewer.getTextWidget());		fSourceViewer.getTextWidget().setMenu(menu);		getSite().registerContextMenu(menuMgr, fSourceViewer);		getSite().setSelectionProvider(fSourceViewer.getSelectionProvider());				WorkbenchHelp.setHelp(fSourceViewer.getTextWidget(), new ViewContextComputer(this, IHelpContextIds.DISPLAY_VIEW));			}	/**	 * @see IWorkbenchPart#setFocus()	 */	public void setFocus() {		if (fSourceViewer != null) {			fSourceViewer.getControl().setFocus();		}	}		/**	 * Initialize the actions of this view	 */	protected void initializeActions() {						fClearDisplayAction= new ClearDisplayAction(this);		fDisplayAction= new DisplayAction(this, false);		fInspectAction= new InspectAction(this, false);		updateEvalActions();		IActionBars actionBars = getViewSite().getActionBars();				IAction action;				action= new DisplayViewAction(this, fSourceViewer.CUT);		action.setText(DisplayMessages.getString("DisplayView.Cut.label")); //$NON-NLS-1$		action.setToolTipText(DisplayMessages.getString("DisplayView.Cut.tooltip")); //$NON-NLS-1$		action.setDescription(DisplayMessages.getString("DisplayView.Cut.description")); //$NON-NLS-1$		setGlobalAction(actionBars, ITextEditorActionConstants.CUT, action);				action= new DisplayViewAction(this, fSourceViewer.COPY);		action.setText(DisplayMessages.getString("DisplayView.Copy.label")); //$NON-NLS-1$		action.setToolTipText(DisplayMessages.getString("DisplayView.Copy.tooltip")); //$NON-NLS-1$		action.setDescription(DisplayMessages.getString("DisplayView.Copy.description")); //$NON-NLS-1$		setGlobalAction(actionBars, ITextEditorActionConstants.COPY, action);				action= new DisplayViewAction(this, fSourceViewer.PASTE);		action.setText(DisplayMessages.getString("DisplayView.Paste.label")); //$NON-NLS-1$		action.setToolTipText(DisplayMessages.getString("DisplayView.Paste.tooltip")); //$NON-NLS-1$		action.setDescription(DisplayMessages.getString("DisplayView.Paste.Description")); //$NON-NLS-1$		setGlobalAction(actionBars, ITextEditorActionConstants.PASTE, action);				action= new DisplayViewAction(this, fSourceViewer.SELECT_ALL);		action.setText(DisplayMessages.getString("DisplayView.SelectAll.label")); //$NON-NLS-1$		action.setToolTipText(DisplayMessages.getString("DisplayView.SelectAll.tooltip")); //$NON-NLS-1$		action.setDescription(DisplayMessages.getString("DisplayView.SelectAll.description")); //$NON-NLS-1$		setGlobalAction(actionBars, ITextEditorActionConstants.SELECT_ALL, action);				fSelectionActions.add(ITextEditorActionConstants.CUT);		fSelectionActions.add(ITextEditorActionConstants.COPY);		fSelectionActions.add(ITextEditorActionConstants.PASTE);				fContentAssistAction= new DisplayViewAction(this, ISourceViewer.CONTENTASSIST_PROPOSALS);		fContentAssistAction.setText(DisplayMessages.getString("DisplayView.Co&ntent_Assist@Ctrl+Space_1")); //$NON-NLS-1$		fContentAssistAction.setDescription(DisplayMessages.getString("DisplayView.Content_Assist_2")); //$NON-NLS-1$		fContentAssistAction.setToolTipText(DisplayMessages.getString("DisplayView.Content_Assist_2")); //$NON-NLS-1$				addVerifyKeyListener();	}		protected void addVerifyKeyListener() {		fSourceViewer.getTextWidget().addVerifyKeyListener(new VerifyKeyListener() {			public void verifyKey(VerifyEvent event) {				//do code assist for CTRL-SPACE				if (event.stateMask == SWT.CTRL && event.keyCode == 0) {					if (event.character == 0x20) {						if(fContentAssistAction.isEnabled()) {							fContentAssistAction.run();							event.doit= false;						}					}					//do display for CTRL-D					if (event.character == 0x4) {						if(fDisplayAction.isEnabled()) {							fDisplayAction.run();							event.doit= false;						}					}					//do inspect for CTRL-Q					if (event.character == 0x11) {						if(fInspectAction.isEnabled()) {							fInspectAction.run();							event.doit= false;						}					}				}			}		});	}		protected void setGlobalAction(IActionBars actionBars, String actionID, IAction action) {		fGlobalActions.put(actionID, action);		actionBars.setGlobalActionHandler(actionID, action);	}	/**	 * Configures the toolBar.	 */	protected void initializeToolBar() {		IToolBarManager tbm = getViewSite().getActionBars().getToolBarManager();		tbm.add(fClearDisplayAction);		tbm.add(fDisplayAction);		tbm.add(fInspectAction);		getViewSite().getActionBars().updateActionBars();	}	/**	 * Adds the context menu actions for the display view.	 */	protected void fillContextMenu(IMenuManager menu) {				if (fSourceViewer.getDocument() == null) {			return;		} 		updateActions();			menu.add(fInspectAction);		menu.add(fDisplayAction);		menu.add(fContentAssistAction);		menu.add(new Separator());				menu.add((IAction) fGlobalActions.get(ITextEditorActionConstants.CUT));		menu.add((IAction) fGlobalActions.get(ITextEditorActionConstants.COPY));		menu.add((IAction) fGlobalActions.get(ITextEditorActionConstants.PASTE));		menu.add((IAction) fGlobalActions.get(ITextEditorActionConstants.SELECT_ALL));		menu.add(new Separator());		menu.add(fClearDisplayAction);		menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));	}	/**	 * @see WorkbenchPart#getAdapter(Class)	 */	public Object getAdapter(Class required) {					if (ITextOperationTarget.class.equals(required)) {			return fSourceViewer.getTextOperationTarget();		}					if (IDataDisplay.class.equals(required)) {			return fDataDisplay;		}				return super.getAdapter(required);	}		protected void updateActions() {		Iterator iterator = fSelectionActions.iterator();		while (iterator.hasNext()) {			IAction action = (IAction) fGlobalActions.get((String)iterator.next());			if (action instanceof IUpdate) {				 ((IUpdate) action).update();			}		}		updateEvalActions();	}				protected void updateEvalActions() {		fDisplayAction.update();		fInspectAction.update();			}		protected IJavaStackFrame getContext() {		IStackFrame stackFrame= fDisplayAction.getContext();		if (stackFrame == null) {			return null;		}				return (IJavaStackFrame) stackFrame.getAdapter(IJavaStackFrame.class);	}		protected IJavaProject getJavaProject(IJavaStackFrame stackFrame) {		IJavaElement javaElement= fDisplayAction.getJavaElement(stackFrame);		if (javaElement != null) {			return javaElement.getJavaProject();		}		return null;	}		protected void reportError(String message) {		Status status= new Status(IStatus.ERROR, JDIDebugUIPlugin.getPluginId(), IStatus.ERROR, message, null);		reportError(status);	}		protected void reportError(IStatus status) {		ErrorDialog.openError(getSite().getShell(), DisplayMessages.getString("DisplayView.Error_evaluating_4"), null, status); //$NON-NLS-1$	}		/**	 * Saves the contents of the display view and the formatting.	 * Formatting details can be removed when bug 4378 is fixed.	 * 	 * @see IViewPart#saveState(IMemento)	 */	public void saveState(IMemento memento) {		if (fSourceViewer != null) {			IDocument doc= fSourceViewer.getDocument();			String contents= doc.get();			if (contents.length() > 0) {				memento.putString(CONTENTS, contents);				int numberOfLines= doc.getNumberOfLines();				String lineDelimiter;				for (int i=1; i < numberOfLines; i++) {					try {						lineDelimiter= doc.getLineDelimiter(i-1);						int correction= (lineDelimiter == null ? 0 : lineDelimiter.length());						memento.putInteger(LINE_OFFSET + i, (doc.getLineOffset(i) - correction));					} catch (BadLocationException ble) {						JDIDebugUIPlugin.logError(ble);					}				}				int position= 0;				int count = 0;				while (position != -1) {					position= contents.indexOf('\t', position); //$NON-NLS-1$					if (position != -1) {						memento.putInteger(TABS + count++, position);						position++;					}				}			}			} else if (fRestoredContents != null) {			memento.putString(ID_DISPLAY_VIEW, fRestoredContents);		}	}		/**	 * Restores the contents of the display view and the formatting.	 * Formatting details can be removed when bug 4378 is fixed.	 * 	 * @see IViewPart#init(IViewSite, IMemento)	 */	public void init(IViewSite site, IMemento memento) throws PartInitException {		init(site);		if (memento != null) {			fRestoredContents= memento.getString(CONTENTS);			if (fRestoredContents == null) {				return;			}			fLineOffsets= new ArrayList(2);			Integer offset;			for (int i= 1;; i++) {				offset= memento.getInteger(LINE_OFFSET + i);				if (offset == null) {					break;				} 				fLineOffsets.add(offset);			}			fTabOffsets= new ArrayList(2);			for (int count= 0;;count++) {				offset= memento.getInteger(TABS + count);				if (offset == null) {					break;				}				fTabOffsets.add(offset);			}		}	}		/**	 * Returns the snippet currently attempting to be code completed.	 */	protected String getSnippet() {		IDocument d= fSourceViewer.getDocument();		ITextSelection selection= (ITextSelection)fSourceViewer.getSelectionProvider().getSelection();		int start= selection.getOffset();		try {			return d.get(0, start);				} catch (BadLocationException ble) {		}		return ""; //$NON-NLS-1$	}		/**	 * Returns the entire contents of the current document.	 */	protected String getContents() {		return fSourceViewer.getDocument().get();	}		/**	 * @see ISelectionChangedListener#selectionChanged(SelectionChangedEvent)	 */	public void selectionChanged(SelectionChangedEvent event) {		updateEvalActions();	}			/**	 * @see IPropertyChangeListener#propertyChange(PropertyChangeEvent)	 */	public void propertyChange(PropertyChangeEvent event) {		IContentAssistant assistant= fSourceViewer.getContentAssistant();		if (assistant instanceof ContentAssistant) {			JDIContentAssistPreference.changeConfiguration((ContentAssistant) assistant, event);		}		}	/**	 * @see WorkbenchPart#dispose()	 */		public void dispose() {		super.dispose();		JavaPlugin.getDefault().getPreferenceStore().removePropertyChangeListener(this);	}}