com.ikon.frontend.client.widget.dashboard.keymap.KeyMapDashboard.java Source code

Java tutorial

Introduction

Here is the source code for com.ikon.frontend.client.widget.dashboard.keymap.KeyMapDashboard.java

Source

/**
 * openkm, Open Document Management System (http://www.openkm.com)
 * Copyright (c) 2006-2013 Paco Avila & Josep Llort
 * 
 * No bytes were intentionally harmed during the development of this application.
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

package com.ikon.frontend.client.widget.dashboard.keymap;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.HorizontalSplitPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.MultiWordSuggestOracle;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.ikon.frontend.client.Main;
import com.ikon.frontend.client.bean.GWTKeyword;
import com.ikon.frontend.client.bean.GWTQueryParams;
import com.ikon.frontend.client.bean.GWTQueryResult;
import com.ikon.frontend.client.bean.GWTResultSet;
import com.ikon.frontend.client.constants.ui.UIDashboardConstants;
import com.ikon.frontend.client.constants.ui.UIDockPanelConstants;
import com.ikon.frontend.client.service.OKMSearchService;
import com.ikon.frontend.client.service.OKMSearchServiceAsync;
import com.ikon.frontend.client.widget.dashboard.AnchorExtended;
import com.ikon.frontend.client.widget.dashboard.ControlSearchIn;
import com.ikon.frontend.client.widget.dashboard.ImageHover;

/**
 * KeyMapDashboard
 * 
 * @author jllort
 * 
 */
@SuppressWarnings("deprecation")
public class KeyMapDashboard extends Composite {

    private final OKMSearchServiceAsync searchService = (OKMSearchServiceAsync) GWT.create(OKMSearchService.class);
    private HorizontalSplitPanel horizontalSplitPanel;
    private KeywordWidget keyAllTable;
    private KeywordWidget keyTopTable;
    private KeywordWidget keyRelatedTable;
    private VerticalPanel vPanel;
    private HorizontalPanel controlPanel;
    private HorizontalPanel paginationPanel;
    private Image clean;
    private Image small;
    private Image medium;
    private Image big;
    private HTML keywordsTXT;
    private HorizontalPanel selectedKeyPanel;
    private HorizontalPanel suggestKeyPanel;
    private Map<String, Widget> selectedKeyMap;
    private SuggestBox suggestKey;
    private MultiWordSuggestOracle multiWordSuggestKey;
    private List<String> keywordList;
    public ScrollPanel scrollTable;
    HTML flowPanelDivisor;
    public KeyMapTable table;
    private int offset = 0;
    private int limit = 10;
    ListBox context;
    private ListBox resultPage;
    private HTML resultPageTXT;
    private ControlSearchIn controlSearchIn;
    private List<GWTKeyword> allKeywordList;
    private List<GWTKeyword> relatedKeywordList;
    private Map<String, String> rateMap;
    private int totalMaxFrequency = 1;
    private int totalMinFrequency = 1;
    private TagCloud tagCloud;
    private boolean personalVisible = false;
    private boolean mailVisible = false;
    private boolean trashVisible = false;
    private boolean templatesVisible = false;
    private boolean firstTime = true;
    private boolean refresh = false;
    private int posTaxonomy = 0;
    private int posTemplates = 0;
    private int posPersonal = 0;
    private int posMail = 0;
    private int posTrash = 0;
    private int posAllContext = 0;
    private boolean dashboardVisible = false;

