/******************************************************************************* * Copyright (c) 2010 SAP AG. * 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: * Emil Simeonov - initial API and implementation. * Dimitar Donchev - initial API and implementation. * Dimitar Tenev - initial API and implementation. * Nevena Manova - initial API and implementation. * Georgi Konstantinov - initial API and implementation. *******************************************************************************/ package org.eclipse.wst.sse.sieditor.ui.v2.sections; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusAdapter; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.Section; import org.eclipse.xsd.XSDPackage; import org.eclipse.wst.sse.sieditor.model.api.INamedObject; import org.eclipse.wst.sse.sieditor.model.xsd.api.IStructureType; import org.eclipse.wst.sse.sieditor.ui.i18n.Messages; import org.eclipse.wst.sse.sieditor.ui.v2.IFormPageController; import org.eclipse.wst.sse.sieditor.ui.v2.UIConstants; import org.eclipse.wst.sse.sieditor.ui.v2.common.CarriageReturnListener; import org.eclipse.wst.sse.sieditor.ui.v2.common.LabeledControl; import org.eclipse.wst.sse.sieditor.ui.v2.dt.IDataTypesFormPageController; import org.eclipse.wst.sse.sieditor.ui.v2.dt.ITypeDisplayer; import org.eclipse.wst.sse.sieditor.ui.v2.propertyeditor.StructureTypeEditor; import org.eclipse.wst.sse.sieditor.ui.v2.sections.elements.ElementNodeDetailsController; import org.eclipse.wst.sse.sieditor.ui.v2.utils.UIUtils; public class StructureTypeDetailsSection extends AbstractDetailsPageSection { private final StructureTypeEditor typeEditor; private final ElementNodeDetailsController detailsController; protected Text nameText; private boolean isNameDirty; private LabeledControl<Text> nameControl; public StructureTypeDetailsSection(final IFormPageController controller, final FormToolkit toolkit, final IManagedForm managedForm, final ElementNodeDetailsController detailsController, final ITypeDisplayer typeDisplayer) { super(controller, toolkit, managedForm); this.detailsController = detailsController; typeEditor = new StructureTypeEditor(controller, typeDisplayer, detailsController); typeEditor.initialize(managedForm); } @Override public void createContents(final Composite parent) { final FormToolkit toolkit = getToolkit(); final Section section = createSection(parent, toolkit); final Composite clientComposite = toolkit.createComposite(section); section.setClient(clientComposite); setCompositeLayout(clientComposite); createControls(toolkit, clientComposite); initializeControls(toolkit, clientComposite); toolkit.paintBordersFor(clientComposite); } @Override protected int getColumnsCount() { return 4; } protected ISharedImages getSharedImages() { return PlatformUI.getWorkbench().getSharedImages(); } protected void createControls(final FormToolkit toolkit, final Composite clientComposite) { nameControl = new LabeledControl<Text>(toolkit, clientComposite, Messages.StructureDetailsSection_name_label); nameControl.setControl(toolkit.createText(clientComposite, UIConstants.EMPTY_STRING, SWT.SINGLE)); nameText = nameControl.getControl(); GridDataFactory.swtDefaults().grab(true, false).span(3, 1).align(SWT.FILL, SWT.CENTER).applyTo(nameText); typeEditor.createControl(toolkit, clientComposite); } private void initializeControls(final FormToolkit toolkit, final Composite clientComposite) { nameText.addModifyListener(new ModifyListener() { public void modifyText(final ModifyEvent e) { final String nameTextTrimmed = nameText.getText().trim(); if (!isNameDirty && !nameTextTrimmed.equals(utils().getDisplayName((INamedObject) getModelObject()))) { isNameDirty = true; dirtyStateChanged(); } } }); nameText.addFocusListener(new FocusAdapter() { @Override public void focusLost(final FocusEvent e) { if (isNameDirty) { final IStructureType type = (IStructureType) getModelObject(); if (!nameText.getText().trim().equals(utils().getDisplayName(type))) { ((IDataTypesFormPageController) getController()).rename(type, nameText.getText().trim()); } isNameDirty = false; dirtyStateChanged(); } } }); nameText.addKeyListener(new CarriageReturnListener()); } private Section createSection(final Composite parent, final FormToolkit toolkit) { final Section section = toolkit.createSection(parent, Section.TITLE_BAR | Section.TWISTIE); section.setText(Messages.StructureDetailsSection_section_title); section.setExpanded(true); return section; } @Override public boolean isDirty() { return isNameDirty || typeEditor.isDirty(); } @Override public boolean isStale() { final IStructureType type = (IStructureType) getModelObject(); if (type == null) { return false; } final String nameTextValue = nameText.getText().trim(); return !nameTextValue.equals(utils().getDisplayName(type)) || typeEditor.isStale(); } @Override public void refresh() { detailsController.setInput(node); final IStructureType type = (IStructureType) getModelObject(); nameText.setText(utils().getDisplayName(type)); nameText.setEditable(isEditable()); getProblemDecorator().bind(XSDPackage.Literals.XSD_NAMED_COMPONENT__NAME, nameControl); isNameDirty = false; final boolean applicable = detailsController.isTypeApplicable(); if (applicable) { typeEditor.setInput(node); typeEditor.update(); } typeEditor.setVisible(applicable); getProblemDecorator().bind(XSDPackage.Literals.XSD_COMPLEX_TYPE_DEFINITION__BASE_TYPE_DEFINITION, typeEditor); getProblemDecorator().updateDecorations(); } @Override protected Text getDefaultControl() { return nameText; } protected UIUtils utils() { return UIUtils.instance(); } }