/******************************************************************************* * Copyright (c) 2009, 2010 Progress Software Corporation. * 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 ******************************************************************************/ // Copyright (c) 2009 Progress Software Corporation. package org.fusesource.tools.message.helper; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.command.CompoundCommand; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.edit.command.RemoveCommand; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.fusesource.tools.core.message.Body; import org.fusesource.tools.core.message.Message; import org.fusesource.tools.core.message.MessagePackage; import org.fusesource.tools.core.message.Properties; import org.fusesource.tools.core.message.Property; import org.fusesource.tools.message.editors.MessageEditorConstants; import org.fusesource.tools.message.editors.MessageEditorPageBean; import org.fusesource.tools.message.extensions.IMessageEditorExtension; import org.fusesource.tools.message.extensions.IMessageTypeUI; import org.fusesource.tools.message.presentation.MessageEditor; import org.fusesource.tools.message.utils.EMFUtil; import org.fusesource.tools.message.utils.MessageExtensionsMgr; public class MessageEditorHelper { private Composite bodyComposite = null; private Message messageModel = null; private Composite bodyContentComposite = null; private EditingDomain editingDomain; private Composite container; private Collection<MessageEditorPageBean> editorPages; private MessageEditor editor; public Collection<MessageEditorPageBean> getPages(Composite container, EditingDomain editingDomain, Message message, MessageEditor editor) { this.editingDomain = editingDomain; this.container = container; this.messageModel = message; this.editor = editor; editorPages = new ArrayList<MessageEditorPageBean>(); Composite bodyUI = createBodyUI(); // Create a body page editorPages.add(new MessageEditorPageBean(MessageEditorConstants.MESSAGE_BODY_PAGE_NAME, bodyUI)); addRequiredPages(); return editorPages; } public Composite createBodyUI() { bodyComposite = new Composite(container, SWT.NONE); bodyComposite.setLayout(new GridLayout(5, false)); GridData data = new GridData(); Label messageType = new Label(bodyComposite, SWT.NONE); messageType.setText("Message Type:"); data.horizontalSpan = 2; messageType.setLayoutData(data); data = new GridData(); data.horizontalSpan = 3; final Combo messageTypeCombo = new Combo(bodyComposite, SWT.READ_ONLY); List<String> messageTypes = EMFUtil.getDisplayMessageTypes(); messageTypeCombo.setItems(messageTypes.toArray(new String[messageTypes.size()])); messageTypeCombo.setLayoutData(data); disposeAndCreateBodyContentComposite(); String type = messageModel.getType(); // convert the type in the format of ${TYPE(ProviderName) String displayType = EMFUtil.formatDisplayType(type, messageModel.getProviderId()); messageTypeCombo.select(messageTypes.indexOf(displayType)); messageTypeCombo.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { editorPages.clear(); refreshAll(messageTypeCombo); editor.addNewPagesToEditor(editorPages); } public void widgetDefaultSelected(SelectionEvent e) { } }); return bodyComposite; } private void refreshAll(final Combo messageTypeCombo) { reset(); disposeAndCreateBodyContentComposite(); String type = messageTypeCombo.getItem(messageTypeCombo.getSelectionIndex()); EMFUtil.loadHeadersAndMessgeAttributes(type, messageModel, editingDomain); addRequiredPages(); bodyComposite.layout(); refreshBodyUI(); } private void addRequiredPages() { Collection<MessageEditorPageBean> contentComposite = createBodyContentComposite(); if (contentComposite != null) { editorPages.addAll(contentComposite); } } private void reset() { ArrayList<Command> arrayList = new ArrayList<Command>(); Properties properties = messageModel.getProperties(); Body body = messageModel.getBody(); MessagePackage einstance = MessagePackage.eINSTANCE; if (properties != null) { EList<Property> property = properties.getProperty(); if (property != null && !property.isEmpty()) { arrayList.add(RemoveCommand.create(editingDomain, properties, einstance.getProperties(), new StructuredSelection(property).toList())); } } if (body != null) { arrayList.add(RemoveCommand.create(editingDomain, messageModel, einstance.getBody(), new StructuredSelection(body).toList())); } if (arrayList.size() > 0) { CompoundCommand deleteHeaders = new CompoundCommand(arrayList); editingDomain.getCommandStack().execute(deleteHeaders); } } private void disposeAndCreateBodyContentComposite() { if (bodyContentComposite != null) { bodyContentComposite.dispose(); } bodyContentComposite = new Composite(bodyComposite, SWT.NONE); GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); data.horizontalSpan = 5; bodyContentComposite.setLayoutData(data); } private Collection<MessageEditorPageBean> createBodyContentComposite() { String type = messageModel.getType(); String providerId = messageModel.getProviderId(); IMessageTypeUI messageTypeUI = MessageExtensionsMgr.getInstance().getMessageTypeUIExtension(type, providerId); if (messageTypeUI != null) { IMessageEditorExtension editorExtension = messageTypeUI.getEditorExtension(); editorExtension.createBody(bodyContentComposite, editingDomain, messageModel); return editorExtension.getEditorPages(container, editingDomain, messageModel); } return null; } public void refreshBodyUI() { bodyContentComposite.layout(); } }