package ckelling.baukasten;

import java.awt.*;
import java.util.*;

// Versionsgeschichte
// 0.2.0, 05.06.97
/**
 * Editor_PropertiesRechnerKomponente.java
 *
 * Fenster, um Eigenschaften einer RechnerKomponente (nicht: eines Busses)
 * anzugeben.
 *
 *	@author		Carsten Kelling
 *	@version	0.2.1, 02.08.97
 */
public class Editor_PropertiesRechnerKomponente extends Editor_Properties {
    protected Editor				parent;
    private String					targetType;
    private Editor_Source			source;
    protected Editor_Description	d;

    private Editor_CoordRechnerKomponente	coordEnter;
    private Editor_PropertiesEditableMemory ramEnter;

    private boolean					createNew = false;
    private boolean					coordEntered = true;

    private boolean					disposeFinally;



	void buttonEnhanced_Clicked(Event event) {
		ramEnter.show();
	}

	void button_Coordinates_Clicked(Event event) {
		if (createNew)
		{
			String componentType = choice_componentType.getSelectedItem();
			if (componentType != null)
			{
				if (componentType.equals("Register16"))
				{
					coordEnter.textField_widthAbs.setText(Integer.toString(Register16.DEFAULT_WIDTH));
					coordEnter.textField_heightAbs.setText(Integer.toString(Register16.MINIMUM_HEIGHT));
				}
				else if (componentType.equals("Register16Split"))
				{
					coordEnter.textField_widthAbs.setText(Integer.toString(Register16Split.DEFAULT_WIDTH));
					coordEnter.textField_heightAbs.setText(Integer.toString(Register16Split.MINIMUM_HEIGHT));
				}
				else if (componentType.equals("Register8"))
				{
					coordEnter.textField_widthAbs.setText(Integer.toString(Register8.DEFAULT_WIDTH));
					coordEnter.textField_heightAbs.setText(Integer.toString(Register8.MINIMUM_HEIGHT));
				}
			}
		}
		//{{CONNECTION
		// Create and show the Frame
		coordEnter.show();
		//}}
	}

	void buttonOK_Clicked(Event event) {
		//{{CONNECTION

		if (createNew == true)
		{
			if (coordEntered)
			{
				//createAtOnce d = new Editor_Description(4);
				//createAtOnce createNewComponent();

				parseWindows();

				//createAtOnce parent.getElementVector(targetType).addElement(source);
				//createAtOnce parent.getDescriptionVector(targetType).addElement(d);

				parent.updateTree(targetType);
				parent.repaint();

				hide();
				coordEnter.hide();
				coordEnter.dispose();
				if (disposeFinally)
					dispose();
			}
			else  // Koordinaten fuer neue RechnerKomponente/RechnerKomponentePanel muessen noch eingegeben werden
			{
				hide();
				button_Coordinates_Clicked(event);
			}
		}
		else  // eine existierende RechnerKomponente/RechnerKomponentePanel wird geaendert
		{
			parseWindows();

			parent.updateTree(targetType);
			parent.repaint();

			hide();
			coordEnter.hide();
			coordEnter.dispose();
			if (disposeFinally)
				dispose();
		}

		//}}
	}

	public void initialize(String targetType)
	{
		initialize(targetType, null, null);
	}

	public void initialize(String targetType, Editor_Source src, Editor_Description desc)
	{
		this.targetType = targetType;
		source = src;
		d = desc;
		this.parent = parent;

		Rectangle pb = parent.editor_Control.bounds();
		move(pb.x, pb.y);
		coordEnter.move(pb.x, pb.y);


		if (! targetType.equals("Register16"))
			checkbox_editable.hide();


		if ( (source != null) && (d != null) )  // eine bestehende Komponente wird veraendert
		{
			createNew = false;
			prepareWindows();
		}
		else  // eine neue Komponente erzeugen
		{
			createNew = true;
			coordEntered = false;
			//createAtOnce coordEnter.removeButtonUse();

			createNewComponent();
			d = new Editor_Description(4);
			prepareWindows();
			parseWindows();

			parent.getElementVector(targetType).addElement(source);
			parent.getDescriptionVector(targetType).addElement(d);

			parent.repaint();
		}

		show();

	} /* end initialize */

