blob: ff1f156a40acfee47049f84599009d02ced317a1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2020 Sybase, Inc. and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Sybase, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.pagedesigner.editors;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.source.ISourceViewer;
import org.eclipse.jst.pagedesigner.dnd.internal.DesignerSourceDropTargetListener;
import org.eclipse.jst.pagedesigner.utils.StructuredModelUtil;
import org.eclipse.swt.dnd.DND;
import org.eclipse.swt.dnd.DropTarget;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.ITextEditorDropTargetListener;
import org.eclipse.wst.sse.core.StructuredModelManager;
import org.eclipse.wst.sse.core.internal.provisional.IModelStateListener;
import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
import org.eclipse.wst.sse.ui.StructuredTextEditor;
/**
* @author mengbo
*/
public class DesignerStructuredTextEditorJSP extends StructuredTextEditor
{
private ITextEditorDropTargetListener _dropTargetListener;
private DropTarget _dropTarget;
private IStructuredModel _structuredModel;
private IModelStateListener _modelStateListener;
@Override
protected void installTextDragAndDrop(ISourceViewer textViewer) {
// intentional no-op
}
@Override
protected void uninstallTextDragAndDrop(ISourceViewer viewer) {
// do nothing
}
@Override
protected void initializeDrop(final ITextViewer viewer)
{
int operations = DND.DROP_COPY | DND.DROP_MOVE;
_dropTarget = new DropTarget(viewer.getTextWidget(), operations);
_dropTargetListener =
new DesignerSourceDropTargetListener(this);
_dropTarget.setTransfer(_dropTargetListener.getTransfers());
_dropTarget.addDropListener(_dropTargetListener);
}
@Override
public IAction getAction(final String actionID)
{
try
{
return super.getAction(actionID);
} catch (final Exception e)
{
return null;
}
}
@Override
public Object getAdapter(final Class required)
{
if (ITextEditorDropTargetListener.class.equals(required))
{
final DesignerSourceDropTargetListener listener = new DesignerSourceDropTargetListener(
this);
return listener;
}
return super.getAdapter(required);
}
/* (non-Javadoc)
* @see org.eclipse.wst.sse.ui.StructuredTextEditor#doSetInput(org.eclipse.ui.IEditorInput)
*/
@Override
protected void doSetInput(IEditorInput input) throws CoreException {
super.doSetInput(input);
addModelStateListener();
}
@Override
public void dispose()
{
if (_dropTargetListener != null)
{
_dropTargetListener = null;
}
if (_dropTarget != null)
{
_dropTarget.dispose();
_dropTarget = null;
}
removeModelStateListener();
if (_structuredModel != null) {
_structuredModel.releaseFromRead();
_structuredModel = null;
}
super.dispose();
}
private IStructuredModel getStructuredModel() {
IStructuredModel model = null;
if (_structuredModel != null) {
model = _structuredModel;
} else {
IDocumentProvider provider = getDocumentProvider();
if (provider != null) {
IDocument document = provider.getDocument(getEditorInput());
_structuredModel = StructuredModelManager.getModelManager().getExistingModelForRead(document);
model = _structuredModel;
}
}
return model;
}
private void addModelStateListener() {
IStructuredModel model = getStructuredModel();
if (model != null) {
if (_modelStateListener == null) {
_modelStateListener = new ModelStateListener();
} else {
model.removeModelStateListener(_modelStateListener);
}
model.addModelStateListener(_modelStateListener);
}
}
private void removeModelStateListener() {
IStructuredModel model = getStructuredModel();
if (model != null) {
if (_modelStateListener != null) {
model.removeModelStateListener(_modelStateListener);
_modelStateListener = null;
}
}
}
private class ModelStateListener implements IModelStateListener {
public void modelAboutToBeChanged(IStructuredModel model) {
//do nothing
}
public void modelChanged(IStructuredModel model) {
//do nothing
}
public void modelDirtyStateChanged(IStructuredModel model, boolean isDirty) {
//Bug 330412 - [WPE] Drag 'n' Drop of tag from palette doesn't notify team system of edit
//Bug 330413 - [WPE] Modifying tag attribute using property sheet doesn't notify team system of edit
if (isDirty) {
IFile file = StructuredModelUtil.getFileFor(model);
if (file != null) {
file.getWorkspace().validateEdit(new IFile[]{file}, null);
}
}
}
public void modelResourceDeleted(IStructuredModel model) {
//do nothing
}
public void modelResourceMoved(IStructuredModel oldModel, IStructuredModel newModel) {
//do nothing
}
public void modelAboutToBeReinitialized(IStructuredModel structuredModel) {
//do nothing
}
public void modelReinitialized(IStructuredModel structuredModel) {
//do nothing
}
}
}