content: package com.alibaba.luaview.debugger.ui;
  
  import java.awt.BorderLayout;
  import java.awt.Color;
  import java.awt.Dimension;
  import java.awt.FlowLayout;
  import java.awt.Graphics;
  import java.awt.Image;
  import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
  import java.awt.event.WindowAdapter;
  import java.awt.event.WindowEvent;
  
  import javax.imageio.ImageIO;
  import javax.swing.ImageIcon;
  import javax.swing.JButton;
  import javax.swing.JFrame;
  import javax.swing.JPanel;
  import javax.swing.JScrollPane;
  import javax.swing.JSplitPane;
  import javax.swing.JTabbedPane;
  import javax.swing.JTextArea;
  import javax.swing.JTextField;
  import javax.swing.ScrollPaneConstants;
  import javax.swing.border.Border;
  import javax.swing.plaf.basic.BasicSplitPaneDivider;
  import javax.swing.plaf.basic.BasicSplitPaneUI;
  
  import com.alibaba.luaview.debugger.Center;
  import com.alibaba.luaview.debugger.ClientCmd;
  import com.alibaba.luaview.debugger.Config;
  
  public class DebuggerFrame extends JFrame {
  
  	private static final long serialVersionUID = -4760175577170083855L;
  
  	private JPanel contentPane;
  	private JTextField textFieldCmdInput;
  	private final Center center;
  
  	private String addtionTitle;
  
  	public void setTitle(String name) {
  		if (this.addtionTitle == null || this.addtionTitle.length() <= 0) {
  			this.addtionTitle = name;
  		}
  		super.setTitle("LuaView - " + addtionTitle);
  	}
  
  	/**
  	 * Create the frame.
  	 */
  	public DebuggerFrame(final Center c) {
  		this.center = c;
  		setTitle("");
  		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  		setBounds(100, 100, 640, 750);
  		contentPane = new JPanel();
  		// contentPane.setBorder(new EmptyBorder(1, 1, 1, 1));
  		contentPane.setLayout(new BorderLayout(0, 0));
  		setContentPane(contentPane);
  
  		JPanel panel = new JPanel();
  		contentPane.add(panel, BorderLayout.CENTER);
  		panel.setLayout(new BorderLayout(0, 0));
  
  		JPanel panelHead = new HeadPanel();
  		panelHead.setBackground(Color.WHITE);
  		panelHead.setBorder(null);
  		FlowLayout flowLayout = (FlowLayout) panelHead.getLayout();
  		flowLayout.setAlignment(FlowLayout.LEFT);
  		panel.add(panelHead, BorderLayout.NORTH);
  
  		textFieldCmdInput = new JTextField();
  		textFieldCmdInput.setToolTipText("调试命令");
  		textFieldCmdInput.setPreferredSize(new Dimension(100, Config.BTN_H + 1));
  		textFieldCmdInput.addActionListener(new ActionListener() {
  			public void actionPerformed(ActionEvent e) {
  				center.cmdBuffer.pushCmd(new ClientCmd(textFieldCmdInput.getText().trim()));
  			}
  		});
  		panelHead.add(textFieldCmdInput);
  		textFieldCmdInput.setColumns(15);
  
  		buttonNextLine = new JButton("下一行");
  		buttonNextLine.setPreferredSize(new Dimension(Config.BTN_W, Config.BTN_H));
  		buttonNextLine.addActionListener(new ActionListener() {
  			public void actionPerformed(ActionEvent e) {
  				center.srcCodeCenter.clearGotoLine();
  				setIsDebugging(false);
  				center.cmdBuffer.pushCmd(new ClientCmd("n"));
  			}
  		});
  		try {
  			Image img = ImageIO.read(getClass().getResource("play.png"));
  			Image img2 = ImageIO.read(getClass().getResource("play2.png"));
  			buttonNextBreakPoint = new ImageButton(new ImageIcon(img), new ImageIcon(img2));
  			buttonNextBreakPoint.addActionListener(new ActionListener() {
  				public void actionPerformed(ActionEvent e) {
  					center.srcCodeCenter.clearGotoLine();
  					setIsDebugging(false);
  					center.cmdBuffer.pushCmd(new ClientCmd("c"));
  				}
  			});
  		} catch (Exception ex) {
  		}
  		panelHead.add(buttonNextBreakPoint);
  		panelHead.add(buttonNextLine);
  
  		buttonNextCodeLine = new JButton("下一步");
  		buttonNextCodeLine.setPreferredSize(new Dimension(Config.BTN_W, Config.BTN_H));
  		buttonNextCodeLine.addActionListener(new ActionListener() {
  			public void actionPerformed(ActionEvent e) {
  				center.srcCodeCenter.clearGotoLine();
  				setIsDebugging(false);
  				center.cmdBuffer.pushCmd(new ClientCmd("s"));
  			}
  		});
  		panelHead.add(buttonNextCodeLine);
  
  		buttonCallStack = new JButton("显示调用栈");
  		buttonCallStack.setPreferredSize(new Dimension(Config.BTN_W2, Config.BTN_H));
  		buttonCallStack.addActionListener(new ActionListener() {
  			public void actionPerformed(ActionEvent e) {
  				center.cmdBuffer.pushCmd(new ClientCmd("bt"));
  			}
  		});
  		panelHead.add(buttonCallStack);
  
  		JPanel panelBody = new JPanel();
  		panelBody.setBorder(null);
  		panel.add(panelBody, BorderLayout.CENTER);
  		panelBody.setLayout(new BorderLayout(0, 0));
  
  		JSplitPane splitPane = new JSplitPane();
  		splitPane.setDividerSize(7);
  		try {
  			splitPane.setUI(new BasicSplitPaneUI() {
  				public BasicSplitPaneDivider createDefaultDivider() {
  					return new BasicSplitPaneDivider(this) {
  						private static final long serialVersionUID = -7493346152989839058L;
  						private Color color = new Color(171, 171, 171);
  
  						public void setBorder(Border b) {
  						}
  
  						public void paint(Graphics g) {
  							super.paint(g);
  							int w = this.getWidth();
  							int h = this.getHeight();
  							g.setClip(0, 0, w, h);
  							g.setColor(color);
  							g.drawLine(0, 0, w, 0);
  							g.drawLine(0, h, w, h);
  						}
  					};
  				}
  			});
  		} catch (Exception e) {
  
  		}
  
  		// splitPane.setBorderPainted(false);// 不打印边框
  		splitPane.setBorder(null);// 除去边框
  		splitPane.setResizeWeight(0.8);
  		splitPane.setOrientation(JSplitPane.VERTICAL_SPLIT);
  		panelBody.add(splitPane, BorderLayout.CENTER);
  
  		JScrollPane scrollPane = new JScrollPane();
  		scrollPane.setBorder(null);
  		scrollPane.setViewportBorder(null);
  		scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
  		scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
  		splitPane.setRightComponent(scrollPane);
  
  		outputArea = new JTextArea();
  		outputArea.setTabSize(4);
  		outputArea.setLineWrap(true);
  		outputArea.setBorder(null);
  		scrollPane.setViewportView(outputArea);
  
  		tabbedPane = new BottomLineTabbedPane(JTabbedPane.TOP);
  		tabbedPane.setBorder(null);
  		tabbedPane.setUI(new EclipseTabbedPaneUI());
  		splitPane.setLeftComponent(tabbedPane);
  
  		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
  		addWindowListener(new WindowAdapter() {
  			public void windowClosing(WindowEvent e) {
  				center.worker.close();
  			}
  		});
  	}
  
  	private JTabbedPane tabbedPane;
  	private JTextArea outputArea;
  	private JButton buttonNextLine;
  	private JButton buttonNextCodeLine;
  	private JButton buttonNextBreakPoint;
  	private JButton buttonCallStack;
  
  	public JTabbedPane getTabbedPane() {
  		return tabbedPane;
  	}
  
  	public JTextArea getOutputArea() {
  		return outputArea;
  	}
  
  	public JTextField getTextFieldCmdInput() {
  		return textFieldCmdInput;
  	}
  
  	public JButton getButtonNextLine() {
  		return buttonNextLine;
  	}
  
  	public JButton getButtonNextCodeLine() {
  		return buttonNextCodeLine;
  	}
  
  	public JButton getButtonNextBreakPoint() {
  		return buttonNextBreakPoint;
  	}
  
  	public void setIsDebugging(boolean yes) {
  		this.getButtonNextLine().setEnabled(yes);
  		this.getButtonNextCodeLine().setEnabled(yes);
  		this.getButtonNextBreakPoint().setEnabled(yes);
  		this.getTextFieldCmdInput().setEnabled(yes);
  		this.buttonCallStack.setEnabled(yes);
  	}
  }
  