com.openkm.frontend.client.widget.startup.StartUp.java Source code

Java tutorial

Introduction

Here is the source code for com.openkm.frontend.client.widget.startup.StartUp.java

Source

/**
 * OpenKM, Open Document Management System (http://www.openkm.com)
 * Copyright (c) 2006-2015 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.openkm.frontend.client.widget.startup;

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

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.openkm.extension.frontend.client.Customization;
import com.openkm.frontend.client.Main;
import com.openkm.frontend.client.bean.GWTFolder;
import com.openkm.frontend.client.bean.GWTUserConfig;
import com.openkm.frontend.client.extension.ExtensionManager;
import com.openkm.frontend.client.extension.event.HasWidgetEvent;
import com.openkm.frontend.client.extension.event.handler.WidgetHandlerExtension;
import com.openkm.frontend.client.extension.event.hashandler.HasWidgetHandlerExtension;
import com.openkm.frontend.client.service.OKMAuthService;
import com.openkm.frontend.client.service.OKMAuthServiceAsync;
import com.openkm.frontend.client.service.OKMDocumentService;
import com.openkm.frontend.client.service.OKMDocumentServiceAsync;
import com.openkm.frontend.client.service.OKMFolderService;
import com.openkm.frontend.client.service.OKMFolderServiceAsync;
import com.openkm.frontend.client.service.OKMGeneralService;
import com.openkm.frontend.client.service.OKMGeneralServiceAsync;
import com.openkm.frontend.client.service.OKMRepositoryService;
import com.openkm.frontend.client.service.OKMRepositoryServiceAsync;
import com.openkm.frontend.client.service.OKMUserConfigService;
import com.openkm.frontend.client.service.OKMUserConfigServiceAsync;
import com.openkm.frontend.client.util.CommonUI;
import com.openkm.frontend.client.util.Util;
import com.openkm.frontend.client.widget.OriginPanel;
import com.openkm.frontend.client.widget.mainmenu.Bookmark;

/**
 * @author jllort
 * 
 */
public class StartUp implements HasWidgetHandlerExtension, HasWidgetEvent {
    public static final int STARTUP_STARTING = 0;
    public static final int STARTUP_GET_USER_VALUES = 1;
    public static final int STARTUP_GET_TAXONOMY_ROOT = 2;
    public static final int STARTUP_GET_CATEGORIES_ROOT = 3;
    public static final int STARTUP_GET_METADATA_ROOT = 4;
    public static final int STARTUP_GET_THESAURUS_ROOT = 5;
    public static final int STARTUP_GET_TEMPLATE_ROOT = 6;
    public static final int STARTUP_GET_PERSONAL = 7;
    public static final int STARTUP_GET_MAIL = 8;
    public static final int STARTUP_GET_TRASH = 9;
    public static final int STARTUP_GET_USER_HOME = 10;
    public static final int STARTUP_GET_BOOKMARKS = 11;
    public static final int STARTUP_INIT_TREE_NODES = 12;
    public static final int STARTUP_LOADING_HISTORY_SEARCH = 13;
    public static final int STARTUP_LOADING_TAXONOMY_EVAL_PARAMS = 14;
    public static final int STARTUP_LOADING_OPEN_PATH = 15;

    private final OKMRepositoryServiceAsync repositoryService = (OKMRepositoryServiceAsync) GWT
            .create(OKMRepositoryService.class);
    private final OKMAuthServiceAsync authService = (OKMAuthServiceAsync) GWT.create(OKMAuthService.class);
    private final OKMUserConfigServiceAsync userConfigService = (OKMUserConfigServiceAsync) GWT
            .create(OKMUserConfigService.class);
    private final OKMGeneralServiceAsync generalService = (OKMGeneralServiceAsync) GWT
            .create(OKMGeneralService.class);
    private final OKMFolderServiceAsync folderService = (OKMFolderServiceAsync) GWT.create(OKMFolderService.class);
    private final OKMDocumentServiceAsync documentService = (OKMDocumentServiceAsync) GWT
            .create(OKMDocumentService.class);

