ResizePolicy.java revision 5d7dc30638953195ed55d32bc9dc37102a613ff8
1/* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Eclipse Public License, Version 1.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.eclipse.org/org/documents/epl-v10.php 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16package com.android.ide.common.api; 17 18import com.android.annotations.NonNull; 19import com.google.common.annotations.Beta; 20 21/** 22 * A {@link ResizePolicy} records state for whether a widget is resizable, and if so, in 23 * which directions 24 * <p> 25 * <b>NOTE: This is not a public or final API; if you rely on this be prepared 26 * to adjust your code for the next tools release.</b> 27 */ 28@Beta 29public class ResizePolicy { 30 private static final int NONE = 0; 31 private static final int LEFT_EDGE = 1; 32 private static final int RIGHT_EDGE = 2; 33 private static final int TOP_EDGE = 4; 34 private static final int BOTTOM_EDGE = 8; 35 private static final int PRESERVE_RATIO = 16; 36 37 // Aliases 38 private static final int HORIZONTAL = LEFT_EDGE | RIGHT_EDGE; 39 private static final int VERTICAL = TOP_EDGE | BOTTOM_EDGE; 40 private static final int ANY = HORIZONTAL | VERTICAL; 41 42 // Shared objects for common policies 43 44 private static final ResizePolicy sAny = new ResizePolicy(ANY); 45 private static final ResizePolicy sNone = new ResizePolicy(NONE); 46 private static final ResizePolicy sHorizontal = new ResizePolicy(HORIZONTAL); 47 private static final ResizePolicy sVertical = new ResizePolicy(VERTICAL); 48 private static final ResizePolicy sScaled = new ResizePolicy(ANY | PRESERVE_RATIO); 49 50 private final int mFlags; 51 52 53 // Use factory methods to construct 54 private ResizePolicy(int flags) { 55 mFlags = flags; 56 } 57 58 /** 59 * Returns true if this policy allows resizing in at least one direction 60 * 61 * @return true if this policy allows resizing in at least one direction 62 */ 63 public boolean isResizable() { 64 return (mFlags & ANY) != 0; 65 } 66 67 /** 68 * Returns true if this policy allows resizing the top edge 69 * 70 * @return true if this policy allows resizing the top edge 71 */ 72 public boolean topAllowed() { 73 return (mFlags & TOP_EDGE) != 0; 74 } 75 76 /** 77 * Returns true if this policy allows resizing the right edge 78 * 79 * @return true if this policy allows resizing the right edge 80 */ 81 public boolean rightAllowed() { 82 return (mFlags & RIGHT_EDGE) != 0; 83 } 84 85 /** 86 * Returns true if this policy allows resizing the bottom edge 87 * 88 * @return true if this policy allows resizing the bottom edge 89 */ 90 public boolean bottomAllowed() { 91 return (mFlags & BOTTOM_EDGE) != 0; 92 } 93 94 /** 95 * Returns true if this policy allows resizing the left edge 96 * 97 * @return true if this policy allows resizing the left edge 98 */ 99 public boolean leftAllowed() { 100 return (mFlags & LEFT_EDGE) != 0; 101 } 102 103 /** 104 * Returns true if this policy requires resizing in an aspect-ratio preserving manner 105 * 106 * @return true if this policy requires resizing in an aspect-ratio preserving manner 107 */ 108 public boolean isAspectPreserving() { 109 return (mFlags & PRESERVE_RATIO) != 0; 110 } 111 112 /** 113 * Returns a resize policy allowing resizing in any direction 114 * 115 * @return a resize policy allowing resizing in any direction 116 */ 117 @NonNull 118 public static ResizePolicy full() { 119 return sAny; 120 } 121 122 /** 123 * Returns a resize policy not allowing any resizing 124 * 125 * @return a policy which does not allow any resizing 126 */ 127 @NonNull 128 public static ResizePolicy none() { 129 return sNone; 130 } 131 132 /** 133 * Returns a resize policy allowing horizontal resizing only 134 * 135 * @return a policy which allows horizontal resizing only 136 */ 137 @NonNull 138 public static ResizePolicy horizontal() { 139 return sHorizontal; 140 } 141 142 /** 143 * Returns a resize policy allowing vertical resizing only 144 * 145 * @return a policy which allows vertical resizing only 146 */ 147 @NonNull 148 public static ResizePolicy vertical() { 149 return sVertical; 150 } 151 152 /** 153 * Returns a resize policy allowing scaled / aspect-ratio preserving resizing only 154 * 155 * @return a resize policy allowing scaled / aspect-ratio preserving resizing only 156 */ 157 @NonNull 158 public static ResizePolicy scaled() { 159 return sScaled; 160 } 161 162 /** 163 * Returns a resize policy with the specified resizability along the edges and the 164 * given aspect ratio behavior 165 * @param top whether the top edge is resizable 166 * @param right whether the right edge is resizable 167 * @param bottom whether the bottom edge is resizable 168 * @param left whether the left edge is resizable 169 * @param preserve whether the policy requires the aspect ratio to be preserved 170 * @return a resize policy recording the constraints required by the parameters 171 */ 172 @NonNull 173 public static ResizePolicy create(boolean top, boolean right, boolean bottom, boolean left, 174 boolean preserve) { 175 int mask = NONE; 176 if (top) mask |= TOP_EDGE; 177 if (right) mask |= RIGHT_EDGE; 178 if (bottom) mask |= BOTTOM_EDGE; 179 if (left) mask |= LEFT_EDGE; 180 if (preserve) mask |= PRESERVE_RATIO; 181 182 return new ResizePolicy(mask); 183 } 184} 185