	public Editor_PropertiesRechnerKomponente(String targetType, Editor parent, boolean disposeFinally) {

		this.parent = parent;
		this.disposeFinally = disposeFinally;

		coordEnter = new Editor_CoordRechnerKomponente(this, parent);
		coordEnter.hide();

		ramEnter = null;

		//{{INIT_CONTROLS
		GridBagLayout gridBagLayout;
		gridBagLayout = new GridBagLayout();
		setLayout(gridBagLayout);
		addNotify();
		resize(insets().left + insets().right + 245,insets().top + insets().bottom + 294);
		setFont(new Font("Helvetica", Font.PLAIN, 12));
		setBackground(new Color(12632256));
		propertiesPanel = new java.awt.Panel();
		propertiesPanel.setLayout(null);
		propertiesPanel.reshape(insets().left + 10,insets().top + 10,225,231);
		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(10,10,10,10);
		gridBagLayout.setConstraints(propertiesPanel, gbc);
		add(propertiesPanel);
		label_componentType = new java.awt.Label("Typ");
		label_componentType.reshape(2,170,60,23);
		propertiesPanel.add(label_componentType);
		label1 = new java.awt.Label("Name");
		label1.reshape(2,50,48,23);
		propertiesPanel.add(label1);
		label2 = new java.awt.Label("Text");
		label2.reshape(2,86,36,23);
		propertiesPanel.add(label2);
		button_Coordinates = new java.awt.Button("Koordinaten...");
		button_Coordinates.reshape(2,2,96,23);
		propertiesPanel.add(button_Coordinates);
		textField_Name = new java.awt.TextField();
		textField_Name.setText("component1");
		textField_Name.reshape(62,50,108,23);
		textField_Name.setBackground(new Color(16777215));
		propertiesPanel.add(textField_Name);
		textArea1 = new java.awt.TextArea();
		textArea1.reshape(62,86,108,72);
		textArea1.setBackground(new Color(16777215));
		propertiesPanel.add(textArea1);
		choice_componentType = new java.awt.Choice();
		propertiesPanel.add(choice_componentType);
		choice_componentType.reshape(62,170,108,23);
		choice_componentType.setBackground(new Color(16777215));
		button_Enhanced = new java.awt.Button("Erweitert...");
		button_Enhanced.reshape(122,2,96,23);
		propertiesPanel.add(button_Enhanced);
		button_Enhanced.disable();
		checkbox_editable = new java.awt.Checkbox("Editierbar");
		checkbox_editable.reshape(2,206,83,23);
		propertiesPanel.add(checkbox_editable);
		buttonPanel = new java.awt.Panel();
		buttonPanel.setLayout(new GridLayout(1,0,20,0));
		buttonPanel.reshape(insets().left + 10,insets().top + 261,225,23);
		gbc = new GridBagConstraints();
		gbc.gridx = 0;
		gbc.gridy = 1;
		gbc.weightx = 1.0;
		gbc.fill = GridBagConstraints.HORIZONTAL;
		gbc.insets = new Insets(10,10,10,10);
		gridBagLayout.setConstraints(buttonPanel, gbc);
		add(buttonPanel);
		buttonOK = new java.awt.Button("OK");
		buttonOK.reshape(0,0,102,23);
		buttonPanel.add(buttonOK);
		buttonCancel = new java.awt.Button("Abbrechen");
		buttonCancel.reshape(122,0,102,23);
		buttonPanel.add(buttonCancel);
		setTitle("Eigenschaften für SimpleBus");
		//}}

		hide();

		//{{INIT_MENUS
		//}}
	} /* end init */


