blob: 8a409f0d03f2b84b55b46e5430f459f288fd7f22 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2009 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.wst.xsd.ui.internal.common.properties.sections;
import java.util.ArrayList;
import java.util.List;
import org.apache.xerces.util.XMLChar;
import org.eclipse.gef.commands.Command;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.wst.xsd.ui.internal.common.commands.UpdateNameCommand;
import org.eclipse.wst.xsd.ui.internal.common.util.Messages;
import org.eclipse.wst.xsd.ui.internal.common.util.XSDDirectivesManager;
import org.eclipse.wst.xsd.ui.internal.editor.XSDEditorCSHelpIds;
import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
import org.eclipse.xsd.XSDAttributeGroupDefinition;
import org.eclipse.xsd.XSDNamedComponent;
import org.eclipse.xsd.util.XSDConstants;
import org.w3c.dom.Element;
public class XSDAttributeGroupDefinitionSection extends RefactoringSection
{
protected Text nameText;
protected CCombo refCombo;
boolean isReference;
public XSDAttributeGroupDefinitionSection()
{
super();
}
protected void createContents(Composite parent)
{
composite = getWidgetFactory().createFlatFormComposite(parent);
GridLayout gridLayout = new GridLayout();
gridLayout.numColumns = 3;
composite.setLayout(gridLayout);
if (isReference)
{
// ------------------------------------------------------------------
// Ref Label
// ------------------------------------------------------------------
GridData data = new GridData();
data.horizontalAlignment = GridData.HORIZONTAL_ALIGN_BEGINNING;
data.grabExcessHorizontalSpace = false;
CLabel refLabel = getWidgetFactory().createCLabel(composite, XSDConstants.REF_ATTRIBUTE + ":"); //$NON-NLS-1$
refLabel.setLayoutData(data);
// ------------------------------------------------------------------
// Ref Combo
// ------------------------------------------------------------------
data = new GridData();
data.grabExcessHorizontalSpace = true;
data.horizontalAlignment = GridData.FILL;
refCombo = getWidgetFactory().createCCombo(composite, SWT.FLAT);
refCombo.addSelectionListener(this);
refCombo.setLayoutData(data);
PlatformUI.getWorkbench().getHelpSystem().setHelp(refCombo,
XSDEditorCSHelpIds.GENERAL_TAB__ATTRIBUTEGROUP_REFS__REF);
}
else
{
// ------------------------------------------------------------------
// NameLabel
// ------------------------------------------------------------------
GridData data = new GridData();
data.horizontalAlignment = GridData.HORIZONTAL_ALIGN_BEGINNING;
data.grabExcessHorizontalSpace = false;
CLabel nameLabel = getWidgetFactory().createCLabel(composite, Messages._UI_LABEL_NAME);
nameLabel.setLayoutData(data);
// ------------------------------------------------------------------
// NameText
// ------------------------------------------------------------------
data = new GridData();
data.grabExcessHorizontalSpace = true;
data.horizontalAlignment = GridData.FILL;
nameText = getWidgetFactory().createText(composite, ""); //$NON-NLS-1$
nameText.setLayoutData(data);
applyAllListeners(nameText);
PlatformUI.getWorkbench().getHelpSystem().setHelp(nameText,
XSDEditorCSHelpIds.GENERAL_TAB__ATTRIBUTEGROUP__NAME);
// ------------------------------------------------------------------
// Refactor/rename hyperlink
// ------------------------------------------------------------------
if (!hideHyperLink)
{
createRenameHyperlink(composite);
setRenameHyperlinkEnabled(!isReference);
}
else
{
getWidgetFactory().createCLabel(composite, "");
}
}
}
public void refresh()
{
super.refresh();
if (isReadOnly)
{
composite.setEnabled(false);
}
else
{
composite.setEnabled(true);
}
setListenerEnabled(false);
XSDNamedComponent namedComponent = (XSDNamedComponent)input;
if (isReference)
{
Element element = namedComponent.getElement();
if (element != null)
{
String attrValue = element.getAttribute(XSDConstants.REF_ATTRIBUTE);
if (attrValue == null)
{
attrValue = ""; //$NON-NLS-1$
}
refCombo.setText(attrValue);
}
}
else
{
// refresh name
nameText.setText(""); //$NON-NLS-1$
String name = namedComponent.getName();
if (name != null)
{
nameText.setText(name);
}
}
setListenerEnabled(true);
}
public void setInput(IWorkbenchPart part, ISelection selection)
{
super.setInput(part, selection);
init();
relayout();
if (isReference)
{
TypesHelper helper = new TypesHelper(xsdSchema);
List items = new ArrayList();
items = helper.getGlobalAttributeGroups();
items.add(0, ""); //$NON-NLS-1$
refCombo.setItems((String [])items.toArray(new String[0]));
}
}
protected void relayout()
{
Composite parentComposite = composite.getParent();
parentComposite.getParent().setRedraw(false);
if (parentComposite != null && !parentComposite.isDisposed())
{
Control[] children = parentComposite.getChildren();
for (int i = 0; i < children.length; i++)
{
children[i].dispose();
}
}
// Now initialize the new handler
createContents(parentComposite);
parentComposite.getParent().layout(true, true);
// Now turn painting back on
parentComposite.getParent().setRedraw(true);
refresh();
}
protected void init()
{
if (input instanceof XSDAttributeGroupDefinition)
{
XSDAttributeGroupDefinition group = (XSDAttributeGroupDefinition) input;
isReference = group.isAttributeGroupDefinitionReference();
hideHyperLink = isReference;
}
}
public void doHandleEvent(Event event)
{
super.doHandleEvent(event);
if (event.widget == nameText)
{
String newValue = nameText.getText().trim();
if (input instanceof XSDNamedComponent)
{
XSDNamedComponent namedComponent = (XSDNamedComponent) input;
if (!validateSection())
return;
Command command = null;
// Make sure an actual name change has taken place
String oldName = namedComponent.getName();
if (!newValue.equals(oldName))
{
command = new UpdateNameCommand(Messages._UI_ACTION_RENAME, namedComponent, newValue);
}
if (command != null && getCommandStack() != null)
{
getCommandStack().execute(command);
}
// doReferentialIntegrityCheck(namedComponent, newValue);
}
}
}
protected boolean validateSection()
{
if (nameText == null || nameText.isDisposed())
return true;
setErrorMessage(null);
String name = nameText.getText().trim();
// validate against NCName
if (name.length() < 1 || !XMLChar.isValidNCName(name))
{
setErrorMessage(Messages._UI_ERROR_INVALID_NAME);
return false;
}
return true;
}
public void doWidgetSelected(SelectionEvent e)
{
if (e.widget == refCombo)
{
String newValue = refCombo.getText();
if (input instanceof XSDNamedComponent)
{
XSDNamedComponent namedComponent = (XSDNamedComponent)input;
Element element = namedComponent.getElement();
if (namedComponent instanceof XSDAttributeGroupDefinition)
{
element.setAttribute(XSDConstants.REF_ATTRIBUTE, newValue);
XSDDirectivesManager.removeUnusedXSDImports(namedComponent.getSchema());
}
}
}
super.doWidgetSelected(e);
}
public void dispose()
{
if (nameText != null && !nameText.isDisposed())
removeListeners(nameText);
super.dispose();
}
}