package ckelling.baukasten;

/**
    A basic extension of the java.awt.Frame class
 */

import java.awt.*;
import java.util.Vector;
import symantec.itools.awt.*;

public class Editor_Main extends Frame {

    private		Editor 						parent;

	private		Panel						infoTipPanel;
	private		Label						infoTipLabel;
	private 	symantec.itools.util.Timer	infoTipTimer;
	private 	int							lastMouseMoveX;
	private 	int							lastMouseMoveY;


	void buttonChange_Clicked(Event event) {
		//{{CONNECTION
		TreeNode selectedNode = treeView1.getSelectedNode();
		if ( (selectedNode == null) || (selectedNode.getDepth() < 2) )
			return;

		String parentText = selectedNode.getParent().getText();

		if (selectedNode.getDepth() == 2)  // Ein SimpleBus, Register16, ... soll geaendert werden.
		{
			if (parentText.equals("SimpleBus"))  // Bus
			{
				Editor_Source source = parent.getComponent(parentText, selectedNode.getText());
				SimpleBus s = (SimpleBus) source.getRK();
				Editor_DescriptionSimpleBus d = parent.getDescriptionSimpleBus(source);
						
				if ( (parent.propBusEnter != null) && (! parent.propBusEnter.isShowing()) )
					parent.propBusEnter.initialize(s, d);
				else
				{
					Editor_PropertiesSimpleBus psb = new Editor_PropertiesSimpleBus(parent, true);
					// "true": Dieses Fenster nach Gebrauch loeschen
					psb.initialize(s, d);
				}
			}
			else  //!!! Register16, ALU, ...
			{
				Editor_Source source = parent.getComponent(parentText, selectedNode.getText());
				Editor_Description d = parent.getDescription(parentText, source);

				if ( (parent.propEnter != null) && (! parent.propEnter.isShowing()) )
					parent.propEnter.initialize(parentText, source, d);
				else
				{
					Editor_PropertiesRechnerKomponente prk = new Editor_PropertiesRechnerKomponente(parentText, parent, true);
					// "true": Dieses Fenster nach Gebrauch loeschen
					prk.initialize(parentText, source, d);
				}
			}

		}
		else if (selectedNode.getDepth() == 3)  // Eine Abzweigung eines Busses soll geaendert werden.
		{
			SimpleBus s;

			for (int i = 0; i < parent.d_SimpleBus.size(); i++)
			{
				Editor_DescriptionSimpleBus d = (Editor_DescriptionSimpleBus) parent.d_SimpleBus.elementAt(i);

				if ( d.getInstanceName().equals(parentText) )
				{
					s = (SimpleBus) ((Editor_Source) parent.e_SimpleBus.elementAt(i)).getRK();
					
					if ( (parent.propBusEnter != null) && (! parent.propBusEnter.isShowing()) )
					{
						parent.propBusEnter.initialize(s, d);
						parent.propBusEnter.hide();
						(new Editor_PropertiesSimpleEdge(s.getEdge(selectedNode.getText()), s, parent.propBusEnter)).show();
					}
					else
					{
						Editor_PropertiesSimpleBus psb = new Editor_PropertiesSimpleBus(parent, true);
						// "true": Dieses Fenster nach Gebrauch loeschen
						psb.initialize(s, d);
						psb.hide();
						(new Editor_PropertiesSimpleEdge(s.getEdge(selectedNode.getText()), s, psb)).show();
					}

					break;
				}
			}
		}
		//}}
	} /* end buttonChange_Clicked */


