/**
* Copyright (c) 2010, 2013 Darmstadt University of Technology.
* 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:
* Marcel Bruch - Initial design and API
*/
package org.eclipse.recommenders.internal.snipmatch.rcp.editors;
import static org.eclipse.jface.databinding.swt.WidgetProperties.text;
import static org.eclipse.recommenders.internal.snipmatch.rcp.Constants.HELP_URL;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeanProperties;
import org.eclipse.core.databinding.observable.ChangeEvent;
import org.eclipse.core.databinding.observable.IChangeListener;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.jdt.ui.PreferenceConstants;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.recommenders.injection.InjectionService;
import org.eclipse.recommenders.internal.snipmatch.rcp.l10n.Messages;
import org.eclipse.recommenders.rcp.SharedImages;
import org.eclipse.recommenders.snipmatch.ISnippet;
import org.eclipse.recommenders.snipmatch.Location;
import org.eclipse.recommenders.snipmatch.Snippet;
import org.eclipse.recommenders.snipmatch.rcp.SnippetEditorInput;
import org.eclipse.recommenders.utils.rcp.Browsers;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IPropertyListener;
import org.eclipse.ui.forms.AbstractFormPart;
import org.eclipse.ui.forms.IManagedForm;
import org.eclipse.ui.forms.editor.FormEditor;
import org.eclipse.ui.forms.editor.FormPage;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
public class SnippetSourcePage extends FormPage {
private ISnippet snippet;
private ScrolledForm form;
private Text textWidget;
private AbstractFormPart codePart;
private DataBindingContext context;
public SnippetSourcePage(FormEditor editor, String id, String title) {
super(editor, id, title);
}
@Override
protected void createFormContent(IManagedForm managedForm) {
FormToolkit toolkit = managedForm.getToolkit();
form = managedForm.getForm();
createHeader(form);
toolkit.decorateFormHeading(form.getForm());
Composite body = form.getBody();
toolkit.paintBordersFor(body);
body.setLayout(new FillLayout(SWT.HORIZONTAL));
codePart = new AbstractFormPart() {
@Override
public void initialize(IManagedForm managedForm) {
super.initialize(managedForm);
textWidget = managedForm.getToolkit().createText(managedForm.getForm().getBody(), snippet.getCode(),
SWT.WRAP | SWT.MULTI);
textWidget.setFont(JFaceResources.getFont(PreferenceConstants.EDITOR_TEXT_FONT));
}
@Override
public void refresh() {
context.updateTargets();
super.refresh();
updateMessage();
}
@Override
public void commit(boolean onSave) {
if (onSave) {
super.commit(onSave);
}
}
@Override
public void dispose() {
context.dispose();
super.dispose();
}
};
managedForm.addPart(codePart);
context = createDataBindingContext();
}
private void createHeader(ScrolledForm form) {
form.setText(Messages.EDITOR_TITLE_RAW_SOURCE);
SharedImages sharedImages = InjectionService.getInstance().getInjector().getInstance(SharedImages.class);
Action showHelpAction = new Action(Messages.EDITOR_TOOLBAR_ITEM_HELP,
sharedImages.getDescriptor(SharedImages.Images.ELCL_HELP)) {
@Override
public void run() {
Browsers.tryOpenInExternalBrowser(HELP_URL);
};
};
EditorUtils.addActionToForm(form, showHelpAction, Messages.EDITOR_TOOLBAR_ITEM_HELP);
}
@Override
public void setFocus() {
super.setFocus();
textWidget.setFocus();
}
@Override
public void init(IEditorSite site, IEditorInput input) {
snippet = ((SnippetEditorInput) input).getSnippet();
registerEditorInputListener();
super.init(site, input);
}
private void registerEditorInputListener() {
getEditor().addPropertyListener(new IPropertyListener() {
@Override
public void propertyChanged(Object source, int propId) {
if (propId == PROP_INPUT) {
setInputWithNotify(getEditor().getEditorInput());
}
}
});
}
@Override
protected void setInputWithNotify(IEditorInput input) {
snippet = ((SnippetEditorInput) input).getSnippet();
context.dispose();
context = createDataBindingContext();
super.setInputWithNotify(input);
}
private void updateMessage() {
final String sourceValid;
if (snippet.getLocation() == Location.FILE) {
sourceValid = TextSnippetSourceValidator.isSourceValid(textWidget.getText());
} else {
sourceValid = JavaSnippetSourceValidator.isSourceValid(textWidget.getText());
}
if (sourceValid.isEmpty()) {
form.setMessage(null, IMessageProvider.NONE);
} else {
form.setMessage(sourceValid, IMessageProvider.ERROR);
}
}
private DataBindingContext createDataBindingContext() {
DataBindingContext ctx = new DataBindingContext();
IObservableValue snippetBeanCode = BeanProperties.value(Snippet.class, "code", String.class).observe(snippet); //$NON-NLS-1$
IObservableValue textWidgetCode = text(SWT.Modify).observe(textWidget);
ctx.bindValue(textWidgetCode, snippetBeanCode);
snippetBeanCode.addChangeListener(new IChangeListener() {
@Override
public void handleChange(ChangeEvent event) {
if (!textWidget.getText().equals(snippet.getCode())) {
codePart.markStale();
} else {
codePart.markDirty();
}
updateMessage();
}
});
return ctx;
}
}