📄 qtree.java
字号:
*/
public QItem getItemUnderMouse() {
return itemUnderMouse;
}
/**
* 添加一个用户自定义按键事件
*
* @param key
* @param action
*/
public void setUserKeyAction(int key, Runnable action) {
if(action == null)
setKeyBinding(key, SWT.NULL);
else
setKeyBinding(key, CUSTOM_ACTION);
int keyValue = key & SWT.KEY_MASK;
int modifierValue = key & SWT.MODIFIER_MASK;
char keyChar = (char)keyValue;
if (Character.isLetter(keyChar)) {
// 添加key的大写形式
char ch = Character.toUpperCase(keyChar);
int newKey = ch | modifierValue;
if (action == null)
userActionMap.remove(newKey);
else
userActionMap.put(newKey, action);
// 添加key的小写形式
ch = Character.toLowerCase(keyChar);
newKey = ch | modifierValue;
if (action == null)
userActionMap.remove(newKey);
else
userActionMap.put(newKey, action);
} else {
// 不是字符形式的按键则直接添加
if (action == null)
userActionMap.remove(key);
else
userActionMap.put(key, action);
}
}
/**
* 得到用户自定义动作对象
*
* @param key
* 按键值
* @return
* Runnable对象
*/
public Runnable getUserKeyAction(int key) {
return userActionMap.get(key);
}
/**
* 添加一个按键绑定
* <p>
*
* @param key
* a key code defined in SWT.java or a character. Optionally ORd
* with a state mask. Preferred state masks are one or more of
* SWT.MOD1, SWT.MOD2, SWT.MOD3, since these masks account for
* modifier platform differences. However, there may be cases
* where using the specific state masks (i.e., SWT.CTRL,
* SWT.SHIFT, SWT.ALT, SWT.COMMAND) makes sense.
* @param action
* 动作ID
* @exception SWTException
* <ul>
* <li>ERROR_WIDGET_DISPOSED - if the receiver has been
* disposed</li>
* <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
* thread that created the receiver</li>
* </ul>
*/
public void setKeyBinding(int key, int action) {
checkWidget();
int keyValue = key & SWT.KEY_MASK;
int modifierValue = key & SWT.MODIFIER_MASK;
char keyChar = (char)keyValue;
if (Character.isLetter(keyChar)) {
// 添加key的大写形式
char ch = Character.toUpperCase(keyChar);
int newKey = ch | modifierValue;
if (action == SWT.NULL)
keyActionMap.remove(newKey);
else
keyActionMap.put(newKey, action);
// 添加key的小写形式
ch = Character.toLowerCase(keyChar);
newKey = ch | modifierValue;
if (action == SWT.NULL)
keyActionMap.remove(newKey);
else
keyActionMap.put(newKey, action);
} else {
// 不是字符形式的按键则直接添加
if (action == SWT.NULL)
keyActionMap.remove(key);
else
keyActionMap.put(key, action);
}
}
/**
* 删除一个按键绑定
*
* @param key
*/
public void removeKeyBinding(int key) {
setKeyBinding(key, SWT.NULL);
}
/**
* 创建一些缺省的按键事件
*/
private void createKeyBindings() {
setKeyBinding(SWT.PAGE_UP, PAGE_UP);
setKeyBinding(SWT.PAGE_DOWN, PAGE_DOWN);
setKeyBinding(SWT.HOME, GO_TOP);
setKeyBinding(SWT.END, GO_BOTTOM);
}
/**
* 删除一个用户自定义按键绑定
*
* @param key
* a key code defined in SWT.java or a character. Optionally ORd
* with a state mask. Preferred state masks are one or more of
* SWT.MOD1, SWT.MOD2, SWT.MOD3, since these masks account for
* modifier platform differences. However, there may be cases
* where using the specific state masks (i.e., SWT.CTRL,
* SWT.SHIFT, SWT.ALT, SWT.COMMAND) makes sense.
*/
public void removeUserKeyAction(int key) {
setUserKeyAction(key, null);
}
/**
* 查找和相关按键绑定的动作id
* <p>
*
* @param key
* a key code defined in SWT.java or a character. Optionally ORd
* with a state mask. Preferred state masks are one or more of
* SWT.MOD1, SWT.MOD2, SWT.MOD3, since these masks account for
* modifier platform differences. However, there may be cases
* where using the specific state masks (i.e., SWT.CTRL,
* SWT.SHIFT, SWT.ALT, SWT.COMMAND) makes sense.
* @return
* 动作ID,SWT.NULL表示没有动作
* @exception SWTException
* <ul>
* <li>ERROR_WIDGET_DISPOSED - if the receiver has been
* disposed</li>
* <li>ERROR_THREAD_INVALID_ACCESS - if not called from the
* thread that created the receiver</li>
* </ul>
*/
public int getKeyBinding(int key) {
checkWidget();
Integer action = keyActionMap.get(key);
if (action == null)
return SWT.NULL;
else
return action;
}
/**
* 如果存在这个item,跳到这个item的位置
*
* @param item
* 要显示的Item
* @param expand
* true表示如果这个item不可见,则展开其父item
*/
public void revealItem(QItem item, boolean expand) {
// 如果设置了expand标志,确保item可见
if(!item.isLogicalVisible()) {
if(expand)
expandToItem(item);
else
return;
}
// 滚动到item起始处
setVerticalOffset(getYAtItem(item), true);
}
/**
* 一直展开,直到item为止
*
* @param item
* 展开到的item
*/
public void expandToItem(QItem item) {
QItem parentItem = item.getParentItem();
while(parentItem != null) {
parentItem.setExpanded(true, false);
parentItem = parentItem.getParentItem();
}
}
/**
* 得到一个中文字符串的第一个汉字的声母,如果参数的第一个字母是英文,则返回英文
*
* @param s
* 字符串
* @return
* 第一个汉字的声母,或者英文字符
*/
static char getFirstPy(String s) {
if(s == null)
return 0;
// 去掉两边的空格
String _s = s.trim();
if(_s.length() < 1) return 0;
// 得到第一个字母的编码,如果长度不等于2,那么不是中文字符或者是未知的编码,直接返回
char c = 0;
try {
// TODO 对于GBK,目前还不知道该怎么办
byte[] b = _s.substring(0, 1).getBytes("GB2312");
if(b.length != 2)
return Character.toLowerCase(_s.charAt(0));
c = (char)((b[0] << 8 | b[1] & 0xFF) & 0xFFFF);
} catch (UnsupportedEncodingException e) {
return Character.toLowerCase(_s.charAt(0));
}
// 在表中查找,如果找到了,就返回声母,如果找不到,直接返回
for(char[] py : pyTable) {
if(c >= py[0] && c <= py[1])
return py[2];
}
return Character.toLowerCase(c);
}
/**
* @return Returns the levelIndent.
*/
public int getLevelIndent() {
return levelIndent;
}
/**
* @param levelIndent The levelIndent to set.
*/
public void setLevelIndent(int levelIndent) {
this.levelIndent = levelIndent;
}
/**
* @param itemOpenOnButton The itemOpenOnButton to set.
*/
public void setItemOpenOnButton(int itemOpenOnButton) {
this.itemOpenOnButton = itemOpenOnButton;
}
/**
* @param itemOpenOnSingleClick The itemOpenOnSingleClick to set.
*/
public void setExpandItemOnSingleClick(boolean itemOpenOnSingleClick) {
this.expandItemOnSingleClick = itemOpenOnSingleClick;
}
/**
* 添加一个QTree事件监听器
*
* @param l
* IQTreeListener
*/
public void addQTreeListener(IQTreeListener l) {
if(!qtreeListeners.contains(l))
qtreeListeners.add(l);
}
/**
* 删除一个QTree事件监听器
*
* @param l
* IQTreeListener
*/
public void removeQTreeListener(IQTreeListener l) {
qtreeListeners.remove(l);
}
/**
* 发送item展开事件
*
* @param e
* QTreeEvent
*/
private void sendQTreeExpandedEvent(QTreeEvent e) {
for(IQTreeListener l : qtreeListeners)
l.treeExpanded(e);
}
/**
* 发送item收起事件
*
* @param e
* QTreeEvent
*/
private void sendQTreeCollapsedEvent(QTreeEvent e) {
for(IQTreeListener l : qtreeListeners)
l.treeCollapsed(e);
}
/**
* 发送item文本改变事件
*
* @param e
* QTreeEvent
*/
private void sendQTreeItemTextChangedEvent(QTreeEvent e) {
for(IQTreeListener l : qtreeListeners)
l.itemTextChanged(e);
}
/**
* @return Returns the editable.
*/
public boolean isEditable() {
return editable;
}
/**
* @param editable The editable to set.
*/
public void setEditable(boolean editable) {
this.editable = editable;
}
/**
* 设置滚动条,然后重画
*/
void refresh() {
setScrollBar();
redraw();
}
/**
* 编辑某个item的文本
*
* @param item
* QItem
*/
public void editItemText(QItem item) {
if(!editable)
return;
if(editor.getItem() == item)
return;
if(editor.getEditor() != null)
editor.getEditor().dispose();
Text text = new Text(this, SWT.SINGLE);
if(item.getText() != null)
text.setText(item.getText());
text.selectAll();
text.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
onEditorKeyPressed(e);
}
});
text.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent e) {
onEditorFocusLost(e);
}
});
editor.setEditor(text, item);
}
/**
* 编辑器失去焦点时调用
*
* @param e
*/
protected void onEditorFocusLost(FocusEvent e) {
QTreeEvent event = new QTreeEvent(this, editor.getItem());
Text text = (Text)e.getSource();
editor.getItem().setText(text.getText());
disposeEditor();
sendQTreeItemTextChangedEvent(event);
}
/**
* 处理编辑器中的按键事件
*
* @param e
*/
protected void onEditorKeyPressed(KeyEvent e) {
Text text = (Text)e.getSource();
if(e.keyCode == SWT.CR) {
QTreeEvent event = new QTreeEvent(this, editor.getItem());
editor.getItem().setText(text.getText());
disposeEditor();
sendQTreeItemTextChangedEvent(event);
} else if(e.keyCode == SWT.ESC)
disposeEditor();
}
/**
* 收起所有根节点
*/
public void collapseAll() {
for(int i = 0; i < itemCount; i++)
items[i].setExpanded(false, false);
redraw();
}
/**
* 展开所有根节点
*/
public void expandAll() {
for(int i = 0; i < itemCount; i++)
items[i].setExpanded(true, false);
redraw();
}
/**
* 保存当前的根节点展开状态
*/
public void saveExpandStatus() {
expandCache.clear();
for(int i = 0; i < itemCount; i++) {
if(items[i].isExpanded())
expandCache.add(items[i]);
}
}
/**
* 恢复根节点的张开状态
*/
public void restoreExpandStatus() {
for(QItem item : expandCache)
item.setExpanded(true, false);
redraw();
}
/**
* @param item
* @return
* true表示这个item现在有动画效果在显示
*/
public boolean hasAnimation(QItem item) {
return animateList.contains(item);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -