blob: c29b473e1fcfef7c78aae5afe6f62aafe7eac021 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 Standards for Technology in Automotive Retail 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:
* David Carver (STAR) - initial API and implementation
* David Carver (Intalio) - generalize the implementation for contribution to eclipse
*******************************************************************************/
package org.eclipse.wst.xml.ui.internal.views.annotations;
import org.eclipse.jface.internal.text.html.HTMLTextPresenter;
import org.eclipse.jface.text.TextPresentation;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.wst.xml.core.internal.contentmodel.CMNode;
import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
import org.eclipse.wst.xml.ui.internal.XMLUIMessages;
import org.eclipse.wst.xml.ui.internal.taginfo.MarkupTagInfoProvider;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FillLayout;
import org.w3c.dom.Node;
/**
* Provides a view similar to the JavaDoc view that will display any documentation that resides in
* the content model for an XML document.
*
* @author dcarver
*
*/
public class XMLAnnotationsView extends ViewPart implements ISelectionListener {
public static final String ID = "org.eclipse.wst.xml.ui.view.annotations.XMLAnnotationsView"; //$NON-NLS-1$
private StyledText styledtext;
private String xmlDoc = XMLUIMessages.Documentation_view_default_msg;
private HTMLTextPresenter presenter;
private final TextPresentation presentation = new TextPresentation();
private IStructuredSelection currentSelection;
private CMNode cmNode;
public XMLAnnotationsView() {
}
public void init(IViewSite site) throws PartInitException {
super.init(site);
getSite().getPage().addPostSelectionListener(this);
}
/**
* Create contents of the view part.
*
* @param parent
*/
public void createPartControl(Composite parent) {
Composite container = new Composite(parent, SWT.NONE);
container.setLayout(new FillLayout());
presenter = new HTMLTextPresenter(false);
createStyledTextWidget(container);
doStyledTextInput();
}
private void createStyledTextWidget(Composite container) {
styledtext = new StyledText(container, SWT.V_SCROLL | SWT.H_SCROLL);
styledtext.setBackground(getColor(SWT.COLOR_INFO_BACKGROUND));
styledtext.setEditable(false);
styledtext.setBounds(container.getBounds());
styledtext.addControlListener(new ControlAdapter() {
/*
* @see
* org.eclipse.swt.events.ControlAdapter#controlResized(org.eclipse
* .swt.events.ControlEvent)
*/
public void controlResized(ControlEvent e) {
doStyledTextInput();
}
});
}
private void doStyledTextInput() {
presentation.clear();
Rectangle size = styledtext.getClientArea();
int width = size.width;
int height = size.height;
if (width == 0) {
width = 200;
}
if (height == 0) {
height = 400;
}
String msg = presenter.updatePresentation(styledtext, xmlDoc, presentation, width, height);
if (msg != null) {
styledtext.setText(msg);
TextPresentation.applyTextPresentation(presentation, styledtext);
}
}
public void setFocus() {
}
public void dispose() {
styledtext = null;
getSite().getPage().removePostSelectionListener(this);
cmNode = null;
super.dispose();
}
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
IEditorPart edPart = getSite().getPage().getActiveEditor();
if (part.equals(edPart)) {
if (selection instanceof IStructuredSelection) {
currentSelection = (IStructuredSelection) selection;
if (!selection.isEmpty()
&& (currentSelection.getFirstElement() instanceof Node)) {
Node node = (Node) currentSelection.getFirstElement();
ModelQuery mq = ModelQueryUtil.getModelQuery(node.getOwnerDocument());
if (mq != null) {
cmNode = mq.getCMNode(node);
MarkupTagInfoProvider tagInfo = new MarkupTagInfoProvider();
xmlDoc = tagInfo.getInfo(cmNode);
}
else {
xmlDoc = XMLUIMessages.Documentation_view_default_msg;
}
doStyledTextInput();
}
}
}
}
private Color getColor(int colorID) {
Display display = Display.getCurrent();
return display.getSystemColor(colorID);
}
}