package com.drawbridge.dm; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.util.HashSet; import javax.swing.JPanel; import com.drawbridge.correspondance.Spotlight; import com.drawbridge.correspondance.Spotlightable; import com.drawbridge.utils.BackgroundSelector; import com.drawbridge.utils.BackgroundSelector.BackgroundSelectorListener; import com.drawbridge.utils.GraphicUtils; import com.drawbridge.utils.Utils; public class DMCanvas extends JPanel implements Spotlightable, BackgroundSelectorListener { private static final long serialVersionUID = 4922036109659818950L; private Color oldBackgroundColor = Color.white; private Image backgroundImage = null; public BackgroundSelector bSelector = null; private final int backgroundStatus; public static final int HAS_BACKGROUND_SELECTOR = 1; public static final int NO_BACKGROUND_SELECTOR = 2; // Area where objects can be manipulated, analogous to HTML5 Canvas public DMCanvas(int backgroundSelector) { backgroundStatus = backgroundSelector; setLayout(null); setBorder(null); setBackground(Color.white); addMouseListener(canvasMouseAdapter); if(backgroundSelector == HAS_BACKGROUND_SELECTOR){ bSelector = new BackgroundSelector(this); bSelector.setVisible(false); this.add(bSelector); } } MouseAdapter canvasMouseAdapter = new MouseAdapter() { @Override public void mousePressed(MouseEvent me) { requestFocus(); if(bSelector != null) bSelector.setVisible(false); } }; @Override public void setSpotlights(HashSet<? extends Spotlight> points)// ANTI { // Canvas doesn't allow spotlights, do nothing } public void showBackgroundSelector(){ if(bSelector != null){ bSelector.setBackground(Color.white); bSelector.setSize(new Dimension(162, 216)); Point location = new Point(); location.x = this.getWidth() - bSelector.getWidth() - 2; location.y = 2; bSelector.setLocation(location); bSelector.setVisible(true); this.setComponentZOrder(bSelector, 0); } } public void hideBackgroundSelector(){ if(bSelector != null) bSelector.setVisible(false); } @Override public void setBackground(Color c) { super.setBackground(c); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); if(backgroundStatus == HAS_BACKGROUND_SELECTOR){ Utils.out.println(getClass(), "paintComponent"); if(backgroundImage != null){ g.drawImage(this.backgroundImage, 0, 0, getWidth(), getHeight(), null); } } } @Override public void setDimBackground(boolean b) { if (!b) super.setBackground(oldBackgroundColor); else { oldBackgroundColor = super.getBackground(); super.setBackground(oldBackgroundColor.darker()); } repaint(); } public void removeAllExceptRequired() { for(Component c : this.getComponents()){ if(!(c instanceof BackgroundSelector)){ this.remove(c); } } } @Override public void onBackgroundChangeRequest(String relativeLocation) { BufferedImage tmp = GraphicUtils.loadImageFromResource(relativeLocation); Dimension tmpImageSize = new Dimension(tmp.getWidth(), tmp.getHeight()); Dimension bounds = new Dimension(this.getWidth(), this.getHeight()); Dimension scaledSize = GraphicUtils.getScaledDimFill(tmpImageSize, bounds); Utils.out.println(getClass(), "scaledSize:" + scaledSize + ", bounds:" + bounds); this.backgroundImage = tmp.getScaledInstance(scaledSize.width, scaledSize.height, Image.SCALE_SMOOTH); this.repaint(); } }