Eclipse RCP自动输入援助的实现--swtaddons的使用与扩展

11 篇文章 0 订阅
5 篇文章 0 订阅

一、效果
 将输入过的值保存在临时文件中,当重新输入时可以根据已经输入的文字进行匹配显示。



二、使用 

     //  生成控件
        txtTheaterName  =   new  Text(cmpCondition, SWT.BORDER);
        txtTheaterName.setBounds(
55 0 150 20 );
        actTheaterName 
=   new  DCAutoCompleteTextInput(txtTheaterName,  " TheaterList.actTheaterName " );

 

     //  在检索按钮的点击事件中添加新的输入文字
        actTheaterName.registerText();

 

三、代码

 DCAutoCompleteTextInput扩展swtaddons的AutocompleteTextInput,实现功能
1)、定义弹出框的大小
2)、当Text控件消除的时候,消除关联的ContentProvider。
3)、自动关联DCAutoCompleteContentProvider
4)、提供注册的新文字的接口registerText()

package jp.co.ntt.dc.framework.client.autocomplete;

import net.sf.swtaddons.autocomplete.AutocompleteContentProposalProvider;
import net.sf.swtaddons.autocomplete.text.AutocompleteTextInput;

import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Text;


/**
 * <b>系统名称:</b>Digital Cinema心得--SWT学习与使用<br>
 * <b>技能名称:</b>输入援助机能<br>
 * <b>处理说明:</b>当再次输入时,如果和以前输入的值前端一致就会显示一个列表供选择。<br>
 * <b>变更履历:</b>2007/10/16 MuChunYu Create<br>
 * <br>
 * 
 * @author Mu ChunYu
 * @version 1.0 2007/07/04 初版
 * <p>
 
*/

public   class  DCAutoCompleteTextInput extends AutocompleteTextInput  {

    
/**
     * <b>機能概要:</b> 构造函数。<br>
     * <br>
     * <b>処理詳細:</b> <br>
     * <ul>
     * <li>親コンストラクタを呼び出す
     * <li>入力援助のサイズを設定する
     * <li>Disposeリスナーを追加する
     * </ul>
     * 
     * @param text 連れたテキストフィールド
     * @param key 内容提供者のキー
     * @since 1.0
     * <p>
     
*/

    
public DCAutoCompleteTextInput(Text text, String key) {
        super(text, 
new String[] {key});
        
this.adapter.setPopupSize(new Point(150100));
        text.addDisposeListener(
new DisposeListener() {
            
public void widgetDisposed(DisposeEvent e) {
                dispose();
            }

        }
);
    }


    
/**
     * <b>機能概要:</b> 内容提供者を取得する。<br>
     * <br>
     * <b>処理詳細:</b> <br>
     * <ul>
     * <li>内容提供者を取得する
     * </ul>
     * 
     * @param proposals 内容
     * @return DCAutoCompleteContentProvider 内容提供者
     * @since 1.0
     * <p>
     
*/

    @Override
    
protected AutocompleteContentProposalProvider getContentProposalProvider(String[] proposals) {
        
return new DCAutoCompleteContentProvider(proposals[0]);
    }


    
/**
     * <b>機能概要:</b> 連れたテキストフィールドのテキストを取得する。<br>
     * <br>
     * <b>処理詳細:</b> <br>
     * <ul>
     * <li>連れたテキストフィールドのテキストを取得する
     * </ul>
     * 
     * @return String 連れたテキストフィールドのテキス
     * @since 1.0
     * <p>
     
*/

    
public String getText() {
        
return this.text.getText();
    }


    
/**
     * <b>機能概要:</b> dispose前の処理部。<br>
     * <br>
     * <b>処理詳細:</b> <br>
     * <ul>
     * <li>入力援助をdisposeする
     * </ul>
     * 
     * @since 1.0
     * <p>
     
*/

    
public void dispose() {
        ((DCAutoCompleteContentProvider) 
this.provider).dispose();
    }


    
/**
     * <b>機能概要:</b> 入力援助内容を登録する。<br>
     * <br>
     * <b>処理詳細:</b> <br>
     * <ul>
     * <li>入力援助内容を登録する
     * </ul>
     * 
     * @since 1.0
     * <p>
     
*/

    
public void registerText() {
        ((DCAutoCompleteContentProvider) 
this.provider).registerContent(getText());
    }


}

 DCAutoCompleteContentProvider扩展swtaddons的AutocompleteContentProposalProvider,实现功能
1)、根据key自动加载、保存援助的内容
2)、可配置的自动输入援助List的大小,默认大小为20
3)、可配置的自动输入援助文件的保存路径,默认为当前目录下的tmp目录
4)、可配置的自动输入援助文件的编码格式,默认为UTF-8
存在问题:代码中使用一个静态类,以提供可配置的List大小和保存路径
改进点:
1)、添加三个成员变量:
 contentsSize:默认值20
 encoding:默认值UTF-8
 path:默认值./tmp
2)、删除已有的构造函数,添加一个有四个参数的构造函数
3)、添加一个DCAutoCompleteContentProviderFactory,其中提供可配置contentsSize,encoding,path
4)、DCAutoCompleteTextInput添加一个DCAutoCompleteContentProviderFactory的属性,在生成DCAutoCompleteContentProvider的时候,只向DCAutoCompleteContentProviderFactory提供key属性。

package  jp.co.ntt.dc.framework.client.autocomplete;

import  java.io.File;
import  java.util.LinkedList;

