src/main/java/xelfi/design/forms/XFFormDialog.java
author Jaroslav Tulach <jaroslav.tulach@xelfi.cz>
Tue, 17 Jan 2017 21:08:47 +0100
changeset 6 947ce1156833
parent 0 189280700bc7
permissions -rw-r--r--
Renaming setName to setDesignName and setSize to setDesignSize to avoid clash with added methods of java.awt.Component that return void
jaroslav@0
     1
/**
jaroslav@0
     2
* Xelfi
jaroslav@0
     3
*/
jaroslav@0
     4
jaroslav@0
     5
package xelfi.design.forms;
jaroslav@0
     6
jaroslav@0
     7
import java.awt.*;
jaroslav@0
     8
import java.io.*;
jaroslav@0
     9
import java.util.Vector;
jaroslav@0
    10
import java.util.Enumeration;
jaroslav@0
    11
import java.util.Hashtable;
jaroslav@0
    12
import xelfi.top.*;
jaroslav@0
    13
import xelfi.editor.*;
jaroslav@0
    14
import xelfi.xedit.*;
jaroslav@0
    15
import xelfi.design.forms.layouts.*;
jaroslav@0
    16
import xelfi.design.components.*;
jaroslav@0
    17
import xelfi.design.components.property.*;
jaroslav@0
    18
import xelfi.design.util.*;
jaroslav@0
    19
import xelfi.design.inspector.XelfiComponentInspector;
jaroslav@0
    20
import xelfi.design.components.palette.XelfiComponentPalette;
jaroslav@0
    21
import xelfi.design.components.xawt.XMenuBar;
jaroslav@0
    22
import xelfi.util.Debug;
jaroslav@0
    23
jaroslav@0
    24
/**
jaroslav@0
    25
* XelfiFormDialog is a Dialog which serves as a design Form for Dialog Forms.
jaroslav@0
    26
* It implements interfaces: <br>
jaroslav@0
    27
* - XelfiVisualContainer so as it is a container component
jaroslav@0
    28
* - XelfiDesignForm so as it is a Form
jaroslav@0
    29
* - ActionController so as it generates and controls blocks of text in text editor
jaroslav@0
    30
*
jaroslav@0
    31
* @version 	1.41, 06 Apr 1997
jaroslav@0
    32
* @author 		Ian Formanek, Petr Hamernik
jaroslav@0
    33
*/
jaroslav@0
    34
jaroslav@0
    35
public class XFFormDialog extends TopDialog implements 
jaroslav@0
    36
	XelfiVisualContainer, 
jaroslav@0
    37
	XelfiDesignForm, 
jaroslav@0
    38
	ActionController
