/*******************************************************************************
* 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.abstractviewers;
import java.util.HashMap;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.linuxtools.dataviewers.listeners.STColumnSizeListener;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Item;
/**
* This class is used to handle the width and visibility of all columns of a {@link AbstractSTViewer}. Width and
* visibility of these columns are stored in a dialogSetting.
*/
public class STDataViewersHideShowManager {
public static final int STATE_SHOWN = 1;
public static final int STATE_HIDDEN = 0;
private final AbstractSTViewer stViewer;
private final int[] defaultColumnsWidth;
private final int[] columnsWidth;
private final int[] columnsState;
private final HashMap<Item, STColumnSizeListener> columnsSizeListener = new HashMap<>();
/**
* Creates a new instance of STDataViewersHideShowManager.
*
* @param stViewer The viewer to manage.
*/
public STDataViewersHideShowManager(AbstractSTViewer stViewer) {
this.stViewer = stViewer;
Item[] columns = stViewer.getColumns();
this.columnsWidth = new int[columns.length];
this.columnsState = new int[columns.length];
this.defaultColumnsWidth = new int[columns.length];
for (int i = 0; i < columns.length; i++) {
ISTDataViewersField field = (ISTDataViewersField) columns[i].getData();
columnsWidth[i] = stViewer.getColumnWidth(columns[i]);
columnsState[i] = field.isShowingByDefault() ? STATE_SHOWN : STATE_HIDDEN;
defaultColumnsWidth[i] = field.getPreferredWidth();
STColumnSizeListener l = new STColumnSizeListener(this);
columnsSizeListener.put(columns[i], l);
columns[i].addListener(SWT.Resize, l);
columns[i].addDisposeListener(e -> {
Item column = (Item) e.widget;
column.removeListener(SWT.Resize, columnsSizeListener.get(column));
});
}
}
/**
* Saves the column width and visibility status in the given dialogSettings.
*
* @param dialogSettings The new settings to store.
*/
public void saveState(IDialogSettings dialogSettings) {
// delete old settings and save new ones
IDialogSettings settings = dialogSettings.addNewSection(STDataViewersSettings.TAG_SECTION_HIDESHOW);
for (int i = 0; i < columnsWidth.length; i++) {
settings.put(STDataViewersSettings.TAG_HIDE_SHOW_COLUMN_WIDTH_ + i, columnsWidth[i]);
settings.put(STDataViewersSettings.TAG_HIDE_SHOW_COLUMN_STATE_ + i, columnsState[i]);
}
}
/**
* Restores the columns width and visibility using the given dialogSettings.
*
* @param dialogSettings The settings to restore.
*/
public void restoreState(IDialogSettings dialogSettings) {
if (dialogSettings == null) {
// no settings section
resetState();
return;
}
IDialogSettings settings = dialogSettings.getSection(STDataViewersSettings.TAG_SECTION_HIDESHOW);
if (settings == null) {
// no settings saved
resetState();
return;
}
try {
for (int i = 0; i < columnsWidth.length; i++) {
String width = settings.get(STDataViewersSettings.TAG_HIDE_SHOW_COLUMN_WIDTH_ + i);
if (width == null) {
// no width data
resetState();
return;
}
columnsWidth[i] = Integer.parseInt(width);
String state = settings.get(STDataViewersSettings.TAG_HIDE_SHOW_COLUMN_STATE_ + i);
if (state == null) {
// no state data
resetState();
return;
}
columnsState[i] = Integer.parseInt(state);
}
} catch (NumberFormatException nfe) {
// invalid entry
resetState();
}
}
/**
* It restores the original columns width and visibility
*/
private void resetState() {
Item[] columns = stViewer.getColumns();
for (int i = 0; i < columns.length; i++) {
ISTDataViewersField field = (ISTDataViewersField) columns[i].getData();
columnsState[i] = field.isShowingByDefault() ? STATE_SHOWN : STATE_HIDDEN;
columnsWidth[i] = defaultColumnsWidth[i];
}
}
/**
* Sets the column width. If the column is hidden width would not be set.
*
* @param index Index of column whose width to change.
* @param width The new width for the column
*/
public void setWidth(int index, int width) {
if (columnsState[index] != STATE_HIDDEN) {
columnsWidth[index] = width;
}
}
/**
* Sets the state of column
* @param index
* index of the column
* @param state
* one of {@link #STATE_SHOWN} or {@link #STATE_HIDDEN}
*/
public void setState(int index, int state) {
columnsState[index] = state;
}
/**
* Gets the column width
* @param index
* index of the column
* @return a column width
*/
public int getWidth(int index) {
return columnsWidth[index];
}
/**
* Gets the column state.
* @param index
* of the column
* @return one of {@link #STATE_SHOWN} or {@link #STATE_HIDDEN}
*/
public int getState(int index) {
return columnsState[index];
}
/**
* Gets the status ({@link #STATE_HIDDEN} or {@link #STATE_SHOWN}) of all columns.
* @return an array of status
*/
public int[] getColumnsState() {
return columnsState;
}
/**
* Updates the columns width and status
* @since 5.0
*/
public void updateColumns() {
Item[] columns = stViewer.getColumns();
for (int i = columns.length; i-- > 0;) {
Item column = columns[i];
if (getState(i) == STDataViewersHideShowManager.STATE_HIDDEN) {
stViewer.setColumnWidth(column, 0);
stViewer.setColumnResizable(column, false);
} else {
stViewer.setColumnWidth(column, getWidth(i));
stViewer.setColumnResizable(column, true);
}
}
}
/**
* Gets the STViewer hooked to this Hide/Show Manager
* @return AbstractSTViewer
*/
public AbstractSTViewer getSTViewer() {
return stViewer;
}
}