// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package com.amalto.workbench.widgets.xmleditor;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.ITextListener;
import org.eclipse.jface.text.TextEvent;
import org.eclipse.jface.text.TextViewer;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.jface.text.source.VerticalRuler;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.swt.dnd.DropTargetAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import com.amalto.workbench.models.TreeObject;
import com.amalto.workbench.models.TreeObjectTransfer;
import com.amalto.workbench.utils.WidgetUtils;
import com.amalto.workbench.widgets.xmleditor.infoholder.ExternalInfoHolder;
public class ExtensibleTextContentEditorPage extends ExtensibleContentEditorPage {
private static Log log = LogFactory.getLog(ExtensibleTextContentEditorPage.class);
protected TextViewer textViewer;
public ExtensibleTextContentEditorPage(Composite parent, int style) {
super(parent, style);
setLayout(new FillLayout());
textViewer = new SourceViewer(this, new VerticalRuler(10), SWT.H_SCROLL | SWT.V_SCROLL);
initUIListeners();
}
@Override
public void refresh() {
if (getCurrentContent().equals(getContent().getContent())) {
return;
}
textViewer.setDocument(new Document(getContent().getContent()));
}
@Override
public void saveContentFromUI() throws ExtensibleContentEditorPageSaveException {
getContent().setContent(getCurrentContent());
}
@Override
public void clearExternalResources() {
if (textViewer.getUndoManager() != null) {
textViewer.getUndoManager().disconnect();
}
}
@Override
public void dispose() {
super.dispose();
clearExternalResources();
}
protected void initUIListeners() {
WidgetUtils.initRedoUndo(textViewer);
textViewer.addTextListener(creatTextListener());
textViewer.getTextWidget().addKeyListener(createKeyListener());
createCompDropTarget();
}
protected void createCompDropTarget() {
DropTarget dropTarget = new DropTarget(textViewer.getTextWidget(), DND.DROP_MOVE | DND.DROP_LINK);
dropTarget.setTransfer(new TreeObjectTransfer[] { TreeObjectTransfer.getInstance() });
dropTarget.addDropListener(new DropTargetAdapter() {
@Override
public void dragEnter(DropTargetEvent event) {
}
@Override
public void dragLeave(DropTargetEvent event) {
}
@Override
public void dragOver(DropTargetEvent event) {
event.feedback |= DND.FEEDBACK_EXPAND | DND.FEEDBACK_SCROLL;
}
@Override
public void drop(DropTargetEvent event) {
if (event.data instanceof TreeObject[]) {
if (((TreeObject[]) event.data)[0].getType() == TreeObject.TRANSFORMER) {
textViewer.getTextWidget().setText(textViewer.getTextWidget().getText().replace("?", "")//$NON-NLS-1$//$NON-NLS-2$
+ ((TreeObject[]) event.data)[0].getDisplayName());
} else {
textViewer.getTextWidget().setText(
textViewer.getTextWidget().getText() + ((TreeObject[]) event.data)[0].getDisplayName());
}
}
}
});
}
protected ITextListener creatTextListener() {
return new ITextListener() {
public void textChanged(TextEvent event) {
getContent().setContent(getCurrentContent());
notifyOnXMLDocumentChanged();
}
};
}
protected KeyListener createKeyListener() {
return new KeyListener() {
public void keyReleased(KeyEvent event) {
if (textViewer.getDocument() == null) {
return;
}
int start = textViewer.getSelectedRange().x;
int end = textViewer.getSelectedRange().y;
int length = textViewer.getDocument().get().length();
if (event.stateMask != SWT.CTRL || event.keyCode != 17) {
return;
}
// try {
// ResourceSelectDialog dialog = new ResourceSelectDialog(getShell(), null,
// Messages.ExtensibleTextXX_DialogTitle, ServerView
// .show().getSite());
// dialog.setBlockOnOpen(true);
// dialog.open();
// if (dialog.getReturnCode() == Window.OK) {
// String xpath = dialog.getXpath();
// String textHead = textViewer.getDocument().get(0, start);
// String textEnd = textViewer.getDocument().get(start + end, length - start - end);
// textViewer.setDocument(new Document(textHead + xpath + textEnd));
// textViewer.setSelectedRange(start, xpath.length());
//
// getContent().setContent(getCurrentContent());
// notifyOnXMLDocumentChanged();
// }
// } catch (BadLocationException e) {
// log.error(e.getMessage(), e);
// }
}
public void keyPressed(KeyEvent event) {
}
};
}
private String getCurrentContent() {
if (textViewer.getDocument() == null || textViewer.getDocument().get() == null) {
return "";//$NON-NLS-1$
}
return textViewer.getDocument().get().trim();
}
@Override
public void setExternalInfoHolder(ExternalInfoHolder<?> externalInfoHolder) {
}
@Override
public void reloadExternalInfo() {
}
}