/*******************************************************************************
* Copyright 2011 Google Inc. All Rights Reserved.
*
* 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
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*******************************************************************************/
package com.google.gdt.eclipse.designer.gwtext.model.widgets;
import com.google.gdt.eclipse.designer.gwtext.model.layout.ColumnLayoutDataInfo;
import com.google.gdt.eclipse.designer.model.widgets.WidgetInfo;
import org.eclipse.wb.core.model.JavaInfo;
import org.eclipse.wb.core.model.association.InvocationChildAssociation;
import org.eclipse.wb.core.model.association.InvocationSecondaryAssociation;
import org.eclipse.wb.internal.core.model.JavaInfoEvaluationHelper;
import org.eclipse.wb.internal.core.model.JavaInfoUtils;
import org.eclipse.wb.internal.core.model.creation.ConstructorCreationSupport;
import org.eclipse.wb.internal.core.model.creation.CreationSupport;
import org.eclipse.wb.internal.core.model.description.ComponentDescription;
import org.eclipse.wb.internal.core.model.property.Property;
import org.eclipse.wb.internal.core.model.variable.EmptyVariableSupport;
import org.eclipse.wb.internal.core.model.variable.VariableSupport;
import org.eclipse.wb.internal.core.utils.ast.AstEditor;
import org.eclipse.wb.internal.core.utils.ast.DomGenerics;
import org.eclipse.wb.internal.core.utils.execution.ExecutionUtils;
import org.eclipse.wb.internal.core.utils.execution.RunnableEx;
import org.eclipse.jdt.core.dom.Expression;
import org.eclipse.jdt.core.dom.MethodInvocation;
import org.apache.commons.lang.StringUtils;
import java.util.List;
/**
* Model for <code>MultiFieldPanel</code>.
*
* @author scheglov_ke
* @coverage GWTExt.model
*/
public final class MultiFieldPanelInfo extends ContainerInfo {
////////////////////////////////////////////////////////////////////////////
//
// Constructor
//
////////////////////////////////////////////////////////////////////////////
public MultiFieldPanelInfo(AstEditor editor,
ComponentDescription description,
CreationSupport creationSupport) throws Exception {
super(editor, description, creationSupport);
}
////////////////////////////////////////////////////////////////////////////
//
// Width
//
////////////////////////////////////////////////////////////////////////////
public Object getWidth(WidgetInfo widget) throws Exception {
// check for ColumnLayoutData
{
List<ColumnLayoutDataInfo> data = widget.getChildren(ColumnLayoutDataInfo.class);
if (!data.isEmpty()) {
double weight = (Double) data.get(0).getPropertyByTitle("width").getValue();
return (int) (weight * 100) + "%";
}
}
// integer width expected
if (widget.getAssociation() instanceof InvocationChildAssociation) {
InvocationChildAssociation association = (InvocationChildAssociation) widget.getAssociation();
if (association.getDescription().getSignature().endsWith(",int)")) {
Expression expression = DomGenerics.arguments(association.getInvocation()).get(1);
return ((Integer) JavaInfoEvaluationHelper.getValue(expression)).toString();
}
}
// impossible
return Property.UNKNOWN_VALUE;
}
public void setWidth(final WidgetInfo widget, final Object value) throws Exception {
ExecutionUtils.run(this, new RunnableEx() {
public void run() throws Exception {
setWidth0(widget, value);
}
});
}
private void setWidth0(WidgetInfo widget, Object _value) throws Exception {
String value;
if (_value instanceof String) {
value = (String) _value;
} else {
value = "100";
}
//
AstEditor editor = getEditor();
if (widget.getAssociation() instanceof InvocationChildAssociation) {
InvocationChildAssociation association = (InvocationChildAssociation) widget.getAssociation();
MethodInvocation invocation = association.getInvocation();
// set percent
if (value.endsWith("%")) {
ColumnLayoutDataInfo columnData;
if (association.getDescription().getSignature().endsWith(",int)")) {
columnData = setWidth_addColumnLayoutData(widget, invocation);
} else {
columnData = widget.getChildren(ColumnLayoutDataInfo.class).get(0);
}
// set "columnWidth" property
{
value = StringUtils.substring(value, 0, -1);
double weight = Integer.parseInt(value) / 100.0;
columnData.setWidth(weight);
}
// done
return;
}
// set absolute value
{
Expression expression = DomGenerics.arguments(invocation).get(1);
editor.replaceExpression(expression, value);
editor.replaceInvocationBinding(invocation);
for (JavaInfo columnData : widget.getChildren(ColumnLayoutDataInfo.class)) {
columnData.delete();
}
}
}
}
private ColumnLayoutDataInfo setWidth_addColumnLayoutData(WidgetInfo widget,
MethodInvocation invocation) throws Exception {
AstEditor editor = getEditor();
ColumnLayoutDataInfo columnData =
(ColumnLayoutDataInfo) JavaInfoUtils.createJavaInfo(
editor,
"com.gwtext.client.widgets.layout.ColumnLayoutData",
new ConstructorCreationSupport());
// set CreationSupport
Expression expression;
{
expression = DomGenerics.arguments(invocation).get(1);
String contentSource = columnData.getCreationSupport().add_getSource(null);
expression = editor.replaceExpression(expression, contentSource);
columnData.getCreationSupport().add_setSourceExpression(expression);
columnData.addRelatedNode(expression);
}
// set Association
columnData.setAssociation(new InvocationSecondaryAssociation(invocation));
editor.replaceInvocationBinding(invocation);
// set VariableSupport
VariableSupport variableSupport = new EmptyVariableSupport(columnData, expression);
columnData.setVariableSupport(variableSupport);
// add content ColumnLayoutData as child
widget.addChild(columnData);
return columnData;
}
}