/******************************************************************************* * Copyright (c) 2007, 2014 compeople AG and others. * 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: * compeople AG - initial API and implementation *******************************************************************************/ package org.eclipse.riena.e4.launcher.part; import javax.inject.Inject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.riena.navigation.ApplicationNodeManager; import org.eclipse.riena.navigation.ISubModuleNode; import org.eclipse.riena.navigation.ui.controllers.ApplicationController; import org.eclipse.riena.navigation.ui.swt.binding.InjectSwtViewBindingDelegate; import org.eclipse.riena.ui.ridgets.IStatuslineNumberRidget; import org.eclipse.riena.ui.ridgets.IStatuslineRidget; import org.eclipse.riena.ui.swt.DefaultStatuslineContentFactory; import org.eclipse.riena.ui.swt.GrabCorner; import org.eclipse.riena.ui.swt.IStatusLineContentFactory; import org.eclipse.riena.ui.swt.Statusline; import org.eclipse.riena.ui.swt.StatuslineSpacer; import org.eclipse.riena.ui.swt.lnf.LnFUpdater; import org.eclipse.riena.ui.swt.lnf.LnfKeyConstants; import org.eclipse.riena.ui.swt.lnf.LnfManager; /** * Creates the Riena status line. * * @author jdu * @since 6.1 * */ public class StatusLinePart { public static final int BOTTOM_OFFSET = 3; @Inject private IExtensionRegistry extensionRegistry; @Inject public void create(final Composite parent) { final Composite c = new Composite(parent, SWT.NONE); c.setLayout(new FormLayout()); GrabCorner grabCorner = null; if (org.eclipse.riena.ui.swt.GrabCorner.isResizeable() && LnfManager.getLnf().getBooleanSetting(LnfKeyConstants.SHELL_HIDE_OS_BORDER)) { grabCorner = new GrabCorner(c, SWT.DOUBLE_BUFFERED, true); final FormData layoutData = (FormData) grabCorner.getLayoutData(); layoutData.right.offset = 0; layoutData.bottom.offset = 0; } final Statusline statusLine = createStatusLine(c, grabCorner); final IStatuslineRidget statusLineRidget = addUIControl(statusLine, "statusline"); //$NON-NLS-1$ // set the active node (if any) to the status line // TODO is this really part of Riena? very similar code can be found in SwtExampleApplication final ISubModuleNode activeSubModuleNode = ApplicationNodeManager.locateActiveSubModuleNode(); final IStatuslineNumberRidget numberRidget = statusLineRidget.getStatuslineNumberRidget(); if (activeSubModuleNode != null && numberRidget != null) { numberRidget.setNumberString(activeSubModuleNode.getLabel()); } } private Statusline createStatusLine(final Composite parent, final Composite grabCorner) { // final IStatusLineContentFactory statusLineFactory = getStatuslineContentFactory(); // TODO from extension point final IStatusLineContentFactory statusLineFactory = getStatusLineContentFactory(); final Statusline statusLine = new Statusline(parent, SWT.None, StatuslineSpacer.class, statusLineFactory); final FormData fd = new FormData(); // final Rectangle navigationBounds = TitlelessStackPresentation.calcNavigationBounds(parent); fd.top = new FormAttachment(0, 0); fd.left = new FormAttachment(0, 0); if (grabCorner != null) { fd.right = new FormAttachment(grabCorner, 0); } else { fd.right = new FormAttachment(100, 0); } fd.bottom = new FormAttachment(100, -BOTTOM_OFFSET); statusLine.setLayoutData(fd); LnFUpdater.getInstance().updateUIControls(statusLine, true); return statusLine; } private IStatuslineRidget addUIControl(final Statusline statusLine, final String bindingId) { final InjectSwtViewBindingDelegate binding = new InjectSwtViewBindingDelegate(); binding.addUIControl(statusLine, bindingId); final ApplicationController applicationController = (ApplicationController) ApplicationNodeManager.getApplicationNode().getNavigationNodeController(); binding.injectAndBind(applicationController); return applicationController.getStatusline(); } /** * TODO use riena injection mechanism * * @return */ private IStatusLineContentFactory getStatusLineContentFactory() { final IConfigurationElement[] extensions = extensionRegistry.getConfigurationElementsFor("org.eclipse.riena.navigation.ui.swt.statusLine"); if (extensions.length == 0) { return new DefaultStatuslineContentFactory(); } else { try { return (IStatusLineContentFactory) extensions[0].createExecutableExtension("factory"); } catch (final CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return new DefaultStatuslineContentFactory(); } }