package org.fanhongtao.middleman.ui;
import java.util.ArrayList;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
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.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import org.fanhongtao.lang.StringUtils;
import org.fanhongtao.log.SwtTextAppender;
import org.fanhongtao.middleman.server.MuteServer;
import org.fanhongtao.net.frame.MsgInfo;
import org.fanhongtao.swt.layout.BorderData;
import org.fanhongtao.swt.layout.BorderLayout;
import org.fanhongtao.utils.Utils;
/**
* @author Dharma
* @created 2008-10-20
*/
public class MiddleMan
{
private Text textPort = null;
private Button btnStart = null;
private Table table = null; // 显示消息概要信息的表
private Text textDetail = null; // 显示某一个特定消息的详细信息
private Text textLog = null; // 显示运行日志
private ArrayList<MsgInfo> msgList = new ArrayList<MsgInfo>(); // 记录所收到的完整的消息
private MuteServer server = null;
static Logger logger = Logger.getLogger(MiddleMan.class);
/**
* run函数基本可以不用修改,所有SWT程序都是这样写的。
*/
public void run()
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setSize(600, 500);
shell.setText("Middle Man");
createContents(shell);
// shell.pack(); // 可选步骤
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
{
display.sleep();
}
}
display.dispose();
}
public void createContents(Shell shell)
{
shell.setLayout(new BorderLayout());
createConfigure(shell);
createContent(shell);
}
/**
* 创建输入监听端口号的
* @param shell
*/
private void createConfigure(Shell shell)
{
Composite composite = new Composite(shell, SWT.NONE);
composite.setLayoutData(BorderData.NORTH);
composite.setLayout(new RowLayout());
new Label(composite, SWT.NONE).setText("监听端口(&P)");
textPort = new Text(composite, SWT.NONE);
textPort.setText("8088 ");
new Label(composite, SWT.NONE).setText(" ");
btnStart = new Button(composite, SWT.TOGGLE);
btnStart.setText("开始(&S)");
btnStart.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
super.widgetSelected(e);
pushButton();
}
});
}
private void pushButton()
{
if (btnStart.getSelection())
{
if (!startServer())
{
btnStart.setSelection(false);
}
}
else
{
stopServer();
}
}
private void createContent(Shell shell)
{
SashForm sashForm = new SashForm(shell, SWT.VERTICAL);
sashForm.setLayoutData(BorderData.CENTER);
table = new Table(sashForm, SWT.SINGLE | SWT.FULL_SELECTION | SWT.BORDER);
table.setHeaderVisible(true);
table.setLinesVisible(true);
for (int i = 0; i < columnName.length; i++)
{
TableColumn column = new TableColumn(table, SWT.NONE);
column.setText(columnName[i]);
column.pack();
}
table.addMouseListener(new MouseAdapter()
{
@Override
public void mouseDoubleClick(MouseEvent e)
{
super.mouseDoubleClick(e);
showDetailMsg();
}
});
// textDetail = new Text(sashForm, SWT.BORDER | SWT.MULTI);
textLog = new Text(sashForm, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL);
textLog.addDisposeListener(new DisposeListener()
{
@Override
public void widgetDisposed(DisposeEvent e)
{
shutDownServer();
}
});
SwtTextAppender appender = new SwtTextAppender(textLog);
appender.setLayout(new PatternLayout("%r [%t] %-5p %c - %m%n"));
Logger.getRootLogger().addAppender(appender);
}
private boolean startServer()
{
int port = Integer.parseInt(textPort.getText().trim());
// server = new AsyncServer(port, this);
boolean ret = server.bind();
if (ret)
{
new Thread(server).start();
btnStart.setText("停止(&S)");
}
return ret;
}
private void stopServer()
{
server.setQuit(true);
btnStart.setText("开始(&S)");
}
private void shutDownServer()
{
// 终止后台线程运行
if (server != null)
{
server.setQuit(true);
// Server线程select时间为1秒,这里sleep2秒,以便Server有足够的时间退出
Utils.sleep(2000);
}
}
/**
* 在文本框中显示详细的消息
*/
private void showDetailMsg()
{
int selIndex = table.getSelectionIndex();
if (selIndex < 0)
{
// logger.warn("No message selected.");
return;
}
TableItem item = table.getItem(selIndex);
try
{
textDetail.setText(item.getText());
int msgIndex = Integer.parseInt(item.getText(0)) - 1;
MsgInfo msgInfo = (MsgInfo)msgList.get(msgIndex);
textDetail.setText(StringUtils.toHexString(msgInfo.getMsg()));
}
catch (Exception e)
{
textDetail.append("显示错误信息:\r\n");
String errInfo = e.getLocalizedMessage();
textDetail.append(errInfo);
}
}
public void log(String str)
{
textLog.append(str);
textLog.append(StringUtils.CRLF);
}
private static final String[] columnName = { "序号", "发送IP", "发送端口", "接收IP", "接入端口", "消息长度" };
void addMessage(MsgInfo msgInfo)
{
msgList.add(msgInfo);
TableItem item = new TableItem(table, SWT.NONE);
// "序号", "发送IP", "发送端口", "接收IP", "接入端口", "消息长度"
item.setText(0, Integer.toString(msgList.size()));
item.setText(1, msgInfo.getSrcIP());
item.setText(2, Integer.toString(msgInfo.getSrcPort()));
item.setText(3, msgInfo.getDestIP());
item.setText(4, Integer.toString(msgInfo.getDestPort()));
item.setText(5, Integer.toString(msgInfo.getMsg().length));
table.redraw();
}
/**
* @param args
*/
public static void main(String[] args)
{
BasicConfigurator.configure(); // 使用缺省配置
new MiddleMan().run();
}
}