/*
Copyright (C) 2011 monte
This file is part of PSP NetParty.
PSP NetParty is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package pspnetparty.client.swt;
import java.text.SimpleDateFormat;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
public class SwtUtils {
private SwtUtils() {
}
public static final Display DISPLAY = Display.getDefault();
private static final Thread UI_THREAD = DISPLAY.getThread();
public static final SimpleDateFormat LOG_DATE_FORMAT = new SimpleDateFormat("HH:mm:ss");
public static boolean isNotUIThread() {
return Thread.currentThread() != UI_THREAD;
}
public static final VerifyListener NOT_ACCEPT_CONTROL_CHAR_LISTENER = new VerifyListener() {
@Override
public void verifyText(VerifyEvent e) {
switch (e.character) {
case '\t':
e.doit = false;
break;
case '\0':
e.text = e.text.replace("\t", "").trim();
break;
}
}
};
public static final VerifyListener NOT_ACCEPT_SPACE_CONTROL_CHAR_LISTENER = new VerifyListener() {
@Override
public void verifyText(VerifyEvent e) {
if (" ".equals(e.text) || " ".equals(e.text)) {
e.doit = false;
} else {
switch (e.character) {
case '\t':
e.doit = false;
break;
case '\0':
e.text = e.text.replaceAll("[\\t\\s ]", "");
break;
}
}
}
};
public static void enableColumnDrag(Table table) {
for (TableColumn column : table.getColumns())
column.setMoveable(true);
}
public static void installSorter(final TableViewer viewer, final TableColumn column, final ViewerSorter sorter) {
final ViewerSorter reverseSorter = new ViewerSorter() {
@Override
public int compare(Viewer viewer, Object e1, Object e2) {
return -sorter.compare(viewer, e1, e2);
}
};
column.addListener(SWT.Selection, new Listener() {
int direction = SWT.NONE;
@Override
public void handleEvent(Event event) {
ViewerSorter viewerSorter;
switch (direction) {
case SWT.UP:
viewerSorter = reverseSorter;
direction = SWT.DOWN;
break;
case SWT.DOWN:
viewerSorter = null;
direction = SWT.NONE;
break;
default:
viewerSorter = sorter;
direction = SWT.UP;
break;
}
viewer.setSorter(viewerSorter);
Table table = viewer.getTable();
table.setSortColumn(column);
table.setSortDirection(direction);
}
});
}
public static String serializeTableColumns(Table table) {
if (table.getColumnCount() == 0)
return "";
StringBuilder sb = new StringBuilder();
int[] order = table.getColumnOrder();
for (int i = 0; i < order.length; i++) {
sb.append(order[i]);
sb.append(',');
sb.append(table.getColumn(i).getWidth());
sb.append('|');
}
sb.deleteCharAt(sb.length() - 1);
return sb.toString();
}
public static void deserializeTableColumns(Table table, String string, int[] defaultWidths) {
if (table.getColumnCount() != defaultWidths.length)
throw new RuntimeException("Column count mismatch: " + table);
String[] tokens = string.split("\\|");
if (tokens.length == defaultWidths.length) {
int[] order = new int[tokens.length];
int[] widths = defaultWidths;
for (int i = 0; i < tokens.length; i++) {
String[] values = tokens[i].split(",");
if (values.length != 2)
continue;
try {
order[i] = Integer.parseInt(values[0]);
widths[i] = Integer.parseInt(values[1]);
} catch (NumberFormatException e) {
}
}
try {
table.setColumnOrder(order);
} catch (RuntimeException e) {
}
}
for (int i = 0; i < defaultWidths.length; i++) {
try {
table.getColumn(i).setWidth(defaultWidths[i]);
} catch (RuntimeException e) {
}
}
}
public static Color loadColor(String setting, RGB defaultRGB) {
String[] values = setting.split(",");
if (values.length == 3) {
try {
int r = Integer.parseInt(values[0]);
int g = Integer.parseInt(values[1]);
int b = Integer.parseInt(values[2]);
return new Color(DISPLAY, r, g, b);
} catch (RuntimeException e) {
}
}
return new Color(DISPLAY, defaultRGB);
}
public static String colorToString(Color color) {
return color.getRed() + "," + color.getGreen() + "," + color.getBlue();
}
public static Font loadFont(String setting, FontData[] defaultFont) {
String[] values = setting.split(",");
if (values.length == 3) {
String name = values[0];
int size = Integer.parseInt(values[1]);
int style = parseFontStyle(values[2]);
return new Font(DISPLAY, name, size, style);
}
return new Font(DISPLAY, defaultFont);
}
private static int parseFontStyle(String style) {
if ("B".equals(style))
return SWT.BOLD;
if ("I".equals(style))
return SWT.ITALIC;
if ("BI".equals(style))
return SWT.BOLD | SWT.ITALIC;
return SWT.NORMAL;
}
public static String fontToString(Font font) {
FontData data = font.getFontData()[0];
String style;
switch (data.getStyle()) {
case SWT.NORMAL:
style = "N";
break;
case SWT.BOLD:
style = "B";
break;
case SWT.ITALIC:
style = "I";
break;
case SWT.BOLD | SWT.ITALIC:
style = "BI";
break;
default:
style = "N";
}
return data.getName() + "," + data.getHeight() + "," + style;
}
}