/**
*
*/
package fr.unistra.pelican.gui.MultiViews;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Rectangle2D;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import net.miginfocom.swing.MigLayout;
import fr.unistra.pelican.Image;
/**
* A Render for a mini-overview of a View....
* Use it in JList or other graphic container and set the cellRenderer and the cellEditor to use the object itself
*
* @author Benjamin Perret
*
*/
public class MiniViewPanel extends JPanel implements ChangeListener, MouseMotionListener, MouseListener{
/**
* the serialVersionID....
*/
private static final long serialVersionUID = 6837769718326710070L;
private View view;
private int margy=20;
boolean selected=false;
private MultiView parent;
private int px,py;
private boolean drag=false;
private Color background;
private Color foreground;
private JLabel label=new JLabel("Band:");
private JSlider slider;
private JPanel sliderP=new JPanel(new MigLayout());;
int w;
int h;
Rectangle miniView=new Rectangle();
boolean miniViewed=false;
int bx;
int by;
double f;
public double getFactor(){
int bxO=12;
int byO=12;
java.awt.Image im=view.getDisplay();
int ox= im.getWidth(null);
int oy=im.getHeight(null);
int sx=w-2*bxO;
int sy=h-margy-2*byO;
double f1=(double)(sx)/(double)(ox);
double f2=(double)(sy)/(double)(oy);
return Math.min(f1,f2);
}
public boolean getCursor(int x, int y)
{
int bxO=12;
int byO=12;
if (view.getViewPort() != null) {
java.awt.Image im=view.getDisplay();
int ox= im.getWidth(null);
int oy=im.getHeight(null);
int sx=w-2*bxO;
int sy=h-margy-2*byO;
double f1=(double)(sx)/(double)(ox);
double f2=(double)(sy)/(double)(oy);
f= Math.min(f1,f2);
sx=(int)((double)ox*f);
sy=(int)((double)oy*f);
bx = (w-sx)/2;
by = (h-margy-sy)/2;
Rectangle r = view.areaCovered();
if (r.x != 0 || r.y != 0 || r.width != ox || r.height != oy) {
miniView.x=bx + (int) (f * r.x);
miniView.y=by + (int) (f * r.y);
miniView.width=(int) (f * r.width);
miniView.height=(int) (f * r.height);
miniViewed=true;
//System.out.println(x + " " +y + " " +miniView);
if(miniView.contains(x, y))
return true;
}
else{ miniViewed=false;}
}else {miniViewed=false;}
return false;
}
public MiniViewPanel(MultiView parent,View v){
super(new BorderLayout());
this.parent=parent;
this.addMouseListener(this);
this.addMouseMotionListener(this);
slider=new JSlider(SwingConstants.HORIZONTAL,0,0,0);
slider.setMajorTickSpacing(1);
slider.setMinorTickSpacing(1);
//slider.setPaintTicks(true);
slider.setMaximumSize(new Dimension(200,20));
sliderP.add(label);
sliderP.add(slider);
slider.addChangeListener(this);
slider.setSnapToTicks(true);
//slider.setPaintLabels(true);
setView(v);
//this.add(slider,BorderLayout.SOUTH);
//img=new JPanel();
//img.setSize(100,100);
//this.add(img,BorderLayout.CENTER);
//name=new JLabel("No Name");
//name.setMinimumSize(new Dimension(2,margy));
//name.setVerticalAlignment(JLabel.TOP);
//name.setHorizontalAlignment(JLabel.CENTER);
//this.add(name,BorderLayout.SOUTH);
//System.out.println("new");
}
// This is the only method defined by ListCellRenderer.
// We just reconfigure the JLabel each time we're called.
private boolean added=false;
private void toSlideOrNot()
{
if (view != null) {
Image pim = view.getPersistentImage();
int bdim = pim.bdim;
if (bdim == 1) {
if (added) {
this.remove(sliderP);
added = false;
}
// System.out.println("remove "+bdim + " " +pim);
} else {
if (!added) {
this.add(sliderP, BorderLayout.SOUTH);
added = true;
// System.out.println("add " +bdim + " " +pim);
}
slider.setMaximum(pim.bdim - 1);
slider.setValue(view.getDisplayedBand());
if (view.isColoured()) {
// System.out.println("enabled false");
slider.setEnabled(false);
} else {
// System.out.println("enabled true");
slider.setEnabled(true);
}
}
}
}
/* (non-Javadoc)
* @see javax.swing.JComponent#paint(java.awt.Graphics)
*/
public void paint(Graphics g) {
//System.out.println("paint " + this);
super.paint(g);
final Color bg=new Color(210,210,210);
final Color bg1=new Color(230,230,230);
final Color tr=new Color(0,0,255,60);
final Color tr2=new Color(0,0,255,120);
int bxO=12;
int byO=12;
//
if(view!=null)
{
toSlideOrNot();
w=getWidth();
h=getHeight()-((added)?sliderP.getHeight():0);
g.setColor((selected)?bg:bg1);
g.fillRoundRect(2, 2, w-4, h-4, 5, 5);
java.awt.Image im=view.getDisplay();
int ox= im.getWidth(null);
int oy=im.getHeight(null);
int sx=w-2*bxO;
int sy=h-margy-2*byO;
double f1=(double)(sx)/(double)(ox);
double f2=(double)(sy)/(double)(oy);
f= Math.min(f1,f2);
sx=(int)((double)ox*f);
sy=(int)((double)oy*f);
bx = (w-sx)/2;
by = (h-margy-sy)/2;
g.setColor((selected)?bg1:bg);
g.fill3DRect(bx-5, by-5, sx+10, sy+10,!selected);
g.setColor(Color.black);
g.drawRect(bx-1, by-1, sx+2, sy+2);
g.drawImage(view.getDisplay(), bx, by, sx, sy, this);
String name = view.getImage().getName();
Object o=view.properties.get(ViewLocker.LOCKER_PROPERTY_NAME);
if(o!=null && o instanceof ViewLocker)
{
String num= "" + ((ViewLocker)o).getLockNumber();
g.drawImage(ViewLocker.LOCK_ICON, 5, 5, 15,15, this);
g.drawString(num, 2, 12);
}
if (view.getViewPort() != null) {
Rectangle r = view.areaCovered();
if (r.x != 0 || r.y != 0 || r.width != ox || r.height != oy) {
//System.out.println(r);
g.setColor(tr);
miniView.x=bx + (int) (f * r.x);
miniView.y=by + (int) (f * r.y);
miniView.width=(int) (f * r.width);
miniView.height=(int) (f * r.height);
g.fillRect(miniView.x, miniView.y,
miniView.width, miniView.height);
g.setColor(tr2);
g.drawRect(miniView.x, miniView.y,
miniView.width, miniView.height);
g.setColor(Color.black);
miniViewed=true;
//System.out.println("pas else " +this);
}
else{ miniViewed=false;}
}else {miniViewed=false;}
//int lefth = h-sy-by-10;
if(name==null)
name="No Name";
FontMetrics fm = g.getFontMetrics();
Rectangle2D sn=fm.getStringBounds(name, g);
int tx = (int)(w-sn.getWidth())/2;
int ty = (int)(margy-10-sn.getHeight())/2;
//System.out.println("lh " + lefth +" sy " + sy + " by " +by+ " ty " +ty);
g.drawString(name, tx, h-margy+ty+10);
}
//name.paint(g);
}
/*public Component getListCellRendererComponent(
JList list,
Object value, // value to display
int index, // cell index
boolean isSelected, // is the cell selected
boolean cellHasFocus) // the list and the cell have the focus
{
// System.out.println("create");
this.view=(View)value;
if(!view.isRegistredChangeListener(this) )
view.addChangeListener(this);
//name.setText(view.getImage().getName());
selected=isSelected;
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
}
else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
setEnabled(list.isEnabled());
setFont(list.getFont());
setOpaque(true);
return this;
}*/
public void stateChanged(ChangeEvent arg0) {
Object source =arg0.getSource();
if(source instanceof View)
{
parent.list.revalidate();
parent.list.repaint();
}
else if(source == slider)
{
view.setDisplayedBand(slider.getValue());
if(parent.imProfile.contains(view))
parent.imProfile.refresh();
}
}
public void mouseClicked(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
boolean draggingMiniWindow=false;
boolean draggingHold=false;
Point draggingPos=new Point();
//View draggingView;
public void mousePressed(MouseEvent e) {
parent.maybeShowPopup(e,e.getX()+this.getX(),e.getY()+this.getY());
if(e.getModifiers() == MouseEvent.BUTTON1_MASK && getCursor( e.getX(), e.getY()))
{
draggingPos.x=e.getX();
draggingPos.y=e.getY();
draggingHold=true;
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR) );
}
}
public void mouseReleased(MouseEvent e) {
parent.maybeShowPopup(e,e.getX()+this.getX(),e.getY()+this.getY());
setCursor(Cursor.getDefaultCursor());
draggingHold=false;
}
public void mouseDragged(MouseEvent e) {
if(draggingHold)
{
int ppx,ppy;
ppx=e.getX();
ppy=e.getY();
double f=1.0/getFactor()*view.getZoom();
view.shiftX((int)(f*(double)(draggingPos.x-ppx)));
view.shiftY((int)(f*(double)(draggingPos.y-ppy)));
draggingPos.x=ppx;
draggingPos.y=ppy;
}
}
public void mouseMoved(MouseEvent e) {
//int ind=list.locationToIndex(e.getPoint());
//Rectangle r=list.getCellBounds(ind, ind);
//draggingView=(View)viewList.get(ind);
/*int x=e.getX();
int y=e.getY();
if(getCursor( x, y))
{
//System.out.println("in");
draggingMiniWindow=true;
parent.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
}
else {
//System.out.println("out");
parent.setCursor(Cursor.getDefaultCursor());
draggingMiniWindow=false;
}*/
}
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
public void setBackground(Color background) {
this.background = background;
super.setBackground(background);
//if(sliderP!=null)sliderP.setBackground(background);
}
public void setForeground(Color foreground) {
this.foreground = foreground;
super.setForeground(foreground);
//if(sliderP!=null)sliderP.setForeground(foreground);
}
public View getView() {
return view;
}
public void setView(View view) {
this.view = view;
if(!view.isRegistredChangeListener(this) )
view.addChangeListener(this);
toSlideOrNot();
}
}