/*******************************************************************************
* 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.wsdl.formpage;
import java.util.List;
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.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
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.IModelChangeEvent;
import org.eclipse.wst.sse.sieditor.model.api.IModelObject;
import org.eclipse.wst.sse.sieditor.model.wsdl.api.IDescription;
import org.eclipse.wst.sse.sieditor.model.wsdl.api.IFault;
import org.eclipse.wst.sse.sieditor.model.wsdl.api.IParameter;
import org.eclipse.wst.sse.sieditor.model.xsd.api.ISchema;
import org.eclipse.wst.sse.sieditor.ui.Activator;
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.dt.ITypeDisplayer;
import org.eclipse.wst.sse.sieditor.ui.v2.nodes.ITreeNode;
import org.eclipse.wst.sse.sieditor.ui.v2.providers.WSDLContentProvider;
import org.eclipse.wst.sse.sieditor.ui.v2.providers.WSDLDetailsPageProvider;
import org.eclipse.wst.sse.sieditor.ui.v2.providers.WSDLLabelProvider;
import org.eclipse.wst.sse.sieditor.ui.v2.wsdl.controller.SIFormPageController;
import org.eclipse.wst.sse.sieditor.ui.v2.wsdltree.SITreeViewerCellModifier;
import org.eclipse.wst.sse.sieditor.ui.v2.wsdltree.SITreeViewerEditorActivationStrategy;
import org.eclipse.wst.sse.sieditor.ui.v2.wsdltree.actionenablement.SIEActionEnablementForSelectionManager;
import org.eclipse.wst.sse.sieditor.ui.v2.wsdltree.nodes.OperationCategory;
import org.eclipse.wst.sse.sieditor.ui.v2.wsdltree.nodes.OperationNode;
import org.eclipse.wst.sse.sieditor.ui.v2.wsdltree.nodes.ServiceInterfaceNode;
public class SIMasterDetailsBlock extends AbstractMasterDetailsBlock {
private ITypeDisplayer typeDisplayer;
private Button addServiceBtn;
private Button addOperationBtn;
private Button addInParameterBtn;
private Button addFaultBtn;
private Button removeBtn;
private Button addOutParameterBtn;
private final SIEActionEnablementForSelectionManager enablementManager;
/*
* A tool item to show/hide operation categories
*/
protected ToolItem toggleCategoriesToolItem;
public SIMasterDetailsBlock() {
this.enablementManager = new SIEActionEnablementForSelectionManager(this);
}
@Override
public void setController(final AbstractFormPageController controller) {
super.setController(controller);
this.enablementManager.setController(this.getSIFormPageController());
}
@Override
protected void createMasterPart(final IManagedForm managedForm, final Composite parent) {
super.createMasterPart(managedForm, parent);
titleToolbar = new ToolBar(masterSection, SWT.FLAT | SWT.HORIZONTAL);
masterSection.setTextClient(titleToolbar);
toggleCategoriesToolItem = new ToolItem(titleToolbar, SWT.NULL | SWT.CHECK);
toggleCategoriesToolItem.setToolTipText(Messages.SIMasterDetailsBlock_tooltip_show_categories);
toggleCategoriesToolItem.setImage(getImageRegistry().get(Activator.TOOLBAR_TOGGLE_CATEGORIES));
toggleCategoriesToolItem.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
final boolean currentFlag = getSIFormPageController().isShowCategoryNodes();
getSIFormPageController().setShowCategoryNodes(!currentFlag);
}
});
masterSection.setText(Messages.SIMasterDetailsBlock_master_block_title);
masterSection.setDescription(Messages.SIMasterDetailsBlock_master_block_description);
treeViewer.setLabelProvider(new WSDLLabelProvider());
treeViewer.setContentProvider(new WSDLContentProvider(getSIFormPageController()));
treeViewer.getTree().addKeyListener(createKeyListener());
treeViewer.setColumnProperties(new String[] { UIConstants.EMPTY_STRING });
treeViewer.setCellEditors(new CellEditor[] { new TextCellEditor(treeViewer.getTree(), SWT.NULL) });
treeViewer.setCellModifier(new SITreeViewerCellModifier(getSIFormPageController()));
final SITreeViewerEditorActivationStrategy editorActivationStrategy = new SITreeViewerEditorActivationStrategy(treeViewer);
editorActivationStrategy.setEnableEditorActivationWithKeyboard(true);
TreeViewerEditor.create(treeViewer, editorActivationStrategy, TreeViewerEditor.KEYBOARD_ACTIVATION
| TreeViewerEditor.TABBING_VERTICAL);
treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
public void selectionChanged(final SelectionChangedEvent event) {
final IStructuredSelection selection = (IStructuredSelection) event.getSelection();
final Object firstElement = selection.getFirstElement();
((SITreeViewerCellModifier) treeViewer.getCellModifier()).setSelectedElement(firstElement);
updateButtonsState(selection);
}
});
}
/**
* utility method
*
* @param structSelection
*/
protected void updateButtonsState(final IStructuredSelection structSelection) {
enablementManager.selectionChanged(structSelection);
}
protected void addInParameterPressed() {
final ITreeNode selectedElement = (ITreeNode) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement();
getSIFormPageController().addNewParameter(selectedElement, OperationCategory.INPUT);
}
protected void addOutParameterPressed() {
final ITreeNode selectedElement = (ITreeNode) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement();
getSIFormPageController().addNewParameter(selectedElement, OperationCategory.OUTPUT);
}
protected void addServicePressed() {
getSIFormPageController().addNewServiceInterface();
}
protected void addOperationPressed() {
final ITreeNode selectedElement = (ITreeNode) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement();
getSIFormPageController().addNewOperation(selectedElement);
}
protected void addFaultPressed() {
final ITreeNode selectedElement = (ITreeNode) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement();
getSIFormPageController().addNewFault(selectedElement);
}
@Override
protected void removePressed() {
final List<ITreeNode> listItems = ((IStructuredSelection) treeViewer.getSelection()).toList();
getSIFormPageController().deleteItemsTriggered(listItems);
}
/**
* Retrieves the controller used to change the model and keep view updated
*
* @return the controller
*/
private SIFormPageController getSIFormPageController() {
return (SIFormPageController) controller;
}
/**
* Method called when initialising the containing form (before
* createPartControll) It's purpose is to set the object displaying the type
* from the Parameter details page, when the hyper link is clicked,
*
* @param typeDisplayer
*/
public void setTypeDisplayer(final ITypeDisplayer typeDisplayer) {
this.typeDisplayer = typeDisplayer;
}
@Override
protected void createButtons(final FormToolkit toolkit, final Composite buttonsComposite) {
final RowLayout layout = new RowLayout(SWT.VERTICAL);
layout.fill = true;
buttonsComposite.setLayout(layout);
addServiceBtn = toolkit.createButton(buttonsComposite, Messages.SIMasterDetailsBlock_add_interface_button, SWT.PUSH);
addOperationBtn = toolkit.createButton(buttonsComposite, Messages.SIMasterDetailsBlock_add_operation_button, SWT.PUSH);
addInParameterBtn = toolkit.createButton(buttonsComposite, Messages.SIMasterDetailsBlock_add_input_parameter_button,
SWT.PUSH);
addOutParameterBtn = toolkit.createButton(buttonsComposite, Messages.SIMasterDetailsBlock_add_output_parameter_button,
SWT.PUSH);
addFaultBtn = toolkit.createButton(buttonsComposite, Messages.SIMasterDetailsBlock_add_fault_button, SWT.PUSH);
// This is a pretty dull trick - a button is used, because of the exact
// height
new Button(buttonsComposite, SWT.PUSH).setVisible(false);
removeBtn = toolkit.createButton(buttonsComposite, Messages.SIMasterDetailsBlock_remove_button, SWT.PUSH);
final SelectionListener buttonHandler = new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
final Object source = e.getSource();
if (source == addServiceBtn) {
addServicePressed();
} else if (source == addOperationBtn) {
addOperationPressed();
} else if (source == addInParameterBtn) {
addInParameterPressed();
} else if (source == addOutParameterBtn) {
addOutParameterPressed();
} else if (source == addFaultBtn) {
addFaultPressed();
} else if (source == getRemoveButton()) {
removePressed();
}
}
};
addServiceBtn.addSelectionListener(buttonHandler);
addOperationBtn.addSelectionListener(buttonHandler);
addInParameterBtn.addSelectionListener(buttonHandler);
addOutParameterBtn.addSelectionListener(buttonHandler);
addFaultBtn.addSelectionListener(buttonHandler);
getRemoveButton().addSelectionListener(buttonHandler);
addServiceBtn.setEnabled(((SIFormPageController) getController()).isAddNewServiceInterfaceEnabled(null));
updateButtonsState(StructuredSelection.EMPTY);
}
@Override
protected IDetailsPageProvider createDetailsPageProvider() {
return new WSDLDetailsPageProvider(getSIFormPageController(), typeDisplayer);
}
// ===========================================================
// helpers
// ===========================================================
@Override
public Button getRemoveButton() {
return removeBtn;
}
public Button getAddFaultBtn() {
return addFaultBtn;
}
public Button getAddInParameterBtn() {
return addInParameterBtn;
}
public Button getAddOperationBtn() {
return addOperationBtn;
}
public Button getAddOutParameterBtn() {
return addOutParameterBtn;
}
public Button getAddServiceBtn() {
return addServiceBtn;
}
}