/** | |
* <copyright> | |
* | |
* Copyright (c) 2008-2010 See4sys 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: | |
* See4sys - Initial API and implementation | |
* | |
* </copyright> | |
*/ | |
package org.eclipse.sphinx.emf.editors.forms.layouts; | |
import org.eclipse.swt.layout.GridLayout; | |
import org.eclipse.swt.widgets.Composite; | |
import org.eclipse.swt.widgets.Display; | |
import org.eclipse.ui.forms.widgets.TableWrapLayout; | |
public class LayoutFactory { | |
// Used in place of 0. If 0 is used, widget borders will appear clipped | |
// on some platforms (e.g. Windows XP Classic Theme). | |
// Form tool kit requires parent composites containing the widget to have | |
// at least 1 pixel border margins in order to paint the flat borders. | |
// The form toolkit paints flat borders on a given widget when native | |
// borders are not painted by SWT. See FormToolkit#paintBordersFor() | |
public static final int DEFAULT_CLEAR_MARGIN = 2; | |
// Required to allow space for field decorations | |
public static final int CONTROL_HORIZONTAL_INDENT = 3; | |
// CLEAR | |
public static final int CLEAR_MARGIN_TOP = DEFAULT_CLEAR_MARGIN; | |
public static final int CLEAR_MARGIN_BOTTOM = DEFAULT_CLEAR_MARGIN; | |
public static final int CLEAR_MARGIN_LEFT = DEFAULT_CLEAR_MARGIN; | |
public static final int CLEAR_MARGIN_RIGHT = DEFAULT_CLEAR_MARGIN; | |
public static final int CLEAR_HORIZONTAL_SPACING = 0; | |
public static final int CLEAR_VERTICAL_SPACING = 0; | |
public static final int CLEAR_MARGIN_HEIGHT = 0; | |
public static final int CLEAR_MARGIN_WIDTH = 0; | |
// FORM BODY | |
public static final int FORM_BODY_MARGIN_TOP = 12; | |
public static final int FORM_BODY_MARGIN_BOTTOM = 12; | |
public static final int FORM_BODY_MARGIN_LEFT = 6; | |
public static final int FORM_BODY_MARGIN_RIGHT = 6; | |
public static final int FORM_BODY_HORIZONTAL_SPACING = 20; | |
// Should be 20; but, we minus 3 because the section automatically pads the bottom margin by that amount | |
public static final int FORM_BODY_VERTICAL_SPACING = 17; | |
public static final int FORM_BODY_MARGIN_HEIGHT = 0; | |
public static final int FORM_BODY_MARGIN_WIDTH = 0; | |
// FORM PANE | |
public static final int FORM_PANE_MARGIN_TOP = 0; | |
public static final int FORM_PANE_MARGIN_BOTTOM = 0; | |
public static final int FORM_PANE_MARGIN_LEFT = 0; | |
public static final int FORM_PANE_MARGIN_RIGHT = 0; | |
public static final int FORM_PANE_HORIZONTAL_SPACING = FORM_BODY_HORIZONTAL_SPACING; | |
public static final int FORM_PANE_VERTICAL_SPACING = FORM_BODY_VERTICAL_SPACING; | |
public static final int FORM_PANE_MARGIN_HEIGHT = 0; | |
public static final int FORM_PANE_MARGIN_WIDTH = 0; | |
// MASTER DETAILS | |
public static final int MASTER_DETAILS_MARGIN_TOP = 0; | |
public static final int MASTER_DETAILS_MARGIN_BOTTOM = 0; | |
// Used only by masters part. Details part margin dynamically calculated | |
public static final int MASTER_DETAILS_MARGIN_LEFT = 0; | |
// Used only by details part. Masters part margin dynamically calculated | |
public static final int MASTER_DETAILS_MARGIN_RIGHT = 1; | |
public static final int MASTER_DETAILS_HORIZONTAL_SPACING = FORM_BODY_HORIZONTAL_SPACING; | |
public static final int MASTER_DETAILS_VERTICAL_SPACING = FORM_BODY_VERTICAL_SPACING; | |
public static final int MASTER_DETAILS_MARGIN_HEIGHT = 0; | |
public static final int MASTER_DETAILS_MARGIN_WIDTH = 0; | |
// SECTION CLIENT | |
public static final int SECTION_CLIENT_MARGIN_TOP = 5; | |
public static final int SECTION_CLIENT_MARGIN_BOTTOM = 10; | |
// Should be 6; but, we minus 4 because the section automatically pads the left margin by that amount | |
public static final int SECTION_CLIENT_MARGIN_LEFT = 2; | |
// Should be 6; but, we minus 4 because the section automatically pads the right margin by that amount | |
public static final int SECTION_CLIENT_MARGIN_RIGHT = 2; | |
// Changed from 5 to 8 in order allow the display of error or warning decorators between widgets | |
public static final int SECTION_CLIENT_HORIZONTAL_SPACING = 8; | |
public static final int SECTION_CLIENT_VERTICAL_SPACING = 5; | |
public static final int SECTION_CLIENT_MARGIN_HEIGHT = 0; | |
public static final int SECTION_CLIENT_MARGIN_WIDTH = 0; | |
public static final int SECTION_HEADER_VERTICAL_SPACING = 6; | |
// Prevent from instantiation | |
private LayoutFactory() { | |
} | |
/** | |
* For miscellaneous grouping composites. For sections (as a whole - header plus client). | |
* | |
* @param makeColumnsEqualWidth | |
* @param numColumns | |
* @return | |
*/ | |
public static GridLayout createClearGridLayout(boolean makeColumnsEqualWidth, int numColumns) { | |
GridLayout layout = new GridLayout(); | |
layout.marginHeight = CLEAR_MARGIN_HEIGHT; | |
layout.marginWidth = CLEAR_MARGIN_WIDTH; | |
layout.marginTop = CLEAR_MARGIN_TOP; | |
layout.marginBottom = CLEAR_MARGIN_BOTTOM; | |
layout.marginLeft = CLEAR_MARGIN_LEFT; | |
layout.marginRight = CLEAR_MARGIN_RIGHT; | |
layout.horizontalSpacing = CLEAR_HORIZONTAL_SPACING; | |
layout.verticalSpacing = CLEAR_VERTICAL_SPACING; | |
layout.makeColumnsEqualWidth = makeColumnsEqualWidth; | |
layout.numColumns = numColumns; | |
return layout; | |
} | |
/** | |
* For miscellaneous grouping composites. For sections (as a whole - header plus client). | |
* | |
* @param makeColumnsEqualWidth | |
* @param numColumns | |
* @return | |
*/ | |
public static TableWrapLayout createClearTableWrapLayout(boolean makeColumnsEqualWidth, int numColumns) { | |
TableWrapLayout layout = new TableWrapLayout(); | |
layout.topMargin = CLEAR_MARGIN_TOP; | |
layout.bottomMargin = CLEAR_MARGIN_BOTTOM; | |
layout.leftMargin = CLEAR_MARGIN_LEFT; | |
layout.rightMargin = CLEAR_MARGIN_RIGHT; | |
layout.horizontalSpacing = CLEAR_HORIZONTAL_SPACING; | |
layout.verticalSpacing = CLEAR_VERTICAL_SPACING; | |
layout.makeColumnsEqualWidth = makeColumnsEqualWidth; | |
layout.numColumns = numColumns; | |
return layout; | |
} | |
/** | |
* For form bodies. | |
* | |
* @param makeColumnsEqualWidth | |
* @param numColumns | |
* @return | |
*/ | |
public static GridLayout createFormBodyGridLayout(boolean makeColumnsEqualWidth, int numColumns) { | |
GridLayout layout = new GridLayout(); | |
layout.marginHeight = FORM_BODY_MARGIN_HEIGHT; | |
layout.marginWidth = FORM_BODY_MARGIN_WIDTH; | |
layout.marginTop = FORM_BODY_MARGIN_TOP; | |
layout.marginBottom = FORM_BODY_MARGIN_BOTTOM; | |
layout.marginLeft = FORM_BODY_MARGIN_LEFT; | |
layout.marginRight = FORM_BODY_MARGIN_RIGHT; | |
layout.horizontalSpacing = FORM_BODY_HORIZONTAL_SPACING; | |
layout.verticalSpacing = FORM_BODY_VERTICAL_SPACING; | |
layout.makeColumnsEqualWidth = makeColumnsEqualWidth; | |
layout.numColumns = numColumns; | |
return layout; | |
} | |
/** | |
* For form bodies. | |
* | |
* @param makeColumnsEqualWidth | |
* @param numColumns | |
* @return | |
*/ | |
public static TableWrapLayout createFormBodyTableWrapLayout(boolean makeColumnsEqualWidth, int numColumns) { | |
TableWrapLayout layout = new TableWrapLayout(); | |
layout.topMargin = FORM_BODY_MARGIN_TOP; | |
layout.bottomMargin = FORM_BODY_MARGIN_BOTTOM; | |
layout.leftMargin = FORM_BODY_MARGIN_LEFT; | |
layout.rightMargin = FORM_BODY_MARGIN_RIGHT; | |
layout.horizontalSpacing = FORM_BODY_HORIZONTAL_SPACING; | |
layout.verticalSpacing = FORM_BODY_VERTICAL_SPACING; | |
layout.makeColumnsEqualWidth = makeColumnsEqualWidth; | |
layout.numColumns = numColumns; | |
return layout; | |
} | |
/** | |
* For composites used to group sections in left and right panes. | |
* | |
* @param makeColumnsEqualWidth | |
* @param numColumns | |
* @return | |
*/ | |
public static GridLayout createFormPaneGridLayout(boolean makeColumnsEqualWidth, int numColumns) { | |
GridLayout layout = new GridLayout(); | |
layout.marginHeight = FORM_PANE_MARGIN_HEIGHT; | |
layout.marginWidth = FORM_PANE_MARGIN_WIDTH; | |
layout.marginTop = FORM_PANE_MARGIN_TOP; | |
layout.marginBottom = FORM_PANE_MARGIN_BOTTOM; | |
layout.marginLeft = FORM_PANE_MARGIN_LEFT; | |
layout.marginRight = FORM_PANE_MARGIN_RIGHT; | |
layout.horizontalSpacing = FORM_PANE_HORIZONTAL_SPACING; | |
layout.verticalSpacing = FORM_PANE_VERTICAL_SPACING; | |
layout.makeColumnsEqualWidth = makeColumnsEqualWidth; | |
layout.numColumns = numColumns; | |
return layout; | |
} | |
/** | |
* For composites used to group sections in left and right panes. | |
* | |
* @param makeColumnsEqualWidth | |
* @param numColumns | |
* @return | |
*/ | |
public static TableWrapLayout createFormPaneTableWrapLayout(boolean makeColumnsEqualWidth, int numColumns) { | |
TableWrapLayout layout = new TableWrapLayout(); | |
layout.topMargin = FORM_PANE_MARGIN_TOP; | |
layout.bottomMargin = FORM_PANE_MARGIN_BOTTOM; | |
layout.leftMargin = FORM_PANE_MARGIN_LEFT; | |
layout.rightMargin = FORM_PANE_MARGIN_RIGHT; | |
layout.horizontalSpacing = FORM_PANE_HORIZONTAL_SPACING; | |
layout.verticalSpacing = FORM_PANE_VERTICAL_SPACING; | |
layout.makeColumnsEqualWidth = makeColumnsEqualWidth; | |
layout.numColumns = numColumns; | |
return layout; | |
} | |
/** | |
* For master sections belonging to a master details block. | |
* | |
* @param makeColumnsEqualWidth | |
* @param numColumns | |
* @return | |
*/ | |
public static GridLayout createMasterGridLayout(boolean makeColumnsEqualWidth, int numColumns) { | |
GridLayout layout = new GridLayout(); | |
layout.marginHeight = MASTER_DETAILS_MARGIN_HEIGHT; | |
layout.marginWidth = MASTER_DETAILS_MARGIN_WIDTH; | |
layout.marginTop = MASTER_DETAILS_MARGIN_TOP; | |
layout.marginBottom = MASTER_DETAILS_MARGIN_BOTTOM; | |
layout.marginLeft = MASTER_DETAILS_MARGIN_LEFT; | |
// Cannot set layout on a sash form. | |
// In order to replicate the horizontal spacing between sections, | |
// divide the amount by 2 and set the master section right margin to | |
// half the amount and set the left details section margin to half | |
// the amount. The default sash width is currently set at 3. | |
// Minus 1 pixel from each half. Use the 1 left over pixel to separate | |
// the details section from the vertical scollbar. | |
int marginRight = MASTER_DETAILS_HORIZONTAL_SPACING; | |
if (marginRight > 0) { | |
marginRight = marginRight / 2; | |
if (marginRight > 0) { | |
marginRight--; | |
} | |
} | |
layout.marginRight = marginRight; | |
layout.horizontalSpacing = MASTER_DETAILS_HORIZONTAL_SPACING; | |
layout.verticalSpacing = MASTER_DETAILS_VERTICAL_SPACING; | |
layout.makeColumnsEqualWidth = makeColumnsEqualWidth; | |
layout.numColumns = numColumns; | |
return layout; | |
} | |
/** | |
* For master sections belonging to a master details block. | |
* | |
* @param makeColumnsEqualWidth | |
* @param numColumns | |
* @return | |
*/ | |
public static TableWrapLayout createMasterTableWrapLayout(boolean makeColumnsEqualWidth, int numColumns) { | |
TableWrapLayout layout = new TableWrapLayout(); | |
layout.topMargin = MASTER_DETAILS_MARGIN_TOP; | |
layout.bottomMargin = MASTER_DETAILS_MARGIN_BOTTOM; | |
layout.leftMargin = MASTER_DETAILS_MARGIN_LEFT; | |
// Cannot set layout on a sash form. | |
// In order to replicate the horizontal spacing between sections, | |
// divide the amount by 2 and set the master section right margin to | |
// half the amount and set the left details section margin to half | |
// the amount. The default sash width is currently set at 3. | |
// Minus 1 pixel from each half. Use the 1 left over pixel to separate | |
// the details section from the vertical scollbar. | |
int rightMargin = MASTER_DETAILS_HORIZONTAL_SPACING; | |
if (rightMargin > 0) { | |
rightMargin = rightMargin / 2; | |
if (rightMargin > 0) { | |
rightMargin--; | |
} | |
} | |
layout.rightMargin = rightMargin; | |
layout.horizontalSpacing = MASTER_DETAILS_HORIZONTAL_SPACING; | |
layout.verticalSpacing = MASTER_DETAILS_VERTICAL_SPACING; | |
layout.makeColumnsEqualWidth = makeColumnsEqualWidth; | |
layout.numColumns = numColumns; | |
return layout; | |
} | |
/** | |
* For details sections belonging to a master details block. | |
* | |
* @param makeColumnsEqualWidth | |
* @param numColumns | |
* @return | |
*/ | |
public static GridLayout createDetailsGridLayout(boolean makeColumnsEqualWidth, int numColumns) { | |
GridLayout layout = new GridLayout(); | |
layout.marginHeight = MASTER_DETAILS_MARGIN_HEIGHT; | |
layout.marginWidth = MASTER_DETAILS_MARGIN_WIDTH; | |
layout.marginTop = MASTER_DETAILS_MARGIN_TOP; | |
layout.marginBottom = MASTER_DETAILS_MARGIN_BOTTOM; | |
// Cannot set layout on a sash form. | |
// In order to replicate the horizontal spacing between sections, | |
// divide the amount by 2 and set the master section right margin to | |
// half the amount and set the left details section margin to half | |
// the amount. The default sash width is currently set at 3. | |
// Minus 1 pixel from each half. Use the 1 left over pixel to separate | |
// the details section from the vertical scollbar. | |
int marginLeft = MASTER_DETAILS_HORIZONTAL_SPACING; | |
if (marginLeft > 0) { | |
marginLeft = marginLeft / 2; | |
if (marginLeft > 0) { | |
marginLeft--; | |
} | |
} | |
layout.marginLeft = marginLeft; | |
layout.marginRight = MASTER_DETAILS_MARGIN_RIGHT; | |
layout.horizontalSpacing = MASTER_DETAILS_HORIZONTAL_SPACING; | |
layout.verticalSpacing = MASTER_DETAILS_VERTICAL_SPACING; | |
layout.makeColumnsEqualWidth = makeColumnsEqualWidth; | |
layout.numColumns = numColumns; | |
return layout; | |
} | |
/** | |
* For details sections belonging to a master details block. | |
* | |
* @param makeColumnsEqualWidth | |
* @param numColumns | |
* @return | |
*/ | |
public static TableWrapLayout createDetailsTableWrapLayout(boolean makeColumnsEqualWidth, int numColumns) { | |
TableWrapLayout layout = new TableWrapLayout(); | |
layout.topMargin = MASTER_DETAILS_MARGIN_TOP; | |
layout.bottomMargin = MASTER_DETAILS_MARGIN_BOTTOM; | |
// Cannot set layout on a sash form. | |
// In order to replicate the horizontal spacing between sections, | |
// divide the amount by 2 and set the master section right margin to | |
// half the amount and set the left details section margin to half | |
// the amount. The default sash width is currently set at 3. | |
// Minus 1 pixel from each half. Use the 1 left over pixel to separate | |
// the details section from the vertical scollbar. | |
int leftMargin = MASTER_DETAILS_HORIZONTAL_SPACING; | |
if (leftMargin > 0) { | |
leftMargin = leftMargin / 2; | |
if (leftMargin > 0) { | |
leftMargin--; | |
} | |
} | |
layout.leftMargin = leftMargin; | |
layout.rightMargin = MASTER_DETAILS_MARGIN_RIGHT; | |
layout.horizontalSpacing = MASTER_DETAILS_HORIZONTAL_SPACING; | |
layout.verticalSpacing = MASTER_DETAILS_VERTICAL_SPACING; | |
layout.makeColumnsEqualWidth = makeColumnsEqualWidth; | |
layout.numColumns = numColumns; | |
return layout; | |
} | |
/** | |
* For composites set as section clients. For composites containg form text. | |
* | |
* @param makeColumnsEqualWidth | |
* @param numColumns | |
* @return | |
*/ | |
public static GridLayout createSectionClientGridLayout(boolean makeColumnsEqualWidth, int numColumns) { | |
GridLayout layout = new GridLayout(); | |
layout.marginHeight = SECTION_CLIENT_MARGIN_HEIGHT; | |
layout.marginWidth = SECTION_CLIENT_MARGIN_WIDTH; | |
layout.marginTop = SECTION_CLIENT_MARGIN_TOP; | |
layout.marginBottom = SECTION_CLIENT_MARGIN_BOTTOM; | |
layout.marginLeft = SECTION_CLIENT_MARGIN_LEFT; | |
layout.marginRight = SECTION_CLIENT_MARGIN_RIGHT; | |
layout.horizontalSpacing = SECTION_CLIENT_HORIZONTAL_SPACING; | |
layout.verticalSpacing = SECTION_CLIENT_VERTICAL_SPACING; | |
layout.makeColumnsEqualWidth = makeColumnsEqualWidth; | |
layout.numColumns = numColumns; | |
return layout; | |
} | |
/** | |
* For composites set as section clients. For composites containg form text. | |
* | |
* @param makeColumnsEqualWidth | |
* @param numColumns | |
* @return | |
*/ | |
public static TableWrapLayout createSectionClientTableWrapLayout(boolean makeColumnsEqualWidth, int numColumns) { | |
TableWrapLayout layout = new TableWrapLayout(); | |
layout.topMargin = SECTION_CLIENT_MARGIN_TOP; | |
layout.bottomMargin = SECTION_CLIENT_MARGIN_BOTTOM; | |
layout.leftMargin = SECTION_CLIENT_MARGIN_LEFT; | |
layout.rightMargin = SECTION_CLIENT_MARGIN_RIGHT; | |
layout.horizontalSpacing = SECTION_CLIENT_HORIZONTAL_SPACING; | |
layout.verticalSpacing = SECTION_CLIENT_VERTICAL_SPACING; | |
layout.makeColumnsEqualWidth = makeColumnsEqualWidth; | |
layout.numColumns = numColumns; | |
return layout; | |
} | |
/** | |
* Debug method. MAGENTA = 11 CYAN = 13 GREEN = 5 | |
* | |
* @param composite | |
* @param color | |
*/ | |
public static void highlightLayoutArea(Composite composite, int color) { | |
composite.setBackground(Display.getCurrent().getSystemColor(color)); | |
} | |
} |