blob: b73c7d89ab8db73d2d36824b1d055c14b6e442fa [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.tracecompass.tmf.ui.views;
import org.eclipse.jface.dialogs.MessageDialogWithToggle;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.NLS;
import org.eclipse.tracecompass.internal.tmf.ui.Activator;
import org.eclipse.tracecompass.internal.tmf.ui.ITmfUIPreferences;
import org.eclipse.tracecompass.internal.tmf.ui.views.Messages;
import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.dialogs.FilteredCheckboxTree;
import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.dialogs.IPreCheckStateListener;
/**
* {@link IPreCheckStateListener} to warn the user of potential slowness before
* checking a sub-tree
*
* @author Loic Prieur-Drevon
* @since 4.0
*/
public class ManyEntriesSelectedDialogPreCheckedListener implements IPreCheckStateListener {
private final FilteredCheckboxTree fFilteredCheckboxTree;
/**
* Constructor
*
* @param filteredCheckboxTree
* the {@link FilteredCheckboxTree} that this listener will be
* applied to.
*/
public ManyEntriesSelectedDialogPreCheckedListener(FilteredCheckboxTree filteredCheckboxTree) {
fFilteredCheckboxTree = filteredCheckboxTree;
}
@Override
public boolean setSubtreeChecked(Object element, boolean state) {
if (state) {
ITreeContentProvider contentProvider = (ITreeContentProvider) fFilteredCheckboxTree.getCheckboxTreeViewer().getContentProvider();
int nb = fFilteredCheckboxTree.getCheckedElements().length + getSubTreeSize(contentProvider, element);
return showWarning(nb);
}
return false;
}
private int getSubTreeSize(ITreeContentProvider contentProvider, Object element) {
int size = 1;
for (Object o : contentProvider.getChildren(element)) {
size += getSubTreeSize(contentProvider, o);
}
return size;
}
/**
*
* @return if the checking should be cancelled
*/
private boolean showWarning(int nb) {
/*
* Show a dialog warning users that selecting many entries will be slow.
*/
IPreferenceStore corePreferenceStore = Activator.getDefault().getPreferenceStore();
boolean hide = corePreferenceStore.getBoolean(ITmfUIPreferences.HIDE_MANY_ENTRIES_SELECTED_TOGGLE);
if (nb > 20 && !hide) {
MessageDialogWithToggle openOkCancelConfirm = MessageDialogWithToggle.openOkCancelConfirm(
fFilteredCheckboxTree.getShell(),
Messages.ManyEntriesSelectedDialogPreCheckedListener_ManyEntriesSelectedTitle,
NLS.bind(Messages.ManyEntriesSelectedDialogPreCheckedListener_ManyEntriesSelectedMessage, nb),
Messages.ManyEntriesSelectedDialogPreCheckedListener_ManyEntriesSelectedDontShowAgain, false,
null, null);
corePreferenceStore.setValue(ITmfUIPreferences.HIDE_MANY_ENTRIES_SELECTED_TOGGLE, openOkCancelConfirm.getToggleState());
int retCode = openOkCancelConfirm.getReturnCode();
return retCode == Window.CANCEL;
}
return false;
}
}