    /**
     * KeyMapDashboard
     */
    public KeyMapDashboard() {
        horizontalSplitPanel = new HorizontalSplitPanel();
        keyAllTable = new KeywordWidget(Main.i18n("dashboard.keyword.all"));
        keyTopTable = new KeywordWidget(Main.i18n("dashboard.keyword.top"));
        keyRelatedTable = new KeywordWidget(Main.i18n("dashboard.keyword.related"));

        allKeywordList = new ArrayList<GWTKeyword>();
        relatedKeywordList = new ArrayList<GWTKeyword>();
        rateMap = new HashMap<String, String>();
        HTML space = new HTML("&nbsp;");
        flowPanelDivisor = new HTML("&nbsp;");

        tagCloud = new TagCloud();
        table = new KeyMapTable();
        VerticalPanel contentPanel = new VerticalPanel();
        contentPanel.add(tagCloud);
        contentPanel.add(space);
        contentPanel.add(flowPanelDivisor);
        contentPanel.add(table);
        contentPanel.setWidth("100%");
        tagCloud.setWidth("100%");
        space.setWidth("100%");
        space.setHeight("10");
        flowPanelDivisor.setWidth("100%");
        flowPanelDivisor.setHeight("5");
        scrollTable = new ScrollPanel(contentPanel);

        tagCloud.setStylePrimaryName("okm-cloudWrap");
        flowPanelDivisor.setStyleName("okm-cloudSeparator");
        table.addStyleName("okm-DisableSelect");

        vPanel = new VerticalPanel();
        controlPanel = new HorizontalPanel();
        paginationPanel = new HorizontalPanel();
        selectedKeyMap = new HashMap<String, Widget>();
        multiWordSuggestKey = new MultiWordSuggestOracle();
        keywordList = new ArrayList<String>();
        suggestKey = new SuggestBox(multiWordSuggestKey);
        suggestKey.setHeight("20");
        suggestKey.setText(Main.i18n("dashboard.keyword.suggest"));
        suggestKey.addKeyUpHandler(new KeyUpHandler() {
            @Override
            public void onKeyUp(KeyUpEvent event) {
                if ((char) KeyCodes.KEY_ENTER == event.getNativeKeyCode()) {
                    selectKey(suggestKey.getText());
                    suggestKey.setText("");
                }
            }
        });
        suggestKey.getTextBox().addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                if (suggestKey.getText().equals(Main.i18n("dashboard.keyword.suggest"))) {
                    suggestKey.setText("");
                }
            }
        });

        vPanel.add(controlPanel);
        vPanel.add(scrollTable);
        vPanel.add(paginationPanel);

        // Image control
        HorizontalPanel imageControlPanel = new HorizontalPanel();
        HTML space1 = new HTML();
        HTML space2 = new HTML();
        small = new Image("img/icon/actions/description_small_disabled.gif");
        small.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                if (table.getActualDetail() != KeyMapTable.VISIBLE_SMALL) {
                    disableAllDetailIcons();
                    table.changeVisibilityDetail(KeyMapTable.VISIBLE_SMALL);
                    small.setUrl("img/icon/actions/description_small.gif");
                }
            }
        });
        medium = new Image("img/icon/actions/description_medium.gif"); // It's enabled view by default
        medium.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                if (table.getActualDetail() != KeyMapTable.VISIBLE_MEDIUM) {
                    disableAllDetailIcons();
                    table.changeVisibilityDetail(KeyMapTable.VISIBLE_MEDIUM);
                    medium.setUrl("img/icon/actions/description_medium.gif");
                }
            }
        });
        big = new Image("img/icon/actions/description_big_disabled.gif");
        big.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                if (table.getActualDetail() != KeyMapTable.VISIBLE_BIG) {
                    disableAllDetailIcons();
                    table.changeVisibilityDetail(KeyMapTable.VISIBLE_BIG);
                    big.setUrl("img/icon/actions/description_big.gif");
                }
            }
        });
        imageControlPanel.add(space1);
        imageControlPanel.add(small);
        imageControlPanel.add(medium);
        imageControlPanel.add(big);
        imageControlPanel.add(space2);
        imageControlPanel.setCellWidth(space1, "8");
        imageControlPanel.setCellWidth(small, "21");
        imageControlPanel.setCellWidth(medium, "21");
        imageControlPanel.setCellWidth(big, "21");
        imageControlPanel.setCellHeight(small, "20");
        imageControlPanel.setCellHeight(medium, "20");
        imageControlPanel.setCellHeight(big, "20");
        imageControlPanel.setCellWidth(space2, "8");
        imageControlPanel.setCellHorizontalAlignment(small, HasAlignment.ALIGN_CENTER);
        imageControlPanel.setCellHorizontalAlignment(medium, HasAlignment.ALIGN_CENTER);
        imageControlPanel.setCellHorizontalAlignment(big, HasAlignment.ALIGN_CENTER);
        imageControlPanel.setCellVerticalAlignment(small, HasAlignment.ALIGN_MIDDLE);
        imageControlPanel.setCellVerticalAlignment(medium, HasAlignment.ALIGN_MIDDLE);
        imageControlPanel.setCellVerticalAlignment(big, HasAlignment.ALIGN_MIDDLE);

        // KeyWords text
        keywordsTXT = new HTML();
        keywordsTXT.setHTML("<b>" + Main.i18n("dashboard.keyword") + "</b>");
        HTML space3 = new HTML();
        HorizontalPanel hPanel = new HorizontalPanel();
        hPanel.add(keywordsTXT);
        hPanel.add(space3);
        hPanel.setCellWidth(space3, "8");
        hPanel.setCellVerticalAlignment(keywordsTXT, HasAlignment.ALIGN_MIDDLE);

        selectedKeyPanel = new HorizontalPanel();
        suggestKeyPanel = new HorizontalPanel();
        HTML space4 = new HTML();
        clean = new Image("img/icon/actions/clean_disabled.gif");
        clean.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                if (selectedKeyMap.keySet().size() > 0) {
                    // Resets keywordPanel
                    for (String key : selectedKeyMap.keySet()) {
                        selectedKeyPanel.remove((Widget) selectedKeyMap.get(key));
                    }
                    selectedKeyMap = new HashMap<String, Widget>();
                    keyAllTable.unselectAllRows();
                    keyTopTable.unselectAllRows();
                    keyRelatedTable.unselectAllRows();
                    keyRelatedTable.setVisible(false);
                    table.reset();
                    context.setSelectedIndex(posAllContext);
                    controlSearchIn.refreshControl(0);

                    getKeywordMap(); // Gets related keyMap
                    refreshClean();
                }
            }
        });
        clean.setTitle(Main.i18n("dashboard.keyword.clean.keywords"));
        suggestKeyPanel.add(suggestKey); // Always must be the last
        suggestKeyPanel.add(space4);
        suggestKeyPanel.add(clean);
        suggestKeyPanel.setCellWidth(space4, "8");
        suggestKeyPanel.setCellWidth(clean, "21");
        suggestKeyPanel.setCellHorizontalAlignment(space4, HasAlignment.ALIGN_RIGHT);
        suggestKeyPanel.setCellVerticalAlignment(suggestKey, HasAlignment.ALIGN_MIDDLE);
        suggestKeyPanel.setCellVerticalAlignment(clean, HasAlignment.ALIGN_MIDDLE);

        selectedKeyPanel.add(hPanel);
        selectedKeyPanel.add(suggestKeyPanel); // Always must be the last
        selectedKeyPanel.setCellVerticalAlignment(hPanel, HasAlignment.ALIGN_MIDDLE);
        selectedKeyPanel.setCellVerticalAlignment(suggestKeyPanel, HasAlignment.ALIGN_MIDDLE);

        controlPanel.add(imageControlPanel);
        controlPanel.add(selectedKeyPanel);

        controlPanel.setCellWidth(imageControlPanel, "80");
        controlPanel.setCellVerticalAlignment(imageControlPanel, HasAlignment.ALIGN_MIDDLE);
        controlPanel.setCellVerticalAlignment(selectedKeyPanel, HasAlignment.ALIGN_MIDDLE);

        // Pagination
        HorizontalPanel internalPaginationPanel = new HorizontalPanel();
        context = new ListBox();
        context.setStyleName("okm-Select");
        int count = 0;
        posTaxonomy = count++;
        context.addItem(Main.i18n("leftpanel.label.taxonomy"), "");
        if (templatesVisible) {
            posTemplates = count++;
            context.addItem(Main.i18n("leftpanel.label.templates"), "");
        }
        if (personalVisible) {
            posPersonal = count++;
            context.addItem(Main.i18n("leftpanel.label.my.documents"), "");
        }
        if (mailVisible) {
            posMail = count++;
            context.addItem(Main.i18n("leftpanel.label.mail"), "");
        }
        if (trashVisible) {
            posTrash = count++;
            context.addItem(Main.i18n("leftpanel.label.trash"), "");
        }
        posAllContext = count++;
        context.addItem(Main.i18n("leftpanel.label.all.repository"), "");
        context.setSelectedIndex(posAllContext);

        context.addChangeHandler(new ChangeHandler() {
            @Override
            public void onChange(ChangeEvent event) {
                controlSearchIn.executeSearch(limit);
            }
        });

        resultPage = new ListBox();
        resultPage.addItem("10", "10");
        resultPage.addItem("20", "20");
        resultPage.addItem("30", "30");

        resultPage.addChangeHandler(new ChangeHandler() {
            @Override
            public void onChange(ChangeEvent event) {
                limit = Integer.valueOf(resultPage.getValue(resultPage.getSelectedIndex()));
                controlSearchIn.executeSearch(limit);
            }
        });

        HTML space5 = new HTML();
        HTML space6 = new HTML();
        HTML space7 = new HTML();
        resultPageTXT = new HTML(Main.i18n("search.page.results"));
        controlSearchIn = new ControlSearchIn();
        controlSearchIn.refreshControl(0);
        internalPaginationPanel.add(space5);
        internalPaginationPanel.add(context);
        internalPaginationPanel.add(space6);
        internalPaginationPanel.add(resultPageTXT);
        internalPaginationPanel.add(space7);
        internalPaginationPanel.add(resultPage);

        internalPaginationPanel.setCellWidth(space5, "8");
        internalPaginationPanel.setCellWidth(space6, "8");
        internalPaginationPanel.setCellWidth(space7, "8");
        internalPaginationPanel.setCellHorizontalAlignment(context, HasAlignment.ALIGN_LEFT);
        internalPaginationPanel.setCellVerticalAlignment(context, HasAlignment.ALIGN_MIDDLE);
        internalPaginationPanel.setCellVerticalAlignment(resultPageTXT, HasAlignment.ALIGN_MIDDLE);
        internalPaginationPanel.setCellVerticalAlignment(resultPage, HasAlignment.ALIGN_MIDDLE);

        HTML space8 = new HTML();
        HTML space9 = new HTML();
        paginationPanel.add(internalPaginationPanel);
        paginationPanel.add(space8);
        paginationPanel.add(controlSearchIn);
        paginationPanel.add(space9);
        paginationPanel.setCellWidth(space8, "8");
        paginationPanel.setCellWidth(space9, "8");
        paginationPanel.setCellHorizontalAlignment(internalPaginationPanel, HasAlignment.ALIGN_LEFT);
        paginationPanel.setCellVerticalAlignment(internalPaginationPanel, HasAlignment.ALIGN_MIDDLE);
        paginationPanel.setCellVerticalAlignment(controlSearchIn, HasAlignment.ALIGN_MIDDLE);
        paginationPanel.setCellHorizontalAlignment(controlSearchIn, HasAlignment.ALIGN_RIGHT);

        suggestKey.setStyleName("okm-KeyMap-Suggest");
        suggestKey.addStyleName("okm-Input");
        controlPanel.setStyleName("okm-KeyMapControl");
        controlPanel.addStyleName("okm-NoWrap");
        imageControlPanel.addStyleName("okm-NoWrap");
        selectedKeyPanel.addStyleName("okm-NoWrap");
        paginationPanel.setStyleName("okm-PaginationControl");
        paginationPanel.addStyleName("okm-NoWrap");
        internalPaginationPanel.addStyleName("okm-NoWrap");
        keywordsTXT.addStyleName("okm-NoWrap");
        resultPage.setStyleName("okm-Input");
        resultPageTXT.addStyleName("okm-NoWrap");
        hPanel.addStyleName("okm-NoWrap");
        clean.setStyleName("okm-KeyMap-ImageHover");
        small.setStyleName("okm-KeyMap-ImageHover");
        medium.setStyleName("okm-KeyMap-ImageHover");
        big.setStyleName("okm-KeyMap-ImageHover");
        tagCloud.setStylePrimaryName("okm-cloudWrap");

        VerticalPanel vKeyPanel = new VerticalPanel();
        vKeyPanel.setWidth("100%");

        vKeyPanel.add(keyRelatedTable);
        vKeyPanel.add(keyTopTable);
        vKeyPanel.add(keyAllTable);

        keyRelatedTable.setVisible(false); // By default related table is only visible when has some content

        horizontalSplitPanel.setRightWidget(vKeyPanel);
        horizontalSplitPanel.setLeftWidget(vPanel);

        initWidget(horizontalSplitPanel);
    }

    /*
     * (non-Javadoc)
     * @see com.google.gwt.user.client.ui.UIObject#setSize(java.lang.String, java.lang.String)
     */
    public void setSize(String width, String height) {
        horizontalSplitPanel.setSize(width, height);
        horizontalSplitPanel.setSplitPosition("" + (Integer.valueOf(width) - 220));
        vPanel.setSize("100%", height);
        controlPanel.setSize("100%", "30");
        paginationPanel.setSize("100%", "30");
        scrollTable.setSize("100%", "" + (Integer.valueOf(height) - 60));
    }

    /**
     * Refreshing language
     */
    public void langRefresh() {
        keywordsTXT.setHTML("<b>" + Main.i18n("dashboard.keyword") + "</b>");
        suggestKey.setText(Main.i18n("dashboard.keyword.suggest"));
        keyAllTable.setHeaderText(Main.i18n("dashboard.keyword.all"));
        keyTopTable.setHeaderText(Main.i18n("dashboard.keyword.top"));
        keyRelatedTable.setHeaderText(Main.i18n("dashboard.keyword.related"));

        resultPageTXT.setHTML(Main.i18n("search.page.results"));
        controlSearchIn.langRefresh();

        context.setItemText(posTaxonomy, Main.i18n("leftpanel.label.taxonomy"));
        if (templatesVisible) {
            context.setItemText(posTemplates, Main.i18n("leftpanel.label.templates"));
        }
        if (personalVisible) {
            context.setItemText(posPersonal, Main.i18n("leftpanel.label.my.documents"));
        }
        if (mailVisible) {
            context.setItemText(posMail, Main.i18n("leftpanel.label.mail"));
        }
        if (trashVisible) {
            context.setItemText(posTrash, Main.i18n("leftpanel.label.trash"));
        }
        context.setItemText(posAllContext, Main.i18n("leftpanel.label.all.repository"));

        table.langRefresh();
    }

    /**
     * Gets the keyword map callback
     */
    final AsyncCallback<List<GWTKeyword>> callbackGetKeywordMap = new AsyncCallback<List<GWTKeyword>>() {
        public void onSuccess(List<GWTKeyword> result) {
            List<GWTKeyword> top10List = new ArrayList<GWTKeyword>();
            multiWordSuggestKey.clear();
            keywordList = new ArrayList<String>();
            keyAllTable.reset();
            allKeywordList.clear();
            rateMap.clear();
            for (GWTKeyword keyword : result) {
                allKeywordList.add(keyword);
                rateMap.put(keyword.getKeyword(), "" + keyword.getFrequency());
                multiWordSuggestKey.add(keyword.getKeyword());
                keywordList.add(keyword.getKeyword());
                if (dashboardVisible) {
                    keyAllTable.add(keyword);
                    if (keyword.isTop10()) {
                        top10List.add(keyword);
                    }
                }
            }
            keyAllTable.unsetRefreshing();

            keyTopTable.reset();
            // Adding top 10 ordered from greater to lower
            if (dashboardVisible) {
                while (!top10List.isEmpty()) {
                    // Looking for max
                    int max = 0;
                    GWTKeyword selectedKeyword = new GWTKeyword();
                    for (GWTKeyword tmpKeyword : top10List) {
                        if (max < tmpKeyword.getFrequency()) {
                            selectedKeyword = tmpKeyword;
                            max = tmpKeyword.getFrequency();
                        }
                    }
                    top10List.remove(selectedKeyword);
                    if (dashboardVisible) {
                        keyTopTable.add(selectedKeyword);
                    }
                }
            }

            if (refresh) {
                refresh = false;
                if (dashboardVisible) {
                    // Restoring selected keywords after refreshing
                    for (String keyword : selectedKeyMap.keySet()) {
                        keyAllTable.selectRow(keyword);
                        keyTopTable.selectRow(keyword);
                    }
                }
            }

            keyTopTable.unsetRefreshing();

            getKeywordMap(getFiltering()); // Call for getting related keywords
        }

        public void onFailure(Throwable caught) {
            Main.get().showError("getKeywordMap", caught);
            keyAllTable.unsetRefreshing();
            keyTopTable.unsetRefreshing();
        }
    };

    /**
     * Gets the keyword map callback
     */
    final AsyncCallback<List<GWTKeyword>> callbackGetKeywordMapFiltered = new AsyncCallback<List<GWTKeyword>>() {
        public void onSuccess(List<GWTKeyword> result) {
            if (dashboardVisible) {
                keyRelatedTable.reset();
                keyRelatedTable.setVisible(result.size() > 0); // Show or hide table if has values
                relatedKeywordList.clear();
                for (Iterator<GWTKeyword> it = result.iterator(); it.hasNext();) {
                    GWTKeyword keyword = it.next();
                    keyRelatedTable.add(keyword);
                    relatedKeywordList.add(keyword);
                }
                keyRelatedTable.unsetRefreshing();
                drawTagCloud(); // Draws tag cloud
            }
        }

        public void onFailure(Throwable caught) {
            Main.get().showError("getKeywordMap", caught);
            keyRelatedTable.unsetRefreshing();
        }
    };

    /**
     * Gets the find paginated callback
     */
    final AsyncCallback<GWTResultSet> callbackFindPaginated = new AsyncCallback<GWTResultSet>() {
        public void onSuccess(GWTResultSet result) {
            table.reset();
            for (GWTQueryResult queryResult : result.getResults()) {
                if (queryResult.getDocument() != null) {
                    table.addRow(queryResult);
                } else if (queryResult.getFolder() != null) {
                    table.addRow(queryResult);
                } else if (queryResult.getMail() != null) {
                    table.addRow(queryResult);
                }
            }
            controlSearchIn.refreshControl(result.getTotal());
            table.unsetRefreshing();
        }

        public void onFailure(Throwable caught) {
            Main.get().showError("findPaginated", caught);
            table.unsetRefreshing();
        }
    };

    /**
     * getKeywordMap
     */
    public void getKeywordMap() {
        if (showStatus()) {
            keyAllTable.setRefreshing();
            keyTopTable.setRefreshing();
        }
        searchService.getKeywordMap(new ArrayList<String>(), callbackGetKeywordMap);
    }

    /**
     * getKeywordMap
     */
    public void getKeywordMap(List<String> filter) {
        // Only make call when collection is not empty, other case there's no filtering by keyword and
        // result it'll be inconsistent
        if (!filter.isEmpty()) {
            if (showStatus() && keyRelatedTable.isVisible()) {
                keyRelatedTable.setRefreshing();
            }
            searchService.getKeywordMap(filter, callbackGetKeywordMapFiltered);
        } else if (dashboardVisible) {
            keyRelatedTable.reset();
            keyRelatedTable.setVisible(false);
            drawTagCloud(); // Draws tag cloud
        }
    }

    /**
     * Fins paginated setting the offset and limit
     * 
     * @param offset The offset
     * @param limit The limit
     */
    public void findPaginated(int offset, int limit) {
        this.offset = offset;
        this.limit = limit;

        if (showStatus()) {
            table.setRefreshing();
        }
        GWTQueryParams params = new GWTQueryParams();
        params.setKeywords(getWordsToFilter());
        params.setDomain(GWTQueryParams.DOCUMENT | GWTQueryParams.FOLDER | GWTQueryParams.MAIL); // Only make searches
        // for documents
        limit = Integer.parseInt(resultPage.getItemText(resultPage.getSelectedIndex()));

        int index = context.getSelectedIndex();
        if (index == posTaxonomy) {
            params.setPath(Main.get().repositoryContext.getContextTaxonomy());
        } else if (index == posTemplates) {
            params.setPath(Main.get().repositoryContext.getContextTemplates());
        } else if (index == posPersonal) {
            params.setPath(Main.get().repositoryContext.getContextPersonal());
        } else if (index == posMail) {
            params.setPath(Main.get().repositoryContext.getContextMail());
        } else if (index == posTrash) {
            params.setPath(Main.get().repositoryContext.getContextTrash());
        } else if (index == posAllContext) {
            params.setPath("");
        }

        // Only execute search if there's some keyword
        if (params.getKeywords().equals("")) {
            table.reset();
            controlSearchIn.refreshControl(0);
            table.unsetRefreshing();
        } else {
            searchService.findPaginated(params, offset, limit, callbackFindPaginated);
        }
    }

    /**
     * Refresh all panels
     */
    public void refreshAll() {
        if (dashboardVisible) {
            if (firstTime) {
                findPaginated(offset, limit);
                firstTime = false;
            } else {
                controlSearchIn.executeSearch(limit);
            }
            refresh = true;
        }
        getKeywordMap(); // After finishing it call drawTagCloud
    }

    /**
     * selects a key
     * 
     * @param keyword the key
     */
    public void selectKey(final String keyword) {
        // Only adds keyword if not exist
        if (!selectedKeyMap.keySet().contains(keyword) && keyword.length() > 0 && dashboardVisible) {
            selectedKeyPanel.remove(suggestKeyPanel); // Always is setting the last, must be removed
            HorizontalPanel externalPanel = new HorizontalPanel();
            HorizontalPanel hPanel = new HorizontalPanel();
            HTML html = new HTML();
            HTML space = new HTML();
            ImageHover remove = new ImageHover("img/icon/actions/delete_disabled.gif",
                    "img/icon/actions/delete.gif");
            remove.addClickHandler(new ClickHandler() {
                @Override
                public void onClick(ClickEvent event) {
                    // remove keyword on all keyword panels
                    keyAllTable.unselectRow(keyword);
                    keyTopTable.unselectRow(keyword);
                    keyRelatedTable.unselectRow(keyword);
                    removeKey(keyword);
                }
            });
            remove.setStyleName("okm-KeyMap-ImageHover");
            html.setHTML(keyword);
            hPanel.add(html);
            hPanel.add(space);
            hPanel.add(remove);
            hPanel.setCellWidth(space, "6");
            hPanel.setStyleName("okm-KeyMap-Selected");
            hPanel.addStyleName("okm-NoWrap");
            HTML space1 = new HTML();
            externalPanel.add(hPanel);
            externalPanel.add(space1);
            externalPanel.setCellWidth(space1, "6");
            externalPanel.addStyleName("okm-NoWrap");
            selectedKeyPanel.add(externalPanel);
            selectedKeyPanel.add(suggestKeyPanel); // Always is setting the last
            selectedKeyPanel.setCellVerticalAlignment(externalPanel, HasAlignment.ALIGN_MIDDLE);
            selectedKeyMap.put(keyword, externalPanel);
            // Selects keyword on all keyword panels
            keyAllTable.selectRow(keyword);
            keyTopTable.selectRow(keyword);
            keyRelatedTable.selectRow(keyword);
            controlSearchIn.executeSearch(limit);

            getKeywordMap(getFiltering()); // Gets related keyMap
            refreshClean();
        }
    }

    /**
     * Remove a key
     * 
     * @param keyword The key
     */
    public void removeKey(String keyword) {
        if (selectedKeyMap.containsKey(keyword) && dashboardVisible) {
            selectedKeyPanel.remove((Widget) selectedKeyMap.get(keyword));
            selectedKeyMap.remove(keyword);
        }
        // Selects keyword on all keyword panels
        if (dashboardVisible) {
            keyAllTable.unselectRow(keyword);
            keyTopTable.unselectRow(keyword);
            keyRelatedTable.unselectRow(keyword);
        }
        controlSearchIn.executeSearch(limit);
        getKeywordMap(getFiltering()); // Gets related keyMap
        refreshClean();
    }

    /**
     * Gets the filtering
     * 
     * @return
     */
    public List<String> getFiltering() {
        List<String> filtering = new ArrayList<String>();
        for (String key : selectedKeyMap.keySet()) {
            filtering.add(key);
        }
        return filtering;
    }

    /**
     * Gets the filtering words
     * 
     * @return The words
     */
    private String getWordsToFilter() {
        String words = "";
        for (String key : selectedKeyMap.keySet()) {
            words += key + " ";
        }
        return words;
    }

    /**
     * Disables all detail icons
     */
    private void disableAllDetailIcons() {
        small.setUrl("img/icon/actions/description_small_disabled.gif");
        medium.setUrl("img/icon/actions/description_medium_disabled.gif");
        big.setUrl("img/icon/actions/description_big_disabled.gif");
    }

    /**
     * Refresh the clean
     */
    private void refreshClean() {
        if (selectedKeyMap.keySet().size() > 0) {
            clean.setUrl("img/icon/actions/clean.gif");
        } else {
            clean.setUrl("img/icon/actions/clean_disabled.gif");
        }
    }

    /**
     * Draws a tag cloud
     */
    private void drawTagCloud() {
        if (dashboardVisible) {
            // Deletes all tag clouds keys
            tagCloud.clear();

            // Show or hides division between tag cloud and results
            flowPanelDivisor.setVisible(selectedKeyMap.size() > 0 || allKeywordList.size() > 0);

            if (selectedKeyMap.size() > 0) {
                tagCloud.calculateFrequencies(relatedKeywordList);
                for (Iterator<GWTKeyword> it = relatedKeywordList.iterator(); it.hasNext();) {
                    final GWTKeyword keyword = it.next();
                    AnchorExtended tagLink = new AnchorExtended(keyword.getKeyword(), true);
                    tagLink.addClickHandler(new ClickHandler() {
                        @Override
                        public void onClick(ClickEvent event) {
                            selectKey(keyword.getKeyword());
                        }
                    });
                    tagLink.setStyleName("okm-cloudTags");
                    int fontSize = tagCloud.getLabelSize(keyword.getFrequency());
                    tagLink.setProperty("fontSize", fontSize + "pt");
                    tagLink.setProperty("color", tagCloud.getColor(fontSize));
                    if (fontSize > 0) {
                        tagLink.setProperty("top", (tagCloud.getMaxFontSize() - fontSize) / 2 + "px");
                    }
                    tagCloud.add(tagLink);
                }
            } else {
                tagCloud.calculateFrequencies(allKeywordList);
                // Sets the maximun an minumum frequencies ( used by document properties tag cloud )
                totalMaxFrequency = tagCloud.getMaxFrequency();
                totalMinFrequency = tagCloud.getMinFrequency();
                for (Iterator<GWTKeyword> it = allKeywordList.iterator(); it.hasNext();) {
                    final GWTKeyword keyword = it.next();
                    AnchorExtended tagLink = new AnchorExtended(keyword.getKeyword(), true);
                    tagLink.addClickHandler(new ClickHandler() {
                        @Override
                        public void onClick(ClickEvent event) {
                            selectKey(keyword.getKeyword());
                        }
                    });
                    tagLink.setStyleName("okm-cloudTags");
                    int fontSize = tagCloud.getLabelSize(keyword.getFrequency());
                    tagLink.setProperty("fontSize", fontSize + "pt");
                    tagLink.setProperty("color", tagCloud.getColor(fontSize));
                    if (fontSize > 0) {
                        tagLink.setProperty("top", (tagCloud.getMaxFontSize() - fontSize) / 2 + "px");
                    }
                    tagCloud.add(tagLink);
                }
            }
        }
    }

    /**
     * Gets the max frequency
     * 
     * @return The max frequency
     */
    public int getTotalMaxFrequency() {
        return totalMaxFrequency;
    }

    /**
     * Get the min frequency
     * 
     * @return The min frequency
     */
    public int getTotalMinFrequency() {
        return totalMinFrequency;
    }

    /**
     * Gets the keyword rate
     * 
     * @param keyword The keywrod
     * 
     * @return The keyword rate
     */
    public int getKeywordRate(String keyword) {
        int rate = 1;
        if (rateMap.keySet().contains((keyword))) {
            rate = Integer.parseInt(rateMap.get(keyword));
        }
        return rate;
    }

    /**
     * Gets the all keywords list
     * 
     * @return All keyword list
     */
    public List<GWTKeyword> getAllKeywordList() {
        return allKeywordList;
    }

    /**
     * Increase the keyword rate with one
     * 
     * @param keyword The keyword to change rate
     */
    public void increaseKeywordRate(String keyword) {
        int rate = 1;
        if (rateMap.keySet().contains((keyword))) {
            rate = Integer.parseInt(rateMap.get(keyword));
            rate++;
        }
        rateMap.put(keyword, "" + rate);
        if (dashboardVisible) {
            keyAllTable.increaseKeywordRate(keyword, true);
            keyTopTable.increaseKeywordRate(keyword, false);
            keyRelatedTable.increaseKeywordRate(keyword, false);
        }
        refreshFrequencies();
        // In case keyword is selected must change results
        if (selectedKeyMap.containsKey(keyword)) {
            controlSearchIn.executeSearch(limit);
            getKeywordMap(getFiltering()); // Gets related keyMap
            refreshClean();
        }
        // We add new keyword in suggest list
        if (!keywordList.contains(keyword)) {
            multiWordSuggestKey.add(keyword);
            keywordList.add(keyword);
        }
    }

    /**
     * Decrease the keyword rate with one
     * 
     * @param keyword The keyword to change rate
     */
    public void decreaseKeywordRate(String keyword) {
        if (rateMap.keySet().contains((keyword))) {
            int rate = Integer.parseInt(rateMap.get(keyword));
            rate--;
            if (rate <= 0) {
                // Case that is needed to remove some keyword is better to refreshing all data to prevent
                // visualization inconsistenses
                if (selectedKeyMap.containsKey(keyword) && dashboardVisible) {
                    selectedKeyPanel.remove((Widget) selectedKeyMap.get(keyword)); // removes selected keyword
                }
                refreshAll();
            } else {
                rateMap.put(keyword, "" + rate);
                if (dashboardVisible) {
                    keyAllTable.decreaseKeywordRate(keyword);
                    keyTopTable.decreaseKeywordRate(keyword);
                    keyRelatedTable.decreaseKeywordRate(keyword);
                }
                refreshFrequencies();

                // In case keyword is selected must change results
                if (selectedKeyMap.containsKey(keyword)) {
                    controlSearchIn.executeSearch(limit);
                    getKeywordMap(getFiltering()); // Gets related keyMap
                    refreshClean();
                }
            }
        }
    }

    /**
     * refreshing the frequencies
     */
    private void refreshFrequencies() {
        if (dashboardVisible) {
            tagCloud.calculateFrequencies(allKeywordList);
        }
        // Sets the maximun an minumum frequencies ( used by document properties tag cloud )
        totalMaxFrequency = tagCloud.getMaxFrequency();
        totalMinFrequency = tagCloud.getMinFrequency();
    }

    /**
     * showTemplates
     */
    public void showTemplates() {
        // removing allcontext and add after
        context.removeItem(posAllContext);
        posTemplates = posAllContext;
        posAllContext++;
        context.addItem(Main.i18n("leftpanel.label.templates"), "");
        context.addItem(Main.i18n("leftpanel.label.all.repository"), "");
        templatesVisible = true;
    }

    /**
     * showPersonal
     */
    public void showPersonal() {
        // removing allcontext and add after
        context.removeItem(posAllContext);
        posPersonal = posAllContext;
        posAllContext++;
        context.addItem(Main.i18n("leftpanel.label.my.documents"), "");
        context.addItem(Main.i18n("leftpanel.label.all.repository"), "");
        personalVisible = true;
    }

    /**
     * showMail
     */
    public void showMail() {
        // removing allcontext and add after
        context.removeItem(posAllContext);
        posMail = posAllContext;
        posAllContext++;
        context.addItem(Main.i18n("leftpanel.label.mail"), "");
        context.addItem(Main.i18n("leftpanel.label.all.repository"), "");
        mailVisible = true;
    }

    /**
     * showPersonal
     */
    public void showTrash() {
        // removing allcontext and add after
        context.removeItem(posAllContext);
        posTrash = posAllContext;
        posAllContext++;
        context.addItem(Main.i18n("leftpanel.label.trash"), "");
        context.addItem(Main.i18n("leftpanel.label.all.repository"), "");
        trashVisible = true;
    }

    /**
     * showStatus
     * 
     * @return
     */
    private boolean showStatus() {
        return (Main.get().mainPanel.topPanel.tabWorkspace.getSelectedWorkspace() == UIDockPanelConstants.DASHBOARD)
                && (Main.get().mainPanel.dashboard.getActualView() == UIDashboardConstants.DASHBOARD_KEYMAP);
    }

    /**
     * setDashboardKeywordsVisible
     * 
     * @param visible
     */
    public void setDashboardKeywordsVisible(boolean visible) {
        dashboardVisible = visible;
    }
}