📄 uiutil.java
字号:
package net.sf.pim;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.URL;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import net.sf.component.calendar.SWTCalendar;
import net.sf.component.config.ConfigHelper;
import net.sf.component.table.BeanBindedTableModel;
import net.sf.component.table.BindedTableColumn;
import net.sf.component.table.BindedTableViewer;
import net.sf.component.table.IBindedTableModel;
import net.sf.component.table.TextBindedTableColumn;
import net.sf.pim.model.Personal;
import net.sf.pim.model.psp.Work;
import net.sf.pim.model.psp.WorkList;
import net.sf.pim.plugin.view.PspEditor;
import net.sf.pim.view.UiCellSorter;
import net.sf.util.StringUtil;
import net.sf.util.persistence.DMFactory;
import net.sf.util.persistence.DataException;
import net.sf.util.persistence.IDataManager;
import net.sf.util.persistence.IEntry;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IStatusLineManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IColorProvider;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.custom.ControlEditor;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.custom.TableCursor;
import org.eclipse.swt.events.FocusAdapter;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseTrackAdapter;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.XMLMemento;
import org.eclipse.ui.internal.IWorkbenchConstants;
import org.eclipse.ui.internal.PartSite;
import org.eclipse.ui.internal.ViewSashContainer;
import org.eclipse.ui.internal.ViewStack;
import org.eclipse.ui.internal.WorkbenchWindow;
/**
* Created by IntelliJ IDEA. Date: 2004-1-16 Time: 10:22:30
*/
public class UiUtil {
private final static class WorkLabelProvider implements ITableLabelProvider, IColorProvider {
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
public String getColumnText(Object element, int columnIndex) {
if (element instanceof IEntry)
return ((IEntry) element).getContent()[columnIndex];
else
return "";
}
public void addListener(ILabelProviderListener listener) {
}
public void dispose() {
}
public boolean isLabelProperty(Object element, String property) {
return false;
}
public void removeListener(ILabelProviderListener listener) {
}
public Color getForeground(Object element) {
if (element instanceof Work
&& StringUtil.parseInt(((Work) element).getGzsj()) > ConfigHelper.getIntegerProperty("work.warningminutes"))
return Display.getCurrent().getSystemColor(SWT.COLOR_DARK_YELLOW);
return null;
}
public Color getBackground(Object element) {
return null;
}
}
// 字体
private static Font font;
// actionset
private static Map<String, IAction> actionMap = new HashMap<String, IAction>();
// 垂直分隔
private static SashForm sf;
// 下方的水平分隔
private static SashForm sf2;
private static ITableFolder tableFolder;
private UiUtil() {
}
// 注意自己dispose
public static Font getFont() {
if (font == null || font.isDisposed())
font = new Font(Display.getCurrent(), "宋体", 11, SWT.NORMAL);
return font;
}
public static Map<String, IAction> getActionMap() {
return actionMap;
}
public static void setActionMap(Map<String, IAction> map) {
actionMap = map;
}
/**
* 初始化表格
*/
public static TableViewer initTableViewer(final UiCore uc, final WorkList wl, Composite parent) {
TableViewer tv0 = new TableViewer(parent, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION | SWT.H_SCROLL
| SWT.V_SCROLL);
// 准备数据
String[] header = getHeaderMc();
int[] headerSize = ConfigHelper.getIntegerArrayProperty("work.headersize");
Work[] list = wl.getWorks();
if (list.length == 0) {
list = new Work[] { new Work() };
list[0].setRq(StringUtil.getCurrentDay());
list[0].setWid(String.valueOf(1));
}
Table table = tv0.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
table.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (!uc.isMulti()) {
if ((TableItem) e.item != uc.getTableCursor().getRow())
uc.getTableCursor().setSelection((TableItem) e.item, uc.getTableCursor().getColumn());
uc.getTableCursor().setVisible(true);
uc.getTv().getTable().setSelection(new TableItem[] { uc.getTableCursor().getRow() });
uc.getTableCursor().setFocus();
}
}
});
// 使用TableCursor
final TableCursor cursor = new TableCursor(table, SWT.NONE);
uc.setTableCursor(cursor);
final ControlEditor editor = new ControlEditor(cursor);
editor.grabHorizontal = true;
editor.grabVertical = true;
editor.minimumWidth = 50;
cursor.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
if (!uc.isMulti()) {
if ((TableItem) e.item != uc.getTableCursor().getRow())
uc.getTv().getTable().setSelection(new TableItem[] { uc.getTableCursor().getRow() });
}
}
});
cursor.addMouseListener(new MouseAdapter() {
public void mouseDoubleClick(MouseEvent me) {
adapterEvent(uc, editor);
}
});
cursor.addTraverseListener(new TraverseListener() {
public void keyTraversed(TraverseEvent event) {
if (event.detail == SWT.TRAVERSE_RETURN)
adapterEvent(uc, editor);
if (event.detail == SWT.TRAVERSE_TAB_NEXT || event.detail == SWT.TRAVERSE_TAB_PREVIOUS) {
focusNext(event, cursor);
event.doit = false;
}
}
});
for (int i = 0; i < header.length; i++) {
TableColumn column = new TableColumn(table, SWT.NULL);
column.setText(header[i]);
column.setWidth(i < headerSize.length ? headerSize[i] : 80);
// 将column的key保存在data中
column.setData(getHeaderJc()[i]);
// 在汇总模式下可排序
column.addListener(SWT.Selection, new UiCellSorter(uc));
}
// set contenet provider
tv0.setContentProvider(new IStructuredContentProvider() {
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
if (newInput == null)
return;
// 输入变化先隐藏TableCursor
if (uc != null && uc.getTableCursor() != null) {
uc.getTableCursor().setVisible(false);
}
}
public Object[] getElements(Object input) {
if (input instanceof IEntry[])
return (IEntry[]) input;
else
return new Object[0];
}
});
tv0.setLabelProvider(new WorkLabelProvider());
tv0.setColumnProperties(getHeaderJc());
tv0.setInput(list);
uc.setWorkDay(StringUtil.getCurrentDay());
return tv0;
}
/**
* 创建编辑器
*/
public static BindedTableViewer initTabEditor(Composite parent, final Class clazz, final String id) {
List list = new ArrayList();
try {
list = DMFactory.getDataManager(clazz).readList(id);
} catch (DataException e1) {
e1.printStackTrace();
}
IBindedTableModel model = new BeanBindedTableModel(list) {
public Object createRow() {
IEntry entry = (IEntry) instance(clazz);
// 若存在week或rq等chunk,且id不为空,则置
if (!StringUtil.isNull(id) && Arrays.asList(entry.getFieldNames()).contains("week")) {
entry.setProperty("week", getChunkId());
entry.setProperty("num", String.valueOf(getRows().size() + 1));
}
return entry;
}
};
model.setChunkId(id);
IEntry entry = (IEntry) instance(clazz);
String[] fieldNames = entry.getFieldNames();
String[] fieldDescs = entry.getFieldDescs();
for (int i = 0; i < fieldNames.length; i++) {
//20071117可以定义一些隐藏字段,在界面上不显示,目前用于p2pim中联系人p2pid字段
if(fieldDescs[i].indexOf("不显示") == -1){
BindedTableColumn btc = new TextBindedTableColumn(fieldNames[i]);
btc.setShowName(fieldDescs[i]);
model.addColumn(btc);
}
}
BindedTableViewer bindedTableViewer = new BindedTableViewer(parent, SWT.NONE);
bindedTableViewer.setModel(model);
bindedTableViewer.setRowCreateRemovable(false);
bindedTableViewer.setRowsOrderable(false);
bindedTableViewer.setColsOrderable(false);
bindedTableViewer.getTableViewer().getTable().setFont(getFont());
bindedTableViewer.create();
return bindedTableViewer;
}
public static int[] getVerticalSize() {
if (sf != null)
return sf.getWeights();
return new int[] { 62, 38 };
}
public static int[] getHorizontalSize() {
if (sf2 != null)
return sf2.getWeights();
return new int[] { 30, 70 };
}
public static WorkList getData(UiCore ui) {
Table table = (Table) ui.getTv().getControl();
TableItem[] ti = table.getItems();
Work[] list = new Work[ti.length];
String[] ss = new String[table.getColumnCount()];
for (int i = 0; i < list.length; i++) {
for (int j = 0; j < ss.length; j++)
ss[j] = ti[i].getText(j);
list[i] = new Work();
list[i].setContent(ss);
}
WorkList wl = new WorkList();
wl.setWorks(list);
wl.setMemo(ui.getMemoText().getText());
return wl;
}
public static void checkSave(UiCore ui) {
ArrayList<String> needSave = new ArrayList<String>();
if (ui.isDirty())
needSave.add("日志");
for (ITableEditor editor : tableFolder.getEditors()) {
BindedTableViewer btv = editor.getViewer();
if (btv != null && btv.getModel().isDirty() && btv.getModel().isEditable())
needSave.add(editor.getName());
}
if (!needSave.isEmpty()) {
if (MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "提示", needSave + "已被修改,是否保存?")) {
// 逐个保存
try {
if (ui.isDirty()) {
ui.getDataManager().createData(ui.getData());
ui.setDirty(false);
}
for (ITableEditor editor : tableFolder.getEditors()) {
BindedTableViewer btv = editor.getViewer();
if (btv != null && btv.getModel().isDirty()) {
IDataManager idm = DMFactory.getDataManager(btv.getModel().createRow().getClass());
idm.createList(btv.getModel().getRows(), btv.getModel().getChunkId());
btv.getModel().setDirty(false);
}
}
} catch (DataException e) {
e.printStackTrace();
}
} else {
// 清除“脏”标记
if (ui.isDirty()) {
ui.setDirty(false);
}
for (ITableEditor editor : tableFolder.getEditors()) {
BindedTableViewer btv = editor.getViewer();
if (btv != null && btv.getModel().isDirty()) {
btv.getModel().setDirty(false);
}
}
}
}
}
// 检查当前活动Editor
public static void checkSave(BindedTableViewer btv) {
if (btv == null || !btv.getModel().isDirty())
return;
if (MessageDialog.openConfirm(Display.getCurrent().getActiveShell(), "提示", "已被修改,是否保存?")) {
try {
if (btv != null && btv.getModel().isDirty()) {
IDataManager idm = DMFactory.getDataManager(btv.getModel().createRow().getClass());
idm.createList(btv.getModel().getRows(), btv.getModel().getChunkId());
}
} catch (DataException e) {
e.printStackTrace();
}
}
btv.getModel().setDirty(false);
}
// 显示某天的记录
public static void showWork(UiCore parent, String day) {
if (parent.getWorkDay().equals(day) && !parent.isMulti())
return;
parent.checkSave();
parent.setMulti(false);
parent.setDirty(false);
parent.setWorkDay(day);
try {
parent.setData((WorkList) parent.getDataManager().readData(parent.getWorkDay()));
} catch (DataException e) {
e.printStackTrace();
}
parent.setMyStatus(parent.getWorkDay());
syncCalendar(day, parent.getCalendar());
}
// 显示某段的记录
public static void showChunk(UiCore parent, String id) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -