com.t3.macro.api.views.MacroButtonView.java Source code

Java tutorial

Introduction

Here is the source code for com.t3.macro.api.views.MacroButtonView.java

Source

/*
 * Copyright (c) 2014 tabletoptool.com team.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Public License v3.0
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/gpl.html
 * 
 * Contributors:
 *     rptools.com team - initial implementation
 *     tabletoptool.com team - further development
 */
package com.t3.macro.api.views;

import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

import com.t3.client.TabletopTool;
import com.t3.guid.GUID;
import com.t3.macro.MacroException;
import com.t3.macro.api.functions.CampaignFunctions;
import com.t3.model.MacroButtonProperties;
import com.t3.model.Token;

public class MacroButtonView implements MacroView {

    private MacroButtonProperties macro;

    public MacroButtonView(MacroButtonProperties macro) {
        this.macro = macro;
    }

    /**
     * @return the label of the macro button
     */
    public String getLabel() {
        return macro.getLabel();
    }

    /**
     * This method sets the label of this macro button
     * @param label the new label of the button
     */
    public void setLabel(String label) {
        macro.setLabel(label);
        TabletopTool.serverCommand().putToken(macro.getToken().getZone().getId(), macro.getToken());
    }

    /**
     * @return the token this macro button is attached to
     */
    public TokenView getToken() {
        return new TokenView(macro.getToken());
    }

    /**
     * @return a string representation of the color of this button
     */
    public String getColorKey() {
        return macro.getColorKey();
    }

    /**
     * This method allows you to set the color of the macro button. You can give the color
     * as a name (e.g. "red") or as a hexadecimal number (e.g. #ff0000).
     * @param colorKey the color you want to set
     */
    public void setColorKey(String colorKey) {
        macro.setColorKey(colorKey);
        TabletopTool.serverCommand().putToken(macro.getToken().getZone().getId(), macro.getToken());
    }

    /**
     * @return the macro stored in the button as text
     */
    public String getMacro() {
        return macro.getCommand();
    }

    /**
     * This method sets the macro of this button.
     * @param command the new macro
     */
    public void setMacro(String command) {
        macro.setCommand(command);
        TabletopTool.serverCommand().putToken(macro.getToken().getZone().getId(), macro.getToken());
    }

    /**
     * @return the group this button belongs to
     */
    public String getGroup() {
        return macro.getGroup();
    }

    /**
     * This method sets the group of this button.
     * @param group the new group of this button
     */
    public void setGroup(String group) {
        macro.setGroup(group);
        TabletopTool.serverCommand().putToken(macro.getToken().getZone().getId(), macro.getToken());
    }

    /**
     * @return a key to sort this button by
     */
    public String getSortby() {
        return macro.getSortby();
    }

    /**
     * This method sets the sort key of this button. This allows you to sort the buttons
     * in another order than by the label
     * @param sortby the new sort key
     */
    public void setSortby(String sortby) {
        macro.setSortby(sortby);
        TabletopTool.serverCommand().putToken(macro.getToken().getZone().getId(), macro.getToken());
    }

    /**
     * @return a string representation of the color of this button text
     */
    public String getTextColorKey() {
        return macro.getFontColorKey();
    }

    /**
     * This method allows you to set the color of the macro button text. You can give 
     * the color as a name (e.g. "red") or as a hexadecimal number (e.g. #ff0000).
     * @param colorKey the color you want to set
     */
    public void setTextColorKey(String colorKey) {
        macro.setFontColorKey(colorKey);
        TabletopTool.serverCommand().putToken(macro.getToken().getZone().getId(), macro.getToken());
    }

    /**
     * @return the minimum width of this button
     */
    public String getMinWidth() {
        return macro.getMinWidth();
    }

    /**
     * This method sets the minimum width of this button
     * @param minWidth the new minimum width
     */
    public void setMinWidth(String minWidth) {
        macro.setMinWidth(minWidth);
        TabletopTool.serverCommand().putToken(macro.getToken().getZone().getId(), macro.getToken());
    }

    /**
     * @return the maximum width of this button
     */
    public String getMaxWidth() {
        return macro.getMaxWidth();
    }

    /**
     * This method sets the maximum width of this button
     * @param maxWidth the new maximum width
     */
    public void setMaxWidth(String maxWidth) {
        macro.setMaxWidth(maxWidth);
        TabletopTool.serverCommand().putToken(macro.getToken().getZone().getId(), macro.getToken());
    }

    /**
     * This method sets the tooltip of this macro.
     * @param tooltip the new tooltip
     */
    public void setToolTip(String tooltip) {
        macro.setToolTip(tooltip);
        TabletopTool.serverCommand().putToken(macro.getToken().getZone().getId(), macro.getToken());
    }

    /**
     * @return the tooltip of this token
     */
    public String getToolTip() {
        return macro.getToolTip();
    }

    /**
     * @return if this is a common macro
     */
    public boolean getCommonMacro() {
        return macro.getCommonMacro();
    }

