/*
 * Copyright (C) 2012 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.eclipse.adt.internal.editors.layout.gle2;

import static com.android.SdkConstants.ATTR_ID;

import com.android.ide.common.layout.BaseLayoutRule;
import com.android.ide.eclipse.adt.internal.editors.layout.LayoutEditorDelegate;
import com.android.ide.eclipse.adt.internal.editors.layout.uimodel.UiViewElementNode;

import org.eclipse.core.resources.IMarker;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;

import java.util.List;

/** Actual tooltip showing multiple lines for various widgets that have lint errors */
class LintTooltip extends Shell {
    private final LayoutCanvas mCanvas;
    private final List<UiViewElementNode> mNodes;

    LintTooltip(LayoutCanvas canvas, List<UiViewElementNode> nodes) {
        super(canvas.getDisplay(), SWT.ON_TOP | SWT.NO_FOCUS | SWT.TOOL);
        mCanvas = canvas;
        mNodes = nodes;

        createContents();
    }

    protected void createContents() {
        Display display = getDisplay();
        Color fg = display.getSystemColor(SWT.COLOR_INFO_FOREGROUND);
        Color bg = display.getSystemColor(SWT.COLOR_INFO_BACKGROUND);
        setBackground(bg);
        GridLayout gridLayout = new GridLayout(2, false);
        setLayout(gridLayout);

        LayoutEditorDelegate delegate = mCanvas.getEditorDelegate();

        boolean first = true;
        for (UiViewElementNode node : mNodes) {
            IMarker marker = delegate.getIssueForNode(node);
            if (marker != null) {
                String message = marker.getAttribute(IMarker.MESSAGE, null);
                if (message != null) {
                    Label icon = new Label(this, SWT.NONE);
                    icon.setForeground(fg);
                    icon.setBackground(bg);
                    icon.setImage(node.getIcon());

                    Label label = new Label(this, SWT.WRAP);
                    if (first) {
                        label.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1));
                        first = false;
                    }

                    String id = BaseLayoutRule.stripIdPrefix(node.getAttributeValue(ATTR_ID));
                    if (id.isEmpty()) {
                        if (node.getXmlNode() != null) {
                            id = node.getXmlNode().getNodeName();
                        } else {
                            id = node.getDescriptor().getUiName();
                        }
                    }

                    label.setText(String.format("%1$s: %2$s", id, message));
                }
            }
        }
    }

    @Override
    protected void checkSubclass() {
        // Disable the check that prevents subclassing of SWT components
    }
}