	private void prepareWindows()
	{
		String[] allInstances;
		allInstances = parent.getAllInstanceNames(d.getInstanceName());

		for (int i = 0; i < allInstances.length; i++)
		{
			coordEnter.choice_xSourceName.addItem(allInstances[i]);
			coordEnter.choice_ySourceName.addItem(allInstances[i]);
			coordEnter.choice_widthSourceName.addItem(allInstances[i]);
			coordEnter.choice_heightSourceName.addItem(allInstances[i]);
		}
		if (allInstances.length > 0)
		{
			coordEnter.choice_xSourceName.select(0);
			coordEnter.choice_xSourceQualifier = parent.setChoiceItems(coordEnter.choice_xSourceQualifier, coordEnter.panelX, allInstances[0]);
			coordEnter.choice_ySourceName.select(0);
			coordEnter.choice_ySourceQualifier = parent.setChoiceItems(coordEnter.choice_ySourceQualifier, coordEnter.panelY, allInstances[0]);
			coordEnter.choice_widthSourceName.select(0);
			coordEnter.choice_widthSourceQualifier = parent.setChoiceItems(coordEnter.choice_widthSourceQualifier, coordEnter.panelWidth, allInstances[0]);
			coordEnter.choice_heightSourceName.select(0);
			coordEnter.choice_heightSourceQualifier = parent.setChoiceItems(coordEnter.choice_heightSourceQualifier, coordEnter.panelHeight, allInstances[0]);
		}


		if (targetType.equals("Register16"))
		{
			choice_componentType.addItem("Register16");
			choice_componentType.addItem("Register16Split");
			choice_componentType.addItem("Register8");
			checkbox_editable.setState(((Register16) source.getRKP()).isEditable());
		}
		else if (targetType.equals("ALU"))
		{
			label_componentType.setText("Ausrichtung");
			choice_componentType.addItem("v");
			choice_componentType.addItem("^");
			choice_componentType.addItem("<");
			choice_componentType.addItem(">");
		}
		else if (targetType.equals("EditableMemory") || targetType.equals("TagMemory"))
		{
			button_Enhanced.enable();
			ramEnter = new Editor_PropertiesEditableMemory("Erweitert: Neues " + targetType, this, parent);

			coordEnter.rb_widthAbs.disable();
			coordEnter.rb_widthRel.disable();
			coordEnter.textField_widthAbs.disable();
			coordEnter.choice_widthSourceName.disable();
			coordEnter.choice_widthSourceQualifier.disable();
			coordEnter.textField_widthRelOffset.disable();
			coordEnter.rb_heightAbs.disable();
			coordEnter.rb_heightRel.disable();
			coordEnter.textField_heightAbs.disable();
			coordEnter.choice_heightSourceName.disable();
			coordEnter.choice_heightSourceQualifier.disable();
			coordEnter.textField_heightRelOffset.disable();
		}


		//createAtOnce if ( (source == null) || (d == null) )
		if (createNew)  // Ein Eigenschaftenfenster fuer eine neue Komponente wurde geoeffnet
		{
			setTitle("Eigenschaften für neue(s) " + targetType);
			coordEnter.setTitle("Koordinaten für neue(s) " + targetType);

			String lowerCaseStart;
			if (targetType.equals("ALU"))
				lowerCaseStart = "alu";
			else
				lowerCaseStart = targetType.substring(0, 1).toLowerCase() + targetType.substring(1, targetType.length());
			textField_Name.setText(lowerCaseStart + "_" + Integer.toString(parent.getElementVector(targetType).size()+1, 10));
			textArea1.setText("My " + targetType);

			coordEnter.textField_yAbs.setText(Integer.toString(40 * (parent.getElementVector(targetType).size()+1)));

			if (targetType.equals("Register16"))
			{
				choice_componentType.select("Register16");
			}
			else if (targetType.equals("ALU"))
			{
				coordEnter.textField_widthAbs.setText(Integer.toString(ALU.DEFAULT_WIDTH_HOR));
				coordEnter.textField_heightAbs.setText(Integer.toString(ALU.DEFAULT_HEIGHT_HOR));

				choice_componentType.select("v");
			}
			else if (targetType.equals("Adder"))
			{
				coordEnter.textField_widthAbs.setText(Integer.toString(Adder.DEFAULT_WIDTH));
				coordEnter.textField_heightAbs.setText(Integer.toString(Adder.DEFAULT_HEIGHT));
			}
			else if (targetType.equals("PipelineRegister"))
			{
				coordEnter.textField_widthAbs.setText(Integer.toString(30));
				coordEnter.textField_heightAbs.setText(Integer.toString(200));
			}
			else if (targetType.equals("Misc"))
			{
				coordEnter.textField_widthAbs.setText(Integer.toString(Misc.DEFAULT_WIDTH));
				coordEnter.textField_heightAbs.setText(Integer.toString(Misc.DEFAULT_HEIGHT));
			}
			else if (targetType.equals("Mux"))
			{
				coordEnter.textField_widthAbs.setText(Integer.toString(Mux.DEFAULT_WIDTH));
				coordEnter.textField_heightAbs.setText(Integer.toString(Mux.DEFAULT_HEIGHT));
			}
			else if (targetType.equals("PipelineStageLabel"))
			{
				coordEnter.textField_widthAbs.setText(Integer.toString(PipelineStageLabel.DEFAULT_WIDTH));
				coordEnter.textField_heightAbs.setText(Integer.toString(PipelineStageLabel.DEFAULT_HEIGHT));
			}
			else if (targetType.equals("EditableMemory") || targetType.equals("TagMemory"))
			{
				coordEnter.choice_grabMode.addItem("leftTop");
				coordEnter.choice_grabMode.select("leftTop");
			}

			String[] grabModes = source.getPossibleQualifiers();
			for (int i = 0; i < grabModes.length; i++)
				coordEnter.choice_grabMode.addItem(grabModes[i]);
			coordEnter.choice_grabMode.select(0);

			//label_componentType.hide();
		}
		else  // Eigenschaften einer bestehenden Komponente aendern
		{
			if (targetType.equals("EditableMemory") || targetType.equals("TagMemory"))
			{
				ramEnter.setTitle("Erweitert: " + d.getInstanceName());
				EditableMemory ram = (EditableMemory) source.getRK();
				ramEnter.widthChoice.select(Integer.toString(ram.getSizeInCells().width));
				ramEnter.heightChoice.select(Integer.toString(ram.getSizeInCells().height));
				ramEnter.cacheSizeChoice.select(Integer.toString(ram.getMemorySize()));
				ramEnter.bitWidthChoice.select(Integer.toString(ram.getBitWidth()));
				ramEnter.lineSizeChoice.select(Integer.toString(ram.getLineSize()));
				try {
					ramEnter.programChoice.select(d.getProgram());
				} catch (IllegalArgumentException e) {
					ramEnter.programChoice.select(0);
				}

				if (ram.isEditable())
					ramEnter.editableChoice.select(0);
				else
					ramEnter.editableChoice.select(1);

				if (ram.opcodesAreShowing())
					ramEnter.opcodeChoice.select(0);
				else
					ramEnter.opcodeChoice.select(1);

				if (ram.breakpointsAllowed())
					ramEnter.breakpointChoice.select(0);
				else
					ramEnter.breakpointChoice.select(1);
			}

			setTitle("Eigenschaften für " + d.getInstanceName());
			coordEnter.setTitle("Koordinaten für " + d.getInstanceName());

			textField_Name.setText(d.getInstanceName());
			String temp = new String("");
			String[] label = source.getLabel();

			for (int i = 0; i < label.length; i++)
			{
				if (i == label.length-1)
					temp = temp + label[i];
				else
					temp = temp + label[i] + "\n";
			}
			textArea1.setText(temp);

			choice_componentType.select(d.getComponentType());

			String[] grabModes = source.getPossibleQualifiers();
			for (int i = 0; i < grabModes.length; i++)
				coordEnter.choice_grabMode.addItem(grabModes[i]);
			coordEnter.choice_grabMode.select(d.getGrabMode());


			// Aktualisieren des Koordinaten-Fensters
			String sourceName;

			// X-Koordinate
			if (d.isConstantOnlyX())
				coordEnter.rb_xAbs.setState(true);
			else
			{
				coordEnter.rb_xRel.setState(true);
				coordEnter.textField_xRelOffset.setText(Integer.toString(d.getOffsetX()));
			}
			coordEnter.textField_xAbs.setText(Integer.toString(d.evaluateX()));
			sourceName = parent.getDescription(d.getSourceX()).getInstanceName();
			coordEnter.choice_xSourceName.select(sourceName);
			coordEnter.choice_xSourceQualifier = parent.setChoiceItems(coordEnter.choice_xSourceQualifier, coordEnter.panelX, sourceName);
			coordEnter.choice_xSourceQualifier.select(d.getQualifierX());


			// Y-Koordinate
			if (d.isConstantOnlyY())
				coordEnter.rb_yAbs.setState(true);
			else
			{
				coordEnter.rb_yRel.setState(true);
				coordEnter.textField_yRelOffset.setText(Integer.toString(d.getOffsetY()));
			}
			coordEnter.textField_yAbs.setText(Integer.toString(d.evaluateY()));
			sourceName = parent.getDescription(d.getSourceY()).getInstanceName();
			coordEnter.choice_ySourceName.select(sourceName);
			coordEnter.choice_ySourceQualifier = parent.setChoiceItems(coordEnter.choice_ySourceQualifier, coordEnter.panelY, sourceName);
			coordEnter.choice_ySourceQualifier.select(d.getQualifierY());

			// Breite
			if (d.isConstantOnlyWidth())
				coordEnter.rb_widthAbs.setState(true);
			else
			{
				coordEnter.rb_widthRel.setState(true);
				coordEnter.textField_widthRelOffset.setText(Integer.toString(d.getOffsetWidth()));
			}
			coordEnter.textField_widthAbs.setText(Integer.toString(d.evaluateWidth()));
			sourceName = parent.getDescription(d.getSourceWidth()).getInstanceName();
			coordEnter.choice_widthSourceName.select(sourceName);
			coordEnter.choice_widthSourceQualifier = parent.setChoiceItems(coordEnter.choice_widthSourceQualifier, coordEnter.panelWidth, sourceName);
			coordEnter.choice_widthSourceQualifier.select(d.getQualifierWidth());

			// Hoehe
			if (d.isConstantOnlyHeight())
				coordEnter.rb_heightAbs.setState(true);
			else
			{
				coordEnter.rb_heightRel.setState(true);
				coordEnter.textField_heightRelOffset.setText(Integer.toString(d.getOffsetHeight()));
			}
			coordEnter.textField_heightAbs.setText(Integer.toString(d.evaluateHeight()));
			sourceName = parent.getDescription(d.getSourceHeight()).getInstanceName();
			coordEnter.choice_heightSourceName.select(sourceName);
			coordEnter.choice_heightSourceQualifier = parent.setChoiceItems(coordEnter.choice_heightSourceQualifier, coordEnter.panelHeight, sourceName);
			coordEnter.choice_heightSourceQualifier.select(d.getQualifierHeight());

		} // Ende von "Eigenschaften eines bestehenden Busses aendern"

	} /* end prepareWindows */


