/*
 * Copyright (C) 2010 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.ANDROID_URI;
import static com.android.SdkConstants.ATTR_LAYOUT_HEIGHT;
import static com.android.SdkConstants.ATTR_LAYOUT_WIDTH;
import static com.android.SdkConstants.ATTR_ORIENTATION;
import static com.android.SdkConstants.FQCN_LINEAR_LAYOUT;
import static com.android.SdkConstants.VALUE_HORIZONTAL;

import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
import com.android.ide.common.api.DrawingStyle;
import com.android.ide.common.api.DropFeedback;
import com.android.ide.common.api.IDragElement;
import com.android.ide.common.api.IGraphics;
import com.android.ide.common.api.INode;
import com.android.ide.common.api.IViewRule;
import com.android.ide.common.api.InsertType;
import com.android.ide.common.api.Point;
import com.android.ide.common.api.Rect;

/**
 * An {@link IViewRule} for android.widget.HorizontalScrollView.
 */
public class HorizontalScrollViewRule extends FrameLayoutRule {

    @Override
    public void onChildInserted(@NonNull INode child, @NonNull INode parent,
            @NonNull InsertType insertType) {
        super.onChildInserted(child, parent, insertType);

        // The child of the ScrollView should fill in both directions
        String fillParent = getFillParentValueName();
        child.setAttribute(ANDROID_URI, ATTR_LAYOUT_WIDTH, fillParent);
        child.setAttribute(ANDROID_URI, ATTR_LAYOUT_HEIGHT, fillParent);
    }

    @Override
    public void onCreate(@NonNull INode node, @NonNull INode parent,
            @NonNull InsertType insertType) {
        super.onCreate(node, parent, insertType);

        if (insertType.isCreate()) {
            // Insert a horizontal linear layout which is commonly used with horizontal scrollbars
            // as described by the documentation for HorizontalScrollbars.
            INode linearLayout = node.appendChild(FQCN_LINEAR_LAYOUT);
            linearLayout.setAttribute(ANDROID_URI, ATTR_ORIENTATION,
                    VALUE_HORIZONTAL);
        }
    }

    @Override
    public DropFeedback onDropMove(@NonNull INode targetNode, @NonNull IDragElement[] elements,
            @Nullable DropFeedback feedback, @NonNull Point p) {
        DropFeedback f = super.onDropMove(targetNode, elements, feedback, p);

        // HorizontalScrollViews only allow a single child
        if (targetNode.getChildren().length > 0) {
            f.invalidTarget = true;
        }
        return f;
    }

    @Override
    protected void drawFeedback(
            IGraphics gc,
            INode targetNode,
            IDragElement[] elements,
            DropFeedback feedback) {
        if (targetNode.getChildren().length > 0) {
            Rect b = targetNode.getBounds();
            if (b.isValid()) {
                gc.useStyle(DrawingStyle.DROP_RECIPIENT);
                gc.drawRect(b);
            }
        } else {
            super.drawFeedback(gc, targetNode, elements, feedback);
        }
    }
}
