/*
 * Copyright (C) 2015 Jack Jiang(cngeeker.com) The DroidUIBuilder Project. 
 * All rights reserved.
 * Project URL:https://github.com/JackJiang2011/DroidUIBuilder
 * Version 1.0
 * 
 * Jack Jiang PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 * 
 * MakeLayoutPane.java at 2015-2-6 16:12:00, original version by Jack Jiang.
 * You can contact author with [email protected].
 */
package org.droiddraw;
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.Insets;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.PrintWriter;
import java.io.StringWriter;

import javax.swing.AbstractAction;
import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;

import org.droiddraw.gui.AndroidEditorViewer;
import org.droiddraw.gui.Desing$CodeSwitcherPane;
import org.droiddraw.gui.ImageResources;
import org.droiddraw.gui.WidgetPanel;
import org.droiddraw.property.ColorProperty;
import org.droiddraw.util.DroidDrawHandler;
import org.droiddraw.widget.AbsoluteLayout;
import org.droiddraw.widget.AbstractLayout;
import org.droiddraw.widget.AnalogClock;
import org.droiddraw.widget.AutoCompleteTextView;
import org.droiddraw.widget.Button;
import org.droiddraw.widget.CheckBox;
import org.droiddraw.widget.DatePicker;
import org.droiddraw.widget.DigitalClock;
import org.droiddraw.widget.EditView;
import org.droiddraw.widget.FrameLayout;
import org.droiddraw.widget.Gallery;
import org.droiddraw.widget.GridView;
import org.droiddraw.widget.ImageButton;
import org.droiddraw.widget.ImageSwitcher;
import org.droiddraw.widget.ImageView;
import org.droiddraw.widget.Layout;
import org.droiddraw.widget.LinearLayout;
import org.droiddraw.widget.ListView;
import org.droiddraw.widget.MapView;
import org.droiddraw.widget.ProgressBar;
import org.droiddraw.widget.RadioButton;
import org.droiddraw.widget.RadioGroup;
import org.droiddraw.widget.RatingBar;
import org.droiddraw.widget.RelativeLayout;
import org.droiddraw.widget.ScrollView;
import org.droiddraw.widget.Spinner;
import org.droiddraw.widget.TabHost;
import org.droiddraw.widget.TabWidget;
import org.droiddraw.widget.TableLayout;
import org.droiddraw.widget.TableRow;
import org.droiddraw.widget.TextView;
import org.droiddraw.widget.Ticker;
import org.droiddraw.widget.TimePicker;
import org.droiddraw.widget.ToggleButton;
import org.droiddraw.widget.Widget;

import com.jb2011.drioduibuilder.swingw.HardLayoutPane;
import com.jb2011.drioduibuilder.swingw.SwitchablePane;
import com.jb2011.drioduibuilder.util.Platform;

public class MakeLayoutPane extends JPanel
{
	private JTextArea txtOutput;
	private JTabbedPane tabsWidgetsAndSoOn = new JTabbedPane(JTabbedPane.TOP, JTabbedPane.WRAP_TAB_LAYOUT);
	private MainPane droidDrawPane = null;
	
	public MakeLayoutPane(MainPane droidDrawPane, String screen)
	{
		super(new BorderLayout());
		this.droidDrawPane = droidDrawPane;
		initGUI(screen);
	}
	
