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

📄 recordviewer.java

📁 lumaQQ的源文件
💻 JAVA
字号:
/*
* LumaQQ - Java QQ Client
*
* Copyright (C) 2004 luma <stubma@163.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package edu.tsinghua.lumaqq.widgets.record;

import static edu.tsinghua.lumaqq.resource.Messages.*;

import java.util.Calendar;
import java.util.Iterator;
import java.util.List;

import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.MenuAdapter;
import org.eclipse.swt.events.MenuEvent;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Spinner;

import edu.tsinghua.lumaqq.models.Cluster;
import edu.tsinghua.lumaqq.models.User;
import edu.tsinghua.lumaqq.record.IKeyConstants;
import edu.tsinghua.lumaqq.record.RecordEntry;
import edu.tsinghua.lumaqq.record.RecordManager;
import edu.tsinghua.lumaqq.resource.Resources;
import edu.tsinghua.lumaqq.ui.MainShell;

/**
 * 聊天记录查看器控件,做成控件比较方便维护
 * 
 * @author luma
 */
public class RecordViewer extends Composite implements DisposeListener {    
	// 界面控件
	private Button chkDisplayAll;
	private Waterfall waterfall;
	private Menu recordMenu;
	// 年月日
	private int year, month, day;
	// 消息管理器
	private RecordManager rm;
	// 消息提供者
	private IRecordProvider provider;
	// IconHolder实例
	private Resources res;
	// 剪贴板实例
	private Clipboard clipboard;
	// MainShell
	private MainShell main;
	
	// 消息过滤器
	private IRecordEntryFilter filter;
	
	/**
	 * @param parent
	 * @param style
	 */
	public RecordViewer(Composite parent, IRecordProvider provider, MainShell main) {
		super(parent, SWT.NONE);		
		
		// 初始化变量
		this.provider = provider;
		this.main = main;
		clipboard = new Clipboard(getDisplay());
		res = Resources.getInstance();
		Calendar c = Calendar.getInstance();
		year = c.get(Calendar.YEAR);
		month = c.get(Calendar.MONTH) + 1;
		day = c.get(Calendar.DAY_OF_MONTH);
		// 初始化窗口布局
		initLayout();
		// 初始化弹出菜单
		initPopupMenu();
		// 添加事件监听器
		addDisposeListener(this);
	}
	
	@Override
	public void setFont(Font font) {
		super.setFont(font);
		waterfall.setFont(font);
	}

	/**
	 * 初始化弹出菜单
	 */
	private void initPopupMenu() {
		recordMenu = new Menu(this);
		// 拷贝消息到剪贴板
		MenuItem mi = new MenuItem(recordMenu, SWT.PUSH);
		mi.setText(record_viewer_menu_copy);
		mi.setImage(res.getImage(Resources.icoCopy));
		mi.addSelectionListener(
			new SelectionAdapter() {
				public void widgetSelected(SelectionEvent e) {			
					RecordEntry entry = getSelectedMessageEntry();
					if(entry != null) {
						String copyString = provider.copyToClipboard(entry);
						if(copyString != null)
							clipboard.setContents(new Object[] { copyString }, new Transfer[] { TextTransfer.getInstance() });

					}
				}
			}
		);
		// 导出表中所有信息
		mi = new MenuItem(recordMenu, SWT.PUSH);
		mi.setText(record_viewer_menu_export);
		mi.setImage(res.getImage(Resources.icoTxtFile));
		mi.addSelectionListener(
			new SelectionAdapter() {
				public void widgetSelected(SelectionEvent e) {
					switch(provider.getExportType()) {
						case IRecordExporter.EXPORT_FRIEND:
							main.getExportHelper().exportMessage((User)provider.getModel(), provider.getRecords());
							break;
						case IRecordExporter.EXPORT_CLUSTER:
							main.getExportHelper().exportMessage((Cluster)provider.getModel(), provider.getRecords());
							break;
						case IRecordExporter.EXPORT_SMS:
							main.getExportHelper().exportMessage((String)provider.getModel(), provider.getRecords());
							break;
						case IRecordExporter.EXPORT_SYSTEM:
							main.getExportHelper().exportSystemMessage(provider.getRecords());
							break;
					}
				}
			}
		);
		// 添加菜单显示事件监听器
		recordMenu.addMenuListener(
			new MenuAdapter() {
				public void menuShown(MenuEvent e) {
					recordMenu.getItem(0).setEnabled(waterfall.getSelection() != null);
				}
			}
		);
	}

