/*
 * Copyright (c) 2008, 2009 Borland Software Corp.
 * 
 * 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:
 *    Artem Tikhomirov (Borland) - initial API and implementation
 */
«IMPORT 'http://www.eclipse.org/gmf/2008/Widget'»

«EXTENSION Widgets»

«DEFINE Main(compositeVar : String) FOR widget::Layout»«ERROR 'abstract Main FOR Layout'»«ENDDEFINE»

«DEFINE Main(compositeVar : String) FOR widget::FormLayout-»
«compositeVar».setLayout(new org.eclipse.swt.layout.FormLayout());
org.eclipse.swt.layout.FormData «compositeVar»FD;
«FOREACH data AS fd-»
«compositeVar»FD = new org.eclipse.swt.layout.FormData();
«IF fd.left <> null»«compositeVar»FD.left = «EXPAND x FOR fd.left»;
«ENDIF-»
«IF fd.right <> null»«compositeVar»FD.right = «EXPAND x FOR fd.right»;
«ENDIF-»
«IF fd.top <> null»«compositeVar»FD.top = «EXPAND x FOR fd.top»;
«ENDIF-»
«IF fd.bottom <> null»«compositeVar»FD.bottom = «EXPAND x FOR fd.bottom»;
«ENDIF-»
«fieldName(fd.widget)».setLayoutData(«compositeVar»FD);
«ENDFOREACH-»
«ENDDEFINE»

«DEFINE x FOR widget::Attachment-»
«IF control = null»new org.eclipse.swt.layout.FormAttachment(0, «offset»)«ELSE»new org.eclipse.swt.layout.FormAttachment(«fieldName(control)», «offset», org.eclipse.swt.SWT.«align»)«ENDIF»«ENDDEFINE»

«DEFINE Main(compositeVar : String) FOR widget::GridLayout-»
«compositeVar».setLayout(new org.eclipse.swt.layout.GridLayout(«columns», «equalColumns»));
«FOREACH data AS fd-»
org.eclipse.jface.layout.GridDataFactory.swtDefaults()«EXPAND align FOR fd»«EXPAND span FOR fd»«EXPAND grab FOR fd».applyTo(«fieldName(fd.widget)»);
«ENDFOREACH-»
«ENDDEFINE»

«DEFINE Main(compositeVar : String) FOR widget::FillLayout-»
«compositeVar».setLayout(new org.eclipse.swt.layout.FillLayout(«IF vertical»org.eclipse.swt.SWT.VERTICAL«ENDIF»));
«ENDDEFINE»



/////////////////////
// GridData internals
//

«DEFINE align FOR widget::GridData».align(SWT.«EXPAND alignLiteral FOR hAlign», SWT.«EXPAND alignLiteral FOR vAlign»)«ENDDEFINE»
«DEFINE span FOR widget::GridData»«IF hSpan > 1 or vSpan > 1».span(«hSpan», «vSpan»)«ENDIF»«ENDDEFINE»
«DEFINE grab FOR widget::GridData»«IF hGrab or vGrab».grab(«hGrab», «vGrab»)«ENDIF»«ENDDEFINE»

«DEFINE alignLiteral FOR widget::Alignment»«IF self = widget::Alignment::LEFT»BEGINNING«ELSEIF self = widget::Alignment::RIGHT»END«ELSE»«self»«ENDIF»«ENDDEFINE»