/******************************************************************************* * Copyright (c) 2008, 2011 Obeo. * 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: * Obeo - initial API and implementation *******************************************************************************/ package org.eclipse.emf.eef.runtime.ui.gwt.editor; import java.util.Collection; import java.util.Collections; import java.util.EventObject; import java.util.List; import org.eclipse.emf.common.command.BasicCommandStack; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.command.CommandStack; import org.eclipse.emf.common.command.CommandStackListener; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.edit.provider.AdapterFactoryItemDelegator; import org.eclipse.emf.edit.provider.ItemProvider; import org.eclipse.emf.eef.runtime.ui.gwt.editor.part.EEFEditorToolbar; import org.eclipse.emf.eef.runtime.ui.gwt.editor.part.EEFPropertiesPanel; import org.eclipse.emf.eef.runtime.ui.gwt.editor.util.EditorToolbarListener; import org.eclipse.emf.eef.runtime.ui.gwt.editor.util.NavigationManager; import org.eclipse.emf.eef.runtime.ui.gwt.editor.widget.EEFTreeViewer; import org.eclipse.emf.eef.runtime.ui.gwt.editor.widget.EEFTreeViewerContentProvider; import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.user.client.ui.DockLayoutPanel; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.SplitLayoutPanel; import com.google.gwt.view.client.SelectionChangeEvent; /** * @author glefur * */ public class EEFEditor extends DockLayoutPanel { private EditingDomain editingDomain; private AdapterFactory adapterFactory; private List<Resource> originalResources; private NavigationManager navigationManager; private EEFEditorToolbar toolBar; private EEFTreeViewer treeviewer; private EEFPropertiesPanel propertiesPanel; private AdapterFactoryItemDelegator itemDelegator; /** * @param unit */ public EEFEditor(EditingDomain editingDomain, AdapterFactory adapterFactory, String applicationTitle, Unit unit) { super(unit); this.editingDomain = editingDomain; this.adapterFactory = adapterFactory; this.itemDelegator = new AdapterFactoryItemDelegator(adapterFactory); headerPanel(applicationTitle); bodyPanel(); toolBar.setEnabledButton(false, EEFEditorToolbar.SAVE); toolBar.setEnabledButton(false, EEFEditorToolbar.UNDO); toolBar.setEnabledButton(false, EEFEditorToolbar.REDO); final EditorToolbarListener listener = new EditorToolbarListener(this); toolBar.addListener(listener); treeviewer.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { public void onSelectionChange(SelectionChangeEvent event) { final Object object = ((EEFTreeViewerContentProvider)treeviewer.getTreeViewModel()).getTreeSelection(); listener.update(object); toolBar.setEnabledButton(object instanceof Resource || object instanceof ResourceSet || !EEFEditor.this.editingDomain.getNewChildDescriptors(object, null).isEmpty(), EEFEditorToolbar.CREATE); propertiesPanel.updateProperties(object); } }); editingDomain.getCommandStack().addCommandStackListener(new CommandStackListener() { public void commandStackChanged(EventObject event) { toolBar.setEnabledButton(((BasicCommandStack)EEFEditor.this.editingDomain.getCommandStack()).isSaveNeeded(), EEFEditorToolbar.SAVE); toolBar.setEnabledButton(EEFEditor.this.editingDomain.getCommandStack().canUndo(), EEFEditorToolbar.UNDO); toolBar.setEnabledButton(EEFEditor.this.editingDomain.getCommandStack().canRedo(), EEFEditorToolbar.REDO); Command mostRecentCommand = ((CommandStack) event.getSource()).getMostRecentCommand(); if (mostRecentCommand != null) { Collection<?> affectedObjects = mostRecentCommand.getAffectedObjects(); if (!affectedObjects.isEmpty()) { Object newSelection = affectedObjects.iterator().next(); navigationManager.setSelection(newSelection); navigationManager.navigate(); } } } }); } /** * @return the editingDomain */ public EditingDomain getEditingDomain() { return editingDomain; } /** * @return the adapterFactory */ public AdapterFactory getAdapterFactory() { return adapterFactory; } /** * @param originalResources the originalResources to set */ public void setOriginalResources(List<Resource> originalResources) { this.originalResources = originalResources; } /** * @return the itemDelegator */ public AdapterFactoryItemDelegator getItemDelegator() { return itemDelegator; } /** * @return */ public EEFEditorToolbar getToolbar() { return toolBar; } /** * @return the propertiesPanel */ public EEFPropertiesPanel getPropertiesPanel() { return propertiesPanel; } /** * @return */ public NavigationManager getNavigationManager() { return navigationManager; } /** * @return */ public List<Resource> getOriginalResources() { return originalResources; } /** * Create the editor header panel * @param applicationTitle application title */ private void headerPanel(String applicationTitle) { this.setStyleName("Main", true); this.setHeight("100%"); FlowPanel headerPanel = new FlowPanel(); headerPanel.setStyleName("Header", true); final Label header = new Label(applicationTitle); header.setStyleName("HeaderLabel", true); headerPanel.add(header); this.addNorth(headerPanel, 56.0); } /** * Create the editor body panel */ private void bodyPanel() { DockLayoutPanel bodyPanel = new DockLayoutPanel(Unit.PX); bodyPanel.setStyleName("Body", true); bodyPanel.setHeight("100%"); this.add(bodyPanel); toolBar = new EEFEditorToolbar(); SplitLayoutPanel contentPanel = new SplitLayoutPanel(); contentPanel.setStyleName("Content", true); EEFTreeViewerContentProvider contentProvider = new EEFTreeViewerContentProvider(this); contentProvider.setEditingDomain(editingDomain); contentProvider.setSelected(editingDomain.getResourceSet(), true); treeviewer = new EEFTreeViewer(contentProvider, new ItemProvider(Collections.singleton(editingDomain.getResourceSet()))); ScrollPanel treeScrollPanel = new ScrollPanel(); treeScrollPanel.add(treeviewer); navigationManager = new NavigationManager(editingDomain, treeviewer); propertiesPanel = new EEFPropertiesPanel(this, Unit.PX); contentPanel.addWest(treeScrollPanel, 400); contentPanel.add(propertiesPanel); bodyPanel.addNorth(toolBar, 28.0); bodyPanel.add(contentPanel); } }