/*******************************************************************************
* Copyright (c) 2016 Ericsson
*
* 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
*******************************************************************************/
package org.eclipse.tracecompass.internal.tmf.ui.editors;
import java.util.Arrays;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.tracecompass.internal.tmf.ui.Activator;
/**
* Column table utils
*
* @author Matthew Khouzam
*
*/
public final class TmfTableColumnUtils {
private static final String ROOT_SECTION_NAME = "editor.eventstable.column"; //$NON-NLS-1$
private static final String COLUMN_ORDER_SECTION_NAME = "order"; //$NON-NLS-1$
private static final String COLUMN_WIDTH_SECTION_NAME = "width"; //$NON-NLS-1$
private static final String COLUMN_RESIZABLE_SECTION_NAME = "resizable"; //$NON-NLS-1$
private TmfTableColumnUtils() {
// do nothing
}
/**
* Loads the column orders
*
* @param traceTypeId
* the trace type ID
* @return an integer array of the column order
*/
public static int[] loadColumnOrder(String traceTypeId) {
return loadIntSection(traceTypeId, COLUMN_ORDER_SECTION_NAME);
}
/**
* Loads the column widths
*
* @param traceTypeId
* the trace type ID
* @return an integer array of the column widths
*/
public static int[] loadColumnWidth(String traceTypeId) {
return loadIntSection(traceTypeId, COLUMN_WIDTH_SECTION_NAME);
}
/**
* Loads the column resizablity
*
* @param traceTypeId
* the trace type ID
* @return an integer array of the column resizablity
*/
public static boolean[] loadColumnResizable(String traceTypeId) {
return loadBoolSection(traceTypeId, COLUMN_RESIZABLE_SECTION_NAME);
}
/**
* Saves the table column order for the specified trace type. Passing a null
* column order clears it.
*
* @param traceTypeId
* the trace type id
* @param columnOrder
* the table column order
*/
public static void saveColumnOrder(String traceTypeId, int[] columnOrder) {
saveColumnElementInt(traceTypeId, COLUMN_ORDER_SECTION_NAME, columnOrder);
}
/**
* Saves the table column width for the specified trace type. Passing a null
* column width clears it.
*
* @param traceTypeId
* the trace type id
* @param columnWidth
* the table column width
*/
public static void saveColumnWidth(String traceTypeId, int[] columnWidth) {
saveColumnElementInt(traceTypeId, COLUMN_WIDTH_SECTION_NAME, columnWidth);
}
/**
* Saves the table column resizability for the specified trace type. Passing a null
* column resizability clears it.
*
* @param traceTypeId
* the trace type id
* @param columnResizability
* the table column resizability
*/
public static void saveColumnResizability(String traceTypeId, boolean[] columnResizability) {
saveColumnElementBoolean(traceTypeId, COLUMN_RESIZABLE_SECTION_NAME, columnResizability);
}
/**
* Clears the table column visibility for the specified trace type.
*
* @param traceTypeId
* the trace type id
*/
public static void clearColumnOrder(String traceTypeId) {
clearColumnElement(traceTypeId, COLUMN_ORDER_SECTION_NAME);
}
/**
* Clears the table column visibility for the specified trace type.
*
* @param traceTypeId
* the trace type id
*/
public static void clearColumnWidth(String traceTypeId) {
clearColumnElement(traceTypeId, COLUMN_WIDTH_SECTION_NAME);
}
/**
* Clears the table column visibility for the specified trace type.
*
* @param traceTypeId
* the trace type id
*/
public static void clearColumnResizable(String traceTypeId) {
clearColumnElement(traceTypeId, COLUMN_RESIZABLE_SECTION_NAME);
}
private static boolean[] loadBoolSection(String traceTypeId, String sectionName) {
String columnSection = loadSection(traceTypeId, sectionName);
if (columnSection == null) {
return null;
}
String[] array = columnSection.substring(1, columnSection.length() - 1).split(", "); //$NON-NLS-1$
boolean[] columnValue = new boolean[array.length];
for (int i = 0; i < array.length; i++) {
columnValue[i] = Boolean.valueOf(array[i]);
}
return columnValue;
}
private static int[] loadIntSection(String traceTypeId, String sectionName) {
String columnSection = loadSection(traceTypeId, sectionName);
if (columnSection == null) {
return null;
}
String[] array = columnSection.substring(1, columnSection.length() - 1).split(", "); //$NON-NLS-1$
int[] columnValue = new int[array.length];
try {
for (int i = 0; i < array.length; i++) {
columnValue[i] = Integer.valueOf(array[i]);
}
return columnValue;
} catch (NumberFormatException e) {
return null;
}
}
private static void saveColumnElementBoolean(String traceTypeId, String sectionName, boolean[] data) {
if (traceTypeId == null) {
return;
}
if (data == null) {
clearColumnElement(traceTypeId, sectionName);
return;
}
IDialogSettings settings = Activator.getDefault().getDialogSettings();
IDialogSettings section = settings.getSection(ROOT_SECTION_NAME);
if (section == null) {
section = settings.addNewSection(ROOT_SECTION_NAME);
}
IDialogSettings columnSection = section.getSection(sectionName);
if (columnSection == null) {
columnSection = section.addNewSection(sectionName);
}
columnSection.put(traceTypeId, Arrays.toString(data));
}
private static void saveColumnElementInt(String traceTypeId, String sectionName, int[] data) {
if (traceTypeId == null) {
return;
}
if (data == null) {
clearColumnElement(traceTypeId, sectionName);
return;
}
IDialogSettings settings = Activator.getDefault().getDialogSettings();
IDialogSettings section = settings.getSection(ROOT_SECTION_NAME);
if (section == null) {
section = settings.addNewSection(ROOT_SECTION_NAME);
}
IDialogSettings columnSection = section.getSection(sectionName);
if (columnSection == null) {
columnSection = section.addNewSection(sectionName);
}
columnSection.put(traceTypeId, Arrays.toString(data));
}
private static void clearColumnElement(String traceTypeId, final String sectionName) {
if (traceTypeId == null) {
return;
}
IDialogSettings settings = Activator.getDefault().getDialogSettings();
IDialogSettings section = settings.getSection(ROOT_SECTION_NAME);
if (section == null) {
return;
}
IDialogSettings columnSection = section.getSection(sectionName);
if (columnSection == null) {
return;
}
columnSection.put(traceTypeId, (String) null);
}
private static String loadSection(String traceTypeId, String sectionName) {
if (traceTypeId == null) {
return null;
}
IDialogSettings settings = Activator.getDefault().getDialogSettings();
IDialogSettings section = settings.getSection(ROOT_SECTION_NAME);
if (section == null) {
return null;
}
IDialogSettings columnSection = section.getSection(sectionName);
if (columnSection == null) {
return null;
}
String string = columnSection.get(traceTypeId);
if (string == null || string.length() < 3) {
return null;
}
if (string.charAt(0) != '[' || string.charAt(string.length() - 1) != ']') {
return null;
}
return string;
}
}