	private void initGUI(String screen)
	{
		//-------------------------------------------------------- must first init
		final JPanel paneOutput = initOutputUI();
		//
		final AndroidEditorViewer viewer = initAndroidEditorUI(screen);
		
		//-------------------------------------------------------- layout of toolbar
		// ************************************** 工具条主面板
		FlowLayout paneScreenToolsLayout = new FlowLayout(FlowLayout.LEFT);
		paneScreenToolsLayout.setVgap(0);
		JPanel paneScreenTools = new JPanel(paneScreenToolsLayout)
		{
			public void paintComponent(Graphics g) {
				super.paintComponent(g);
				// 在底部画一线灰线,视觉上好看一点
				Color oldColor = g.getColor();
				g.setColor(new Color(235,235,235));//239,239,239));
				// 左起5个像素与左边的彩带保持一致
				g.drawLine(5, this.getHeight()-1, this.getWidth(), this.getHeight()-1);
				g.setColor(oldColor);
				
				// 在左边画一个“Tools"字样的彩带背景,作为装饰
				ImageIcon hotIcon = org.droiddraw.resource.IconFactory
						.getInstance().getMakeLayoutHeadFlag_Icon();
				g.drawImage(hotIcon.getImage()
						, 2 // 左起2个像素
						, 4 // 下偏4个像素,对齐好看一些
						, hotIcon.getIconWidth(), hotIcon.getIconHeight(), null);
			}
		};
		// border设置的目的是为了给背景底边水平灰线留出绘制空间
		paneScreenTools.setBorder(BorderFactory.createEmptyBorder(0, 0, 3, 0));
		// 加入占位组件是为了给左头那的彩带背景留出绘制空间
		paneScreenTools.add(Box.createHorizontalStrut(68));
		
		// ************************************** 加入工具条组件1系列
		Object[] aeToolbar0Coms = initAndroidEditorToolbar0(paneScreenTools, viewer);
		// ************************************** 工具条主面板组件2系列
		initAndroidEditorToolbar1(paneScreenTools, viewer
				, (JComboBox)aeToolbar0Coms[0], (ActionListener)aeToolbar0Coms[1]);
		// ************************************** 工具条主面板组件3系列
		initAndroidEditorToolbar2(paneScreenTools, viewer);
		
		//-------------------------------------------------------- layout of screen area
		JPanel paneScreenArea = new JPanel();
		paneScreenArea.setLayout(new BorderLayout());
		paneScreenArea.add(viewer, BorderLayout.CENTER);
		
		//-------------------------------------------------------- layout of widgets tab
		JPanel paneWidgetsMain = initWidgetsPane();
		JPanel paneWidgetsMainParent = new JPanel(new FlowLayout(FlowLayout.LEFT));
		paneWidgetsMainParent.add(paneWidgetsMain);
		JPanel paneLayoutsMain = initLayoutsPane();
		// widget 复合组件面板
		SwitchablePane widgetsPane = new SwitchablePane(new Object[][]{
				new Object[]{new JScrollPane(paneWidgetsMainParent),"Widgets"}
				, new Object[]{paneLayoutsMain,"Layouts"}});
		
		tabsWidgetsAndSoOn.addTab("Widgets", widgetsPane.getMainPane());
		tabsWidgetsAndSoOn.addTab("Properties", AndroidEditor.instance().getPropertiesPanel());
		tabsWidgetsAndSoOn.addTab("!LayoutExplore", new JScrollPane(initTreeLayoutExplore()));// TODO TreeLayoutExplore稍后考虑放在一个更合理的地方!
//		tabsWidgetsAndSoOn.addTab("!Output", paneOutput);// TODO 此output面板稍后考虑放在一个更合理的地方!
		
		//-------------------------------------------------------- layout of (widgets的Tab和屏幕编辑面板)
		JSplitPane sp1 = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT
				, new JScrollPane(paneScreenArea), tabsWidgetsAndSoOn);
		sp1.setBorder(BorderFactory.createEmptyBorder(1, 3, 0, 3));
		sp1.setDividerLocation(698);
		
		//-------------------------------------------------------- layout of 工具条+(widgets的Tab和屏幕编辑面板)
		final JPanel main = new JPanel(new BorderLayout());
		main.add(paneScreenTools, BorderLayout.NORTH);
		main.add(sp1, BorderLayout.CENTER);
		