    private boolean enabled = true;
    private boolean error = false;
    private int status = -1;
    private String docPath = null;
    private String fldPath = null;
    private String taskInstanceId = null;
    public Timer keepAlive;
    private List<WidgetHandlerExtension> widgetHandlerExtensionList;

    /**
     * StartUp
     */
    public StartUp() {
        widgetHandlerExtensionList = new ArrayList<WidgetHandlerExtension>();
    }

    /**
     * Init on first load
     */
    public void init() {
        generalService.getEnabledExtensions(new AsyncCallback<List<String>>() {
            @Override
            public void onSuccess(List<String> result) {
                Main.get().setExtensionUuidList(result);

                // Only show registered extensions
                ExtensionManager.start(Customization.getExtensionWidgets(result));
                nextStatus(STARTUP_STARTING);
            }

            @Override
            public void onFailure(Throwable caught) {
                Main.get().showError("getEnabledExtensions", caught);
                nextStatus(STARTUP_STARTING);
            }
        });
    }

    /**
     * Gets asynchronous taxonomy root node
     */
    final AsyncCallback<GWTFolder> callbackGetRootFolder = new AsyncCallback<GWTFolder>() {
        public void onSuccess(GWTFolder result) {
            // Only executes on initialization and evaluate root Node permissions
            Main.get().taxonomyRootFolder = result;
            nextStatus(STARTUP_GET_CATEGORIES_ROOT);
        }

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

    /**
     * Gets asynchronous template root node
     */
    final AsyncCallback<GWTFolder> callbackGetTemplatesFolder = new AsyncCallback<GWTFolder>() {
        public void onSuccess(GWTFolder result) {
            // Only executes on initialization
            Main.get().templatesRootFolder = result;
            nextStatus(STARTUP_GET_PERSONAL);
        }

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

    /**
     * Gets asynchronous mail root node
     */
    final AsyncCallback<GWTFolder> callbackGetMailFolder = new AsyncCallback<GWTFolder>() {
        public void onSuccess(GWTFolder result) {
            // Only executes on initialization
            Main.get().mailRootFolder = result;
            nextStatus(STARTUP_GET_TRASH);
        }

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

    /**
     * Gets asynchronous thesaurus root node
     */
    final AsyncCallback<GWTFolder> callbackGetThesaurusFolder = new AsyncCallback<GWTFolder>() {
        public void onSuccess(GWTFolder result) {
            // Only executes on initialization
            Main.get().thesaurusRootFolder = result;
            nextStatus(STARTUP_GET_TEMPLATE_ROOT);
        }

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

    /**
     * Gets asynchronous categories root node
     */
    final AsyncCallback<GWTFolder> callbackGetCategoriesFolder = new AsyncCallback<GWTFolder>() {
        public void onSuccess(GWTFolder result) {
            // Only executes on initialization
            Main.get().categoriesRootFolder = result;
            nextStatus(STARTUP_GET_METADATA_ROOT);
        }

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

    /**
     * Gets asynchronous metadata root node
     */
    final AsyncCallback<GWTFolder> callbackGetMetadataFolder = new AsyncCallback<GWTFolder>() {
        public void onSuccess(GWTFolder result) {
            // Only executes on initialization
            Main.get().metadataRootFolder = result;
            nextStatus(STARTUP_GET_THESAURUS_ROOT);
        }

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

    /**
     * Callback get user home
     */
    final AsyncCallback<GWTUserConfig> callbackGetUserHome = new AsyncCallback<GWTUserConfig>() {
        public void onSuccess(GWTUserConfig result) {
            Main.get().userHome = result;
            nextStatus(STARTUP_GET_BOOKMARKS);
        }

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

    /**
     * Gets asynchronous personal documents node
     */
    final AsyncCallback<GWTFolder> callbackGetPersonalFolder = new AsyncCallback<GWTFolder>() {
        public void onSuccess(GWTFolder result) {
            Main.get().personalRootFolder = result;
            nextStatus(STARTUP_GET_MAIL);
        }

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

    /**
     * Gets asynchronous trash node
     */
    final AsyncCallback<GWTFolder> callbackGetTrashFolder = new AsyncCallback<GWTFolder>() {
        public void onSuccess(GWTFolder result) {
            Main.get().trashRootFolder = result;
            nextStatus(STARTUP_GET_USER_HOME);
        }

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

    /**
     * Call back add new granted user
     */
    final AsyncCallback<Object> callbackKeepAlive = new AsyncCallback<Object>() {
        public void onSuccess(Object result) {
        }

        public void onFailure(Throwable caught) {
            Main.get().mainPanel.bottomPanel.setStatus("status.keep.alive.error", true);
        }
    };

    /**
     * Gets asynchronous to add a group
     */
    final AsyncCallback<Map<String, String>> callbackGetPropertyGroupTranslations = new AsyncCallback<Map<String, String>>() {
        public void onSuccess(Map<String, String> result) {
            Main.get().hPropertyGroupI18n = result;

        }

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

    /**
     * Gets the trash
     */
    public void getTrash() {
        repositoryService.getTrashFolder(callbackGetTrashFolder);
    }

    /**
     * Gets the personal documents
     */
    public void getPersonal() {
        repositoryService.getPersonalFolder(callbackGetPersonalFolder);
    }

    /**
     * Gets the user home
     * 
     */
    public void getUserHome() {
        userConfigService.getUserHome(callbackGetUserHome);
    }

    /**
     * Gets the template
     */
    public void getTemplate() {
        repositoryService.getTemplatesFolder(callbackGetTemplatesFolder);
    }

    /**
     * Gets the mail
     */
    public void getMail() {
        repositoryService.getMailFolder(callbackGetMailFolder);
    }

    /**
     * Gets the thesaurus
     */
    public void getThesaurus() {
        repositoryService.getThesaurusFolder(callbackGetThesaurusFolder);
    }

    /**
     * getCategories
     */
    public void getCategories() {
        repositoryService.getCategoriesFolder(callbackGetCategoriesFolder);
    }

    /**
     * getCategories
     */
    public void getMetadata() {
        repositoryService.getMetadataFolder(callbackGetMetadataFolder);
    }

    /**
     * Gets the taxonomy
     */
    public void getRoot() {
        repositoryService.getRootFolder(callbackGetRootFolder);
    }

    /**
     * startKeepAlive
     */
    public void startKeepAlive(double scheduleTime) {
        // KeepAlieve thread
        keepAlive = new Timer() {
            public void run() {
                authService.keepAlive(callbackKeepAlive);
            }
        };

        keepAlive.scheduleRepeating(new Double(scheduleTime).intValue()); // 15 min
    }

    /**
     * Opens a document destination passed by url parameter
     */
    private void openDocumentByBrowserURLParam() {
        fldPath = Main.get().fldPath;
        docPath = Main.get().docPath;
        taskInstanceId = Main.get().taskInstanceId;
        // Always reset variables
        Main.get().docPath = null;
        Main.get().fldPath = null;
        Main.get().taskInstanceId = null;

        // Simulate we pass params by broser ( take a look really are not passed )
        // to show user home on loading
        if (fldPath == null || fldPath.equals("")) {
            if (Main.get().userHome.getHomeType().equals(Bookmark.BOOKMARK_DOCUMENT)) {
                docPath = Main.get().userHome.getHomePath();
                fldPath = Util.getParent(Main.get().userHome.getHomePath());
            } else if (Main.get().userHome.getHomeType().equals(Bookmark.BOOKMARK_FOLDER)) {
                fldPath = Main.get().userHome.getHomePath();
            }
        }

        // Evaluating if path is visible by profile, othercase change default root
        if (docPath != null && !docPath.equals("")) {
            if (!CommonUI.isVisiblePathByProfile(docPath)) {
                fldPath = CommonUI.getRealVisiblePathByProfile(docPath); // Will get default root in first visible stack
                docPath = null;
            }
        } else if (fldPath != null && !fldPath.equals("")) {
            if (!CommonUI.isVisiblePathByProfile(fldPath)) {
                fldPath = CommonUI.getRealVisiblePathByProfile(fldPath); // Will get default root in first visible stack
            }
        }

        if (docPath != null && !docPath.equals("")) {
            documentService.isValid(docPath, new AsyncCallback<Boolean>() {
                @Override
                public void onSuccess(Boolean result) {
                    if (result.booleanValue()) {
                        // Opens folder passed by parameter
                        CommonUI.openPath(fldPath, docPath);
                    } else {
                        CommonUI.openPath(CommonUI.getDefaultRootPathByProfile(), "");
                    }
                    CommonUI.openUserTaskInstance(taskInstanceId); // Always trying opening taskInstance
                    Main.get().startUp.nextStatus(StartUp.STARTUP_LOADING_OPEN_PATH);
                }

                @Override
                public void onFailure(Throwable caught) {
                    Main.get().showError("isValid", caught);
                    CommonUI.openPath(CommonUI.getDefaultRootPathByProfile(), "");
                    CommonUI.openUserTaskInstance(taskInstanceId); // Always trying opening taskInstance
                    Main.get().startUp.nextStatus(StartUp.STARTUP_LOADING_OPEN_PATH);
                }
            });
        } else if (fldPath != null && !fldPath.equals("")) {
            folderService.isValid(fldPath, new AsyncCallback<Boolean>() {
                @Override
                public void onSuccess(Boolean result) {
                    if (result.booleanValue()) {
                        boolean isRoot = Util.isRoot(fldPath);
                        if (!isRoot) {
                            // Opens folder passed by parameter ( if is not root then opening fldPaht will refreshing toolbar and other panel values )
                            CommonUI.openPath(fldPath, "");
                            CommonUI.openUserTaskInstance(taskInstanceId); // Always trying opening taskInstance
                            Main.get().startUp.nextStatus(StartUp.STARTUP_LOADING_OPEN_PATH);
                        } else {
                            folderService.getProperties(fldPath, new AsyncCallback<GWTFolder>() {
                                @Override
                                public void onSuccess(final GWTFolder result) {
                                    folderService.getProperties(fldPath, new AsyncCallback<GWTFolder>() {
                                        @Override
                                        public void onSuccess(GWTFolder parent) {
                                            Main.get().mainPanel.topPanel.toolBar.checkToolButtonPermissions(result,
                                                    parent, OriginPanel.TREE_ROOT);
                                            Main.get().mainPanel.desktop.browser.tabMultiple.tabFolder
                                                    .setProperties(result);

                                            // Opens folder passed by parameter
                                            CommonUI.openPath(fldPath, "");
                                            CommonUI.openUserTaskInstance(taskInstanceId); // Always trying opening taskInstance
                                            Main.get().startUp.nextStatus(StartUp.STARTUP_LOADING_OPEN_PATH);
                                        }

                                        @Override
                                        public void onFailure(Throwable caught) {
                                            Main.get().showError("getProperties", caught);
                                            CommonUI.openPath(fldPath, "");
                                            CommonUI.openUserTaskInstance(taskInstanceId); // Always trying opening taskInstance
                                            Main.get().startUp.nextStatus(StartUp.STARTUP_LOADING_OPEN_PATH);
                                        }
                                    });
                                }

                                @Override
                                public void onFailure(Throwable caught) {
                                    Main.get().showError("getProperties", caught);
                                    CommonUI.openPath(fldPath, "");
                                    CommonUI.openUserTaskInstance(taskInstanceId); // Always trying opening taskInstance
                                    Main.get().startUp.nextStatus(StartUp.STARTUP_LOADING_OPEN_PATH);
                                }
                            });
                        }
                    } else {
                        CommonUI.openPath(CommonUI.getDefaultRootPathByProfile(), "");
                        CommonUI.openUserTaskInstance(taskInstanceId); // Always trying opening taskInstance
                        Main.get().startUp.nextStatus(StartUp.STARTUP_LOADING_OPEN_PATH);
                    }
                }

                public void onFailure(Throwable caught) {
                    Main.get().showError("isValid", caught);
                    CommonUI.openPath(CommonUI.getDefaultRootPathByProfile(), "");
                    CommonUI.openUserTaskInstance(taskInstanceId); // Always trying opening taskInstance
                    Main.get().startUp.nextStatus(StartUp.STARTUP_LOADING_OPEN_PATH);
                }
            });
        } else {
            CommonUI.openPath(CommonUI.getDefaultRootPathByProfile(), "");
            CommonUI.openUserTaskInstance(taskInstanceId); // Always trying opening taskInstance
            Main.get().startUp.nextStatus(StartUp.STARTUP_LOADING_OPEN_PATH);
        }
    }

    /**
     * Sets the next status
     * 
     * @param status The new status
     */
    public void nextStatus(int status) {
        if (enabled) {
            // Status is always incremental
            if (this.status < status) {
                this.status = status;

                switch (status) {
                case STARTUP_STARTING:
                    Main.get().startUpPopup.addStatus(Main.i18n("startup.starting.loading"), STARTUP_STARTING);
                    nextStatus(STARTUP_GET_USER_VALUES);
                    break;

                case STARTUP_GET_USER_VALUES:
                    Main.get().startUpPopup.addStatus(Main.i18n("startup.loading.user.values"),
                            STARTUP_GET_USER_VALUES);
                    Main.get().workspaceUserProperties.init();
                    break;

                case STARTUP_GET_TAXONOMY_ROOT:
                    if (Main.get().workspaceUserProperties.getWorkspace().isStackTaxonomy()) {
                        Main.get().startUpPopup.addStatus(Main.i18n("startup.taxonomy"), STARTUP_GET_TAXONOMY_ROOT);
                        getRoot();
                    } else {
                        Main.get().startUpPopup.jumpActual();
                        nextStatus(STARTUP_GET_CATEGORIES_ROOT);
                    }
                    break;

                case STARTUP_GET_CATEGORIES_ROOT:
                    if (Main.get().workspaceUserProperties.getWorkspace().isStackCategoriesVisible()) {
                        Main.get().startUpPopup.addStatus(Main.i18n("startup.categories"),
                                STARTUP_GET_CATEGORIES_ROOT);
                        getCategories();
                    } else {
                        Main.get().startUpPopup.jumpActual();
                        nextStatus(STARTUP_GET_METADATA_ROOT);
                    }
                    break;

                case STARTUP_GET_METADATA_ROOT:
                    if (Main.get().workspaceUserProperties.getWorkspace().isStackMetadataVisible()) {
                        Main.get().startUpPopup.addStatus(Main.i18n("startup.metadata"), STARTUP_GET_METADATA_ROOT);
                        getMetadata();
                    } else {
                        Main.get().startUpPopup.jumpActual();
                        nextStatus(STARTUP_GET_THESAURUS_ROOT);
                    }
                    break;

                case STARTUP_GET_THESAURUS_ROOT:
                    if (Main.get().workspaceUserProperties.getWorkspace().isStackThesaurusVisible()) {
                        Main.get().startUpPopup.addStatus(Main.i18n("startup.thesaurus"),
                                STARTUP_GET_THESAURUS_ROOT);
                        getThesaurus();
                    } else {
                        Main.get().startUpPopup.jumpActual();
                        nextStatus(STARTUP_GET_TEMPLATE_ROOT);
                    }
                    break;

                case STARTUP_GET_TEMPLATE_ROOT:
                    if (Main.get().workspaceUserProperties.getWorkspace().isStackTemplatesVisible()) {
                        Main.get().startUpPopup.addStatus(Main.i18n("startup.template"), STARTUP_GET_TEMPLATE_ROOT);
                        getTemplate();
                    } else {
                        Main.get().startUpPopup.jumpActual();
                        nextStatus(STARTUP_GET_PERSONAL);
                    }
                    break;

                case STARTUP_GET_PERSONAL:
                    if (Main.get().workspaceUserProperties.getWorkspace().isStackPersonalVisible()) {
                        Main.get().startUpPopup.addStatus(Main.i18n("startup.personal"), STARTUP_GET_PERSONAL);
                        getPersonal();
                    } else {
                        Main.get().startUpPopup.jumpActual();
                        nextStatus(STARTUP_GET_MAIL);
                    }
                    break;

                case STARTUP_GET_MAIL:
                    if (Main.get().workspaceUserProperties.getWorkspace().isStackMailVisible()) {
                        Main.get().startUpPopup.addStatus(Main.i18n("startup.mail"), STARTUP_GET_MAIL);
                        getMail();
                    } else {
                        Main.get().startUpPopup.jumpActual();
                        nextStatus(STARTUP_GET_TRASH);
                    }
                    break;

                case STARTUP_GET_TRASH:
                    if (Main.get().workspaceUserProperties.getWorkspace().isStackTrashVisible()) {
                        Main.get().startUpPopup.addStatus(Main.i18n("startup.trash"), STARTUP_GET_TRASH);
                        getTrash();
                    } else {
                        Main.get().startUpPopup.jumpActual();
                        nextStatus(STARTUP_GET_USER_HOME);
                    }
                    break;

                case STARTUP_GET_USER_HOME:
                    // Operations to be done after loading stacks
                    if (Main.get().workspaceUserProperties.getWorkspace().isStackTaxonomy()) {
                        Main.get().activeFolderTree = Main.get().mainPanel.desktop.navigator.taxonomyTree;
                    } else if (Main.get().workspaceUserProperties.getWorkspace().isStackCategoriesVisible()) {
                        Main.get().activeFolderTree = Main.get().mainPanel.desktop.navigator.categoriesTree;
                    } else if (Main.get().workspaceUserProperties.getWorkspace().isStackMetadataVisible()) {
                        Main.get().activeFolderTree = Main.get().mainPanel.desktop.navigator.metadataTree;
                    } else if (Main.get().workspaceUserProperties.getWorkspace().isStackThesaurusVisible()) {
                        Main.get().activeFolderTree = Main.get().mainPanel.desktop.navigator.thesaurusTree;
                    } else if (Main.get().workspaceUserProperties.getWorkspace().isStackTemplatesVisible()) {
                        Main.get().activeFolderTree = Main.get().mainPanel.desktop.navigator.templateTree;
                    } else if (Main.get().workspaceUserProperties.getWorkspace().isStackPersonalVisible()) {
                        Main.get().activeFolderTree = Main.get().mainPanel.desktop.navigator.personalTree;
                    } else if (Main.get().workspaceUserProperties.getWorkspace().isStackMailVisible()) {
                        Main.get().activeFolderTree = Main.get().mainPanel.desktop.navigator.mailTree;
                    } else if (Main.get().workspaceUserProperties.getWorkspace().isStackTrashVisible()) {
                        Main.get().activeFolderTree = Main.get().mainPanel.desktop.navigator.trashTree;
                    }
                    Main.get().mainPanel.desktop.browser.fileBrowser.table.fillWidth(); // Sets de columns size
                    Main.get().mainPanel.desktop.browser.tabMultiple.tabDocument.init();
                    Main.get().mainPanel.desktop.browser.tabMultiple.tabFolder.init();
                    Main.get().mainPanel.desktop.browser.tabMultiple.tabMail.init();
                    Main.get().startUpPopup.addStatus(Main.i18n("startup.user.home"), STARTUP_GET_USER_HOME);
                    getUserHome();
                    break;

                case STARTUP_GET_BOOKMARKS:
                    Main.get().startUpPopup.addStatus(Main.i18n("startup.bookmarks"), STARTUP_GET_BOOKMARKS);

                    // Initialize bookmarks
                    Main.get().mainPanel.topPanel.mainMenu.bookmark.getAll();

                    // Initialize tab multiple
                    Main.get().mainPanel.desktop.browser.tabMultiple.init();
                    break;

                case STARTUP_INIT_TREE_NODES:
                    Main.get().startUpPopup.addStatus(Main.i18n("startup.init.tree.nodes"),
                            STARTUP_INIT_TREE_NODES);
                    if (Main.get().workspaceUserProperties.getWorkspace().isStackTaxonomy()) {
                        Main.get().mainPanel.desktop.navigator.taxonomyTree.init();
                    }
                    if (Main.get().workspaceUserProperties.getWorkspace().isStackCategoriesVisible()) {
                        Main.get().mainPanel.desktop.navigator.categoriesTree.init();
                    }
                    if (Main.get().workspaceUserProperties.getWorkspace().isStackMetadataVisible()) {
                        Main.get().mainPanel.desktop.navigator.metadataTree.init();
                    }
                    if (Main.get().workspaceUserProperties.getWorkspace().isStackThesaurusVisible()) {
                        Main.get().mainPanel.desktop.navigator.thesaurusTree.init();
                    }
                    if (Main.get().workspaceUserProperties.getWorkspace().isStackTemplatesVisible()) {
                        Main.get().mainPanel.desktop.navigator.templateTree.init();
                    }
                    if (Main.get().workspaceUserProperties.getWorkspace().isStackPersonalVisible()) {
                        Main.get().mainPanel.desktop.navigator.personalTree.init();
                    }
                    if (Main.get().workspaceUserProperties.getWorkspace().isStackMailVisible()) {
                        Main.get().mainPanel.desktop.navigator.mailTree.init();
                    }
                    if (Main.get().workspaceUserProperties.getWorkspace().isStackTrashVisible()) {
                        Main.get().mainPanel.desktop.navigator.trashTree.init();
                    }
                    Main.get().startUp.nextStatus(StartUp.STARTUP_LOADING_HISTORY_SEARCH);
                    break;

                case STARTUP_LOADING_HISTORY_SEARCH:
                    Main.get().startUpPopup.addStatus(Main.i18n("startup.loading.history.search"),
                            STARTUP_LOADING_HISTORY_SEARCH);

                    // Initialize history saved
                    Main.get().mainPanel.search.historySearch.searchSaved.init();

                    Main.get().mainPanel.search.historySearch.userNews.init();
                    Main.get().mainPanel.setVisible(true);

                    // Some actions ( menus / etc. ) must be set at ends startup
                    // After init widget methods ares all yet finished
                    Main.get().workspaceUserProperties.setAvailableAction();

                    Main.get().startUp.nextStatus(StartUp.STARTUP_LOADING_TAXONOMY_EVAL_PARAMS);
                    break;

                case STARTUP_LOADING_TAXONOMY_EVAL_PARAMS:
                    Main.get().startUpPopup.addStatus(Main.i18n("startup.loading.taxonomy.eval.params"),
                            STARTUP_LOADING_TAXONOMY_EVAL_PARAMS);
                    openDocumentByBrowserURLParam();
                    break;

                case STARTUP_LOADING_OPEN_PATH:
                    Main.get().startUpPopup.addStatus(Main.i18n("startup.loading.taxonomy.open.path"),
                            STARTUP_LOADING_OPEN_PATH);
                    enabled = false;
                    Main.get().mainPanel.search.setLoadFinish();

                    fireEvent(HasWidgetEvent.FINISH_STARTUP);

                    if (!error) {
                        Main.get().startUpPopup.hide();
                    }

                    if (Util.getUserAgent().startsWith("ie")) {
                        Timer timer = new Timer() {
                            @Override
                            public void run() {
                                Main.get().mainPanel.desktop.browser.tabMultiple.tabFolder.correctIEDefect();
                                Main.get().mainPanel.desktop.browser.tabMultiple.tabDocument.correctIEDefect();
                                Main.get().mainPanel.desktop.browser.tabMultiple.tabMail.correctIEDefect();
                            }
                        };
                        timer.schedule(500);
                    }
                    break;
                }
            }
        }
    }

    /**
     * Disable
     */
    public void disable() {
        enabled = false;
    }

    /**
     * Tries to recover after an error
     */
    public void recoverFromError() {
        error = true;
        Main.get().startUpPopup.button.setVisible(true);

        if (status < STARTUP_LOADING_OPEN_PATH) {
            // This range are sequential calls
            if (status < STARTUP_INIT_TREE_NODES) {
                nextStatus(status + 1); // Tries to execute next initializing
            } else {
                nextStatus(status + 1); // Tries to execute next initializing
            }
        } else {
            enabled = false;
        }
    }

    public String getStatusMsg(int status) {
        String msg = "";

        switch (status) {
        case STARTUP_STARTING:
            msg = Main.i18n("startup.starting.loading");
            break;

        case STARTUP_GET_USER_VALUES:
            msg = Main.i18n("startup.loading.user.values");
            break;

        case STARTUP_GET_TAXONOMY_ROOT:
            msg = Main.i18n("startup.taxonomy");
            break;

        case STARTUP_GET_CATEGORIES_ROOT:
            msg = Main.i18n("startup.categories");
            break;

        case STARTUP_GET_THESAURUS_ROOT:
            msg = Main.i18n("startup.thesaurus");
            break;

        case STARTUP_GET_TEMPLATE_ROOT:
            msg = Main.i18n("startup.template");
            break;

        case STARTUP_GET_PERSONAL:
            msg = Main.i18n("startup.personal");
            break;

        case STARTUP_GET_MAIL:
            msg = Main.i18n("startup.mail");
            break;

        case STARTUP_GET_TRASH:
            msg = Main.i18n("startup.trash");
            break;

        case STARTUP_GET_USER_HOME:
            msg = Main.i18n("startup.user.home");
            getUserHome();
            break;

        case STARTUP_GET_BOOKMARKS:
            msg = Main.i18n("startup.bookmarks");
            break;

        case STARTUP_INIT_TREE_NODES:
            msg = Main.i18n("startup.loading.taxonomy");
            break;

        case STARTUP_LOADING_HISTORY_SEARCH:
            msg = Main.i18n("startup.loading.history.search");
            break;

        case STARTUP_LOADING_TAXONOMY_EVAL_PARAMS:
            msg = Main.i18n("startup.loading.taxonomy.eval.params");
            break;

        case STARTUP_LOADING_OPEN_PATH:
            msg = Main.i18n("startup.loading.taxonomy.open.path");
            break;
        }

        return msg;
    }

    /**
     * getStatus
     */
    public int getStatus() {
        return status;
    }

    @Override
    public void addWidgetHandlerExtension(WidgetHandlerExtension handlerExtension) {
        widgetHandlerExtensionList.add(handlerExtension);
    }

    @Override
    public void fireEvent(WidgetEventConstant event) {
        for (WidgetHandlerExtension handlerExtension : widgetHandlerExtensionList) {
            handlerExtension.onChange(event);
        }
    }
}