blob: bbf5d5fb5237adef2f60438cf5d9e8aeed4f1386 [file] [log] [blame]
/*
* Copyright 2000-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.intellij.android.designer.model.layout.relative;
import com.intellij.android.designer.designSurface.TreeDropToOperation;
import com.intellij.android.designer.designSurface.graphics.DrawingStyle;
import com.intellij.android.designer.designSurface.graphics.ResizeSelectionDecorator;
import com.intellij.android.designer.model.PropertyParser;
import com.intellij.android.designer.model.RadViewComponent;
import com.intellij.android.designer.model.RadViewLayoutWithData;
import com.intellij.android.designer.model.layout.actions.AllGravityAction;
import com.intellij.android.designer.propertyTable.AttributeProperty;
import com.intellij.android.designer.propertyTable.JavadocParser;
import com.intellij.android.designer.propertyTable.RelativeIdAttributeProperty;
import com.intellij.designer.componentTree.TreeEditOperation;
import com.intellij.designer.designSurface.*;
import com.intellij.designer.model.Property;
import com.intellij.designer.model.RadComponent;
import com.intellij.designer.propertyTable.PropertyTable;
import com.intellij.openapi.actionSystem.DefaultActionGroup;
import org.jetbrains.annotations.NotNull;
import java.util.List;
/**
* @author Alexander Lobas
*/
public class RadRelativeLayout extends RadViewLayoutWithData implements ILayoutDecorator {
private static final String[] LAYOUT_PARAMS = {"RelativeLayout_Layout", "ViewGroup_MarginLayout"};
private RelativeLayoutDecorator myRelativeDecorator;
private ResizeSelectionDecorator mySelectionDecorator;
@NotNull
@Override
public String[] getLayoutParams() {
return LAYOUT_PARAMS;
}
@Override
public void configureProperties(List<Property> properties) {
CompoundProperty alignComponent =
new CompoundProperty("layout:alignComponent",
JavadocParser
.build("layout:alignComponent", "Positions the edges of this view to the edges of the another view."));
PropertyParser.moveProperties(properties, alignComponent,
"layout:alignTop", "top:top",
"layout:below", "top:bottom",
"layout:alignLeft", "left:left",
"layout:toRightOf", "left:right",
"layout:alignBottom", "bottom:bottom",
"layout:above", "bottom:top",
"layout:alignRight", "right:right",
"layout:toLeftOf", "right:left",
"layout:alignBaseline", "baseline:baseline");
List<Property<RadViewComponent>> alignChildren = alignComponent.getChildren(null);
int alignSize = alignChildren.size();
for (int i = 0; i < alignSize; i++) {
alignChildren.set(i, new RelativeIdAttributeProperty((AttributeProperty)alignChildren.get(i)));
}
properties.add(alignComponent);
CompoundProperty alignParent =
new CompoundProperty("layout:alignParent",
JavadocParser.build("layout:alignParent", "Positions the edges of this view to the edges of the parent."));
PropertyParser.moveProperties(properties, alignParent,
"layout:alignParentTop", "top",
"layout:alignParentLeft", "left",
"layout:alignParentBottom", "bottom",
"layout:alignParentRight", "right",
"layout:alignWithParentIfMissing", "missing");
properties.add(alignParent);
PropertyTable.extractProperty(properties, "layout:centerInParent");
PropertyTable.extractProperty(properties, "layout:centerHorizontal");
PropertyTable.extractProperty(properties, "layout:centerVertical");
properties.add(new CenterProperty());
}
@Override
public EditOperation processChildOperation(OperationContext context) {
if (context.isCreate() || context.isPaste() || context.isAdd() || context.isMove()) {
if (context.isTree()) {
if (TreeEditOperation.isTarget(myContainer, context)) {
return new TreeDropToOperation(myContainer, context);
}
return null;
}
return new RelativeLayoutDropOperation(myContainer, context);
}
if (context.is(RelativeLayoutResizeOperation.TYPE)) {
return new RelativeLayoutResizeOperation(context);
}
return null;
}
private StaticDecorator getRelativeDecorator() {
if (myRelativeDecorator == null) {
myRelativeDecorator = new RelativeLayoutDecorator(myContainer);
}
return myRelativeDecorator;
}
@Override
public void addStaticDecorators(List<StaticDecorator> decorators, List<RadComponent> selection) {
for (RadComponent component : selection) {
if (component.getParent() == myContainer) {
if (!(myContainer.getParent().getLayout() instanceof ILayoutDecorator)) {
decorators.add(getRelativeDecorator());
}
return;
}
}
super.addStaticDecorators(decorators, selection);
}
@Override
public ComponentDecorator getChildSelectionDecorator(RadComponent component, List<RadComponent> selection) {
if (mySelectionDecorator == null) {
mySelectionDecorator = new ResizeSelectionDecorator(DrawingStyle.SELECTION);
RelativeLayoutResizeOperation.addResizePoints(mySelectionDecorator);
}
return mySelectionDecorator;
}
//////////////////////////////////////////////////////////////////////////////////////////
//
// Actions
//
//////////////////////////////////////////////////////////////////////////////////////////
@Override
public void addContainerSelectionActions(DesignerEditorPanel designer,
DefaultActionGroup actionGroup,
List<? extends RadViewComponent> selection) {
super.addContainerSelectionActions(designer, actionGroup, selection);
actionGroup.add(new AllGravityAction(designer, selection));
}
}