blob: c04b23fe950ac6a13d4618555a0c963dc8f5fcd4 [file] [log] [blame]
/*
* Copyright (C) 2012 The Android Open Source Project
*
* 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 com.motorola.studio.android.wizards.elements.sorting;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import com.motorola.studio.android.wizards.elements.sorting.TableItemStringComparator.SortDirection;
/**
* This selection listener sorts the columns of a {@link Table}. It assumes
* the columns being sorted are {@link String}s.
*/
public class TableItemSortStringSetActionListener implements SelectionListener
{
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
*/
public void widgetDefaultSelected(SelectionEvent e)
{
// sort the table
sortTable(e);
}
/* (non-Javadoc)
* @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
*/
public void widgetSelected(SelectionEvent e)
{
// sort the table
sortTable(e);
}
/**
* Execute the {@link Table} sorting.
*
* @param e Event object of the sort.
*/
private void sortTable(SelectionEvent e)
{
// get column to be sorted
TableColumn column = (TableColumn) e.widget;
// get table belonging to to sorted column
Table table = column.getParent();
// get selected items because the sort messes with them, so they will be restored later
TableItem[] selectedItems = table.getSelection();
// create a list of new selected items - items which will be selected after the sorting
List<TableItem> selectedItemsAfterSorting = new ArrayList<TableItem>();
// get the sort direction from the table
int sortDirection = table.getSortDirection();
// determine the new sorting direction according to the old one
sortDirection = sortDirection == SWT.UP ? SWT.DOWN : SWT.UP;
// get Table items
TableItem[] items = table.getItems();
if ((items != null) && (items.length > 0))
{
// sort the items - assume you always sort them by String
Arrays.sort(items, new TableItemStringComparator(table.indexOf(column),
sortDirection == SWT.UP ? SortDirection.ASCENDING : SortDirection.DESCENDING));
// rearrange the table according to the sorted items - the iteration is in the new sorted order
TableItem newItem = null;
TableItem item = null;
for (int rowIndex = 0; rowIndex < items.length; rowIndex++)
{
// get current item - to be removed
item = items[rowIndex];
// create a new table item to be inserted in the table
newItem = new TableItem(table, SWT.NONE, rowIndex);
// set the text for this new item based on the item in the order
newItem.setText(getTableItemData(item));
// in case the current item is a selected one, put the new one in the selection list
if (isElementInArray(item, selectedItems))
{
selectedItemsAfterSorting.add(newItem);
}
// remove the current item
item.dispose();
}
}
// set the new selection items
TableItem[] selectedItemsAfterSortingArray =
new TableItem[selectedItemsAfterSorting.size()];
for (int rowIndex = 0; rowIndex < selectedItemsAfterSortingArray.length; rowIndex++)
{
selectedItemsAfterSortingArray[rowIndex] = selectedItemsAfterSorting.get(rowIndex);
}
table.setSelection(selectedItemsAfterSortingArray);
// set the new sorting direction and sorted column
table.setSortDirection(sortDirection);
table.setSortColumn((column));
table.setRedraw(true);
}
/**
* Verify whether an element belongs to an array.
*
* @param <E> Any type of object or primitive
* @param element Element to be verified whether it is in a certain array.
* @param array Array which the element will be verified to be within.
*
* @return Returns <code>true</code> in case the element is in the array, <code>false</code>
* otherwise.
*/
private <E> boolean isElementInArray(E element, E[] array)
{
boolean hasElement = false;
// first all items must not be null and the list not empty
if ((element != null) && (array != null) && (array.length > 0))
{
// verify whether the element is in the array
for (E arrayItem : array)
{
// the element was found, set the flag and quit the loop
if (arrayItem.equals(element))
{
hasElement = true;
break;
}
}
}
return hasElement;
}
/**
* Get an array of string holding the data of a {@link TableItem}.
*
* @param tableItem Table item in which data will be retrieved.
*
* @return Array of data from the Table Item.
*/
private String[] getTableItemData(TableItem tableItem)
{
String[] itemArray = new String[0];
// get the related table
Table table = tableItem.getParent();
if (table != null)
{
// get the number of columns in the table
int columnCount = table.getColumnCount();
if (columnCount > 0)
{
// set a string of data to be returned, based on the number of columns
itemArray = new String[columnCount];
// for each column item put in the array to be returned
for (int columnIndex = 0; columnIndex < columnCount; columnIndex++)
{
itemArray[columnIndex] = tableItem.getText(columnIndex);
}
}
}
return itemArray;
}
}