/******************************************************************************* * 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.dt; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.jface.viewers.TreeViewerEditor; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.forms.IDetailsPageProvider; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.wst.sse.sieditor.model.api.IModelObject; import org.eclipse.wst.sse.sieditor.model.xsd.api.IType; import org.eclipse.wst.sse.sieditor.model.xsd.impl.UnresolvedType; import org.eclipse.wst.sse.sieditor.ui.i18n.Messages; import org.eclipse.wst.sse.sieditor.ui.v2.AbstractFormPageController; import org.eclipse.wst.sse.sieditor.ui.v2.AbstractMasterDetailsBlock; import org.eclipse.wst.sse.sieditor.ui.v2.UIConstants; import org.eclipse.wst.sse.sieditor.ui.v2.common.AbstractTreeViewerCellModifier; import org.eclipse.wst.sse.sieditor.ui.v2.dt.actionenablement.DataTypesEditorActionEnablementForSelectionManager; import org.eclipse.wst.sse.sieditor.ui.v2.dt.nodes.IDataTypesTreeNode; import org.eclipse.wst.sse.sieditor.ui.v2.factory.TreeNodeMapper; import org.eclipse.wst.sse.sieditor.ui.v2.wsdltree.SITreeViewerEditorActivationStrategy; public class DataTypesMasterDetailsBlock extends AbstractMasterDetailsBlock implements ITypeDisplayer { private final DataTypesEditorPage parentEditorPage; private Button addNamespacesButton; private Button addGlobalElementButton; private Button addSimpleTypeButon; private Button addComplexTypeButton; private Button removeButton; private Button addElementButton; private Button addAttributeButton; private final DataTypesEditorActionEnablementForSelectionManager selectionEnablementManager; public DataTypesMasterDetailsBlock(final DataTypesEditorPage parent) { this.parentEditorPage = parent; this.selectionEnablementManager = new DataTypesEditorActionEnablementForSelectionManager(this); } @Override public void setController(final AbstractFormPageController controller) { super.setController(controller); selectionEnablementManager.setController(getDtFormPageController()); } @Override protected void createMasterPart(final IManagedForm managedForm, final Composite parent) { super.createMasterPart(managedForm, parent); masterSection.setText(Messages.DataTypesMasterDetailsBlock_master_section_title_data_types); treeViewer.addSelectionChangedListener(new ISelectionChangedListener() { // @Override public void selectionChanged(final SelectionChangedEvent event) { final IStructuredSelection selection = (IStructuredSelection) event.getSelection(); updateButtonsState(selection); } }); getTreeViewer().setLabelProvider(createLabelProvider()); getTreeViewer().setContentProvider(createContentProvider()); getTreeViewer().setInput(parentEditorPage.getModel()); getTreeViewer().getTree().addKeyListener(createKeyListener()); getTreeViewer().setColumnProperties(new String[] { UIConstants.EMPTY_STRING }); getTreeViewer().setCellEditors(new CellEditor[] { new TextCellEditor(treeViewer.getTree(), SWT.NULL) }); getTreeViewer().setCellModifier(new DTTreeViewerCellModifier(getDtFormPageController())); final SITreeViewerEditorActivationStrategy editorActivationStrategy = new SITreeViewerEditorActivationStrategy(treeViewer); editorActivationStrategy.setEnableEditorActivationWithKeyboard(true); TreeViewerEditor.create(getTreeViewer(), editorActivationStrategy, TreeViewerEditor.KEYBOARD_ACTIVATION | TreeViewerEditor.TABBING_VERTICAL); getTreeViewer().addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(final SelectionChangedEvent event) { final Object firstElement = ((IStructuredSelection) event.getSelection()).getFirstElement(); ((AbstractTreeViewerCellModifier) treeViewer.getCellModifier()).setSelectedElement(firstElement); } }); } protected DataTypesContentProvider createContentProvider() { return new DataTypesContentProvider(getDtFormPageController()); } protected DataTypesLabelProvider createLabelProvider() { return new DataTypesLabelProvider(); } @Override protected void createButtons(final FormToolkit toolkit, final Composite buttonsComposite) { final RowLayout layout = new RowLayout(SWT.VERTICAL); layout.fill = true; buttonsComposite.setLayout(layout); // inits the button only if the editor is part of SI Editor (the // controller is ISiEditorDataTypesFormPageController // if there are more differences between the stand alone and integrated // editor, this chass should be extended isntead if (controller instanceof ISiEditorDataTypesFormPageController) { addNamespacesButton = toolkit.createButton(buttonsComposite, Messages.DataTypesMasterDetailsBlock_add_namespace_button, SWT.PUSH); } addGlobalElementButton = toolkit.createButton(buttonsComposite, Messages.DataTypesMasterDetailsBlock_AddGlobalElement, SWT.PUSH); addSimpleTypeButon = toolkit.createButton(buttonsComposite, Messages.DataTypesMasterDetailsBlock_add_simple_type_button, SWT.PUSH); addComplexTypeButton = toolkit.createButton(buttonsComposite, Messages.DataTypesMasterDetailsBlock_add_complex_type_button, SWT.PUSH); final Button buttonSeparator1 = new Button(buttonsComposite, SWT.PUSH); buttonSeparator1.setVisible(false); addElementButton = toolkit.createButton(buttonsComposite, Messages.DataTypesMasterDetailsBlock_add_element_button, SWT.PUSH); addAttributeButton = toolkit.createButton(buttonsComposite, Messages.DataTypesMasterDetailsBlock_add_attribute_button, SWT.PUSH); final Button buttonSeparator2 = new Button(buttonsComposite, SWT.PUSH); buttonSeparator2.setVisible(false); removeButton = toolkit.createButton(buttonsComposite, Messages.DataTypesMasterDetailsBlock_remove_button, SWT.PUSH); final SelectionListener buttonHandler = new SelectionAdapter() { @Override public void widgetSelected(final SelectionEvent e) { final Object source = e.getSource(); if (source == addGlobalElementButton) { addGlobalElementPressed(); } else if (source == addNamespacesButton) { addNsPressed(); } else if (source == addElementButton) { addElementPressed(); } else if (source == addSimpleTypeButon) { addSimpleTypePressed(); } else if (source == addComplexTypeButton) { addComplexTypePressed(); } else if (source == addAttributeButton) { addAttributePressed(); } else if (source == getRemoveButton()) { removePressed(); } } }; if (addNamespacesButton != null) { addNamespacesButton.addSelectionListener(buttonHandler); } addGlobalElementButton.addSelectionListener(buttonHandler); addElementButton.addSelectionListener(buttonHandler); addComplexTypeButton.addSelectionListener(buttonHandler); addSimpleTypeButon.addSelectionListener(buttonHandler); addAttributeButton.addSelectionListener(buttonHandler); getRemoveButton().addSelectionListener(buttonHandler); updateButtonsState(StructuredSelection.EMPTY); } protected void addGlobalElementPressed() { final IDataTypesTreeNode selectedElement = (IDataTypesTreeNode) ((IStructuredSelection) treeViewer.getSelection()) .getFirstElement(); getDtFormPageController().handleAddGlobalElementAction(selectedElement); } /** * Called by the treeViewer's ISelectionChangedListener. Purpose - to update * the buttons enabled/disabled state regarding the selected element. If the * {@link DataTypesMasterDetailsBlock#createMasterPart(IManagedForm, Composite)} * is overridden,<br> * this method will not be called so ther would be no use of overriding it. * * @param selection */ protected void updateButtonsState(final IStructuredSelection selection) { selectionEnablementManager.selectionChanged(selection); } protected void addSimpleTypePressed() { final IDataTypesTreeNode selectedElement = (IDataTypesTreeNode) ((IStructuredSelection) treeViewer.getSelection()) .getFirstElement(); getDtFormPageController().handleAddSimpleTypeAction(selectedElement); } private void addElementPressed() { final IDataTypesTreeNode selectedElement = (IDataTypesTreeNode) ((IStructuredSelection) treeViewer.getSelection()) .getFirstElement(); getDtFormPageController().handleAddElementAction(selectedElement); } @Override protected void removePressed() { getDtFormPageController().handleRemoveAction(((IStructuredSelection) treeViewer.getSelection()).toList()); } protected void addComplexTypePressed() { final IDataTypesTreeNode selectedElement = (IDataTypesTreeNode) ((IStructuredSelection) treeViewer.getSelection()) .getFirstElement(); getDtFormPageController().handleAddStructureTypeAction(selectedElement); } protected void addNsPressed() { ((ISiEditorDataTypesFormPageController) getDtFormPageController()).handleAddNewNamespaceAction(); } protected void addAttributePressed() { final IDataTypesTreeNode selectedElement = (IDataTypesTreeNode) ((IStructuredSelection) treeViewer.getSelection()) .getFirstElement(); getDtFormPageController().handleAddAttributeAction(selectedElement); } @Override protected void createToolBarActions(final IManagedForm managedForm) { // TODO Auto-generated method stub } public void showType(final IType type) { showModelObject(type); } private void showModelObject(final IModelObject modelObjectToShow) { if (modelObjectToShow instanceof UnresolvedType) { return; } final TreeNodeMapper treeNodeMapper = getDtFormPageController().getTreeNodeMapper(); // TODO - what if the element is not contained in the tree?? boolean proceedSearch = true; IModelObject parentObj; IModelObject childObj; // if no tree node is found in the mapper for this IModelObject while (treeNodeMapper.getTreeNode(modelObjectToShow) == null && proceedSearch) { // try to find if it's parent has a treeNode registered in the // mapper. parentObj = modelObjectToShow.getParent(); while (treeNodeMapper.getTreeNode(parentObj) == null) { // if the parent does not have a node registered in the mapper - // try the parent's parent childObj = parentObj; parentObj = parentObj.getParent(); // if the getParent() method returns null - break the search for // a registered ModelObject if (parentObj == childObj || parentObj == null) { proceedSearch = false; break; } } treeViewer.expandToLevel(treeNodeMapper.getTreeNode(parentObj), 1); } if (proceedSearch) { treeViewer.setSelection(new StructuredSelection(treeNodeMapper.getTreeNode(modelObjectToShow)), true); } else { // TODO log type not found!!! } } @Override protected IDetailsPageProvider createDetailsPageProvider() { return new DataTypesDetailsPageProvider(getDtFormPageController(), this); } private DataTypesFormPageController getDtFormPageController() { return (DataTypesFormPageController) getController(); } // ========================================================= // getters // ========================================================= public Button getAddAttributeButton() { return addAttributeButton; } public Button getAddComplexTypeButton() { return addComplexTypeButton; } public Button getAddGlobalElementButton() { return addGlobalElementButton; } public Button getAddElementButton() { return addElementButton; } public Button getAddNamespacesButton() { return addNamespacesButton; } public Button getAddSimpleTypeButon() { return addSimpleTypeButon; } @Override public Button getRemoveButton() { return removeButton; }; }