blob: db8742dc7eadba8b5af0239d64a8b2e4d5237b03 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 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.properties;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jst.jsf.common.ui.internal.dialogfield.StatusUtil;
import org.eclipse.jst.pagedesigner.PDPlugin;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.views.properties.tabbed.AbstractPropertySection;
import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
import org.w3c.dom.Node;
/**
* @author mengbo
*/
public abstract class BaseCustomSection extends AbstractPropertySection {
/**
* Status that all is OK
*/
protected static final Status OKSTATUS = new Status(IStatus.OK, PDPlugin
.getPluginId(), 0, "", null); //$NON-NLS-1$
private WPETabbedPropertySheetPage _propertySheetPage;
private boolean _visible = false;
/**
* the tag IDOMElement
*/
protected IDOMElement _element;
/**
* the INodeAdapter used to receive notifications of model updates
*/
protected INodeAdapter _adapter = new INodeAdapter() {
public boolean isAdapterForType(Object type) {
return false;
}
public void notifyChanged(INodeNotifier notifier, int eventType,
Object changedFeature, Object oldValue, Object newValue, int pos) {
BaseCustomSection.this.notifyChanged(notifier, eventType,
changedFeature, oldValue, newValue, pos);
}
};
public void setInput(IWorkbenchPart part, ISelection selection) {
super.setInput(part, selection);
IDOMElement newEle = (IDOMElement) DesignerPropertyTool.getElement(
part, selection);
if (_element != newEle) {
if (_element != null) {
_element.removeAdapter(_adapter);
}
_element = newEle;
if (_element != null) {
_element.addAdapter(_adapter);
}
}
}
/**
* Method adapter will call when element has changed
*
* @param notifier
* @param eventType
* @param changedFeature
* @param oldValue
* @param newValue
* @param pos
*/
protected abstract void notifyChanged(INodeNotifier notifier,
int eventType, Object changedFeature, Object oldValue,
Object newValue, int pos);
public void createControls(Composite parent,
TabbedPropertySheetPage aTabbedPropertySheetPage) {
super.createControls(parent, aTabbedPropertySheetPage);
_propertySheetPage = (WPETabbedPropertySheetPage) aTabbedPropertySheetPage;
}
/**
* for certain action performed in the section, may result big change in the
* model. e.g: change tag name will result in editpart recreate. In this
* case, we need do a total refresh.
*
*/
protected void refreshPropertySheetPage() {
if (_propertySheetPage != null) {
IWorkbenchPart part = getPart();
if (part != null) {
ISelection sel = part.getSite().getSelectionProvider()
.getSelection();
_propertySheetPage.selectionChanged(part, sel);
} else {
// XXX: will else happen?
System.out.println("AbstractCustomSection --> What to do?"); //$NON-NLS-1$
}
}
}
/**
* Change selection
* @param node
*/
protected void gotoNode(Node node) {
_propertySheetPage.internalChangeSelection(node, node);
}
/**
* @return IStatusLineManager to use for the property sheet page
*/
protected IStatusLineManager getStatusLineManager() {
if (_propertySheetPage != null) {
IActionBars bar = _propertySheetPage.getSite().getActionBars();
if (bar != null) {
return bar.getStatusLineManager();
}
}
return null;
}
/**
* @param status to display on status line
*/
protected void applyStatus(IStatus[] status) {
if (!_visible) {
return;
}
IStatusLineManager statusLine = getStatusLineManager();
if (statusLine == null) {
return;
}
IStatus s;
if (status == null || status.length == 0) {
s = null;
} else {
s = StatusUtil.getMostSevere(status);
}
if (s == null || s.getSeverity() != IStatus.ERROR) {
statusLine.setErrorMessage(null);
} else {
statusLine.setErrorMessage(s.getMessage());
}
}
/**
* @param message
*/
protected void setErrorMessage(String message) {
IStatusLineManager s = getStatusLineManager();
if (s != null) {
s.setErrorMessage(message);
}
}
/**
* @param message
* @return Status
*/
protected Status createErrorStatus(String message) {
return new Status(IStatus.ERROR, PDPlugin.getPluginId(), 0, message,
null);
}
public void aboutToBeHidden() {
applyStatus(null);
_visible = false;
// IDOMElement newEle = (IDOMElement) DesignerPropertyTool.getElement(
// part, selection);
// if (_element != newEle) {
if (_element != null) {
_element.removeAdapter(_adapter);
}
// _element = newEle;
// if (_element != null) {
// _element.addAdapter(_adapter);
// }
// }
super.aboutToBeHidden();
}
public void aboutToBeShown() {
super.aboutToBeShown();
// IDOMElement newEle = (IDOMElement) DesignerPropertyTool.getElement(
// part, selection);
// if (_element != newEle) {
// if (_element != null) {
// _element.removeAdapter(_adapter);
// }
// _element = newEle;
if (_element != null) {
_element.addAdapter(_adapter);
}
// }
_visible = true;
}
/**
* @return IProject for the WPE editing instance
*/
protected IProject getProject() {
if (_propertySheetPage != null) {
IEditorInput input = _propertySheetPage.getEditor()
.getEditorInput();
if (input instanceof IFileEditorInput) {
return ((IFileEditorInput) input).getFile().getProject();
}
}
return null;
}
public void dispose() {
super.dispose();
if (_element != null) {
_element.removeAdapter(_adapter);
}
}
/**
* @return IFile for WPE editing instance
*/
protected IFile getFile() {
if (_propertySheetPage != null) {
IEditorInput input = _propertySheetPage.getEditor()
.getEditorInput();
if (input instanceof IFileEditorInput) {
return ((IFileEditorInput) input).getFile();
}
}
return null;
}
}