blob: 42b9083ad5595ae7b4ea1d7524291e27a3917c7f [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
*
* 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.android.ide.common.layout;
import static com.android.SdkConstants.VALUE_N_DP;
import static com.android.SdkConstants.VALUE_WRAP_CONTENT;
import com.android.ide.common.api.INode;
import com.android.ide.common.api.Rect;
import com.android.ide.common.api.Segment;
import com.android.ide.common.api.SegmentType;
/** State held during resizing operations */
class ResizeState {
/**
* The associated rule
*/
private final BaseLayoutRule mRule;
/**
* The node being resized
*/
public final INode node;
/**
* The layout containing the resized node
*/
public final INode layout;
/** The proposed resized bounds of the node */
public Rect bounds;
/** The preferred wrap_content bounds of the node */
public Rect wrapBounds;
/** The suggested horizontal fill_parent guideline position */
public Segment horizontalFillSegment;
/** The suggested vertical fill_parent guideline position */
public Segment verticalFillSegment;
/** The type of horizontal edge being resized, or null */
public SegmentType horizontalEdgeType;
/** The type of vertical edge being resized, or null */
public SegmentType verticalEdgeType;
/** Whether the user has snapped to the wrap_content width */
public boolean wrapWidth;
/** Whether the user has snapped to the wrap_content height */
public boolean wrapHeight;
/** Whether the user has snapped to the match_parent width */
public boolean fillWidth;
/** Whether the user has snapped to the match_parent height */
public boolean fillHeight;
/** Custom field for use by subclasses */
public Object clientData;
/** Keyboard mask */
public int modifierMask;
/**
* The actual view object for the layout containing the resizing operation,
* or null if not known
*/
public Object layoutView;
/**
* Constructs a new {@link ResizeState}
*
* @param rule the associated rule
* @param layout the parent layout containing the resized node
* @param layoutView the actual View instance for the layout, or null if not known
* @param node the node being resized
*/
ResizeState(BaseLayoutRule rule, INode layout, Object layoutView, INode node) {
mRule = rule;
this.layout = layout;
this.node = node;
this.layoutView = layoutView;
}
/**
* Returns the width attribute to be set to match the new bounds
*
* @return the width string, never null
*/
public String getWidthAttribute() {
if (wrapWidth) {
return VALUE_WRAP_CONTENT;
} else if (fillWidth) {
return mRule.getFillParentValueName();
} else {
return String.format(VALUE_N_DP, mRule.mRulesEngine.pxToDp(bounds.w));
}
}
/**
* Returns the height attribute to be set to match the new bounds
*
* @return the height string, never null
*/
public String getHeightAttribute() {
if (wrapHeight) {
return VALUE_WRAP_CONTENT;
} else if (fillHeight) {
return mRule.getFillParentValueName();
} else {
return String.format(VALUE_N_DP, mRule.mRulesEngine.pxToDp(bounds.h));
}
}
}