package rocks.inspectit.ui.rcp.editor.composite; import java.util.HashMap; import java.util.Map; import org.eclipse.jface.viewers.IPostSelectionProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.events.FocusAdapter; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.forms.widgets.FormToolkit; import rocks.inspectit.shared.all.util.ObjectUtils; import rocks.inspectit.ui.rcp.editor.ISubView; /** * This implementation of a composite sub view uses the {@link GridLayout} to layout the associated * children. * * @author Patrice Bouillet * */ public class GridCompositeSubView extends AbstractCompositeSubView { /** * The map contains the layout data objects. */ private Map<ISubView, Object> layoutDataMap = new HashMap<>(); /** * The composite of this sub-view. */ private Composite composite; /** * The layout of the contained composite. */ private GridLayout gridLayout; /** * Default constructor which calls * {@link GridCompositeSubView#GridCompositeSubView(int, boolean)} with values <code>1</code> * for the number of columns and <code>false</code> if the columns should have an equal width. */ public GridCompositeSubView() { this(1, false); } /** * Constructor which constructs the {@link GridLayout} object with the passed values. * * @param numColumns * The number of columns. * @param makeColumnsEqualWidth * If the columns should have an equal width. * @see GridLayout */ public GridCompositeSubView(int numColumns, boolean makeColumnsEqualWidth) { gridLayout = new GridLayout(numColumns, makeColumnsEqualWidth); } /** * Adds a new sub-view with the specified layout data to this composite view. * * @param subView * The {@link ISubView} which will be added. * @param layoutData * The layout data of the corresponding sub-view. */ public void addSubView(ISubView subView, Object layoutData) { super.addSubView(subView); layoutDataMap.put(subView, layoutData); } /** * {@inheritDoc} */ @Override public void createPartControl(Composite parent, FormToolkit toolkit) { composite = toolkit.createComposite(parent); composite.setLayout(gridLayout); for (final ISubView subView : getSubViews()) { subView.createPartControl(composite, toolkit); if (layoutDataMap.containsKey(subView)) { subView.getControl().setLayoutData(layoutDataMap.get(subView)); } subView.getControl().addFocusListener(new FocusAdapter() { /** * {@inheritDoc} */ @Override public void focusGained(FocusEvent e) { getRootEditor().setActiveSubView(subView); } }); if (null != subView.getSelectionProvider()) { ISelectionProvider prov = subView.getSelectionProvider(); prov.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { getRootEditor().setSelection(event.getSelection()); } }); prov.addSelectionChangedListener(getRootEditor().getSelectionChangedListener()); if (prov instanceof IPostSelectionProvider) { ((IPostSelectionProvider) prov).addPostSelectionChangedListener(getRootEditor().getPostSelectionChangedListener()); } } } } /** * {@inheritDoc} */ @Override public Control getControl() { return composite; } /** * {@inheritDoc} */ @Override public void maximizeSubView(ISubView subView) { ISubView maximizeSubView = subView; if (maximizeSubView == null) { maximizeSubView = getSubViews().get(0); } for (ISubView view : getSubViews()) { if (ObjectUtils.equals(view, maximizeSubView)) { view.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); } else { GridData gd = new GridData(); gd.exclude = true; view.getControl().setLayoutData(gd); } } layout(); } /** * {@inheritDoc} */ @Override public void restoreMaximization() { for (ISubView view : getSubViews()) { view.getControl().setLayoutData(layoutDataMap.get(view)); } layout(); } /** * {@inheritDoc} */ @Override public void layout() { composite.layout(); } }