org.jkiss.dbeaver.ui.controls.resultset.panel.grouping.GroupingPanel.java Source code

Java tutorial

Introduction

Here is the source code for org.jkiss.dbeaver.ui.controls.resultset.panel.grouping.GroupingPanel.java

Source

/*
 * DBeaver - Universal Database Manager
 * Copyright (C) 2010-2018 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.ui.controls.resultset.panel.grouping;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IContributionManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.ISharedImages;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.core.CoreMessages;
import org.jkiss.dbeaver.model.DBPEvaluationContext;
import org.jkiss.dbeaver.model.data.DBDAttributeBinding;
import org.jkiss.dbeaver.runtime.ui.DBUserInterface;
import org.jkiss.dbeaver.ui.DBeaverIcons;
import org.jkiss.dbeaver.ui.UIIcon;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.controls.resultset.*;
import org.jkiss.utils.CommonUtils;

import java.util.Collections;
import java.util.List;

/**
 * RSV grouping panel
 */
public class GroupingPanel implements IResultSetPanel {

    //private static final Log log = Log.getLog(GroupingPanel.class);

    public static final String PANEL_ID = "results-grouping";

    public static final String SETTINGS_SECTION_GROUPING = "panel-" + PANEL_ID;

    private IResultSetPresentation presentation;
    private IDialogSettings panelSettings;

    private GroupingResultsContainer resultsContainer;

    public GroupingPanel() {
    }

    @Override
    public Control createContents(final IResultSetPresentation presentation, Composite parent) {
        this.presentation = presentation;
        this.panelSettings = ResultSetUtils.getViewerSettings(SETTINGS_SECTION_GROUPING);

        loadSettings();

        this.resultsContainer = new GroupingResultsContainer(parent, presentation);

        IResultSetController groupingViewer = this.resultsContainer.getResultSetController();

        IResultSetListener ownerListener = new ResultSetListenerAdapter() {
            String prevQueryText = null;

            @Override
            public void handleResultSetLoad() {
                // Here we can refresh grouping (makes sense if source query was modified with some conditions)
                // Or just clear it (if brand new query was executed)
                String queryText = presentation.getController().getDataContainer().getName();
                if (prevQueryText != null && !CommonUtils.equalObjects(prevQueryText, queryText)) {
                    resultsContainer.clearGrouping();
                } else {
                    try {
                        resultsContainer.rebuildGrouping();
                    } catch (DBException e) {
                        DBUserInterface.getInstance().showError("Grouping error", "Can't refresh grouping query",
                                e);
                    }
                }
                prevQueryText = queryText;
            }
        };

        this.presentation.getController().addListener(ownerListener);
        groupingViewer.getControl()
                .addDisposeListener(e -> this.presentation.getController().removeListener(ownerListener));

        IResultSetListener groupingResultsListener = new ResultSetListenerAdapter() {
            @Override
            public void handleResultSetLoad() {
                updateControls();
            }

            @Override
            public void handleResultSetSelectionChange(SelectionChangedEvent event) {
                updateControls();
            }
        };
        groupingViewer.addListener(groupingResultsListener);

        return groupingViewer.getControl();
    }

    @Override
    public boolean isDirty() {
        return !resultsContainer.getGroupAttributes().isEmpty();
    }

    private void updateControls() {
        // Update panel toolbar
        this.presentation.getController().updatePanelActions();
    }

    private void loadSettings() {
        IDialogSettings functionsSection = panelSettings.getSection("groups");
    }

    private void saveSettings() {
        IDialogSettings functionsSection = UIUtils.getSettingsSection(panelSettings, "groups");
    }

    @Override
    public void activatePanel() {
        refresh(false);
    }

    @Override
    public void deactivatePanel() {

    }

    @Override
    public void refresh(boolean force) {
    }

    @Override
    public void contributeActions(ToolBarManager manager) {
        fillToolBar(manager);
    }

    private void fillToolBar(IContributionManager contributionManager) {
        contributionManager.add(new EditColumnsAction(resultsContainer));
        contributionManager.add(new Separator());
        contributionManager.add(new DeleteColumnAction(resultsContainer));
        contributionManager.add(new ClearGroupingAction(resultsContainer));
    }

    abstract static class GroupingAction extends Action {
        protected final GroupingResultsContainer resultsContainer;

        public GroupingAction(GroupingResultsContainer resultsContainer, String text, ImageDescriptor image) {
            super(text, image);
            this.resultsContainer = resultsContainer;
        }
    }

    static class EditColumnsAction extends GroupingAction {
        public EditColumnsAction(GroupingResultsContainer resultsContainer) {
            super(resultsContainer, CoreMessages.controls_resultset_grouping_edit,
                    DBeaverIcons.getImageDescriptor(UIIcon.OBJ_ADD));
        }

        @Override
        public void run() {
            GroupingConfigDialog dialog = new GroupingConfigDialog(
                    resultsContainer.getResultSetController().getControl().getShell(), resultsContainer);
            if (dialog.open() == IDialogConstants.OK_ID) {
                try {
                    resultsContainer.rebuildGrouping();
                } catch (DBException e) {
                    DBUserInterface.getInstance().showError("Grouping error", "Can't change grouping settings", e);
                }
            }
        }
    }

    static class DeleteColumnAction extends GroupingAction {
        public DeleteColumnAction(GroupingResultsContainer resultsContainer) {
            super(resultsContainer, CoreMessages.controls_resultset_grouping_remove_column,
                    DBeaverIcons.getImageDescriptor(UIIcon.ACTION_OBJECT_DELETE));
        }

        @Override
        public boolean isEnabled() {
            return !resultsContainer.getResultSetController().getSelection().isEmpty();
        }

        @Override
        public void run() {
            DBDAttributeBinding currentAttribute = resultsContainer.getResultSetController().getActivePresentation()
                    .getCurrentAttribute();
            if (currentAttribute != null) {
                List<String> attributes = Collections
                        .singletonList(currentAttribute.getFullyQualifiedName(DBPEvaluationContext.UI));
                if (resultsContainer.removeGroupingAttribute(attributes)
                        || resultsContainer.removeGroupingFunction(attributes)) {
                    try {
                        resultsContainer.rebuildGrouping();
                    } catch (DBException e) {
                        DBUserInterface.getInstance().showError("Grouping error", "Can't change grouping query", e);
                    }
                }
            }
        }
    }

    static class ClearGroupingAction extends GroupingAction {
        public ClearGroupingAction(GroupingResultsContainer resultsContainer) {
            super(resultsContainer, CoreMessages.controls_resultset_grouping_clear,
                    UIUtils.getShardImageDescriptor(ISharedImages.IMG_ETOOL_CLEAR));
        }

        @Override
        public boolean isEnabled() {
            return !resultsContainer.getGroupAttributes().isEmpty();
        }

        @Override
        public void run() {
            resultsContainer.clearGrouping();
            resultsContainer.getOwnerPresentation().getController().updatePanelActions();
        }
    }

}