	void buttonDelete_Clicked(Event event) {
		TreeNode selectedNode = treeView1.getSelectedNode();
		String parentText = "";
		if (selectedNode.getDepth() >= 2)
			parentText = selectedNode.getParent().getText();
		String selectedText = selectedNode.getText();

		if (selectedNode.getDepth() == 2)  // Ein SimpleBus, Register16, ... soll geloescht werden.
		{
			Vector v = parent.getDescriptionVector(parentText);

			for (int i = 0; i < v.size(); i++)
			{
				Editor_Description d = (Editor_Description) v.elementAt(i);

				if ( d.getInstanceName().equals(selectedText) )
				{
					parent.changeReferences((Editor_Source) parent.getElementVector(parentText).elementAt(i), parentText, null);

					v.removeElementAt(i);
					parent.getElementVector(parentText).removeElementAt(i);

					parent.updateTree(parentText);

					break;
				}
			}
		}
		else if (selectedNode.getDepth() == 3)  // Eine Abzweigung eines Busses soll geloescht werden.
		{
			SimpleBus s;

			for (int i = 0; i < parent.d_SimpleBus.size(); i++)
			{
				Editor_DescriptionSimpleBus d = (Editor_DescriptionSimpleBus) parent.d_SimpleBus.elementAt(i);

				if ( d.getInstanceName().equals(parentText) )
				{
					parent.changeReferences((Editor_Source) parent.e_SimpleBus.elementAt(i), "SimpleBus", null, selectedText);

					s = (SimpleBus) ((Editor_Source) parent.e_SimpleBus.elementAt(i)).getRK();
					s.removeEdge(selectedText);
					d.removeEdge(selectedText);

					parent.updateTree("SimpleBus", parentText);

					break;
				}
			}
		}

		parent.paint(parent.onScreenGC);
	} /* end buttonDelete_Clicked */


	void buttonNew_Clicked(Event event) {
		parent.newComponentCreator.show();
	}


	public Editor_Main(Editor parent) {

		//{{INIT_CONTROLS
		GridBagLayout gridBagLayout;
		gridBagLayout = new GridBagLayout();
		setLayout(gridBagLayout);
		addNotify();
		resize(insets().left + insets().right + 288,insets().top + insets().bottom + 199);
		setFont(new Font("Helvetica", Font.PLAIN, 12));
		setBackground(new Color(12632256));
		treeView1 = new symantec.itools.awt.TreeView();
		treeView1.reshape(insets().left + 0,insets().top + 0,170,199);
		GridBagConstraints gbc;
		gbc = new GridBagConstraints();
		gbc.gridx = 0;
		gbc.gridy = 0;
		gbc.weightx = 1.0;
		gbc.weighty = 1.0;
		gbc.fill = GridBagConstraints.BOTH;
		gbc.insets = new Insets(0,0,0,0);
		gridBagLayout.setConstraints(treeView1, gbc);
		add(treeView1);
		buttonPanel = new java.awt.Panel();
		buttonPanel.setLayout(new GridLayout(0,1,5,20));
		buttonPanel.reshape(insets().left + 180,insets().top + 10,98,179);
		gbc = new GridBagConstraints();
		gbc.gridx = 1;
		gbc.gridy = 0;
		gbc.weighty = 1.0;
		gbc.fill = GridBagConstraints.VERTICAL;
		gbc.insets = new Insets(10,10,10,10);
		gridBagLayout.setConstraints(buttonPanel, gbc);
		add(buttonPanel);
		buttonNew = new java.awt.Button("Neu");
		buttonNew.reshape(0,0,98,25);
		buttonPanel.add(buttonNew);
		buttonChange = new java.awt.Button("Ändern");
		buttonChange.reshape(0,49,98,25);
		buttonPanel.add(buttonChange);
		buttonDelete = new java.awt.Button("Löschen");
		buttonDelete.reshape(0,98,98,25);
		buttonPanel.add(buttonDelete);
		buttonCreateOutput = new java.awt.Button("Code erzeugen");
		buttonCreateOutput.reshape(0,147,98,29);
		buttonPanel.add(buttonCreateOutput);
		setTitle("Editor für Baukasten");
		//}}

		/*
		infoTipPanel = symantec.itools.awt.InfoTipManager.getInfoTipPanel(); // initialisiert das InfoTipPanel
		add(infoTipPanel);
		infoTipPanel.setLayout(null);
		infoTipLabel = new Label("", Label.CENTER);
		infoTipLabel.setFont(parent.SMALLFONT);
		infoTipPanel.add(infoTipLabel);
		infoTipPanel.hide();
		
		infoTipTimer = new symantec.itools.util.Timer(this, parent.INFOTIP_DELAY, true, Event.ACTION_EVENT);
		*/

		infoTipPanel = null;
		infoTipLabel = null;
		infoTipTimer = null;
		lastMouseMoveX = lastMouseMoveY = -1;
		
		
		//{{INIT_MENUS
		//}}

		this.parent = parent;
	}

