/******************************************************************************* * Copyright (c) 2009 STMicroelectronics. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Marzia Maugeri <marzia.maugeri@st.com> - initial API and implementation *******************************************************************************/ package org.eclipse.linuxtools.dataviewers.dialogs; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.linuxtools.dataviewers.abstractviewers.AbstractSTViewer; import org.eclipse.linuxtools.dataviewers.abstractviewers.STDataViewersHideShowManager; import org.eclipse.linuxtools.dataviewers.abstractviewers.STDataViewersMessages; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Item; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; /** * This dialog allows the user to show/hide some columns of the viewer The status of shown/hidden columns is saved in * the dialog settings of the view. * */ public class STDataViewersHideShowColumnsDialog extends Dialog { private boolean dirty; private STDataViewersHideShowManager manager; private CheckboxTableViewer checkButtonsTable; private AbstractSTViewer stViewer; /** * Creates the hide/show columns dialog for the given AbstractSTViewer. * * @param stViewer The AbstractSTViewer to control. */ public STDataViewersHideShowColumnsDialog(AbstractSTViewer stViewer) { super(stViewer.getViewer().getControl().getShell()); this.dirty = false; this.stViewer = stViewer; this.manager = stViewer.getHideShowManager(); } @Override protected void configureShell(Shell newShell) { super.configureShell(newShell); newShell.setText(STDataViewersMessages.hideshowDialog_title); } @Override protected Control createDialogArea(Composite parent) { Composite composite = (Composite) super.createDialogArea(parent); GridData layoutData = new GridData(SWT.FILL, SWT.FILL, false, false, 2, 1); composite.setLayoutData(layoutData); GridLayout layout = new GridLayout(2, true); composite.setLayout(layout); initializeDialogUnits(composite); layoutData = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1); checkButtonsTable = createCheckboxTable(composite, layoutData); checkButtonsTable.setInput(stViewer.getColumns()); checkButtonsTable.addCheckStateListener(checkStateListener); Button selectAllButton = new Button(composite, SWT.NONE); selectAllButton.setText(STDataViewersMessages.selectAll_text); selectAllButton.addSelectionListener(new SelectionListener() { @Override public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } @Override public void widgetSelected(SelectionEvent e) { dirty = true; checkButtonsTable.setAllChecked(true); } }); layoutData = new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1); selectAllButton.setLayoutData(layoutData); Button deselectAllButton = new Button(composite, SWT.NONE); deselectAllButton.setText(STDataViewersMessages.deselectAll_text); deselectAllButton.addSelectionListener(new SelectionListener() { @Override public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } @Override public void widgetSelected(SelectionEvent e) { dirty = true; checkButtonsTable.setAllChecked(false); } }); layoutData = new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1); deselectAllButton.setLayoutData(layoutData); createSeparatorLine(composite); Dialog.applyDialogFont(composite); setDefaultWidgetsValues(); return composite; } private void setDefaultWidgetsValues() { Item[] columns = stViewer.getColumns(); for (int i = columns.length; i-- > 0;) { boolean state = (manager.getState(i) == STDataViewersHideShowManager.STATE_SHOWN); checkButtonsTable.setChecked(columns[i], state); } } private ICheckStateListener checkStateListener = event -> dirty = true; /** * Creates a separator line above the OK/Cancel buttons bar. * * @param parent The parent composite. */ protected void createSeparatorLine(Composite parent) { GridLayout parentLayout = (GridLayout) parent.getLayout(); // Build the separator line Label separator = new Label(parent, SWT.HORIZONTAL | SWT.SEPARATOR); GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true, parentLayout.numColumns, 1); separator.setLayoutData(layoutData); } private CheckboxTableViewer createCheckboxTable(Composite parent, GridData layoutData) { CheckboxTableViewer tableViewer = CheckboxTableViewer.newCheckList(parent, SWT.SINGLE | SWT.HIDE_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); tableViewer.getControl().setLayoutData(layoutData); tableViewer.setContentProvider(new IStructuredContentProvider() { @Override public Object[] getElements(Object inputElement) { if (inputElement instanceof Item[]) { Item[] columns = (Item[]) inputElement; int[] order = stViewer.getColumnOrder(); Item[] elements = new Item[columns.length]; // sort the columns according to their actual display order for (int i = columns.length; i-- > 0;) { elements[i] = columns[order[i]]; } return elements; } return new Object[] {}; } @Override public void dispose() { } @Override public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } }); tableViewer.setLabelProvider(new LabelProvider() { @Override public String getText(Object element) { if (element instanceof Item) { Item column = (Item) element; if (manager.getWidth(stViewer.getColumnIndex(column)) == 0) { return column.getText() + " (width = 0)"; } return column.getText(); } return element.toString(); } }); return tableViewer; } @Override public int open() { dirty = false; return super.open(); } @Override protected void okPressed() { if (dirty) { saveManagerSettings(); } super.okPressed(); } private void saveManagerSettings() { Item[] columns = stViewer.getColumns(); for (int i = columns.length; i-- > 0;) { int state = checkButtonsTable.getChecked(columns[i]) ? STDataViewersHideShowManager.STATE_SHOWN : STDataViewersHideShowManager.STATE_HIDDEN; manager.setState(i, state); } } /** * @return The hideShowManager. */ public STDataViewersHideShowManager getManager() { return manager; } /** * Returns whether the dialog contains changes. * * @return boolean True if the dialog has changed, false otherwise. */ public boolean isDirty() { return dirty; } }