blob: 7438282d0619029e70866a276f73e5fcdc0d35e5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2008 Sybase, Inc. 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:
* Sybase, Inc. - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.pagedesigner.commands;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
import org.eclipse.jst.pagedesigner.PDPlugin;
import org.eclipse.jst.pagedesigner.dnd.internal.SourceViewerDragDropHelper;
import org.eclipse.jst.pagedesigner.dom.DOMPosition;
import org.eclipse.jst.pagedesigner.dom.EditModelQuery;
import org.eclipse.jst.pagedesigner.dom.IDOMPosition;
import org.eclipse.jst.pagedesigner.editors.palette.IDropSourceData;
import org.eclipse.jst.pagedesigner.itemcreation.customizer.DropCustomizationController;
import org.eclipse.jst.pagedesigner.utils.CommandUtil;
import org.eclipse.wst.sse.ui.StructuredTextEditor;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
/**
* Handles tag creation when dropped onto the WPE source view
*
* @author mengbo
*/
public class PaletteDropInsertCommand extends SourceViewerCommand implements ICustomizableCommand
{
private final Logger _log = PDPlugin
.getLogger(PaletteDropInsertCommand.class);
private IDropSourceData _creationProvider;
private int _location;
private Element _element;
private IAdaptable _customizationData;
/**
* @param label
* @param editor
* @param creationProvider
* @param location
*/
public PaletteDropInsertCommand(String label, StructuredTextEditor editor,
IDropSourceData creationProvider, int location) {
super(label, editor);
_creationProvider = creationProvider;
_location = location;
}
public void doExecute() {
Node node;
try {
node = getSourceEditingTextTools().getNode(_location);
} catch (Exception e) {
_log.error("Bad text insertion location", e); //$NON-NLS-1$
return;
}
IDOMPosition position = null;
if (node != null) {
position = SourceViewerDragDropHelper.getInstance()
.findPosition(_location, node);
} else {
if (getModel().getDocument().getFirstChild() != null) {
//Fix for 224541 - When palette item is dropped to end of file in source view of Web Page Editor, the item is inserted at the top of file
//add inside at end of necessary container
position = SourceViewerDragDropHelper.getInstance()
.findPosition(getModel().getDocument().getEndOffset(), getModel().getDocument().getFirstChild());
}
else {
// empty file
position = new DOMPosition(getModel().getDocument(), 0);
}
}
// essentially copied from ItemCreationTool so that DesignView drop and
// SourceViewDrop are same.
// Note that SourceView does NO drop validation checking. This is
// handled by ItemCreationPolicy in DesignView
final IStatus status = performCustomization(getModel().getDocument(),
position);
if (status.isOK())
{
final Element element = CommandUtil.executeInsertion(
_creationProvider, getModel()
, position, getCustomizationData());
if (element != null) {
formatNode(element);
}
this._element = element;
}
}
/**
* @param domDoc
* @param position
* @return status
*/
protected IStatus performCustomization(final IDOMDocument domDoc, final IDOMPosition position) {
return new DropCustomizationController(this, _creationProvider, domDoc, position).performCustomization();
}
/**
* @param customizationData
*/
public void setCustomizationData(IAdaptable customizationData) {
_customizationData = customizationData;
}
/**
* This method is for test purposes and should generally not be
* used by clients.
*
* @return the customization data
*/
protected final IAdaptable getCustomizationData() {
return _customizationData;
}
public void setSelection() {
if (_element != null) {
int offset = EditModelQuery.getNodeStartIndex(_element);
int length = EditModelQuery.getNodeEndIndex(_element) - offset;
_editor.getTextViewer().setSelectedRange(offset, length);
}
}
}