	/**
	 * 初始化界面布局
	 */
	private void initLayout() {
		GridLayout layout = new GridLayout(8, false);
		layout.marginHeight = layout.marginWidth = 0;
		layout.horizontalSpacing = 0;		
		setLayout(layout);
		// 显示标签
		Label lblDisplay = new Label(this, SWT.NONE);		
		lblDisplay.setText(record_viewer_label_display);
		lblDisplay.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_CENTER));
		// 年spinner
		GridData gd = new GridData(GridData.VERTICAL_ALIGN_CENTER);
		gd.horizontalIndent = 5;
		Spinner spinYear = new Spinner(this, SWT.READ_ONLY);
		spinYear.setLayoutData(gd);
		spinYear.setMinimum(1970);
		spinYear.setMaximum(3000);
		spinYear.setSelection(year);
		spinYear.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				Spinner spin = (Spinner)e.getSource();
				year = spin.getSelection();
				if(!chkDisplayAll.getSelection())
					refreshRecord();	
			}
		});
		// 年标签
		gd = new GridData(GridData.VERTICAL_ALIGN_CENTER);
		gd.horizontalIndent = 1;
		Label lblYearChar = new Label(this, SWT.READ_ONLY);
		lblYearChar.setText(record_viewer_label_year);
		lblYearChar.setLayoutData(gd);
		// 月Spinner
		gd = new GridData(GridData.VERTICAL_ALIGN_CENTER);
		gd.horizontalIndent = 5;
		Spinner spinMonth = new Spinner(this, SWT.NONE);
		spinMonth.setLayoutData(gd);
		spinMonth.setMinimum(1);
		spinMonth.setMaximum(12);
		spinMonth.setSelection(month);
		spinMonth.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				Spinner spin = (Spinner)e.getSource();
				month = spin.getSelection();
				if(!chkDisplayAll.getSelection())
					refreshRecord();	
			}
		});
		// 月标签
		gd = new GridData(GridData.VERTICAL_ALIGN_CENTER);
		gd.horizontalIndent = 1;
		Label lblMonthChar = new Label(this, SWT.NONE);
		lblMonthChar.setText(record_viewer_label_month);
		lblMonthChar.setLayoutData(gd);
		// 日Spinner
		gd = new GridData(GridData.VERTICAL_ALIGN_CENTER);
		gd.horizontalIndent = 5;
		Spinner spinDay = new Spinner(this, SWT.READ_ONLY);
		spinDay.setLayoutData(gd);
		spinDay.setMinimum(1);
		spinDay.setMaximum(31);
		spinDay.setSelection(day);
		spinDay.addSelectionListener(new SelectionAdapter() {
			public void widgetSelected(SelectionEvent e) {
				Spinner spin = (Spinner)e.getSource();
				day = spin.getSelection();
				if(!chkDisplayAll.getSelection())
					refreshRecord();	
			}
		});
		// 日标签
		gd = new GridData(GridData.VERTICAL_ALIGN_CENTER);
		gd.horizontalIndent = 1;
		Label lblDayChar = new Label(this, SWT.NONE);
		lblDayChar.setText(record_viewer_label_day);
		lblDayChar.setLayoutData(gd);
		// 显示所有check box
		gd = new GridData(GridData.VERTICAL_ALIGN_CENTER);
		gd.horizontalIndent = 10;
		chkDisplayAll = new Button(this, SWT.CHECK | SWT.FLAT);
		chkDisplayAll.setText(record_viewer_button_display_all);
		chkDisplayAll.setLayoutData(gd);
		chkDisplayAll.addSelectionListener(
			new SelectionAdapter() {
				public void widgetSelected(SelectionEvent e) {
					refreshRecord();
				}
			}
		);
		// 聊天记录表
		waterfall = new Waterfall(this);
		waterfall.setContentProvider(provider.getRecordContentProvider());
		waterfall.setLabelProvider(provider.getRecordLabelProvider());
		waterfall.setSorter(provider.getRecordSorter());
		gd = new GridData(GridData.FILL_BOTH);
		gd.horizontalSpan = layout.numColumns;
		waterfall.setLayoutData(gd);
		// 添加表格的鼠标事件
		waterfall.addMouseListener(
			new MouseAdapter() {
				public void mouseUp(MouseEvent e) {
					if((e.stateMask & SWT.BUTTON3) != 0) 
						popupMenu(e);
				}
			}
		);
		waterfall.setInput(this);
		// layout, do it for linux
		layout();
	}
	
	/**
	 * 弹出菜单
	 * @param e
	 */
	private void popupMenu(MouseEvent e) {
		recordMenu.setLocation(waterfall.toDisplay(e.x, e.y));
		recordMenu.setVisible(true);
	}
	
	/**
	 * 设置聊天记录表中的内容,显示的是当前年月日的记录,如果设置了显示
	 * 所有,则显示所有记录
	 * 
	 * @param displayAll 
	 * 		true时表示显示所有
	 */
	public void refreshRecord() {
		if(rm == null)
			return;
		// 清除所有
		List<RecordEntry> list = null;
		// 得到消息列表
		if(chkDisplayAll.getSelection())
			list = rm.getRecord(provider.getId(), IKeyConstants.ALL, IKeyConstants.SUB_ALL);
		else 
			list = rm.getRecords(provider.getId(), IKeyConstants.ALL, IKeyConstants.SUB_ALL, year, month, day, year, month, day + 1);
		// 刷新列表
		filter(list);
		provider.setRecords(list);
		waterfall.refresh();
	}
	
	/**
	 * 过滤消息记录
	 * 
	 * @param list
	 */
	private void filter(List<RecordEntry> list) {
		if(filter == null)
			return;
		for(Iterator<RecordEntry> i = list.iterator(); i.hasNext(); ) {
			if(!filter.select(i.next()))
				i.remove();
		}
	}

	/**
	 * @return Returns the mm.
	 */
	public RecordManager getRecordManager() {
		return rm;
	}
	
	/**
	 * @param mm The mm to set.
	 */
	public void setRecordManager(RecordManager rm) {
		this.rm = rm;
	}
	
	/**
	 * @return 当前选择的项的相关的MessageEntry对象,如果当前没有Item被选,返回null
	 */
	public RecordEntry getSelectedMessageEntry() {
		Object obj = waterfall.getSelection();
		return (obj == null) ? null : ((RecordEntry)obj);
	}
	
	/**
	 * @return
	 * 		返回当前选择的聊天记录内容
	 */
	public String getSelectedText() {
		RecordEntry entry = (RecordEntry)getSelectedMessageEntry();
		return (entry == null) ? "" : entry.message;
	}
	
	/**
	 * @return
	 * 		当前选择记录的全文,即包括时间和发送者
	 */
	public String getSelectedFullText() {
		RecordEntry entry = (RecordEntry)getSelectedMessageEntry();
		return provider.getRecordLabelProvider().getText(entry);
	}
	
	/**
	 * 添加TableItem选择事件监听器
	 * 
	 * @param listener
	 */
	public void addSelectionListener(SelectionListener listener) {
		waterfall.addSelectionListener(listener);
	}
	
	/**
	 * 除去TableItem选择事件监听器
	 * 
	 * @param listener
	 */
	public void removeSelectionListener(SelectionListener listener) {
		waterfall.removeSelectionListener(listener);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
	 */
	public void widgetDisposed(DisposeEvent e) {
		clipboard.dispose();
	}	
	
	/* (non-Javadoc)
     * @see org.eclipse.swt.widgets.Control#setBackground(org.eclipse.swt.graphics.Color)
     */
    public void setBackground(Color color) {
        super.setBackground(color);
        Control[] children = getChildren();
        for(int i = 0; i < children.length; i++) {
            children[i].setBackground(color);
        }
    }

	public IRecordProvider getProvider() {
		return provider;
	}

	public void setProvider(IRecordProvider provider) {
		this.provider = provider;
		waterfall.setContentProvider(provider.getRecordContentProvider());
		waterfall.setLabelProvider(provider.getRecordLabelProvider());
		waterfall.setSorter(provider.getRecordSorter());
	}

	/**
	 * @return Returns the filter.
	 */
	public IRecordEntryFilter getFilter() {
		return filter;
	}

	/**
	 * @param filter The filter to set.
	 */
	public void setFilter(IRecordEntryFilter filter) {
		this.filter = filter;
	}
}

⌨️ 快捷键说明

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