/*******************************************************************************
* Copyright (c) 2008 Ralf Ebert
* 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:
* Ralf Ebert - initial API and implementation
*******************************************************************************/
package com.swtxml.swt.types;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Layout;
import com.swtxml.swt.SwtInfo;
import com.swtxml.util.context.Context;
import com.swtxml.util.parser.KeyValueParser;
import com.swtxml.util.parser.ParseException;
import com.swtxml.util.properties.ClassProperties;
import com.swtxml.util.properties.PropertiesContentAssist;
import com.swtxml.util.proposals.Match;
import com.swtxml.util.reflector.ReflectorException;
import com.swtxml.util.types.IContentAssistable;
import com.swtxml.util.types.IType;
public class LayoutDataType implements IType<Object>, IContentAssistable {
public Object convert(String value) {
Layout layout = Context.adaptTo(Layout.class);
if (layout == null) {
throw new ParseException("LayoutData can only be used in a Layout context");
}
return createLayoutData(layout, value);
}
public Object createLayoutData(Layout parentLayout, String value) {
Map<String, String> layoutConstraints = KeyValueParser.parse(value);
Class<?> layoutDataClass = getLayoutDataClass(parentLayout);
if (layoutDataClass == null) {
throw new ParseException("Layout " + parentLayout.getClass().getSimpleName()
+ " doesn't allow layoutData!");
}
Object layoutData;
try {
layoutData = layoutDataClass.newInstance();
} catch (Exception e) {
throw new ReflectorException(e);
}
SwtInfo.LAYOUT_PROPERTIES.getProperties(layoutData.getClass()).getInjector(layoutData)
.setPropertyValues(layoutConstraints);
return layoutData;
}
private Class<?> getLayoutDataClass(Layout layout) {
if (layout == null) {
return null;
}
if (layout instanceof RowLayout) {
return RowData.class;
}
if (layout instanceof GridLayout) {
return GridData.class;
}
if (layout instanceof FormLayout) {
return FormData.class;
}
return null;
}
public List<Match> getProposals(Match match) {
final Layout layout = Context.adaptTo(Layout.class);
if (layout == null) {
return Collections.emptyList();
}
// TODO: overriding the class is not necessary here because the
// decision is not dependent on the values
PropertiesContentAssist assist = new PropertiesContentAssist() {
@Override
protected ClassProperties<?> getClassProperties(Map<String, String> values) {
Class<?> layoutData = getLayoutDataClass(layout);
if (layoutData == null) {
return null;
}
return SwtInfo.LAYOUT_PROPERTIES.getProperties(layoutData);
}
};
return assist.getProposals(match);
}
}