package com.cxy.redisclient.presentation.pubsub; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import redis.clients.jedis.JedisPubSub; import com.cxy.redisclient.integration.I18nFile; import com.cxy.redisclient.presentation.RedisClient; import com.cxy.redisclient.presentation.component.EditListener; import com.cxy.redisclient.service.PubSubService; public class SubChannel { private int id; private String subChannel; private CTabFolder tabFolder; private CTabItem tbtmSubItem; private TableColumn tblclmnNewColumn; private TableColumn tblclmnNewColumn_1; private TableColumn tblclmnNewColumn_2; public SubChannel(int id, final String subChannel, CTabFolder tabFolder){ this.id = id; this.subChannel = subChannel; this.tabFolder = tabFolder; } public CTabItem init(){ tbtmSubItem = new CTabItem(tabFolder, SWT.NONE); tbtmSubItem.setShowClose(true); Composite composite = new Composite(tabFolder, SWT.NONE); tbtmSubItem.setControl(composite); composite.setLayout(new GridLayout(1, false)); tbtmSubItem.setText(subChannel + " " + RedisClient.i18nFile.getText(I18nFile.CHANNEL)); final Table table = new Table(composite, SWT.BORDER | SWT.FULL_SELECTION); table.setHeaderVisible(true); table.setLinesVisible(true); EditListener listener = new EditListener(table, false, true); table.addListener(SWT.MouseDown, listener); table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1)); tblclmnNewColumn = new TableColumn(table, SWT.NONE); tblclmnNewColumn.setWidth(100); tblclmnNewColumn.setText(RedisClient.i18nFile.getText(I18nFile.TIME)); tblclmnNewColumn_1 = new TableColumn(table, SWT.NONE); tblclmnNewColumn_1.setWidth(100); tblclmnNewColumn_1.setText(RedisClient.i18nFile.getText(I18nFile.CHANNEL)); tblclmnNewColumn_2 = new TableColumn(table, SWT.NONE); tblclmnNewColumn_2.setWidth(100); tblclmnNewColumn_2.setText(RedisClient.i18nFile.getText(I18nFile.MESSAGE)); final JedisPubSub callback = new JedisPubSub() { @Override public void onMessage(String channel, String message) { messageReceived(table, channel, message); } private void messageReceived(final Table table, final String channel, final String message) { Display.getDefault().asyncExec(new Runnable() { public void run() { TableItem item = new TableItem(table, SWT.None); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS", Locale.getDefault()); String time = df.format(new Date()); String[] str = new String[]{time, channel, message}; item.setText(str); table.setSelection(item); } }); } @Override public void onPMessage(String pattern, String channel, String message) { messageReceived(table, channel, message); } @Override public void onSubscribe(String channel, int subscribedChannels) { // TODO Auto-generated method stub } @Override public void onUnsubscribe(String channel, int subscribedChannels) { // TODO Auto-generated method stub } @Override public void onPUnsubscribe(String pattern, int subscribedChannels) { // TODO Auto-generated method stub } @Override public void onPSubscribe(String pattern, int subscribedChannels) { // TODO Auto-generated method stub } }; final Thread t = new Thread(new Runnable() { public void run() { PubSubService subscribe = new PubSubService(); subscribe.subscribe(id, callback, subChannel); } }); t.start(); tbtmSubItem.addDisposeListener(new DisposeListener() { @Override public void widgetDisposed(DisposeEvent e) { callback.punsubscribe(); } }); return tbtmSubItem; } public void refreshLangUI(){ tbtmSubItem.setText(subChannel + " " + RedisClient.i18nFile.getText(I18nFile.CHANNEL)); tblclmnNewColumn.setText(RedisClient.i18nFile.getText(I18nFile.TIME)); tblclmnNewColumn_1.setText(RedisClient.i18nFile.getText(I18nFile.CHANNEL)); tblclmnNewColumn_2.setText(RedisClient.i18nFile.getText(I18nFile.MESSAGE)); } }