		//======================================================== 总体布局:Desing主面板和Code主面板 
		final JPanel tabsSceenCenter = new JPanel(new BorderLayout());
		Desing$CodeSwitcherPane dcSwitcherPane = new Desing$CodeSwitcherPane(){
			@Override
			protected void fireLeftSelected(){
				setContentToCenter(main);
			}
			@Override
			protected void fireRightSelected(){
				setContentToCenter(paneOutput);
			}
			/**
			 * 将指定组件独占性地放入中央区.
			 * 
			 * @param com
			 */
			public void setContentToCenter(JComponent com)
			{
				// 正常放入组件
				tabsSceenCenter.removeAll();
				tabsSceenCenter.add(com, BorderLayout.CENTER);
				tabsSceenCenter.revalidate();
				tabsSceenCenter.repaint();
			}
		};
		this.add(tabsSceenCenter, BorderLayout.CENTER);// 主体内容组件
		this.add(dcSwitcherPane, BorderLayout.SOUTH);  // 下部的左右切换组件
	}
	
	private AndroidEditorViewer initAndroidEditorUI(String screen)
	{
		AndroidEditor ae = AndroidEditor.instance();
		AbsoluteLayout al = new AbsoluteLayout();
		MainPane.setupRootLayout(al);
		ae.setLayout(al);
		
		Image img = null;
		if ("qvgap".equals(screen))
		{
			ae.setScreenMode(AndroidEditor.ScreenMode.QVGA_PORTRAIT);
			img = ImageResources.instance().getImage("emu2");
		}
		else if ("hvgal".equals(screen))
		{
			ae.setScreenMode(AndroidEditor.ScreenMode.HVGA_LANDSCAPE);
			img = ImageResources.instance().getImage("emu3");
		}
		else if ("hvgap".equals(screen))
		{
			ae.setScreenMode(AndroidEditor.ScreenMode.HVGA_PORTRAIT);
			img = ImageResources.instance().getImage("emu4");
		}
		else if ("qvgal".equals(screen))
		{
			ae.setScreenMode(AndroidEditor.ScreenMode.QVGA_LANDSCAPE);
			img = ImageResources.instance().getImage("emu1");
		}
		else if ("wvgap".equals(screen))
		{
			ae.setScreenMode(AndroidEditor.ScreenMode.WVGA_PORTRAIT);
			img = ImageResources.instance().getImage("emu4");
		}
		else if ("wvgal".equals(screen))
		{
			ae.setScreenMode(AndroidEditor.ScreenMode.WVGA_LANDSCAPE);
			img = ImageResources.instance().getImage("emu1");
		}
		else if ("wvgap".equals(screen))
		{
			ae.setScreenMode(AndroidEditor.ScreenMode.HVGA_PORTRAIT);
			img = ImageResources.instance().getImage("emu4");
		}
		else if ("wvgal".equals(screen))
		{
			img = ImageResources.instance().getImage("emu1");
		}
		
		final AndroidEditorViewer viewer = new AndroidEditorViewer(ae, droidDrawPane, img);
		ae.setViewer(viewer);
		return viewer;
	}
	
	private Object[] initAndroidEditorToolbar0(JPanel paneScreenToolsfinal, final AndroidEditorViewer viewer)
	{
		JLabel lbl = new JLabel("Root Layout:");
		final JComboBox layout = new JComboBox(new String[] {
				AbsoluteLayout.TAG_NAME, LinearLayout.TAG_NAME,
				RelativeLayout.TAG_NAME, ScrollView.TAG_NAME,
				TableLayout.TAG_NAME, TabHost.TAG_NAME });
//		if (!System.getProperty("os.name").toLowerCase().contains("mac os x"))
		if(!Platform.isMac())
			layout.setLightWeightPopupEnabled(false);
		final ActionListener layoutActionListener = new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				if (e.getActionCommand().equals("comboBoxChanged"))
				{
					String select = (String) ((JComboBox) e.getSource()).getSelectedItem();
					Layout l = null;
					if (select.equals(AbsoluteLayout.TAG_NAME))
						l = new AbsoluteLayout();
					else if (select.equals(LinearLayout.TAG_NAME))
						l = new LinearLayout();
					else if (select.equals(RelativeLayout.TAG_NAME))
						l = new RelativeLayout();
					else if (select.equals(ScrollView.TAG_NAME))
						l = new ScrollView();
					else if (select.equals(TableLayout.TAG_NAME))
						l = new TableLayout();
					else if (select.equals(TabHost.TAG_NAME))
						l = new TabHost();
					viewer.repaint();
					MainPane.setupRootLayout(l);
					AndroidEditor.instance().setLayout(l);
				}
			}
		};
		layout.addActionListener(layoutActionListener);
