/* * Copyright 2001-2008 Geert Bevin (gbevin[remove] at uwyn dot com) * Licensed under the Apache License, Version 2.0 (the "License") * $Id: ElementProperty.java 3918 2008-04-14 17:35:35Z gbevin $ */ package com.uwyn.rife.gui.old; import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.geom.Area; import java.awt.geom.Rectangle2D; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import com.uwyn.rife.swing.JDialogError; abstract class ElementProperty { public static final int TITLE = 0; public static final int EXIT = 1; public static final int CONSUMED_PARAMETER = 2; public static final int USED_PARAMETER = 3; public static final int ADDED_PARAMETER = 4; public static final String VALID_CHARS = "abcdefghjiklmnopqrstuvwxyzABCDEFGHJIKLMNOPQRSTUVWXYZ0123456789*?_"; private Element mElement = null; private String mName = null; private float mScaleFactor = 1f; private Rectangle2D mNameBoundsOrig = null; private Rectangle2D mNameBoundsScaled = null; private Area mHotSpotOrig = null; private Area mHotSpotScaled = null; public ElementProperty(Element element, String name) { setElement(element); setName(name); } public void drawActive(Graphics2D g2d) { Rectangle clip = g2d.getClipBounds(); if(clip == null || clip.intersects(getNameBounds())) { Composite previous_composite = g2d.getComposite(); g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)); g2d.setColor(Color.white); g2d.fill(getHotSpot()); g2d.setComposite(previous_composite); } } public boolean equals(Object object) { if(object instanceof ElementProperty) { ElementProperty property = (ElementProperty)object; if(property.getElement() == getElement() && property.getClass() == getClass() && property.getName().equals(getName())) { return true; } } return false; } public void setElement(Element element) { mElement = element; } public Element getElement() { return mElement; } public void setName(String name) { mName = name; clearNameBounds(); clearHotSpot(); } public String getName() { return mName; } public boolean isValidName(String name) { ElementProperty temp_property = getElement().getProperty(getClass(), name); if(temp_property == this || temp_property == null) { return true; } else { return false; } } public void clearNameBounds() { setNameBounds(null); } public void setNameBounds(Rectangle2D nameBounds) { mNameBoundsOrig = nameBounds; mNameBoundsScaled = null; } public Rectangle2D getNameBounds() { if(mNameBoundsOrig == null) { return null; } if(mNameBoundsScaled == null) { scaleNameBounds(); } return mNameBoundsScaled; } public void clearHotSpot() { setHotSpot(null); } public void setHotSpot(Area hotSpot) { mHotSpotOrig = hotSpot; mHotSpotScaled = null; } public void setHotSpot(Shape hotSpot) { mHotSpotOrig = new Area(hotSpot); mHotSpotScaled = null; } public Area getHotSpot() { if(mHotSpotOrig == null) { return null; } if(mHotSpotScaled == null) { scaleHotSpot(); } return mHotSpotScaled; } private void resetScaledMembers() { mNameBoundsScaled = null; mHotSpotScaled = null; } public synchronized void scale(float multiplier) { mScaleFactor *= multiplier; resetScaledMembers(); } private void scaleHotSpot() { AffineTransform scale_transform = AffineTransform.getScaleInstance(mScaleFactor, mScaleFactor); mHotSpotScaled = mHotSpotOrig.createTransformedArea(scale_transform); } private void scaleNameBounds() { mNameBoundsScaled = new Rectangle2D.Float((float)(mNameBoundsOrig.getX()*mScaleFactor), (float)(mNameBoundsOrig.getY()*mScaleFactor), (float)(mNameBoundsOrig.getWidth()*mScaleFactor), (float)(mNameBoundsOrig.getHeight()*mScaleFactor)); } public void showPopupMenu(Point clickedPoint) { JPopupMenu popup = new JPopupMenu(); popup.addPopupMenuListener(getElement().getStructurePanel()); showPopupMenuReal(popup, clickedPoint); popup.show(getElement(), clickedPoint.x, clickedPoint.y); } protected class Delete implements DynamicMenuAction { public void execute(JMenuItem menuItem) { getElement().removeProperty(ElementProperty.this); getElement().repaint(); } } protected class Edit implements DynamicMenuAction { private Point mClickedPoint = null; public Edit(Point clickedPoint) { mClickedPoint = clickedPoint; } public void execute(JMenuItem menuItem) { getElement().getStructurePanel().editElementProperty(ElementProperty.this, mClickedPoint); getElement().repaint(); } } public abstract void draw(Graphics2D g2d); public abstract Color getColor(); public abstract Font getDrawFont(); public abstract int getEditAlignment(); public abstract Font getEditFont(); public abstract Rectangle getEditRectangle(Point clickedPoint); public abstract JDialogError getUnicityErrorDialog(); protected abstract void showPopupMenuReal(JPopupMenu popupMenu, Point clickedPoint); }