Removed non-opensource code TableMap/TableSorter These were copied from code found at http://www.informit.com/guides/content.aspx?g=java&seqNum=57
but https://web.archive.org/web/20151110082836/http://www.informit.com/guides/content.aspx?g=java&seqNum=57 does not declare any closed or open source license. This could be replace with BSD3-licensed demos from http://docs.oracle.com/javase/tutorial/uiswing/components/table.html .. but it seems TableMap and TableSorter are not used anywhere in Taverna Workbench 3 or its plugins - so safe to remove Project: http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/commit/a7761da4 Tree: http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/tree/a7761da4 Diff: http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/diff/a7761da4 Branch: refs/heads/master Commit: a7761da444bbb0add71967b6bc3229fb101d13cc Parents: 5f2bdc2 Author: Stian Soiland-Reyes <[email protected]> Authored: Fri Oct 21 11:27:57 2016 +0200 Committer: Stian Soiland-Reyes <[email protected]> Committed: Fri Oct 21 11:34:56 2016 +0200 ---------------------------------------------------------------------- .../org/apache/taverna/lang/ui/TableMap.java | 83 ----- .../org/apache/taverna/lang/ui/TableSorter.java | 355 ------------------- 2 files changed, 438 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a7761da4/taverna-ui/src/main/java/org/apache/taverna/lang/ui/TableMap.java ---------------------------------------------------------------------- diff --git a/taverna-ui/src/main/java/org/apache/taverna/lang/ui/TableMap.java b/taverna-ui/src/main/java/org/apache/taverna/lang/ui/TableMap.java deleted file mode 100644 index b3925b8..0000000 --- a/taverna-ui/src/main/java/org/apache/taverna/lang/ui/TableMap.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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 org.apache.taverna.lang.ui; - -import javax.swing.table.AbstractTableModel; -import javax.swing.table.TableModel; -import javax.swing.event.TableModelListener; -import javax.swing.event.TableModelEvent; - -/** - * Copied from code found at http://www.informit.com/guides/content.aspx?g=java&seqNum=57 - * - */ -public class TableMap extends AbstractTableModel implements TableModelListener { - protected TableModel model; - - public TableModel getModel() { - return model; - } - - public void setModel(TableModel model) { - this.model = model; - model.addTableModelListener(this); - } - - // By default, implement TableModel by forwarding all messages - // to the model. - - public Object getValueAt(int aRow, int aColumn) { - return model.getValueAt(aRow, aColumn); - } - - public void setValueAt(Object aValue, int aRow, int aColumn) { - model.setValueAt(aValue, aRow, aColumn); - } - - public int getRowCount() { - return (model == null) ? 0 : model.getRowCount(); - } - - public int getColumnCount() { - return (model == null) ? 0 : model.getColumnCount(); - } - - public String getColumnName(int aColumn) { - return model.getColumnName(aColumn); - } - - public Class getColumnClass(int aColumn) { - return model.getColumnClass(aColumn); - } - - public boolean isCellEditable(int row, int column) { - return model.isCellEditable(row, column); - } - - public int transposeRow(int row) { - return row; - } - - // - // Implementation of the TableModelListener interface, - // - // By default forward all events to all the listeners. - public void tableChanged(TableModelEvent e) { - fireTableChanged(e); - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-workbench/blob/a7761da4/taverna-ui/src/main/java/org/apache/taverna/lang/ui/TableSorter.java ---------------------------------------------------------------------- diff --git a/taverna-ui/src/main/java/org/apache/taverna/lang/ui/TableSorter.java b/taverna-ui/src/main/java/org/apache/taverna/lang/ui/TableSorter.java deleted file mode 100644 index 4c9cc35..0000000 --- a/taverna-ui/src/main/java/org/apache/taverna/lang/ui/TableSorter.java +++ /dev/null @@ -1,355 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You 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 org.apache.taverna.lang.ui; - -/** - * Copied from code found at http://www.informit.com/guides/content.aspx?g=java&seqNum=57 - */ - -import java.util.Date; -import java.util.Vector; - -import javax.swing.table.TableModel; -import javax.swing.event.TableModelEvent; - -//Imports for picking up mouse events from the JTable. -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.InputEvent; -import javax.swing.JTable; -import javax.swing.table.JTableHeader; -import javax.swing.table.TableColumnModel; - -public class TableSorter extends TableMap { - int indexes[]; - Vector sortingColumns = new Vector(); - boolean ascending = true; - int compares; - - public TableSorter() { - indexes = new int[0]; // for consistency - } - - public TableSorter(TableModel model) { - setModel(model); - } - - public void setModel(TableModel model) { - super.setModel(model); - reallocateIndexes(); - } - - public int compareRowsByColumn(int row1, int row2, int column) { - Class type = model.getColumnClass(column); - TableModel data = model; - - // Check for nulls. - - Object o1 = data.getValueAt(row1, column); - Object o2 = data.getValueAt(row2, column); - - // If both values are null, return 0. - if (o1 == null && o2 == null) { - return 0; - } else if (o1 == null) { // Define null less than everything. - return -1; - } else if (o2 == null) { - return 1; - } - - if (o1 instanceof Comparable) { - return ((Comparable) o1).compareTo(o2); - } - /* - * We copy all returned values from the getValue call in case an - * optimised model is reusing one object to return many values. The - * Number subclasses in the JDK are immutable and so will not be used in - * this way but other subclasses of Number might want to do this to save - * space and avoid unnecessary heap allocation. - */ - - if (type.getSuperclass() == java.lang.Number.class) { - Number n1 = (Number) data.getValueAt(row1, column); - double d1 = n1.doubleValue(); - Number n2 = (Number) data.getValueAt(row2, column); - double d2 = n2.doubleValue(); - - if (d1 < d2) { - return -1; - } else if (d1 > d2) { - return 1; - } else { - return 0; - } - } else if (type == java.util.Date.class) { - Date d1 = (Date) data.getValueAt(row1, column); - long n1 = d1.getTime(); - Date d2 = (Date) data.getValueAt(row2, column); - long n2 = d2.getTime(); - - if (n1 < n2) { - return -1; - } else if (n1 > n2) { - return 1; - } else { - return 0; - } - } else if (type == String.class) { - String s1 = (String) data.getValueAt(row1, column); - String s2 = (String) data.getValueAt(row2, column); - int result = s1.compareTo(s2); - - if (result < 0) { - return -1; - } else if (result > 0) { - return 1; - } else { - return 0; - } - } else if (type == Boolean.class) { - Boolean bool1 = (Boolean) data.getValueAt(row1, column); - boolean b1 = bool1.booleanValue(); - Boolean bool2 = (Boolean) data.getValueAt(row2, column); - boolean b2 = bool2.booleanValue(); - - if (b1 == b2) { - return 0; - } else if (b1) { // Define false < true - return 1; - } else { - return -1; - } - } else { - Object v1 = data.getValueAt(row1, column); - String s1 = v1.toString(); - Object v2 = data.getValueAt(row2, column); - String s2 = v2.toString(); - int result = s1.compareTo(s2); - - if (result < 0) { - return -1; - } else if (result > 0) { - return 1; - } else { - return 0; - } - } - } - - public int compare(int row1, int row2) { - compares++; - for (int level = 0; level < sortingColumns.size(); level++) { - Integer column = (Integer) sortingColumns.elementAt(level); - int result = compareRowsByColumn(row1, row2, column.intValue()); - if (result != 0) { - return ascending ? result : -result; - } - } - return 0; - } - - public void reallocateIndexes() { - int rowCount = model.getRowCount(); - - // Set up a new array of indexes with the right number of elements - // for the new data model. - indexes = new int[rowCount]; - - // Initialise with the identity mapping. - for (int row = 0; row < rowCount; row++) { - indexes[row] = row; - } - } - - public void tableChanged(TableModelEvent e) { - // System.out.println("Sorter: tableChanged"); - reallocateIndexes(); - - super.tableChanged(e); - } - - public void checkModel() { - if (indexes.length != model.getRowCount()) { - System.err.println("Sorter not informed of a change in model."); - } - } - - public void sort(Object sender) { - checkModel(); - - compares = 0; - // n2sort(); - // qsort(0, indexes.length-1); - shuttlesort((int[]) indexes.clone(), indexes, 0, indexes.length); - // System.out.println("Compares: "+compares); - } - - public void n2sort() { - for (int i = 0; i < getRowCount(); i++) { - for (int j = i + 1; j < getRowCount(); j++) { - if (compare(indexes[i], indexes[j]) == -1) { - swap(i, j); - } - } - } - } - - // This is a home-grown implementation which we have not had time - // to research - it may perform poorly in some circumstances. It - // requires twice the space of an in-place algorithm and makes - // NlogN assigments shuttling the values between the two - // arrays. The number of compares appears to vary between N-1 and - // NlogN depending on the initial order but the main reason for - // using it here is that, unlike qsort, it is stable. - public void shuttlesort(int from[], int to[], int low, int high) { - if (high - low < 2) { - return; - } - int middle = (low + high) / 2; - shuttlesort(to, from, low, middle); - shuttlesort(to, from, middle, high); - - int p = low; - int q = middle; - - /* - * This is an optional short-cut; at each recursive call, check to see - * if the elements in this subset are already ordered. If so, no further - * comparisons are needed; the sub-array can just be copied. The array - * must be copied rather than assigned otherwise sister calls in the - * recursion might get out of sinc. When the number of elements is three - * they are partitioned so that the first set, [low, mid), has one - * element and and the second, [mid, high), has two. We skip the - * optimisation when the number of elements is three or less as the - * first compare in the normal merge will produce the same sequence of - * steps. This optimisation seems to be worthwhile for partially ordered - * lists but some analysis is needed to find out how the performance - * drops to Nlog(N) as the initial order diminishes - it may drop very - * quickly. - */ - - if (high - low >= 4 && compare(from[middle - 1], from[middle]) <= 0) { - for (int i = low; i < high; i++) { - to[i] = from[i]; - } - return; - } - - // A normal merge. - - for (int i = low; i < high; i++) { - if (q >= high || (p < middle && compare(from[p], from[q]) <= 0)) { - to[i] = from[p++]; - } else { - to[i] = from[q++]; - } - } - } - - public void swap(int i, int j) { - int tmp = indexes[i]; - indexes[i] = indexes[j]; - indexes[j] = tmp; - } - - // The mapping only affects the contents of the data rows. - // Pass all requests to these rows through the mapping array: "indexes". - - public Object getValueAt(int aRow, int aColumn) { - checkModel(); - return model.getValueAt(indexes[aRow], aColumn); - } - - public void setValueAt(Object aValue, int aRow, int aColumn) { - checkModel(); - model.setValueAt(aValue, indexes[aRow], aColumn); - } - - public void sortByColumn(int column) { - sortByColumn(column, true); - } - - public void sortByColumn(int column, boolean ascending) { - this.ascending = ascending; - sortingColumns.removeAllElements(); - sortingColumns.addElement(new Integer(column)); - sort(this); - super.tableChanged(new TableModelEvent(this)); - } - - private int lastSortedColumn = -1; - private boolean lastAscending = false; - - public void sortColumn(JTable tableView, int column) { - int currentlySelectedRow = tableView.getSelectedRow(); - int underlyingSelectedRow = -1; - if (currentlySelectedRow != -1) { - underlyingSelectedRow = transposeRow(currentlySelectedRow); - } - // System.out.println("Sorting ..."); - boolean ascendingColumn = true; - if (lastSortedColumn == column) { - ascendingColumn = !lastAscending; - } - lastSortedColumn = column; - lastAscending = ascendingColumn; - this.sortByColumn(column, ascendingColumn); - if (underlyingSelectedRow != -1) { - for (int row = 0; row < indexes.length; row++) { - if (transposeRow(row) == underlyingSelectedRow) { - tableView.setRowSelectionInterval(row, row); - } - } - } - } - - public void resort(JTable tableView) { - if (lastSortedColumn != -1) { - lastAscending = !lastAscending; - sortColumn(tableView, lastSortedColumn); - } - } - - // There is no-where else to put this. - // Add a mouse listener to the Table to trigger a table sort - // when a column heading is clicked in the JTable. - public void addMouseListenerToHeaderInTable(JTable table) { - final TableSorter sorter = this; - final JTable tableView = table; - tableView.setColumnSelectionAllowed(false); - MouseAdapter listMouseListener = new MouseAdapter() { - - private int lastClickedColumn = -1; - private boolean lastAscending = false; - public void mouseClicked(MouseEvent e) { - TableColumnModel columnModel = tableView.getColumnModel(); - int viewColumn = columnModel.getColumnIndexAtX(e.getX()); - int column = tableView.convertColumnIndexToModel(viewColumn); - if (e.getClickCount() == 1 && column != -1) { - sortColumn(tableView, column); - } - } - }; - JTableHeader th = tableView.getTableHeader(); - th.addMouseListener(listMouseListener); - } - - public int transposeRow(int row) { - return indexes[row]; - } -} \ No newline at end of file
