src/main/java/xelfi/design/components/xawt/XPanel3D.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.components.xawt;
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 xelfi.awt.Panel3D;
jaroslav@0
    11
import xelfi.design.components.*;
jaroslav@0
    12
import xelfi.design.components.property.*;
jaroslav@0
    13
import xelfi.design.forms.XelfiDesignForm;
jaroslav@0
    14
import xelfi.design.forms.layouts.XAbsoluteLayout;
jaroslav@0
    15
import xelfi.design.util.*;
jaroslav@0
    16
import xelfi.util.XelfiPath;
jaroslav@0
    17
import xelfi.util.Debug;
jaroslav@0
    18
import xelfi.top.TopLevel;
jaroslav@0
    19
jaroslav@0
    20
/**
jaroslav@0
    21
 * @version	1.03 31 Mar 1997
jaroslav@0
    22
 *   1.00 clone from XPanel 2.10 (24 Feb 1997)
jaroslav@0
    23
 * @author 	Petr Hamernik, Ian Formanek
jaroslav@0
    24
 */
jaroslav@0
    25
public class XPanel3D extends Panel3D implements XelfiVisualContainer {
jaroslav@0
    26
	// property constants
jaroslav@0
    27
	private static final int GRID = 0; 
jaroslav@0
    28
	private static final int BACKGROUNDCOLOR = 1; 
jaroslav@0
    29
	private static final int FOREGROUNDCOLOR = 2; 
jaroslav@0
    30
	private static final int ENABLED = 3; 
jaroslav@0
    31
	private static final int VISIBLE = 4; 
jaroslav@0
    32
	private static final int FONT = 5; 
jaroslav@0
    33
	private static final int PARENTCOLOR = 6; 
jaroslav@0
    34
	private static final int PARENTFONT = 7; 
jaroslav@0
    35
	private static final int DESIGNSIZE = 8; 
jaroslav@0
    36
	private static final int BEVELINNER = 9;
jaroslav@0
    37
	private static final int BEVELOUTER = 10;
jaroslav@0
    38
	private static final int BEVELWIDTH = 11;
jaroslav@0
    39
	private static final int BORDERWIDTH = 12;
jaroslav@0
    40
	private static final int BORDERCOLOR = 13;
jaroslav@0
    41
	private static final int CAPTION = 14;
jaroslav@0
    42
jaroslav@0
    43
	private static int propertyCount = 15;
jaroslav@0
    44
	private static Object propDef[];	// default values of properties
jaroslav@0
    45
	// set-up default property values
jaroslav@0
    46
	private static boolean propDefSet = false;
jaroslav@0
    47
	private static void propertiesSetDefault() {
jaroslav@0
    48
		propDef = new Object[propertyCount];
jaroslav@0
    49
		propDefSet = true;
jaroslav@0
    50
		propDef[GRID] = null;
jaroslav@0
    51
		propDef[BACKGROUNDCOLOR] = null;
jaroslav@0
    52
		propDef[FOREGROUNDCOLOR] = null;
jaroslav@0
    53
		propDef[ENABLED] = Boolean.TRUE;
jaroslav@0
    54
		propDef[VISIBLE] = Boolean.TRUE;
jaroslav@0
    55
		propDef[FONT] = null;
jaroslav@0
    56
		propDef[PARENTCOLOR] = Boolean.TRUE;
jaroslav@0
    57
		propDef[PARENTFONT] = Boolean.TRUE;
jaroslav@0
    58
		propDef[DESIGNSIZE] = Boolean.TRUE;
jaroslav@0
    59
		propDef[BEVELINNER] = new Integer(defaultBevelInner);
jaroslav@0
    60
		propDef[BEVELOUTER] = new Integer(defaultBevelOuter);
jaroslav@0
    61
		propDef[BEVELWIDTH] = new Integer(defaultBevelWidth);
jaroslav@0
    62
		propDef[BORDERWIDTH] = new Integer(defaultBorderWidth);
jaroslav@0
    63
		propDef[BORDERCOLOR] = defaultBorderColor;
jaroslav@0
    64
		propDef[CAPTION] = null;
jaroslav@0
    65
	}
jaroslav@0
    66
jaroslav@0
    67
	private static final int DEFWIDTH = 100;
jaroslav@0
    68
	private static final int DEFHEIGHT = 100;
jaroslav@0
    69
jaroslav@0
    70
	private Point position;
jaroslav@0
    71
	private Dimension size;
jaroslav@0
    72
	private String name = "";
jaroslav@0
    73
	private XelfiDesignLayout xLayout;
jaroslav@0
    74
	private boolean parentColor = true;
jaroslav@0
    75
	private boolean parentFont = true;
jaroslav@0
    76
//	private boolean showBorder = true;
jaroslav@0
    77
	private boolean designSize = true;
jaroslav@0
    78
	private boolean bVisible = true;
jaroslav@0
    79
jaroslav@0
    80
	private boolean backgroundChanged = false;
jaroslav@0
    81
	private boolean foregroundChanged = false;
jaroslav@0
    82
	private boolean fontChanged = false;
jaroslav@0
    83
jaroslav@0
    84
	private static int eventCount = 12;
jaroslav@0
    85
	private String events[] = new String[eventCount];
jaroslav@0
    86
jaroslav@0
    87
	private static Image icon = null;
jaroslav@0
    88
	private XelfiDesignForm parentForm = null;
jaroslav@0
    89
jaroslav@0
    90
	protected int sel = XFDesignConstants.SEL_UNSELECT;
jaroslav@0
    91
jaroslav@0
    92
	// U=Up, D=Down, L=Left, R=Right, M=Middle
jaroslav@0
    93
	protected final static int DM_NONE	= 0;
jaroslav@0
    94
	protected final static int DM_UL	= 1;
jaroslav@0
    95
	protected final static int DM_ML	= 2;
jaroslav@0
    96
	protected final static int DM_DL	= 3;
jaroslav@0
    97
	protected final static int DM_UM	= 4;
jaroslav@0
    98
	protected final static int DM_DM	= 6;
jaroslav@0
    99
	protected final static int DM_UR	= 7;
jaroslav@0
   100
	protected final static int DM_MR	= 8;
jaroslav@0
   101
	protected final static int DM_DR	= 9;
jaroslav@0
   102
	protected Point dragOrigin = null;
jaroslav@0
   103
	protected int dragMode = DM_NONE;
jaroslav@0
   104
jaroslav@0
   105
	private GridInfo grid = new GridInfo(XFDesignOptions.gridX, XFDesignOptions.gridX);
jaroslav@0
   106
	
jaroslav@0
   107
//////////////////
jaroslav@0
   108
// constructors //
jaroslav@0
   109
//////////////////
jaroslav@0
   110
jaroslav@0
   111
	public XPanel3D() { 
jaroslav@0
   112
		if (!propDefSet) propertiesSetDefault();
jaroslav@0
   113
		position = new Point(0,0); 
jaroslav@0
   114
		size = null;
jaroslav@0
   115
		xLayout = new XAbsoluteLayout();
jaroslav@0
   116
		setLayout((LayoutManager)xLayout);
jaroslav@0
   117
		if (icon == null)
jaroslav@0
   118
			loadIcon();
jaroslav@0
   119
	}
jaroslav@0
   120
jaroslav@0
   121
	public Insets insets() {
jaroslav@0
   122
		Insets ins = super.insets();
jaroslav@0
   123
		int i = XFDesignOptions.selectionSize;
jaroslav@0
   124
		if (sel != XFDesignConstants.SEL_UNSELECT) {
jaroslav@0
   125
			ins.left += i;
jaroslav@0
   126
			ins.right += i;
jaroslav@0
   127
			ins.top += i;
jaroslav@0
   128
			ins.bottom += i;
jaroslav@0
   129
		}
jaroslav@0
   130
		return ins;
jaroslav@0
   131
	}
jaroslav@0
   132
jaroslav@0
   133
	public void setParentForm(XelfiDesignForm form) {
jaroslav@0
   134
		parentForm = form;
jaroslav@0
   135
	}
jaroslav@0
   136
jaroslav@0
   137
	public XelfiDesignForm getParentForm() {
jaroslav@0
   138
		return parentForm;
jaroslav@0
   139
	}
jaroslav@0
   140
jaroslav@0
   141
	protected void repaintComponent() {
jaroslav@0
   142
		((Component)this).invalidate();
jaroslav@0
   143
		if (((Component)this).getParent() != null)
jaroslav@0
   144
			((Component)this).getParent().validate();
jaroslav@0
   145
	}
jaroslav@0
   146
jaroslav@0
   147
	protected void regenForm(int what) {
jaroslav@0
   148
		if (parentForm != null)
jaroslav@0
   149
			parentForm.regenerateCode(this, what);
jaroslav@0
   150
	}
jaroslav@0
   151
jaroslav@0
   152
	protected boolean allowsDrag() {
jaroslav@0
   153
		return ((XelfiVisualContainer)getParent()).getDesignLayout().allowsDragging();
jaroslav@0
   154
	}
jaroslav@0
   155
jaroslav@0
   156
///////////////////////////
jaroslav@0
   157
// common implementation //
jaroslav@0
   158
///////////////////////////
jaroslav@0
   159
jaroslav@0
   160
	public String getName() { return name; }
jaroslav@0
   161
jaroslav@6
   162
	public int setDesignName(String aName) { 
jaroslav@0
   163
		name = aName;
jaroslav@0
   164
		return XFDesignConstants.RSP_OK;
jaroslav@0
   165
	}
jaroslav@0
   166
jaroslav@0
   167
	public Point getPosition() { 
jaroslav@0
   168
		return new Point(position.x,position.y);
jaroslav@0
   169
	}
jaroslav@0
   170
jaroslav@0
   171
	public int setPosition(int x, int y) { 
jaroslav@0
   172
		if (position == null)
jaroslav@0
   173
			position = new Point(x, y);
jaroslav@0
   174
		else {
jaroslav@0
   175
			position.x = x;
jaroslav@0
   176
			position.y = y;
jaroslav@0
   177
		}
jaroslav@0
   178
		regenForm(XFDesignConstants.GEN_RESHAPE);
jaroslav@0
   179
		repaintComponent();
jaroslav@0
   180
		return XFDesignConstants.RSP_OK;
jaroslav@0
   181
	}
jaroslav@0
   182
jaroslav@0
   183
	public boolean handleEvent(Event evt) {
jaroslav@0
   184
		if (XFDesignOptions.designMode==XFDesignConstants.DM_DESIGN) {
jaroslav@0
   185
			if ((sel == XFDesignConstants.SEL_SELECT) && (evt.id == Event.MOUSE_DOWN)) {
jaroslav@0
   186
				dragMode = resolveMode(evt.x, evt.y);
jaroslav@0
   187
				if (dragMode != DM_NONE) {
jaroslav@0
   188
					dragOrigin = new Point(evt.x, evt.y);
jaroslav@0
   189
					if (!allowsDrag()) {
jaroslav@0
   190
						dragMode = DM_NONE;
jaroslav@0
   191
						repaint();
jaroslav@0
   192
						return false;
jaroslav@0
   193
					}
jaroslav@0
   194
					repaint();
jaroslav@0
   195
					return true;
jaroslav@0
   196
				}
jaroslav@0
   197
			}
jaroslav@0
   198
			else if ((sel == XFDesignConstants.SEL_SELECT) && (evt.id == Event.MOUSE_UP)) {
jaroslav@0
   199
				if (dragMode != DM_NONE) {
jaroslav@0
   200
					Dimension d = getSize();
jaroslav@0
   201
					Point p = getPosition();
jaroslav@0
   202
					boolean changePos = false;
jaroslav@0
   203
					if ((dragMode != DM_UM) && (dragMode != DM_DM)) {
jaroslav@0
   204
						if ((dragMode == DM_UL) || (dragMode == DM_ML) || (dragMode == DM_DL)) {
jaroslav@0
   205
							d.width += dragOrigin.x - evt.x;
jaroslav@0
   206
							p.x += evt.x - dragOrigin.x;
jaroslav@0
   207
							changePos = true;
jaroslav@0
   208
						}
jaroslav@0
   209
						else d.width -= dragOrigin.x - evt.x;
jaroslav@0
   210
						if (d.width < 0) d.width = 0;
jaroslav@0
   211
					}
jaroslav@0
   212
					if ((dragMode != DM_ML) && (dragMode != DM_MR)) {
jaroslav@0
   213
						if (d.height < 0)
jaroslav@0
   214
							d.height = 0;
jaroslav@0
   215
						if ((dragMode == DM_UL) || (dragMode == DM_UM) || (dragMode == DM_UR)) {
jaroslav@0
   216
							p.y += evt.y - dragOrigin.y;
jaroslav@0
   217
							d.height += dragOrigin.y - evt.y;
jaroslav@0
   218
							changePos = true;
jaroslav@0
   219
						}
jaroslav@0
   220
						else d.height -= dragOrigin.y - evt.y;
jaroslav@0
   221
						if (d.height < 0) d.height = 0;
jaroslav@0
   222
					}
jaroslav@0
   223
					if (changePos)
jaroslav@0
   224
						setPosition(p.x, p.y);
jaroslav@6
   225
					setDesignSize(d.width, d.height);
jaroslav@0
   226
					TopLevel.getInspector().selectionChanged();
jaroslav@0
   227
					dragMode = DM_NONE;
jaroslav@0
   228
				}
jaroslav@0
   229
			}
jaroslav@0
   230
			return false;
jaroslav@0
   231
		}
jaroslav@0
   232
		else return super.handleEvent(evt);
jaroslav@0
   233
	}
jaroslav@0
   234
jaroslav@0
   235
	private int resolveMode(int x, int y) {
jaroslav@0
   236
		int res = 0;
jaroslav@0
   237
		int df = XFDesignOptions.selectionSize;
jaroslav@0
   238
		Dimension d = size();
jaroslav@0
   239
jaroslav@0
   240
		if (x < df)
jaroslav@0
   241
			res = 0;
jaroslav@0
   242
		else if (x >= d.width - df)
jaroslav@0
   243
			res = 6;
jaroslav@0
   244
		else if ((x >= (d.width-df)/2) && (x < (d.width-df)/2+df) && (d.width >= 3*df+2))
jaroslav@0
   245
			res = 3;
jaroslav@0
   246
		else return DM_NONE;
jaroslav@0
   247
		
jaroslav@0
   248
		if (y <= df)
jaroslav@0
   249
			res += 1;
jaroslav@0
   250
		else if (y >= d.height - df)
jaroslav@0
   251
			res += 3;
jaroslav@0
   252
		else if ((y >= (d.height-df)/2) && (y < (d.height-df)/2+df) && (d.height >= 3*df+2))
jaroslav@0
   253
			res += 2;
jaroslav@0
   254
		else return DM_NONE;
jaroslav@0
   255
		
jaroslav@0
   256
		if (res == 5)
jaroslav@0
   257
			return DM_NONE;
jaroslav@0
   258
		else
jaroslav@0
   259
			return res;
jaroslav@0
   260
	}
jaroslav@0
   261
jaroslav@0
   262
	private boolean propertyDefault(int i) throws XFPropertyIndexOutOfBoundsException {
jaroslav@0
   263
		switch (i) {
jaroslav@0
   264
			case GRID: return false;
jaroslav@0
   265
			case BACKGROUNDCOLOR: return !backgroundChanged; // ((Color) propDef[i]).equals(getBackground());
jaroslav@0
   266
			case FOREGROUNDCOLOR: return !foregroundChanged; // ((Color) propDef[i]).equals(getForeground());
jaroslav@0
   267
			case ENABLED: return (((Boolean) propDef[i]).booleanValue() == isEnabled());
jaroslav@0
   268
			case VISIBLE: return (((Boolean) propDef[i]).booleanValue() == bVisible);
jaroslav@0
   269
			case FONT: return !fontChanged; // ((Font) propDef[i]).equals(getFont());
jaroslav@0
   270
			case PARENTCOLOR: return (((Boolean) propDef[i]).booleanValue() == parentColor);
jaroslav@0
   271
			case PARENTFONT: return (((Boolean) propDef[i]).booleanValue() == parentFont);
jaroslav@0
   272
			case DESIGNSIZE: return (((Boolean) propDef[i]).booleanValue() == designSize);
jaroslav@0
   273
			case BEVELINNER: return (((Integer) propDef[i]).intValue() == defaultBevelInner);
jaroslav@0
   274
			case BEVELOUTER: return (((Integer) propDef[i]).intValue() == defaultBevelOuter);
jaroslav@0
   275
			case BEVELWIDTH: return (((Integer) propDef[i]).intValue() == defaultBevelWidth);
jaroslav@0
   276
			case BORDERWIDTH: return (((Integer) propDef[i]).intValue() == defaultBorderWidth);
jaroslav@0
   277
			case BORDERCOLOR: return ((Color) propDef[i]).equals(defaultBorderColor);
jaroslav@0
   278
			case CAPTION: return (captionEmpty());
jaroslav@0
   279
			default: throw new XFPropertyIndexOutOfBoundsException();
jaroslav@0
   280
		}
jaroslav@0
   281
	}
jaroslav@0
   282
jaroslav@0
   283
///////////////////////////////////////
jaroslav@0
   284
// component specific implementation //
jaroslav@0
   285
///////////////////////////////////////
jaroslav@0
   286
jaroslav@0
   287
	public Dimension preferredSize() {
jaroslav@0
   288
		if (XFDesignOptions.designMode == XFDesignConstants.DM_REAL || (!designSize))
jaroslav@0
   289
			return super.preferredSize();
jaroslav@0
   290
		if (size == null) size = new Dimension(DEFWIDTH, DEFHEIGHT);
jaroslav@0
   291
		Dimension sz = new Dimension(size);
jaroslav@0
   292
jaroslav@0
   293
		if (sel != XFDesignConstants.SEL_UNSELECT) {
jaroslav@0
   294
			sz.height += 2*XFDesignOptions.selectionSize;
jaroslav@0
   295
			sz.width += 2*XFDesignOptions.selectionSize;
jaroslav@0
   296
		}
jaroslav@0
   297
		return new Dimension(sz);
jaroslav@0
   298
	}
jaroslav@0
   299
jaroslav@0
   300
	public Dimension getDesignSize() { 
jaroslav@0
   301
		if (size == null) size = new Dimension(DEFWIDTH, DEFHEIGHT);
jaroslav@0
   302
		Dimension sz = new Dimension(size);
jaroslav@0
   303
		if (sel != XFDesignConstants.SEL_UNSELECT) {
jaroslav@0
   304
			sz.height += 2*XFDesignOptions.selectionSize;
jaroslav@0
   305
			sz.width += 2*XFDesignOptions.selectionSize;
jaroslav@0
   306
		}
jaroslav@0
   307
		return sz;
jaroslav@0
   308
	}
jaroslav@0
   309
jaroslav@0
   310
	public Dimension getSize() { 
jaroslav@0
   311
		Dimension sz = preferredSize();
jaroslav@0
   312
		if (size == null)
jaroslav@0
   313
			size = sz;
jaroslav@0
   314
		return new Dimension(size);
jaroslav@0
   315
	}
jaroslav@0
   316
		
jaroslav@6
   317
	public int setDesignSize(int w, int h) { 
jaroslav@0
   318
		if (size == null)
jaroslav@0
   319
			size = new Dimension(w,h);
jaroslav@0
   320
		else {
jaroslav@0
   321
			size.width = w;  
jaroslav@0
   322
			size.height = h;
jaroslav@0
   323
		}
jaroslav@0
   324
		grid.gridImage = null;
jaroslav@0
   325
		resize(size);
jaroslav@0
   326
jaroslav@0
   327
		regenForm(XFDesignConstants.GEN_RESHAPE);
jaroslav@0
   328
		repaintComponent();
jaroslav@0
   329
		return XFDesignConstants.RSP_OK;
jaroslav@0
   330
	}
jaroslav@0
   331
jaroslav@0
   332
	public int getPropertyCount() { return propertyCount; }
jaroslav@0
   333
	
jaroslav@0
   334
	public Object getProperty(int index) throws XFPropertyIndexOutOfBoundsException { 
jaroslav@0
   335
		switch (index) {
jaroslav@0
   336
			case GRID: return grid;
jaroslav@0
   337
			case BACKGROUNDCOLOR: return getBackground();
jaroslav@0
   338
			case FOREGROUNDCOLOR: return getForeground();
jaroslav@0
   339
			case ENABLED: return (isEnabled()) ? Boolean.TRUE : Boolean.FALSE;
jaroslav@0
   340
			case VISIBLE: return (isVisible()) ? Boolean.TRUE : Boolean.FALSE;
jaroslav@0
   341
			case FONT: return getFont();
jaroslav@0
   342
			case PARENTCOLOR: return (parentColor) ? Boolean.TRUE : Boolean.FALSE;
jaroslav@0
   343
			case PARENTFONT: return (parentFont) ? Boolean.TRUE : Boolean.FALSE;
jaroslav@0
   344
			case DESIGNSIZE: return (designSize) ? Boolean.TRUE : Boolean.FALSE;
jaroslav@0
   345
			case BEVELINNER: return new Integer(getBevelInner());
jaroslav@0
   346
			case BEVELOUTER: return new Integer(getBevelOuter());
jaroslav@0
   347
			case BEVELWIDTH: return new Integer(getBevelWidth());
jaroslav@0
   348
			case BORDERWIDTH: return new Integer(getBorderWidth());
jaroslav@0
   349
			case BORDERCOLOR: return getBorderColor();
jaroslav@0
   350
			case CAPTION: return getCaption();
jaroslav@0
   351
			default: throw new XFPropertyIndexOutOfBoundsException();
jaroslav@0
   352
		}
jaroslav@0
   353
	}
jaroslav@0
   354
			
jaroslav@0
   355
	public String[] getPropertyNames() { 
jaroslav@0
   356
		String list[] = new String[propertyCount];
jaroslav@0
   357
		list[GRID] = new String("Grid"); 
jaroslav@0
   358
		list[BACKGROUNDCOLOR] = new String("Background Color"); 
jaroslav@0
   359
		list[FOREGROUNDCOLOR] = new String("Foreground Color"); 
jaroslav@0
   360
		list[ENABLED] = new String("Enabled"); 
jaroslav@0
   361
		list[VISIBLE] = new String("Visible"); 
jaroslav@0
   362
		list[FONT] = new String("Font"); 
jaroslav@0
   363
		list[PARENTCOLOR] = new String("Parent Color"); 
jaroslav@0
   364
		list[PARENTFONT] = new String("Parent Font"); 
jaroslav@0
   365
		list[DESIGNSIZE] = new String("DesignSize"); 
jaroslav@0
   366
		list[BEVELINNER] = new String("Bevel Inner");
jaroslav@0
   367
		list[BEVELOUTER] = new String("Bevel Outer");
jaroslav@0
   368
		list[BEVELWIDTH] = new String("Bevel Width");
jaroslav@0
   369
		list[BORDERWIDTH] = new String("Border Width");
jaroslav@0
   370
		list[BORDERCOLOR] = new String("Border Color");
jaroslav@0
   371
		list[CAPTION] = new String("Caption");
jaroslav@0
   372
		return list;
jaroslav@0
   373
	}
jaroslav@0
   374
		
jaroslav@0
   375
	public String getPropertyString(int index) throws 
jaroslav@0
   376
		XFPropertyIndexOutOfBoundsException { 
jaroslav@0
   377
		switch (index) {
jaroslav@0
   378
			case GRID: return XGridPropertyType.viewString(getProperty(index));
jaroslav@0
   379
			case BACKGROUNDCOLOR: 
jaroslav@0
   380
			case FOREGROUNDCOLOR: return XColorPropertyType.viewString(getProperty(index));
jaroslav@0
   381
			case FONT: return XFontPropertyType.viewString(getProperty(index));
jaroslav@0
   382
			case ENABLED:
jaroslav@0
   383
			case VISIBLE:
jaroslav@0
   384
			case PARENTCOLOR: 
jaroslav@0
   385
			case PARENTFONT: 
jaroslav@0
   386
			case DESIGNSIZE: return XBooleanPropertyType.viewString(getProperty(index));
jaroslav@0
   387
			case BEVELINNER:
jaroslav@0
   388
			case BEVELOUTER:
jaroslav@0
   389
			case BEVELWIDTH:
jaroslav@0
   390
			case BORDERWIDTH: return XIntegerPropertyType.viewString(getProperty(index));
jaroslav@0
   391
			case BORDERCOLOR: return XColorPropertyType.viewString(getProperty(index));
jaroslav@0
   392
			case CAPTION:	return XStringPropertyType.viewString(getProperty(index));
jaroslav@0
   393
			default: throw new XFPropertyIndexOutOfBoundsException();
jaroslav@0
   394
		}
jaroslav@0
   395
	}
jaroslav@0
   396
jaroslav@0
   397
	public int getPropertyViewerType(int index) throws 
jaroslav@0
   398
		XFPropertyIndexOutOfBoundsException {
jaroslav@0
   399
		switch (index) {
jaroslav@0
   400
			case GRID:
jaroslav@0
   401
			case BACKGROUNDCOLOR: 
jaroslav@0
   402
			case FOREGROUNDCOLOR:
jaroslav@0
   403
			case FONT: return XFDesignConstants.PVT_SPECIAL;
jaroslav@0
   404
			case ENABLED:
jaroslav@0
   405
			case VISIBLE:
jaroslav@0
   406
			case PARENTCOLOR: 
jaroslav@0
   407
			case PARENTFONT: 
jaroslav@0
   408
			case DESIGNSIZE: return XFDesignConstants.PVT_CHECK;
jaroslav@0
   409
			case BEVELINNER:
jaroslav@0
   410
			case BEVELOUTER:return XFDesignConstants.PVT_CHOICE_STRICT;
jaroslav@0
   411
			case BEVELWIDTH:
jaroslav@0
   412
			case BORDERWIDTH: return XFDesignConstants.PVT_INPUT_INT;
jaroslav@0
   413
			case BORDERCOLOR: return XFDesignConstants.PVT_SPECIAL;
jaroslav@0
   414
			case CAPTION: return XFDesignConstants.PVT_INPUT_STRING;
jaroslav@0
   415
			default: throw new XFPropertyIndexOutOfBoundsException();
jaroslav@0
   416
		}
jaroslav@0
   417
	}
jaroslav@0
   418
jaroslav@0
   419
	public String[] getPropertyValueNames(int index) throws 
jaroslav@0
   420
		XFPropertyIndexOutOfBoundsException {
jaroslav@0
   421
		switch (index) {
jaroslav@0
   422
			case BEVELINNER: 
jaroslav@0
   423
			case BEVELOUTER: 
jaroslav@0
   424
					String[] ret = new String[3];
jaroslav@0
   425
					ret[0] = "NONE";
jaroslav@0
   426
					ret[1] = "LOWERED";
jaroslav@0
   427
					ret[2] = "RAISED";
jaroslav@0
   428
					return ret;
jaroslav@0
   429
			default: throw new XFPropertyIndexOutOfBoundsException();
jaroslav@0
   430
		}
jaroslav@0
   431
	}
jaroslav@0
   432
jaroslav@0
   433
	public Object[] getPropertyValueValues(int index) throws 
jaroslav@0
   434
		XFPropertyIndexOutOfBoundsException {
jaroslav@0
   435
		switch (index) {
jaroslav@0
   436
			case BEVELINNER: 
jaroslav@0
   437
			case BEVELOUTER: 
jaroslav@0
   438
					Integer[] ret = new Integer[3];
jaroslav@0
   439
					ret[0] = new Integer(BV_NONE);
jaroslav@0
   440
					ret[1] = new Integer(BV_LOWERED);
jaroslav@0
   441
					ret[2] = new Integer(BV_RAISED);
jaroslav@0
   442
					return ret;
jaroslav@0
   443
			default: throw new XFPropertyIndexOutOfBoundsException();
jaroslav@0
   444
		}
jaroslav@0
   445
	}
jaroslav@0
   446
jaroslav@0
   447
	private boolean setParentColor(boolean aParentColor) {
jaroslav@0
   448
		if (aParentColor == parentColor) return false;
jaroslav@0
   449
		parentColor = aParentColor;
jaroslav@0
   450
		if (parentColor) {
jaroslav@0
   451
			parentUpdate();
jaroslav@0
   452
//			updateSubComponents();
jaroslav@0
   453
		}
jaroslav@0
   454
		return parentColor;
jaroslav@0
   455
	}
jaroslav@0
   456
jaroslav@0
   457
	private boolean setParentFont(boolean aParentFont) {
jaroslav@0
   458
		if (aParentFont == parentFont) return false;
jaroslav@0
   459
		parentFont = aParentFont;
jaroslav@0
   460
		if (parentFont) {
jaroslav@0
   461
			parentUpdate();
jaroslav@0
   462
//			updateSubComponents();
jaroslav@0
   463
		}
jaroslav@0
   464
		return parentFont;
jaroslav@0
   465
	}
jaroslav@0
   466
jaroslav@0
   467
	public boolean parentUpdate() {
jaroslav@0
   468
		boolean b = true;
jaroslav@0
   469
		if ((parentFont) && (!getParent().getFont().equals(getFont()))) {
jaroslav@0
   470
			b = true;
jaroslav@0
   471
			setFont(getParent().getFont());
jaroslav@0
   472
		}
jaroslav@0
   473
		if (parentColor) {
jaroslav@0
   474
			if (!getParent().getForeground().equals(getForeground())) {
jaroslav@0
   475
				b = true;
jaroslav@0
   476
				setForeground(getParent().getForeground());
jaroslav@0
   477
			}
jaroslav@0
   478
			if (!getParent().getBackground().equals(getBackground())) {
jaroslav@0
   479
				b = true;
jaroslav@0
   480
				setBackground(getParent().getBackground());
jaroslav@0
   481
			}
jaroslav@0
   482
		}
jaroslav@0
   483
		if (b) {
jaroslav@0
   484
			updateSubComponents();
jaroslav@0
   485
//			hide();	show();
jaroslav@0
   486
//			repaintComponent();
jaroslav@0
   487
		}
jaroslav@0
   488
		regenForm(XFDesignConstants.GEN_SETPROPS);
jaroslav@0
   489
		return b;
jaroslav@0
   490
	}
jaroslav@0
   491
		
jaroslav@0
   492
	private void updateSubComponents() {
jaroslav@0
   493
		Component comps1[] = getComponents();
jaroslav@0
   494
		for (int i=0; i<comps1.length; i++)
jaroslav@0
   495
			((XelfiVisualComponent)(comps1[i])).parentUpdate();
jaroslav@0
   496
		invalidate(); validate(); 
jaroslav@0
   497
		hide(); show();
jaroslav@0
   498
	}
jaroslav@0
   499
jaroslav@0
   500
	public int setProperty(int index, Object value) throws 	
jaroslav@0
   501
		XFPropertyIndexOutOfBoundsException,
jaroslav@0
   502
		XFPropertyBadValueTypeException 
jaroslav@0
   503
	{ 
jaroslav@0
   504
		int ret = XFDesignConstants.RSP_OK;
jaroslav@0
   505
		int regen = XFDesignConstants.GEN_SETPROPS;
jaroslav@0
   506
		
jaroslav@0
   507
		switch (index) { 
jaroslav@0
   508
			case GRID: if (!(value instanceof GridInfo)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   509
					grid = (GridInfo) value;
jaroslav@0
   510
					hide(); show(); // [PENDING - to test]
jaroslav@0
   511
					break;
jaroslav@0
   512
			case BACKGROUNDCOLOR: if (!(value instanceof Color)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   513
					setBackground((Color)value);
jaroslav@0
   514
					backgroundChanged = true;
jaroslav@0
   515
					ret = XFDesignConstants.RSP_REPAINT_COMP;
jaroslav@0
   516
					grid.gridImage = null; // to repaint grid image
jaroslav@0
   517
					hide();
jaroslav@0
   518
					show();
jaroslav@0
   519
					if (parentColor) {
jaroslav@0
   520
						parentColor = false;
jaroslav@0
   521
						ret = ret | XFDesignConstants.RSP_OTHER_PROP;
jaroslav@0
   522
					}
jaroslav@0
   523
					updateSubComponents();
jaroslav@0
   524
					break;
jaroslav@0
   525
			case FOREGROUNDCOLOR: if (!(value instanceof Color)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   526
					setForeground((Color)value);
jaroslav@0
   527
					foregroundChanged = true;
jaroslav@0
   528
					ret = XFDesignConstants.RSP_REPAINT_COMP;
jaroslav@0
   529
					grid.gridImage = null; // to repaint grid image
jaroslav@0
   530
					hide();
jaroslav@0
   531
					show();
jaroslav@0
   532
					if (parentColor) {
jaroslav@0
   533
						parentColor = false;
jaroslav@0
   534
						ret = ret | XFDesignConstants.RSP_OTHER_PROP;
jaroslav@0
   535
					}
jaroslav@0
   536
					updateSubComponents();
jaroslav@0
   537
					break;
jaroslav@0
   538
			case ENABLED: if (!(value instanceof Boolean)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   539
					enable(((Boolean)value).booleanValue());
jaroslav@0
   540
				break;
jaroslav@0
   541
			case VISIBLE: if (!(value instanceof Boolean)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   542
					bVisible = ((Boolean)value).booleanValue();
jaroslav@0
   543
				break;
jaroslav@0
   544
			case FONT: if (!(value instanceof Font)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   545
					setFont((Font)value);
jaroslav@0
   546
					fontChanged = true;
jaroslav@0
   547
					ret = XFDesignConstants.RSP_REPAINT_COMP;
jaroslav@0
   548
					if (parentFont) {
jaroslav@0
   549
						parentFont = false;
jaroslav@0
   550
						ret = ret | XFDesignConstants.RSP_OTHER_PROP;
jaroslav@0
   551
					}
jaroslav@0
   552
					updateSubComponents();
jaroslav@0
   553
					break;
jaroslav@0
   554
			case PARENTCOLOR:	if (!(value instanceof Boolean)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   555
					setParentColor(((Boolean)value).booleanValue());
jaroslav@0
   556
					if (parentColor)
jaroslav@0
   557
						ret = XFDesignConstants.RSP_REPAINT_COMP;
jaroslav@0
   558
					break;
jaroslav@0
   559
			case PARENTFONT: if (!(value instanceof Boolean)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   560
					setParentFont(((Boolean)value).booleanValue());
jaroslav@0
   561
					if (parentFont)
jaroslav@0
   562
						ret = XFDesignConstants.RSP_REPAINT_COMP;
jaroslav@0
   563
					break;
jaroslav@0
   564
			case DESIGNSIZE: if (!(value instanceof Boolean)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   565
					designSize = (((Boolean)value).booleanValue());
jaroslav@0
   566
					ret = XFDesignConstants.RSP_REPAINT_COMP;
jaroslav@0
   567
					repaintComponent();
jaroslav@0
   568
					break;
jaroslav@0
   569
			case BEVELINNER:if (!(value instanceof Integer)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   570
					setBevelInner(((Integer)value).intValue());
jaroslav@0
   571
					break;
jaroslav@0
   572
			case BEVELOUTER:if (!(value instanceof Integer)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   573
					setBevelOuter(((Integer)value).intValue());
jaroslav@0
   574
					break;
jaroslav@0
   575
			case BEVELWIDTH:if (!(value instanceof Integer)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   576
					setBevelWidth(((Integer)value).intValue());
jaroslav@0
   577
					break;
jaroslav@0
   578
			case BORDERWIDTH:if (!(value instanceof Integer)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   579
					setBorderWidth(((Integer)value).intValue());
jaroslav@0
   580
					break;
jaroslav@0
   581
			case BORDERCOLOR:if (!(value instanceof Color)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   582
					setBorderColor((Color)value);
jaroslav@0
   583
					break;
jaroslav@0
   584
			case CAPTION:if (!(value instanceof String)) throw new XFPropertyBadValueTypeException();
jaroslav@0
   585
					setCaption((String)value);
jaroslav@0
   586
					break;
jaroslav@0
   587
			default: throw new XFPropertyIndexOutOfBoundsException();
jaroslav@0
   588
		}
jaroslav@0
   589
		if (parentForm != null)
jaroslav@0
   590
			parentForm.regenerateCode(this, regen);
jaroslav@0
   591
		
jaroslav@0
   592
		return ret;
jaroslav@0
   593
	}
jaroslav@0
   594
			
jaroslav@0
   595
	public void specialPropertyInput(Frame parent, int index) throws 	
jaroslav@0
   596
		XFPropertyIndexOutOfBoundsException, 
jaroslav@0
   597
		XFPropertyNoSpecialInputException { 
jaroslav@0
   598
		if ((index < 0) || (index >= propertyCount)) throw new XFPropertyIndexOutOfBoundsException();
jaroslav@0
   599
jaroslav@0
   600
		switch (index) { 
jaroslav@0
   601
			case GRID: XGridPropertyType.invokeSpecialInput(parent, this, index);
jaroslav@0
   602
						break;
jaroslav@0
   603
			case BACKGROUNDCOLOR:
jaroslav@0
   604
			case FOREGROUNDCOLOR: 
jaroslav@0
   605
			case BORDERCOLOR: XColorPropertyType.invokeSpecialInput(parent, this, index);
jaroslav@0
   606
				break;
jaroslav@0
   607
			case FONT: XFontPropertyType.invokeSpecialInput(parent, this, index);
jaroslav@0
   608
						break;
jaroslav@0
   609
			default: throw new XFPropertyNoSpecialInputException();
jaroslav@0
   610
		}
jaroslav@0
   611
	}
jaroslav@0
   612
	
jaroslav@0
   613
	public int getEventCount() {
jaroslav@0
   614
		return eventCount;
jaroslav@0
   615
	}
jaroslav@0
   616
jaroslav@0
   617
	public String[] getEventNames() {
jaroslav@0
   618
		String list[] = new String[eventCount];
jaroslav@0
   619
		list[0] = new String("OnGotFocus"); 
jaroslav@0
   620
		list[1] = new String("OnLostFocus"); 
jaroslav@0
   621
		list[2] = new String("OnKeyAction"); 
jaroslav@0
   622
		list[3] = new String("OnKeyActionRelease"); 
jaroslav@0
   623
		list[4] = new String("OnKeyPress"); 
jaroslav@0
   624
		list[5] = new String("OnKeyRelease"); 
jaroslav@0
   625
		list[6] = new String("OnMouseDown"); 
jaroslav@0
   626
		list[7] = new String("OnMouseUp"); 
jaroslav@0
   627
		list[8] = new String("OnMouseMove"); 
jaroslav@0
   628
		list[9] = new String("OnMouseDrag"); 
jaroslav@0
   629
		list[10] = new String("OnMouseEnter"); 
jaroslav@0
   630
		list[11] = new String("OnMouseExit"); 
jaroslav@0
   631
		return list;
jaroslav@0
   632
	}
jaroslav@0
   633
jaroslav@0
   634
	public String getEvent(int index) throws 
jaroslav@0
   635
		XFPropertyIndexOutOfBoundsException {
jaroslav@0
   636
		if ((index>=0) && (index<eventCount)) {
jaroslav@0
   637
			if (events[index] == null)
jaroslav@0
   638
				return null;
jaroslav@0
   639
			else
jaroslav@0
   640
				return new String(events[index]); 
jaroslav@0
   641
		}
jaroslav@0
   642
		else throw new XFPropertyIndexOutOfBoundsException();
jaroslav@0
   643
	}		
jaroslav@0
   644
		
jaroslav@0
   645
	public void setEvent(int index, String value) throws 
jaroslav@0
   646
		XFPropertyIndexOutOfBoundsException {
jaroslav@0
   647
		if ((index>=0) && (index<eventCount))
jaroslav@0
   648
			events[index] = value;
jaroslav@0
   649
		else throw new XFPropertyIndexOutOfBoundsException();
jaroslav@0
   650
	}		
jaroslav@0
   651
jaroslav@0
   652
	public XelfiDesignLayout getDesignLayout() { return xLayout; }
jaroslav@0
   653
jaroslav@0
   654
	public int setDesignLayout(XelfiDesignLayout aXLayout) {
jaroslav@0
   655
		Component comps[] = getComponents();
jaroslav@0
   656
		for (int i=0; i<comps.length; i++)
jaroslav@0
   657
			remove(comps[i]);
jaroslav@0
   658
		xLayout = aXLayout;
jaroslav@0
   659
		xLayout.setParent(this);
jaroslav@0
   660
		setLayout((LayoutManager)xLayout);
jaroslav@0
   661
		for (int i=0; i<comps.length; i++) {
jaroslav@0
   662
			// this is here because some layouts can hide some components - we must show them again
jaroslav@0
   663
			if (!comps[i].isVisible()) comps[i].show();  
jaroslav@0
   664
			xLayout.layoutAdd(this, (XelfiVisualComponent)comps[i]);
jaroslav@0
   665
		}
jaroslav@0
   666
		// is is the panel's parent, who is validated - it is because change of layout can influence 
jaroslav@0
   667
		// size of this panel
jaroslav@0
   668
		invalidate(); if (getParent() != null) getParent().validate();
jaroslav@0
   669
		repaint(); // because of grid
jaroslav@0
   670
		parentForm.regenerateCode(this, XFDesignConstants.GEN_SETLAYOUT);
jaroslav@0
   671
		return XFDesignConstants.RSP_OK;
jaroslav@0
   672
	}
jaroslav@0
   673
jaroslav@0
   674
	public Vector getSubComponents() {
jaroslav@0
   675
		int count = countComponents();
jaroslav@0
   676
		Vector vect = new Vector(count);
jaroslav@0
   677
		for (int i=0; i<count; i++) {
jaroslav@0
   678
			Component comp = getComponent(i); 
jaroslav@0
   679
			vect.addElement(comp);
jaroslav@0
   680
			if (comp instanceof XelfiVisualContainer) {
jaroslav@0
   681
				Vector subVect = ((XelfiVisualContainer)comp).getSubComponents();
jaroslav@0
   682
				for (int j=0; j<subVect.size(); j++)
jaroslav@0
   683
					vect.addElement(subVect.elementAt(j));
jaroslav@0
   684
			}
jaroslav@0
   685
		}
jaroslav@0
   686
		return vect;
jaroslav@0
   687
	}
jaroslav@0
   688
jaroslav@0
   689
	public Image getIcon() {
jaroslav@0
   690
		return icon; 
jaroslav@0
   691
	}
jaroslav@0
   692
jaroslav@0
   693
	private void loadIcon() {
jaroslav@0
   694
		String sep = new String(System.getProperty("file.separator"));
jaroslav@0
   695
		StringBuffer s = new StringBuffer(XelfiPath.get() + sep + 
jaroslav@0
   696
			"design" + sep + "components" + sep + "xawt" + sep + "panel3d.gif");
jaroslav@0
   697
		icon = Toolkit.getDefaultToolkit().getImage(new String(s));
jaroslav@0
   698
	}
jaroslav@0
   699
	
jaroslav@0
   700
	public String getClassName() { return "Panel3D"; }
jaroslav@0
   701
	
jaroslav@0
   702
	public void setSelection(int aSel) {
jaroslav@0
   703
		if (sel == aSel)
jaroslav@0
   704
			return;
jaroslav@0
   705
		int old = sel;
jaroslav@0
   706
		sel = aSel;
jaroslav@0
   707
		if ((old == XFDesignConstants.SEL_UNSELECT) && (sel != XFDesignConstants.SEL_UNSELECT)) {
jaroslav@0
   708
			Point l = location();
jaroslav@0
   709
			Dimension s = size();
jaroslav@0
   710
			int d = XFDesignOptions.selectionSize;
jaroslav@0
   711
			reshape(l.x - d, l.y - d, s.width + 2*d, s.height + 2*d);
jaroslav@0
   712
		}
jaroslav@0
   713
		else if ((old != XFDesignConstants.SEL_UNSELECT) && (sel == XFDesignConstants.SEL_UNSELECT)) {
jaroslav@0
   714
			Point l = location();
jaroslav@0
   715
			Dimension s = size();
jaroslav@0
   716
			int d = XFDesignOptions.selectionSize;
jaroslav@0
   717
			reshape(l.x + d, l.y + d, s.width - 2*d, s.height - 2*d);
jaroslav@0
   718
		}
jaroslav@0
   719
		repaintComponent();
jaroslav@0
   720
	}
jaroslav@0
   721
jaroslav@0
   722
	public int getSelection() {
jaroslav@0
   723
		return sel;
jaroslav@0
   724
	}
jaroslav@0
   725
jaroslav@0
   726
	/////////////////////
jaroslav@0
   727
	// Code generation //
jaroslav@0
   728
	/////////////////////
jaroslav@0
   729
jaroslav@0
   730
	public String[] neededImports() {
jaroslav@0
   731
		String list[] = new String[1];
jaroslav@0
   732
		list[0] = "xelfi.awt.Panel3D";
jaroslav@0
   733
		return list;
jaroslav@0
   734
	}
jaroslav@0
   735
jaroslav@0
   736
	public String generateEventCondition(int index) throws 
jaroslav@0
   737
	XFPropertyIndexOutOfBoundsException {
jaroslav@0
   738
		String evt = XFDesignOptions.eventVarName;
jaroslav@0
   739
		switch (index) { 
jaroslav@0
   740
			case 0: return evt +".id == Event.GOT_FOCUS && "+evt+".target == "+getName();
jaroslav@0
   741
			case 1: return evt +".id == Event.LOST_FOCUS && "+evt+".target == "+getName();
jaroslav@0
   742
			case 2: return evt +".id == Event.KEY_ACTION && "+evt+".target == "+getName();
jaroslav@0
   743
			case 3: return evt +".id == Event.KEY_ACTION_RELEASE && "+evt+".target == "+getName();
jaroslav@0
   744
			case 4: return evt +".id == Event.KEY_PRESS && "+evt+".target == "+getName();
jaroslav@0
   745
			case 5: return evt +".id == Event.KEY_RELEASE && "+evt+".target == "+getName();
jaroslav@0
   746
			case 6: return evt +".id == Event.MOUSE_DOWN && "+evt+".target == "+getName();
jaroslav@0
   747
			case 7: return evt +".id == Event.MOUSE_UP && "+evt+".target == "+getName();
jaroslav@0
   748
			case 8: return evt +".id == Event.MOUSE_MOVE && "+evt+".target == "+getName();
jaroslav@0
   749
			case 9: return evt +".id == Event.MOUSE_DRAG && "+evt+".target == "+getName();
jaroslav@0
   750
			case 10: return evt +".id == Event.MOUSE_ENTER && "+evt+".target == "+getName();
jaroslav@0
   751
			case 11: return evt +".id == Event.MOUSE_EXIT && "+evt+".target == "+getName();
jaroslav@0
   752
			default: throw new XFPropertyIndexOutOfBoundsException();
jaroslav@0
   753
		}
jaroslav@0
   754
	}
jaroslav@0
   755
jaroslav@0
   756
	public String generateCode(int what) {
jaroslav@0
   757
		String gen = "";
jaroslav@0
   758
		switch (what) {
jaroslav@0
   759
			case XFDesignConstants.GEN_VARIABLE: 
jaroslav@0
   760
				gen = getClassName()+" "+ name + ";\n";
jaroslav@0
   761
				break;
jaroslav@0
   762
			case XFDesignConstants.GEN_INIT: 
jaroslav@0
   763
				gen = name + " = new " + getClassName() + "();\n";
jaroslav@0
   764
				break;
jaroslav@0
   765
			case XFDesignConstants.GEN_SETLAYOUT:
jaroslav@0
   766
				gen = xLayout.genLayoutInitCode(name, null); // [PENDING - layout variable name]
jaroslav@0
   767
				break;
jaroslav@0
   768
			case XFDesignConstants.GEN_SETPROPS:
jaroslav@0
   769
				for (int i = 0; i < propertyCount; i++) {
jaroslav@0
   770
					if (!propertyDefault(i)) {
jaroslav@0
   771
						switch(i) {
jaroslav@0
   772
							case BACKGROUNDCOLOR: if (!parentColor)
jaroslav@0
   773
										gen = gen + name + ".setBackground(" +
jaroslav@0
   774
											XFDesignUtils.genColor(getBackground()) + ");\n";
jaroslav@0
   775
									break;
jaroslav@0
   776
							case FOREGROUNDCOLOR: if (!parentColor)
jaroslav@0
   777
										gen = gen + name + ".setForeground(" +
jaroslav@0
   778
											XFDesignUtils.genColor(getForeground()) + ");\n";
jaroslav@0
   779
									break;
jaroslav@0
   780
							case ENABLED: gen = gen + name + (isEnabled() ? ".enable();\n" : ".disable();\n");
jaroslav@0
   781
									break;
jaroslav@0
   782
							case VISIBLE: gen = gen + name + ((bVisible) ? ".show();\n" : ".hide();\n");
jaroslav@0
   783
									break;
jaroslav@0
   784
							case FONT: if (!parentFont) {
jaroslav@0
   785
										gen = gen + name + ".setFont(" + 
jaroslav@0
   786
											XFDesignUtils.genFont(getFont())+");\n";
jaroslav@0
   787
									}
jaroslav@0
   788
									break;
jaroslav@0
   789
							case BEVELINNER: gen = gen + name + ".setBevelInner(Panel3D.BV_";
jaroslav@0
   790
									switch (getBevelInner()) {
jaroslav@0
   791
										case BV_NONE: gen = gen + "NONE"; break;
jaroslav@0
   792
										case BV_LOWERED: gen = gen + "LOWERED"; break;
jaroslav@0
   793
										case BV_RAISED: gen = gen + "RAISED"; break;
jaroslav@0
   794
									}
jaroslav@0
   795
									gen = gen + ");\n";
jaroslav@0
   796
									break;
jaroslav@0
   797
							case BEVELOUTER: gen = gen + name + ".setBevelOuter(Panel3D.BV_";
jaroslav@0
   798
									switch (getBevelOuter()) {
jaroslav@0
   799
										case BV_NONE: gen = gen + "NONE"; break;
jaroslav@0
   800
										case BV_LOWERED: gen = gen + "LOWERED"; break;
jaroslav@0
   801
										case BV_RAISED: gen = gen + "RAISED"; break;
jaroslav@0
   802
									}
jaroslav@0
   803
									gen = gen + ");\n";
jaroslav@0
   804
									break;
jaroslav@0
   805
							case BEVELWIDTH: gen = gen + name + ".setBevelWidth("+
jaroslav@0
   806
										getBevelWidth() + ");\n";
jaroslav@0
   807
									break;
jaroslav@0
   808
							case BORDERWIDTH: gen = gen + name + ".setBorderWidth("+
jaroslav@0
   809
										getBorderWidth() + ");\n";
jaroslav@0
   810
									break;
jaroslav@0
   811
							case BORDERCOLOR: gen = gen + name + ".setBorderColor(" +
jaroslav@0
   812
											XFDesignUtils.genColor(getBorderColor()) + ");\n";
jaroslav@0
   813
									break;
jaroslav@0
   814
							case CAPTION: gen = gen + name + ".setCaption(\"" +
jaroslav@0
   815
										 getCaption() + "\");\n";
jaroslav@0
   816
									break;
jaroslav@0
   817
						}
jaroslav@0
   818
					}
jaroslav@0
   819
				}
jaroslav@0
   820
				break;			
jaroslav@0
   821
			case XFDesignConstants.GEN_RESHAPE:
jaroslav@0
   822
				if (((XelfiVisualContainer) getParent()).getDesignLayout().allowsDragging()) 
jaroslav@0
   823
					if (getParent() instanceof XelfiDesignForm) 
jaroslav@0
   824
						gen = name + ".reshape(insets.left+"+position.x+", insets.top+"+position.y+","+size.width+","+size.height+");\n";
jaroslav@0
   825
					else
jaroslav@0
   826
						gen = name + ".reshape("+position.x+", "+position.y+","+size.width+","+size.height+");\n";
jaroslav@0
   827
				break;
jaroslav@0
   828
		}
jaroslav@0
   829
		return gen;
jaroslav@0
   830
	}
jaroslav@0
   831
jaroslav@0
   832
	/////////////////
jaroslav@0
   833
	// persistence //
jaroslav@0
   834
	/////////////////
jaroslav@0
   835
jaroslav@0
   836
	public void loadFromStream(DataInput stream) throws IOException { 
jaroslav@0
   837
		boolean dontRead[] = new boolean[propertyCount];
jaroslav@0
   838
		Debug.debug(Debug.FORMIO_LOAD, "loading panel3d...(1)");
jaroslav@0
   839
			
jaroslav@0
   840
		name = stream.readUTF();
jaroslav@0
   841
jaroslav@0
   842
		int x = stream.readInt();
jaroslav@0
   843
		int y = stream.readInt();
jaroslav@0
   844
		setPosition(x,y);
jaroslav@0
   845
		
jaroslav@0
   846
		int w = stream.readInt();
jaroslav@0
   847
		int h = stream.readInt();
jaroslav@6
   848
		setDesignSize(w,h);
jaroslav@0
   849
		Debug.debug(Debug.FORMIO_LOAD, "loaded panel3d: "+name+"["+x+", "+y+", "+w+", "+h+"]");
jaroslav@0
   850
jaroslav@0
   851
		for (int i = 0; i < propertyCount; i++) {
jaroslav@0
   852
			if (!stream.readBoolean()) switch (i) {
jaroslav@0
   853
				case GRID: grid = XGridPropertyType.loadFromStream(stream); break;
jaroslav@0
   854
				case BACKGROUNDCOLOR: setBackground(XColorPropertyType.loadFromStream(stream)); break;
jaroslav@0
   855
				case FOREGROUNDCOLOR: setForeground(XColorPropertyType.loadFromStream(stream)); break;
jaroslav@0
   856
				case ENABLED: enable(XBooleanPropertyType.loadBFromStream(stream)); break;
jaroslav@0
   857
				case VISIBLE: bVisible = XBooleanPropertyType.loadBFromStream(stream); break;
jaroslav@0
   858
				case FONT: setFont(XFontPropertyType.loadFromStream(stream)); break;
jaroslav@0
   859
				case PARENTCOLOR: setParentColor(XBooleanPropertyType.loadBFromStream(stream)); break;
jaroslav@0
   860
				case PARENTFONT: setParentFont(XBooleanPropertyType.loadBFromStream(stream)); break;
jaroslav@0
   861
				case DESIGNSIZE: designSize = XBooleanPropertyType.loadBFromStream(stream); break;
jaroslav@0
   862
				case BEVELINNER: setBevelInner(XIntegerPropertyType.loadFromStream(stream).intValue()); break;
jaroslav@0
   863
				case BEVELOUTER: setBevelOuter(XIntegerPropertyType.loadFromStream(stream).intValue()); break;
jaroslav@0
   864
				case BEVELWIDTH: setBevelWidth(XIntegerPropertyType.loadFromStream(stream).intValue()); break;
jaroslav@0
   865
				case BORDERWIDTH: setBorderWidth(XIntegerPropertyType.loadFromStream(stream).intValue()); break;
jaroslav@0
   866
				case BORDERCOLOR: setBorderColor(XColorPropertyType.loadFromStream(stream)); break;
jaroslav@0
   867
				case CAPTION: setCaption(XStringPropertyType.loadFromStream(stream)); break;
jaroslav@0
   868
			}
jaroslav@0
   869
		}
jaroslav@0
   870
jaroslav@0
   871
		Debug.debug(Debug.FORMIO_LOAD, "loading panel3d...(2)");
jaroslav@0
   872
		for (int i = 0; i < eventCount; i++) {
jaroslav@0
   873
			if (stream.readBoolean()) {
jaroslav@0
   874
				Debug.debug(Debug.FORMIO_LOAD, "event ["+i+"] loading...");
jaroslav@0
   875
				parentForm.assignEvent(this, i, stream.readUTF());
jaroslav@0
   876
			}
jaroslav@0
   877
		}
jaroslav@0
   878
jaroslav@0
   879
		Debug.debug(Debug.FORMIO_LOAD, "loading panel3d...(3)");
jaroslav@0
   880
		// Panel layout
jaroslav@0
   881
		String layClass = stream.readUTF();
jaroslav@0
   882
		Debug.debug(Debug.FORMIO_LOAD, "loading panel3d layout: "+layClass);
jaroslav@0
   883
		try {
jaroslav@0
   884
			Class lay = Class.forName(layClass);
jaroslav@0
   885
			XelfiDesignLayout xdl = (XelfiDesignLayout)lay.newInstance();
jaroslav@0
   886
			xdl.setParent(this); // necessary for some layouts to know what container they manage
jaroslav@0
   887
			xLayout = xdl;
jaroslav@0
   888
			xdl.loadFromStream(stream);  // this may actually change the xLayout property (e.g. GridLayout)
jaroslav@0
   889
			setLayout((LayoutManager)xLayout);
jaroslav@0
   890
		} catch (IllegalAccessException e) {
jaroslav@0
   891
			System.err.println("Illegal Access Exception");
jaroslav@0
   892
		} catch (InstantiationException e) {
jaroslav@0
   893
			System.err.println("Instantiation Exception");
jaroslav@0
   894
		} catch (ClassNotFoundException e) {
jaroslav@0
   895
			System.err.println("ClassNotFound Exception:"+layClass);
jaroslav@0
   896
		}
jaroslav@0
   897
jaroslav@0
   898
		Debug.debug(Debug.FORMIO_LOAD, "loading panel3d...(4)");
jaroslav@0
   899
		// Subcomponents
jaroslav@0
   900
		int compNum = stream.readInt();
jaroslav@0
   901
		Debug.debug(Debug.FORMIO_LOAD, "loading panel3d components["+compNum+"]");
jaroslav@0
   902
		for (int i = 0; i<compNum; i++) {
jaroslav@0
   903
			String compClass = stream.readUTF();
jaroslav@0
   904
			try {
jaroslav@0
   905
				Class comp = Class.forName(compClass);
jaroslav@0
   906
				XelfiVisualComponent xvc = (XelfiVisualComponent)comp.newInstance();
jaroslav@0
   907
				xvc.setParentForm(parentForm);
jaroslav@0
   908
				Debug.debug(Debug.FORMIO_LOAD, "loading panel3d subcomponent: "+compClass);
jaroslav@0
   909
				xvc.loadFromStream(stream);
jaroslav@0
   910
				xLayout.layoutAdd(this, xvc);
jaroslav@0
   911
			} catch (IllegalAccessException e) {
jaroslav@0
   912
				System.err.println("Illegal Access Exception");
jaroslav@0
   913
			} catch (InstantiationException e) {
jaroslav@0
   914
				System.err.println("Instantiation Exception");
jaroslav@0
   915
			} catch (ClassNotFoundException e) {
jaroslav@0
   916
				System.err.println("ClassNotFound Exception:"+compClass);
jaroslav@0
   917
			}
jaroslav@0
   918
		}	
jaroslav@0
   919
		Debug.debug(Debug.FORMIO_LOAD, "panel loaded succesfully");
jaroslav@0
   920
	}
jaroslav@0
   921
	
jaroslav@0
   922
	public void saveToStream(DataOutput stream) throws IOException {
jaroslav@0
   923
		Debug.debug(Debug.FORMIO_SAVE, "saving panel3d...(1)");
jaroslav@0
   924
		stream.writeUTF(getName());
jaroslav@0
   925
		
jaroslav@0
   926
		Point pos = getPosition();
jaroslav@0
   927
		stream.writeInt(pos.x);
jaroslav@0
   928
		stream.writeInt(pos.y);
jaroslav@0
   929
jaroslav@0
   930
		Dimension size1 = getSize();
jaroslav@0
   931
		stream.writeInt(size1.width);
jaroslav@0
   932
		stream.writeInt(size1.height);
jaroslav@0
   933
jaroslav@0
   934
		Debug.debug(Debug.FORMIO_SAVE, "saving panel3d...(2)");
jaroslav@0
   935
		for (int i = 0; i < propertyCount; i++) {
jaroslav@0
   936
			boolean b = propertyDefault(i);
jaroslav@0
   937
			stream.writeBoolean(b);
jaroslav@0
   938
			if (!b) switch (i) {
jaroslav@0
   939
				case GRID: XGridPropertyType.saveToStream(getProperty(0),stream); break;
jaroslav@0
   940
				case BACKGROUNDCOLOR: XColorPropertyType.saveToStream(getBackground(), stream); break;
jaroslav@0
   941
				case FOREGROUNDCOLOR: XColorPropertyType.saveToStream(getForeground(), stream); break;
jaroslav@0
   942
				case ENABLED: XBooleanPropertyType.saveToStream(isEnabled(), stream); break;
jaroslav@0
   943
				case VISIBLE: XBooleanPropertyType.saveToStream(bVisible, stream); break;
jaroslav@0
   944
				case FONT: XFontPropertyType.saveToStream(getFont(), stream); break;
jaroslav@0
   945
				case PARENTCOLOR: XBooleanPropertyType.saveToStream(parentColor, stream); break;
jaroslav@0
   946
				case PARENTFONT: XBooleanPropertyType.saveToStream(parentFont, stream); break;
jaroslav@0
   947
				case DESIGNSIZE: XBooleanPropertyType.saveToStream(designSize, stream); break;
jaroslav@0
   948
				case BEVELINNER: XIntegerPropertyType.saveToStream(new Integer(getBevelInner()), stream); break;
jaroslav@0
   949
				case BEVELOUTER: XIntegerPropertyType.saveToStream(new Integer(getBevelOuter()), stream); break;
jaroslav@0
   950
				case BEVELWIDTH: XIntegerPropertyType.saveToStream(new Integer(getBevelWidth()), stream); break;
jaroslav@0
   951
				case BORDERWIDTH: XIntegerPropertyType.saveToStream(new Integer(getBorderWidth()), stream); break;
jaroslav@0
   952
				case BORDERCOLOR: XColorPropertyType.saveToStream(getBorderColor(), stream); break;
jaroslav@0
   953
				case CAPTION: XStringPropertyType.saveToStream(new String(getCaption()), stream); break;
jaroslav@0
   954
			}
jaroslav@0
   955
		}
jaroslav@0
   956
jaroslav@0
   957
		for (int i = 0; i < eventCount; i++) {
jaroslav@0
   958
			if ((events[i] != null) && (events[i].length() > 0)) {
jaroslav@0
   959
				stream.writeBoolean(true);
jaroslav@0
   960
				stream.writeUTF(events[i]);
jaroslav@0
   961
			}
jaroslav@0
   962
			else stream.writeBoolean(false);
jaroslav@0
   963
		}
jaroslav@0
   964
jaroslav@0
   965
		// Panel layout
jaroslav@0
   966
		stream.writeUTF(xLayout.getClass().getName());
jaroslav@0
   967
		xLayout.saveToStream(stream);
jaroslav@0
   968
jaroslav@0
   969
		// Subcomponents
jaroslav@0
   970
		int compNum = countComponents();
jaroslav@0
   971
		stream.writeInt(compNum);
jaroslav@0
   972
		Component comps[] = getComponents();
jaroslav@0
   973
		for (int i = 0; i<compNum; i++) {
jaroslav@0
   974
			stream.writeUTF(comps[i].getClass().getName());
jaroslav@0
   975
			((XelfiDesignComponent)comps[i]).saveToStream(stream);
jaroslav@0
   976
		}
jaroslav@0
   977
		Debug.debug(Debug.FORMIO_SAVE, "panel3d saved succesfully");
jaroslav@0
   978
	}
jaroslav@0
   979
jaroslav@0
   980
/////////////
jaroslav@0
   981
// special //
jaroslav@0
   982
/////////////
jaroslav@0
   983
jaroslav@0
   984
	public void paint(Graphics g) {
jaroslav@0
   985
		if (XFDesignOptions.designMode == XFDesignConstants.DM_REAL) {
jaroslav@0
   986
			super.paint(g);
jaroslav@0
   987
			return;
jaroslav@0
   988
		}
jaroslav@0
   989
		Dimension d = size();
jaroslav@0
   990
		int i = XFDesignOptions.selectionSize;
jaroslav@0
   991
		if (sel != XFDesignConstants.SEL_UNSELECT) {
jaroslav@0
   992
			g.setColor(XFDesignOptions.selectionColor);
jaroslav@0
   993
			g.drawRect(i - 2, i - 2, d.width - 2*i + 3, d.height - 2*i + 3);
jaroslav@0
   994
			if (sel == XFDesignConstants.SEL_SELECT) {
jaroslav@0
   995
				for (int k = 0; k <= 2; k++) {
jaroslav@0
   996
					if ((k == 1) && (d.width < 3*i +2))
jaroslav@0
   997
						continue;
jaroslav@0
   998
					int x = 0;
jaroslav@0
   999
					switch (k) {
jaroslav@0
  1000
						case 1: x = (d.width-i)/2; break;
jaroslav@0
  1001
						case 2: x = d.width-i; break;
jaroslav@0
  1002
					}
jaroslav@0
  1003
					for (int l = 0; l <=2; l++) {
jaroslav@0
  1004
						if ((k == 1) && (l == 1))
jaroslav@0
  1005
							continue;
jaroslav@0
  1006
						if ((l == 1) && (d.height < 3*i +2))
jaroslav@0
  1007
							continue;
jaroslav@0
  1008
						int y = 0;
jaroslav@0
  1009
						switch (l) {
jaroslav@0
  1010
							case 1: y = (d.height-i)/2; break;
jaroslav@0
  1011
							case 2: y = d.height-i; break;
jaroslav@0
  1012
						}
jaroslav@0
  1013
						if (k*3+l+1 == dragMode) {
jaroslav@0
  1014
							g.setColor(XFDesignOptions.selectionSpecColor);
jaroslav@0
  1015
							g.fillRect(x,y,i,i);
jaroslav@0
  1016
							g.setColor(XFDesignOptions.selectionColor);
jaroslav@0
  1017
						}
jaroslav@0
  1018
						else g.fillRect(x,y,i,i);
jaroslav@0
  1019
					}
jaroslav@0
  1020
				}
jaroslav@0
  1021
			}
jaroslav@0
  1022
		}
jaroslav@0
  1023
		if (sel == XFDesignConstants.SEL_UNSELECT)
jaroslav@0
  1024
			i = 0;
jaroslav@0
  1025
		Dimension capdim = getCaptionDim();
jaroslav@0
  1026
		Insets ins = insets();
jaroslav@0
  1027
		int top = i;
jaroslav@0
  1028
		if (!captionEmpty()) {
jaroslav@0
  1029
			top = bevelWidth;
jaroslav@0
  1030
			if (bevelInner != BV_NONE)
jaroslav@0
  1031
				top += margin;
jaroslav@0
  1032
			if (bevelOuter != BV_NONE)
jaroslav@0
  1033
				top += margin;
jaroslav@0
  1034
			top = (capdim.height - top) / 2 + i;
jaroslav@0
  1035
		}
jaroslav@0
  1036
jaroslav@0
  1037
		XFDesignUtils.paintGrid(this, g, grid, i, i, d.width-1-2*i, d.height-1-2*i);
jaroslav@0
  1038
		int left = i;
jaroslav@0
  1039
		int w = d.width - 1 - 2*i;
jaroslav@0
  1040
		int h = d.height - 1 - 2*i;
jaroslav@0
  1041
		if (!captionEmpty())
jaroslav@0
  1042
			h = h - top + i;
jaroslav@0
  1043
		boolean raised;
jaroslav@0
  1044
		
jaroslav@0
  1045
		g.setColor(marginColor);
jaroslav@0
  1046
		for (int tmp = 0; tmp <= 1; tmp++) {
jaroslav@0
  1047
			int tmp2 = bevelOuter;
jaroslav@0
  1048
			if (tmp == 1)
jaroslav@0
  1049
				tmp2 = bevelInner;
jaroslav@0
  1050
			raised = false;
jaroslav@0
  1051
			if (tmp2 == BV_NONE)
jaroslav@0
  1052
				continue;
jaroslav@0
  1053
			else if (tmp2 == BV_RAISED)
jaroslav@0
  1054
				raised = true;
jaroslav@0
  1055
			if (tmp == 1) {
jaroslav@0
  1056
			    left += bevelWidth;
jaroslav@0
  1057
			    top += bevelWidth;
jaroslav@0
  1058
			    w -= 2 * bevelWidth;
jaroslav@0
  1059
			    h -= 2 * bevelWidth;
jaroslav@0
  1060
			}
jaroslav@0
  1061
			for(int j = 0; j < margin; j++) {
jaroslav@0
  1062
			    g.draw3DRect(left, top, w, h, raised);
jaroslav@0
  1063
			    left++;
jaroslav@0
  1064
			    top++;
jaroslav@0
  1065
			    w -= 2;
jaroslav@0
  1066
			    h -= 2;
jaroslav@0
  1067
			}
jaroslav@0
  1068
		}
jaroslav@0
  1069
		if (!captionEmpty()) {
jaroslav@0
  1070
			left = insets().left;
jaroslav@0
  1071
			g.setColor(getBackground());
jaroslav@0
  1072
			g.fillRect(left, i, capdim.width+8, Math.max(capdim.height, top));
jaroslav@0
  1073
			g.setColor(getForeground());
jaroslav@0
  1074
			g.drawString(caption, left + 4, capdim.height+i);
jaroslav@0
  1075
		}
jaroslav@0
  1076
	}
jaroslav@0
  1077
}
jaroslav@0
  1078
jaroslav@0
  1079
/*
jaroslav@0
  1080
 
jaroslav@0
  1081
TO DO:
jaroslav@0
  1082
	1. layout variable code generation
jaroslav@0
  1083
jaroslav@0
  1084
*/