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 + -
显示快捷键?