	public boolean getCoordEntered()
	{
		return coordEntered;
	}

	public void setCoordEntered(boolean b)
	{
		coordEntered = b;
	}

	public boolean getCreateNew()
	{
		return createNew;
	}

	//public void setCreateNew(boolean b)
	//{
	//	createNew = b;
	//}


    public synchronized void show() {
    	//Rectangle pb = parent.editor_Control.bounds();
    	//move(pb.x, pb.y);
    	super.show();
    }

	public boolean handleEvent(Event event) {
    	if (event.id == Event.WINDOW_DESTROY) {
            hide();         // hide the Frame
            return true;
    	}
		if (event.target == button_Coordinates && event.id == Event.ACTION_EVENT) {
			button_Coordinates_Clicked(event);
			return true;
		}
		if (event.target == buttonOK && event.id == Event.ACTION_EVENT) {
			buttonOK_Clicked(event);
			return true;
		}
		if (event.target == buttonCancel && event.id == Event.ACTION_EVENT) {
			hide();

			if (createNew)
			// neu angelegte Komponente wieder loeschen
			{
				Vector v = parent.getDescriptionVector(targetType);
				int index = v.indexOf((Object) d);
				v.removeElementAt(index);
				parent.getElementVector(targetType).removeElementAt(index);

				if (targetType.equals("EditableMemory") || targetType.equals("TagMemory"))
				{
					EditableMemory ram = (EditableMemory) source.getRK();
					EditableMemory_Resource ramBild = ram.getRessource();
					parent.remove(ramBild);
					ramBild = null;
					ram = null;
				}

				parent.repaint();
			}

			if (disposeFinally)
				dispose();

			return true;
		}
		if (event.target == button_Enhanced && event.id == Event.ACTION_EVENT) {
			buttonEnhanced_Clicked(event);
			return true;
		}
		return super.handleEvent(event);
	}


