/*******************************************************************************
* Copyright (c) 2016 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.windup.ui.internal.editor;
import static org.jboss.tools.windup.model.domain.WindupConstants.ACTIVE_CONFIG;
import static org.jboss.tools.windup.ui.internal.Messages.windupEditorTitle;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.InstanceScope;
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.ui.di.UIEventTopic;
import org.eclipse.jface.action.ContributionManager;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.forms.widgets.Form;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.menus.IMenuService;
import org.jboss.tools.windup.model.domain.ModelService;
import org.jboss.tools.windup.ui.WindupUIPlugin;
import org.jboss.tools.windup.windup.ConfigurationElement;
import com.google.common.collect.Maps;
/**
* The editor for configuring and launching Windup.
*/
public class WindupEditor {
public static final String ID = "org.jboss.tools.windup.ui.part.windupEditor"; //$NON-NLS-1$
private static final String TOOLBAR_ID = "toolbar:org.jboss.tools.windup.toolbar"; //$NON-NLS-1$
private static final String SASH_LEFT = "weightLeft"; //$NON-NLS-1$
private static final String SASH_RIGHT = "weightRight"; //$NON-NLS-1$
private static final int SASH_LEFT_DEFAULT = 238;
private static final int SASH_RIGHT_DEFAULT = 685;
@Inject private Composite container;
@Inject private IEclipseContext context;
@Inject private IMenuService menuService;
@Inject private ModelService modelService;
private Composite stackComposite;
private Composite gettingStartedComposite;
private Form form;
private FormToolkit toolkit;
private SashForm sash;
private IEclipsePreferences preferences = InstanceScope.INSTANCE.getNode(WindupUIPlugin.PLUGIN_ID);
private DataBindingContext bindingContext = new DataBindingContext();
private Map<ConfigurationElement, WindupTabStack> tabStack = Maps.newHashMap();
@PostConstruct
private void createParent(Composite parent) {
this.toolkit = new FormToolkit(container.getDisplay());
this.form = toolkit.createForm(parent);
form.setText(windupEditorTitle);
form.setImage(WindupUIPlugin.getDefault().getImageRegistry().get(WindupUIPlugin.IMG_WINDUP));
menuService.populateContributionManager((ContributionManager)form.getToolBarManager(), TOOLBAR_ID);
Composite comp = form.getBody();
GridLayoutFactory.fillDefaults().applyTo(comp);
context.set(Form.class, form);
context.set(FormToolkit.class, toolkit);
context.set(DataBindingContext.class, bindingContext);
context.set(IEclipsePreferences.class, preferences);
this.sash = new SashForm(comp, SWT.SMOOTH|SWT.VERTICAL);
GridDataFactory.fillDefaults().grab(true, true).applyTo(sash);
sash.setOrientation(SWT.HORIZONTAL);
sash.setFont(comp.getFont());
sash.setVisible(true);
sash.addDisposeListener((e) -> {
preferences.put(SASH_LEFT, String.valueOf(sash.getWeights()[0]));
preferences.put(SASH_RIGHT, String.valueOf(sash.getWeights()[1]));
});
createLeftSide(sash);
createRightSide(sash);
int left = preferences.getInt(SASH_LEFT, SASH_LEFT_DEFAULT);
int right = preferences.getInt(SASH_RIGHT, SASH_RIGHT_DEFAULT);
sash.setWeights(new int[]{left, right});
toolkit.decorateFormHeading(form);
toolkit.paintBordersFor(form.getBody());
}
private WindupConfigurationsTable createLeftSide(Composite parent) {
return createChild(WindupConfigurationsTable.class, parent, context.createChild());
}
private <T> T createChild(Class<T> clazz, Composite parent, IEclipseContext child) {
child.set(Composite.class, parent);
return ContextInjectionFactory.make(clazz, child);
}
private void createRightSide(Composite parent) {
this.stackComposite = new Composite(parent, SWT.NONE);
stackComposite.setLayout(new StackLayout());
GridDataFactory.fillDefaults().grab(true, true).applyTo(stackComposite);
fillRightSide(stackComposite);
}
private void fillRightSide(Composite parent) {
this.gettingStartedComposite = new Composite(parent, SWT.NONE);
GridLayoutFactory.fillDefaults().applyTo(gettingStartedComposite);
GridDataFactory.fillDefaults().grab(true, true).applyTo(gettingStartedComposite);
createGettingStarted(gettingStartedComposite);
}
protected void createGettingStarted(Composite parent) {
new Label(parent, SWT.NONE).setText("[TODO] Getting started ...");
}
@Inject
@Optional
private void updateDetails(@UIEventTopic(ACTIVE_CONFIG) ConfigurationElement configuration) {
WindupTabStack stack = null;
if (configuration != null) {
modelService.synch(configuration);
stack = tabStack.get(configuration);
if (stack == null) {
IEclipseContext child = context.createChild();
child.set(ConfigurationElement.class, configuration);
stack = createChild(WindupTabStack.class, stackComposite, child);
tabStack.put(configuration, stack);
}
stack.focus();
}
Composite top = stack != null ? stack.getControl() : gettingStartedComposite;
((StackLayout)stackComposite.getLayout()).topControl = top;
stackComposite.layout(true, true);
}
}