/*******************************************************************************
* Copyright (c) 2000, 2007 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.erlide.debug.ui.properties;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.IHandler;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.DocumentEvent;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentListener;
import org.eclipse.jface.text.TextViewerUndoManager;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.IHandlerActivation;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
import org.erlide.backend.debug.IErlangBreakpoint;
import org.erlide.ui.editors.erl.scanner.IErlangPartitions;
import org.erlide.util.ErlLogger;
/**
* The widget for the conditional editor on the breakpoints properties page
*/
public class BreakpointConditionEditor {
SourceViewer fViewer;
// private IContentAssistProcessor fCompletionProcessor;
private String fOldValue;
private String fErrorMessage;
private final ErlangLineBreakpointPropertyPage fPage;
private final IErlangBreakpoint fBreakpoint;
private IHandlerService fHandlerService;
private IHandler fHandler;
private IHandlerActivation fActivation;
private IDocumentListener fDocumentListener;
/**
* Constructor
*
* @param parent
* the parent to add this widget to
* @param page
* the page that is associated with this widget
*/
public BreakpointConditionEditor(final Composite parent,
final ErlangLineBreakpointPropertyPage page) {
fPage = page;
fBreakpoint = fPage.getBreakpoint();
String condition = "";
try {
condition = fBreakpoint.getCondition();
fErrorMessage = "Enter a condition";
fOldValue = ""; //$NON-NLS-1$
fViewer = new SourceViewer(parent, null,
SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.LEFT_TO_RIGHT);
fViewer.setInput(parent);
final IDocument document = new Document();
fViewer.setDocumentPartitioning(IErlangPartitions.ERLANG_PARTITIONING);
// setDocumentPartitioning
// JDIDebugUIPlugin.getDefault().getJavaTextTools()
// .setupJavaDocumentPartitioner(document,
// IJavaPartitions.JAVA_PARTITIONING);
// we can only do code assist if there is an associated type
// final IResource r = fBreakpoint.getMarker().getResource();
// if (r != null) {
// final IErlModel model = ErlangCore.getModel();
// final IErlElement element = model.findElement(r);
// if (element!= null && element.getKind() ==
// IErlElement.Kind.MODULE) {
// final int lineNumber = fBreakpoint.getMarker()
// .getAttribute(IMarker.LINE_NUMBER, -1);
// IJavaDebugContentAssistContext context = null;
// final IType type = BreakpointUtils.getType(fBreakpoint);
// if (type == null) {
// context = new TypeContext(null, -1);
// } else {
// try {
// String source = null;
// final ICompilationUnit compilationUnit = type
// .getCompilationUnit();
// if (compilationUnit != null
// && compilationUnit.getJavaProject().getProject()
// .exists()) {
// source = compilationUnit.getSource();
// } else {
// final IClassFile classFile = type.getClassFile();
// if (classFile != null) {
// source = classFile.getSource();
// }
// }
// final int lineNumber = fBreakpoint.getMarker()
// .getAttribute(IMarker.LINE_NUMBER, -1);
// int position = -1;
// if (source != null && lineNumber != -1) {
// try {
// position = new Document(source)
// .getLineOffset(lineNumber - 1);
// } catch (final BadLocationException e) {
// JDIDebugUIPlugin.log(e);
// }
// }
// context = new TypeContext(type, position);
// } catch (final CoreException e) {
// JDIDebugUIPlugin.log(e);
// }
// }
// fCompletionProcessor = new
// JavaDebugContentAssistProcessor(context);
// fViewer.configure(new DisplayViewerConfiguration() {
// public IContentAssistProcessor getContentAssistantProcessor() {
// return fCompletionProcessor;
// }
// });
fViewer.setEditable(true);
// if we don't check upstream tracing can throw assertion exceptions
// see bug 181914
document.set(condition == null ? "" : condition); //$NON-NLS-1$
fViewer.setDocument(document);
fViewer.setUndoManager(new TextViewerUndoManager(10));
fViewer.getUndoManager().connect(fViewer);
fDocumentListener = new IDocumentListener() {
@Override
public void documentAboutToBeChanged(final DocumentEvent event) {
}
@Override
public void documentChanged(final DocumentEvent event) {
valueChanged();
}
};
fViewer.getDocument().addDocumentListener(fDocumentListener);
final GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
gd.heightHint = fPage.convertHeightInCharsToPixels(10);
gd.widthHint = fPage.convertWidthInCharsToPixels(40);
fViewer.getControl().setLayoutData(gd);
fHandler = new AbstractHandler() {
@Override
public Object execute(final ExecutionEvent event)
throws org.eclipse.core.commands.ExecutionException {
fViewer.doOperation(ISourceViewer.CONTENTASSIST_PROPOSALS);
return null;
}
};
fHandlerService = (IHandlerService) PlatformUI.getWorkbench()
.getAdapter(IHandlerService.class);
} catch (final CoreException exception) {
ErlLogger.warn(exception);
}
}
/**
* Returns the condition defined in the source viewer.
*
* @return the contents of this condition editor
*/
public String getCondition() {
return fViewer.getDocument().get();
}
/**
* @see org.eclipse.jface.preference.FieldEditor#refreshValidState()
*/
protected void refreshValidState() {
if (!fViewer.isEditable()) {
fPage.removeErrorMessage(fErrorMessage);
} else {
final String text = fViewer.getDocument().get();
if (!(text != null && text.trim().length() > 0)) {
fPage.addErrorMessage(fErrorMessage);
} else {
fPage.removeErrorMessage(fErrorMessage);
}
}
}
/**
* @see org.eclipse.jface.preference.FieldEditor#setEnabled(boolean,
* org.eclipse.swt.widgets.Composite)
*/
public void setEnabled(final boolean enabled) {
fViewer.setEditable(enabled);
fViewer.getTextWidget().setEnabled(enabled);
if (enabled) {
// fViewer.updateViewerColors();
fViewer.getTextWidget().setFocus();
fActivation = fHandlerService.activateHandler(
ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS, fHandler);
} else {
final Color color = fViewer.getControl().getDisplay()
.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
fViewer.getTextWidget().setBackground(color);
if (fActivation != null) {
fHandlerService.deactivateHandler(fActivation);
}
}
valueChanged();
}
/**
* Handle that the value changed
*/
protected void valueChanged() {
final String newValue = fViewer.getDocument().get();
if (!newValue.equals(fOldValue)) {
fOldValue = newValue;
}
refreshValidState();
}
/**
* Dispose of the handlers, etc
*/
public void dispose() {
if (fViewer.isEditable()) {
fHandlerService.deactivateHandler(fActivation);
}
fViewer.getDocument().removeDocumentListener(fDocumentListener);
// fViewer.dispose();
}
}