	private void parseWindows()
	{
		removeRessources();

		if (targetType.equals("Register16"))
		{
			if ( ! choice_componentType.getSelectedItem().equals(d.getComponentType()) )
			{
				Editor_Source oldRegister = source;
				createNewComponent();  // source = new Register...
				parent.changeReferences(oldRegister, targetType, source);  // alle Referenzen vom alten auf das neue Objekt umbiegen
				oldRegister = null;

				String componentType = choice_componentType.getSelectedItem();
				if (componentType.equals("Register16"))
				{
					coordEnter.textField_widthAbs.setText(Integer.toString(Register16.DEFAULT_WIDTH));
					coordEnter.textField_heightAbs.setText(Integer.toString(Register16.MINIMUM_HEIGHT));
				}
				else if (componentType.equals("Register16Split"))
				{
					coordEnter.textField_widthAbs.setText(Integer.toString(Register16Split.DEFAULT_WIDTH));
					coordEnter.textField_heightAbs.setText(Integer.toString(Register16Split.MINIMUM_HEIGHT));
				}
				else if (componentType.equals("Register8"))
				{
					coordEnter.textField_widthAbs.setText(Integer.toString(Register8.DEFAULT_WIDTH));
					coordEnter.textField_heightAbs.setText(Integer.toString(Register8.MINIMUM_HEIGHT));
				}
			}

			((Register16) source.getRKP()).setEditable(checkbox_editable.getState());
		}
		else if (targetType.equals("ALU"))
		{
			((ALU) source.getRK()).setOrientation(choice_componentType.getSelectedItem());
		}
		else if (targetType.equals("EditableMemory") || targetType.equals("TagMemory"))
		{
			//!!! RAM-Komponenten bis aus weiteres vorsichtshalber stets komplett neu erzeugen
			if (targetType.equals("EditableMemory"))
			{
				int cellX, cellY, ramSize, bitWidth, lineSize;
				String program;
				boolean editable, showOpcodes, allowBreakpoints;
				cellX = Integer.parseInt(ramEnter.widthChoice.getSelectedItem());
				cellY = Integer.parseInt(ramEnter.heightChoice.getSelectedItem());
				ramSize = Integer.parseInt(ramEnter.cacheSizeChoice.getSelectedItem());
				bitWidth = Integer.parseInt(ramEnter.bitWidthChoice.getSelectedItem());
				lineSize = Integer.parseInt(ramEnter.lineSizeChoice.getSelectedItem());
				program = ramEnter.programChoice.getSelectedItem();
				editable = showOpcodes = allowBreakpoints = false;
				if (ramEnter.editableChoice.getSelectedIndex() == 0)
					editable = true;
				if (ramEnter.opcodeChoice.getSelectedIndex() == 0)
					showOpcodes = true;
				if (ramEnter.breakpointChoice.getSelectedIndex() == 0)
					allowBreakpoints = true;

				Editor_Source oldRam = source;

				source = new Editor_Source( new EditableMemory("", 10, 10, cellX, cellY, ramSize, bitWidth, (Rechner) parent) );
				EditableMemory ram = (EditableMemory) source.getRK();
				ram.setLineSize(lineSize);
				ram.initRam(program);
				d.setProgram(program);
				ram.setEditable(editable);
				ram.showOpcodes(showOpcodes);
				ram.allowBreakpoints(allowBreakpoints);

				parent.changeReferences(oldRam, targetType, source);  // alle Referenzen vom alten auf das neue Objekt umbiegen
				oldRam = null;
			}
		}

		parseCoordWindow();

		String str = textArea1.getText();
		int numberOfCRs = 0;
		for (int i = 0; i < str.length(); i++)
		{
			if (str.substring(i, i+1).equals("\n"))
				numberOfCRs++;
		}
		String[] strArray = new String[numberOfCRs + 1];
		int j = 0;
		for (int i = 0; i <= numberOfCRs; i++)
			strArray[i] = new String("");
		for (int i = 0; i < str.length(); i++)
		{
			if (str.substring(i, i+1).equals("\n"))
				j++;
			else
				strArray[j] = strArray[j] + str.substring(i, i+1);
		}
		if ( targetType.equals("SimpleBus") || targetType.equals("Misc") || targetType.equals("Mux") || targetType.equals("PipelineStageLabel") )
		//!!! Komponenten, die mehrzeilige Bezeichnungen kennen, ggf. anpassen!
			source.setLabel(strArray);
		else
		{
			String[] strArray2 = {strArray[0]};
			source.setLabel(strArray2);
		}

		d.setInstanceName(textField_Name.getText());
		d.setComponentType(choice_componentType.getSelectedItem());

		//addRessources();

	} /* end parseWindows */


