/*
 * #%L
 * GwtMaterial
 * %%
 * Copyright (C) 2015 - 2017 GwtMaterialDesign
 * %%
 * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
 * 
 * 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.
 * #L%
 */
package gwt.material.design.addins.client.richeditor.base;

import com.google.gwt.core.client.JsArrayString;
import gwt.material.design.addins.client.richeditor.base.constants.ToolbarButton;

public class ToolBarManager {

    private ToolbarButton[] styleOptions = new ToolbarButton[]
            {ToolbarButton.STYLE, ToolbarButton.BOLD, ToolbarButton.ITALIC, ToolbarButton.UNDERLINE, ToolbarButton.STRIKETHROUGH, ToolbarButton.CLEAR, ToolbarButton.SUPERSCRIPT, ToolbarButton.SUBSCRIPT};
    private ToolbarButton[] fontOptions = new ToolbarButton[]
            {ToolbarButton.FONT_SIZE, ToolbarButton.FONT_NAME};
    private ToolbarButton[] colorOptions = new ToolbarButton[]
            {ToolbarButton.COLOR};
    private ToolbarButton[] undoOptions = new ToolbarButton[]
            {ToolbarButton.UNDO, ToolbarButton.REDO, ToolbarButton.HELP};
    private ToolbarButton[] ckMediaOptions = new ToolbarButton[]
            {ToolbarButton.CK_IMAGE_UPLOAD, ToolbarButton.CK_IMAGE_VIDEO};
    private ToolbarButton[] miscOptions = new ToolbarButton[]
            {ToolbarButton.LINK, ToolbarButton.PICTURE, ToolbarButton.TABLE, ToolbarButton.HR, ToolbarButton.CODE_VIEW, ToolbarButton.FULLSCREEN};
    private ToolbarButton[] paraOptions = new ToolbarButton[]
            {ToolbarButton.UL, ToolbarButton.OL, ToolbarButton.PARAGRAPH, ToolbarButton.LEFT, ToolbarButton.CENTER, ToolbarButton.RIGHT, ToolbarButton.JUSTIFY, ToolbarButton.OUTDENT, ToolbarButton.INDENT};
    private ToolbarButton[] heightOptions = new ToolbarButton[]
            {ToolbarButton.LINE_HEIGHT};

    public Object[][] getToolbars() {
        // Set up the toolbar items
        Object[][] toolbar = new Object[][]{};
        toolbar[0] = new Object[]{"style", extractOptions(getStyleOptions())};
        toolbar[1] = new Object[]{"para", extractOptions(getParaOptions())};
        toolbar[2] = new Object[]{"height", extractOptions(getHeightOptions())};
        toolbar[3] = new Object[]{"undo", extractOptions(getUndoOptions())};
        toolbar[4] = new Object[]{"fonts", extractOptions(getFontOptions())};
        toolbar[5] = new Object[]{"color", extractOptions(getColorOptions())};
        toolbar[6] = new Object[]{"ckMedia", extractOptions(getCkMediaOptions())};
        toolbar[7] = new Object[]{"misc", extractOptions(getMiscOptions())};
        return toolbar;
    }

    public ToolbarButton[] getStyleOptions() {
        return styleOptions;
    }

    public void setStyleOptions(ToolbarButton... styleOptions) {
        this.styleOptions = styleOptions;
    }

    public ToolbarButton[] getFontOptions() {
        return fontOptions;
    }

    public void setFontOptions(ToolbarButton... fontOptions) {
        this.fontOptions = fontOptions;
    }

    public ToolbarButton[] getColorOptions() {
        return colorOptions;
    }

    public void setColorOptions(ToolbarButton... colorOptions) {
        this.colorOptions = colorOptions;
    }

    public ToolbarButton[] getUndoOptions() {
        return undoOptions;
    }

    public void setUndoOptions(ToolbarButton... undoOptions) {
        this.undoOptions = undoOptions;
    }

    public ToolbarButton[] getCkMediaOptions() {
        return ckMediaOptions;
    }

    public void setCkMediaOptions(ToolbarButton... ckMediaOptions) {
        this.ckMediaOptions = ckMediaOptions;
    }

    public ToolbarButton[] getMiscOptions() {
        return miscOptions;
    }

    public void setMiscOptions(ToolbarButton... miscOptions) {
        this.miscOptions = miscOptions;
    }

    public ToolbarButton[] getParaOptions() {
        return paraOptions;
    }

    public void setParaOptions(ToolbarButton... paraOptions) {
        this.paraOptions = paraOptions;
    }

    public ToolbarButton[] getHeightOptions() {
        return heightOptions;
    }

    public void setHeightOptions(ToolbarButton... heightOptions) {
        this.heightOptions = heightOptions;
    }

    protected JsArrayString extractOptions(ToolbarButton[] options) {
        JsArrayString jsOptions = JsArrayString.createArray().cast();
        for (ToolbarButton option : options) {
            jsOptions.push(option.getId());
        }
        return jsOptions;
    }
}