//		tb.add(layout);
		// This is 1.6.x specific *sigh*
		// sl.putConstraint(SpringLayout.BASELINE, lbl, 0,
		// SpringLayout.BASELINE, layout);
		// sl.putConstraint(SpringLayout.NORTH, tb, 5, SpringLayout.SOUTH,
		// layout);
		// p.setSize(200, 300);
		// p.validate();

		JComboBox screen_size = new JComboBox(new String[] { "QVGA Landscape",
				"QVGA Portrait", "HVGA Landscape", "HVGA Portrait",
				"WVGA Landscape", "WVGA Portrait" });
		screen_size.setSelectedIndex(3);
		
		screen_size.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e)
			{
				JComboBox jcb = (JComboBox) e.getSource();
				int ix = jcb.getSelectedIndex();
				AndroidEditor ae = AndroidEditor.instance();
				switch (ix)
				{
					case 0:
						ae.setScreenMode(AndroidEditor.ScreenMode.QVGA_LANDSCAPE);
						viewer.resetScreen(ImageResources.instance().getImage("emu1"));
						break;
					case 1:
						ae.setScreenMode(AndroidEditor.ScreenMode.QVGA_PORTRAIT);
						viewer.resetScreen(ImageResources.instance().getImage("emu2"));
						break;
					case 2:
						ae.setScreenMode(AndroidEditor.ScreenMode.HVGA_LANDSCAPE);
						viewer.resetScreen(ImageResources.instance().getImage("emu3"));
						break;
					case 3:
						ae.setScreenMode(AndroidEditor.ScreenMode.HVGA_PORTRAIT);
						viewer.resetScreen(ImageResources.instance().getImage("emu4"));
						break;
					case 4:
						ae.setScreenMode(AndroidEditor.ScreenMode.WVGA_LANDSCAPE);
						viewer.resetScreen(ImageResources.instance().getImage("emu5"));
						setSize(1000, 750);
						break;
					case 5:
						ae.setScreenMode(AndroidEditor.ScreenMode.WVGA_PORTRAIT);
						viewer.resetScreen(ImageResources.instance().getImage("emu6"));
						setSize(1000, 750);
						break;
				}
//				jsp.validate(); // TODO comment by Jck Jiang, 有用吗?
				viewer.repaint();
			}
		});
		validate();
		
		paneScreenToolsfinal.add(lbl);
		paneScreenToolsfinal.add(layout);
		paneScreenToolsfinal.add(new JLabel("Screen Size:"));
		paneScreenToolsfinal.add(screen_size);
		
		return new Object[]{layout,layoutActionListener};
	}
	
	private void initAndroidEditorToolbar1(JPanel paneScreenTools, final AndroidEditorViewer viewer
			, final JComboBox layout, final ActionListener layoutActionListener)
	{
		JButton gen = new JButton("Generate");
		gen.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0){
				// TODO 功能待进一步考虑!
				JOptionPane.showMessageDialog(viewer
						, "本功能因设计不合理,稍后将去掉!", "!该功能有待进一步评估!",
						JOptionPane.INFORMATION_MESSAGE);
				
				StringWriter sw = new StringWriter();
				AndroidEditor.instance().generate(new PrintWriter(sw));
				getTextOutput().setText(sw.getBuffer().toString());
			}
		});
		
		JButton undo = new JButton("Undo");
		undo.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				AndroidEditor.instance().undo();
			}
		});
		JButton redo = new JButton("Redo");
		redo.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				AndroidEditor.instance().redo();
			}
		});
		
		JButton load = new JButton("Load");
		load.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent arg0){
				// TODO 功能待进一步考虑!
				JOptionPane.showMessageDialog(viewer
						, "本功能因设计不合理,稍后将去掉!", "!该功能有待进一步评估!",
						JOptionPane.INFORMATION_MESSAGE);
				try{
					AndroidEditor.instance().removeAllWidgets();
					String layoutXML = getTextOutput().getText();
					if (layoutXML.length() > 0)
						DroidDrawHandler.loadFromString(layoutXML);
					layout.removeActionListener(layoutActionListener);
					layout.setSelectedItem(AndroidEditor.instance().getRootLayout().toString());
					layout.addActionListener(layoutActionListener);
					viewer.repaint();
				}
				catch (Exception ex){
					MainPane.getTipCom().error(ex);
				}
			}
		});
		
		JSeparator sp = new JSeparator(JSeparator.VERTICAL);
		sp.setPreferredSize(new Dimension(2,22));
		paneScreenTools.add(sp);
		paneScreenTools.add(setToolbarBtnMargin(gen));
		paneScreenTools.add(setToolbarBtnMargin(load));
		paneScreenTools.add(setToolbarBtnMargin(undo));
		paneScreenTools.add(setToolbarBtnMargin(redo));
		paneScreenTools.add(setToolbarBtnMargin(
				new JButton(new ClearAction())));
	}
	
	private void initAndroidEditorToolbar2(JPanel paneScreenTools, final AndroidEditorViewer viewer)
	{
		JButton edit;
		edit = new JButton("Edit");
		edit.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				// TODO 功能待进一步考虑!
				JOptionPane.showMessageDialog(viewer
						, "本功能因设计不合理,稍后将去掉(放入Widget对象的右键菜单里更合理)!", "!该功能有待进一步评估!",
						JOptionPane.INFORMATION_MESSAGE);
				editSelected();
			}
		});
		JButton delete = new JButton("Delete");
		delete.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0){
				// TODO 功能待进一步考虑!
				JOptionPane.showMessageDialog(viewer
						, "本功能因设计不合理,稍后将去掉(放入Widget对象的右键菜单里更合理)!", "!该功能有待进一步评估!",
						JOptionPane.INFORMATION_MESSAGE);
				AndroidEditor.instance().removeWidget(AndroidEditor.instance().getSelected());
				viewer.repaint();
			}
		});

		paneScreenTools.add(setToolbarBtnMargin(edit));
		paneScreenTools.add(setToolbarBtnMargin(delete));
	}
	private AbstractButton setToolbarBtnMargin(AbstractButton btn)
	{
		btn.setMargin(new Insets(4,3,4,3));
		return btn;
	}
	
	private JPanel initOutputUI()
	{
		txtOutput = new JTextArea(10, 50);
		txtOutput.getDocument().addUndoableEditListener(new UndoableEditListener(){
			public void undoableEditHappened(UndoableEditEvent e){
				AndroidEditor.instance().queueUndoRecord(e.getEdit());
			}
		});
		
		// TODO 为output文本框增加复制、粘贴等的代码等BeautyEye LNF里
		//      增加这些功能后就可以去掉了!
		final JPopupMenu popup = new JPopupMenu();
		JMenuItem it = new JMenuItem("Cut");
		popup.add(it);
		it.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent arg0){
				if (getSelectedText() != null && getSelectedText().length() != 0){
					Toolkit.getDefaultToolkit().getSystemClipboard()
							.setContents(new StringSelection(getSelectedText()),null);
					deleteSelectedText();
				}
			}
		});
		it = new JMenuItem("Copy");
		it.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent arg0){
				if (getSelectedText() != null && getSelectedText().length() != 0){
					Toolkit.getDefaultToolkit().getSystemClipboard()
							.setContents(new StringSelection(getSelectedText()),null);
				}
			}
		});
		Launch.addCopyAction(it);
		popup.add(it);
		it = new JMenuItem("Paste");
		it.addActionListener(new ActionListener()
		{
			public void actionPerformed(ActionEvent e){
				Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard();
				try{
					String txt = (String) c.getData(DataFlavor.stringFlavor);
					if (txt != null)
						insertText(txt);
				}
				catch (Exception ex){
					ex.printStackTrace();
				}
			}
		});
		popup.add(it);

		txtOutput.addMouseListener(new MouseAdapter()
		{
			public void mousePressed(MouseEvent e){
//				if (e.isPopupTrigger())
				// right button
				if (e.getButton() == MouseEvent.BUTTON3)
					popup.show(txtOutput, e.getX() + 3, e.getY() + 3);
			}
		});
		
		JPanel out = new JPanel();
		out.setLayout(new BorderLayout());
		out.add(new JScrollPane(txtOutput),BorderLayout.CENTER);