	protected void parseCoordWindow()
	{
		if (coordEnter == null)
		{
			if (createNew)
				parent.out("FEHLER in Editor_PropertiesRechnerKomponente.parseCoordWindow(): Neue Komponente, aber keine Koordinaten eingegeben!");
			else
				parent.out("FEHLER in Editor_PropertiesRechnerKomponente.parseCoordWindow(): Koordinaten der Komponente wurden nicht verändert.");
		}
		else
		{
			String grabMode = coordEnter.choice_grabMode.getSelectedItem();
			if (grabMode == null)
				grabMode = new String("left");
			d.setGrabMode(grabMode);


			// X-Koordinate
			d.setX(parent.getComponent(coordEnter.choice_xSourceName.getSelectedItem()),
			                          coordEnter.choice_xSourceQualifier.getSelectedItem(),
			                          Integer.parseInt(coordEnter.textField_xRelOffset.getText()));
			                          // X-Koordinate ergibt sich relativ zu anderer Komponente
			if (coordEnter.rb_xAbs.getState() == true)
				d.setX(Integer.parseInt(coordEnter.textField_xAbs.getText()));

			// Y-Koordinate
			d.setY(parent.getComponent(coordEnter.choice_ySourceName.getSelectedItem()),
			                          coordEnter.choice_ySourceQualifier.getSelectedItem(),
			                          Integer.parseInt(coordEnter.textField_yRelOffset.getText()));
			                          // Y-Koordinate ergibt sich relativ zu anderer Komponente
			if (coordEnter.rb_yAbs.getState() == true)
				d.setY(Integer.parseInt(coordEnter.textField_yAbs.getText()));

			// Breite
			d.setWidth(parent.getComponent(coordEnter.choice_widthSourceName.getSelectedItem()),
			                          coordEnter.choice_widthSourceQualifier.getSelectedItem(),
			                          Integer.parseInt(coordEnter.textField_widthRelOffset.getText()));
			                          // Breite ergibt sich relativ zu anderer Komponente
			if (coordEnter.rb_widthAbs.getState() == true)
				d.setWidth(Integer.parseInt(coordEnter.textField_widthAbs.getText()));

			// Hoehe
			d.setHeight(parent.getComponent(coordEnter.choice_heightSourceName.getSelectedItem()),
			                          coordEnter.choice_heightSourceQualifier.getSelectedItem(),
			                          Integer.parseInt(coordEnter.textField_heightRelOffset.getText()));
			                          // Hoehe ergibt sich relativ zu anderer Komponente
			if (coordEnter.rb_heightAbs.getState() == true)
				d.setHeight(Integer.parseInt(coordEnter.textField_heightAbs.getText()));

			if (createNew == false)
				parent.updateCoordinates();
			else
				source.reshape(d.evaluateX(), d.evaluateY(), d.evaluateWidth(), d.evaluateHeight(), d.getGrabMode());
				// Setzen von X- und Y-Koord., abhaengig von grabMode, sowie von Breite und Hoehe.
		}

	} /* end parseCoordWindow */