    /**
     * This methods makes this macro button  a common one or not
     * @param value if this macro button should be common
     */
    public void setCommonMacro(boolean value) {
        macro.setCommonMacro(value);
        TabletopTool.serverCommand().putToken(macro.getToken().getZone().getId(), macro.getToken());
    }

    /**
     * @return if the group of this macro button should be used to decide if they are 
     * displayed as common 
     */
    public boolean getCompareGroup() {
        return macro.getCompareGroup();
    }

    /**
     * This method sets if the group of this macro button should be used to decide if 
     * they are displayed as common 
     * @param value if it is used
     */
    public void setCompareGroup(boolean value) {
        macro.setCompareGroup(value);
        TabletopTool.serverCommand().putToken(macro.getToken().getZone().getId(), macro.getToken());
    }

    /**
     * @return if the sort key of this macro button should be used to decide if they are 
     * displayed as common 
     */
    public boolean getCompareSortBy() {
        return macro.getCompareSortPrefix();
    }

    /**
     * This method sets if the sort key of this macro button should be used to decide if 
     * they are displayed as common 
     * @param value if it is used
     */
    public void setCompareSortBy(boolean value) {
        macro.setCompareSortPrefix(value);
        TabletopTool.serverCommand().putToken(macro.getToken().getZone().getId(), macro.getToken());
    }

    /**
     * @return if the macro code of this macro button should be used to decide if they are 
     * displayed as common 
     */
    public boolean getCompareCommand() {
        return macro.getCompareCommand();
    }

    /**
     * This method sets if the macro code of this macro button should be used to decide if 
     * they are displayed as common 
     * @param value if it is used
     */
    public void setCompareCommand(boolean value) {
        macro.setCompareCommand(value);
        TabletopTool.serverCommand().putToken(macro.getToken().getZone().getId(), macro.getToken());
    }

    /**
     * This will execute this macro without any arguments.
     * @return the object returned by the macro
     */
    @Override
    public Object execute() {
        Map<String, Object> args = Collections.emptyMap();
        return execute(args);
    }

    /**
     * This will execute this macro with the given arguments
     * @param arguments the arguments given to the called macro
     * @return the object returned by the macro
     */
    @Override
    public Object execute(Map<String, Object> arguments) {
        return macro.executeMacro(macro.getToken(), arguments);
    }

    /**
     * This method will create a html link that will call this macro.
     * @param text the text that should call this macro
     * @param args the 
     * @return
     */
    public String createLink(String text, String... args) {
        try {
            StringBuilder sb = new StringBuilder("<a href=\"macro://");
            //is campaign macro
            if (macro.getToken() == null) {
                if (StringUtils.isEmpty(macro.getSaveLocation()))
                    sb.append("GlobalPanel");
                else
                    sb.append(macro.getSaveLocation());
            } else
                sb.append(macro.getToken().getId().toString());

            sb.append('/').append(URLEncoder.encode(macro.getLabel(), "utf8"));
            if (args.length > 0) {
                sb.append('?');

                for (int i = 0; i < args.length; i++) {
                    if (i > 0)
                        sb.append('&');
                    sb.append("arg").append(i).append('=').append(URLEncoder.encode(args[i], "utf8"));
                }
            }

            return sb.append("\">").append(text).append("</a>").toString();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
    }

    public static Object executeLink(String link) throws MacroException {
        try {
            URI u = new URI(link);
            MacroButtonProperties mbp;
            Token t = null;

            //campaign macro
            if ("CampaignPanel".equals(u.getHost())) {
                CampaignFunctions cf = new CampaignFunctions();
                MacroButtonView mv = cf.getCampaignMacro(URLDecoder.decode(u.getPath(), "utf8").substring(1));
                if (mv == null)
                    throw new IllegalArgumentException(
                            "Campaign macro '" + URLDecoder.decode(u.getPath(), "utf8") + " not found.");
                else
                    mbp = mv.macro;
            }
            //global macro
            else if ("GlobalPanel".equals(u.getHost())) {
                CampaignFunctions cf = new CampaignFunctions();
                MacroButtonView mv = cf.getGlobalMacro(URLDecoder.decode(u.getPath(), "utf8").substring(1));
                if (mv == null)
                    throw new IllegalArgumentException(
                            "Global macro '" + URLDecoder.decode(u.getPath(), "utf8").substring(1) + " not found.");
                else
                    mbp = mv.macro;
            }
            //token macro
            else {
                t = TabletopTool.getFrame().findToken(new GUID(u.getHost()));
                mbp = t.getMacro(URLDecoder.decode(u.getPath(), "utf8").substring(1), false);
            }
            HashMap<String, Object> arguments = new HashMap<String, Object>();
            if (u.getQuery() != null) {
                for (String a : StringUtils.split(u.getQuery(), '&')) {
                    String[] aps = StringUtils.split(a, '=');
                    arguments.put(aps[0], URLDecoder.decode(aps[1], "utf8"));
                }
            }
            return mbp.executeMacro(t, arguments);
        } catch (UnsupportedEncodingException | URISyntaxException e) {
            throw new MacroException(e);
        }
    }
}