jaroslav@0
    39
{
jaroslav@0
    40
	// Component data (form is a component)
jaroslav@0
    41
	private static int propertyCount = 13;
jaroslav@0
    42
	private static int eventCount = 12;
jaroslav@0
    43
jaroslav@0
    44
	// property constants
jaroslav@0
    45
	private static final int GRID = 0; 
jaroslav@0
    46
	private static final int BACKGROUNDCOLOR = 1; 
jaroslav@0
    47
	private static final int FOREGROUNDCOLOR = 2; 
jaroslav@0
    48
	private static final int FONT = 3; 
jaroslav@0
    49
	private static final int TITLE = 4; 
jaroslav@0
    50
	private static final int MODAL = 5; 
jaroslav@0
    51
	private static final int RESIZABLE = 6; 
jaroslav@0
    52
	private static final int SHOWFORM = 7; 
jaroslav@0
    53
	private static final int MOVEFORM = 8; 
jaroslav@0
    54
	private static final int RESIZEFORM = 9; 
jaroslav@0
    55
	private static final int CLASSPUBLIC = 10; 
jaroslav@0
    56
	private static final int IMPLEMENTS = 11; 
jaroslav@0
    57
	private static final int IMPORTS = 12; 
jaroslav@0
    58
jaroslav@0
    59
	private static Object propDef[];
jaroslav@0
    60
	private static boolean propDefSet = false;
jaroslav@0
    61
jaroslav@0
    62
	private static void propertiesSetDefault() {
jaroslav@0
    63
		propDefSet = true;
jaroslav@0
    64
		propDef = new Object[propertyCount];
jaroslav@0
    65
		propDef[GRID] = null;
jaroslav@0
    66
		propDef[BACKGROUNDCOLOR] = null;
jaroslav@0
    67
		propDef[FOREGROUNDCOLOR] = null;
jaroslav@0
    68
		propDef[FONT] = null;
jaroslav@0
    69
		propDef[TITLE] = new String("");
jaroslav@0
    70
		propDef[MODAL] = new Boolean(true);
jaroslav@0
    71
		propDef[RESIZABLE] = new Boolean(true);
jaroslav@0
    72
		propDef[SHOWFORM] = new Boolean(true);
jaroslav@0
    73
		propDef[MOVEFORM] = new Boolean(true);
jaroslav@0
    74
		propDef[RESIZEFORM] = new Boolean(true);
jaroslav@0
    75
		propDef[CLASSPUBLIC] = new Boolean(true);
jaroslav@0
    76
		propDef[IMPLEMENTS] = null;
jaroslav@0
    77
		propDef[IMPORTS] = null;
jaroslav@0
    78
	}
jaroslav@0
    79
		
jaroslav@0
    80
	private String events[] = new String[eventCount];
jaroslav@0
    81
	private Dimension size;
jaroslav@0
    82
	private Point position;
jaroslav@0
    83
	private String formName;
jaroslav@0
    84
	private XelfiDesignForm parentForm = null;
jaroslav@0
    85
	private XelfiDesignLayout xLayout;
jaroslav@0
    86
jaroslav@0
    87
	private boolean backgroundChanged = false;
jaroslav@0
    88
	private boolean foregroundChanged = false;
jaroslav@0
    89
	private boolean fontChanged = false;
jaroslav@0
    90
jaroslav@0
    91
	private boolean pIsModal = true;
jaroslav@0
    92
	private boolean pIsResizable = true; 
jaroslav@0
    93
	private boolean pShowForm = false;
jaroslav@0
    94
	private boolean pMoveForm = true;
jaroslav@0
    95
	private boolean pResizeForm = true;
jaroslav@0
    96
	private String pImports[] = new String[0];
jaroslav@0
    97
	private XFFormInheritance inheritance;
jaroslav@0
    98
	
jaroslav@0
    99
	// other
jaroslav@0
   100
	XelfiComponentInspector inspector;	
jaroslav@0
   101
	XelfiComponentPalette palette;
jaroslav@0
   102
	XFNameManager nameManager;
jaroslav@0
   103
jaroslav@0
   104
	String packageName;
jaroslav@0
   105
jaroslav@0
   106
	private Vector selectedComps;
jaroslav@0
   107
	private Vector nonVisualComps;
jaroslav@0
   108
	private Vector containers;
jaroslav@0
   109
jaroslav@0
   110
	// for dragging
jaroslav@0
   111
	private final static int DM_NONE = 0;
jaroslav@0
   112
	private final static int DM_DRAG = 1;
jaroslav@0
   113
	private final static int DM_ADD = 2;
jaroslav@0
   114
jaroslav@0
   115
	private int dragMode = DM_NONE;
jaroslav@0
   116
	private XelfiVisualComponent dragComp = null;	// the component that we are dragging/adding
jaroslav@0
   117
	int drx, dry;
jaroslav@0
   118
	Point dragP = null;
jaroslav@0
   119
	Point addPos = null;
jaroslav@0
   120
	boolean lMouseDown = false;
jaroslav@0
   121
	XelfiVisualContainer xvcParent = null;
jaroslav@0
   122
jaroslav@0
   123
	private GridInfo grid = new GridInfo(XFDesignOptions.gridX, XFDesignOptions.gridX);
jaroslav@0
   124
jaroslav@0
   125
	// for code generation
jaroslav@0
   126
	XFImportsManager impsManager;
jaroslav@0
   127
	Source formSource;
jaroslav@0
   128
	Document formDocument;
jaroslav@0
   129
	Block sourceBeginB, packageB, importsB;
jaroslav@0
   130
	Block classBeginB, classEndB;
jaroslav@0
   131
	Block variablesB;
jaroslav@0
   132
	Block constructorBeginB, constructorEndB;
jaroslav@0
   133
	Block componentsB;
jaroslav@0
   134
	Block formLayoutB, formSetpropsB, formResizeB;
jaroslav@0
   135
	Block handleBeginB, handleEndB;
jaroslav@0
   136
jaroslav@0
   137
	Block userMethodsUB, importsUB, constructorUB, handleBodyUB;
jaroslav@0
   138
jaroslav@0
   139
	BlockContainer userBlocks;
jaroslav@0
   140
	DesignBackgroundCallback backCallback;
jaroslav@0
   141
jaroslav@0
   142
	// events managenent
jaroslav@0
   143
	EventPool evPool;
jaroslav@0
   144
	
jaroslav@0
   145
	// templateName	
jaroslav@0
   146
	String templateName = "Dialog";
jaroslav@0
   147
	
jaroslav@0
   148
	/**
jaroslav@0
   149
	* Creates new form dialog.
jaroslav@0
   150
	* @param parent		Frame parent of the design-time dialog form
jaroslav@0
   151
	* @param aFormName 	name of the form = name of generated class
jaroslav@0
   152
	* @param aFormSource	Source where the form code will be generated
jaroslav@0
   153
	*/
jaroslav@0
   154
	public XFFormDialog(Frame parent, String aFormName, Source aFormSource) {
jaroslav@0
   155
		this(parent, aFormName, null, aFormSource);
jaroslav@0
   156
	}
jaroslav@0
   157
	
jaroslav@0
   158
	/**
jaroslav@0
   159
	* Creates new form frame.
jaroslav@0
   160
	* @param parent		Frame parent of the design-time dialog form
jaroslav@0
   161
	* @param aFormName 	name of the form = name of generated class
jaroslav@0
   162
	* @param aPackageName	Name of the package in which the generated class shoul be
jaroslav@0
   163
	* @param aFormSource	Source where the form code will be generated
jaroslav@0
   164
	*/
jaroslav@0
   165
	public XFFormDialog(Frame parent, String aFormName, String aPackageName, Source aFormSource) {
jaroslav@0
   166
		super(parent, false);
jaroslav@0
   167
		if (!propDefSet) propertiesSetDefault();
jaroslav@0
   168
		formSource = aFormSource;
jaroslav@0
   169
		// Component init
jaroslav@0
   170
		position = new Point(0,0); size = null;
jaroslav@0
   171
jaroslav@0
   172
		// Other init
jaroslav@0
   173
		formName = aFormName;
jaroslav@0
   174
		inheritance = XFFormInheritance.Dialog(pIsModal);
jaroslav@0
   175
		inspector = TopLevel.getInspector();	
jaroslav@0
   176
		palette = TopLevel.getPalette();
jaroslav@0
   177
		nameManager = new XFNameManager();
jaroslav@0
   178
		impsManager = new XFImportsManager();
jaroslav@0
   179
		impsManager.assignImport("java.awt.*");
jaroslav@0
   180
		impsManager.assignImports(neededImports());
jaroslav@0
   181
		
jaroslav@0
   182
		if (!XFDesignOptions.defaultFormBackground.isDefault())
jaroslav@0
   183
			setBackground(XFDesignOptions.defaultFormBackground.getColor());
jaroslav@0
   184
			
jaroslav@0
   185
		setTitle("");
jaroslav@0
   186
jaroslav@0
   187
		xLayout = new XAbsoluteLayout();
jaroslav@0
   188
		xLayout.setParent(this);
jaroslav@0
   189
		setLayout((LayoutManager)xLayout);
jaroslav@0
   190
		impsManager.assignImports(xLayout.neededImports());
jaroslav@0
   191
jaroslav@0
   192
		resize(XFDesignOptions.formDefWidth, XFDesignOptions.formDefHeight);
jaroslav@0
   193
		
jaroslav@0
   194
		userBlocks = new BlockContainer();
jaroslav@0
   195
		backCallback = new DesignBackgroundCallback(userBlocks);
jaroslav@0
   196
		createFormSource(); // creates new source where the code will be generated
jaroslav@0
   197
jaroslav@0
   198
		setPackage(aPackageName);
jaroslav@0
   199
		
jaroslav@0
   200
		selectedComps = new Vector(1,1);
jaroslav@0
   201
		nonVisualComps = new Vector(1,1);
jaroslav@0
   202
		containers = new Vector(1,1);
jaroslav@0
   203
		containers.addElement(this);
jaroslav@0
   204
		select(this); // initial selection = form
jaroslav@0
   205
	}
jaroslav@0
   206
jaroslav@0
   207
	protected void finalize() throws Throwable {
jaroslav@0
   208
		formDocument.removeActionController(this);
jaroslav@0
   209
		super.finalize();
jaroslav@0
   210
	}
jaroslav@0
   211
	
jaroslav@0
   212
	public boolean handleEvent(Event evt) {
jaroslav@0
   213
		if (evt.id == Event.WINDOW_DESTROY) {
jaroslav@0
   214
			hide();
jaroslav@0
   215
			return true;
jaroslav@0
   216
		}
jaroslav@0
   217
		else
jaroslav@0
   218
		if (evt.id == Event.KEY_PRESS && evt.key == 127) { // Del pressed
jaroslav@0
   219
			deleteSelection();
jaroslav@0
   220
		}
jaroslav@0
   221
		return super.handleEvent(evt);
jaroslav@0
   222
	}
jaroslav@0
   223
jaroslav@0
   224
	public boolean gotFocus(Event evt, Object o) {
jaroslav@0
   225
		if (inspector.getInspectable()!= this)
jaroslav@0
   226
			inspector.inspectableChanged(this);
jaroslav@0
   227
		return super.gotFocus(evt,o);
jaroslav@0
   228
	}
jaroslav@0
   229
jaroslav@0
   230
////////////////////////
jaroslav@0
   231
// component dragging //
jaroslav@0
   232
////////////////////////
jaroslav@0
   233
jaroslav@0
   234
// selection management methods
jaroslav@0
   235
jaroslav@0
   236
	// add given component to selected components if it is not already there
jaroslav@0
   237
	// otherwise remove
jaroslav@0
   238
	private void toggleSelect(XelfiDesignComponent comp) { 
jaroslav@0
   239
		if (selectedComps.removeElement(comp)) {  // O.K it was there
jaroslav@0
   240
			comp.setSelection(XFDesignConstants.SEL_UNSELECT);
jaroslav@0
   241
			if (selectedComps.size() == 1)
jaroslav@0
   242
				((XelfiDesignComponent)selectedComps.elementAt(0)).setSelection(XFDesignConstants.SEL_SELECT);
jaroslav@0
   243
			else if (selectedComps.isEmpty()) select(this); // if last component is deselected, select form
jaroslav@0
   244
		}
jaroslav@0
   245
		else {	// component was not selected -->> we add it now
jaroslav@0
   246
			if (selectedComps.contains(this)) selectedComps.removeElement(this);  // form cannot be in multiple selection
jaroslav@0
   247
			select(comp);
jaroslav@0
   248
		}		
jaroslav@0
   249
	}
jaroslav@0
   250
jaroslav@0
   251
	// remove all from selected components
jaroslav@0
   252
	private void deselectAll() { 
jaroslav@0
   253
		int count = selectedComps.size();
jaroslav@0
   254
		for (int i=0; i<count; i++)
jaroslav@0
   255
			((XelfiDesignComponent)selectedComps.elementAt(i)).setSelection(XFDesignConstants.SEL_UNSELECT);
jaroslav@0
   256
		selectedComps.removeAllElements();
jaroslav@0
   257
	}
jaroslav@0
   258
jaroslav@0
   259
	// add given component to selected components
jaroslav@0
   260
	private void select(XelfiDesignComponent comp) { 
jaroslav@0
   261
		int oldSize = selectedComps.size();
jaroslav@0
   262
		selectedComps.addElement(comp);
jaroslav@0
   263
		int newSize = selectedComps.size();
jaroslav@0
   264
		if (newSize == 1)
jaroslav@0
   265
			comp.setSelection(XFDesignConstants.SEL_SELECT);
jaroslav@0
   266
		else
jaroslav@0
   267
			if (oldSize == 1)
jaroslav@0
   268
				for (int i=0; i<newSize; i++)
jaroslav@0
   269
					((XelfiDesignComponent)selectedComps.elementAt(i)).setSelection(XFDesignConstants.SEL_MUL_SELECT);
jaroslav@0
   270
			else
jaroslav@0
   271
				comp.setSelection(XFDesignConstants.SEL_MUL_SELECT);
jaroslav@0
   272
		
jaroslav@0
   273
	}
jaroslav@0
   274
	
jaroslav@0
   275
	// returns whether this component is selected
jaroslav@0
   276
	private boolean isSelected(XelfiDesignComponent comp) { 
jaroslav@0
   277
		return selectedComps.contains(comp);
jaroslav@0
   278
	}
jaroslav@0
   279
jaroslav@0
   280
	// returns whether selected components can be dragged
jaroslav@0
   281
	// (i.e. they are on same depth and their parent's layout allows dragging)
jaroslav@0
   282
	private boolean isSelectionDragable() { 
jaroslav@0
   283
		// [PENDING - now dragable only when only one component is selected]
jaroslav@0
   284
		if (selectedComps.size() != 1) return false;
jaroslav@0
   285
		if (XFDesignOptions.lockComponents) return false; 
jaroslav@0
   286
		Object comp = selectedComps.elementAt(0);
jaroslav@0
   287
		if (comp instanceof XelfiDesignForm) return false;
jaroslav@0
   288
		if (comp instanceof XelfiVisualComponent) {
jaroslav@0
   289
			Container parentCont = ((Component)comp).getParent();
jaroslav@0
   290
			if (parentCont == null) return false; // null parent
jaroslav@0
   291
			return ((XelfiVisualContainer)parentCont).getDesignLayout().allowsDragging();
jaroslav@0
   292
		}
jaroslav@0
   293
		return false; // non-visual component is selected
jaroslav@0
   294
	}
jaroslav@0
   295
jaroslav@0
   296
	public void deleteSelection() {
jaroslav@0
   297
		if (isSelected(this)) return;
jaroslav@0
   298
jaroslav@0
   299
		int count = selectedComps.size();
jaroslav@0
   300
		XelfiDesignComponent comps[] = new XelfiDesignComponent[count];
jaroslav@0
   301
		selectedComps.copyInto(comps);
jaroslav@0
   302
		deselectAll();
jaroslav@0
   303
		select(this);
jaroslav@0
   304
		for (int i=0; i<count; i++) {
jaroslav@0
   305
			XelfiDesignComponent xdc = comps[i];
jaroslav@0
   306
			// 1. release events
jaroslav@0
   307
			for (int j=0; j<xdc.getEventCount(); j++)
jaroslav@0
   308
				if (xdc.getEvent(j) != null) releaseEvent(xdc, j);
jaroslav@0
   309
			// 2. release imports
jaroslav@0
   310
			impsManager.releaseImports(xdc.neededImports());
jaroslav@0
   311
			// 3. release names
jaroslav@0
   312
			nameManager.releaseName(xdc);
jaroslav@0
   313
			// 4. according to component type remove from list or parent
jaroslav@0
   314
			if (xdc instanceof XelfiVisualComponent) {
jaroslav@0
   315
				Container compParent = ((Component)xdc).getParent();
jaroslav@0
   316
				((XelfiVisualContainer)compParent).getDesignLayout().removeComponent((XelfiVisualComponent)xdc);
jaroslav@0
   317
				compParent.remove((Component)xdc);
jaroslav@0
   318
				validate();
jaroslav@0
   319
			}
jaroslav@0
   320
			else
jaroslav@0
   321
				nonVisualComps.removeElement(xdc);
jaroslav@0
   322
		}
jaroslav@0
   323
		inspector.selectionChanged(); // update CI
jaroslav@0
   324
		regenerateComponents();
jaroslav@0
   325
	}
jaroslav@0
   326
	
jaroslav@0
   327
// mouse event handlers
jaroslav@0
   328
jaroslav@0
   329
	public boolean mouseDown(Event evt, int x, int y) {
jaroslav@0
   330
		if (XFDesignOptions.designMode==XFDesignConstants.DM_REAL) return false;
jaroslav@0
   331
		
jaroslav@0
   332
		if (XFDesignUtils.leftMouse(evt)) {
jaroslav@0
   333
			lMouseDown = true;
jaroslav@0
   334
			if (XFDesignOptions.designMode == XFDesignConstants.DM_DESIGN) {
jaroslav@0
   335
				if (palette.getMode() == XFDesignConstants.XM_SELECTIONMODE) {// lmouse/design/selection
jaroslav@0
   336
					if (evt.shiftDown()) { // lmouse/design/selection/shift
jaroslav@0
   337
						if (evt.target == this) return true; // form cannot be in multiple selection
jaroslav@0
   338
						toggleSelect((XelfiVisualComponent)evt.target);
jaroslav@0
   339
						inspector.selectionChanged(); // update CI
jaroslav@0
   340
						return true;
jaroslav@0
   341
					}
jaroslav@0
   342
					else { // lmouse/design/selection/not shift
jaroslav@0
   343
						if (!isSelected((XelfiVisualComponent)evt.target)) {
jaroslav@0
   344
							deselectAll(); // remove all from selected components
jaroslav@0
   345
							select((XelfiVisualComponent)evt.target); // add current to selected components
jaroslav@0
   346
							inspector.selectionChanged(); // update CI
jaroslav@0
   347
							if (isSelectionDragable()) {
jaroslav@0
   348
								dragMode = DM_DRAG;
jaroslav@0
   349
								drx = x; dry = y;
jaroslav@0
   350
								dragComp = (XelfiVisualComponent)selectedComps.elementAt(0);
jaroslav@0
   351
								dragP = ((Component)dragComp).location();
jaroslav@0
   352
							}
jaroslav@0
   353
							return true;
jaroslav@0
   354
						}
jaroslav@0
   355
						else {
jaroslav@0
   356
							if (evt.target != this) { // form cannot be in multiple selection
jaroslav@0
   357
								if (isSelectionDragable()) {
jaroslav@0
   358
									dragMode = DM_DRAG;
jaroslav@0
   359
									drx = x; dry = y;
jaroslav@0
   360
									dragComp = (XelfiVisualComponent)selectedComps.elementAt(0);
jaroslav@0
   361
									dragP = ((Component)dragComp).location();
jaroslav@0
   362
								}
jaroslav@0
   363
							}
jaroslav@0
   364
							return true;
jaroslav@0
   365
						}
jaroslav@0
   366
					}
jaroslav@0
   367
				}
jaroslav@0
   368
				else { // lmouse/design/add mode
jaroslav@0
   369
					// find nearest (in depth) container to which we are adding this component
jaroslav@0
   370
					Component tempC = (Component)evt.target;
jaroslav@0
   371
					while (!(tempC instanceof XelfiVisualContainer)) tempC = tempC.getParent();
jaroslav@0
   372
					xvcParent = (XelfiVisualContainer) tempC;
jaroslav@0
   373
jaroslav@0
   374
					dragP = new Point(x,y);
jaroslav@0
   375
					Point parentPos = null;
jaroslav@0
   376
					// what if this is nested more in depth
jaroslav@0
   377
					if (xvcParent != this) {
jaroslav@0
   378
						parentPos = ((Container)xvcParent).location();
jaroslav@0
   379
						Container tmpParent = ((Container)xvcParent).getParent();
jaroslav@0
   380
						while (tmpParent != this) {
jaroslav@0
   381
							Point tmpPos = tmpParent.location();
jaroslav@0
   382
							tmpParent = tmpParent.getParent();
jaroslav@0
   383
							parentPos.x += tmpPos.x;
jaroslav@0
   384
							parentPos.y += tmpPos.y;
jaroslav@0
   385
						}
jaroslav@0
   386
						Insets insets = insets();
jaroslav@0
   387
						parentPos.x -= insets.left;
jaroslav@0
   388
						parentPos.y -= insets.top;
jaroslav@0
   389
						// in parentPos now I have the difference between mouse click position
jaroslav@0
   390
						// and position I want to get (relative position of xvc within its parent)
jaroslav@0
   391
					}
jaroslav@0
   392
					else parentPos = new Point(0,0);
jaroslav@0
   393
jaroslav@0
   394
					Class xx;
jaroslav@0
   395
					XelfiVisualComponent xvc = null;
jaroslav@0
   396
					XelfiDesignComponent xdc = null;
jaroslav@0
   397
					try {
jaroslav@0
   398
						xx = Class.forName(palette.getAddComponent());
jaroslav@0
   399
						xdc = (XelfiDesignComponent) xx.newInstance();
jaroslav@0
   400
						xdc.setParentForm(this);
jaroslav@0
   401
						if (xdc instanceof XMenuBar) {										// MENU COMPONENT
jaroslav@0
   402
							Debug.debug(Debug.FORM, "Cannot add menu component to Dialog!");
jaroslav@0
   403
							palette.setSelectionMode();							
jaroslav@0
   404
							// [PENDING - invoke message box with this message]
jaroslav@0
   405
						} else if (xdc instanceof XelfiVisualComponent) {		// VISUAL COMPONENT
jaroslav@0
   406
							xvc = (XelfiVisualComponent) xdc;
jaroslav@0
   407
							if (evt.target != this) {
jaroslav@0
   408
								Insets insets = insets();
jaroslav@0
   409
								addPos = new Point(x-parentPos.x-insets.left,y-parentPos.y-insets.top);
jaroslav@0
   410
							}
jaroslav@0
   411
							else
jaroslav@0
   412
								addPos = new Point(x-parentPos.x,y-parentPos.y);
jaroslav@0
   413
						} else {  																	// NON-VISUAL COMPONENT
jaroslav@6
   414
							xdc.setDesignName(nameManager.getNewName(xdc));
jaroslav@0
   415
							nonVisualComps.addElement(xdc);
jaroslav@0
   416
							deselectAll();
jaroslav@0
   417
							select(xdc);
jaroslav@0
   418
							inspector.selectionChanged();
jaroslav@0
   419
							impsManager.assignImports(xdc.neededImports());
jaroslav@0
   420
							regenerateComponents(); 
jaroslav@0
   421
//							[PENDING show up non-visual components manager]
jaroslav@0
   422
						}
jaroslav@0
   423
					} catch (IllegalAccessException e) {
jaroslav@0
   424
						Debug.debugException(e);
jaroslav@0
   425
					} catch (InstantiationException e) {
jaroslav@0
   426
						Debug.debugException(e);
jaroslav@0
   427
					} catch (ClassNotFoundException e) {
jaroslav@0
   428
						Debug.debugException(e);
jaroslav@0
   429
					}
jaroslav@0
   430
					// [PENDING - in case of exception do something]
jaroslav@0
   431
					if (xvc != null) {
jaroslav@0
   432
						dragComp = xvc;
jaroslav@0
   433
						dragMode = DM_ADD;
jaroslav@0
   434
					}
jaroslav@0
   435
					if (!evt.shiftDown()) palette.setSelectionMode(); // this resets the mode to "selection"
jaroslav@0
   436
				}
jaroslav@0
   437
			}
jaroslav@0
   438
		}
jaroslav@0
   439
		return false;
jaroslav@0
   440
	}
jaroslav@0
   441
jaroslav@0
   442
	public boolean mouseDrag(Event evt, int x, int y) {
jaroslav@0
   443
		if (XFDesignOptions.designMode==XFDesignConstants.DM_REAL) return false;
jaroslav@0
   444
		if (lMouseDown) {
jaroslav@0
   445
			if (XFDesignOptions.designMode == XFDesignConstants.DM_DESIGN) {
jaroslav@0
   446
				if (dragMode == DM_DRAG) {
jaroslav@0
   447
					if (dragP != null) {
jaroslav@0
   448
						Point cpos=dragComp.getPosition();
jaroslav@0
   449
jaroslav@0
   450
						int roundedX = ((x-drx+cpos.x) / grid.gridX()) * grid.gridX();
jaroslav@0
   451
						int roundedY = ((y-dry+cpos.y) / grid.gridY()) * grid.gridY();
jaroslav@0
   452
						
jaroslav@0
   453
						int newX = roundedX -cpos.x +dragP.x;
jaroslav@0
   454
						int newY = roundedY -cpos.y +dragP.y;
jaroslav@0
   455
						Point oldP = ((Component)dragComp).location();
jaroslav@0
   456
						if ((newX != oldP.x) || (newY != oldP.y))
jaroslav@0
   457
							((Component)dragComp).move(newX, newY);
jaroslav@0
   458
						}
jaroslav@0
   459
				}
jaroslav@0
   460
				return true;
jaroslav@0
   461
			}
jaroslav@0
   462
		}	
jaroslav@0
   463
		return false;
jaroslav@0
   464
	}	
jaroslav@0
   465
jaroslav@0
   466
	public boolean mouseUp(Event evt, int x, int y) {
jaroslav@0
   467
		if (XFDesignOptions.designMode==XFDesignConstants.DM_REAL) return false;
jaroslav@0
   468
		if (lMouseDown) {
jaroslav@0
   469
			lMouseDown = false;
jaroslav@0
   470
			if (XFDesignOptions.designMode == XFDesignConstants.DM_DESIGN) {
jaroslav@0
   471
				if (dragMode == DM_DRAG) {
jaroslav@0
   472
					dragMode = DM_NONE;
jaroslav@0
   473
					Point cpos=dragComp.getPosition();
jaroslav@0
   474
					int roundedX = ((x-drx+cpos.x) / grid.gridX()) * grid.gridX();
jaroslav@0
   475
					int roundedY = ((y-dry+cpos.y) / grid.gridY()) * grid.gridY();
jaroslav@0
   476
					dragComp.setPosition(roundedX,roundedY);
jaroslav@0
   477
					dragP = null;
jaroslav@0
   478
					inspector.propertiesChanged();
jaroslav@0
   479
				}
jaroslav@0
   480
				else if ((dragMode == DM_ADD) && (dragComp != null)) {
jaroslav@0
   481
					dragMode = DM_NONE;
jaroslav@0
   482
jaroslav@0
   483
					formDocument.redrawLock();
jaroslav@6
   484
					dragComp.setDesignName(nameManager.getNewName(dragComp));
jaroslav@0
   485
					addPos.x = (addPos.x / grid.gridX()) * grid.gridX();
jaroslav@0
   486
					addPos.y = (addPos.y / grid.gridY()) * grid.gridY();
jaroslav@0
   487
					dragComp.setPosition(addPos.x, addPos.y);
jaroslav@0
   488
jaroslav@0
   489
					if (dragComp instanceof XelfiVisualContainer)
jaroslav@0
   490
						containers.addElement(dragComp);
jaroslav@0
   491
jaroslav@0
   492
					int newW = x - dragP.x; if (newW < 0) newW = 0;
jaroslav@0
   493
					int newH = y - dragP.y; if (newH < 0) newH = 0;
jaroslav@0
   494
jaroslav@0
   495
					if ((newW>XFDesignOptions.minDragSize) || 
jaroslav@0
   496
					    (newH>XFDesignOptions.minDragSize))
jaroslav@6
   497
						dragComp.setDesignSize(newW, newH);
jaroslav@0
   498
jaroslav@0
   499
					xvcParent.getDesignLayout().layoutAdd((Container)xvcParent, dragComp);
jaroslav@0
   500
jaroslav@0
   501
					deselectAll();
jaroslav@0
   502
					validate();
jaroslav@0
   503
					select(dragComp);
jaroslav@0
   504
					inspector.selectionChanged();
jaroslav@0
   505
					impsManager.assignImports(dragComp.neededImports());
jaroslav@0
   506
					regenerateComponents();
jaroslav@0
   507
					formDocument.redrawUnlock();
jaroslav@0
   508
				}
jaroslav@0
   509
			}
jaroslav@0
   510
		}
jaroslav@0
   511
		return false;
jaroslav@0
   512
	}
jaroslav@0
   513
jaroslav@0
   514
	public void paint(Graphics g) {
jaroslav@0
   515
		Dimension aSize=size();
jaroslav@0
   516
		if (XFDesignOptions.designMode == XFDesignConstants.DM_DESIGN)
jaroslav@0
   517
			XFDesignUtils.paintGrid(this, g, grid, 0, 0, aSize.width, aSize.height);
jaroslav@0
   518
jaroslav@0
   519
		// when form's size property changes
jaroslav@0
   520
		if ((size == null) || (aSize.width != size.width) || (aSize.height != size.height)) {
jaroslav@0
   521
			// [PENDING - not when minimized ]
jaroslav@0
   522
			size = aSize;
jaroslav@0
   523
			if (pResizeForm)
jaroslav@0
   524
				regenerateCode(this, XFDesignConstants.FGEN_FORM_RESIZE);
jaroslav@0
   525
			if (isSelected(this))
jaroslav@0
   526
				inspector.propertiesChanged();
jaroslav@0
   527
		}
jaroslav@0
   528
	}
jaroslav@0
   529
jaroslav@0
   530
	/////////////////////////////////////////
jaroslav@0
   531
	// XelfiVisualContainer implementation //
jaroslav@0
   532
	/////////////////////////////////////////
jaroslav@0
   533
jaroslav@0
   534
	public void setParentForm(XelfiDesignForm form) { }
jaroslav@0
   535
	public XelfiDesignForm getParentForm() { return this; }
jaroslav@0
   536
jaroslav@0
   537
	public String getName() { return formName; }
jaroslav@6
   538
	public int setDesignName(String aName) { formName = aName; return XFDesignConstants.RSP_OK; }
jaroslav@0
   539
jaroslav@0
   540
	public Point getPosition() { return position; }
jaroslav@0
   541
jaroslav@0
   542
	public int setPosition(int x, int y) { 
jaroslav@0
   543
		position.x = x; position.y = y;
jaroslav@0
   544
		if (pMoveForm)
jaroslav@0
   545
			regenerateCode(this, XFDesignConstants.FGEN_FORM_RESIZE);
jaroslav@0
   546
		return XFDesignConstants.RSP_OK;
jaroslav@0
   547
	}
jaroslav@0
   548
jaroslav@0
   549
	public Dimension getSize() {
jaroslav@0
   550
		if (size == null)
jaroslav@0
   551
			size = new Dimension(XFDesignOptions.formDefWidth, XFDesignOptions.formDefHeight);
jaroslav@0
   552
		return size;
jaroslav@0
   553
	}
jaroslav@0
   554
jaroslav@0
   555
	public Dimension getDesignSize() {
jaroslav@0
   556
		return preferredSize();
jaroslav@0
   557
	}
jaroslav@0
   558
jaroslav@6
   559
	public int setDesignSize(int w, int h) {
jaroslav@0
   560
		if (size == null)
jaroslav@0
   561
			size = new Dimension(w,h);
jaroslav@0
   562
		else {
jaroslav@0
   563
			size.width = w;
jaroslav@0
   564
			size.height = h;
jaroslav@0
   565
		}
jaroslav@0
   566
		resize(w,h);
jaroslav@0
   567
		if (pResizeForm)
jaroslav@0
   568
			regenerateCode(this, XFDesignConstants.FGEN_FORM_RESIZE);
jaroslav@0
   569
		return XFDesignConstants.RSP_OK;
jaroslav@0
   570
	}
jaroslav@0
   571
jaroslav@0
   572
	private boolean propertyDefault(int i) throws XFPropertyIndexOutOfBoundsException {
jaroslav@0
   573
		switch (i) {
jaroslav@0
   574
			case GRID: return false;
jaroslav@0
   575
			case BACKGROUNDCOLOR: return !backgroundChanged;
jaroslav@0
   576
			case FOREGROUNDCOLOR: return !foregroundChanged;
jaroslav@0
   577
			case FONT: return !fontChanged;
jaroslav@0
   578
			case TITLE: return ((String)propDef[i]).equals(getTitle());
jaroslav@0
   579
			case MODAL: return ((Boolean) propDef[i]).booleanValue() == pIsModal;
jaroslav@0
   580
			case RESIZABLE: return ((Boolean) propDef[i]).booleanValue() == pIsResizable;
jaroslav@0
   581
			case SHOWFORM: return ((Boolean) propDef[i]).booleanValue() == pShowForm;
jaroslav@0
   582
			case MOVEFORM: return ((Boolean) propDef[i]).booleanValue() == pMoveForm;
jaroslav@0
   583
			case RESIZEFORM: return ((Boolean) propDef[i]).booleanValue() == pResizeForm;
jaroslav@0
   584
			case CLASSPUBLIC: return ((Boolean) propDef[i]).booleanValue() == inheritance.isPublic;
jaroslav@0
   585
			case IMPLEMENTS: return false;
jaroslav@0
   586
			case IMPORTS: return false;
jaroslav@0
   587
			default: throw new XFPropertyIndexOutOfBoundsException();
jaroslav@0
   588
		}
jaroslav@0
   589
	}
jaroslav@0
   590
jaroslav@0
   591
	public boolean parentUpdate() { return true; }
jaroslav@0
   592
jaroslav@0
   593
	public int getPropertyCount() { return propertyCount; }
jaroslav@0
   594
jaroslav@0
   595
	public String[] getPropertyNames() {
jaroslav@0
   596
		String list[] = new String[propertyCount];
jaroslav@0
   597
		list[GRID] = "Grid";
jaroslav@0
   598
		list[BACKGROUNDCOLOR] = "Background Color";
jaroslav@0
   599
		list[FOREGROUNDCOLOR] = "Foreground Color";
jaroslav@0
   600
		list[FONT] = "Font";
jaroslav@0
   601
		list[TITLE] = "Title";
jaroslav@0
   602
		list[MODAL] = "Modal";
jaroslav@0
   603
		list[RESIZABLE] = "Resizable";
jaroslav@0
   604
		list[SHOWFORM] = "ShowForm";
jaroslav@0
   605
		list[MOVEFORM] = "MoveForm";		// whether to set position from x,y properties
jaroslav@0
   606
		list[RESIZEFORM] = "ResizeForm";
jaroslav@0
   607
		list[CLASSPUBLIC] = "ClassPublic";
jaroslav@0
   608
		list[IMPLEMENTS] = "Implements";
jaroslav@0
   609
		list[IMPORTS] = "Imports";
jaroslav@0
   610
		
jaroslav@0
   611
		return list;
jaroslav@0
   612
	}
jaroslav@0
   613
jaroslav@0
   614
	public Object getProperty(int index) throws XFPropertyIndexOutOfBoundsException {
jaroslav@0
   615
		switch (index) {
jaroslav@0
   616
			case GRID: return grid;
jaroslav@0
   617
			case BACKGROUNDCOLOR: return getBackground();
jaroslav@0
   618
			case FOREGROUNDCOLOR: return getForeground();
jaroslav@0
   619
			case FONT: return getFont();
jaroslav@0
   620
			case TITLE: return getTitle();
jaroslav@0
   621
			case MODAL: return new Boolean(pIsModal);
jaroslav@0
   622
			case RESIZABLE: return new Boolean(pIsResizable);
jaroslav@0
   623
			case SHOWFORM: return new Boolean(pShowForm);
jaroslav@0
   624
			case MOVEFORM: return new Boolean(pMoveForm);
jaroslav@0
   625
			case RESIZEFORM: return new Boolean(pResizeForm);
jaroslav@0
   626
			case CLASSPUBLIC: return new Boolean(inheritance.isPublic);
jaroslav@0
   627
			case IMPLEMENTS: return inheritance.pImplements;
jaroslav@0
   628
			case IMPORTS: return pImports;
jaroslav@0
   629
			default: throw new XFPropertyIndexOutOfBoundsException();
jaroslav@0
   630
		}
jaroslav@0
   631
	}
jaroslav@0
   632
jaroslav@0
   633
	public String getPropertyString(int index) throws
jaroslav@0
   634
	XFPropertyIndexOutOfBoundsException {
jaroslav@0
   635
		switch (index) {
jaroslav@0
   636
			case GRID: return XGridPropertyType.viewString(getProperty(index));
jaroslav@0
   637
			case BACKGROUNDCOLOR:
jaroslav@0
   638
			case FOREGROUNDCOLOR: return XColorPropertyType.viewString(getProperty(index));
jaroslav@0
   639
			case FONT: return XFontPropertyType.viewString(getProperty(index));
jaroslav@0
   640
			case TITLE: return getTitle();
jaroslav@0
   641
			case MODAL:
jaroslav@0
   642
			case RESIZABLE:
jaroslav@0
   643
			case SHOWFORM:
jaroslav@0
   644
			case MOVEFORM:
jaroslav@0
   645
			case RESIZEFORM:
jaroslav@0
   646
			case CLASSPUBLIC: return XBooleanPropertyType.viewString(getProperty(index));
jaroslav@0
   647
			case IMPLEMENTS:
jaroslav@0
   648
			case IMPORTS: return XStringArrayPropertyType.viewString(getProperty(index));
jaroslav@0
   649
jaroslav@0
   650
			default: throw new XFPropertyIndexOutOfBoundsException();
jaroslav@0
   651
		}
jaroslav@0
   652
	}
jaroslav@0
   653
jaroslav@0
   654
	public int getPropertyViewerType(int index) throws
jaroslav@0
   655
	XFPropertyIndexOutOfBoundsException {
jaroslav@0
   656
		switch (index) {
jaroslav@0
   657
			case TITLE: return XFDesignConstants.PVT_INPUT_STRING;
jaroslav@0
   658
jaroslav@0
   659
			case MODAL:
jaroslav@0
   660
			case RESIZABLE:
jaroslav@0
   661
			case SHOWFORM:
jaroslav@0
   662
			case MOVEFORM:
jaroslav@0
   663
			case RESIZEFORM:
jaroslav@0
   664
			case CLASSPUBLIC: return XFDesignConstants.PVT_CHECK; 
jaroslav@0
   665
jaroslav@0
   666
			case GRID:
jaroslav@0
   667
			case BACKGROUNDCOLOR:
jaroslav@0
   668
			case FOREGROUNDCOLOR:
jaroslav@0
   669
			case FONT:
jaroslav@0
   670
			case IMPLEMENTS:
jaroslav@0
   671
			case IMPORTS: return XFDesignConstants.PVT_SPECIAL; 
jaroslav@0
   672
jaroslav@0
   673
			default: throw new XFPropertyIndexOutOfBoundsException();
jaroslav@0
   674
		}
jaroslav@0
   675
	}
jaroslav@0
   676
jaroslav@0
   677
	public String[] getPropertyValueNames(int index) throws
jaroslav@0
   678
	XFPropertyIndexOutOfBoundsException {
jaroslav@0
   679
		switch (index) {
jaroslav@0
   680
			default: throw new XFPropertyIndexOutOfBoundsException();
jaroslav@0
   681
		}
jaroslav@0
   682
	}
jaroslav@0
   683
	
jaroslav@0
   684
	public Object[] getPropertyValueValues(int index) throws
jaroslav@0
   685
	XFPropertyIndexOutOfBoundsException {
jaroslav@0
   686
		switch (index) {
jaroslav@0
   687
			default: throw new XFPropertyIndexOutOfBoundsException();
jaroslav@0
   688
		}
jaroslav@0
   689
	}
jaroslav@0
   690
jaroslav@0
   691
	private void updateSubComponents() {
jaroslav@0
   692
		Component comps1[] = getComponents();
jaroslav@0
   693
		for (int i=0; i<comps1.length; i++)
jaroslav@0
   694
			((XelfiVisualComponent)(comps1[i])).parentUpdate();
jaroslav@0
   695
		invalidate(); validate(); 
jaroslav@0
   696
		hide(); show();
jaroslav@0
   697
	}
jaroslav@0
   698
jaroslav@0
   699
	public int setProperty(int index, Object value) throws
jaroslav@0
   700
	XFPropertyIndexOutOfBoundsException,
jaroslav@0
   701
	XFPropertyBadValueTypeException
jaroslav@0
   702
	{
jaroslav@0
   703
		boolean bval;
jaroslav@0
   704
		int ival;
jaroslav@0
   705
jaroslav@0
   706
		int ret = XFDesignConstants.RSP_OK;
jaroslav@0
   707
		int regen = 0;
jaroslav@0
   708
		Block regenB = null;
jaroslav@0
   709
		
jaroslav@0
   710
		switch (index) {
jaroslav@0
   711
			case GRID: if (!(value instanceof GridInfo)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   712
					grid = (GridInfo) value;
jaroslav@0
   713
					grid.invalidate();
jaroslav@0
   714
					repaint();
jaroslav@0
   715
					break;
jaroslav@0
   716
			case BACKGROUNDCOLOR: if (!(value instanceof Color)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   717
					setBackground((Color)value);
jaroslav@0
   718
					backgroundChanged = true;
jaroslav@0
   719
					ret = ret | XFDesignConstants.RSP_REPAINT_COMP;
jaroslav@0
   720
					updateSubComponents();
jaroslav@0
   721
					regen = XFDesignConstants.FGEN_FORM_SETPROPS;
jaroslav@0
   722
					regenB = formSetpropsB;
jaroslav@0
   723
					break;
jaroslav@0
   724
			case FOREGROUNDCOLOR: if (!(value instanceof Color)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   725
					setForeground((Color)value);
jaroslav@0
   726
					foregroundChanged = true;
jaroslav@0
   727
					ret = ret | XFDesignConstants.RSP_REPAINT_COMP;
jaroslav@0
   728
					updateSubComponents();
jaroslav@0
   729
					regen = XFDesignConstants.FGEN_FORM_SETPROPS;
jaroslav@0
   730
					regenB = formSetpropsB;
jaroslav@0
   731
					break;
jaroslav@0
   732
			case FONT: if (!(value instanceof Font)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   733
					setFont((Font)value);
jaroslav@0
   734
					fontChanged = true;
jaroslav@0
   735
					ret = ret | XFDesignConstants.RSP_REPAINT_COMP;
jaroslav@0
   736
					updateSubComponents();
jaroslav@0
   737
					regen = XFDesignConstants.FGEN_FORM_SETPROPS;
jaroslav@0
   738
					regenB = formSetpropsB;
jaroslav@0
   739
					break;
jaroslav@0
   740
			case TITLE: if (!(value instanceof String)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   741
					setTitle((String)value);
jaroslav@0
   742
					regen = XFDesignConstants.FGEN_FORM_SETPROPS;
jaroslav@0
   743
					regenB = formSetpropsB;
jaroslav@0
   744
					break;
jaroslav@0
   745
			case MODAL: if (!(value instanceof Boolean)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   746
					bval = ((Boolean)value).booleanValue();
jaroslav@0
   747
					if (pIsModal != bval) {
jaroslav@0
   748
						pIsModal = bval;
jaroslav@0
   749
						inheritance.setDialogModal(pIsModal);
jaroslav@0
   750
						regen = XFDesignConstants.FGEN_CONSTRUCTOR_BEGIN;
jaroslav@0
   751
						regenB = constructorBeginB;
jaroslav@0
   752
					}
jaroslav@0
   753
					break;					
jaroslav@0
   754
			case RESIZABLE: if (!(value instanceof Boolean)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   755
					bval = ((Boolean)value).booleanValue();
jaroslav@0
   756
					if (pIsResizable != bval) {
jaroslav@0
   757
						pIsResizable = bval;
jaroslav@0
   758
						regen = XFDesignConstants.FGEN_FORM_SETPROPS;
jaroslav@0
   759
						regenB = formSetpropsB;
jaroslav@0
   760
					}
jaroslav@0
   761
					break;					
jaroslav@0
   762
			case SHOWFORM: if (!(value instanceof Boolean)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   763
					bval = ((Boolean)value).booleanValue();
jaroslav@0
   764
					if (pShowForm != bval) {
jaroslav@0
   765
						pShowForm = bval;
jaroslav@0
   766
						regen = XFDesignConstants.FGEN_FORM_RESIZE;
jaroslav@0
   767
						regenB = formResizeB;
jaroslav@0
   768
					}
jaroslav@0
   769
					break;					
jaroslav@0
   770
			case MOVEFORM: if (!(value instanceof Boolean)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   771
					bval = ((Boolean)value).booleanValue();
jaroslav@0
   772
					if (pMoveForm != bval) {
jaroslav@0
   773
						pMoveForm = bval;
jaroslav@0
   774
						regen = XFDesignConstants.FGEN_FORM_RESIZE;
jaroslav@0
   775
						regenB = formResizeB;
jaroslav@0
   776
					}
jaroslav@0
   777
					break;					
jaroslav@0
   778
			case RESIZEFORM: if (!(value instanceof Boolean)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   779
					bval = ((Boolean)value).booleanValue();
jaroslav@0
   780
					if (pResizeForm != bval) {
jaroslav@0
   781
						pResizeForm = bval;
jaroslav@0
   782
						regen = XFDesignConstants.FGEN_FORM_RESIZE;
jaroslav@0
   783
						regenB = formResizeB;
jaroslav@0
   784
					}
jaroslav@0
   785
					break;					
jaroslav@0
   786
			case CLASSPUBLIC: if (!(value instanceof Boolean)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   787
					bval = ((Boolean)value).booleanValue();
jaroslav@0
   788
					if (inheritance.isPublic != bval) {
jaroslav@0
   789
						inheritance.isPublic = bval;
jaroslav@0
   790
						regen = XFDesignConstants.FGEN_CLASS_BEGIN;
jaroslav@0
   791
						regenB = classBeginB;
jaroslav@0
   792
					}
jaroslav@0
   793
					break;					
jaroslav@0
   794
			case IMPLEMENTS: if (!(value instanceof String[])) throw new XFPropertyBadValueTypeException();
jaroslav@0
   795
					inheritance.pImplements = XStringArrayPropertyType.removeEmptyStrings((String[])value);
jaroslav@0
   796
					regen = XFDesignConstants.FGEN_CLASS_BEGIN;
jaroslav@0
   797
					regenB = classBeginB;
jaroslav@0
   798
					break;
jaroslav@0
   799
			case IMPORTS: if (!(value instanceof String[])) throw new XFPropertyBadValueTypeException();
jaroslav@0
   800
					impsManager.releaseImports(pImports);
jaroslav@0
   801
					pImports = (String[])value;
jaroslav@0
   802
					impsManager.assignImports(pImports);
jaroslav@0
   803
					regen = XFDesignConstants.FGEN_IMPORTS;
jaroslav@0
   804
					regenB = importsB;
jaroslav@0
   805
					break;
jaroslav@0
   806
			default: throw new XFPropertyIndexOutOfBoundsException();
jaroslav@0
   807
		}
jaroslav@0
   808
		if (regenB != null)
jaroslav@0
   809
			try {
jaroslav@0
   810
				regenB.set(generateCode(regen), new GuardedStamp());
jaroslav@0
   811
			} catch (NotAllowedException e) {
jaroslav@0
   812
				throw new InternalError("Block generation error");
jaroslav@0
   813
			}
jaroslav@0
   814
		return ret;
jaroslav@0
   815
	}
jaroslav@0
   816
jaroslav@0
   817
	public void specialPropertyInput(Frame parent, int index) throws
jaroslav@0
   818
	XFPropertyIndexOutOfBoundsException,
jaroslav@0
   819
	XFPropertyNoSpecialInputException {
jaroslav@0
   820
		if ((index < 0) || (index >= propertyCount)) throw new XFPropertyIndexOutOfBoundsException();
jaroslav@0
   821
jaroslav@0
   822
		switch (index) { 
jaroslav@0
   823
			case GRID: XGridPropertyType.invokeSpecialInput(parent, this, index);
jaroslav@0
   824
						break;
jaroslav@0
   825
			case BACKGROUNDCOLOR:
jaroslav@0
   826
			case FOREGROUNDCOLOR: XColorPropertyType.invokeSpecialInput(parent, this, index);
jaroslav@0
   827
						break;
jaroslav@0
   828
			case FONT: XFontPropertyType.invokeSpecialInput(parent, this, index);
jaroslav@0
   829
						break;
jaroslav@0
   830
			case IMPLEMENTS: 
jaroslav@0
   831
			case IMPORTS: XStringArrayPropertyType.invokeSpecialInput(parent, this, index);
jaroslav@0
   832
						break;
jaroslav@0
   833
			default: throw new XFPropertyNoSpecialInputException();
jaroslav@0
   834
		}
jaroslav@0
   835
	}
jaroslav@0
   836
jaroslav@0
   837
	public int getEventCount() {
jaroslav@0
   838
		return eventCount;
jaroslav@0
   839
	}
jaroslav@0
   840
jaroslav@0
   841
	public String[] getEventNames() {
jaroslav@0
   842
		String list[] = new String[eventCount];
jaroslav@0
   843
		list[0] = new String("OnGotFocus"); 
jaroslav@0
   844
		list[1] = new String("OnLostFocus"); 
jaroslav@0
   845
		list[2] = new String("OnKeyAction"); 
jaroslav@0
   846
		list[3] = new String("OnKeyActionRelease"); 
jaroslav@0
   847
		list[4] = new String("OnKeyPress"); 
jaroslav@0
   848
		list[5] = new String("OnKeyRelease"); 
jaroslav@0
   849
		list[6] = new String("OnMouseDown"); 
jaroslav@0
   850
		list[7] = new String("OnMouseUp"); 
jaroslav@0
   851
		list[8] = new String("OnMouseMove"); 
jaroslav@0
   852
		list[9] = new String("OnMouseDrag"); 
jaroslav@0
   853
		list[10] = new String("OnMouseEnter"); 
jaroslav@0
   854
		list[11] = new String("OnMouseExit"); 
jaroslav@0
   855
		return list;
jaroslav@0
   856
	}
jaroslav@0
   857
jaroslav@0
   858
	public String getEvent(int index) throws
jaroslav@0
   859
	XFPropertyIndexOutOfBoundsException {
jaroslav@0
   860
		if ((index>=0) && (index<eventCount)) {
jaroslav@0
   861
			if (events[index] == null)
jaroslav@0
   862
				return null;
jaroslav@0
   863
			else
jaroslav@0
   864
				return new String(events[index]); 
jaroslav@0
   865
		}
jaroslav@0
   866
		else throw new XFPropertyIndexOutOfBoundsException();
jaroslav@0
   867
	}
jaroslav@0
   868
jaroslav@0
   869
	public void setEvent(int index, String value) throws
jaroslav@0
   870
	XFPropertyIndexOutOfBoundsException {
jaroslav@0
   871
		if ((index>=0) && (index<eventCount))
jaroslav@0
   872
			events[index] = value;
jaroslav@0
   873
		else throw new XFPropertyIndexOutOfBoundsException();
jaroslav@0
   874
	}
jaroslav@0
   875
jaroslav@0
   876
	public String generateEventCondition(int index) throws 
jaroslav@0
   877
	XFPropertyIndexOutOfBoundsException {
jaroslav@0
   878
		String evt = XFDesignOptions.eventVarName;
jaroslav@0
   879
		switch (index) { 
jaroslav@0
   880
			case 0: return evt +".id == Event.GOT_FOCUS && "+evt+".target == this";
jaroslav@0
   881
			case 1: return evt +".id == Event.LOST_FOCUS && "+evt+".target == this";
jaroslav@0
   882
			case 2: return evt +".id == Event.KEY_ACTION && "+evt+".target == this";
jaroslav@0
   883
			case 3: return evt +".id == Event.KEY_ACTION_RELEASE && "+evt+".target == this";
jaroslav@0
   884
			case 4: return evt +".id == Event.KEY_PRESS && "+evt+".target == this";
jaroslav@0
   885
			case 5: return evt +".id == Event.KEY_RELEASE && "+evt+".target == this";
jaroslav@0
   886
			case 6: return evt +".id == Event.MOUSE_DOWN && "+evt+".target == this";
jaroslav@0
   887
			case 7: return evt +".id == Event.MOUSE_UP && "+evt+".target == this";
jaroslav@0
   888
			case 8: return evt +".id == Event.MOUSE_MOVE && "+evt+".target == this";
jaroslav@0
   889
			case 9: return evt +".id == Event.MOUSE_DRAG && "+evt+".target == this";
jaroslav@0
   890
			case 10: return evt +".id == Event.MOUSE_ENTER && "+evt+".target == this";
jaroslav@0
   891
			case 11: return evt +".id == Event.MOUSE_EXIT && "+evt+".target == this";
jaroslav@0
   892
			default: throw new XFPropertyIndexOutOfBoundsException();
jaroslav@0
   893
		}
jaroslav@0
   894
	}
jaroslav@0
   895
jaroslav@0
   896
	public Image getIcon() { return null; }
jaroslav@0
   897
jaroslav@0
   898
	public String getClassName() { return "Dialog"; }
jaroslav@0
   899
jaroslav@0
   900
	public XelfiDesignLayout getDesignLayout() { return xLayout; }
jaroslav@0
   901
jaroslav@0
   902
	public int setDesignLayout(XelfiDesignLayout aXLayout) { 
jaroslav@0
   903
		boolean oldAllows = xLayout.allowsDragging();
jaroslav@0
   904
		Component comps[] = getComponents();
jaroslav@0
   905
		for (int i=0; i<comps.length; i++)
jaroslav@0
   906
			remove(comps[i]);
jaroslav@0
   907
		xLayout = aXLayout;
jaroslav@0
   908
		xLayout.setParent(this);
jaroslav@0
   909
		setLayout((LayoutManager)xLayout);
jaroslav@0
   910
		for (int i=0; i<comps.length; i++) {
jaroslav@0
   911
			// this is here because some layouts can hide some components - we must show them again
jaroslav@0
   912
			if (!comps[i].isVisible()) comps[i].show();  
jaroslav@0
   913
			xLayout.layoutAdd(this, (XelfiVisualComponent)comps[i]);
jaroslav@0
   914
		}
jaroslav@0
   915
jaroslav@0
   916
		if (XFDesignOptions.showGrid && oldAllows != xLayout.allowsDragging()) {  // if grid needs to be rapainted
jaroslav@0
   917
			hide(); show();
jaroslav@0
   918
		}
jaroslav@0
   919
		else 
jaroslav@0
   920
			validate();
jaroslav@0
   921
jaroslav@0
   922
		formDocument.redrawLock();
jaroslav@0
   923
		regenerateCode(this, XFDesignConstants.FGEN_FORM_LAYOUT | XFDesignConstants.FGEN_FORM_RESIZE);
jaroslav@0
   924
		regenerateComponents();
jaroslav@0
   925
		formDocument.redrawUnlock();
jaroslav@0
   926
		return XFDesignConstants.RSP_OK;
jaroslav@0
   927
	}
jaroslav@0
   928
jaroslav@0
   929
	public Vector getSubComponents() {
jaroslav@0
   930
		int count = countComponents();
jaroslav@0
   931
		Vector vect = new Vector(count);
jaroslav@0
   932
		for (int i=0; i<count; i++) {
jaroslav@0
   933
			Component comp = getComponent(i); 
jaroslav@0
   934
			vect.addElement(comp);
jaroslav@0
   935
			if (comp instanceof XelfiVisualContainer) {
jaroslav@0
   936
				Vector subVect = ((XelfiVisualContainer)comp).getSubComponents();
jaroslav@0
   937
				for (int j=0; j<subVect.size(); j++)
jaroslav@0
   938
					vect.addElement(subVect.elementAt(j));
jaroslav@0
   939
			}
jaroslav@0
   940
		}
jaroslav@0
   941
		return vect;
jaroslav@0
   942
	}
jaroslav@0
   943
jaroslav@0
   944
	public void setSelection(int aSelection) {
jaroslav@0
   945
	}
jaroslav@0
   946
jaroslav@0
   947
	public int getSelection() {
jaroslav@0
   948
		return XFDesignConstants.SEL_UNSELECT;
jaroslav@0
   949
	}
jaroslav@0
   950
jaroslav@0
   951
	////////////////////////////////////
jaroslav@0
   952
	// XelfiDesignForm implementation //
jaroslav@0
   953
	////////////////////////////////////
jaroslav@0
   954
jaroslav@0
   955
	public Source getSource() {
jaroslav@0
   956
		return formSource;
jaroslav@0
   957
	}
jaroslav@0
   958
	
jaroslav@0
   959
	public String getPackage() {
jaroslav@0
   960
		return packageName;
jaroslav@0
   961
	}
jaroslav@0
   962
jaroslav@0
   963
	public void setPackage(String aPackageName) {
jaroslav@0
   964
		packageName = aPackageName;
jaroslav@0
   965
		try {
jaroslav@0
   966
			if (packageName == null || "".equalsIgnoreCase(packageName))
jaroslav@0
   967
				packageB.set("", new GuardedStamp());
jaroslav@0
   968
			else
jaroslav@0
   969
				packageB.set("package "+packageName+";\n\n", new GuardedStamp());
jaroslav@0
   970
		} catch (NotAllowedException e) {
jaroslav@0
   971
			throw new InternalError("Block generation error");
jaroslav@0
   972
		}
jaroslav@0
   973
	}
jaroslav@0
   974
jaroslav@0
   975
	public Vector getSelectedComponents() {
jaroslav@0
   976
		return selectedComps;
jaroslav@0
   977
	}
jaroslav@0
   978
jaroslav@0
   979
	public void setSelectedComponents(Vector comps) {
jaroslav@0
   980
		deselectAll();
jaroslav@0
   981
		if (comps == null) {
jaroslav@0
   982
			select(this);
jaroslav@0
   983
			return;
jaroslav@0
   984
		}
jaroslav@0
   985
		int count = comps.size();
jaroslav@0
   986
		for (int i=0; i<count; i++)
jaroslav@0
   987
			select((XelfiDesignComponent)comps.elementAt(i));
jaroslav@0
   988
	}
jaroslav@0
   989
jaroslav@0
   990
	public Vector getAllComponents() {
jaroslav@0
   991
		Vector comps = getSubComponents();
jaroslav@0
   992
		comps.insertElementAt(this,0);
jaroslav@0
   993
		// also add all the non-visual components
jaroslav@0
   994
		for (int i=0; i<nonVisualComps.size(); i++)
jaroslav@0
   995
			comps.addElement(nonVisualComps.elementAt(i));
jaroslav@0
   996
		return comps;
jaroslav@0
   997
	}
jaroslav@0
   998
jaroslav@0
   999
	public void assignEvent(XelfiDesignComponent xdc, int index, String evName) {
jaroslav@0
  1000
		Block b = evPool.assignEvent(xdc, index, evName);
jaroslav@0
  1001
		if (b != null) {
jaroslav@0
  1002
			try {
jaroslav@0
  1003
				userBlocks.add(b);
jaroslav@0
  1004
			} catch (xelfi.util.DuplicateException e) {
jaroslav@0
  1005
				// it is nothing really critical
jaroslav@0
  1006
			}
jaroslav@0
  1007
		}
jaroslav@0
  1008
	}
jaroslav@0
  1009
jaroslav@0
  1010
	public void focusEvent(String evName) {
jaroslav@0
  1011
		Block b = evPool.getEventUserBlock(evName);
jaroslav@0
  1012
		if (b != null) TopLevel.showEditor(formSource, b.getBegin(), true);
jaroslav@0
  1013
	}
jaroslav@0
  1014
	
jaroslav@0
  1015
	public void renameEvent(String oldName, String newName) {
jaroslav@0
  1016
		evPool.renameEvent(oldName, newName);
jaroslav@0
  1017
	}
jaroslav@0
  1018
jaroslav@0
  1019
	public void releaseEvent(XelfiDesignComponent xdc, int index) {
jaroslav@0
  1020
		evPool.releaseEvent(xdc, index);
jaroslav@0
  1021
	}
jaroslav@0
  1022
jaroslav@0
  1023
	public String[] getDefinedEvents() {
jaroslav@0
  1024
		return evPool.getDefinedEvents();
jaroslav@0
  1025
	}
jaroslav@0
  1026
jaroslav@0
  1027
	public boolean setComponentName(XelfiDesignComponent comp, String newName) {
jaroslav@0
  1028
		if (newName == null || "".equalsIgnoreCase(newName)) return false;		
jaroslav@0
  1029
		if (newName.compareTo(comp.getName()) == 0) return true;
jaroslav@0
  1030
		if (nameManager.nameExists(newName)) return false;
jaroslav@0
  1031
		if (!XFDesignUtils.isJavaIdf(newName)) return false;
jaroslav@0
  1032
		if (comp != this && comp instanceof XelfiVisualComponent) {
jaroslav@0
  1033
			XelfiVisualContainer xvcont = (XelfiVisualContainer)((Component)comp).getParent();
jaroslav@0
  1034
			XelfiDesignLayout xdl = xvcont.getDesignLayout();
jaroslav@0
  1035
			xdl.renameComponent((XelfiVisualComponent)comp, newName);
jaroslav@0
  1036
		}
jaroslav@0
  1037
		nameManager.releaseName(comp); // free the name for future use
jaroslav@6
  1038
		comp.setDesignName(newName);
jaroslav@0
  1039
		nameManager.allocName(comp);
jaroslav@0
  1040
		evPool.componentRenamed(comp);
jaroslav@0
  1041
		regenerateCode(comp, XFDesignConstants.GEN_ALL);
jaroslav@0
  1042
		return true;
jaroslav@0
  1043
	}
jaroslav@0
  1044
jaroslav@0
  1045
jaroslav@0
  1046
///////////////////////
jaroslav@0
  1047
// Action Controller //
jaroslav@0
  1048
///////////////////////
jaroslav@0
  1049
	
jaroslav@0
  1050
	public void allowInsert (Position p, Object info) 
jaroslav@0
  1051
		throws NotAllowedException 
jaroslav@0
  1052
	{
jaroslav@0
  1053
		if (!(info instanceof GuardedStamp))
jaroslav@0
  1054
			try {
jaroslav@0
  1055
				userBlocks.find(p, Block.INSIDE | Block.END);
jaroslav@0
  1056
			} catch (java.util.NoSuchElementException e) {
jaroslav@0
  1057
				throw new NotAllowedException();
jaroslav@0
  1058
			}
jaroslav@0
  1059
	}
jaroslav@0
  1060
  
jaroslav@0
  1061
	public void allowDelete (Position p, Object info) 
jaroslav@0
  1062
		throws NotAllowedException
jaroslav@0
  1063
	{
jaroslav@0
  1064
		if (!(info instanceof GuardedStamp))
jaroslav@0
  1065
			try {
jaroslav@0
  1066
				userBlocks.find(p, Block.BEGIN | Block.INSIDE);
jaroslav@0
  1067
			} catch (java.util.NoSuchElementException e) {
jaroslav@0
  1068
				throw new NotAllowedException();
jaroslav@0
  1069
			}
jaroslav@0
  1070
	}
jaroslav@0
  1071
jaroslav@0
  1072
	public void allowMultiDelete (Position from, Position to, Object info)
jaroslav@0
  1073
		throws NotAllowedException
jaroslav@0
  1074
	{
jaroslav@0
  1075
		if (!(info instanceof GuardedStamp)) {
jaroslav@0
  1076
			Block b1 = null;
jaroslav@0
  1077
			Block b2 = null;
jaroslav@0
  1078
			try {
jaroslav@0
  1079
				b1 = userBlocks.find(from, Block.BEGIN | Block.INSIDE);
jaroslav@0
  1080
				b2 = userBlocks.find(to, Block.BEGIN | Block.INSIDE);
jaroslav@0
  1081
			} catch (java.util.NoSuchElementException e) {
jaroslav@0
  1082
				throw new NotAllowedException();
jaroslav@0
  1083
			}
jaroslav@0
  1084
			if (b1 != b2) throw new NotAllowedException();
jaroslav@0
  1085
		}
jaroslav@0
  1086
	}
jaroslav@0
  1087
  
jaroslav@0
  1088
	public void notifyInsert (Position n, Position p) { 
jaroslav@0
  1089
	}
jaroslav@0
  1090
jaroslav@0
  1091
	public void notifyDelete (Position p, String s) {
jaroslav@0
  1092
	}
jaroslav@0
  1093
  
jaroslav@0
  1094
	public boolean handleEvent (Position p, Event e) {
jaroslav@0
  1095
		if (e instanceof CallbackRequestEvent) {
jaroslav@0
  1096
			e.arg = backCallback;
jaroslav@0
  1097
			return true;
jaroslav@0
  1098
		}
jaroslav@0
  1099
		return false; 
jaroslav@0
  1100
	}
jaroslav@0
  1101
jaroslav@0
  1102
	//////////////
jaroslav@0
  1103
	// template //
jaroslav@0
  1104
	//////////////
jaroslav@0
  1105
jaroslav@0
  1106
	public String getTemplateName() {
jaroslav@0
  1107
		return templateName;
jaroslav@0
  1108
	}
jaroslav@0
  1109
	
jaroslav@0
  1110
	public void setTemplateName(String aTemplateName) {
jaroslav@0
  1111
		templateName = aTemplateName;
jaroslav@0
  1112
	}
jaroslav@0
  1113
jaroslav@0
  1114
	/////////////////
jaroslav@0
  1115
	// persistence //
jaroslav@0
  1116
	/////////////////
jaroslav@0
  1117
jaroslav@0
  1118
	public void loadFromStream(DataInput stream) throws
jaroslav@0
  1119
	IOException {
jaroslav@0
  1120
		boolean dontRead[] = new boolean[propertyCount];
jaroslav@0
  1121
jaroslav@0
  1122
		int x=0; int y=0;
jaroslav@0
  1123
		x = stream.readInt(); y = stream.readInt();
jaroslav@0
  1124
		setPosition(x,y);
jaroslav@0
  1125
jaroslav@0
  1126
		int w=0; int h=0;
jaroslav@0
  1127
		w = stream.readInt(); h = stream.readInt();
jaroslav@6
  1128
		setDesignSize(w,h);
jaroslav@0
  1129
jaroslav@0
  1130
		if ("FormProperties".equalsIgnoreCase(stream.readUTF())) {
jaroslav@0
  1131
			try {
jaroslav@0
  1132
				for (int i=0; i<propertyCount; i++) dontRead[i] = stream.readBoolean();
jaroslav@0
  1133
				
jaroslav@0
  1134
				if (!dontRead[GRID]) setProperty(GRID,XGridPropertyType.loadFromStream(stream));
jaroslav@0
  1135
				if (!dontRead[BACKGROUNDCOLOR]) setProperty(BACKGROUNDCOLOR,XColorPropertyType.loadFromStream(stream));
jaroslav@0
  1136
				if (!dontRead[FOREGROUNDCOLOR]) setProperty(FOREGROUNDCOLOR,XColorPropertyType.loadFromStream(stream));
jaroslav@0
  1137
				if (!dontRead[FONT]) setProperty(FONT,XFontPropertyType.loadFromStream(stream));
jaroslav@0
  1138
				if (!dontRead[TITLE]) setProperty(TITLE,XStringPropertyType.loadFromStream(stream));
jaroslav@0
  1139
				if (!dontRead[MODAL]) setProperty(MODAL,XBooleanPropertyType.loadFromStream(stream));
jaroslav@0
  1140
				if (!dontRead[RESIZABLE]) setProperty(RESIZABLE,XBooleanPropertyType.loadFromStream(stream));
jaroslav@0
  1141
				if (!dontRead[SHOWFORM]) setProperty(SHOWFORM,XBooleanPropertyType.loadFromStream(stream));
jaroslav@0
  1142
				if (!dontRead[MOVEFORM]) setProperty(MOVEFORM,XBooleanPropertyType.loadFromStream(stream));
jaroslav@0
  1143
				if (!dontRead[RESIZEFORM]) setProperty(RESIZEFORM,XBooleanPropertyType.loadFromStream(stream));
jaroslav@0
  1144
				if (!dontRead[CLASSPUBLIC]) setProperty(CLASSPUBLIC,XBooleanPropertyType.loadFromStream(stream));
jaroslav@0
  1145
				if (!dontRead[IMPLEMENTS]) setProperty(IMPLEMENTS,XStringArrayPropertyType.loadFromStream(stream));
jaroslav@0
  1146
				if (!dontRead[IMPORTS]) setProperty(IMPORTS,XStringArrayPropertyType.loadFromStream(stream));
jaroslav@0
  1147
			} catch (XFPropertyIndexOutOfBoundsException e) {
jaroslav@0
  1148
			} catch (XFPropertyBadValueTypeException e) {
jaroslav@0
  1149
			}
jaroslav@0
  1150
		}
jaroslav@0
  1151
		else throw (new IOException());
jaroslav@0
  1152
		// [PENDING - else set error flag and try to recover]
jaroslav@0
  1153
		
jaroslav@0
  1154
		if ("FormEventPool".equalsIgnoreCase(stream.readUTF())) {
jaroslav@0
  1155
			evPool.loadFromStream(stream);
jaroslav@0
  1156
		}
jaroslav@0
  1157
		else throw (new IOException());
jaroslav@0
  1158
		
jaroslav@0
  1159
		// we must set all the events user blocks as being user blocks
jaroslav@0
  1160
		String[] evNames = evPool.getDefinedEvents();
jaroslav@0
  1161
		for (int i=0; i< evNames.length; i++)
jaroslav@0
  1162
			try {
jaroslav@0
  1163
				userBlocks.add(evPool.getEventUserBlock(evNames[i]));
jaroslav@0
  1164
			} catch (xelfi.util.DuplicateException e) {
jaroslav@0
  1165
				// it is nothing really critical
jaroslav@0
  1166
			}
jaroslav@0
  1167
		
jaroslav@0
  1168
		if ("FormEvents".equalsIgnoreCase(stream.readUTF())) {
jaroslav@0
  1169
			for (int i = 0; i < eventCount; i++) {
jaroslav@0
  1170
				if (stream.readBoolean())
jaroslav@0
  1171
					assignEvent(this, i, stream.readUTF());
jaroslav@0
  1172
			}
jaroslav@0
  1173
		}
jaroslav@0
  1174
		else throw (new IOException());
jaroslav@0
  1175
		
jaroslav@0
  1176
		if ("FormLayout".equalsIgnoreCase(stream.readUTF())) {
jaroslav@0
  1177
			String layClass = stream.readUTF();
jaroslav@0
  1178
			try {
jaroslav@0
  1179
				Class lay = Class.forName(layClass);
jaroslav@0
  1180
				XelfiDesignLayout xdl = (XelfiDesignLayout)lay.newInstance();
jaroslav@0
  1181
				xdl.setParent(this);
jaroslav@0
  1182
				xLayout = xdl;
jaroslav@0
  1183
				xdl.loadFromStream(stream);  // this may actually change the xLayout property (e.g. in GridLayout)
jaroslav@0
  1184
				setLayout((LayoutManager)xLayout);
jaroslav@0
  1185
			} catch (IllegalAccessException e) {
jaroslav@0
  1186
				Debug.debugException(e);
jaroslav@0
  1187
			} catch (InstantiationException e) {
jaroslav@0
  1188
				Debug.debugException(e);
jaroslav@0
  1189
			} catch (ClassNotFoundException e) {
jaroslav@0
  1190
				Debug.debugException(e);
jaroslav@0
  1191
			}
jaroslav@0
  1192
		}
jaroslav@0
  1193
		else throw (new IOException());
jaroslav@0
  1194
jaroslav@0
  1195
		if ("FormComponents".equalsIgnoreCase(stream.readUTF())) {
jaroslav@0
  1196
			int compNum = stream.readInt();
jaroslav@0
  1197
			for (int i = 0; i<compNum; i++) {
jaroslav@0
  1198
				String compClass = stream.readUTF();
jaroslav@0
  1199
				try {
jaroslav@0
  1200
					Class comp = Class.forName(compClass);
jaroslav@0
  1201
					XelfiDesignComponent xdc = (XelfiDesignComponent)comp.newInstance();
jaroslav@0
  1202
					xdc.setParentForm(this);
jaroslav@0
  1203
					xdc.loadFromStream(stream);
jaroslav@0
  1204
					getDesignLayout().layoutAdd((Container)this, (XelfiVisualComponent)xdc); 
jaroslav@0
  1205
				} catch (IllegalAccessException e) {
jaroslav@0
  1206
					Debug.debugException(e);
jaroslav@0
  1207
				} catch (InstantiationException e) {
jaroslav@0
  1208
					Debug.debugException(e);
jaroslav@0
  1209
				} catch (ClassNotFoundException e) {
jaroslav@0
  1210
					Debug.debugException(e);
jaroslav@0
  1211
				}
jaroslav@0
  1212
			}
jaroslav@0
  1213
		}
jaroslav@0
  1214
		else throw (new IOException());
jaroslav@0
  1215
jaroslav@0
  1216
		if ("FormNonVisualComponents".equalsIgnoreCase(stream.readUTF())) {
jaroslav@0
  1217
			int compNum = stream.readInt();
jaroslav@0
  1218
			nonVisualComps.ensureCapacity(compNum); 
jaroslav@0
  1219
			for (int i = 0; i<compNum; i++) {
jaroslav@0
  1220
				String compClass = stream.readUTF();
jaroslav@0
  1221
				try {
jaroslav@0
  1222
					Class comp = Class.forName(compClass);
jaroslav@0
  1223
					XelfiDesignComponent xdc = (XelfiDesignComponent)comp.newInstance();
jaroslav@0
  1224
					xdc.loadFromStream(stream);
jaroslav@0
  1225
					nonVisualComps.addElement(xdc);
jaroslav@0
  1226
				} catch (IllegalAccessException e) {
jaroslav@0
  1227
					Debug.debugException(e);
jaroslav@0
  1228
				} catch (InstantiationException e) {
jaroslav@0
  1229
					Debug.debugException(e);
jaroslav@0
  1230
				} catch (ClassNotFoundException e) {
jaroslav@0
  1231
					Debug.debugException(e);
jaroslav@0
  1232
				}
jaroslav@0
  1233
			}
jaroslav@0
  1234
		}
jaroslav@0
  1235
		else throw (new IOException());
jaroslav@0
  1236
jaroslav@0
  1237
		if ("FormUserCode".equalsIgnoreCase(stream.readUTF())) {
jaroslav@0
  1238
			GuardedStamp gs = new GuardedStamp();
jaroslav@0
  1239
			try {
jaroslav@0
  1240
				String importsS = stream.readUTF();
jaroslav@0
  1241
				if (importsS != null) importsUB.set(importsS, gs);
jaroslav@0
  1242
				String constructorS = stream.readUTF();
jaroslav@0
  1243
				if (constructorS != null) constructorUB.set(constructorS, gs);
jaroslav@0
  1244
				String handleBodyS = stream.readUTF();
jaroslav@0
  1245
				if (handleBodyS != null) handleBodyUB.set(handleBodyS, gs);
jaroslav@0
  1246
				String userMethodsS = stream.readUTF();
jaroslav@0
  1247
				if (userMethodsS != null) userMethodsUB.set(userMethodsS, gs);
jaroslav@0
  1248
			} catch (NotAllowedException e) {
jaroslav@0
  1249
				throw new InternalError("Block generation error");
jaroslav@0
  1250
			}
jaroslav@0
  1251
		}
jaroslav@0
  1252
		else throw (new IOException());
jaroslav@0
  1253
	
jaroslav@0
  1254
		// iterate throught components to set-up neededImports and names assignment
jaroslav@0
  1255
		finishLoadSettings(this);
jaroslav@0
  1256
jaroslav@0
  1257
		// non-visuals
jaroslav@0
  1258
		for (int i=0; i< nonVisualComps.size(); i++)
jaroslav@0
  1259
			nameManager.allocName((XelfiDesignComponent)nonVisualComps.elementAt(i));
jaroslav@0
  1260
jaroslav@0
  1261
		regenerateComponents();
jaroslav@0
  1262
		regenerateCode(this, 
jaroslav@0
  1263
			XFDesignConstants.FGEN_FORM_RESIZE |
jaroslav@0
  1264
			XFDesignConstants.FGEN_FORM_LAYOUT |
jaroslav@0
  1265
			XFDesignConstants.FGEN_FORM_SETPROPS);
jaroslav@0
  1266
		validate();
jaroslav@0
  1267
	}
jaroslav@0
  1268
jaroslav@0
  1269
	/**
jaroslav@0
  1270
	*  Assigns needed imports and names of all subcomponents of given container.
jaroslav@0
  1271
	*  Iterates if subcomponent is also a container.
jaroslav@0
  1272
	*  Note: Does not set imports and name of given container, but does for its layout.
jaroslav@0
  1273
	*/
jaroslav@0
  1274
	private void finishLoadSettings(XelfiVisualContainer xvc) {
jaroslav@0
  1275
		impsManager.assignImports(xvc.getDesignLayout().neededImports());
jaroslav@0
  1276
		Vector subs = xvc.getSubComponents();
jaroslav@0
  1277
		int count = subs.size();
jaroslav@0
  1278
		for (int i=0; i<count; i++) {
jaroslav@0
  1279
			XelfiDesignComponent xdc = (XelfiDesignComponent)subs.elementAt(i);
jaroslav@0
  1280
			impsManager.assignImports(xdc.neededImports());
jaroslav@0
  1281
			nameManager.allocName(xdc);
jaroslav@0
  1282
			if (xdc instanceof XelfiVisualContainer)
jaroslav@0
  1283
				finishLoadSettings((XelfiVisualContainer)xdc);
jaroslav@0
  1284
		}
jaroslav@0
  1285
	}
jaroslav@0
  1286
jaroslav@0
  1287
	public void saveToStream(DataOutput stream) throws
jaroslav@0
  1288
	IOException {
jaroslav@0
  1289
		Point pos = getPosition();
jaroslav@0
  1290
		Dimension size = getSize();
jaroslav@0
  1291
		stream.writeInt(pos.x); stream.writeInt(pos.y);
jaroslav@0
  1292
		stream.writeInt(size.width); stream.writeInt(size.height);
jaroslav@0
  1293
jaroslav@0
  1294
		stream.writeUTF("FormProperties");
jaroslav@0
  1295
		for (int i=0; i<propertyCount; i++)
jaroslav@0
  1296
			stream.writeBoolean(propertyDefault(i));
jaroslav@0
  1297
jaroslav@0
  1298
		if (!propertyDefault(GRID)) XGridPropertyType.saveToStream(getProperty(GRID),stream);
jaroslav@0
  1299
		if (!propertyDefault(BACKGROUNDCOLOR)) XColorPropertyType.saveToStream(getProperty(BACKGROUNDCOLOR),stream);
jaroslav@0
  1300
		if (!propertyDefault(FOREGROUNDCOLOR)) XColorPropertyType.saveToStream(getProperty(FOREGROUNDCOLOR),stream);
jaroslav@0
  1301
		if (!propertyDefault(FONT)) XFontPropertyType.saveToStream(getProperty(FONT),stream);
jaroslav@0
  1302
		if (!propertyDefault(TITLE)) XStringPropertyType.saveToStream(getProperty(TITLE),stream);
jaroslav@0
  1303
		if (!propertyDefault(MODAL)) XBooleanPropertyType.saveToStream(getProperty(MODAL),stream);
jaroslav@0
  1304
		if (!propertyDefault(RESIZABLE)) XBooleanPropertyType.saveToStream(getProperty(RESIZABLE),stream);
jaroslav@0
  1305
		if (!propertyDefault(SHOWFORM)) XBooleanPropertyType.saveToStream(getProperty(SHOWFORM),stream);
jaroslav@0
  1306
		if (!propertyDefault(MOVEFORM)) XBooleanPropertyType.saveToStream(getProperty(MOVEFORM),stream);
jaroslav@0
  1307
		if (!propertyDefault(RESIZEFORM)) XBooleanPropertyType.saveToStream(getProperty(RESIZEFORM),stream);
jaroslav@0
  1308
		if (!propertyDefault(CLASSPUBLIC)) XBooleanPropertyType.saveToStream(getProperty(CLASSPUBLIC),stream);
jaroslav@0
  1309
		if (!propertyDefault(IMPLEMENTS)) XStringArrayPropertyType.saveToStream(getProperty(IMPLEMENTS),stream);
jaroslav@0
  1310
		if (!propertyDefault(IMPORTS)) XStringArrayPropertyType.saveToStream(getProperty(IMPORTS),stream);
jaroslav@0
  1311
jaroslav@0
  1312
		stream.writeUTF("FormEventPool");
jaroslav@0
  1313
		evPool.saveToStream(stream);
jaroslav@0
  1314
jaroslav@0
  1315
		stream.writeUTF("FormEvents");
jaroslav@0
  1316
		for (int i = 0; i < eventCount; i++) {
jaroslav@0
  1317
			if ((events[i] != null) && (events[i].length() > 0)) {
jaroslav@0
  1318
				stream.writeBoolean(true);
jaroslav@0
  1319
				stream.writeUTF(events[i]);
jaroslav@0
  1320
			}
jaroslav@0
  1321
			else stream.writeBoolean(false);
jaroslav@0
  1322
		}
jaroslav@0
  1323
jaroslav@0
  1324
		stream.writeUTF("FormLayout");
jaroslav@0
  1325
		XelfiDesignLayout xdl = getDesignLayout();
jaroslav@0
  1326
		stream.writeUTF(xdl.getClass().getName());
jaroslav@0
  1327
		xdl.saveToStream(stream);
jaroslav@0
  1328
jaroslav@0
  1329
		stream.writeUTF("FormComponents");
jaroslav@0
  1330
		int compNum = countComponents();
jaroslav@0
  1331
		stream.writeInt(compNum);
jaroslav@0
  1332
		Component comps[] = getComponents();
jaroslav@0
  1333
		for (int i = 0; i<compNum; i++) {
jaroslav@0
  1334
			stream.writeUTF(comps[i].getClass().getName());
jaroslav@0
  1335
			((XelfiDesignComponent)comps[i]).saveToStream(stream);
jaroslav@0
  1336
		}
jaroslav@0
  1337
jaroslav@0
  1338
		stream.writeUTF("FormNonVisualComponents");
jaroslav@0
  1339
		compNum = nonVisualComps.size();
jaroslav@0
  1340
		stream.writeInt(compNum);
jaroslav@0
  1341
		for (int i = 0; i<compNum; i++) {
jaroslav@0
  1342
			Object o = nonVisualComps.elementAt(i);
jaroslav@0
  1343
			stream.writeUTF(o.getClass().getName());
jaroslav@0
  1344
			((XelfiDesignComponent)o).saveToStream(stream);
jaroslav@0
  1345
		}
jaroslav@0
  1346
jaroslav@0
  1347
		stream.writeUTF("FormUserCode");
jaroslav@0
  1348
		stream.writeUTF(importsUB.toString());
jaroslav@0
  1349
		stream.writeUTF(constructorUB.toString());
jaroslav@0
  1350
		stream.writeUTF(handleBodyUB.toString());
jaroslav@0
  1351
		stream.writeUTF(userMethodsUB.toString());
jaroslav@0
  1352
	}
jaroslav@0
  1353
jaroslav@0
  1354
	//////////////////////////
jaroslav@0
  1355
	// Form code generation //
jaroslav@0
  1356
	//////////////////////////
jaroslav@0
  1357
jaroslav@0
  1358
	public String[] neededImports() {
jaroslav@0
  1359
		String list[] = new String[0];
jaroslav@0
  1360
		return list;
jaroslav@0
  1361
	}
jaroslav@0
  1362
jaroslav@0
  1363
	public void regenerateCode(XelfiDesignComponent xdc, int what) {
jaroslav@0
  1364
		GuardedStamp gs = new GuardedStamp();
jaroslav@0
  1365
		if (xdc == (XelfiDesignComponent)this) {
jaroslav@0
  1366
			formDocument.redrawLock();
jaroslav@0
  1367
			try {
jaroslav@0
  1368
				if ((what & XFDesignConstants.FGEN_FORM_RESIZE) != 0)
jaroslav@0
  1369
					formResizeB.set(generateCode(XFDesignConstants.FGEN_FORM_RESIZE), gs);
jaroslav@0
  1370
				if ((what & XFDesignConstants.FGEN_FORM_LAYOUT) != 0)
jaroslav@0
  1371
					formLayoutB.set(generateCode(XFDesignConstants.FGEN_FORM_LAYOUT), gs);
jaroslav@0
  1372
			} catch (NotAllowedException e) {
jaroslav@0
  1373
				throw new InternalError("Block generation error");
jaroslav@0
  1374
			} finally {
jaroslav@0
  1375
				formDocument.redrawUnlock();
jaroslav@0
  1376
			}
jaroslav@0
  1377
		}
jaroslav@0
  1378
		else {
jaroslav@0
  1379
			formDocument.redrawLock();
jaroslav@0
  1380
			try {
jaroslav@0
  1381
				if ((what & XFDesignConstants.GEN_VARIABLE) != 0)
jaroslav@0
  1382
					variablesB.set(XFGen.generateVariables(this), gs);
jaroslav@0
  1383
				if (((what & XFDesignConstants.GEN_INIT) != 0) ||
jaroslav@0
  1384
				    ((what & XFDesignConstants.GEN_SETPROPS) != 0) ||
jaroslav@0
  1385
				    ((what & XFDesignConstants.GEN_RESHAPE) != 0) ||
jaroslav@0
  1386
				    ((what & XFDesignConstants.GEN_ADD) != 0) ||
jaroslav@0
  1387
				    ((what & XFDesignConstants.GEN_SETLAYOUT) != 0))
jaroslav@0
  1388
					componentsB.set(XFGen.generateComponents(this), gs);
jaroslav@0
  1389
				if ((what & XFDesignConstants.GEN_SETLAYOUT) != 0) 
jaroslav@0
  1390
					importsB.set(generateCode(XFDesignConstants.FGEN_IMPORTS), gs);
jaroslav@0
  1391
			} catch (NotAllowedException e) {
jaroslav@0
  1392
				throw new InternalError("Block generation error");
jaroslav@0
  1393
			} finally {
jaroslav@0
  1394
				formDocument.redrawUnlock();
jaroslav@0
  1395
			}
jaroslav@0
  1396
		}
jaroslav@0
  1397
	}
jaroslav@0
  1398
jaroslav@0
  1399
	/**
jaroslav@0
  1400
	* Though this method is from interface XelfiDesignComponent, it generates different code and
jaroslav@0
  1401
	* uses different constants (form code generation constants).
jaroslav@0
  1402
	*/
jaroslav@0
  1403
jaroslav@0
  1404
	public String generateCode(int what) {
jaroslav@0
  1405
		String gen = "";
jaroslav@0
  1406
		switch (what) {
jaroslav@0
  1407
			case XFDesignConstants.FGEN_SOURCE_BEGIN:
jaroslav@0
  1408
						gen = "/*\n" +
jaroslav@0
  1409
							 " * " + formName + ".java\n" +
jaroslav@0
  1410
							 " * SKELETON GENERATED BY XELFI VISUAL IDE\n" +
jaroslav@0
  1411
							 " */\n\n"; 
jaroslav@0
  1412
						break;
jaroslav@0
  1413
			case XFDesignConstants.FGEN_IMPORTS:
jaroslav@0
  1414
						gen = impsManager.generateImports();
jaroslav@0
  1415
						break;
jaroslav@0
  1416
			case XFDesignConstants.FGEN_CLASS_BEGIN:
jaroslav@0
  1417
						gen = inheritance.generateClassBegin(formName);
jaroslav@0
  1418
						break;
jaroslav@0
  1419
			case XFDesignConstants.FGEN_CONSTRUCTOR_BEGIN:
jaroslav@0
  1420
						gen = inheritance.generateConstructorBegin(formName);
jaroslav@0
  1421
						break;
jaroslav@0
  1422
			case XFDesignConstants.FGEN_FORM_LAYOUT:
jaroslav@0
  1423
						gen = XFDesignUtils.adjustIndent(getDesignLayout().genLayoutInitCode(null,null), 2);
jaroslav@0
  1424
						// [PENDING - variable name]
jaroslav@0
  1425
						break;
jaroslav@0
  1426
			case XFDesignConstants.FGEN_FORM_SETPROPS:
jaroslav@0
  1427
						for (int i = 0; i < propertyCount; i++)
jaroslav@0
  1428
							if (!propertyDefault(i))
jaroslav@0
  1429
								switch(i) {
jaroslav@0
  1430
									case BACKGROUNDCOLOR: gen = gen + XFDesignOptions.indent(2)+
jaroslav@0
  1431
												"setBackground(" + XFDesignUtils.genColor(getBackground()) + ");\n";
jaroslav@0
  1432
											break;
jaroslav@0
  1433
									case FOREGROUNDCOLOR: gen = gen + XFDesignOptions.indent(2)+
jaroslav@0
  1434
												"setForeground(" + XFDesignUtils.genColor(getForeground()) + ");\n";
jaroslav@0
  1435
											break;
jaroslav@0
  1436
									case FONT: gen = gen + XFDesignOptions.indent(2)+
jaroslav@0
  1437
												"setFont(" + XFDesignUtils.genFont(getFont())+");\n";
jaroslav@0
  1438
											break;
jaroslav@0
  1439
									case TITLE: gen = gen + XFDesignOptions.indent(2)+"setTitle(\""+ getTitle() +"\");\n";
jaroslav@0
  1440
											break;
jaroslav@0
  1441
									case RESIZABLE: gen = gen + XFDesignOptions.indent(2)+"setResizable("+ pIsResizable +");\n";
jaroslav@0
  1442
											break;
jaroslav@0
  1443
									}
jaroslav@0
  1444
						break;
jaroslav@0
  1445
			case XFDesignConstants.FGEN_FORM_RESIZE:
jaroslav@0
  1446
						Dimension siz = getSize();
jaroslav@0
  1447
						Point pos = getPosition();
jaroslav@0
  1448
						gen = "";
jaroslav@0
  1449
						if (pMoveForm && pResizeForm) {
jaroslav@0
  1450
							if (!(xLayout instanceof XAbsoluteLayout))
jaroslav@0
  1451
								gen = gen + XFDesignOptions.indent(2)+"addNotify();\n";
jaroslav@0
  1452
							gen = gen + XFDesignOptions.indent(2)+"reshape("+pos.x+", "+pos.y+", "+siz.width+", "+siz.height+");\n";
jaroslav@0
  1453
						}
jaroslav@0
  1454
						else {
jaroslav@0
  1455
							if (pResizeForm)
jaroslav@0
  1456
								gen = gen + XFDesignOptions.indent(2)+"resize("+siz.width+", "+siz.height+");\n";
jaroslav@0
  1457
							if (pMoveForm)
jaroslav@0
  1458
								gen = gen + XFDesignOptions.indent(2)+"move("+pos.x+", "+pos.y+");\n";
jaroslav@0
  1459
						}
jaroslav@0
  1460
						if (pShowForm)
jaroslav@0
  1461
							gen = gen + XFDesignOptions.indent(2)+"show();\n";
jaroslav@0
  1462
						break;
jaroslav@0
  1463
			case XFDesignConstants.FGEN_CONSTRUCTOR_END:
jaroslav@0
  1464
						gen = 	XFDesignOptions.indent(1)+
jaroslav@0
  1465
									"}\n\n";
jaroslav@0
  1466
						break;
jaroslav@0
  1467
			case XFDesignConstants.FGEN_HANDLE_BEGIN:
jaroslav@0
  1468
						gen = XFDesignOptions.indent(1)+
jaroslav@0
  1469
									"public boolean handleEvent(Event evt) {";
jaroslav@0
  1470
						break;
jaroslav@0
  1471
			case XFDesignConstants.FGEN_HANDLE_DEFBODY:
jaroslav@0
  1472
						gen = " \n"+
jaroslav@0
  1473
							XFDesignOptions.indent(2)+"// Your code: \n"+
jaroslav@0
  1474
							XFDesignOptions.indent(2)+"if ((evt.target == this) && (evt.id == Event.WINDOW_DESTROY)) {\n"+
jaroslav@0
  1475
							XFDesignOptions.indent(3)+"hide();\n"+
jaroslav@0
  1476
							XFDesignOptions.indent(3)+"dispose();\n"+
jaroslav@0
  1477
							XFDesignOptions.indent(2)+"}\n";
jaroslav@0
  1478
						break;
jaroslav@0
  1479
			case XFDesignConstants.FGEN_HANDLE_END:
jaroslav@0
  1480
						gen = XFDesignOptions.indent(2)+"return super.handleEvent(evt);\n" +
jaroslav@0
  1481
							XFDesignOptions.indent(1) + "}\n\n";
jaroslav@0
  1482
						break;
jaroslav@0
  1483
			case XFDesignConstants.FGEN_CLASS_END:
jaroslav@0
  1484
						gen = "}\n\n";
jaroslav@0
  1485
						break;
jaroslav@0
  1486
		}
jaroslav@0
  1487
		return gen;
jaroslav@0
  1488
	}
jaroslav@0
  1489
jaroslav@0
  1490
	private void createFormSource() {
jaroslav@0
  1491
		if (formSource == null ) return;
jaroslav@0
  1492
		
jaroslav@0
  1493
		formDocument = formSource.getDocument();
jaroslav@0
  1494
		try {
jaroslav@0
  1495
			formDocument.delete();  
jaroslav@0
  1496
		} catch (NotAllowedException e) {
jaroslav@0
  1497
			throw new InternalError("Block generation error"); // [PENDING - is it O.K? cannot it occur regularly?]
jaroslav@0
  1498
		}
jaroslav@0
  1499
		formDocument.addActionController(this);
jaroslav@0
  1500
jaroslav@0
  1501
		GuardedStamp gs = GuardedStamp.stamp();
jaroslav@0
  1502
		try {
jaroslav@0
  1503
			Position evPos = null;
jaroslav@0
  1504
			classEndB = Block.text(formDocument.getEnd(), generateCode(XFDesignConstants.FGEN_CLASS_END), gs);
jaroslav@0
  1505
			userMethodsUB = Block.text(classEndB.getBegin(), XFDesignOptions.USER_METHODS_TEXT, gs);
jaroslav@0
  1506
			variablesB = Block.text(userMethodsUB.getBegin(), " \n", gs);
jaroslav@0
  1507
			evPos = variablesB.getBegin();
jaroslav@0
  1508
			handleEndB = Block.text(evPos, generateCode(XFDesignConstants.FGEN_HANDLE_END), gs);
jaroslav@0
  1509
			handleBodyUB = Block.text(handleEndB.getBegin(), generateCode(XFDesignConstants.FGEN_HANDLE_DEFBODY), gs);
jaroslav@0
  1510
			new ForbidEmptyBlock(handleBodyUB, " ");
jaroslav@0
  1511
			handleBeginB = Block.text(handleBodyUB.getBegin(), generateCode(XFDesignConstants.FGEN_HANDLE_BEGIN), gs);
jaroslav@0
  1512
			evPool = new EventPool(evPos, handleEndB.getBegin().next()); //[PENDING - ask Yarda]
jaroslav@0
  1513
jaroslav@0
  1514
			constructorEndB = Block.text(handleBeginB.getBegin(), generateCode(XFDesignConstants.FGEN_CONSTRUCTOR_END), gs);
jaroslav@0
  1515
			formResizeB =  Block.text(constructorEndB.getBegin(), generateCode(XFDesignConstants.FGEN_FORM_RESIZE), gs);
jaroslav@0
  1516
jaroslav@0
  1517
			constructorUB = Block.text(formResizeB.getBegin(), XFDesignOptions.USER_CONSTRUCTOR_TEXT, gs);
jaroslav@0
  1518
			new ForbidEmptyBlock(constructorUB, " ");
jaroslav@0
  1519
			
jaroslav@0
  1520
			// changed
jaroslav@0
  1521
			componentsB = Block.text(constructorUB.getBegin(), " \n", gs);
jaroslav@0
  1522
			formSetpropsB = Block.text(componentsB.getBegin(), generateCode(XFDesignConstants.FGEN_FORM_SETPROPS), gs);
jaroslav@0
  1523
			formLayoutB = Block.text(formSetpropsB.getBegin(), generateCode(XFDesignConstants.FGEN_FORM_LAYOUT), gs);
jaroslav@0
  1524
			constructorBeginB = Block.text(formLayoutB.getBegin(), generateCode(XFDesignConstants.FGEN_CONSTRUCTOR_BEGIN), gs);
jaroslav@0
  1525
			classBeginB = Block.text(constructorBeginB.getBegin(), generateCode(XFDesignConstants.FGEN_CLASS_BEGIN), gs);
jaroslav@0
  1526
			importsUB = Block.text(classBeginB.getBegin(), XFDesignOptions.USER_IMPORTS_TEXT, gs);
jaroslav@0
  1527
			new ForbidEmptyBlock(importsUB, " ");
jaroslav@0
  1528
			importsB = Block.text(importsUB.getBegin(), generateCode(XFDesignConstants.FGEN_IMPORTS), gs);
jaroslav@0
  1529
			packageB = Block.text(importsB.getBegin(), "", gs);
jaroslav@0
  1530
			sourceBeginB = Block.text(packageB.getBegin(), generateCode(XFDesignConstants.FGEN_SOURCE_BEGIN), gs);
jaroslav@0
  1531
			componentsB.set("", gs);  // [PENDING - ugly patch]
jaroslav@0
  1532
		} catch (NotAllowedException e) {
jaroslav@0
  1533
			throw new InternalError("Block generation error");
jaroslav@0
  1534
		}		
jaroslav@0
  1535
jaroslav@0
  1536
		try {
jaroslav@0
  1537
			userBlocks.add(importsUB);
jaroslav@0
  1538
			userBlocks.add(constructorUB);
jaroslav@0
  1539
			userBlocks.add(handleBodyUB);
jaroslav@0
  1540
			userBlocks.add(userMethodsUB);
jaroslav@0
  1541
		} catch (xelfi.util.DuplicateException e) {
jaroslav@0
  1542
			throw new InternalError("Block container error");
jaroslav@0
  1543
		}
jaroslav@0
  1544
	}
jaroslav@0
  1545
jaroslav@0
  1546
	private void regenerateComponents() {
jaroslav@0
  1547
			try {
jaroslav@0
  1548
				formDocument.redrawLock();
jaroslav@0
  1549
				GuardedStamp gs = new GuardedStamp();
jaroslav@0
  1550
jaroslav@0
  1551
				importsB.set(generateCode(XFDesignConstants.FGEN_IMPORTS), gs);
jaroslav@0
  1552
				componentsB.set(XFGen.generateComponents(this), gs);
jaroslav@0
  1553
				variablesB.set(XFGen.generateVariables(this), gs);
jaroslav@0
  1554
			} catch (NotAllowedException e) {
jaroslav@0
  1555
				throw new InternalError("Block generation error");
jaroslav@0
  1556
			} finally {
jaroslav@0
  1557
				formDocument.redrawUnlock();
jaroslav@0
  1558
			}
jaroslav@0
  1559
	}	
jaroslav@0
  1560
}