	private void createNewComponent()
	{
		String qualifier = choice_componentType.getSelectedItem();
		if (qualifier == null)
			qualifier = new String("");

		if (targetType.equals("Register16"))
		{
			if (qualifier.equals("Register16Split"))
				source = new Editor_Source( (RechnerKomponentePanel) new Register16Split("", 10, 10, "left", (Rechner) parent) );
				// Format: Titel, x, y, auf welche Stelle bezieht sich (x,y), Verweis auf Editor
			else if (qualifier.equals("Register8"))
				source = new Editor_Source( (RechnerKomponentePanel) new Register8("", 10, 10, "left", (Rechner) parent) );
			else  // "Register16"
				source = new Editor_Source( (RechnerKomponentePanel) new Register16("", 10, 10, "left", (Rechner) parent) );
		}
		else if (targetType.equals("ALU"))
		{
			source = new Editor_Source( new ALU("", 0, 0, "leftInput", (Rechner) parent) );
			// Format: Titel, x, y, auf welche Stelle bezieht sich (x,y), Verweis auf Editor
		}
		else if (targetType.equals("Adder"))
		{
			source = new Editor_Source( new Adder("", 0, 0, "leftInput", (Rechner) parent) );
			// Format: Titel, x, y, auf welche Stelle bezieht sich (x,y), Verweis auf Editor
		}
		else if (targetType.equals("EditableMemory"))
		{
		 	source = new Editor_Source( new EditableMemory("", 10, 10, 1, 8, 256, 32, (Rechner) parent) );
			// Format:                                    (    x,  y,  Zellen x, Speicherbreite,   )
			//                                             Titel,         Zellen y,  Verweis auf Editor
			//                                                               Speichergroesse,
		}
		//!!! else if (targetType.equals("TagMemory"))
		//{
		//	source = new Editor_Source( new TagMemory("", (Rechner) parent) );
		//}
		else if (targetType.equals("Misc"))
		{
			String[] title = {""};
			source = new Editor_Source( new Misc(title, 10, 10, 20, 20, "left", (Rechner) parent) );
			// Format: Titel[], x, y, Breite, Hoehe, auf welche Stelle bezieht sich (x,y), Verweis auf Editor
		}
		else if (targetType.equals("Mux"))
		{
			String[] title = {""};
			source = new Editor_Source( new Mux(title, 10, 10, 20, 20, "upperInput", (Rechner) parent) );
			// Format: Titel[], x, y, Breite, Hoehe, auf welche Stelle bezieht sich (x,y), Verweis auf Editor
		}
		else if (targetType.equals("PipelineRegister"))
		{
			source = new Editor_Source( new PipelineRegister("", 10, 10, 20, 20, "left", (Rechner) parent) );
			// Format: Titel, x, y, Breite, Hoehe, auf welche Stelle bezieht sich (x,y), Verweis auf Editor
		}
		else if (targetType.equals("PipelineStageLabel"))
		{
			source = new Editor_Source( new PipelineStageLabel("", "", 10, 10, 20, 20, "left", (Rechner) parent) );
			// Format: Titel oben, Titel unten, x, y, Breite, Hoehe, auf welche Stelle bezieht sich (x,y), Verweis auf Editor
		}
		//!!! else if (targetType.equals...

	} /* end createNewComponent */


	protected void removeRessources()
	{
		if (targetType.equals("EditableMemory") || targetType.equals("TagMemory"))
		{
			EditableMemory ram = (EditableMemory) source.getRK();
			ram.remove();
		}
	}



	//{{DECLARE_CONTROLS
	java.awt.Panel propertiesPanel;
	java.awt.Label label_componentType;
	java.awt.Label label1;
	java.awt.Label label2;
	java.awt.Button button_Coordinates;
	java.awt.TextField textField_Name;
	java.awt.TextArea textArea1;
	java.awt.Choice choice_componentType;
	java.awt.Button button_Enhanced;
	java.awt.Checkbox checkbox_editable;
	java.awt.Panel buttonPanel;
	java.awt.Button buttonOK;
	java.awt.Button buttonCancel;
	//}}

	//{{DECLARE_MENUS
	//}}
}