import  jp.co.ntt.dc.framework.client.context.DCContext;
import  jp.co.ntt.dc.framework.common.MessageKeys;
import  jp.co.ntt.dc.framework.common.log.Logger;
import  net.sf.swtaddons.autocomplete.AutocompleteContentProposalProvider;

import  org.apache.commons.io.FileUtils;
import  org.apache.commons.lang.StringUtils;

/**
 * <b>サブシステム名:</b>デジタルシネマ クライアントのフレームワーク<br>
 * <b>機能名称:</b>自動入力援助機能<br>
 * <b>処理説明:</b>自動入力援助の内容を提供するクラス。<br>
 * <b>変更履歴:</b>2007/06/14 NTT-AT 新規<br>
 * <br>
 * 
 * 
@author NTT-AT
 * 
@since 1.0
 * 
@version 1.0 2007/06/14 初版
 * <p>
 
*/

public   class  DCAutoCompleteContentProvider  extends  AutocompleteContentProposalProvider  {

    
/** エンコーディング:UTF-8 */
    
private static final String ENCODING = "utf-8";

    
/** ログ */
    
private Logger logger = new Logger(getClass());

    
/** 内容リスト */
    
private LinkedList <String> contents = new LinkedList <String>();

    
/** 提供者のキー */
    
private String key = null;

    
/**
     * <b>機能概要:</b> コンストラクタ。<br>
     * <br>
     * <b>処理詳細:</b> <br>
     * <ul>
     * <li>親コンストラクタを呼び出す
     * <li>内容ファイルをロードする
     * <li>自動入力援助内容をリフレッシュする
     * </ul>
     * 
     * 
@param key 内容提供者のキー
     * 
@since 1.0
     * <p>
     
*/

    
public DCAutoCompleteContentProvider(String key) {
        
super(null);
        
this.key = key;
        load();
        refreshProposals();
    }


    
/**
     * <b>機能概要:</b> 入力援助内容を登録する。<br>
     * <br>
     * <b>処理詳細:</b> <br>
     * <ul>
     * <li>最後の空白は削除する
     * <li>空ストリングなら、登録しなし
     * <li>保存したデータリストのサイズを最大サイズを超えた場合、最後アイテムを削除する
     * <li>登録アイテムが存在した場合、先頭に移動する
     * <li>アイテムを先頭に追加する
     * </ul>
     * 
@param proposal 入力援助
     * 
@since 1.0
     * <p>
     
*/

    
public void registerContent(String proposal) {

        String value 
= org.springframework.util.StringUtils.trimTrailingWhitespace(proposal);

        
// 空ストリングなら、登録しなし
        if (StringUtils.isEmpty(value)) {
            
return;
        }


        
// 保存したデータリストのサイズを最大サイズを超えた場合、最後アイテムを削除する
        while (this.contents.size() >= DCContext.getAutoListMaxSize()) {
            
this.contents.removeLast();
        }


        
// 登録アイテムが存在した場合、先頭に移動する
        if (this.contents.contains(value)) {
            
this.contents.remove(value);
        }


        
// アイテムを先頭に追加する
        this.contents.addFirst(value);

        
// リストデータをレフレッシュする
        refreshProposals();
    }



    
/**
     * <b>機能概要:</b> 入力援助をリフレッシュする。<br>
     * <br>
     * <b>処理詳細:</b> <br>
     * <ul>
     * <li>入力援助をリフレッシュする
     * </ul>
     * 
     * 
@since 1.0
     * <p>
     
*/

    
private void refreshProposals() {
        
this.proposals = this.contents.toArray(new String[0]);
    }


    
/**
     * <b>機能概要:</b> 内容ファイルをロードする。<br>
     * <br>
     * <b>処理詳細:</b> <br>
     * <ul>
     * <li>内容ファイルをロードする
     * </ul>
     * 
     * 
@since 1.0
     * <p>
     
*/

    
private void load() {
        String filePath 
= DCContext.getAutoCompletePath() + this.key;
        File file 
= new File(filePath);
        
if (!file.exists()) {
            
return;
        }


        
try {
            
this.contents.addAll(FileUtils.readLines(file, ENCODING));
        }
 catch (Exception e) {
            
this.logger.warn(MessageKeys.M00_00570, new String[] {filePath});
            
this.logger.debug(MessageKeys.M00_00570, e);
        }


        
// 保存したデータリストのサイズを最大サイズを超えた場合、最後アイテムを削除する
        while (this.contents.size() > DCContext.getAutoListMaxSize()) {
            
this.contents.removeLast();
        }

    }


    
/**
     * <b>機能概要:</b> 内容ファイルを保存する。<br>
     * <br>
     * <b>処理詳細:</b> <br>
     * <ul>
     * <li>内容ファイルを保存する
     * </ul>
     * 
     * 
@since 1.0
     * <p>
     
*/

    
private void save() {
        String filePath 
= DCContext.getAutoCompletePath() + this.key;
        File file 
= new File(filePath);
        
try {
            
if (!file.exists()) {
                FileUtils.forceMkdir(
new File(DCContext.getAutoCompletePath()));
            }

            FileUtils.writeLines(file, ENCODING, 
this.contents);
        }
 catch (Exception e) {
            
this.logger.warn(MessageKeys.M00_00571, new String[] {filePath});
            
this.logger.debug(MessageKeys.M00_00571, e);
        }

    }


    
/**
     * <b>機能概要:</b> dispose前の処理部。<br>
     * <br>
     * <b>処理詳細:</b> <br>
     * <ul>
     * <li>内容ファイルを保存する
     * </ul>
     * 
     * 
@since 1.0
     * <p>
     
*/

    
public void dispose() {
        save();
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值