//		TitledBorder border = BorderFactory.createTitledBorder("Output");
//		out.setBorder(border);
		return out;
	}
	
	private JPanel initWidgetsPane()
	{
		final int BIG_WIDGET_DEFAULT_WIDTH = 55;
		final int BIG_WIDGET_DEFAULT_HEIGHT = 78;
		
		//-------------------------------------------------------
		JPanel paneWindgetMain = new JPanel();
		paneWindgetMain.setLayout(new BoxLayout(paneWindgetMain, BoxLayout.Y_AXIS));
		
		JPanel paneWidgetRow1 = new JPanel(getFlowLayout());
//		paneWidgetRow1.setBackground(new Color(66,66,66));
//		paneWidgetRow1.setBorder(BorderFactory.createLineBorder(Color.red));
		Button widgetButton = new Button(Button.TAG_NAME);
		((ColorProperty) widgetButton.getPropertyByAttName("android:textColor"))
				.setColorValue(Color.black);
		paneWidgetRow1.add(new WidgetPanel(widgetButton));
		
		ToggleButton togg = new ToggleButton("Toggle", "Toggle Off");
//		togg.setHeight(50);
		togg.setWidth(65);
		paneWidgetRow1.add(new WidgetPanel(togg));
		
		paneWidgetRow1.add(new WidgetPanel(new ImageButton()));
		
		TextView tvInTools = new TextView(TextView.TAG_NAME);
		tvInTools.setSize(80, Button.DEFAULT_CONTENT_HEIGHT);
//		((ColorProperty) tvInTools.getPropertyByAttName("android:textColor"))
//				.setColorValue(Color.black);
		paneWidgetRow1.add(new WidgetPanel(tvInTools));

		paneWindgetMain.add(paneWidgetRow1);

		//---------------------------- 2
		JPanel paneWidgetRow2 = new JPanel(getFlowLayout());
		ImageView ivInTools = new ImageView();
		ivInTools.setWidth(60);
		ivInTools.setHeight(Button.DEFAULT_CONTENT_HEIGHT);
		paneWidgetRow2.add(new WidgetPanel(ivInTools));
		
		EditView ev = new EditView(EditView.TAG_NAME);
		((ColorProperty) ev.getPropertyByAttName("android:textColor"))
				.setColorValue(Color.black);
		paneWidgetRow2.add(new WidgetPanel(ev));

		AutoCompleteTextView actv = new AutoCompleteTextView("AutoComplete");
		((ColorProperty) actv.getPropertyByAttName("android:textColor"))
				.setColorValue(Color.black);
		paneWidgetRow2.add(new WidgetPanel(actv));

		paneWindgetMain.add(paneWidgetRow2);
		
		//------------------------------- 3
		JPanel paneWidgetRow3 = new JPanel(getFlowLayout());
		CheckBox widgetCheckBox = new CheckBox(CheckBox.TAG_NAME);
		((ColorProperty) widgetCheckBox.getPropertyByAttName("android:textColor"))
				.setColorValue(Color.black);
		paneWidgetRow3.add(new WidgetPanel(widgetCheckBox));

		RadioButton widgetRadioButton = new RadioButton(RadioButton.TAG_NAME);
		((ColorProperty) widgetRadioButton.getPropertyByAttName("android:textColor"))
				.setColorValue(Color.black);
		paneWidgetRow3.add(new WidgetPanel(widgetRadioButton));
		
		RadioGroup rgInTools = new RadioGroup();
		rgInTools.setSize(46,Button.DEFAULT_CONTENT_HEIGHT);
		paneWidgetRow3.add(new WidgetPanel(rgInTools));
		
		paneWindgetMain.add(paneWidgetRow3);
		
		//------------------------------- 4
		JPanel paneWidgetRow4 = new JPanel(getFlowLayout());
		paneWidgetRow4.add(new WidgetPanel(new TabWidget()));
		
		RatingBar rbInTools = new RatingBar();
		rbInTools.setWidth(RatingBar.DEFAULT_START_WIDTH*2+2);// 在tools面板中默认只绘2颗星哦
		paneWidgetRow4.add(new WidgetPanel(rbInTools));
		
		Gallery g = new Gallery();
		g.setWidth(60);
		g.setHeight(Button.DEFAULT_CONTENT_HEIGHT);
		paneWidgetRow4.add(new WidgetPanel(g));
		
		paneWindgetMain.add(paneWidgetRow4);
		
		//------------------------------- 41
		JPanel paneWidgetRow41 = new JPanel(getFlowLayout());
		paneWidgetRow41.add(new WidgetPanel(new Spinner()));
		
		DigitalClock dcb = new DigitalClock();
		dcb.setSize(105, Button.DEFAULT_CONTENT_HEIGHT);
//		((ColorProperty) dcb.getPropertyByAttName("android:textColor"))
//				.setColorValue(Color.black);
		paneWidgetRow41.add(new WidgetPanel(dcb));
		
		AnalogClock ac = new AnalogClock();
		ac.setSize(50, 50);
		paneWidgetRow41.add(new WidgetPanel(ac));
		
		paneWindgetMain.add(paneWidgetRow41);
		
		//------------------------------- 5
		JPanel paneWidgetRow5 = new JPanel(getFlowLayout());
		DatePicker dp = new DatePicker();
		dp.setSize(DatePicker.getBgImg_small().getWidth(null)
				, DatePicker.getBgImg_small().getHeight(null));
		paneWidgetRow5.add(new WidgetPanel(dp));
		
		paneWidgetRow5.add(Box.createHorizontalStrut(7));

		TimePicker tp = new TimePicker();
		tp.setSize(TimePicker.getBgImg_small().getWidth(null)
				, TimePicker.getBgImg_small().getHeight(null));
		paneWidgetRow5.add(new WidgetPanel(tp));

		paneWindgetMain.add(paneWidgetRow5);
		
		//------------------------------- 6
		JPanel paneWidgetRow6 = new JPanel(getFlowLayout());
		paneWidgetRow6.add(new WidgetPanel(new ProgressBar()));
		
		ListView lvInTools = new ListView();
		lvInTools.setHeight(BIG_WIDGET_DEFAULT_HEIGHT);//!
		lvInTools.setWidth(BIG_WIDGET_DEFAULT_WIDTH);//!
		paneWidgetRow6.add(new WidgetPanel(lvInTools));
		
		GridView gvInTools = new GridView();
		gvInTools.setHeight(BIG_WIDGET_DEFAULT_HEIGHT);//!
		gvInTools.setWidth(BIG_WIDGET_DEFAULT_WIDTH);//!
		paneWidgetRow6.add(new WidgetPanel(gvInTools));
		
		MapView mapView = new MapView();
		mapView.setHeight(BIG_WIDGET_DEFAULT_HEIGHT);//!
		mapView.setWidth(BIG_WIDGET_DEFAULT_WIDTH);//!
		paneWidgetRow6.add(new WidgetPanel(mapView));
		
		paneWindgetMain.add(paneWidgetRow6);
		return paneWindgetMain;
	}
	private FlowLayout getFlowLayout()
	{
		return getFlowLayout(0,3);
	}
	private FlowLayout getFlowLayout(int hGap, int vGap)
	{
		FlowLayout fl = new FlowLayout(FlowLayout.LEFT);
		fl.setHgap(hGap);
		fl.setVgap(vGap);
		return fl;
	}
	
	private JPanel initLayoutsPane()
	{
		HardLayoutPane paneLayoutsMain = new HardLayoutPane();
		paneLayoutsMain.addTitledLineSeparator("Title1:");
		paneLayoutsMain.addTo(new WidgetPanel(new AbsoluteLayout()));
		paneLayoutsMain.addTo(new WidgetPanel(new FrameLayout()));
		paneLayoutsMain.nextLine();
		paneLayoutsMain.addTo(new WidgetPanel(new LinearLayout()));
		paneLayoutsMain.addTo(new WidgetPanel(new ScrollView()));

		paneLayoutsMain.addTitledLineSeparator("Title2:");
		paneLayoutsMain.addTo(new WidgetPanel(new RelativeLayout()));
		TableRow tr = new TableRow();
		// 为什么要它么强制设制呢?因为代码里默认width是fill_parent的
		// 而当前位于工具面板时就不需要这样了,否则很难看
		tr.setSize(AbstractLayout.DEFAULT_WRAP_CONTENT_WIDTH
				, tr.getHeight());
		paneLayoutsMain.addTo(new WidgetPanel(tr));
		paneLayoutsMain.nextLine();
		paneLayoutsMain.addTo(new WidgetPanel(new TableLayout()));
		paneLayoutsMain.addTo(new WidgetPanel(new Ticker()));
		
		paneLayoutsMain.addTitledLineSeparator("Title3:");
		paneLayoutsMain.addTo(new WidgetPanel(new ImageSwitcher()));
		
		return paneLayoutsMain;
	}
	
	private JTree initTreeLayoutExplore()
	{
		final JTree treeLayoutExplore = new JTree(AndroidEditor.instance().getLayoutTreeModel());
		treeLayoutExplore.setShowsRootHandles(true);
		treeLayoutExplore.addTreeSelectionListener(new TreeSelectionListener(){
			public void valueChanged(TreeSelectionEvent arg0){
				Widget w = (Widget) treeLayoutExplore.getLastSelectedPathComponent();
				AndroidEditor.instance().select(w);
			}
		});
		treeLayoutExplore.setBorder(BorderFactory.createTitledBorder("Layout Explorer"));
		treeLayoutExplore.setMinimumSize(new Dimension(200, 400));
		return treeLayoutExplore;
	}
	
	//--------------------------------------------------------- about etc..
	public String getSelectedText()
	{
		return txtOutput.getSelectedText();
	}

	public void deleteSelectedText()
	{
		String txt = txtOutput.getText();
		int start = txtOutput.getSelectionStart();
		int end = txtOutput.getSelectionEnd();
		if (end < txt.length())
			txtOutput.setText(txt.substring(0, start) + txt.substring(end + 1));
		else
			txtOutput.setText(txt.substring(0, start));
	}

	public void insertText(String txt)
	{
		int start = txtOutput.getSelectionStart();
		deleteSelectedText();
		txtOutput.insert(txt, start);
	}

//	@Override
//	public Dimension getMinimumSize()
//	{
//		return PREFFER_SIZE;
//	}

	public void selectAll()
	{
		txtOutput.selectAll();
	}
	
	public JTextArea getTextOutput()
	{
		return this.txtOutput;
	}

//	@Override
//	public Dimension getPreferredSize()
//	{
//		return PREFFER_SIZE;
//	}

	public void editSelected()
	{
		tabsWidgetsAndSoOn.setSelectedIndex(2);
	}

	
	//--------------------------------------------------------- about clear
	private class ClearAction extends AbstractAction
	{
		public ClearAction(){
			super("Clear");
		}

		public void actionPerformed(ActionEvent e){
			droidDrawPane.fireClearScreen(true);
		}
	}
}