/* * DBeaver - Universal Database Manager * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) * * 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. */ package org.jkiss.dbeaver.core.application; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.dialogs.MessageDialogWithToggle; import org.eclipse.jface.dialogs.TrayDialog; import org.eclipse.jface.preference.PreferenceManager; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.ui.*; import org.eclipse.ui.application.IWorkbenchConfigurer; import org.eclipse.ui.application.IWorkbenchWindowConfigurer; import org.eclipse.ui.application.WorkbenchAdvisor; import org.eclipse.ui.application.WorkbenchWindowAdvisor; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin; import org.jkiss.dbeaver.DBeaverPreferences; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.core.application.update.DBeaverVersionChecker; import org.jkiss.dbeaver.registry.DataSourceDescriptor; import org.jkiss.dbeaver.registry.DataSourceRegistry; import org.jkiss.dbeaver.ui.actions.datasource.DataSourceHandler; import org.jkiss.dbeaver.ui.dialogs.ConfirmationDialog; import org.jkiss.dbeaver.ui.editors.content.ContentEditorInput; import org.osgi.framework.Bundle; import java.net.URL; /** * This workbench advisor creates the window advisor, and specifies * the perspective id for the initial window. */ public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor { private static final Log log = Log.getLog(ApplicationWorkbenchAdvisor.class); private static final String PERSPECTIVE_ID = "org.jkiss.dbeaver.core.perspective"; //$NON-NLS-1$ public static final String DBEAVER_SCHEME_NAME = "org.jkiss.dbeaver.defaultKeyScheme"; //$NON-NLS-1$ private static final String WORKBENCH_PREF_PAGE_ID = "org.eclipse.ui.preferencePages.Workbench"; private static final String APPEARANCE_PREF_PAGE_ID = "org.eclipse.ui.preferencePages.Views"; private static final String[] EXCLUDE_PREF_PAGES = { WORKBENCH_PREF_PAGE_ID + "/org.eclipse.ui.preferencePages.Globalization", WORKBENCH_PREF_PAGE_ID + "/org.eclipse.ui.preferencePages.Perspectives", //"org.eclipse.ui.preferencePages.FileEditors", WORKBENCH_PREF_PAGE_ID + "/" + APPEARANCE_PREF_PAGE_ID + "/org.eclipse.ui.preferencePages.Decorators", WORKBENCH_PREF_PAGE_ID + "/org.eclipse.ui.preferencePages.Workspace", WORKBENCH_PREF_PAGE_ID + "/org.eclipse.ui.preferencePages.ContentTypes", WORKBENCH_PREF_PAGE_ID + "/org.eclipse.ui.preferencePages.Startup" }; @Override public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) { return new ApplicationWorkbenchWindowAdvisor(configurer); } @Override public String getInitialWindowPerspectiveId() { return PERSPECTIVE_ID; } @Override public void initialize(IWorkbenchConfigurer configurer) { super.initialize(configurer); // make sure we always save and restore workspace state configurer.setSaveAndRestore(true); // register workspace IDE adapters IDE.registerAdapters(); declareWorkbenchImages(configurer); TrayDialog.setDialogHelpAvailable(true); } /** * This is a bit hacky. Copied from IDEWorkbenchAdvisor. * Adds standard Eclipse icons mappings */ private void declareWorkbenchImages(IWorkbenchConfigurer configurer) { Bundle ideBundle = Platform.getBundle(IDEWorkbenchPlugin.IDE_WORKBENCH); final String ICONS_PATH = "$nl$/icons/full/";//$NON-NLS-1$ final String PATH_OBJECT = ICONS_PATH + "obj16/"; // Model object //$NON-NLS-1$ declareWorkbenchImage(configurer, ideBundle, IDE.SharedImages.IMG_OBJ_PROJECT, PATH_OBJECT + "prj_obj.png", true); //$NON-NLS-1$ } private void declareWorkbenchImage(IWorkbenchConfigurer configurer, Bundle ideBundle, String symbolicName, String path, boolean shared) { URL url = FileLocator.find(ideBundle, new Path(path), null); ImageDescriptor desc = ImageDescriptor.createFromURL(url); configurer.declareImage(symbolicName, desc, shared); } @Override public void preStartup() { super.preStartup(); } @Override public void postStartup() { super.postStartup(); // Remove unneeded pref pages PreferenceManager pm = PlatformUI.getWorkbench().getPreferenceManager(); for (String epp : EXCLUDE_PREF_PAGES) { pm.remove(epp); } startVersionChecker(); } private void startVersionChecker() { DBeaverVersionChecker checker = new DBeaverVersionChecker(false); checker.schedule(3000); } @Override public boolean preShutdown() { if (!saveAndCleanup()) { // User rejected to exit return false; } else { return super.preShutdown(); } } @Override public void postShutdown() { super.postShutdown(); } private boolean saveAndCleanup() { try { IWorkbenchWindow window = getWorkbenchConfigurer().getWorkbench().getActiveWorkbenchWindow(); if (window != null) { if (!MessageDialogWithToggle.NEVER.equals(ConfirmationDialog.getSavedPreference(DBeaverPreferences.CONFIRM_EXIT))) { // Workaround of #703 bug. NEVER doesn't make sense for Exit confirmation. It is the same as ALWAYS. if (!ConfirmationDialog.confirmAction(window.getShell(), DBeaverPreferences.CONFIRM_EXIT)) { return false; } } // Close al content editors // They are locks resources which are shared between other editors // So we need to close em first IWorkbenchPage workbenchPage = window.getActivePage(); IEditorReference[] editors = workbenchPage.getEditorReferences(); for (IEditorReference editor : editors) { IEditorPart editorPart = editor.getEditor(false); if (editorPart != null && editorPart.getEditorInput() instanceof ContentEditorInput) { workbenchPage.closeEditor(editorPart, false); } } } return closeActiveTransactions(); } catch (Throwable e) { e.printStackTrace(); return true; } } private boolean closeActiveTransactions() { for (DataSourceDescriptor dataSourceDescriptor : DataSourceRegistry.getAllDataSources()) { if (!DataSourceHandler.checkAndCloseActiveTransaction(dataSourceDescriptor)) { return false; } } return true; } public void eventLoopException(Throwable exception) { super.eventLoopException(exception); log.error("Event loop exception", exception); } }