⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qtree.java

📁 lumaQQ的源文件
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
	 */
	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 + -