/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.ui.forms; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.TableWrapData; import org.eclipse.ui.forms.widgets.TableWrapLayout; /** * @since 8.0 */ public class MultiComponentSet extends SimpleComponentSet { // // Instance variables: // private final LinkedComponentSet[] sets; private final int orientation; private Composite holder; // // Constructors: // public MultiComponentSet( String id, LinkedComponentSet[] sets, int orientation ) { super(id, null); this.sets = sets; this.orientation = orientation; } // // Methods: // @Override protected void addControls( Composite parent, FormToolkit ftk ) { int totalColumns; if (orientation == SWT.VERTICAL) { totalColumns = 1; // starting value for (int i = 0; i < sets.length; i++) { int controlCount = sets[i].getControlCount(); if (controlCount > totalColumns) { totalColumns = controlCount; } // endif } // endfor } else { // Horizontal orientation: totalColumns = 0; for (int i = 0; i < sets.length; i++) { totalColumns += sets[i].getControlCount(); } // endfor -- sets } // endif -- orientation holder = ftk.createComposite(parent); if (orientation == SWT.VERTICAL) { // vertical layout, use fill just to make everything show up: holder.setLayout(new FillLayout(SWT.VERTICAL)); } else { // horizontal layout, use tablewrap: TableWrapLayout twl = new TableWrapLayout(); twl.numColumns = totalColumns; twl.bottomMargin = 0; twl.leftMargin = 0; twl.rightMargin = 0; twl.topMargin = 0; holder.setLayout(twl); } // endif holder.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB, TableWrapData.FILL_GRAB, 1, 2)); for (int i = 0; i < sets.length; i++) { if (orientation == SWT.VERTICAL) { // Vertical Orientation: // behave "normally": sets[i].addFormControls(holder, ftk, totalColumns); } else { // Horizontal orientation: // use exactly the right width so that the component // doesn't try to add a placeholder: sets[i].addFormControls(holder, ftk, sets[i].getControlCount()); } // endif -- orientation } // endfor if (orientation == SWT.VERTICAL) { // remove children layout data: Control[] controls = holder.getChildren(); for (int i = 0; i < controls.length; i++) { Control c = controls[i]; c.setLayoutData(null); } // endfor } // endif } @Override protected void addMonitor(ComponentSetMonitor monitor) { for (int i = 0; i < sets.length; i++) { sets[i].setMonitor(monitor); } // endfor } @Override protected void removeMonitor(ComponentSetMonitor monitor) { for (int i = 0; i < sets.length; i++) { sets[i].setMonitor(null); } // endfor } @Override public boolean isUserSet() { for (int i = 0; i < sets.length; i++) { if (sets[i].isUserSet()) return true; } // endfor return false; } @Override public void setValue(Object o) { if (o != null && o.getClass().isArray()) { // we have an array: Object[] array = (Object[]) o; for (int i = 0; i < sets.length; i++) { sets[i].setValue(array[i]); } // endfor } else { // o null or not an array, just set the same value into everything: for (int i = 0; i < sets.length; i++) { sets[i].setValue(o); } // endfor } // endif } @Override public void reset() { for (int i = 0; i < sets.length; i++) { sets[i].reset(); } // endfor } @Override public void setEditible(boolean enabled) { super.setEditible(enabled); if (holder != null) { // stay enabled: holder.setEnabled(true); } // endif for (int i = 0; i < sets.length; i++) { sets[i].setEditible(enabled); } // endfor } @Override public int getControlCount() { return 2; } @Override public Object clone() { // need to deep clone my kids, and the sets field is final, so create a new one: LinkedComponentSet[] lcss = new LinkedComponentSet[sets.length]; for (int i = 0; i < sets.length; i++) { lcss[i] = sets[i].cloneSet(); } // endfor MultiComponentSet mcs = new MultiComponentSet(getID(), lcss, orientation); return mcs; } }