blob: d55b46bad99256afa4504ee02fdba8e584c4fdf3 [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;
import com.android.SdkConstants;
import com.intellij.android.designer.model.RadViewComponent;
import com.intellij.designer.model.RadComponent;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.text.StringUtil;
import icons.AndroidDesignerIcons;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
/**
* @author Alexander Lobas
*/
public enum Gravity {
left, right, center, top, bottom;
public static Icon ICON = AndroidDesignerIcons.Gravity;
public static final int NONE = 0;
public static final int TOP = 1 << 0;
public static final int BOTTOM = 1 << 1;
public static final int LEFT = 1 << 2;
public static final int RIGHT = 1 << 3;
public static final int CENTER_VERTICAL = 1 << 4;
public static final int FILL_VERTICAL = 1 << 5;
public static final int CENTER_HORIZONTAL = 1 << 6;
public static final int FILL_HORIZONTAL = 1 << 7;
public static final int CENTER = CENTER_HORIZONTAL | CENTER_VERTICAL;
public static final int FILL = FILL_HORIZONTAL | FILL_VERTICAL;
public static final int CLIP_VERTICAL = 1 << 8;
public static final int CLIP_HORIZONTAL = 1 << 9;
public static final int START = (1 << 10) | LEFT;
public static final int END = (1 << 11) | RIGHT;
@Nullable
public static String getValue(@Nullable Gravity horizontal, @Nullable Gravity vertical) {
StringBuilder gravity = new StringBuilder();
if (horizontal == center && vertical == center) {
gravity.append("center");
}
else {
if (horizontal == left) {
gravity.append("left");
}
else if (horizontal == center) {
gravity.append("center_horizontal");
}
else if (horizontal == right) {
gravity.append("right");
}
if (vertical == top) {
if (gravity.length() > 0) {
gravity.append("|");
}
gravity.append("top");
}
else if (vertical == center) {
if (gravity.length() > 0) {
gravity.append("|");
}
gravity.append("center_vertical");
}
else if (vertical == bottom) {
if (gravity.length() > 0) {
gravity.append("|");
}
gravity.append("bottom");
}
}
return gravity.length() == 0 ? null : gravity.toString();
}
public static int getFlags(RadComponent component) {
String value = ((RadViewComponent)component).getTag().getAttributeValue("layout_gravity", SdkConstants.NS_RESOURCES);
int flags = NONE;
if (!StringUtil.isEmpty(value)) {
for (String option : StringUtil.split(value, "|")) {
option = option.trim();
if ("top".equals(option)) {
flags |= TOP;
}
else if ("bottom".equals(option)) {
flags |= BOTTOM;
}
else if ("left".equals(option)) {
flags |= LEFT;
}
else if ("right".equals(option)) {
flags |= RIGHT;
}
else if ("center_vertical".equals(option)) {
flags |= CENTER_VERTICAL;
}
else if ("fill_vertical".equals(option)) {
flags |= FILL_VERTICAL;
}
else if ("center_horizontal".equals(option)) {
flags |= CENTER_HORIZONTAL;
}
else if ("fill_horizontal".equals(option)) {
flags |= FILL_HORIZONTAL;
}
else if ("center".equals(option)) {
flags |= CENTER;
}
else if ("fill".equals(option)) {
flags |= FILL;
}
else if ("clip_vertical".equals(option)) {
flags |= CLIP_VERTICAL;
}
else if ("clip_horizontal".equals(option)) {
flags |= CLIP_HORIZONTAL;
}
else if ("start".equals(option)) {
flags |= START;
}
else if ("end".equals(option)) {
flags |= END;
}
}
}
return flags;
}
public static List<Gravity> flagToValues(int flags) {
List<Gravity> values = new ArrayList<Gravity>();
if ((flags & LEFT) != 0) {
values.add(left);
}
if ((flags & RIGHT) != 0) {
values.add(right);
}
if ((flags & TOP) != 0) {
values.add(top);
}
if ((flags & BOTTOM) != 0) {
values.add(bottom);
}
if ((flags & CENTER) != 0) {
values.add(center);
}
return values;
}
public static Pair<Gravity, Gravity> getSides(RadComponent component) {
int flags = getFlags(component);
Gravity horizontal = left;
if ((flags & LEFT) != 0) {
horizontal = left;
}
else if ((flags & RIGHT) != 0) {
horizontal = right;
}
else if ((flags & CENTER_HORIZONTAL) != 0) {
horizontal = center;
}
Gravity vertical = top;
if ((flags & TOP) != 0) {
vertical = top;
}
else if ((flags & BOTTOM) != 0) {
vertical = bottom;
}
else if ((flags & CENTER_VERTICAL) != 0) {
vertical = center;
}
return Pair.create(horizontal, vertical);
}
}