/* * Copyright 2015 Nokia Solutions and Networks * Licensed under the Apache License, Version 2.0, * see license.txt file for details. */ package org.robotframework.ide.eclipse.main.plugin.project.editor; import java.util.List; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.inject.Inject; import org.eclipse.e4.core.contexts.ContextInjectionFactory; import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.e4.core.di.annotations.Optional; import org.eclipse.e4.tools.services.IDirtyProviderService; import org.eclipse.e4.ui.di.Focus; import org.eclipse.e4.ui.di.Persist; import org.eclipse.e4.ui.di.UIEventTopic; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.forms.IMessageManager; import org.eclipse.ui.forms.widgets.Form; import org.rf.ide.core.project.RobotProjectConfig; import org.robotframework.ide.eclipse.main.plugin.RedImages; import org.robotframework.ide.eclipse.main.plugin.project.RobotProjectConfigEvents; import org.robotframework.ide.eclipse.main.plugin.tableeditor.ISectionFormFragment; import org.robotframework.red.forms.RedFormToolkit; import org.robotframework.red.graphics.ImagesManager; /** * @author Michal Anglart * */ public abstract class RedProjectEditorPage { private IEclipseContext context; private RedFormToolkit toolkit; private List<? extends ISectionFormFragment> formFragments; private Form form; @PostConstruct public final void postConstruct(final Composite parent, final IEditorPart editorPart) { adjustParentLayout(parent); toolkit = createToolkit(parent); final IEditorSite site = editorPart.getEditorSite(); context = ((IEclipseContext) site.getService(IEclipseContext.class)).getActiveLeaf(); context.set(RedFormToolkit.class, toolkit); context.set(IDirtyProviderService.class, context.get(IDirtyProviderService.class)); context.set(IEditorSite.class, editorPart.getEditorSite()); form = createForm(parent, ImagesManager.getImage(RedImages.getRobotProjectConfigFile())); context.set(IMessageManager.class, form.getMessageManager()); formFragments = createFormFragments(); injectToFormParts(context, formFragments); for (final ISectionFormFragment part : formFragments) { part.initialize(form.getBody()); } site.setSelectionProvider(getSelectionProvider()); } private void adjustParentLayout(final Composite parent) { final FillLayout parentLayout = (FillLayout) parent.getLayout(); parentLayout.marginHeight = 0; parentLayout.marginWidth = 0; } private RedFormToolkit createToolkit(final Composite parent) { final RedFormToolkit toolkit = new RedFormToolkit(parent.getDisplay()); parent.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(final DisposeEvent e) { toolkit.dispose(); } }); return toolkit; } protected abstract List<? extends ISectionFormFragment> createFormFragments(); private void injectToFormParts(final IEclipseContext context, final List<? extends ISectionFormFragment> sectionForms) { for (final ISectionFormFragment part : sectionForms) { ContextInjectionFactory.inject(part, context); } } private Form createForm(final Composite parent, final Image image) { final Form form = toolkit.createForm(parent); form.setImage(image); form.setText("RED Project"); toolkit.decorateFormHeading(form); GridLayoutFactory.fillDefaults().numColumns(getNumberOfColumnsInForm()).equalWidth(true).margins(3, 3).applyTo(form.getBody()); return form; } protected int getNumberOfColumnsInForm() { return 2; } protected abstract ISelectionProvider getSelectionProvider(); @Focus public void setFocus() { if (!formFragments.isEmpty()) { formFragments.get(0).setFocus(); } } @Persist public void onSave() { final IDirtyProviderService dirtyProviderService = context.getActive(IDirtyProviderService.class); dirtyProviderService.setDirtyState(false); for (final ISectionFormFragment fragment : formFragments) { ContextInjectionFactory.invoke(fragment, Persist.class, context, context, null); } } @PreDestroy public final void preDestroy() { for (final ISectionFormFragment fragment : formFragments) { ContextInjectionFactory.uninject(fragment, context); } } @Inject @Optional private void whenEnvironmentLoadingStarted( @UIEventTopic(RobotProjectConfigEvents.ROBOT_CONFIG_ENV_LOADING_STARTED) final RobotProjectConfig config) { form.setBusy(true); } @Inject @Optional private void whenEnvironmentsWereLoaded( @UIEventTopic(RobotProjectConfigEvents.ROBOT_CONFIG_ENV_LOADED) final Environments envs) { form.setBusy(false); } }