```java
package com.example.application.views.main;

import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.Composite;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.button.ButtonVariant;
import com.vaadin.flow.component.contextmenu.ContextMenu;
import com.vaadin.flow.component.html.Anchor;
import com.vaadin.flow.component.html.Hr;
import com.vaadin.flow.component.icon.VaadinIcon;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;
import com.vaadin.flow.server.AbstractStreamResource;
import com.vaadin.flow.server.StreamResource;

import java.io.InputStream;
import java.net.URL;
import java.util.function.Supplier;

@PageTitle("Main")
@Route(value = "")
public class MainView extends HorizontalLayout {
    public MainView() {
        setSizeFull();

        ContextMenu menu = new ContextMenu();
        menu.setTarget(this);

        menu.addItem("First Option");
        menu.addItem("Second Option");
        menu.addItem(new Hr());

        var download1 = new DownloadButton("v-new-look-2.png", MainView::getImage);
        var download2 = new DownloadButton("v-new-look-2.png", MainView::getImage);

        menu.add(download1);
        menu.addItem(download2);


    }

    public static InputStream getImage() {
        try {
            return new URL("https://website.vaadin.com/hs-fs/hubfs/v-new-look-2.png?width=595&height=595&name=v-new-look-2.png").openStream();
        } catch (Exception ex) {
            return null;
        }
    }

    public class DownloadButton extends Composite<Anchor> {
        private final Button button;

        public DownloadButton() {
            super();
            button = new Button("Download", VaadinIcon.DOWNLOAD.create());
            button.addThemeVariants(ButtonVariant.LUMO_SMALL);
            button.addThemeVariants(ButtonVariant.LUMO_TERTIARY_INLINE);
            getContent().getElement().setAttribute("download", true);
            getContent().add(button);
        }

        public DownloadButton(String name, Supplier<InputStream> o) {
            this();
            setHref(name, o);
        }

        public Button getButton() {
            return button;
        }

        public void setText(String text) {
            button.setText(text);
        }

        public void setIcon(Component icon) {
            button.setIcon(icon);
        }

        public void setHref(AbstractStreamResource resource) {
            getContent().setHref(resource);
        }

        public void setHref(String name, Supplier<InputStream> o) {
            setHref(new StreamResource(name == null ? "" : name, o::get));
        }

        public void addThemeVariants(ButtonVariant... variant) {
            button.addThemeVariants(variant);
        }
    }
}
```