	public Editor_Main(String title, Editor parent) {
	    this(parent);
	    setTitle(title);
	}

    public synchronized void show() {
    	move(0, 90);
    	//move(0, 0);
    	super.show();
    }

	public boolean action(Event e, Object arg)
	{
		if ( (e.target == infoTipTimer) && parent.showInfoTips && (lastMouseMoveX != -1) )
		{
			System.out.println("infoTipTimer aktiviert bei (" + lastMouseMoveX + ", " + lastMouseMoveY + ")!");
			showInfoTip(new Point(lastMouseMoveX, lastMouseMoveY));
			return true;
		}
		else
			return super.action(e, arg);
	}
	
	public boolean mouseMove(Event e, int x, int y)
	{
		//debug System.out.println("MOUSE_MOVE bei (" + x + ", " + y + ")");
		if (infoTipTimer != null)
			if ( (x != lastMouseMoveX) || (y != lastMouseMoveY) )
			{
				infoTipPanel.hide();
				infoTipTimer.start();
			}
			
		lastMouseMoveX = x; lastMouseMoveY = y;
		
		return super.mouseMove(e, x, y);
	}
	
	public boolean mouseExit(Event e, int x, int y)
	{
		//debug System.out.println("MOUSE_EXIT bei (" + x + ", " + y + ")");
		lastMouseMoveX = -1; lastMouseMoveY = -1;
		return super.mouseExit(e, x, y);
	}
	
	public boolean handleEvent(Event event) {
    	//if (event.id == Event.WINDOW_DESTROY) {
        //    hide();         // hide the Frame
        //    return true;
    	//}
		if (event.target == buttonNew && event.id == Event.ACTION_EVENT) {
			buttonNew_Clicked(event);
			return true;
		}
		if (event.target == buttonChange && event.id == Event.ACTION_EVENT) {
			buttonChange_Clicked(event);
			return true;
		}
		if (event.target == buttonDelete && event.id == Event.ACTION_EVENT) {
			buttonDelete_Clicked(event);
			return true;
		}
		if (event.target == buttonCreateOutput && event.id == Event.ACTION_EVENT) {
			parent.createCode();
			return true;
		}
		return super.handleEvent(event);
	}

	public void showInfoTip(Point p)
	{
		if (infoTipLabel == null)
			return;
			
		String itt = "";
		Color bg = Color.yellow;

		if (buttonNew.inside(p.x, p.y))
			itt = "Eine neue Komponente erzeugen";
		else if (buttonChange.inside(p.x, p.y))
			itt = "Eigenschaften der links markierten Komponente ändern";
		else if (buttonDelete.inside(p.x, p.y))
			itt = "Die links markierte Komponente löschen";
		else if (buttonCreateOutput.inside(p.x, p.y))
			itt = "Java-Code erzeugen";
		else if (treeView1.inside(p.x, p.y))
			itt = "Bisher erzeugte Komponenten";
		else
			itt = "Debug-Mode: ON";

		if (! itt.equals(""))
		{
			int stringWidth = parent.stringWidth(parent.SMALLFONT, itt);
			int gap = 16;
			if (p.x + gap + stringWidth > bounds().width)
				p = new Point(p.x - stringWidth - (3*gap)/2, p.y);
			if (p.y + parent.SMALLFONTHEIGHT > bounds().height)
				p = new Point(p.x, p.y - parent.SMALLFONTHEIGHT);

			symantec.itools.awt.InfoTipManager.draw(p.x + gap, p.y, itt, parent.SMALLFONTMETRICS, bg, Color.black);
			Rectangle b = infoTipPanel.bounds();
			infoTipLabel.setText(itt);
			infoTipLabel.reshape(0, 0, b.width, b.height);
			infoTipLabel.setBackground(bg);
		}
	} /* end showInfoTip */
	
	
	//{{DECLARE_CONTROLS
	symantec.itools.awt.TreeView treeView1;
	java.awt.Panel buttonPanel;
	java.awt.Button buttonNew;
	java.awt.Button buttonChange;
	java.awt.Button buttonDelete;
	java.awt.Button buttonCreateOutput;
	//}}

	//{{DECLARE_MENUS
	//}}
}
