package net.bitpot.railways.gui;

import com.intellij.ide.CopyProvider;
import com.intellij.ide.TextCopyProvider;
import com.intellij.openapi.actionSystem.*;
import com.intellij.ui.PopupHandler;
import com.intellij.ui.components.JBLabel;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.awt.*;
import java.util.ArrayList;
import java.util.Collection;

public class LabelWithCopy extends JBLabel implements DataProvider {

    private CopyProvider copyProvider = new MyCopyProvider(this);

    @Nullable
    private StringFormatter formatter;

    public LabelWithCopy() {
        addMouseListener(new PopupHandler() {
            @Override
            public void invokePopup(Component comp, int x, int y) {
                ActionManager actMgr = ActionManager.getInstance();
                ActionGroup group = (ActionGroup) ActionManager.getInstance()
                        .getAction("railways.CopyMenu");

                ActionPopupMenu popupMenu =
                        actMgr.createActionPopupMenu(ActionPlaces.UNKNOWN, group);
                popupMenu.getComponent().show(comp, x, y);
            }
        });
    }

    public void setCopyFormatter(StringFormatter formatter) {
        this.formatter = formatter;
    }

    @Nullable
    @Override
    public Object getData(@NotNull @NonNls String s) {
        if (PlatformDataKeys.COPY_PROVIDER.is(s))
            return copyProvider;

        return null;
    }


    private class MyCopyProvider extends TextCopyProvider {

        private LabelWithCopy label;

        public MyCopyProvider(LabelWithCopy label) {
            this.label = label;
        }

        @Nullable
        @Override
        public Collection<String> getTextLinesToCopy() {
            String text = label.getText();

            if (text.isEmpty() || text.equals("-"))
                return null;

            if (formatter != null)
                text = formatter.format(text);

            Collection<String> result = new ArrayList<>(1);
            result.add(text);

            return result;
        }
    }

}