styledtextdelegate.java

来自「一个功能强大的聊天程序.....基本实现所有功能....强烈推荐下载」· Java 代码 · 共 635 行 · 第 1/2 页

JAVA
635
字号
	 * @param image
	 * 		图像
	 * @param placeholder
	 * 		占位内容
	 * @param disposable
	 * 		true表示这个图像被删除时是否dispose掉
	 */
	public void insertImage(Image image, String placeholder, boolean disposable) {
		if(image == null)
			return;
		StyleObject so = new StyleObject(StyleObject.IMAGE, image, disposable);
		insertObject(so, placeholder);
	}
	
	/**
	 * 在文本末尾追加一个图像
	 * 
	 * @param image
	 * 		图像
	 * @param placeholder
	 * 		占位内容
	 * @param disposable
	 * 		true表示这个图像被删除时是否dispose掉
	 */
	public void appendImage(Image image, String placeholder, boolean disposable) {
		StyleObject so = new StyleObject(StyleObject.IMAGE, image, disposable);
		appendObject(so, placeholder);
	}
	
	/**
	 * 追加一个对象 
	 * 
	 * @param so
	 * @param placeholder
	 */
	private void appendObject(StyleObject so, String placeholder) {
		int offset = st.getCharCount();
		st.replaceTextRange(offset, 0, placeholder);
		addObject(so, offset, placeholder.length());
	}

	/**
	 * 插入动画
	 * 
	 * @param loader
	 * @param placeholder
	 * @param disposable
	 */
	public void insertImage(ImageLoader loader, String placeholder, boolean disposable) {
		if(loader == null)
			return;
		final Animator ani = new Animator(st);
		ani.setLoader(loader);
		ani.setSize(loader.logicalScreenWidth, loader.logicalScreenHeight);
		ani.setBackground(st.getBackground());
		insertControl(ani, placeholder, disposable);
	}
	
	/**
	 * 追加动画
	 * 
	 * @param loader
	 * @param placeholder
	 * @param disposable
	 */
	public void appendImage(ImageLoader loader, String placeholder, boolean disposable) {
		if(loader == null)
			return;
		Animator ani = new Animator(st);
		ani.setLoader(loader);
		ani.setSize(loader.logicalScreenWidth, loader.logicalScreenHeight);
		ani.setBackground(st.getBackground());
		appendControl(ani, placeholder, disposable);
	}
	
	/**
	 * 插入控件
	 * 
	 * @param control
	 * @param placeholder
	 * @param disposable
	 */
	public void insertControl(Control control, String placeholder, boolean disposable) {
		StyleObject so = new StyleObject(StyleObject.CONTROL, control, disposable);
		insertObject(so, placeholder);
	}
	
	/**
	 * 追加控件
	 * 
	 * @param control
	 * @param placeholder
	 * @param disposable
	 */
	public void appendControl(Control control, String placeholder, boolean disposable) {
		StyleObject so = new StyleObject(StyleObject.CONTROL, control, disposable);
		appendObject(so, placeholder);
	}
	
	/**
	 * 插入一个对象
	 * 
	 * @param so
	 * @param placeholder
	 */
	private void insertObject(StyleObject so, String placeholder) {
		if(st.getSelectionCount() > 0) {
			Point range = st.getSelectionRange();
			st.replaceTextRange(range.x, range.y, placeholder);
			addObject(so, range.x, placeholder.length());
		} else {
			st.replaceTextRange(st.getCaretOffset(), 0, placeholder);
			addObject(so, st.getCaretOffset(), placeholder.length());
		}
		st.setCaretOffset(st.getCaretOffset() + placeholder.length());
	}

	/**
	 * 刷新拷贝缓冲
	 */
	private void refreshCopyCache() {
		// 检查延迟释放缓冲中的对象
		releaseObject();
		
		// 如果选择为空,返回
		if(st.getSelectionCount() <= 0)
			return;
		
		// copy的内容中是否有对象,有则保存到cache里面
		Point selection = st.getSelection();
		for(Entry<Point, StyleObject> entry : objects.entrySet()) {
			Point range = entry.getKey();
			if(selection.x <= range.x && range.x < selection.y) {
				copyObject.add(entry.getValue());
				objectOffset.add(range.x - selection.x);
			}
		}
	}

	/**
	 * 清空缓冲,释放一些对象
	 */
	private void releaseObject() {
		for(StyleObject so : copyObject) {
			if(deferredDispose.contains(so))
				so.dispose();
		}
		copyObject.clear();
		objectOffset.clear();
		deferredDispose.clear();
	}
	
	/**
	 * copy
	 */
	public void copy() {
		refreshCopyCache();
		st.copy();
		copyString = (String)clipboard.getContents(TextTransfer.getInstance());
		if(copyString == null)
			copyString = "";
	}	

	/**
	 * paste
	 */
	public void paste() {
		int offset = (st.getSelectionCount() > 0) ? st.getSelectionRange().x : st.getCaretOffset();
		st.paste();
		if(copyObject.isEmpty())
			return;
		
		String str = (String)clipboard.getContents(TextTransfer.getInstance());
		if(copyString.equals(str)) {
			int size = copyObject.size();
			for(int i = 0 ; i < size; i++) {
				addObject(StyleObjectReplicator.replicate(copyObject.get(i)), objectOffset.get(i) + offset, 1);
			}			
		} else
			releaseObject();
	}
	
	/**
	 * cut
	 */
	public void cut() {
		refreshCopyCache();
		st.cut();
		copyString = (String)clipboard.getContents(TextTransfer.getInstance());
		if(copyString == null)
			copyString = "";
	}
	
	/**
	 * 添加一个用户自定义按键事件
	 * 
	 * @param key
	 * @param action
	 */
	public void setUserKeyAction(int key, Runnable 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
	 */
	public void removeUserKeyAction(int key) {
		userActionMap.remove(key);
	}
	
	/**
	 * 得到用户自定义动作对象
	 * 
	 * @param key
	 * 		按键值
	 * @return
	 * 		Runnable对象
	 */
	public Runnable getUserKeyAction(int key) {
	    return userActionMap.get(key);
	}

	public void setDefaultStyle(LineStyle defaultStyle) {
		st.setForeground(defaultStyle.foreground);
		if(font != null)
			font.dispose();
		FontData fd = new FontData(defaultStyle.fontName, defaultStyle.fontSize, defaultStyle.fontStyle);
		font = new Font(st.getDisplay(), fd);
		st.setFont(font);
	}

	public void setForbiddenAnimation(boolean selection) {
		for(StyleObject so : objects.values()) {
			if(so.objectType == StyleObject.CONTROL) {
				if(so.object instanceof Animator) {
					if(selection)
						((Animator)so.object).stopAnimation();
					else
						((Animator)so.object).resumeAnimation();
				}
			}
		}
	}

	public void clear() {
		st.setText("");
		disposeStyleObjects();
	}

	private void disposeStyleObjects() {
		for(StyleObject so : objects.values())
			so.dispose();
		for(StyleObject so : copyObject)
			so.dispose();
		for(StyleObject so : deferredDispose)
			so.dispose();
		objects.clear();
		copyObject.clear();
		deferredDispose.clear();
		objectOffset.clear();
		objectY.clear();
		temp.clear();
	}

	public boolean isReadonly() {
		return !st.getEditable();
	}

	public void appendText(String text) {
		st.append(text);
	}

	public void setFocus() {
		st.setFocus();
	}

	public void setReadonly(boolean b) {
		st.setEditable(!b);
	}

	public boolean isDisposed() {
		return st.isDisposed();
	}

	public void setText(String text) {
		clear();
		st.setText(text);
	}	
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?